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.

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