You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

325 lines
9.0 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "dwin_screen.hpp"
  2. #include <string.h>
  3. namespace iflytop {
  4. namespace dwin {
  5. DwinScreen g_dwinScreen;
  6. }
  7. } // namespace iflytop
  8. using namespace iflytop;
  9. using namespace iflytop::dwin;
  10. #define TAG "dwin"
  11. DwinScreen& DwinScreen::ins() { return g_dwinScreen; }
  12. void DwinScreen::init(UART_HandleTypeDef* huart, DwinScreenCfg dwcfg) {
  13. m_huart = huart;
  14. m_dwcfg = dwcfg;
  15. ZUART::cfg_t cfg;
  16. cfg.huart = m_huart;
  17. cfg.name = "DwinScreenUart";
  18. cfg.rxbuffersize = RX_CACHE_SIZE;
  19. cfg.rxovertime_ms = 2;
  20. m_uarthandler.initialize(&cfg);
  21. m_uarthandler.startRxIt();
  22. m_uarthandler.setrxcb([this](uint8_t* data, size_t len) {
  23. // irq
  24. if (txcontext.receipt_ready_flag) {
  25. return;
  26. }
  27. memcpy(txcontext.receiptcache, data, len);
  28. txcontext.receiptlen = len;
  29. txcontext.receipt_ready_flag = true;
  30. });
  31. m_rammanager.init(dwcfg.freeRawStartAddr, dwcfg.freeRawEndAddr);
  32. m_textDisplayerManager.init(dwcfg.textDisplayerStartAddr, dwcfg.textDisplayerEndAddr);
  33. m_varIconManager.init(dwcfg.varIconStartAddr, dwcfg.varIconEndAddr);
  34. }
  35. uint16_t DwinScreen::alloc_free_ram(uint16_t size) { return m_rammanager.alloc(size); }
  36. uint16_t DwinScreen::alloc_one_text_displayer() { return m_textDisplayerManager.alloc(m_dwcfg.textDisplayerSize); }
  37. uint16_t DwinScreen::alloc_one_var_icon() {
  38. uint16_t addr = m_varIconManager.alloc(m_dwcfg.varIconSize);
  39. return addr;
  40. }
  41. void DwinScreen::clearrxcache() {
  42. CriticalContext cc;
  43. txcontext.receipt_ready_flag = false;
  44. txcontext.receiptlen = 0;
  45. }
  46. void DwinScreen::sendcmd(uint8_t* cmd, size_t len) {
  47. // printf("sendcmd:");
  48. // for (size_t i = 0; i < len; i++) {
  49. // ZLOGE(TAG,"%02X ", cmd[i]);
  50. // }
  51. // printf("\n");
  52. m_uarthandler.tx(cmd, len);
  53. // m_com.send((char*)cmd, len);
  54. }
  55. bool DwinScreen::sendcmdblock(int overtime) {
  56. clearrxcache();
  57. sendcmd(txcontext.txcache, txcontext.txlen);
  58. for (int i = 0; i < overtime; i++) {
  59. if (txcontext.receipt_ready_flag) {
  60. return true;
  61. } else {
  62. zos_delay(1);
  63. }
  64. }
  65. return false;
  66. }
  67. bool DwinScreen::write_varspace(uint16_t regaddr, uint8_t* data, uint8_t len, int overtime) {
  68. /**
  69. * @brief
  70. *
  71. * 2byte 1byte cmd add val
  72. * 5AA5 datalen 0x82 2 xbyte
  73. *
  74. */
  75. txcontext.txcache[0] = 0x5A;
  76. txcontext.txcache[1] = 0xA5;
  77. txcontext.txcache[2] = 0; // data len
  78. txcontext.txcache[3] = 0x82;
  79. txcontext.txcache[4] = regaddr >> 8;
  80. txcontext.txcache[5] = regaddr & 0xFF;
  81. memcpy(&txcontext.txcache[6], data, len);
  82. txcontext.txcache[2] = len + 1 + 2; //
  83. txcontext.txlen = 6 + len;
  84. if (!sendcmdblock(overtime)) {
  85. ZLOGE(TAG, "write_varspace failed");
  86. return false;
  87. }
  88. return true;
  89. }
  90. bool DwinScreen::read_varspace(uint16_t regaddr, uint8_t* data, uint8_t len, int overtime) {
  91. /**
  92. * @brief
  93. *
  94. * 2byte 1byte cmd add val
  95. * 5AA5 datalen 0x82 2 xbyte
  96. *
  97. */
  98. txcontext.txcache[0] = 0x5A;
  99. txcontext.txcache[1] = 0xA5;
  100. txcontext.txcache[2] = 0; // data len
  101. txcontext.txcache[3] = 0x83;
  102. txcontext.txcache[4] = regaddr >> 8;
  103. txcontext.txcache[5] = regaddr & 0xFF;
  104. txcontext.txcache[6] = len / 2; // word len
  105. txcontext.txcache[2] = 4; //
  106. txcontext.txlen = 7;
  107. if (!sendcmdblock(overtime)) {
  108. ZLOGE(TAG, "read_varspace failed");
  109. return false;
  110. }
  111. memcpy(data, &txcontext.receiptcache[7], len);
  112. return true;
  113. }
  114. bool DwinScreen::write_reg16(uint16_t regaddr, uint16_t data, int overtime) { //
  115. uint8_t data8[2];
  116. data8[0] = data >> 8;
  117. data8[1] = data & 0xFF;
  118. return write_reg(regaddr, data8, 2, overtime);
  119. }
  120. bool DwinScreen::read_reg16(uint16_t regaddr, uint16_t& data, int overtime) {
  121. uint8_t data8[2];
  122. bool suc = read_reg(regaddr, data8, 2, overtime);
  123. if (!suc) return false;
  124. data = data8[0] << 8 | data8[1];
  125. return true;
  126. }
  127. bool DwinScreen::write_varspace16(uint16_t regaddr, uint16_t data, int overtime) { //
  128. uint8_t data8[2];
  129. data8[0] = data >> 8;
  130. data8[1] = data & 0xFF;
  131. return write_varspace(regaddr, data8, 2, overtime);
  132. }
  133. bool DwinScreen::write_varspace16_muti(uint16_t regaddr, uint16_t* data, size_t n16, int overtime) {
  134. for (size_t i = 0; i < n16; i++) {
  135. m_tx_pre_processcache[i * 2] = data[i] >> 8;
  136. m_tx_pre_processcache[i * 2 + 1] = data[i] & 0xFF;
  137. }
  138. return write_varspace(regaddr, m_tx_pre_processcache, n16 * 2, overtime);
  139. }
  140. bool DwinScreen::read_varspace16_muti(uint16_t regaddr, uint16_t* data, size_t n16, int overtime) {
  141. // TODO: CHECK BUFSIZE
  142. memset(m_rd_pre_processcache, 0, sizeof(m_rd_pre_processcache));
  143. bool suc = read_varspace(regaddr, m_rd_pre_processcache, n16 * 2, overtime);
  144. if (!suc) return false;
  145. for (size_t i = 0; i < n16; i++) {
  146. data[i] = m_rd_pre_processcache[i * 2] << 8 | m_rd_pre_processcache[i * 2 + 1];
  147. }
  148. return true;
  149. }
  150. bool DwinScreen::read_varspace16(uint16_t regaddr, uint16_t& data, int overtime) {
  151. uint8_t data8[2];
  152. bool suc = read_varspace(regaddr, data8, 2, overtime);
  153. if (!suc) return false;
  154. data = data8[0] << 8 | data8[1];
  155. return true;
  156. }
  157. bool DwinScreen::write_varspace8(uint16_t regaddr, uint16_t subadd, uint16_t data, int overtime) {
  158. uint16_t val = 0;
  159. bool suc = read_varspace16(regaddr, val, overtime);
  160. if (!suc) return false;
  161. if (subadd == 0) {
  162. // H
  163. val = val & 0x00FF;
  164. val = val | ((data << 8) & 0xff00);
  165. } else {
  166. // L
  167. val = val & 0xFF00;
  168. val = val | (data & 0xff);
  169. }
  170. suc = write_varspace16(regaddr, val, overtime);
  171. if (!suc) return false;
  172. return true;
  173. }
  174. bool DwinScreen::read_varspace8(uint16_t regaddr, uint16_t subadd, uint16_t& data, int overtime) {
  175. uint16_t val = 0;
  176. bool suc = read_varspace16(regaddr, val, overtime);
  177. if (!suc) return false;
  178. if (subadd == 0) {
  179. // H
  180. data = val >> 8;
  181. } else {
  182. // L
  183. data = val & 0xff;
  184. }
  185. return true;
  186. }
  187. bool DwinScreen::write_reg(uint16_t regaddr, uint8_t* data, size_t len, int overtime) {
  188. /**
  189. * @brief
  190. *
  191. * 2byte 1byte cmd add val
  192. * 5AA5 datalen 0x82 2 xbyte
  193. *
  194. */
  195. txcontext.txcache[0] = 0x5A;
  196. txcontext.txcache[1] = 0xA5;
  197. txcontext.txcache[2] = 0; // data len
  198. txcontext.txcache[3] = 0x80;
  199. txcontext.txcache[4] = regaddr >> 8;
  200. txcontext.txcache[5] = regaddr & 0xFF;
  201. memcpy(&txcontext.txcache[6], data, len);
  202. txcontext.txcache[2] = len + 1 + 2; //
  203. txcontext.txlen = 6 + len;
  204. if (!sendcmdblock(overtime)) {
  205. ZLOGE(TAG, "write_reg failed");
  206. return false;
  207. }
  208. return true;
  209. }
  210. bool DwinScreen::read_reg(uint16_t regaddr, uint8_t* data, size_t len, int overtime) {
  211. /**
  212. * @brief
  213. *
  214. * 2byte 1byte cmd add val
  215. * 5AA5 datalen 0x82 2 xbyte
  216. *
  217. */
  218. txcontext.txcache[0] = 0x5A;
  219. txcontext.txcache[1] = 0xA5;
  220. txcontext.txcache[2] = 0; // data len
  221. txcontext.txcache[3] = 0x81;
  222. txcontext.txcache[4] = regaddr >> 8;
  223. txcontext.txcache[5] = regaddr & 0xFF;
  224. txcontext.txcache[6] = len / 2; // word len
  225. txcontext.txcache[2] = 4; //
  226. txcontext.txlen = 7;
  227. if (!sendcmdblock(overtime)) {
  228. ZLOGE(TAG, "read_varspace failed");
  229. return false;
  230. }
  231. memcpy(data, &txcontext.receiptcache[7], len);
  232. return true;
  233. }
  234. bool DwinScreen::set_page(uint16_t pageid) {
  235. uint16_t data[2] = {0x5A01, pageid};
  236. return write_varspace16_muti(0x84, data, 2, 10);
  237. }
  238. uint16_t DwinScreen::get_page() {
  239. uint16_t page = 0;
  240. read_varspace16(0x14, page, 100);
  241. return page;
  242. }
  243. bool DwinScreen::ping() {
  244. uint16_t page = 0;
  245. bool suc = read_varspace16(0x14, page, 100);
  246. return suc;
  247. }
  248. bool DwinScreen::set_brightness(uint16_t brightness) {
  249. // 5A A5 04 82 0082 0A
  250. uint8_t data[3] = {0, 0x82, (uint8_t)brightness};
  251. return write_varspace(0x82, data, 3, 10);
  252. }
  253. bool DwinScreen::set_rtc(uint16_t year, uint16_t month, uint16_t day, uint16_t hour, uint16_t minute, uint16_t second) {
  254. year = year - 2000;
  255. uint16_t year_month = year << 8 | month;
  256. uint16_t day_hour = day << 8 | hour;
  257. uint16_t min_second = minute << 8 | second;
  258. uint16_t data[4] = {0x5AA5, year_month, day_hour, min_second};
  259. return write_varspace16_muti(0x9C, data, 4, 10);
  260. }
  261. bool DwinScreen::get_rtc(Date* date) {
  262. uint16_t data[4] = {0};
  263. bool suc = read_varspace16_muti(0x10, data, 4, 10);
  264. // printf("data[0]:%04X data[1]:%04X data[2]:%04X data[3]:%04X\n", data[0], data[1], data[2], data[3]);
  265. // date->year = (data[0] >> 8) + 2000;
  266. // date->month = data[0] & 0xFF;
  267. // date->day = data[1] >> 8;
  268. // date->weekdaynum = data[1] & 0xFF;
  269. // date->hour = data[2] >> 8;
  270. // date->minute = data[2] & 0xFF;
  271. // date->second = data[3] >> 8;
  272. date->year = (data[0] & 0xff) + 2000;
  273. date->month = data[1] >> 8;
  274. date->day = data[1] & 0xFF;
  275. date->weekdaynum = data[2] >> 8;
  276. date->hour = data[2] & 0xFF;
  277. date->minute = data[3] >> 8;
  278. date->second = data[3] & 0xFF;
  279. printf("year:%d month:%d day:%d weekdaynum:%d hour:%d minute:%d second:%d\n", //
  280. date->year, date->month, date->day, date->weekdaynum, date->hour, date->minute, date->second);
  281. return suc;
  282. }