yc_paint.c 95 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946
  1. #include "user_config.h"
  2. #include "esp_log.h"
  3. #include "qr_encode.h"
  4. #include "qr_consts.h"
  5. #include "list.h"
  6. #include "esp_timer.h"
  7. static const char *LOG_TAG = "yc_paint";
  8. #include "esp_sleep.h"
  9. #include "user_sleep.h"
  10. #include "esp_mac.h"
  11. #include "freertos/FreeRTOS.h"
  12. #include "freertos/task.h"
  13. #include "freertos/queue.h"
  14. #include "freertos/semphr.h"
  15. extern TERMINAL_INFO_T terminal_info;
  16. int last_batt_precent;
  17. #if 0
  18. #define DISPLAY_BUFFER_SIZE (480 * 648 / 8)
  19. uint32_t display_size = DISPLAY_BUFFER_SIZE;
  20. unsigned char tmp_paint_buf[480*81] = {0};
  21. unsigned char last_paint_buf_left[480*81] = {0};
  22. unsigned char last_paint_buf_right[480*81] = {0};
  23. #else
  24. #define DISPLAY_BUFFER_SIZE (480 * 648 / 8)
  25. uint32_t display_size = DISPLAY_BUFFER_SIZE;
  26. unsigned char tmp_paint_buf[480 * 81] = {0};
  27. unsigned char *last_paint_buf_left = NULL;
  28. unsigned char *last_paint_buf_right = NULL;
  29. static RTC_FAST_ATTR unsigned int compressedSize = 0;
  30. static RTC_FAST_ATTR unsigned int decompressedSize = 0;
  31. static RTC_FAST_ATTR unsigned int right_compressedSize = 0;
  32. static RTC_FAST_ATTR unsigned int right_decompressedSize = 0;
  33. // #if 0 //压缩
  34. // int compressedSize = compressRLE(Paint_info.Image, 480*81, old_buffer);
  35. // printf(" src size = %d, zip size:%d\r\n",480*81,compressedSize);
  36. // memset((uint8_t*)tmp_paint_buf,0,sizeof(tmp_paint_buf));
  37. // int decompressedSize = decompressRLE(old_buffer, compressedSize, tmp_paint_buf);
  38. // printf("src size = %d unzip %d\r\n",480*81,decompressedSize);
  39. // #endif
  40. #endif
  41. RTC_FAST_ATTR uint32_t arr_heights[6] = {0};
  42. char str_operation[6] = {0xd4, 0xcb, 0xd0, 0xd0, 0x00, 0x00}; // 运行
  43. char str_upKeep[6] = {0xb1, 0xa3, 0xd1, 0xf8, 0x00, 0x00}; // 保养
  44. char str_shutDown[6] = {0xcd, 0xa3, 0xbb, 0xfa, 0x00, 0x00}; // 停机
  45. char str_safeKeep[6] = {0xb7, 0xe2, 0xb4, 0xe6, 0x00, 0x00}; // 封存
  46. char str_waitMaterials[6] = {0xb4, 0xfd, 0xc1, 0xcf, 0x00, 0x00}; // 待料
  47. char str_breakDown[6] = {0xb9, 0xca, 0xd5, 0xcf, 0x00, 0x00}; // 故障
  48. char str_inspection[6] = {0xd1, 0xb2, 0xbc, 0xec, 0x00, 0x00};
  49. char str_production[6] = {0xc9, 0xfa, 0xb2, 0xfa, 0x00, 0x00};
  50. char str_repair[6] = {0xce, 0xac, 0xd0, 0xde, 0x00, 0x00};
  51. // char str_0[14] = {0xb9,0xdc,0x20,0x20,0xc0,0xed,0x20,0x20,0xd4,0xb1,0xa3,0xba,0x00,0x00};
  52. // char str_1[14] = {0xc9,0xfa,0xb2,0xfa,0xd4,0xf0,0xc8,0xce,0xc8,0xcb,0xa3,0xba,0x00,0x00};
  53. // char str_2[14] = {0xce,0xac,0xd0,0xde,0xd4,0xf0,0xc8,0xce,0xc8,0xcb,0xa3,0xba,0x00,0x00};
  54. // char str_3[14] = {0xb1,0xa3,0xd1,0xf8,0xd4,0xf0,0xc8,0xce,0xc8,0xcb,0xa3,0xba,0x00,0x00};
  55. // char str_4[14] = {0xd1,0xb2,0xbc,0xec,0xd4,0xf0,0xc8,0xce,0xc8,0xcb,0xa3,0xba,0x00,0x00};
  56. static bool isASCII(char c);
  57. static bool isGBKChinese(char c1, char c2);
  58. static void countCharacters(const char *str, int *chineseCount, int *asciiCount);
  59. static int calculateStringWidth(const char *str, int en_px, int cn_px);
  60. static void QRGenerator(char *input);
  61. static void displayQRCode(int side, uint8_t *bitdata, int x, int y)
  62. {
  63. int i = 0;
  64. int j = 0;
  65. int a = 0;
  66. for (i = 0; i < side; i++)
  67. {
  68. for (j = 0; j < side; j++)
  69. {
  70. a = j * side + i;
  71. if ((bitdata[a / 8] & (1 << (7 - a % 8)))) // 画点
  72. {
  73. Paint_SetPixel(x + j, y + i, WHITE); // 画一个点
  74. }
  75. else
  76. {
  77. }
  78. }
  79. }
  80. }
  81. static void QRGenerator(char *input)
  82. {
  83. // printf("%s \n",(char*)input);
  84. int side;
  85. uint8_t bitdata[QR_MAX_BITDATA];
  86. // remove newline
  87. if (input[strlen(input) - 1] == '\n')
  88. {
  89. input[strlen(input) - 1] = 0;
  90. }
  91. side = qr_encode(QR_LEVEL_L, 0, input, 0, bitdata); // 生成二维码
  92. // printf("总 %dx%d\n\nlen =%d\n", side, side,strlen((char*)bitdata)); //二维码大小
  93. memset(tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  94. Paint_NewImage((UBYTE *)tmp_paint_buf, 40, 40, ROTATE_0, WHITE);
  95. displayQRCode(side, bitdata, 0, 0);
  96. epd_partial_cache(440, 0, 480, 80, SCREEN_LEFT, Paint_info.Image);
  97. }
  98. static void displayQRCode_expand(int side, uint8_t *bitdata, int x, int y, int expand) // expand 扩大边长的倍数
  99. {
  100. int i = 0;
  101. int j = 0;
  102. int a = 0;
  103. for (i = 0; i < side; i++)
  104. {
  105. for (j = 0; j < side; j++)
  106. {
  107. a = j * side + i;
  108. if ((bitdata[a / 8] & (1 << (7 - a % 8)))) // 画点
  109. { // Paint_SetPixel(x+j, y+i, WHITE);//画一个点
  110. Paint_DrawPoint(x + j * expand, y + i * expand, WHITE, DOT_PIXEL_2X2, DOT_FILL_RIGHTUP);
  111. }
  112. else
  113. {
  114. }
  115. }
  116. }
  117. }
  118. #include <stdio.h>
  119. #include <stdbool.h>
  120. #include <string.h>
  121. // 函数用于判断字符是否是ASCII字符
  122. static bool isASCII(char c)
  123. {
  124. return (c >= 32 && c <= 126);
  125. }
  126. // 函数用于判断字符是否是GBK编码的汉字
  127. static bool isGBKChinese(char c1, char c2)
  128. {
  129. return (c1 >= 0x81 && c1 <= 0xFE && c2 >= 0x40 && c2 <= 0xFE);
  130. }
  131. // 统计字符串中GBK编码的汉字和ASCII字符的个数
  132. static void countCharacters(const char *str, int *chineseCount, int *asciiCount)
  133. {
  134. *chineseCount = 0;
  135. *asciiCount = 0;
  136. int len = strlen(str);
  137. for (int i = 0; i < len; i++)
  138. {
  139. char c1 = str[i];
  140. if (isASCII(c1))
  141. {
  142. (*asciiCount)++;
  143. }
  144. else if (i + 1 < len)
  145. {
  146. char c2 = str[i + 1];
  147. if (isGBKChinese(c1, c2))
  148. {
  149. (*chineseCount)++;
  150. i++; // 跳过下一个字节
  151. }
  152. }
  153. }
  154. }
  155. // 函数用于计算字符串的宽度
  156. static int calculateStringWidth(const char *str, int en_px, int cn_px)
  157. {
  158. int len = 0;
  159. // if(str[0]==0)
  160. // {
  161. // len = strlen(str+1);
  162. // len++;
  163. // }
  164. // else
  165. // {
  166. len = strlen(str);
  167. // }
  168. int width = 0;
  169. for (int i = 0; i < len; i++)
  170. {
  171. // 判断字符是中文还是英文,并累加宽度
  172. if (str[i] >= 0 && str[i] <= 127)
  173. {
  174. // 英文字符
  175. width += en_px; // 假设英文字符宽度为12像素
  176. }
  177. else
  178. {
  179. // 中文字符
  180. width += cn_px; // 假设中文字符宽度为24像素
  181. i += 1;
  182. }
  183. }
  184. return width;
  185. }
  186. /*******下面是全屏缓冲区,快刷代码******/
  187. // Function to calculate and return an array of bar chart heights
  188. // Function to calculate and return an array of bar chart heights in pixels
  189. // Function to calculate and return an array of bar chart heights in pixels
  190. static unsigned int *calculateBarChartHeights(unsigned int data[], int size, unsigned int chartHeight)
  191. {
  192. unsigned int max = data[0];
  193. for (int i = 1; i < size; i++)
  194. {
  195. if (data[i] > max)
  196. {
  197. max = data[i];
  198. }
  199. }
  200. // Allocate memory for the array of heights
  201. unsigned int *heights = (unsigned int *)malloc(size * sizeof(unsigned int));
  202. for (int i = 0; i < size; i++)
  203. {
  204. if (data[i] == 0)
  205. {
  206. heights[i] = 0;
  207. }
  208. else if (data[i] == max)
  209. {
  210. // If data[i] is the maximum value, set height to chartHeight
  211. heights[i] = chartHeight;
  212. }
  213. else
  214. {
  215. // Calculate height in pixels based on proportion
  216. heights[i] = (unsigned int)(((double)data[i] / max) * chartHeight);
  217. }
  218. }
  219. return heights; // 返回高度数组
  220. }
  221. // 获得百分比曲线高度,最大值10000,为100%.XXxx为XX. 。整数位XX.小数位xx。
  222. static unsigned int *getBarChartHeights(unsigned int data[], int size, unsigned int chartHeight)
  223. {
  224. unsigned int *heights = (unsigned int *)malloc(size * sizeof(unsigned int));
  225. for (int i = 0; i < size; i++)
  226. {
  227. if (data[i] == 0)
  228. {
  229. heights[i] = 0;
  230. }
  231. else if (data[i] > 0 && data[i] < 10000)
  232. {
  233. heights[i] = (unsigned int)(((double)data[i] / 10000) * chartHeight);
  234. }
  235. else if (data[i] == 10000)
  236. {
  237. heights[i] = chartHeight;
  238. }
  239. else
  240. {
  241. ESP_LOGE(LOG_TAG, "ERR:>10000[%d]", i);
  242. heights[i] = 0;
  243. }
  244. }
  245. return heights; // 返回高度数组
  246. }
  247. // 字符居中对齐
  248. // 参数:展示字符串,屏幕宽度,单个英文字符像素,单个中文字符像素
  249. // 返回值:字符展示开始位置
  250. static int center_align(char *str, int screenWidth, int en_px, int cn_px)
  251. {
  252. // int chineseCount, asciiCount;
  253. // countCharacters(str, &chineseCount, &asciiCount);
  254. int textWidth = calculateStringWidth(str, en_px, cn_px);
  255. int x = (screenWidth - textWidth) / 2;
  256. return x;
  257. }
  258. static void QRGenerator_quick(char *input)
  259. {
  260. // printf("%s \n",(char*)input);
  261. int side;
  262. uint8_t bitdata[QR_MAX_BITDATA];
  263. // remove newline
  264. if (input[strlen(input) - 1] == '\n')
  265. {
  266. input[strlen(input) - 1] = 0;
  267. }
  268. side = qr_encode(QR_LEVEL_L, 0, input, 0, bitdata); // 生成二维码
  269. // printf("总 %dx%d\n\nlen =%d\n", side, side,strlen((char*)bitdata)); //二维码大小
  270. // memset(tmp_paint_buf,0,DISPLAY_BUFFER_SIZE/*sizeof(tmp_paint_buf)*/);
  271. // displayQRCode(side,bitdata,450,435);
  272. // displayQRCode(side,bitdata,500,435);
  273. displayQRCode_expand(side, bitdata, 478, 394, 2);
  274. }
  275. static uint8_t *partial_bar_chart_07_02_quick(Machine_info_t *info);
  276. static uint8_t *partial_bar_chart_07_03_quick(Machine_info_t *info);
  277. static uint8_t *partial_bar_chart_07_04_quick(Machine_info_t *info);
  278. static uint8_t *partial_bar_chart_07_02_quick(Machine_info_t *info)
  279. {
  280. #if 0
  281. // extern Node *clockIn_list;
  282. // int production_num = countClockNodes_byCMD(clockIn_list,0x00);
  283. // int repair_num = countClockNodes_byCMD(clockIn_list,0x01);
  284. // int inspection_num = countClockNodes_byCMD(clockIn_list,0x02);
  285. // int upKeep_num = countClockNodes_byCMD(clockIn_list,0x03);
  286. #else
  287. // 签到人数只加不减
  288. // int production_num = Machine_info.personnel_check_in[0];
  289. // int repair_num = Machine_info.personnel_check_in[1];
  290. // int inspection_num = Machine_info.personnel_check_in[2];
  291. // int upKeep_num = Machine_info.personnel_check_in[3];
  292. #endif
  293. char arr_string[20];
  294. uint32_t arr_num[4] = {Machine_info.checkIn_set[0].number, Machine_info.checkIn_set[1].number, Machine_info.checkIn_set[2].number, Machine_info.checkIn_set[3].number};
  295. unsigned int *numHeights = calculateBarChartHeights(arr_num, 4, 200);
  296. ESP_LOGW(LOG_TAG, "当前在岗:%ld ,%ld,%ld,%ld", arr_num[0], arr_num[1], arr_num[2], arr_num[3]);
  297. uint8_t *bar_chart_07_02_buf = (uint8_t *)calloc(480 * 300 / 8, sizeof(uint8_t)); // free();
  298. memset(tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  299. Paint_NewImage((uint8_t *)tmp_paint_buf, 480, 300, ROTATE_0, WHITE);
  300. Paint_DrawLine(40, 250, 440, 250, WHITE, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
  301. // S:screen
  302. // R:rectangle
  303. // C:CN
  304. // E:EN
  305. // L:LINE
  306. // ITV:(interval)
  307. #define BAR_LINE_Y_POS 250
  308. #define BAR_CHART_Y_MAX 250
  309. #define BAR_CHART_Y_MIN 50
  310. #define BAR_07_02_S_L_ITV 40
  311. #define BAR_07_02_L_R_ITV 18
  312. #define BAR_07_02_R_R_ITV 100
  313. #define BAR_07_02_R_WIDTH 64
  314. #define BAR_07_02_C_SKEW 2
  315. #define BAR_07_02_E_SKEW (24 + 4)
  316. #define BAR_07_02_R1 (BAR_07_02_S_L_ITV + BAR_07_02_L_R_ITV)
  317. #define BAR_07_02_C1 (BAR_07_02_R1 + BAR_07_02_C_SKEW)
  318. #define BAR_07_02_E1 (BAR_07_02_C1)
  319. #define BAR_07_02_R2 (BAR_07_02_R1 + BAR_07_02_R_R_ITV)
  320. #define BAR_07_02_C2 (BAR_07_02_C1 + BAR_07_02_R_R_ITV)
  321. #define BAR_07_02_E2 (BAR_07_02_E1 + BAR_07_02_R_R_ITV)
  322. #define BAR_07_02_R3 (BAR_07_02_R2 + BAR_07_02_R_R_ITV)
  323. #define BAR_07_02_C3 (BAR_07_02_C2 + BAR_07_02_R_R_ITV)
  324. #define BAR_07_02_E3 (BAR_07_02_E2 + BAR_07_02_R_R_ITV)
  325. #define BAR_07_02_R4 (BAR_07_02_R3 + BAR_07_02_R_R_ITV)
  326. #define BAR_07_02_C4 (BAR_07_02_C3 + BAR_07_02_R_R_ITV)
  327. #define BAR_07_02_E4 (BAR_07_02_E3 + BAR_07_02_R_R_ITV)
  328. char tmp_12[4][6] = {0};
  329. char tmp_34[4][6] = {0};
  330. memcpy(tmp_12[0], Machine_info.checkIn_set[0].other_name, 4);
  331. memcpy(tmp_34[0], Machine_info.checkIn_set[0].other_name + 4, 4);
  332. memcpy(tmp_12[1], Machine_info.checkIn_set[1].other_name, 4);
  333. memcpy(tmp_34[1], Machine_info.checkIn_set[1].other_name + 4, 4);
  334. memcpy(tmp_12[2], Machine_info.checkIn_set[2].other_name, 4);
  335. memcpy(tmp_34[2], Machine_info.checkIn_set[2].other_name + 4, 4);
  336. memcpy(tmp_12[3], Machine_info.checkIn_set[3].other_name, 4);
  337. memcpy(tmp_34[3], Machine_info.checkIn_set[3].other_name + 4, 4);
  338. memset(arr_string, 0, 20);
  339. itoa(arr_num[0], arr_string, 10);
  340. Paint_DrawRectangle(BAR_07_02_R1, BAR_LINE_Y_POS - numHeights[0], BAR_07_02_R1 + BAR_07_02_R_WIDTH, BAR_LINE_Y_POS, WHITE, 1, 1);
  341. // Paint_DrawString_CN(BAR_07_02_C1, BAR_LINE_Y_POS+BAR_07_02_C_SKEW,(char*)str_production, &chinese_type_24,FONT_FOREGROUND,FONT_BACKGROUND );
  342. Paint_DrawString_CN(BAR_07_02_C1, BAR_LINE_Y_POS + BAR_07_02_C_SKEW, tmp_12[0], &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  343. Paint_DrawString_CN(BAR_07_02_C1, BAR_LINE_Y_POS + BAR_07_02_C_SKEW + 24, tmp_34[0], &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  344. Paint_DrawString_EN(BAR_07_02_E1, BAR_LINE_Y_POS - BAR_07_02_E_SKEW - numHeights[0], (char *)arr_string, &ascii_type_12x24, FONT_FOREGROUND, FONT_BACKGROUND);
  345. memset(arr_string, 0, 20);
  346. itoa(arr_num[1], arr_string, 10);
  347. Paint_DrawRectangle(BAR_07_02_R2, BAR_LINE_Y_POS - numHeights[1], BAR_07_02_R2 + BAR_07_02_R_WIDTH, BAR_LINE_Y_POS, WHITE, 1, 1);
  348. // Paint_DrawString_CN(BAR_07_02_C2, BAR_LINE_Y_POS+BAR_07_02_C_SKEW, (char*)str_repair, &chinese_type_24,FONT_FOREGROUND,FONT_BACKGROUND );
  349. Paint_DrawString_CN(BAR_07_02_C2, BAR_LINE_Y_POS + BAR_07_02_C_SKEW, tmp_12[1], &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  350. Paint_DrawString_CN(BAR_07_02_C2, BAR_LINE_Y_POS + BAR_07_02_C_SKEW + 24, tmp_34[1], &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  351. Paint_DrawString_EN(BAR_07_02_E2, BAR_LINE_Y_POS - BAR_07_02_E_SKEW - numHeights[1], (char *)arr_string, &ascii_type_12x24, FONT_FOREGROUND, FONT_BACKGROUND);
  352. memset(arr_string, 0, 20);
  353. itoa(arr_num[2], arr_string, 10);
  354. Paint_DrawRectangle(BAR_07_02_R3, BAR_LINE_Y_POS - numHeights[2], BAR_07_02_R3 + BAR_07_02_R_WIDTH, BAR_LINE_Y_POS, WHITE, 1, 1);
  355. // Paint_DrawString_CN(BAR_07_02_C3, BAR_LINE_Y_POS+BAR_07_02_C_SKEW, (char*)str_inspection, &chinese_type_24,FONT_FOREGROUND,FONT_BACKGROUND );
  356. Paint_DrawString_CN(BAR_07_02_C3, BAR_LINE_Y_POS + BAR_07_02_C_SKEW, tmp_12[2], &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  357. Paint_DrawString_CN(BAR_07_02_C3, BAR_LINE_Y_POS + BAR_07_02_C_SKEW + 24, tmp_34[2], &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  358. Paint_DrawString_EN(BAR_07_02_E3, BAR_LINE_Y_POS - BAR_07_02_E_SKEW - numHeights[2], (char *)arr_string, &ascii_type_12x24, FONT_FOREGROUND, FONT_BACKGROUND);
  359. memset(arr_string, 0, 20);
  360. itoa(arr_num[3], arr_string, 10);
  361. Paint_DrawRectangle(BAR_07_02_R4, BAR_LINE_Y_POS - numHeights[3], BAR_07_02_R4 + BAR_07_02_R_WIDTH, BAR_LINE_Y_POS, WHITE, 1, 1);
  362. // Paint_DrawString_CN(BAR_07_02_C4, BAR_LINE_Y_POS+BAR_07_02_C_SKEW, (char*)str_upKeep, &chinese_type_24,FONT_FOREGROUND,FONT_BACKGROUND );
  363. Paint_DrawString_CN(BAR_07_02_C4, BAR_LINE_Y_POS + BAR_07_02_C_SKEW, tmp_12[3], &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  364. Paint_DrawString_CN(BAR_07_02_C4, BAR_LINE_Y_POS + BAR_07_02_C_SKEW + 24, tmp_34[3], &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  365. Paint_DrawString_EN(BAR_07_02_E4, BAR_LINE_Y_POS - BAR_07_02_E_SKEW - numHeights[3], (char *)arr_string, &ascii_type_12x24, FONT_FOREGROUND, FONT_BACKGROUND);
  366. memcpy(bar_chart_07_02_buf, Paint_info.Image, sizeof(uint8_t) * 480 * 300 / 8);
  367. free(numHeights);
  368. return bar_chart_07_02_buf;
  369. }
  370. static uint8_t *partial_bar_chart_07_03_quick(Machine_info_t *info)
  371. {
  372. char arr_string[20];
  373. uint32_t *timeHeights = calculateBarChartHeights(arr_heights, 6, 200);
  374. uint8_t *bar_chart_07_03_buf = (uint8_t *)calloc(480 * 300 / 8, sizeof(uint8_t));
  375. memset(tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  376. Paint_NewImage((UBYTE *)tmp_paint_buf, 480, 300, ROTATE_0, WHITE);
  377. Paint_DrawLine(30, 250, 450, 250, WHITE, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
  378. memset(arr_string, 0, 20);
  379. itoa(arr_heights[0], arr_string, 10);
  380. Paint_DrawRectangle(30 + 10, 250 - timeHeights[0], 30 + 10 + 50, 250, WHITE, 1, 1);
  381. // Paint_DrawString_CN(30+10+8, 250+8,(char*)str_operation, &chinese_type_24,FONT_FOREGROUND,FONT_BACKGROUND );
  382. Paint_DrawString_CN(30 + 10 + 8, 250 + 8, (char *)Machine_info.btn_operation, &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  383. Paint_DrawString_EN(30 + 10 + 8, 250 - timeHeights[0] - 4 - 24, arr_string, &ascii_type_12x24, FONT_FOREGROUND, FONT_BACKGROUND);
  384. memset(arr_string, 0, 20);
  385. itoa(arr_heights[1], arr_string, 10);
  386. Paint_DrawRectangle(30 + 10 + 70, 250 - timeHeights[1], 30 + 10 + 50 + 70, 250, WHITE, 1, 1);
  387. // Paint_DrawString_CN(30+10+8+70, 250+8,(char*)str_shutDown, &chinese_type_24,FONT_FOREGROUND,FONT_BACKGROUND );
  388. Paint_DrawString_CN(30 + 10 + 8 + 70, 250 + 8, (char *)Machine_info.btn_shutDown_info, &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  389. Paint_DrawString_EN(30 + 10 + 8 + 70, 250 - timeHeights[1] - 4 - 24, arr_string, &ascii_type_12x24, FONT_FOREGROUND, FONT_BACKGROUND);
  390. memset(arr_string, 0, 20);
  391. itoa(arr_heights[2], arr_string, 10);
  392. Paint_DrawRectangle(30 + 10 + 140, 250 - timeHeights[2], 30 + 10 + 50 + 140, 250, WHITE, 1, 1);
  393. // Paint_DrawString_CN(30+10+8+140, 250+8,(char*)str_breakDown, &chinese_type_24,FONT_FOREGROUND,FONT_BACKGROUND );
  394. Paint_DrawString_CN(30 + 10 + 8 + 140, 250 + 8, (char *)Machine_info.btn_breakDown_info, &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  395. Paint_DrawString_EN(30 + 10 + 8 + 140, 250 - timeHeights[2] - 4 - 24, arr_string, &ascii_type_12x24, FONT_FOREGROUND, FONT_BACKGROUND);
  396. memset(arr_string, 0, 20);
  397. itoa(arr_heights[3], arr_string, 10);
  398. Paint_DrawRectangle(30 + 10 + 210, 250 - timeHeights[3], 30 + 10 + 50 + 210, 250, WHITE, 1, 1);
  399. // Paint_DrawString_CN(30+10+8+210, 250+8,(char*)str_safeKeep, &chinese_type_24,FONT_FOREGROUND,FONT_BACKGROUND );
  400. Paint_DrawString_CN(30 + 10 + 8 + 210, 250 + 8, (char *)Machine_info.btn_safeKeep_info, &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  401. Paint_DrawString_EN(30 + 10 + 8 + 210, 250 - timeHeights[3] - 4 - 24, arr_string, &ascii_type_12x24, FONT_FOREGROUND, FONT_BACKGROUND);
  402. memset(arr_string, 0, 20);
  403. itoa(arr_heights[4], arr_string, 10);
  404. Paint_DrawRectangle(30 + 10 + 280, 250 - timeHeights[4], 30 + 10 + 50 + 280, 250, WHITE, 1, 1);
  405. // Paint_DrawString_CN(30+10+8+280, 250+8,(char*)str_upKeep, &chinese_type_24,FONT_FOREGROUND,FONT_BACKGROUND );
  406. Paint_DrawString_CN(30 + 10 + 8 + 280, 250 + 8, (char *)Machine_info.btn_upKeep_info, &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  407. Paint_DrawString_EN(30 + 10 + 8 + 280, 250 - timeHeights[4] - 4 - 24, arr_string, &ascii_type_12x24, FONT_FOREGROUND, FONT_BACKGROUND);
  408. memset(arr_string, 0, 20);
  409. itoa(arr_heights[5], arr_string, 10);
  410. Paint_DrawRectangle(30 + 10 + 350, 250 - timeHeights[5], 30 + 10 + 50 + 350, 250, WHITE, 1, 1);
  411. // Paint_DrawString_CN(30+10+8+350, 250+8,(char*)str_waitMaterials, &chinese_type_24,FONT_FOREGROUND,FONT_BACKGROUND );
  412. Paint_DrawString_CN(30 + 10 + 8 + 350, 250 + 8, (char *)Machine_info.btn_waitMaterials_info, &chinese_type_24, FONT_FOREGROUND, FONT_BACKGROUND);
  413. Paint_DrawString_EN(30 + 10 + 8 + 350, 250 - timeHeights[5] - 4 - 24, arr_string, &ascii_type_12x24, FONT_FOREGROUND, FONT_BACKGROUND);
  414. memcpy(bar_chart_07_03_buf, Paint_info.Image, sizeof(uint8_t) * 480 * 300 / 8);
  415. free(timeHeights);
  416. return bar_chart_07_03_buf;
  417. }
  418. static uint8_t *partial_bar_chart_07_04_quick(Machine_info_t *info)
  419. {
  420. char arr_string[20];
  421. uint32_t arr_num[4] = {Machine_info.checkIn_set[0].number, Machine_info.checkIn_set[1].number, Machine_info.checkIn_set[2].number, Machine_info.checkIn_set[3].number};
  422. uint32_t *arrHeights = calculateBarChartHeights(arr_heights, 6, 200);
  423. uint32_t *numHeights = calculateBarChartHeights(arr_num, 4, 200);
  424. uint8_t *bar_chart_07_04_buf = (uint8_t *)calloc(480 * 300 / 8, sizeof(uint8_t));
  425. memset(tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  426. Paint_NewImage((UBYTE *)tmp_paint_buf, 480, 300, ROTATE_0, WHITE);
  427. Paint_DrawLine(10, 250, 274, 250, WHITE, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
  428. Paint_DrawLine(294, 250, 470, 250, WHITE, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
  429. memset(arr_string, 0, 20);
  430. itoa(arr_heights[0], arr_string, 10);
  431. Paint_DrawRectangle(10 + 2, 250 - arrHeights[0], 10 + 2 + 40, 250, WHITE, 1, 1);
  432. Paint_DrawString_CN(10 + 2 + 8, 250 + 2, (char *)Machine_info.btn_operation, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  433. Paint_DrawString_EN(10 + 2 + 5, 250 - arrHeights[0] - 2 - 16, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  434. memset(arr_string, 0, 20);
  435. itoa(arr_heights[1], arr_string, 10);
  436. Paint_DrawRectangle(10 + 2 + 44, 250 - arrHeights[1], 10 + 2 + 40 + 44, 250, WHITE, 1, 1);
  437. Paint_DrawString_CN(10 + 2 + 8 + 44, 250 + 2, (char *)Machine_info.btn_shutDown_info, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  438. Paint_DrawString_EN(10 + 2 + 5 + 44, 250 - arrHeights[1] - 2 - 16, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  439. memset(arr_string, 0, 20);
  440. itoa(arr_heights[2], arr_string, 10);
  441. Paint_DrawRectangle(10 + 2 + 88, 250 - arrHeights[2], 10 + 2 + 40 + 88, 250, WHITE, 1, 1);
  442. Paint_DrawString_CN(10 + 2 + 8 + 88, 250 + 2, (char *)Machine_info.btn_breakDown_info, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  443. Paint_DrawString_EN(10 + 2 + 5 + 88, 250 - arrHeights[2] - 2 - 16, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  444. memset(arr_string, 0, 20);
  445. itoa(arr_heights[3], arr_string, 10);
  446. Paint_DrawRectangle(10 + 2 + 132, 250 - arrHeights[3], 10 + 2 + 40 + 132, 250, WHITE, 1, 1);
  447. Paint_DrawString_CN(10 + 2 + 8 + 132, 250 + 2, (char *)Machine_info.btn_safeKeep_info, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  448. Paint_DrawString_EN(10 + 2 + 5 + 132, 250 - arrHeights[3] - 2 - 16, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  449. memset(arr_string, 0, 20);
  450. itoa(arr_heights[4], arr_string, 10);
  451. Paint_DrawRectangle(10 + 2 + 176, 250 - arrHeights[4], 10 + 2 + 40 + 176, 250, WHITE, 1, 1);
  452. Paint_DrawString_CN(10 + 2 + 8 + 176, 250 + 2, (char *)Machine_info.btn_upKeep_info, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  453. Paint_DrawString_EN(10 + 2 + 5 + 176, 250 - arrHeights[4] - 2 - 16, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  454. memset(arr_string, 0, 20);
  455. itoa(arr_heights[5], arr_string, 10);
  456. Paint_DrawRectangle(10 + 2 + 220, 250 - arrHeights[5], 10 + 2 + 40 + 220, 250, WHITE, 1, 1);
  457. Paint_DrawString_CN(10 + 2 + 8 + 220, 250 + 2, (char *)Machine_info.btn_waitMaterials_info, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  458. Paint_DrawString_EN(10 + 2 + 5 + 220, 250 - arrHeights[5] - 2 - 16, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  459. // next
  460. char tmp_12[4][6] = {0};
  461. char tmp_34[4][6] = {0};
  462. memcpy(tmp_12[0], Machine_info.checkIn_set[0].other_name, 4);
  463. memcpy(tmp_34[0], Machine_info.checkIn_set[0].other_name + 4, 4);
  464. memcpy(tmp_12[1], Machine_info.checkIn_set[1].other_name, 4);
  465. memcpy(tmp_34[1], Machine_info.checkIn_set[1].other_name + 4, 4);
  466. memcpy(tmp_12[2], Machine_info.checkIn_set[2].other_name, 4);
  467. memcpy(tmp_34[2], Machine_info.checkIn_set[2].other_name + 4, 4);
  468. memcpy(tmp_12[3], Machine_info.checkIn_set[3].other_name, 4);
  469. memcpy(tmp_34[3], Machine_info.checkIn_set[3].other_name + 4, 4);
  470. memset(arr_string, 0, 20);
  471. itoa(arr_num[0], arr_string, 10);
  472. Paint_DrawRectangle(294 + 2, 250 - numHeights[0], 294 + 2 + 40, 250, WHITE, 1, 1);
  473. // Paint_DrawString_CN(294+2+8, 250+2,(char*)str_production, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  474. Paint_DrawString_CN(294 + 2 + 8, 250 + 2, tmp_12[0], &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  475. Paint_DrawString_CN(294 + 2 + 8, 250 + 2 + 16, tmp_34[0], &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  476. Paint_DrawString_EN(292 + 2 + 5, 250 - numHeights[0] - 2 - 16, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  477. memset(arr_string, 0, 20);
  478. itoa(arr_num[1], arr_string, 10);
  479. Paint_DrawRectangle(294 + 2 + 44, 250 - numHeights[1], 294 + 2 + 40 + 44, 250, WHITE, 1, 1);
  480. // Paint_DrawString_CN(294+2+8+44, 250+2,(char*)str_repair, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  481. Paint_DrawString_CN(294 + 2 + 8 + 44, 250 + 2, tmp_12[1], &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  482. Paint_DrawString_CN(294 + 2 + 8 + 44, 250 + 2 + 16, tmp_34[1], &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  483. Paint_DrawString_EN(292 + 2 + 5 + 44, 250 - numHeights[1] - 2 - 16, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  484. memset(arr_string, 0, 20);
  485. itoa(arr_num[2], arr_string, 10);
  486. Paint_DrawRectangle(294 + 2 + 88, 250 - numHeights[2], 294 + 2 + 40 + 88, 250, WHITE, 1, 1);
  487. // Paint_DrawString_CN(294+2+8+88, 250+2, (char*)str_inspection, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  488. Paint_DrawString_CN(294 + 2 + 8 + 88, 250 + 2, tmp_12[2], &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  489. Paint_DrawString_CN(294 + 2 + 8 + 88, 250 + 2 + 16, tmp_34[2], &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  490. Paint_DrawString_EN(292 + 2 + 5 + 88, 250 - numHeights[2] - 2 - 16, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  491. memset(arr_string, 0, 20);
  492. itoa(arr_num[3], arr_string, 10);
  493. Paint_DrawRectangle(294 + 2 + 132, 250 - numHeights[3], 294 + 2 + 40 + 132, 250, WHITE, 1, 1);
  494. // Paint_DrawString_CN(294+2+8+132, 250+2, (char*)str_upKeep, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  495. Paint_DrawString_CN(294 + 2 + 8 + 132, 250 + 2, tmp_12[3], &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  496. Paint_DrawString_CN(294 + 2 + 8 + 132, 250 + 2 + 16, tmp_34[3], &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  497. Paint_DrawString_EN(292 + 2 + 5 + 132, 250 - numHeights[3] - 2 - 16, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  498. free(arrHeights);
  499. free(numHeights);
  500. memcpy(bar_chart_07_04_buf, Paint_info.Image, sizeof(uint8_t) * 480 * 300 / 8);
  501. return bar_chart_07_04_buf;
  502. }
  503. #define RIGHT1_HIGHT 100
  504. #define RIGHT2_HIGHT 172
  505. static uint8_t *partial_right1_quick(Machine_info_t *info)
  506. {
  507. // Machine_info.batt_precent = 100;
  508. uint8_t *partial_right1_buf = (uint8_t *)calloc(RIGHT1_HIGHT * 480 / 8, sizeof(uint8_t));
  509. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  510. Paint_NewImage((uint8_t *)tmp_paint_buf, 480, RIGHT1_HIGHT, ROTATE_0, WHITE);
  511. Paint_DrawLine(10, 95, 470, 95, WHITE, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
  512. int x = center_align(&info->station_name, 480, 16, 32);
  513. Paint_DrawString_CN(x, 25, &info->station_name, &chinese_type_32, FONT_FOREGROUND, FONT_BACKGROUND);
  514. // 显示终端号码
  515. // printf(" terminal name x=%d--------------%s----------------\r\n",x,(char *)&info->terminal_name);
  516. x = center_align(&info->station_number, 480, 8, 16);
  517. Paint_DrawString_CN(x, 70, &info->station_number, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  518. // printf(" terminal_number x=%d--------------%s----------------\r\n",x,(char *)&info->terminal_number);
  519. #define BAT_X_OFFSET 2
  520. #define BAT_Y_OFFSET 2
  521. // batt
  522. Paint_DrawBitMap_Paste((uint8_t *)gImage_battery, 480 - 50 - BAT_X_OFFSET, 24, 37, 18, 1);
  523. #if 1
  524. switch (Machine_info.batt_precent)
  525. {
  526. case 0:
  527. break;
  528. case 1 ... 24:
  529. Paint_DrawRectangle(433 - BAT_X_OFFSET, 27, 439 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  530. break;
  531. case 25 ... 49:
  532. Paint_DrawRectangle(433 - BAT_X_OFFSET, 27, 439 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  533. Paint_DrawRectangle(441 - BAT_X_OFFSET, 27, 447 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  534. break;
  535. case 50 ... 74:
  536. Paint_DrawRectangle(433 - BAT_X_OFFSET, 27, 439 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  537. Paint_DrawRectangle(441 - BAT_X_OFFSET, 27, 447 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  538. Paint_DrawRectangle(449 - BAT_X_OFFSET, 27, 455 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  539. break;
  540. case 75 ... 99:
  541. Paint_DrawRectangle(433 - BAT_X_OFFSET, 27, 439 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  542. Paint_DrawRectangle(441 - BAT_X_OFFSET, 27, 447 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  543. Paint_DrawRectangle(449 - BAT_X_OFFSET, 27, 455 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  544. Paint_DrawRectangle(457 - BAT_X_OFFSET, 27, 462 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  545. break;
  546. case 100:
  547. Paint_DrawRectangle(433 - BAT_X_OFFSET, 27, 439 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  548. Paint_DrawRectangle(441 - BAT_X_OFFSET, 27, 447 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  549. Paint_DrawRectangle(449 - BAT_X_OFFSET, 27, 455 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  550. Paint_DrawRectangle(457 - BAT_X_OFFSET, 27, 462 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  551. break;
  552. default:
  553. break;
  554. }
  555. if (!decection_state_0()) // 判断充电中逻辑
  556. {
  557. Machine_info.batt_precent = read_battery_voltage();
  558. if (Machine_info.batt_precent >= 95)
  559. {
  560. Paint_DrawBitMap_Paste((uint8_t *)gImage_charging, 480 - 47 + 37, 27 - BAT_Y_OFFSET, 8, 18, 1);
  561. }
  562. else
  563. {
  564. Paint_DrawBitMap_Paste((uint8_t *)gImage_charging, 480 - 47 + 35, 27 - BAT_Y_OFFSET, 8, 18, 1);
  565. }
  566. }
  567. #else
  568. Paint_DrawBitMap_Paste((uint8_t *)gImage_filled, 480 - 47 + 37, 24, 8, 18, 1);
  569. Paint_DrawRectangle(433, 27, 439, 41, WHITE, 1, 1);
  570. Paint_DrawRectangle(441, 27, 447, 41, WHITE, 1, 1);
  571. Paint_DrawRectangle(449, 27, 455, 41, WHITE, 1, 1);
  572. Paint_DrawRectangle(457, 27, 462, 41, WHITE, 1, 1);
  573. #endif
  574. // 添加在线离线
  575. uint8_t online[6] = {0xd4, 0xda, 0xcf, 0xdf, 0x00, 0x00}; // 在线
  576. uint8_t outline[6] = {0xc0, 0xeb, 0xcf, 0xdf, 0x00, 0x00}; // 离线
  577. Paint_DrawBitMap_Paste((uint8_t *)gImage_online, 480 - 50 - BAT_X_OFFSET - 50, 24, 37, 18, 1);
  578. if (Machine_info.paired)
  579. {
  580. Paint_DrawString_CN(480 - 50 - BAT_X_OFFSET - 50 + 3, 25, (char *)online, &chinese_type_16, FONT_BACKGROUND, FONT_FOREGROUND);
  581. }
  582. else
  583. {
  584. Paint_DrawString_CN(480 - 50 - BAT_X_OFFSET - 50 + 3, 25, (char *)outline, &chinese_type_16, FONT_BACKGROUND, FONT_FOREGROUND);
  585. }
  586. memcpy(partial_right1_buf, Paint_info.Image, sizeof(uint8_t) * 480 * RIGHT1_HIGHT / 8);
  587. return partial_right1_buf;
  588. }
  589. #define MAX_NAME_STRING_LEN 52
  590. static void dis_name(char *tmp, int len) // times为空格的次数,如果为管理员要多加4次,管理员字符串->char str_0[14] = {0xb9,0xdc,0x20,0x20,0xc0,0xed,0x20,0x20,0xd4,0xb1,0xa3,0xba,0x00,0x00};
  591. {
  592. if (len < MAX_NAME_STRING_LEN)
  593. {
  594. return;
  595. }
  596. ESP_LOGW(LOG_TAG, "------dis name----");
  597. ESP_LOG_BUFFER_HEX(LOG_TAG, tmp, len);
  598. strcpy(&tmp[MAX_NAME_STRING_LEN], " ...");
  599. tmp[MAX_NAME_STRING_LEN + 4] = 0;
  600. tmp[MAX_NAME_STRING_LEN + 5] = 0;
  601. }
  602. static uint8_t *partial_right2_quick(void)
  603. {
  604. uint8_t *partial_right2_buf = (uint8_t *)calloc(RIGHT2_HIGHT * 480 / 8, sizeof(uint8_t));
  605. char buffer[200] = {0};
  606. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  607. Paint_NewImage((UBYTE *)tmp_paint_buf, 480, RIGHT2_HIGHT, ROTATE_0, WHITE);
  608. ESP_LOGD(LOG_TAG, "paint Charge_close %d %d %d %d %d", Machine_info.person[0].Charge_close, Machine_info.person[1].Charge_close, Machine_info.person[2].Charge_close,
  609. Machine_info.person[3].Charge_close, Machine_info.person[4].Charge_close);
  610. ESP_LOGD(LOG_TAG, "责任人人数 [%d][%d][%d][%d][%d]", person_get_num(0), person_get_num(1), person_get_num(2), person_get_num(3), person_get_num(4)); // 获取当前类型人员数量
  611. // 管理员不会关闭
  612. memset((uint8_t *)buffer, 0, sizeof(buffer));
  613. strcat(buffer, (char *)Machine_info.person[0].other_name);
  614. strcat(buffer, Machine_info.person[0].string_name);
  615. dis_name(buffer, strlen(buffer));
  616. Paint_DrawString_CN(10, 7, (char *)buffer, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  617. if (!Machine_info.person[1].Charge_close)
  618. {
  619. memset((uint8_t *)buffer, 0, sizeof(buffer));
  620. strcat(buffer, (char *)Machine_info.person[1].other_name);
  621. strcat(buffer, Machine_info.person[1].string_name);
  622. dis_name(buffer, strlen(buffer));
  623. Paint_DrawString_CN(10, 41, (char *)buffer, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  624. }
  625. if (!Machine_info.person[2].Charge_close)
  626. {
  627. memset((uint8_t *)buffer, 0, sizeof(buffer));
  628. strcat(buffer, (char *)Machine_info.person[2].other_name);
  629. strcat(buffer, Machine_info.person[2].string_name);
  630. dis_name(buffer, strlen(buffer));
  631. Paint_DrawString_CN(10, 75, (char *)buffer, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  632. }
  633. if (!Machine_info.person[4].Charge_close)
  634. {
  635. memset((uint8_t *)buffer, 0, sizeof(buffer));
  636. strcat(buffer, (char *)Machine_info.person[4].other_name);
  637. strcat(buffer, Machine_info.person[4].string_name);
  638. dis_name(buffer, strlen(buffer));
  639. Paint_DrawString_CN(10, 109, (char *)buffer, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  640. }
  641. if (!Machine_info.person[3].Charge_close)
  642. {
  643. memset((uint8_t *)buffer, 0, sizeof(buffer));
  644. strcat(buffer, (char *)Machine_info.person[3].other_name);
  645. strcat(buffer, Machine_info.person[3].string_name);
  646. dis_name(buffer, strlen(buffer));
  647. Paint_DrawString_CN(10, 143, (char *)buffer, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  648. }
  649. // ESP_LOG_BUFFER_HEX(LOG_TAG,buffer,strlen(buffer));
  650. Paint_DrawLine(10, 170, 470, 170, WHITE, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
  651. memcpy(partial_right2_buf, Paint_info.Image, sizeof(uint8_t) * 480 * RIGHT2_HIGHT / 8);
  652. return partial_right2_buf;
  653. }
  654. static char *right3_change_time_to_dis(bool flag) // flag为true 显示前四个小时 ,flag为false,显示最近
  655. {
  656. char arr_int[5];
  657. char arr_dec[5];
  658. char *arr_string = (char *)malloc(20 * sizeof(char));
  659. uint8_t time_min, time_hour;
  660. if (Machine_info.min >= 30)
  661. {
  662. if (Machine_info.hour >= 4)
  663. {
  664. time_hour = Machine_info.hour - 4;
  665. time_min = 30;
  666. }
  667. else
  668. {
  669. time_hour = Machine_info.hour + 20;
  670. time_min = 30;
  671. }
  672. }
  673. else
  674. {
  675. if (Machine_info.hour >= 4)
  676. {
  677. time_hour = Machine_info.hour - 4;
  678. time_min = 0;
  679. }
  680. else
  681. {
  682. time_hour = Machine_info.hour + 20;
  683. time_min = 0;
  684. }
  685. }
  686. if (flag)
  687. { // 前4小时
  688. memset(arr_string, 0, 20);
  689. itoa(time_hour, arr_int, 10);
  690. if (time_min == 0)
  691. {
  692. strcpy(arr_string, arr_int);
  693. strcat(arr_string, ":");
  694. strcat(arr_string, "00");
  695. }
  696. else
  697. {
  698. itoa(time_min, arr_dec, 10);
  699. strcpy(arr_string, arr_int);
  700. strcat(arr_string, ":");
  701. strcat(arr_string, arr_dec);
  702. }
  703. }
  704. else
  705. {
  706. memset(arr_string, 0, 20);
  707. itoa(Machine_info.hour, arr_int, 10);
  708. strcpy(arr_string, arr_int);
  709. strcat(arr_string, ":");
  710. if (Machine_info.min >= 30)
  711. {
  712. time_min = 30;
  713. itoa(time_min, arr_dec, 10);
  714. strcat(arr_string, arr_dec);
  715. }
  716. else
  717. {
  718. strcat(arr_string, "00");
  719. }
  720. }
  721. return arr_string;
  722. }
  723. static uint8_t *partial_right3_quick(void)
  724. {
  725. /* Get timestamp before entering sleep */
  726. // int64_t t_before_us = esp_timer_get_time();
  727. // //ESP_LOGW(LOG_TAG,"-=-=-=-=-=-=-=");
  728. // printf(" ==>[%lld]",t_before_us);
  729. uint8_t *partial_right3_buf = (uint8_t *)calloc(224 * 480 / 8, sizeof(uint8_t));
  730. #define __MAX_PIXEL 140
  731. uint32_t num_max = 0, i = 0, sum_products = 0;
  732. uint32_t num_totalProducts[8];
  733. uint32_t scale_UR[8];
  734. uint32_t scale_YR[8];
  735. uint8_t time_min, time_hour;
  736. char arr_string[20];
  737. char arr_int[5];
  738. char arr_dec[5];
  739. for (i = 0; i < 8; i++)
  740. {
  741. num_totalProducts[i] = Machine_info.num_goodProducts[i] + Machine_info.num_badProducts[i];
  742. scale_UR[i] = (Machine_info.scale_UR_int[i]) * 100 + Machine_info.scale_UR_dec[i];
  743. scale_YR[i] = (Machine_info.scale_YR_int[i]) * 100 + Machine_info.scale_YR_dec[i];
  744. // ESP_LOGW(LOG_TAG,"good:[%ld] bad[%ld]",num_goodProducts[i],num_badProducts[i]);
  745. // ESP_LOGW(LOG_TAG,"total:[%ld]",num_totalProducts[i]);
  746. // sum_products+=num_totalProducts[i];
  747. if (num_max < (Machine_info.num_goodProducts[i] + Machine_info.num_badProducts[i]))
  748. num_max = Machine_info.num_goodProducts[i] + Machine_info.num_badProducts[i];
  749. }
  750. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  751. Paint_NewImage((UBYTE *)tmp_paint_buf, 480, 224, ROTATE_0, WHITE);
  752. // Paint_DrawLine(10,2,470,2,WHITE,DOT_PIXEL_1X1,LINE_STYLE_DOTTED );
  753. Paint_DrawLine(10, 220, 470, 220, WHITE, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
  754. unsigned int *chartHeights = calculateBarChartHeights(num_totalProducts, sizeof(num_totalProducts) / sizeof(num_totalProducts[0]), __MAX_PIXEL);
  755. for (i = 0; i < 8; i++)
  756. {
  757. // chartHeights[i] = 140;
  758. Paint_DrawRectangle(60 + i * 25, 192 - chartHeights[i], 80 + i * 25, 192, WHITE, 1, 1);
  759. memset(arr_string, 0, 20);
  760. // itoa((int)num_totalProducts[i],arr_string,10);
  761. // 取消柱状图上方数值
  762. // Paint_DrawString_EN(60+i*25 ,192 - chartHeights[i]-8,(char*)arr_string, &ascii_type_5x7,FONT_FOREGROUND,FONT_BACKGROUND );
  763. // ESP_LOGW(LOG_TAG,"heights = %d",chartHeights[i]);
  764. }
  765. free(chartHeights);
  766. char *time_before = right3_change_time_to_dis(true);
  767. Paint_DrawString_EN(60, 192 + 2, time_before, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  768. free(time_before);
  769. time_before = right3_change_time_to_dis(false);
  770. Paint_DrawString_EN(60 + 150, 192 + 2, time_before, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  771. free(time_before);
  772. memset(arr_string, 0, 20);
  773. itoa(num_totalProducts[7], arr_string, 10);
  774. int x = center_align(&arr_string, 160, 16, 0);
  775. Paint_DrawString_EN(300 + x, 70, (char *)arr_string, &ascii_type_16x32, FONT_FOREGROUND, FONT_BACKGROUND);
  776. uint32_t tmp = 0;
  777. for (i = 0; i < 5; i++)
  778. {
  779. memset(arr_string, 0, 20); // 140 5
  780. tmp = (num_max / 5) * (5 - i);
  781. // strcpy(arr_string,tmp);
  782. // itoa(tmp,arr_string,10);//这里导致数值错误
  783. sprintf(arr_string, "%lu", tmp);
  784. // ESP_LOGW(LOG_TAG,"%s",arr_string);
  785. Paint_DrawString_EN(10, 48 + i * 30, (char *)arr_string, &ascii_type_5x7, FONT_FOREGROUND, FONT_BACKGROUND);
  786. // Paint_DrawString_EN(20,40+i*28,(char*)arr_string, &ascii_type_8x16,FONT_FOREGROUND,FONT_BACKGROUND );
  787. }
  788. for (i = 0; i < 5; i++) // ur yr y坐标
  789. {
  790. memset(arr_string, 0, 20);
  791. tmp = (100 / 5) * (5 - i);
  792. // strcpy(arr_string,tmp);
  793. itoa(tmp, arr_string, 10);
  794. strcat(arr_string, ".00%");
  795. Paint_DrawString_EN(60 + 200, 48 + i * 30, (char *)arr_string, &ascii_type_5x7, FONT_FOREGROUND, FONT_BACKGROUND);
  796. }
  797. char str_ur[8] = {0xbc, 0xda, 0xb6, 0xaf, 0xc2, 0xca, 0x00, 0x00};
  798. Paint_DrawString_CN(320, 170, (char *)str_ur, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND); // ur
  799. Paint_DrawLine(320, 170 + 16 + 3, 368, 170 + 16 + 3, WHITE, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
  800. char str_yr[8] = {0xc1, 0xbc, 0xc6, 0xb7, 0xc2, 0xca, 0x00, 0x00};
  801. Paint_DrawString_CN(390, 170, (char *)str_yr, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND); // yr
  802. Paint_DrawLine(390, 170 + 16 + 3, 438, 170 + 16 + 3, WHITE, DOT_PIXEL_1X1, LINE_STYLE_DOTTED_2);
  803. memset(arr_int, 0, 5);
  804. memset(arr_dec, 0, 5);
  805. memset(arr_string, 0, 20);
  806. itoa(Machine_info.scale_UR_int[7], arr_int, 10);
  807. itoa(Machine_info.scale_UR_dec[7], arr_dec, 10);
  808. strcpy(arr_string, arr_int);
  809. strcat(arr_string, ".");
  810. strcat(arr_string, arr_dec);
  811. strcat(arr_string, "%");
  812. x = center_align(&arr_string, 48, 8, 16);
  813. Paint_DrawString_EN(320 + x, 170 - 16 - 1, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  814. memset(arr_int, 0, 5);
  815. memset(arr_dec, 0, 5);
  816. memset(arr_string, 0, 20);
  817. itoa(Machine_info.scale_YR_int[7], arr_int, 10);
  818. itoa(Machine_info.scale_YR_dec[7], arr_dec, 10);
  819. strcpy(arr_string, arr_int);
  820. strcat(arr_string, ".");
  821. strcat(arr_string, arr_dec);
  822. strcat(arr_string, "%");
  823. x = center_align(&arr_string, 48, 8, 16);
  824. Paint_DrawString_EN(390 + x, 170 - 16 - 1, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  825. // drawQuadraticBezierCurve(uint8_t* framebuffer, int width, int height,
  826. // int x0, int y0, int x1, int y1, int x2, int y2,
  827. // uint8_t color, int thickness)
  828. unsigned int *UR_Heights = getBarChartHeights(scale_UR, sizeof(scale_UR) / sizeof(scale_UR[0]), __MAX_PIXEL);
  829. unsigned int *YR_Heights = getBarChartHeights(scale_YR, sizeof(scale_YR) / sizeof(scale_YR[0]), __MAX_PIXEL);
  830. unsigned int tmp_heihgts[6];
  831. unsigned int tmp1_heihgts[6];
  832. // https://zhuanlan.zhihu.com/p/46676386
  833. #if 1
  834. for (i = 0; i < 6; i++)
  835. {
  836. tmp_heihgts[i] = (UR_Heights[i + 1] + UR_Heights[i + 2]) / 2;
  837. tmp1_heihgts[i] = (YR_Heights[i + 1] + YR_Heights[i + 2]) / 2;
  838. }
  839. #else
  840. for (i = 0; i < 6; i++)
  841. {
  842. tmp_heihgts[i] = 30 + i * 10;
  843. tmp1_heihgts[i] = 10 + i * 10;
  844. }
  845. #endif
  846. // UR
  847. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72, 192 - UR_Heights[0], 72 + 25, 192 - UR_Heights[1], 72 + 25 + 12, 192 - tmp_heihgts[0], 0xff, 2);
  848. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 + 12, 192 - tmp_heihgts[0], 72 + 25 * 2, 192 - UR_Heights[2], 72 + 25 * 2 + 12, 192 - tmp_heihgts[1], 0xff, 2);
  849. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 2 + 12, 192 - tmp_heihgts[1], 72 + 25 * 3, 192 - UR_Heights[3], 72 + 25 * 3 + 12, 192 - tmp_heihgts[2], 0xff, 2);
  850. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 3 + 12, 192 - tmp_heihgts[2], 72 + 25 * 4, 192 - UR_Heights[4], 72 + 25 * 4 + 12, 192 - tmp_heihgts[3], 0xff, 2);
  851. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 4 + 12, 192 - tmp_heihgts[3], 72 + 25 * 5, 192 - UR_Heights[5], 72 + 25 * 5 + 12, 192 - tmp_heihgts[4], 0xff, 2);
  852. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 5 + 12, 192 - tmp_heihgts[4], 72 + 25 * 6, 192 - UR_Heights[6], 72 + 25 * 7, 192 - UR_Heights[7], 0xff, 2);
  853. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72, 192 - UR_Heights[0] + 2, 72 + 25, 192 - UR_Heights[1] + 2, 72 + 25 + 12, 192 - tmp_heihgts[0] + 2, 0, 2);
  854. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 + 12, 192 - tmp_heihgts[0] + 2, 72 + 25 * 2, 192 - UR_Heights[2] + 2, 72 + 25 * 2 + 12, 192 - tmp_heihgts[1] + 2, 0, 2);
  855. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 2 + 12, 192 - tmp_heihgts[1] + 2, 72 + 25 * 3, 192 - UR_Heights[3] + 2, 72 + 25 * 3 + 12, 192 - tmp_heihgts[2] + 2, 0, 2);
  856. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 3 + 12, 192 - tmp_heihgts[2] + 2, 72 + 25 * 4, 192 - UR_Heights[4] + 2, 72 + 25 * 4 + 12, 192 - tmp_heihgts[3] + 2, 0, 2);
  857. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 4 + 12, 192 - tmp_heihgts[3] + 2, 72 + 25 * 5, 192 - UR_Heights[5] + 2, 72 + 25 * 5 + 12, 192 - tmp_heihgts[4] + 2, 0, 2);
  858. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 5 + 12, 192 - tmp_heihgts[4] + 2, 72 + 25 * 6, 192 - UR_Heights[6] + 2, 72 + 25 * 7, 192 - UR_Heights[7] + 2, 0, 2);
  859. // YR
  860. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72, 192 - YR_Heights[0], 72 + 25, 192 - YR_Heights[1], 72 + 25 + 12, 192 - tmp1_heihgts[0], 0xff, 1);
  861. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 + 12, 192 - tmp1_heihgts[0], 72 + 25 * 2, 192 - YR_Heights[2], 72 + 25 * 2 + 12, 192 - tmp1_heihgts[1], 0xff, 1);
  862. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 2 + 12, 192 - tmp1_heihgts[1], 72 + 25 * 3, 192 - YR_Heights[3], 72 + 25 * 3 + 12, 192 - tmp1_heihgts[2], 0xff, 1);
  863. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 3 + 12, 192 - tmp1_heihgts[2], 72 + 25 * 4, 192 - YR_Heights[4], 72 + 25 * 4 + 12, 192 - tmp1_heihgts[3], 0xff, 1);
  864. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 4 + 12, 192 - tmp1_heihgts[3], 72 + 25 * 5, 192 - YR_Heights[5], 72 + 25 * 5 + 12, 192 - tmp1_heihgts[4], 0xff, 1);
  865. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 5 + 12, 192 - tmp1_heihgts[4], 72 + 25 * 6, 192 - YR_Heights[6], 72 + 25 * 7, 192 - YR_Heights[7], 0xff, 1);
  866. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72, 192 - YR_Heights[0] + 1, 72 + 25, 192 - YR_Heights[1] + 1, 72 + 25 + 12, 192 - tmp1_heihgts[0], 0, 1);
  867. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 + 12, 192 - tmp1_heihgts[0] + 1, 72 + 25 * 2, 192 - YR_Heights[2] + 1, 72 + 25 * 2 + 12, 192 - tmp1_heihgts[1] + 1, 0, 1);
  868. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 2 + 12, 192 - tmp1_heihgts[1] + 1, 72 + 25 * 3, 192 - YR_Heights[3] + 1, 72 + 25 * 3 + 12, 192 - tmp1_heihgts[2] + 1, 0, 1);
  869. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 3 + 12, 192 - tmp1_heihgts[2] + 1, 72 + 25 * 4, 192 - YR_Heights[4] + 1, 72 + 25 * 4 + 12, 192 - tmp1_heihgts[3] + 1, 0, 1);
  870. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 4 + 12, 192 - tmp1_heihgts[3] + 1, 72 + 25 * 5, 192 - YR_Heights[5] + 1, 72 + 25 * 5 + 12, 192 - tmp1_heihgts[4] + 1, 0, 1);
  871. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 5 + 12, 192 - tmp1_heihgts[4] + 1, 72 + 25 * 6, 192 - YR_Heights[6] + 1, 72 + 25 * 7, 192 - YR_Heights[7] + 1, 0, 1);
  872. free(UR_Heights);
  873. free(YR_Heights);
  874. Paint_DrawLine(60, 192, 80 + 7 * 25, 192, WHITE, DOT_PIXEL_2X2, LINE_STYLE_SOLID); // 表格线
  875. extern Node *clockIn_list;
  876. // int production_num = countClockNodes_byCMD(clockIn_list,0x00);
  877. // int repair_num = countClockNodes_byCMD(clockIn_list,0x01);
  878. // int upKeep_num = countClockNodes_byCMD(clockIn_list,0x03);
  879. // int inspection_num = countClockNodes_byCMD(clockIn_list,0x02);
  880. int type_num[4] = {countClockNodes_byCMD(clockIn_list, 0x00), countClockNodes_byCMD(clockIn_list, 0x01), countClockNodes_byCMD(clockIn_list, 0x02), countClockNodes_byCMD(clockIn_list, 0x03)};
  881. ESP_LOGI(LOG_TAG, "在岗人数 :[%d] [%d] [%d] [%d]", type_num[0], type_num[1], type_num[2], type_num[3]);
  882. char str_arr[20];
  883. char str_ren[] = {0xc8, 0xcb, 0x00, 0x00};
  884. char str_Currently[] = {0xb5, 0xb1, 0xc7, 0xb0, 0xd4, 0xda, 0xb8, 0xda, 0x3a, 0xba, 0x00, 0x00}; // 当前在岗B5B1C7B0D4DAB8DAA3BA
  885. // char str_test[] = {0xB2,0xE2,0xCA,0xD4,0xB8,0xBA,0xD4,0xF0,0x00,0x00};
  886. // memcpy((char*)Machine_info.checkIn_set[3].other_name,str_test,strlen(str_test));//测试签到人数
  887. int all_len = 0;
  888. int other_name_len = 0;
  889. Paint_DrawString_CN(10, 5, (char *)str_Currently, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  890. memset(str_arr, 0, 20);
  891. itoa(type_num[0], str_arr, 10);
  892. other_name_len = strlen((char *)Machine_info.checkIn_set[0].other_name) * 8;
  893. all_len = other_name_len + strlen(str_arr) * 8;
  894. if (!Machine_info.checkIn_set[0].checkIn_close)
  895. {
  896. Paint_DrawString_CN(10 + 16 * 5, 5, (char *)Machine_info.checkIn_set[0].other_name, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  897. Paint_DrawString_EN(10 + 16 * 5 + other_name_len, 5, (char *)str_arr, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  898. Paint_DrawString_CN(10 + 16 * 5 + all_len, 5, (char *)str_ren, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  899. }
  900. memset(str_arr, 0, 20);
  901. itoa(type_num[1], str_arr, 10);
  902. other_name_len = strlen((char *)Machine_info.checkIn_set[1].other_name) * 8;
  903. all_len = other_name_len + strlen(str_arr) * 8;
  904. if (!Machine_info.checkIn_set[1].checkIn_close)
  905. {
  906. Paint_DrawString_CN(186, 5, (char *)Machine_info.checkIn_set[1].other_name, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  907. Paint_DrawString_EN(186 + other_name_len, 5, (char *)str_arr, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  908. Paint_DrawString_CN(186 + all_len, 5, (char *)str_ren, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  909. }
  910. memset(str_arr, 0, 20);
  911. itoa(type_num[2], str_arr, 10);
  912. other_name_len = strlen((char *)Machine_info.checkIn_set[2].other_name) * 8;
  913. all_len = other_name_len + strlen(str_arr) * 8;
  914. if (!Machine_info.checkIn_set[2].checkIn_close)
  915. {
  916. Paint_DrawString_CN(282, 5, (char *)Machine_info.checkIn_set[2].other_name, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  917. Paint_DrawString_EN(282 + other_name_len, 5, (char *)str_arr, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  918. Paint_DrawString_CN(282 + all_len, 5, (char *)str_ren, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  919. }
  920. memset(str_arr, 0, 20);
  921. itoa(type_num[3], str_arr, 10);
  922. other_name_len = strlen((char *)Machine_info.checkIn_set[3].other_name) * 8;
  923. all_len = other_name_len + strlen(str_arr) * 8;
  924. if (!Machine_info.checkIn_set[3].checkIn_close)
  925. {
  926. Paint_DrawString_CN(378, 5, (char *)Machine_info.checkIn_set[3].other_name, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  927. Paint_DrawString_EN(378 + other_name_len, 5, (char *)str_arr, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  928. Paint_DrawString_CN(378 + all_len, 5, (char *)str_ren, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  929. }
  930. memcpy(partial_right3_buf, Paint_info.Image, sizeof(uint8_t) * 480 * 224 / 8);
  931. return partial_right3_buf;
  932. }
  933. static uint8_t *partial_right3_2_quick(void)
  934. {
  935. uint8_t *partial_right3_buf = (uint8_t *)calloc(224 * 480 / 8, sizeof(uint8_t));
  936. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  937. Paint_NewImage((UBYTE *)tmp_paint_buf, 480, 224, ROTATE_0, WHITE);
  938. Paint_DrawLine(10, 220, 470, 220, WHITE, DOT_PIXEL_1X1, LINE_STYLE_DOTTED); // 分隔右屏第三部分和第四部分线表格线
  939. #if 0
  940. extern Node *clockIn_list;
  941. int production_num = countClockNodes_byCMD(clockIn_list,0x00);
  942. int repair_num = countClockNodes_byCMD(clockIn_list,0x01);
  943. int upKeep_num = countClockNodes_byCMD(clockIn_list,0x03);
  944. int inspection_num = countClockNodes_byCMD(clockIn_list,0x02);
  945. ESP_LOGD(LOG_TAG,"(2)生产【%d】,巡检【%d】,保养【%d】,维修【%d】",production_num,repair_num,upKeep_num,inspection_num);
  946. char str_arr[20];
  947. char str_ren[4] = {0xc8,0xcb,0x00,0x00};
  948. char str_now_and_production[16] = {0xb5,0xb1,0xc7,0xb0,0xd4,0xda,0xb8,0xda,0xa3,0xba,0xc9,0xfa,0xb2,0xfa,0x00,0x00};//当前在岗:生产
  949. // char str_inspection[6] = {0xd1,0xb2,0xbc,0xec,0x00,0x00};
  950. // char str_upKeep[]
  951. memset(str_arr,0,20);
  952. itoa(production_num,str_arr,10);
  953. Paint_DrawString_CN(10, 5,(char*)str_now_and_production, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  954. Paint_DrawString_EN(10+16*7,5,(char*)str_arr, &ascii_type_8x16,FONT_FOREGROUND,FONT_BACKGROUND );
  955. Paint_DrawString_CN(10+16*7+strlen(str_arr)*8, 5,(char*)str_ren, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  956. memset(str_arr,0,20);
  957. itoa(inspection_num,str_arr,10);
  958. Paint_DrawString_CN(180, 5,(char*)str_inspection, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  959. Paint_DrawString_EN(180+16*2,5,(char*)str_arr, &ascii_type_8x16,FONT_FOREGROUND,FONT_BACKGROUND );
  960. Paint_DrawString_CN(180+16*2+strlen(str_arr)*8, 5,(char*)str_ren, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  961. memset(str_arr,0,20);
  962. itoa(upKeep_num,str_arr,10);
  963. Paint_DrawString_CN(280, 5,(char*)str_upKeep, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  964. Paint_DrawString_EN(280+16*2,5,(char*)str_arr, &ascii_type_8x16,FONT_FOREGROUND,FONT_BACKGROUND );
  965. Paint_DrawString_CN(280+16*2+strlen(str_arr)*8, 5,(char*)str_ren, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  966. memset(str_arr,0,20);
  967. itoa(repair_num,str_arr,10);
  968. Paint_DrawString_CN(380, 5,(char*)str_repair, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  969. Paint_DrawString_EN(380+16*2,5,(char*)str_arr, &ascii_type_8x16,FONT_FOREGROUND,FONT_BACKGROUND );
  970. Paint_DrawString_CN(380+16*2+strlen(str_arr)*8, 5,(char*)str_ren, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  971. #else
  972. extern Node *clockIn_list;
  973. int type_num[4] = {countClockNodes_byCMD(clockIn_list, 0x00), countClockNodes_byCMD(clockIn_list, 0x01), countClockNodes_byCMD(clockIn_list, 0x02), countClockNodes_byCMD(clockIn_list, 0x03)};
  974. char str_arr[20];
  975. ESP_LOGI(LOG_TAG, "#在岗人数 :[%d] [%d] [%d] [%d]", type_num[0], type_num[1], type_num[2], type_num[3]);
  976. char str_ren[] = {0xc8, 0xcb, 0x00, 0x00};
  977. char str_Currently[] = {0xb5, 0xb1, 0xc7, 0xb0, 0xd4, 0xda, 0xb8, 0xda, 0x3a, 0xba, 0x00, 0x00}; // 当前在岗B5B1C7B0D4DAB8DAA3BA
  978. int all_len = 0;
  979. int other_name_len = 0;
  980. Paint_DrawString_CN(10, 5, (char *)str_Currently, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  981. memset(str_arr, 0, 20);
  982. itoa(type_num[0], str_arr, 10);
  983. other_name_len = strlen((char *)Machine_info.checkIn_set[0].other_name) * 8;
  984. all_len = other_name_len + strlen(str_arr) * 8;
  985. if (!Machine_info.checkIn_set[0].checkIn_close)
  986. {
  987. Paint_DrawString_CN(10 + 16 * 5, 5, (char *)Machine_info.checkIn_set[0].other_name, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  988. Paint_DrawString_EN(10 + 16 * 5 + other_name_len, 5, (char *)str_arr, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  989. Paint_DrawString_CN(10 + 16 * 5 + all_len, 5, (char *)str_ren, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  990. }
  991. memset(str_arr, 0, 20);
  992. itoa(type_num[1], str_arr, 10);
  993. other_name_len = strlen((char *)Machine_info.checkIn_set[1].other_name) * 8;
  994. all_len = other_name_len + strlen(str_arr) * 8;
  995. if (!Machine_info.checkIn_set[1].checkIn_close)
  996. {
  997. Paint_DrawString_CN(186, 5, (char *)Machine_info.checkIn_set[1].other_name, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  998. Paint_DrawString_EN(186 + other_name_len, 5, (char *)str_arr, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  999. Paint_DrawString_CN(186 + all_len, 5, (char *)str_ren, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  1000. }
  1001. memset(str_arr, 0, 20);
  1002. itoa(type_num[2], str_arr, 10);
  1003. other_name_len = strlen((char *)Machine_info.checkIn_set[2].other_name) * 8;
  1004. all_len = other_name_len + strlen(str_arr) * 8;
  1005. if (!Machine_info.checkIn_set[2].checkIn_close)
  1006. {
  1007. Paint_DrawString_CN(282, 5, (char *)Machine_info.checkIn_set[2].other_name, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  1008. Paint_DrawString_EN(282 + other_name_len, 5, (char *)str_arr, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  1009. Paint_DrawString_CN(282 + all_len, 5, (char *)str_ren, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  1010. }
  1011. memset(str_arr, 0, 20);
  1012. itoa(type_num[3], str_arr, 10);
  1013. other_name_len = strlen((char *)Machine_info.checkIn_set[3].other_name) * 8;
  1014. all_len = other_name_len + strlen(str_arr) * 8;
  1015. if (!Machine_info.checkIn_set[3].checkIn_close)
  1016. {
  1017. Paint_DrawString_CN(378, 5, (char *)Machine_info.checkIn_set[3].other_name, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  1018. Paint_DrawString_EN(378 + other_name_len, 5, (char *)str_arr, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  1019. Paint_DrawString_CN(378 + all_len, 5, (char *)str_ren, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  1020. }
  1021. memcpy(partial_right3_buf, Paint_info.Image, sizeof(uint8_t) * 480 * 224 / 8);
  1022. #endif
  1023. // 画表格
  1024. int i;
  1025. char arr_string[20];
  1026. uint32_t tmp = 0;
  1027. // 柱状图
  1028. uint16_t num_max_manHour = 0;
  1029. uint32_t num_tmp[8];
  1030. for (i = 0; i < 8; i++)
  1031. {
  1032. num_tmp[i] = (uint32_t)Machine_info.num_manHour[i];
  1033. }
  1034. unsigned int *manHour_Heights = calculateBarChartHeights(num_tmp, 8, __MAX_PIXEL);
  1035. for (i = 0; i < 8; i++)
  1036. {
  1037. if (num_max_manHour < Machine_info.num_manHour[i])
  1038. {
  1039. num_max_manHour = Machine_info.num_manHour[i];
  1040. }
  1041. // Paint_DrawRectangle(60+i*25 ,192 - manHour_Heights[i] ,80+i*25, 192,WHITE,1,1 );
  1042. Paint_DrawRectangle(60 + i * 25, 193 - manHour_Heights[i], 80 + i * 25, 193, WHITE, 1, 1);
  1043. memset(arr_string, 0, 20);
  1044. itoa((int)Machine_info.num_manHour[i], arr_string, 10);
  1045. // ESP_LOGW(LOG_TAG,"%s",arr_string);
  1046. // 取消柱状图上方数值
  1047. Paint_DrawString_EN(60 + i * 25, 192 - manHour_Heights[i] - 8, (char *)arr_string, &ascii_type_5x7, FONT_FOREGROUND, FONT_BACKGROUND);
  1048. // ESP_LOGW(LOG_TAG,"manHour_Heights = %d,num_manHour = %d,max_manHour = %d ",manHour_Heights[i],Machine_info.num_manHour[i],num_max_manHour);
  1049. }
  1050. for (i = 0; i < 5; i++)
  1051. {
  1052. tmp = ((int)(num_max_manHour / 5)) * (5 - i);
  1053. memset(arr_string, 0, 20); // 140 5
  1054. // strcpy(arr_string,tmp);
  1055. // itoa(tmp,arr_string,10);//这里导致数值错误
  1056. sprintf(arr_string, "%lu", tmp);
  1057. // ESP_LOGW(LOG_TAG,"3——2 %s",arr_string);
  1058. Paint_DrawString_EN(20, 48 + i * 30, (char *)arr_string, &ascii_type_5x7, FONT_FOREGROUND, FONT_BACKGROUND);
  1059. }
  1060. // 右屏3_2 贝塞尔曲线
  1061. uint16_t num_max_people = 0;
  1062. for (i = 0; i < 8; i++)
  1063. {
  1064. num_tmp[i] = (uint32_t)Machine_info.num_people[i];
  1065. }
  1066. unsigned int *people_Heights = calculateBarChartHeights(num_tmp, sizeof(Machine_info.num_people) / sizeof(Machine_info.num_people[0]), __MAX_PIXEL);
  1067. unsigned int tmp_heihgts[6];
  1068. for (i = 0; i < 8; i++)
  1069. {
  1070. if (num_max_people < Machine_info.num_people[i])
  1071. {
  1072. num_max_people = Machine_info.num_people[i];
  1073. }
  1074. // ESP_LOGW(LOG_TAG,"num_people[%d]=(%d),max :[%d]",i,Machine_info.num_people[i],num_max_people);
  1075. }
  1076. // https://zhuanlan.zhihu.com/p/46676386
  1077. for (i = 0; i < 6; i++)
  1078. {
  1079. tmp_heihgts[i] = (people_Heights[i + 1] + people_Heights[i + 2]) / 2;
  1080. }
  1081. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72, 192 - people_Heights[0], 72 + 25, 192 - people_Heights[1], 72 + 25 + 12, 192 - tmp_heihgts[0], 0xff, 1);
  1082. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 + 12, 192 - tmp_heihgts[0], 72 + 25 * 2, 192 - people_Heights[2], 72 + 25 * 2 + 12, 192 - tmp_heihgts[1], 0xff, 1);
  1083. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 2 + 12, 192 - tmp_heihgts[1], 72 + 25 * 3, 192 - people_Heights[3], 72 + 25 * 3 + 12, 192 - tmp_heihgts[2], 0xff, 1);
  1084. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 3 + 12, 192 - tmp_heihgts[2], 72 + 25 * 4, 192 - people_Heights[4], 72 + 25 * 4 + 12, 192 - tmp_heihgts[3], 0xff, 1);
  1085. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 4 + 12, 192 - tmp_heihgts[3], 72 + 25 * 5, 192 - people_Heights[5], 72 + 25 * 5 + 12, 192 - tmp_heihgts[4], 0xff, 1);
  1086. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 5 + 12, 192 - tmp_heihgts[4], 72 + 25 * 6, 192 - people_Heights[6], 72 + 25 * 7, 192 - people_Heights[7], 0xff, 1);
  1087. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72, 192 - people_Heights[0] - 1, 72 + 25, 192 - people_Heights[1] - 1, 72 + 25 + 12, 192 - tmp_heihgts[0], 0, 1);
  1088. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 + 12, 192 - tmp_heihgts[0] - 1, 72 + 25 * 2, 192 - people_Heights[2] - 1, 72 + 25 * 2 + 12, 192 - tmp_heihgts[1] - 1, 0, 1);
  1089. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 2 + 12, 192 - tmp_heihgts[1] - 1, 72 + 25 * 3, 192 - people_Heights[3] - 1, 72 + 25 * 3 + 12, 192 - tmp_heihgts[2] - 1, 0, 1);
  1090. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 3 + 12, 192 - tmp_heihgts[2] - 1, 72 + 25 * 4, 192 - people_Heights[4] - 1, 72 + 25 * 4 + 12, 192 - tmp_heihgts[3] - 1, 0, 1);
  1091. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 4 + 12, 192 - tmp_heihgts[3] - 1, 72 + 25 * 5, 192 - people_Heights[5] - 1, 72 + 25 * 5 + 12, 192 - tmp_heihgts[4] - 1, 0, 1);
  1092. drawQuadraticBezierCurve(Paint_info.Image, 480, 224, 72 + 25 * 5 + 12, 192 - tmp_heihgts[4] - 1, 72 + 25 * 6, 192 - people_Heights[6] - 1, 72 + 25 * 7, 192 - people_Heights[7] - 1, 0, 1);
  1093. for (i = 0; i < 5; i++)
  1094. {
  1095. memset(arr_string, 0, 20);
  1096. if ((num_max_people <= 5) && (i == 0))
  1097. {
  1098. tmp = num_max_people;
  1099. }
  1100. else
  1101. {
  1102. tmp = (num_max_people / 5) * (5 - i);
  1103. }
  1104. sprintf(arr_string, "%lu", tmp);
  1105. // ESP_LOGW(LOG_TAG,"%s",arr_string);
  1106. // ESP_LOG_BUFFER_HEX(LOG_TAG,arr_string,30);
  1107. Paint_DrawString_EN(60 + 200, 48 + i * 30, (char *)arr_string, &ascii_type_5x7, FONT_FOREGROUND, FONT_BACKGROUND);
  1108. }
  1109. free(manHour_Heights);
  1110. free(people_Heights);
  1111. Paint_DrawLine(60, 193, 80 + 7 * 25, 193, WHITE, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
  1112. // 画表格结束
  1113. memset(arr_string, 0, 20);
  1114. itoa(Machine_info.num_manHour[7], arr_string, 10); // 最近工时显示
  1115. i = center_align(&arr_string, 160, 16, 32);
  1116. Paint_DrawString_EN(300 + i, 70, (char *)arr_string, &ascii_type_16x32, FONT_FOREGROUND, FONT_BACKGROUND);
  1117. memset(arr_string, 0, 20);
  1118. itoa(Machine_info.num_people[7], arr_string, 10); // 最近人数显示
  1119. // strcat(arr_string,"123456");
  1120. i = center_align(&arr_string, 160, 8, 16);
  1121. Paint_DrawString_EN(300 + i, 150, (char *)arr_string, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  1122. char str_people[8] = {0xC8, 0xCB, 0xCA, 0xFD, 0x00, 0x00};
  1123. // i = center_align(&arr_string,160,8,16);
  1124. Paint_DrawString_CN(300 + i + strlen(arr_string) * 4 - 16, 165, (char *)str_people, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND); // ur
  1125. // Paint_DrawLine(300+i,167+18,300+i+strlen(arr_string)*8,167+18,WHITE,DOT_PIXEL_1X1,LINE_STYLE_DOTTED );
  1126. Paint_DrawLine(300 + i + strlen(arr_string) * 4 - 16, 167 + 18, 300 + i + strlen(arr_string) * 4 + 16, 167 + 18, WHITE, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
  1127. char *time_before = right3_change_time_to_dis(true);
  1128. Paint_DrawString_EN(60, 192 + 2, time_before, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  1129. free(time_before);
  1130. time_before = right3_change_time_to_dis(false);
  1131. Paint_DrawString_EN(60 + 150, 192 + 2, time_before, &ascii_type_8x16, FONT_FOREGROUND, FONT_BACKGROUND);
  1132. free(time_before);
  1133. memcpy(partial_right3_buf, Paint_info.Image, sizeof(uint8_t) * 480 * 224 / 8);
  1134. return partial_right3_buf;
  1135. }
  1136. static uint8_t *partial_right4_quick(void)
  1137. {
  1138. uint8_t *partial_right4_buf = (uint8_t *)calloc(152 * 480 / 8, sizeof(uint8_t));
  1139. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1140. char str_announcement[8] = {0xb9, 0xab, 0xb8, 0xe6, 0x3a, 0x00, 0x00, 0x00};
  1141. Paint_NewImage((UBYTE *)tmp_paint_buf, 480, 152, ROTATE_0, WHITE);
  1142. uint8_t *string_infor = malloc(120);
  1143. memset(string_infor, 0x00, 120);
  1144. strcat((char *)string_infor, str_announcement);
  1145. strcat((char *)string_infor, (char *)Machine_info.announcement);
  1146. Paint_DrawString_CN(10, 6, (char *)string_infor, &chinese_type_16, FONT_FOREGROUND, FONT_BACKGROUND);
  1147. free(string_infor);
  1148. // #if 0//系统消息固定
  1149. // //系统提示:系统3.01固件版本更新了新的功能,请及时更新。
  1150. // //CFB5CDB3CCE1CABE3ACFB5CDB3332E302E31B9CCBCFEB0E6B1BEB8FCD0C2C1CBD0C2B5C4B9A6C4DCA3ACC7EBBCB0CAB1B8FCD0C2A1A30A
  1151. // uint8_t string_system_message[] = {0xCF,0xB5,0xCD,0xB3,0xCC,0xE1,0xCA,0xBE,0x3A,0xCF,0xB5,0xCD,0xB3,0x33,0x2E,0x30,0x2E,0x31,0xB9,0xCC,0xBC,0xFE,0xB0,0xE6,0xB1,0xBE
  1152. // ,0xB8,0xFC,0xD0,0xC2,0xC1,0xCB,0xD0,0xC2,0xB5,0xC4,0xB9,0xA6,0xC4,0xDC,0xA3,0xAC, 0xC7,0xEB,0xBC,0xB0,0xCA,0xB1,0xB8,0xFC,0xD0,0xC2,0xA1,0xA3,0x0A,0x00,0x00};
  1153. // Paint_DrawString_CN(20, 122,(char*)string_system_message, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  1154. // #else
  1155. // uint8_t *string_sys = malloc(120);
  1156. // char str_xitong[12] = {0xcf,0xb5,0xcd,0xb3,0xcc,0xe1,0xca,0xbe,0x3a,0x00,0x00,0x00};
  1157. // memset(string_sys,0x00,120);
  1158. // strcat((char *)string_sys,str_xitong);
  1159. // strcat((char *)string_sys,(char *)Machine_info.systemMessage);
  1160. // Paint_DrawString_CN(10, 90,(char*)string_sys, &chinese_type_16,FONT_FOREGROUND,FONT_BACKGROUND );
  1161. // free(string_sys);
  1162. // #endif
  1163. memcpy(partial_right4_buf, Paint_info.Image, sizeof(uint8_t) * 480 * 152 / 8);
  1164. return partial_right4_buf;
  1165. }
  1166. // 下面是2023.12.31 把屏幕显示全部统一
  1167. static void dis_left_sms(void)
  1168. {
  1169. ESP_LOGW(LOG_TAG, "dis left instruction book");
  1170. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1171. Paint_NewImage((uint8_t *)tmp_paint_buf, 648, 480, ROTATE_180, WHITE);
  1172. Paint_DrawBitMap_Paste(gImage_left_instructions, 0, 0, 648, 480, 1);
  1173. // qrcode
  1174. char qrcode_string[1024] = {0};
  1175. qrcode_protocol_create(qrcode_string, Machine_info);
  1176. QRGenerator_quick(qrcode_string);
  1177. Paint_DrawBitMap_Paste((uint8_t *)gImage_nfc, 573, 215, 44, 44, 1);
  1178. epd_init_cmd(SCREEN_LEFT);
  1179. epd_display(SCREEN_LEFT, Paint_info.Image);
  1180. memcpy(last_paint_buf_left, Paint_info.Image, sizeof(uint8_t) * 648 * 480 / 8);
  1181. // int ret = memcmp(last_paint_buf_left,Paint_info.Image,38880);
  1182. // ESP_LOGW(LOG_TAG,"memcmp :ret = %d",ret);
  1183. if (memcmp(last_paint_buf_left, Paint_info.Image, 38880))
  1184. {
  1185. ESP_LOGE(LOG_TAG, "err:last_paint_buf_left");
  1186. }
  1187. }
  1188. static void dis_right_sms(void)
  1189. {
  1190. ESP_LOGW(LOG_TAG, "dis right instruction book");
  1191. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1192. Paint_NewImage((uint8_t *)tmp_paint_buf, 648, 480, ROTATE_270, WHITE);
  1193. Paint_DrawBitMap_Paste(gImage_right_instruction, 0, 0, 480, 648, 1);
  1194. if (!decection_state_0()) // 判断充电中逻辑
  1195. {
  1196. #define BAT_X_OFFSET 2
  1197. #define BAT_Y_OFFSET 2
  1198. Paint_DrawBitMap_Paste((uint8_t *)gImage_battery, 480 - 50 - BAT_X_OFFSET, 24, 37, 18, 1);
  1199. ESP_LOGW(LOG_TAG, "判断充电中逻辑batt_precent = %d", Machine_info.batt_precent);
  1200. switch (Machine_info.batt_precent)
  1201. {
  1202. case 0:
  1203. break;
  1204. case 1 ... 24:
  1205. Paint_DrawRectangle(433 - BAT_X_OFFSET, 27, 439 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1206. break;
  1207. case 25 ... 49:
  1208. Paint_DrawRectangle(433 - BAT_X_OFFSET, 27, 439 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1209. Paint_DrawRectangle(441 - BAT_X_OFFSET, 27, 447 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1210. break;
  1211. case 50 ... 74:
  1212. Paint_DrawRectangle(433 - BAT_X_OFFSET, 27, 439 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1213. Paint_DrawRectangle(441 - BAT_X_OFFSET, 27, 447 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1214. Paint_DrawRectangle(449 - BAT_X_OFFSET, 27, 455 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1215. break;
  1216. case 75 ... 99:
  1217. Paint_DrawRectangle(433 - BAT_X_OFFSET, 27, 439 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1218. Paint_DrawRectangle(441 - BAT_X_OFFSET, 27, 447 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1219. Paint_DrawRectangle(449 - BAT_X_OFFSET, 27, 455 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1220. Paint_DrawRectangle(457 - BAT_X_OFFSET, 27, 462 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1221. break;
  1222. case 100:
  1223. Paint_DrawRectangle(433 - BAT_X_OFFSET, 27, 439 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1224. Paint_DrawRectangle(441 - BAT_X_OFFSET, 27, 447 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1225. Paint_DrawRectangle(449 - BAT_X_OFFSET, 27, 455 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1226. Paint_DrawRectangle(457 - BAT_X_OFFSET, 27, 462 - BAT_X_OFFSET, 41, WHITE, 1, 1);
  1227. break;
  1228. default:
  1229. break;
  1230. }
  1231. Machine_info.batt_precent = read_battery_voltage();
  1232. if (Machine_info.batt_precent >= 95)
  1233. {
  1234. Paint_DrawBitMap_Paste((uint8_t *)gImage_filled, 480 - 47 + 37, 27 - BAT_Y_OFFSET, 8, 18, 1);
  1235. }
  1236. else
  1237. {
  1238. Paint_DrawBitMap_Paste((uint8_t *)gImage_charging, 480 - 47 + 35, 27 - BAT_Y_OFFSET, 8, 18, 1);
  1239. }
  1240. }
  1241. else
  1242. {
  1243. if (read_battery_voltage() < 10)
  1244. {
  1245. Paint_DrawBitMap_Paste(gImage_low_batt, 30, 428, 420, 154, 1); // 低电量请充电
  1246. }
  1247. }
  1248. epd_init_cmd(SCREEN_RIGHT);
  1249. epd_display(SCREEN_RIGHT, Paint_info.Image);
  1250. memcpy(last_paint_buf_right, Paint_info.Image, sizeof(uint8_t) * 648 * 480 / 8);
  1251. if (memcmp(last_paint_buf_right, Paint_info.Image, 38880))
  1252. {
  1253. ESP_LOGE(LOG_TAG, "err:右屏说明书保存失败");
  1254. }
  1255. }
  1256. void Paint_leftScreen(bool is_poweron, bool is_quick)
  1257. {
  1258. ESP_LOGI(LOG_TAG, "Paint_leftScreen %s - %s ", is_quick ? "quick" : "low", is_poweron ? "poweron" : "poweroff");
  1259. if (!is_poweron)
  1260. {
  1261. // 关机展示说明书
  1262. dis_left_sms();
  1263. return;
  1264. }
  1265. int x = 0; // 居中偏移
  1266. // 先利用NewImage,得到各个部分的图像buf
  1267. // 再画图
  1268. uint8_t *image_320x384_buf = (uint8_t *)calloc(320 * 384 / 8, sizeof(uint8_t));
  1269. #if 1
  1270. uint8_t *tmp = NULL;
  1271. switch (Machine_info.left_display_mode)
  1272. {
  1273. case 0x00:
  1274. // ESP_LOGW(LOG_TAG,"left_display_mode 0x01:");
  1275. break;
  1276. case 0x01:
  1277. /* code */
  1278. tmp = partial_bar_chart_07_02_quick(&Machine_info);
  1279. break;
  1280. case 0x02:
  1281. /* code */
  1282. tmp = partial_bar_chart_07_03_quick(&Machine_info);
  1283. break;
  1284. case 0x03:
  1285. /* code */
  1286. tmp = partial_bar_chart_07_04_quick(&Machine_info);
  1287. break;
  1288. default:
  1289. break;
  1290. }
  1291. #else
  1292. tmp = partial_bar_chart_07_04_quick(info);
  1293. #endif
  1294. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1295. Paint_NewImage((uint8_t *)tmp_paint_buf, 64, 32, ROTATE_0, WHITE);
  1296. x = center_align(&Machine_info.btn_operation, 64, 16, 32);
  1297. Paint_DrawString_CN(0 + x, 0, (char *)Machine_info.btn_operation, &chinese_type_32, FONT_FOREGROUND, FONT_BACKGROUND);
  1298. uint8_t *operation_64x32_buf = (uint8_t *)calloc(64 * 32 / 8, sizeof(uint8_t));
  1299. memcpy(operation_64x32_buf, Paint_info.Image, sizeof(uint8_t) * 64 * 32 / 8);
  1300. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1301. Paint_NewImage((uint8_t *)tmp_paint_buf, 96, 48, ROTATE_0, WHITE);
  1302. Paint_DrawBitMap_Paste(operation_64x32_buf, 16, 8, 64, 32, 1);
  1303. uint8_t *operation_background_96x48_buf = (uint8_t *)calloc(96 * 48 / 8, sizeof(uint8_t));
  1304. memcpy(operation_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1305. free(operation_64x32_buf);
  1306. // str_shutDown
  1307. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1308. Paint_NewImage((uint8_t *)tmp_paint_buf, 32, 64, ROTATE_90, WHITE);
  1309. x = center_align(&Machine_info.btn_shutDown_info, 64, 16, 32);
  1310. Paint_DrawString_CN(0, 0, (char *)Machine_info.btn_shutDown_info, &chinese_type_32, FONT_FOREGROUND, FONT_BACKGROUND);
  1311. uint8_t *shutDown_64x32_buf = (uint8_t *)calloc(64 * 32 / 8, sizeof(uint8_t));
  1312. memcpy(shutDown_64x32_buf, Paint_info.Image, sizeof(uint8_t) * 64 * 32 / 8);
  1313. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1314. Paint_NewImage((uint8_t *)tmp_paint_buf, 48, 96, ROTATE_0, WHITE);
  1315. Paint_DrawBitMap_Paste(shutDown_64x32_buf, 8, 16, 32, 64, 1);
  1316. uint8_t *shutDown_background_96x48_buf = (uint8_t *)calloc(96 * 48 / 8, sizeof(uint8_t));
  1317. memcpy(shutDown_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1318. free(shutDown_64x32_buf);
  1319. // str_breakDown
  1320. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1321. Paint_NewImage((uint8_t *)tmp_paint_buf, 32, 64, ROTATE_90, WHITE);
  1322. x = center_align(&Machine_info.btn_breakDown_info, 64, 16, 32);
  1323. Paint_DrawString_CN(0, 0, (char *)Machine_info.btn_breakDown_info, &chinese_type_32, FONT_FOREGROUND, FONT_BACKGROUND);
  1324. uint8_t *breakDown_64x32_buf = (uint8_t *)calloc(64 * 32 / 8, sizeof(uint8_t));
  1325. memcpy(breakDown_64x32_buf, Paint_info.Image, sizeof(uint8_t) * 64 * 32 / 8);
  1326. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1327. Paint_NewImage((uint8_t *)tmp_paint_buf, 48, 96, ROTATE_0, WHITE);
  1328. Paint_DrawBitMap_Paste(breakDown_64x32_buf, 8, 16, 32, 64, 1);
  1329. uint8_t *breakDown_background_96x48_buf = (uint8_t *)calloc(96 * 48 / 8, sizeof(uint8_t));
  1330. memcpy(breakDown_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1331. free(breakDown_64x32_buf);
  1332. // str_safeKeep
  1333. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1334. Paint_NewImage((uint8_t *)tmp_paint_buf, 64, 32, ROTATE_0, WHITE);
  1335. x = center_align(&Machine_info.btn_safeKeep_info, 64, 16, 32);
  1336. Paint_DrawString_CN(0, 0, (char *)Machine_info.btn_safeKeep_info, &chinese_type_32, FONT_FOREGROUND, FONT_BACKGROUND);
  1337. uint8_t *safeKeep_64x32_buf = (uint8_t *)calloc(64 * 32 / 8, sizeof(uint8_t));
  1338. memcpy(safeKeep_64x32_buf, Paint_info.Image, sizeof(uint8_t) * 64 * 32 / 8);
  1339. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1340. Paint_NewImage((uint8_t *)tmp_paint_buf, 96, 48, ROTATE_0, WHITE);
  1341. Paint_DrawBitMap_Paste(safeKeep_64x32_buf, 16, 8, 64, 32, 1);
  1342. uint8_t *safeKeep_background_96x48_buf = (uint8_t *)calloc(96 * 48 / 8, sizeof(uint8_t));
  1343. memcpy(safeKeep_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1344. free(safeKeep_64x32_buf);
  1345. // str_upKeep
  1346. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1347. Paint_NewImage((uint8_t *)tmp_paint_buf, 32, 64, ROTATE_270, WHITE);
  1348. x = center_align(&Machine_info.btn_upKeep_info, 64, 16, 32);
  1349. Paint_DrawString_CN(0, 0, (char *)Machine_info.btn_upKeep_info, &chinese_type_32, FONT_FOREGROUND, FONT_BACKGROUND);
  1350. uint8_t *upKeep_64x32_buf = (uint8_t *)calloc(64 * 32 / 8, sizeof(uint8_t));
  1351. memcpy(upKeep_64x32_buf, Paint_info.Image, sizeof(uint8_t) * 64 * 32 / 8);
  1352. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1353. Paint_NewImage((uint8_t *)tmp_paint_buf, 48, 96, ROTATE_0, WHITE);
  1354. Paint_DrawBitMap_Paste(upKeep_64x32_buf, 8, 16, 32, 64, 1);
  1355. uint8_t *upKeep_background_96x48_buf = (uint8_t *)calloc(96 * 48 / 8, sizeof(uint8_t));
  1356. memcpy(upKeep_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1357. free(upKeep_64x32_buf);
  1358. // str_waitMaterials
  1359. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1360. Paint_NewImage((uint8_t *)tmp_paint_buf, 32, 64, ROTATE_270, WHITE);
  1361. x = center_align(&Machine_info.btn_waitMaterials_info, 64, 16, 32);
  1362. Paint_DrawString_CN(0, 0, (char *)Machine_info.btn_waitMaterials_info, &chinese_type_32, FONT_FOREGROUND, FONT_BACKGROUND);
  1363. uint8_t *waitMaterials_64x32_buf = (uint8_t *)calloc(64 * 32 / 8, sizeof(uint8_t));
  1364. memcpy(waitMaterials_64x32_buf, Paint_info.Image, sizeof(uint8_t) * 64 * 32 / 8);
  1365. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1366. Paint_NewImage((uint8_t *)tmp_paint_buf, 48, 96, ROTATE_0, WHITE);
  1367. Paint_DrawBitMap_Paste(waitMaterials_64x32_buf, 8, 16, 32, 64, 1);
  1368. uint8_t *waitMaterials_background_96x48_buf = (uint8_t *)calloc(96 * 48 / 8, sizeof(uint8_t));
  1369. memcpy(waitMaterials_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1370. free(waitMaterials_64x32_buf);
  1371. uint8_t *background_128x64_buf = (uint8_t *)calloc(128 * 64 / 8, sizeof(uint8_t));
  1372. // 得到图像buf
  1373. ESP_LOGW(LOG_TAG, "----------------Machine_info.left_state = %d-------left_display_mode =%d -------\r\n", Machine_info.left_state, Machine_info.left_display_mode);
  1374. switch (Machine_info.left_state)
  1375. {
  1376. case STATE_NONE:
  1377. case STATE_OPERATION:
  1378. {
  1379. if (Machine_info.left_display_mode == 0)
  1380. {
  1381. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1382. Paint_NewImage((uint8_t *)tmp_paint_buf, 96, 48, ROTATE_0, WHITE);
  1383. Paint_DrawBitMap_Paste((uint8_t *)gImage_button, 0, 0, 96, 48, 1);
  1384. x = center_align(&Machine_info.btn_operation, 64, 16, 32);
  1385. Paint_DrawString_CN(16 + x, 8, (char *)Machine_info.btn_operation, &chinese_type_32, FONT_BACKGROUND, FONT_FOREGROUND);
  1386. memcpy(operation_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1387. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1388. Paint_NewImage((uint8_t *)tmp_paint_buf, 320, 384, ROTATE_0, WHITE);
  1389. Paint_DrawBitMap_Paste((uint8_t *)gImage_mid_, 0, 0, 320, 384, 1);
  1390. x = center_align(&Machine_info.btn_operation, 128, 64, 64);
  1391. Paint_DrawString_CN64(96 + x, 160, (char *)Machine_info.btn_operation);
  1392. memcpy(image_320x384_buf, Paint_info.Image, sizeof(uint8_t) * 320 * 384 / 8);
  1393. }
  1394. else
  1395. {
  1396. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1397. Paint_NewImage((uint8_t *)tmp_paint_buf, 128, 64, ROTATE_0, WHITE);
  1398. Paint_DrawBitMap_Paste((uint8_t *)gImage_button_128x64, 0, 0, 128, 64, 1);
  1399. x = center_align(&Machine_info.btn_operation, 96, 24, 48);
  1400. // Paint_DrawString_CN(16+x,8,(char*)Machine_info.btn_operation,&chinese_type_32,FONT_BACKGROUND,FONT_FOREGROUND);
  1401. Paint_DrawString_CN48(16 + x, 8, (char *)Machine_info.btn_operation, false);
  1402. memcpy(background_128x64_buf, Paint_info.Image, sizeof(uint8_t) * 128 * 64 / 8);
  1403. }
  1404. }
  1405. break;
  1406. case STATE_SHUT_DOWN:
  1407. {
  1408. if (Machine_info.left_display_mode == 0)
  1409. {
  1410. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1411. Paint_NewImage((uint8_t *)tmp_paint_buf, 48, 96, ROTATE_90, WHITE);
  1412. Paint_DrawBitMap_Paste((uint8_t *)gImage_button, 0, 0, 96, 48, 1);
  1413. x = center_align(&Machine_info.btn_shutDown_info, 64, 16, 32);
  1414. Paint_DrawString_CN(16 + x, 8, (char *)Machine_info.btn_shutDown_info, &chinese_type_32, FONT_BACKGROUND, FONT_FOREGROUND);
  1415. memcpy(shutDown_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1416. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1417. Paint_NewImage((uint8_t *)tmp_paint_buf, 320, 384, ROTATE_0, WHITE);
  1418. Paint_DrawBitMap_Paste((uint8_t *)gImage_right_, 0, 0, 320, 384, 1);
  1419. x = center_align(&Machine_info.btn_shutDown_info, 128, 64, 64);
  1420. Paint_DrawString_CN64(96 + x, 160, (char *)Machine_info.btn_shutDown_info);
  1421. memcpy(image_320x384_buf, Paint_info.Image, sizeof(uint8_t) * 320 * 384 / 8);
  1422. }
  1423. else
  1424. {
  1425. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1426. Paint_NewImage((uint8_t *)tmp_paint_buf, 64, 128, ROTATE_90, WHITE);
  1427. Paint_DrawBitMap_Paste((uint8_t *)gImage_button_128x64, 0, 0, 128, 64, 1);
  1428. x = center_align(&Machine_info.btn_shutDown_info, 96, 24, 48);
  1429. // Paint_DrawString_CN(16+x,8,(char*)Machine_info.btn_shutDown_info,&chinese_type_32,FONT_BACKGROUND,FONT_FOREGROUND);
  1430. Paint_DrawString_CN48(16 + x, 8, (char *)Machine_info.btn_shutDown_info, false);
  1431. memcpy(background_128x64_buf, Paint_info.Image, sizeof(uint8_t) * 128 * 64 / 8);
  1432. }
  1433. }
  1434. break;
  1435. case STATE_BREAKDOWN:
  1436. {
  1437. if (Machine_info.left_display_mode == 0)
  1438. {
  1439. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1440. Paint_NewImage((uint8_t *)tmp_paint_buf, 48, 96, ROTATE_90, WHITE);
  1441. Paint_DrawBitMap_Paste((uint8_t *)gImage_button, 0, 0, 96, 48, 1);
  1442. x = center_align(&Machine_info.btn_breakDown_info, 64, 16, 32);
  1443. Paint_DrawString_CN(16 + x, 8, (char *)Machine_info.btn_breakDown_info, &chinese_type_32, FONT_BACKGROUND, FONT_FOREGROUND);
  1444. memcpy(breakDown_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1445. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1446. Paint_NewImage((uint8_t *)tmp_paint_buf, 320, 384, ROTATE_180, WHITE);
  1447. Paint_DrawBitMap_Paste((uint8_t *)gImage_left_, 0, 0, 320, 384, 1);
  1448. memcpy(image_320x384_buf, Paint_info.Image, sizeof(uint8_t) * 320 * 384 / 8);
  1449. Paint_NewImage(image_320x384_buf, 320, 384, ROTATE_0, WHITE);
  1450. x = center_align(&Machine_info.btn_breakDown_info, 128, 64, 64);
  1451. Paint_DrawString_CN64(96 + x, 160, (char *)Machine_info.btn_breakDown_info);
  1452. memcpy(image_320x384_buf, Paint_info.Image, sizeof(uint8_t) * 320 * 384 / 8);
  1453. }
  1454. else
  1455. {
  1456. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1457. Paint_NewImage((uint8_t *)tmp_paint_buf, 64, 128, ROTATE_90, WHITE);
  1458. Paint_DrawBitMap_Paste((uint8_t *)gImage_button_128x64, 0, 0, 128, 64, 1);
  1459. x = center_align(&Machine_info.btn_breakDown_info, 96, 24, 48);
  1460. // Paint_DrawString_CN(16+x,8,(char*)Machine_info.btn_breakDown_info,&chinese_type_32,FONT_BACKGROUND,FONT_FOREGROUND);
  1461. Paint_DrawString_CN48(16 + x, 8, (char *)Machine_info.btn_breakDown_info, false);
  1462. memcpy(background_128x64_buf, Paint_info.Image, sizeof(uint8_t) * 128 * 64 / 8);
  1463. }
  1464. }
  1465. break;
  1466. case STATE_SAFEKEEP:
  1467. {
  1468. if (Machine_info.left_display_mode == 0)
  1469. {
  1470. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1471. Paint_NewImage((uint8_t *)tmp_paint_buf, 96, 48, ROTATE_0, WHITE);
  1472. Paint_DrawBitMap_Paste((uint8_t *)gImage_button, 0, 0, 96, 48, 1);
  1473. x = center_align(&Machine_info.btn_safeKeep_info, 64, 16, 32);
  1474. Paint_DrawString_CN(16 + x, 8, (char *)Machine_info.btn_safeKeep_info, &chinese_type_32, FONT_BACKGROUND, FONT_FOREGROUND);
  1475. memcpy(safeKeep_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1476. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1477. Paint_NewImage((uint8_t *)tmp_paint_buf, 320, 384, ROTATE_180, WHITE);
  1478. Paint_DrawBitMap_Paste((uint8_t *)gImage_mid_, 0, 0, 320, 384, 1);
  1479. memcpy(image_320x384_buf, Paint_info.Image, sizeof(uint8_t) * 320 * 384 / 8);
  1480. Paint_NewImage(image_320x384_buf, 320, 384, ROTATE_0, WHITE);
  1481. x = center_align(&Machine_info.btn_safeKeep_info, 128, 64, 64);
  1482. Paint_DrawString_CN64(96 + x, 160, (char *)Machine_info.btn_safeKeep_info);
  1483. memcpy(image_320x384_buf, Paint_info.Image, sizeof(uint8_t) * 320 * 384 / 8);
  1484. }
  1485. else
  1486. {
  1487. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1488. Paint_NewImage((uint8_t *)tmp_paint_buf, 128, 64, ROTATE_0, WHITE);
  1489. Paint_DrawBitMap_Paste((uint8_t *)gImage_button_128x64, 0, 0, 128, 64, 1);
  1490. x = center_align(&Machine_info.btn_safeKeep_info, 96, 24, 48);
  1491. // Paint_DrawString_CN(16+x,8,(char*)Machine_info.btn_safeKeep_info,&chinese_type_32,FONT_BACKGROUND,FONT_FOREGROUND);
  1492. Paint_DrawString_CN48(16 + x, 8, (char *)Machine_info.btn_safeKeep_info, false);
  1493. memcpy(background_128x64_buf, Paint_info.Image, sizeof(uint8_t) * 128 * 64 / 8);
  1494. }
  1495. }
  1496. break;
  1497. case STATE_UPKEEP:
  1498. {
  1499. if (Machine_info.left_display_mode == 0)
  1500. {
  1501. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1502. Paint_NewImage((uint8_t *)tmp_paint_buf, 48, 96, ROTATE_270, WHITE);
  1503. Paint_DrawBitMap_Paste((uint8_t *)gImage_button, 0, 0, 96, 48, 1);
  1504. x = center_align(&Machine_info.btn_upKeep_info, 64, 16, 32);
  1505. Paint_DrawString_CN(16 + x, 8, (char *)Machine_info.btn_upKeep_info, &chinese_type_32, FONT_BACKGROUND, FONT_FOREGROUND);
  1506. memcpy(upKeep_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8);
  1507. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1508. Paint_NewImage((uint8_t *)tmp_paint_buf, 320, 384, ROTATE_180, WHITE);
  1509. Paint_DrawBitMap_Paste((uint8_t *)gImage_right_, 0, 0, 320, 384, 1);
  1510. memcpy(image_320x384_buf, Paint_info.Image, sizeof(uint8_t) * 320 * 384 / 8);
  1511. Paint_NewImage(image_320x384_buf, 320, 384, ROTATE_0, WHITE);
  1512. x = center_align(&Machine_info.btn_upKeep_info, 128, 64, 64);
  1513. Paint_DrawString_CN64(96 + x, 160, (char *)Machine_info.btn_upKeep_info);
  1514. memcpy(image_320x384_buf, Paint_info.Image, sizeof(uint8_t) * 320 * 384 / 8);
  1515. }
  1516. else
  1517. {
  1518. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1519. Paint_NewImage((uint8_t *)tmp_paint_buf, 64, 128, ROTATE_270, WHITE);
  1520. Paint_DrawBitMap_Paste((uint8_t *)gImage_button_128x64, 0, 0, 128, 64, 1);
  1521. x = center_align(&Machine_info.btn_upKeep_info, 96, 24, 48);
  1522. // Paint_DrawString_CN(16+x,8,(char*)Machine_info.btn_upKeep_info,&chinese_type_32,FONT_BACKGROUND,FONT_FOREGROUND);
  1523. Paint_DrawString_CN48(16 + x, 8, (char *)Machine_info.btn_upKeep_info, false);
  1524. memcpy(background_128x64_buf, Paint_info.Image, sizeof(uint8_t) * 128 * 64 / 8);
  1525. }
  1526. }
  1527. break;
  1528. case STATE_WAIT_MATERIALS:
  1529. {
  1530. if (Machine_info.left_display_mode == 0)
  1531. {
  1532. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1533. Paint_NewImage((uint8_t *)tmp_paint_buf, 48, 96, ROTATE_270, WHITE);
  1534. Paint_DrawBitMap_Paste((uint8_t *)gImage_button, 0, 0, 96, 48, 1);
  1535. x = center_align(&Machine_info.btn_waitMaterials_info, 64, 16, 32);
  1536. Paint_DrawString_CN(16 + x, 8, (char *)Machine_info.btn_waitMaterials_info, &chinese_type_32, FONT_BACKGROUND, FONT_FOREGROUND);
  1537. memcpy(waitMaterials_background_96x48_buf, Paint_info.Image, sizeof(uint8_t) * 96 * 48 / 8); // 黑底白字
  1538. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1539. Paint_NewImage((uint8_t *)tmp_paint_buf, 320, 384, ROTATE_0, WHITE);
  1540. Paint_DrawBitMap_Paste((uint8_t *)gImage_left_, 0, 0, 320, 384, 1);
  1541. x = center_align(&Machine_info.btn_waitMaterials_info, 128, 64, 64);
  1542. Paint_DrawString_CN64(96 + x, 160, (char *)Machine_info.btn_waitMaterials_info);
  1543. memcpy(image_320x384_buf, Paint_info.Image, sizeof(uint8_t) * 320 * 384 / 8);
  1544. }
  1545. else
  1546. {
  1547. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1548. Paint_NewImage((uint8_t *)tmp_paint_buf, 64, 128, ROTATE_270, WHITE);
  1549. Paint_DrawBitMap_Paste((uint8_t *)gImage_button_128x64, 0, 0, 128, 64, 1);
  1550. x = center_align(&Machine_info.btn_waitMaterials_info, 96, 24, 48);
  1551. // Paint_DrawString_CN(16+x,8,(char*)Machine_info.btn_waitMaterials_info,&chinese_type_32,FONT_BACKGROUND,FONT_FOREGROUND);
  1552. Paint_DrawString_CN48(16 + x, 8, (char *)Machine_info.btn_waitMaterials_info, false);
  1553. memcpy(background_128x64_buf, Paint_info.Image, sizeof(uint8_t) * 128 * 64 / 8); // 黑底白字
  1554. }
  1555. }
  1556. break;
  1557. default:
  1558. ESP_LOGE(LOG_TAG, " err: (info->left_state)");
  1559. break;
  1560. }
  1561. // 画图
  1562. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1563. Paint_NewImage((uint8_t *)tmp_paint_buf, 648, 480, ROTATE_180, WHITE);
  1564. Paint_DrawBitMap_Paste(operation_background_96x48_buf, 272, 0, 96, 48, 1);
  1565. Paint_DrawBitMap_Paste(shutDown_background_96x48_buf, 600, 48, 48, 96, 1);
  1566. Paint_DrawBitMap_Paste(breakDown_background_96x48_buf, 600, 336, 48, 96, 1);
  1567. Paint_DrawBitMap_Paste(safeKeep_background_96x48_buf, 272, 432, 96, 48, 1);
  1568. Paint_DrawBitMap_Paste(upKeep_background_96x48_buf, 0, 336, 48, 96, 1);
  1569. Paint_DrawBitMap_Paste(waitMaterials_background_96x48_buf, 0, 48, 48, 96, 1);
  1570. free(operation_background_96x48_buf);
  1571. free(shutDown_background_96x48_buf);
  1572. free(breakDown_background_96x48_buf);
  1573. free(upKeep_background_96x48_buf);
  1574. free(safeKeep_background_96x48_buf);
  1575. free(waitMaterials_background_96x48_buf);
  1576. if (Machine_info.left_display_mode != 0)
  1577. {
  1578. switch (Machine_info.left_state)
  1579. {
  1580. case STATE_NONE:
  1581. case STATE_OPERATION:
  1582. Paint_DrawBitMap_Paste(background_128x64_buf, 272 - 16, 0, 128, 64, 1);
  1583. break;
  1584. case STATE_SHUT_DOWN:
  1585. Paint_DrawBitMap_Paste(background_128x64_buf, 600 - 16, 48 - 8, 64, 128, 1);
  1586. break;
  1587. case STATE_BREAKDOWN:
  1588. Paint_DrawBitMap_Paste(background_128x64_buf, 600 - 16, 336 - 8, 64, 128, 1);
  1589. break;
  1590. case STATE_SAFEKEEP:
  1591. Paint_DrawBitMap_Paste(background_128x64_buf, 272 - 16, 432 - 16, 128, 64, 1);
  1592. break;
  1593. case STATE_UPKEEP:
  1594. Paint_DrawBitMap_Paste(background_128x64_buf, 0, 336 - 16, 64, 128, 1);
  1595. break;
  1596. case STATE_WAIT_MATERIALS:
  1597. Paint_DrawBitMap_Paste(background_128x64_buf, 0, 48 - 16, 64, 128, 1);
  1598. break;
  1599. default:
  1600. break;
  1601. }
  1602. }
  1603. free(background_128x64_buf);
  1604. Paint_DrawBitMap_Paste((uint8_t *)gImage_nfc, 573, 215, 44, 44, 1);
  1605. if ((Machine_info.left_display_mode == 0x00))
  1606. {
  1607. Paint_DrawBitMap_Paste(image_320x384_buf, 164, 48, 320, 384, 1);
  1608. }
  1609. else
  1610. {
  1611. Paint_DrawBitMap_Paste(tmp, 84, 90, 480, 300, 1); // 648-480 168
  1612. free(tmp);
  1613. }
  1614. // qrcode
  1615. char qrcode_string[1024] = {0};
  1616. qrcode_protocol_create(qrcode_string, Machine_info);
  1617. QRGenerator_quick(qrcode_string);
  1618. //
  1619. // printf("btn_operation = %s\r\n",Machine_info.btn_operation);
  1620. // printf("btn_breakDown_info = %s\r\n",Machine_info.btn_breakDown_info);
  1621. // printf("btn_upKeep_info = %s\r\n",Machine_info.btn_upKeep_info);
  1622. // printf("btn_shutDown_info = %s\r\n",Machine_info.btn_shutDown_info);
  1623. // printf("btn_safeKeep_info = %s\r\n",Machine_info.btn_safeKeep_info);
  1624. // printf("btn_waitMaterials_info = %s\r\n",Machine_info.btn_operation);
  1625. int reson = is_wake_up_reson(); // 返回唤醒的原
  1626. if (is_quick)
  1627. {
  1628. bool ret = epd_cache_quick(SCREEN_LEFT, (uint8_t *)last_paint_buf_left, Paint_info.Image);
  1629. epd_powerOn_refresh_sleep(SCREEN_LEFT);
  1630. }
  1631. else
  1632. {
  1633. epd_init_cmd(SCREEN_LEFT);
  1634. epd_display(SCREEN_LEFT, Paint_info.Image);
  1635. }
  1636. // 保存上一帧画面
  1637. memcpy(last_paint_buf_left, Paint_info.Image, sizeof(uint8_t) * 648 * 480 / 8);
  1638. if (memcmp(last_paint_buf_left, Paint_info.Image, 38880))
  1639. {
  1640. ESP_LOGE(LOG_TAG, "err:last_paint_buf_left");
  1641. }
  1642. free(image_320x384_buf);
  1643. }
  1644. void Paint_rightScreen(bool is_poweron, bool is_quick)
  1645. {
  1646. ESP_LOGI(LOG_TAG, "Paint_rightScreen %s - %s ", is_quick ? "quick" : "low", is_poweron ? "poweron" : "poweroff");
  1647. if (!is_poweron)
  1648. {
  1649. // 关机展示说明书
  1650. dis_right_sms();
  1651. return;
  1652. }
  1653. uint8_t *right1_buf = partial_right1_quick(&Machine_info);
  1654. uint8_t *right2_buf = partial_right2_quick();
  1655. uint8_t *right3_buf = NULL;
  1656. if (Machine_info.right_display_mode == 1)
  1657. {
  1658. right3_buf = partial_right3_2_quick();
  1659. }
  1660. else
  1661. {
  1662. right3_buf = partial_right3_quick();
  1663. }
  1664. uint8_t *right4_buf = partial_right4_quick();
  1665. memset((uint8_t *)tmp_paint_buf, 0, DISPLAY_BUFFER_SIZE /*sizeof(tmp_paint_buf)*/);
  1666. Paint_NewImage((uint8_t *)tmp_paint_buf, 648, 480, ROTATE_270, WHITE);
  1667. Paint_DrawBitMap_Paste(right1_buf, 0, 0, 480, 100, 1);
  1668. free(right1_buf);
  1669. Paint_DrawBitMap_Paste(right2_buf, 0, 100, 480, 172, 1);
  1670. free(right2_buf);
  1671. Paint_DrawBitMap_Paste(right3_buf, 0, 272, 480, 224, 1);
  1672. free(right3_buf);
  1673. Paint_DrawBitMap_Paste(right4_buf, 0, 496, 480, 152, 1);
  1674. free(right4_buf);
  1675. if (is_quick)
  1676. {
  1677. bool ret = epd_cache_quick(SCREEN_RIGHT, (uint8_t *)last_paint_buf_right, Paint_info.Image);
  1678. epd_powerOn_refresh_sleep(SCREEN_RIGHT);
  1679. }
  1680. else
  1681. {
  1682. epd_init_cmd(SCREEN_RIGHT);
  1683. epd_display(SCREEN_RIGHT, Paint_info.Image);
  1684. }
  1685. // 保存右屏上一帧画面
  1686. memcpy(last_paint_buf_right, Paint_info.Image, sizeof(uint8_t) * 648 * 480 / 8);
  1687. // int ret = memcmp(last_paint_buf_right,Paint_info.Image,38880);
  1688. // ESP_LOGW(LOG_TAG,"memcmp :ret = %d",ret);
  1689. if (memcmp(last_paint_buf_right, Paint_info.Image, 38880))
  1690. {
  1691. ESP_LOGE(LOG_TAG, "err:last_paint_buf_right");
  1692. }
  1693. Machine_info.last_batt_precent = Machine_info.batt_precent; // 右屏刷完后记录电池电量
  1694. }