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.

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