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.

305 lines
8.3 KiB

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