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.

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