Dwin.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972
  1. #include "Dwin.h"
  2. #include "usart.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "CollectMaster485.h"
  6. #include "TerminalSlave485.h"
  7. #include "ScreenMaster485.h"
  8. #include "Elec_Seal.h"
  9. #include "main.h"
  10. #include "KeySlave485.h"
  11. #include "cmsis_os.h"
  12. Run_mode_key Run_mode_key_info;
  13. uint8_t Lcd_sleep_flag =2;//1休眠状态 3 唤醒状态 2执行唤醒
  14. uint8_t DateDwin[8];
  15. uint8_t time_Set_Dwin[14]={0x5A, 0xA5, 0x0B ,0x82 ,0x00 ,0x9C ,0x5A ,0xA5 ,0x13 ,0x05 ,0x1B ,0x0b ,0x1b ,0x19};
  16. SemaphoreHandle_t xSemaphore = NULL;
  17. int Init_Dwin_Signal(void)
  18. {
  19. xSemaphore = xSemaphoreCreateMutex();
  20. if(xSemaphore==NULL)
  21. {
  22. return 0;
  23. }
  24. usart3_rx_flag=1;
  25. return 1;
  26. }
  27. /******************************************************************************
  28. 写8位数据
  29. 输入:写入地址:addr16, 写入数据:data16
  30. 输出返回:无
  31. 5A A5 04 83 00 10 04
  32. 将会收到: 年 月 日 星期;时,分,秒.
  33. 5A A5 0C 83 00 10 04 15 01 06 03 14 28 11 00
  34. 5A A5 0C 83 00 10 04 15 01 07 04 15 1C 30 00
  35. ******************************************************************************/
  36. void GetDateFromDwin(void)
  37. {
  38. uint8_t TxDwinDataBuf[7];
  39. TxDwinDataBuf[0]=STARTSIGN_H;
  40. TxDwinDataBuf[1]=STARTSIGN_L;
  41. TxDwinDataBuf[2]=0x04;
  42. TxDwinDataBuf[3]=0x83;
  43. TxDwinDataBuf[4]=0x00;
  44. TxDwinDataBuf[5]=0x10;
  45. TxDwinDataBuf[6]=0x04;
  46. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 5) == pdFALSE)
  47. {
  48. return;
  49. }
  50. ScreenMaster485_Send_Data(TxDwinDataBuf,7);
  51. if(xSemaphore)
  52. xSemaphoreGive( xSemaphore );
  53. //HAL_Delay(20);//
  54. }
  55. /******************************************************************************
  56. 写8位数据
  57. 输入:写入地址:addr16, 写入数据:data16
  58. 输出返回:无
  59. 5A A5 05 82 10 01 00 03
  60. ******************************************************************************/
  61. void WrDwinCmd8(uint16_t addr16,uint8_t data8)
  62. {
  63. uint8_t TxDwinDataBuf[7];
  64. TxDwinDataBuf[0]=STARTSIGN_H;
  65. TxDwinDataBuf[1]=STARTSIGN_L;
  66. TxDwinDataBuf[2]=0x04;
  67. TxDwinDataBuf[3]=0x82;
  68. TxDwinDataBuf[4]=addr16>>8;
  69. TxDwinDataBuf[5]=addr16;
  70. TxDwinDataBuf[6]=data8;
  71. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 5) == pdFALSE)
  72. {
  73. return;
  74. }
  75. ScreenMaster485_Send_Data(TxDwinDataBuf,7);
  76. if(xSemaphore)
  77. xSemaphoreGive( xSemaphore );
  78. // HAL_Delay(10);//
  79. }
  80. /******************************************************************************
  81. 写16位数据
  82. 输入:写入地址:addr16, 写入数据:data16
  83. 输出返回:无
  84. 5A A5 05 82 10 01 00 03
  85. ******************************************************************************/
  86. void WrDwinCmd16(uint16_t addr16,uint16_t data16)
  87. {
  88. uint8_t TxDwinDataBuf[8];
  89. TxDwinDataBuf[0]=STARTSIGN_H;
  90. TxDwinDataBuf[1]=STARTSIGN_L;
  91. TxDwinDataBuf[2]=0x05; //数据长度+命令+地址+数据
  92. TxDwinDataBuf[3]=0x82;
  93. TxDwinDataBuf[4]=addr16>>8;
  94. TxDwinDataBuf[5]=addr16;
  95. TxDwinDataBuf[6]=data16>>8;
  96. TxDwinDataBuf[7]=data16;
  97. //taskENTER_CRITICAL();
  98. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 500) == pdFALSE)
  99. {
  100. return;
  101. }
  102. ScreenMaster485_Send_Data(TxDwinDataBuf,8);
  103. if(xSemaphore)
  104. xSemaphoreGive( xSemaphore );
  105. //taskEXIT_CRITICAL();
  106. //osDelay(10);//HAL_Delay(10);//
  107. }
  108. /******************************************************************************
  109. 发送命令
  110. 写32位数据
  111. 输入:写入地址:addr16, 写入数据:data32
  112. 输出返回:无
  113. 5A A5 07 82 00 84 5A 01 00 03
  114. ******************************************************************************/
  115. void WrDwinCmd32(uint16_t addr16,uint32_t data32)
  116. {
  117. uint8_t TxDwinDataBuf[10];
  118. TxDwinDataBuf[0]=STARTSIGN_H;
  119. TxDwinDataBuf[1]=STARTSIGN_L;
  120. TxDwinDataBuf[2]=0x07; //数据长度+命令+地址+数据
  121. TxDwinDataBuf[3]=0x82;
  122. TxDwinDataBuf[4]=addr16>>8;
  123. TxDwinDataBuf[5]=addr16;
  124. TxDwinDataBuf[6]=data32>>24;
  125. TxDwinDataBuf[7]=data32>>16;
  126. TxDwinDataBuf[8]=data32>>8;
  127. TxDwinDataBuf[9]=data32;
  128. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 500) == pdFALSE)
  129. {
  130. return;
  131. }
  132. ScreenMaster485_Send_Data(TxDwinDataBuf,10);
  133. if(xSemaphore)
  134. xSemaphoreGive( xSemaphore );
  135. //osDelay(15);//HAL_Delay(15);//
  136. }
  137. /******************************************************************************
  138. 发送命令
  139. 写16位数据
  140. 输入:写入地址:addr16, 写入数据:*buf
  141. 输出返回:无
  142. ******************************************************************************/
  143. void WrDwinBuf16(uint16_t addr16,uint16_t *buf)
  144. {
  145. uint8_t TxDwinDataBuf[8];
  146. TxDwinDataBuf[0]=STARTSIGN_H;
  147. TxDwinDataBuf[1]=STARTSIGN_L;
  148. TxDwinDataBuf[2]=0x05;
  149. TxDwinDataBuf[3]=0x82;
  150. TxDwinDataBuf[4]=addr16>>8;
  151. TxDwinDataBuf[5]=addr16;
  152. TxDwinDataBuf[6]=(*buf)>>8;
  153. TxDwinDataBuf[7]=*buf;
  154. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 150) == pdFALSE)
  155. {
  156. return;
  157. }
  158. ScreenMaster485_Send_Data(TxDwinDataBuf,8);
  159. if(xSemaphore)
  160. xSemaphoreGive( xSemaphore );
  161. //HAL_Delay(10);//
  162. }
  163. /******************************************************************************
  164. 发送命令
  165. 写16位数据
  166. 输入:写入地址:addr16, 写入数据:*buf
  167. 输出返回:无
  168. ******************************************************************************/
  169. void WrDwinBuf32(uint16_t addr16,uint16_t *buf)
  170. {
  171. uint8_t TxDwinDataBuf[10];
  172. TxDwinDataBuf[0]=STARTSIGN_H;
  173. TxDwinDataBuf[1]=STARTSIGN_L;
  174. TxDwinDataBuf[2]=0x07;
  175. TxDwinDataBuf[3]=0x82;
  176. TxDwinDataBuf[4]=addr16>>8;
  177. TxDwinDataBuf[5]=addr16;
  178. TxDwinDataBuf[6]=(*buf)>>8;
  179. TxDwinDataBuf[7]=*buf++;
  180. TxDwinDataBuf[8]=(*buf)>>8;
  181. TxDwinDataBuf[9]=*buf;
  182. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 5) == pdFALSE)
  183. {
  184. return;
  185. }
  186. ScreenMaster485_Send_Data(TxDwinDataBuf,10);
  187. if(xSemaphore)
  188. xSemaphoreGive( xSemaphore );
  189. // HAL_Delay(10);//
  190. }
  191. /******************************************************************************
  192. 发送命令
  193. 写N个数据(字)
  194. 输入:写入地址:addr16, 写入数据:*buf n: 发送的地址个数
  195. 输出返回:无
  196. ******************************************************************************/
  197. //void WrDwinBuf(uint16_t addr16,uint16_t *buf,uint8_t n)
  198. //{
  199. // uint8_t i,num;
  200. // uint8_t TxDwinDataBuf[100];
  201. // num = (n<<1);
  202. // TxDwinDataBuf[0]=STARTSIGN_H;
  203. // TxDwinDataBuf[1]=STARTSIGN_L;
  204. // TxDwinDataBuf[2]=num+3;
  205. // TxDwinDataBuf[3]=0x82;
  206. // TxDwinDataBuf[4]=addr16>>8;
  207. // TxDwinDataBuf[5]=addr16;
  208. // for(i=0;i<num;i+=2)
  209. // {
  210. // TxDwinDataBuf[i+6]=(*buf)>>8;
  211. // TxDwinDataBuf[i+7]=*buf++;
  212. // }
  213. // ScreenMaster485_Send_Data(TxDwinDataBuf,6+num);
  214. // HAL_Delay(20);//
  215. //
  216. //}
  217. uint8_t TxDwinDataBuf[512];
  218. void WrDwinBuf(uint16_t addr16,uint16_t *buf,uint16_t n,uint8_t LSB_Mode)
  219. {
  220. uint16_t i,num;
  221. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 200) == pdFALSE)
  222. {
  223. return;
  224. }
  225. num = (n<<1);
  226. if(num>255-7)
  227. {
  228. num = 255-7;//防止溢出错误
  229. }
  230. TxDwinDataBuf[0]=STARTSIGN_H;
  231. TxDwinDataBuf[1]=STARTSIGN_L;
  232. TxDwinDataBuf[2]=num+3;
  233. TxDwinDataBuf[3]=0x82;
  234. TxDwinDataBuf[4]=addr16>>8;
  235. TxDwinDataBuf[5]=addr16;
  236. for(i=0;i<num;i+=2)
  237. {
  238. if(LSB_Mode==1)//先发送低位字节
  239. {
  240. TxDwinDataBuf[i+7]=(*buf)>>8;
  241. TxDwinDataBuf[i+6]=*buf++;
  242. }
  243. else //先发送高位字节
  244. {//李伟修改 20210531 迪文屏的高低存储跟常规的是反过来的
  245. TxDwinDataBuf[i+6]=(*buf)>>8;
  246. TxDwinDataBuf[i+7]=*buf++;
  247. }
  248. }
  249. ScreenMaster485_Send_Data(TxDwinDataBuf,6+num);
  250. // osDelay(10);
  251. #if 0
  252. if(num<10)
  253. {
  254. HAL_Delay(10);
  255. }
  256. else
  257. {
  258. //HAL_Delay(num);
  259. ;//HAL_Delay(20);
  260. osDelay(20);
  261. }
  262. #endif
  263. if(xSemaphore)
  264. xSemaphoreGive( xSemaphore );
  265. }
  266. /******************************************************************************
  267. 发送命令
  268. 写N个数据(字)
  269. 输入:写入地址:addr16, 写入数据:*buf n: 发送的地址个数
  270. 输出返回:无
  271. ******************************************************************************/
  272. void WrDwinBuf_u8(uint16_t addr16,uint8_t *buf,uint8_t n)
  273. {
  274. uint8_t i,num;
  275. uint8_t TxDwinDataBuf[100];
  276. num = (n);
  277. TxDwinDataBuf[0]=STARTSIGN_H;
  278. TxDwinDataBuf[1]=STARTSIGN_L;
  279. TxDwinDataBuf[2]=num+3;
  280. TxDwinDataBuf[3]=0x82;
  281. TxDwinDataBuf[4]=addr16>>8;
  282. TxDwinDataBuf[5]=addr16;
  283. for(i=0;i<num;i+=1)
  284. {
  285. TxDwinDataBuf[i+6]=(*buf);
  286. //TxDwinDataBuf[i+7]=*buf++;
  287. }
  288. ScreenMaster485_Send_Data(TxDwinDataBuf,6+num);
  289. // HAL_Delay(10);//
  290. }
  291. /******************************************************************************
  292. 读取一个字的,读16位数据
  293. 输入:写入地址:addr16, 写入数据:*buf
  294. 输出返回:无
  295. ******************************************************************************/
  296. void RdDwinData16(uint16_t addr16,uint8_t len)
  297. {
  298. uint8_t TxDwinDataBuf[8];
  299. TxDwinDataBuf[0]=STARTSIGN_H;
  300. TxDwinDataBuf[1]=STARTSIGN_L;
  301. TxDwinDataBuf[2]=0x04;
  302. TxDwinDataBuf[3]=0x83;
  303. TxDwinDataBuf[4]=addr16>>8;
  304. TxDwinDataBuf[5]=addr16;
  305. TxDwinDataBuf[6]=len;
  306. ScreenMaster485_Send_Data(TxDwinDataBuf,7);
  307. // HAL_Delay(10);//
  308. }
  309. /******************************************************************************
  310. 读取一个字的,读16位数据
  311. 输入:写入地址:addr16, 写入数据:*buf
  312. 输出返回:无
  313. ******************************************************************************/
  314. void Restart_LCD(void)
  315. {
  316. uint8_t TxDwinDataBuf[10];
  317. TxDwinDataBuf[0]=STARTSIGN_H;
  318. TxDwinDataBuf[1]=STARTSIGN_L;
  319. TxDwinDataBuf[2]=0x07;
  320. TxDwinDataBuf[3]=0x82;
  321. TxDwinDataBuf[4]=0x00;//addr16>>8;
  322. TxDwinDataBuf[5]=0x04;//addr16;
  323. TxDwinDataBuf[6]=0x55;
  324. TxDwinDataBuf[7]=0xAA;
  325. TxDwinDataBuf[8]=0x5a;//
  326. TxDwinDataBuf[9]=0xa5;//
  327. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 50) == pdFALSE)
  328. {
  329. return;
  330. }
  331. ScreenMaster485_Send_Data(TxDwinDataBuf,10);
  332. if(xSemaphore)
  333. xSemaphoreGive( xSemaphore );
  334. HAL_Delay(10);//
  335. }
  336. /******************************************************************************
  337. 读取2个字的数据32位
  338. 输入:无
  339. 输出返回:无
  340. ******************************************************************************/
  341. void RdDwinData32(uint16_t addr16,uint8_t len)
  342. {
  343. uint8_t TxDwinDataBuf[8];
  344. TxDwinDataBuf[0]=STARTSIGN_H;
  345. TxDwinDataBuf[1]=STARTSIGN_L;
  346. TxDwinDataBuf[2]=0x06; //êy?Y3¤?è+?üá?+μ??·
  347. TxDwinDataBuf[3]=0x83;
  348. TxDwinDataBuf[4]=addr16>>8;
  349. TxDwinDataBuf[5]=addr16;
  350. TxDwinDataBuf[6]=len;
  351. ScreenMaster485_Send_Data(TxDwinDataBuf,7);
  352. // HAL_Delay(10);//
  353. }
  354. /******************************************************************************
  355. 接收液晶发下来的数据,并存在结构体中
  356. 输入:无
  357. 输出返回:无
  358. ******************************************************************************/
  359. //void RxAddrData (void)
  360. //{
  361. // u16 i;
  362. // DIWEN_com();
  363. // for(i = 0; i < CMDBUF_SIZE; i++)
  364. // {
  365. // if(ADDR_COMM == RxCmdBuf[i].Cmd_Addr)
  366. // {
  367. // ADDR_COMM=0xff;
  368. // RxCmdBuf[i].Cmd_Flag = 1;
  369. // RxCmdBuf[i].Cmd_Data = DATA_COMM;
  370. // }
  371. // }
  372. //}
  373. /******************************************************************************
  374. 分析数据并处理数据
  375. 输入:无
  376. 输出返回:无
  377. ******************************************************************************/
  378. void Lcd_Cmd_Handle(void)
  379. {
  380. // RxAddrData();
  381. }
  382. /******************************************************************************
  383. 界面跳转
  384. 输入:ID
  385. 输出返回:无
  386. ******************************************************************************/
  387. void Jump_page_id(uint8_t id)
  388. {
  389. WrDwinCmd32(0x0084,0x5A010000|id);
  390. Run_mode_key_info.current_page = id;
  391. }
  392. /******************************************************************************
  393. 首页
  394. 数字:表示页面,在工程中可以看出
  395. 输入:无
  396. 输出返回:无
  397. ******************************************************************************/
  398. uint8_t Special_Stor;
  399. void Go_homepage(void)
  400. {
  401. switch (all_Store)
  402. {
  403. case 1:
  404. Jump_page_id(1);//跳到主界面常规1仓
  405. Run_mode_key_info.Main_Page_id =1;//状态界面
  406. Run_mode_key_info.Full_oil_id = 10;//装油界面
  407. Run_mode_key_info.offLoading_oil_id =19;//卸油界面
  408. break;
  409. case 2:
  410. // if((StoreNumber == 1)&&Special_Stor)//跳到1仓2盖((Config_info_all.ManHole_Big_info&0x0f)==0x02)
  411. // {
  412. // Jump_page_id(2);
  413. // Run_mode_key_info.Main_Page_id =2;
  414. // Run_mode_key_info.Full_oil_id = 11;
  415. // Run_mode_key_info.offLoading_oil_id =20;
  416. // }
  417. // else //常规2仓
  418. // {
  419. Jump_page_id(3);
  420. Run_mode_key_info.Main_Page_id =3;
  421. Run_mode_key_info.Full_oil_id = 12;
  422. Run_mode_key_info.offLoading_oil_id =21;
  423. // }
  424. break;
  425. case 3:
  426. Jump_page_id(4);
  427. Run_mode_key_info.Main_Page_id =4;
  428. Run_mode_key_info.Full_oil_id = 13;
  429. Run_mode_key_info.offLoading_oil_id =22;
  430. break;
  431. case 4:
  432. Jump_page_id(5);
  433. Run_mode_key_info.Main_Page_id =5;
  434. Run_mode_key_info.Full_oil_id = 14;
  435. Run_mode_key_info.offLoading_oil_id =23;
  436. break;
  437. case 5:
  438. Jump_page_id(6);
  439. Run_mode_key_info.Main_Page_id =6;
  440. Run_mode_key_info.Full_oil_id = 15;
  441. Run_mode_key_info.offLoading_oil_id =24;
  442. break;
  443. case 6:
  444. Jump_page_id(7);
  445. Run_mode_key_info.Main_Page_id =7;
  446. Run_mode_key_info.Full_oil_id = 16;
  447. Run_mode_key_info.offLoading_oil_id =25;
  448. break;
  449. case 7:
  450. Jump_page_id(8);
  451. Run_mode_key_info.Main_Page_id =8;
  452. Run_mode_key_info.Full_oil_id = 17;
  453. Run_mode_key_info.offLoading_oil_id =26;
  454. break;
  455. case 8:
  456. Jump_page_id(9);
  457. Run_mode_key_info.Main_Page_id =9;
  458. Run_mode_key_info.Full_oil_id = 18;
  459. Run_mode_key_info.offLoading_oil_id =27;
  460. break;
  461. default:break;
  462. }
  463. Run_mode_key_info.Liquid_id = 54;
  464. }
  465. /******************************************************************************
  466. 屏幕初始化
  467. 输入:无
  468. 输出返回:无
  469. ******************************************************************************/
  470. void Lcd_Init(void)
  471. {
  472. //初始化界面
  473. WrDwinCmd16(ADDR_DWIN_CoverSmall,0x00);//人孔小盖关
  474. // HAL_Delay(15);
  475. WrDwinCmd16(ADDR_DWIN_CoverBig,0x00);//人孔大盖关
  476. // HAL_Delay(15);
  477. WrDwinCmd16(ADDR_DWIN_HaiDiFa,0x00);//底阀关
  478. // HAL_Delay(15);
  479. WrDwinCmd16(ADDR_DWIN_XieYouFa,0x00);//卸油阀关
  480. // HAL_Delay(15);
  481. WrDwinCmd16(ADDR_DWIN_Seal_Lock,0xff);//锁不显示--
  482. // HAL_Delay(15);
  483. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,0xff);//锁开不显示
  484. // HAL_Delay(15);
  485. WrDwinCmd16(ADDR_DWIN_Car_State,0x00);//状态正常
  486. // HAL_Delay(15);
  487. Go_homepage();//回到首页
  488. // //位控制
  489. // WrDwinCmd16(0x1000,0xff);//人孔小盖开 位控制
  490. // WrDwinCmd16(0x1003,0xff);//人孔大盖开
  491. // WrDwinCmd16(0x1006,0xff);//底阀开
  492. // WrDwinCmd16(0x1009,0xff);//卸油阀开
  493. // WrDwinCmd16(0x100c,0xFF);//锁不显示
  494. // WrDwinCmd16(0x100F,0x00);//锁开显示
  495. //
  496. // WrDwinCmd16(0x1000,0x00);//人孔小盖关
  497. // WrDwinCmd16(0x1003,0x00);//人孔大盖关
  498. // WrDwinCmd16(0x1006,0x00);//底阀关
  499. // WrDwinCmd16(0x1009,0x00);//卸油阀关
  500. //
  501. // WrDwinCmd16(0x100c,0x00);//锁显示
  502. // WrDwinCmd16(0x100F,0xff);//锁开不显示
  503. //
  504. // WrDwinCmd16(0x100c,0xff);//锁不显示
  505. // WrDwinCmd16(0x100F,0xff);//锁开不显示
  506. // WrDwinCmd16(0x1022,0x00);//状态正常
  507. //
  508. //
  509. // WrDwinCmd16(0x1012,0x04);//油量 数值控制
  510. // WrDwinCmd16(0x1014,0x01);//
  511. // WrDwinCmd16(0x1016,0x02);//
  512. // WrDwinCmd16(0x1018,0x03);//油量
  513. // WrDwinCmd16(0x101a,0x04);//
  514. // WrDwinCmd16(0x101c,0x02);//
  515. // WrDwinCmd16(0x101e,0x00);//油量
  516. // WrDwinCmd16(0x1020,0x01);//
  517. // WrDwinCmd16(0x1022,0x01);//状态异常
  518. //
  519. // //进入装油界面
  520. // WrDwinCmd32(0x0084,0x5A010000|18);
  521. //
  522. // WrDwinCmd16(0x1028,0x01);//装油模式 上装
  523. // WrDwinCmd16(0x1026,0x00);//油量仓
  524. // WrDwinCmd16(0x1024,0x01);//罐仓状态 装油中
  525. // WrDwinCmd16(0x102a,0x01);//装油动画开始 1
  526. // WrDwinCmd16(0x102c,0x01);//装油动画开始 2
  527. // WrDwinCmd16(0x102e,0x01);//装油动画开始 3
  528. // WrDwinCmd16(0x1030,0x01);//装油动画开始 4
  529. // WrDwinCmd16(0x1032,0x01);//装油动画开始 5
  530. // WrDwinCmd16(0x1034,0x01);//装油动画开始 6
  531. // WrDwinCmd16(0x1036,0x01);//装油动画开始 7
  532. // WrDwinCmd16(0x1038,0x01);//装油动画开始 8
  533. //
  534. //
  535. //
  536. // WrDwinCmd16(0x1028,0x00);//装油模式 下装
  537. // WrDwinCmd16(0x1026,0x08);//油量仓
  538. // WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
  539. // WrDwinCmd16(0x102a,0x00);//装油动画停止 1
  540. // WrDwinCmd16(0x102c,0x00);//装油动画停止 2
  541. // WrDwinCmd16(0x102e,0x00);//装油动画停止 3
  542. // WrDwinCmd16(0x1030,0x00);//装油动画停止 4
  543. // WrDwinCmd16(0x1032,0x00);//装油动画停止 5
  544. // WrDwinCmd16(0x1034,0x00);//装油动画停止 6
  545. // WrDwinCmd16(0x1036,0x00);//装油动画停止 7
  546. // WrDwinCmd16(0x1038,0x00);//装油动画停止 8
  547. //
  548. //
  549. //
  550. ////进入卸油界面
  551. // WrDwinCmd32(0x0084,0x5A010000|27);
  552. // WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
  553. // WrDwinCmd16(0x1026,0x01);//油量仓
  554. // WrDwinCmd16(0x1024,0x01);//罐仓状态 卸油中
  555. //
  556. // WrDwinCmd16(0x1012,0x00);//1仓油量 数值控制
  557. // WrDwinCmd16(0x102a,0x01);//卸油动画开始 1
  558. //
  559. // WrDwinCmd16(0x1014,0x00);//1仓油量 数值控制
  560. // WrDwinCmd16(0x102c,0x01);//卸油动画开始 2
  561. //
  562. // WrDwinCmd16(0x1016,0x00);//1仓油量 数值控制
  563. // WrDwinCmd16(0x102e,0x01);//卸油动画开始 3
  564. //
  565. // WrDwinCmd16(0x1018,0x00);//1仓油量 数值控制
  566. // WrDwinCmd16(0x1030,0x01);//卸油动画开始 4
  567. //
  568. //
  569. // WrDwinCmd16(0x101a,0x00);//1仓油量 数值控制
  570. // WrDwinCmd16(0x1032,0x01);//卸油动画开始 5
  571. //
  572. // WrDwinCmd16(0x101c,0x00);//1仓油量 数值控制
  573. // WrDwinCmd16(0x1034,0x01);//卸油动画开始 6
  574. //
  575. // WrDwinCmd16(0x101e,0x00);//1仓油量 数值控制
  576. // WrDwinCmd16(0x1036,0x01);//卸油动画开始 7
  577. //
  578. // WrDwinCmd16(0x1020,0x00);//1仓油量 数值控制
  579. // WrDwinCmd16(0x1038,0x01);//卸油动画开始 8
  580. // WrDwinCmd16(0x103a,0x01);//仓数显示
  581. // WrDwinCmd16(0x103c,0x01);//装油警告,弹窗
  582. // WrDwinCmd16(0x103e,0x01);//卸油油警告,弹窗
  583. // WrDwinCmd16(0x1040,0x01);//指纹识别,弹窗
  584. //卸油阀异常 1042
  585. //底阀异常 1044
  586. //人孔小盖异常 1046
  587. //人孔大盖异常 1048
  588. //登录用户名 104a
  589. //登录密码 104c
  590. //密码错误 104e
  591. //时间设置
  592. //年 104e
  593. //月 1050
  594. //日 1052
  595. //时 1054
  596. //分 1056
  597. //秒 1058
  598. }
  599. /******************************************************************************
  600. 显示车辆状态与阀门状态
  601. 输入:无
  602. 输出返回:无
  603. ******************************************************************************/
  604. uint8_t a=0,b=0,c=0,d=0,i =0;
  605. uint8_t e1=0,f1=0,g1=0,h1=0;
  606. void Dispaly_CarAndValveState(void)
  607. {
  608. uint8_t e=0,f=0,g=0,h=0;
  609. e=0,f=0,g=0,h=0;
  610. for(i=0;i<StoreNumber;i++)
  611. {
  612. a|= (0x0001&(IO_Date.IO_state[0]>>i*4))<<i;
  613. b|= (0x0001&(IO_Date.IO_state[0]>>(i*4+1)))<<i;
  614. c|= (0x0001&(IO_Date.IO_state[0]>>(i*4+2)))<<i;
  615. d|= (0x0001&(IO_Date.IO_state[0]>>(i*4+3)))<<i;
  616. e|= (0x0001&(IO_Date.IO_normalstate[0]>>i*4))<<i;
  617. f|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+1)))<<i;
  618. g|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+2)))<<i;
  619. h|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+3)))<<i;
  620. if((((Full_Oil_allinfo.Start_Decrease_flag&(1<<i))==(1<<i))||(Full_Oil_allinfo.Loading_Oil_state&(1<<i))==(1<<i))&&(Run_mode_key_info.current_page !=Run_mode_key_info.Main_Page_id))
  621. WrDwinCmd16(ADDR_DWIN_Loading_Oil+(i*2),(((~IO_Date.IO_unload_switch>>i)&0x01)==0x01?0:00));//本仓在卸油或者装油,显示动画,不显示油量Ever_Oil_baseaddr
  622. else
  623. WrDwinCmd16(ADDR_DWIN_Loading_Oil+(i*2),(((~IO_Date.IO_unload_switch>>i)&0x01)==0x01?0x00:0x04));
  624. }
  625. // WrDwinCmd16(0x1000,a);//人孔小盖关
  626. // WrDwinCmd16(0x1003,b);//人孔大盖关
  627. // WrDwinCmd16(0x1006,d);//底阀关
  628. // WrDwinCmd16(0x1009,c);//卸油阀关
  629. if(e1!=e)
  630. {
  631. WrDwinCmd16(ADDR_DWIN_StateYiChang_CoverSmall,e);//人孔小盖异常
  632. e1=e;
  633. }
  634. if(f1!=f)
  635. {
  636. WrDwinCmd16(ADDR_DWIN_StateYiChang_CoverBig,f);//人孔大盖异常
  637. f1=f;
  638. }
  639. if(h1!=h)
  640. {
  641. WrDwinCmd16(ADDR_DWIN_StateYiChang_HaiDiFa,h);//底阀异常
  642. h1 = h;
  643. }
  644. if(g1!=g)
  645. {
  646. WrDwinCmd16(ADDR_DWIN_StateYiChang_XieYouFa,g);//卸油阀异常
  647. g1 = g;
  648. }
  649. #if 0
  650. if(Full_Oil_allinfo.Null_ID!=Full_Oil_allinfo.Null_ID_disp)
  651. {
  652. WrDwinCmd16(0x1012,(((Full_Oil_allinfo.Null_ID>>0)&0x01)==0x01?0:0x04));//油量 数值控制 1 0x04为油量
  653. WrDwinCmd16(0x1014,(((Full_Oil_allinfo.Null_ID>>1)&0x01)==0x01?0:0x04));// 2
  654. WrDwinCmd16(0x1016,(((Full_Oil_allinfo.Null_ID>>2)&0x01)==0x01?0:0x04));// 3
  655. WrDwinCmd16(0x1018,(((Full_Oil_allinfo.Null_ID>>3)&0x01)==0x01?0:0x04));//油量 4
  656. // WrDwinCmd16(0x101a,(((Full_Oil_allinfo.Null_ID>>4)&0x01)==0x01?0:0x04));// 5
  657. // WrDwinCmd16(0x101c,(((Full_Oil_allinfo.Null_ID>>5)&0x01)==0x01?0:0x04));// 6
  658. // WrDwinCmd16(0x101e,(((Full_Oil_allinfo.Null_ID>>6)&0x01)==0x01?0:0x04));//油量 7
  659. // WrDwinCmd16(0x1020,(((Full_Oil_allinfo.Null_ID>>7)&0x01)==0x01?0:0x04));// 8
  660. Full_Oil_allinfo.Null_ID_disp=Full_Oil_allinfo.Null_ID;
  661. }
  662. #endif
  663. if((Full_Oil_allinfo.Auto_sealedOK_ID ==0)&&(Full_Oil_allinfo.Break_sealing_Id ==0))//
  664. {//解封状态两把锁均不显示
  665. WrDwinCmd16(ADDR_DWIN_Seal_Lock,0xff);//锁不显示
  666. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,0xff);//锁开不显示
  667. }
  668. else
  669. { //显示施封图片--一把锁上的锁;该处逻辑是反的----某一位为0,则显示该位的锁
  670. WrDwinCmd16(ADDR_DWIN_Seal_Lock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁显示
  671. }
  672. if((Full_Oil_allinfo.Break_sealing_Id>0)&&(IO_Date.IO_unload_switch>0))
  673. {
  674. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Break_sealing_Id));//锁开显示
  675. //WrDwinCmd16(ADDR_DWIN_Seal_Lock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁显示
  676. // WrDwinCmd16(ADDR_DWIN_Seal_Lock,(Full_Oil_allinfo.Break_sealing_Id));//锁不显示 李伟添加 20211028 避免图标混乱
  677. //
  678. // FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID,(uint8_t)Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200428
  679. // FM25L16B_WriteByte(ADDR_Break_sealing_Id,Full_Oil_allinfo.Break_sealing_Id);//保存破封状态20200428
  680. // //WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁不显示 李伟添加 20211028 避免图标混乱
  681. }
  682. else
  683. {
  684. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Break_sealing_Id));//锁开bu显示
  685. }
  686. if(Full_Oil_allinfo.Car_state!=Full_Oil_allinfo.Car_state_disp)
  687. {
  688. if (Full_Oil_allinfo.Car_state == 0) //车辆状态OK
  689. WrDwinCmd16(ADDR_DWIN_Car_State, 0x00); //状态正常
  690. else if (Full_Oil_allinfo.Car_state == 1)
  691. WrDwinCmd16(ADDR_DWIN_Car_State, 0x02); //状态NOK
  692. else
  693. WrDwinCmd16(ADDR_DWIN_Car_State, 0x01); //状态破封
  694. Full_Oil_allinfo.Car_state_disp=Full_Oil_allinfo.Car_state;
  695. }
  696. if(Lcd_sleep_flag ==1)//屏幕休眠
  697. {
  698. WrDwinCmd16(0x0082,0x0000);//亮度调节0x0000~0x6464
  699. }
  700. else if(Lcd_sleep_flag==2)//唤醒休眠
  701. {
  702. Lcd_sleep_flag =3;
  703. //Jump_page_id(Run_mode_key_info.current_page);
  704. WrDwinCmd16(0x0082,0x3600);//亮度调节0x0000~0x646
  705. }
  706. }
  707. /******************************************************************************
  708. 装油动画
  709. 输入:mode 装油模式 sedata 装油的仓
  710. 输出返回:无
  711. ******************************************************************************/
  712. void FULL_oil_draw(uint8_t mode,uint8_t se_data)//装油动画
  713. {
  714. uint8_t i=0;
  715. if(se_data!=0)
  716. WrDwinCmd16(ADDR_DWIN_Operation_State,0x01);//罐仓状态 装油中
  717. else
  718. WrDwinCmd16(ADDR_DWIN_Operation_State,0x00);//罐仓状态 空闲中
  719. WrDwinCmd16(ADDR_DWIN_Loading_Oil_Mode,mode);//装油模式 上装1 下装0
  720. WrDwinCmd16(ADDR_DWIN_Num_Of_CangId,se_data);//油量仓12345678
  721. for(i=0;i<StoreNumber;i++)
  722. {
  723. WrDwinCmd16(ADDR_DWIN_UnLoading_Oil_Mode+i*2,(se_data&(0x01<<i))>>i);
  724. //HAL_Delay(10);//
  725. }
  726. // WrDwinCmd16(0x102a,0x01);//装油动画开始 1
  727. // WrDwinCmd16(0x102c,0x01);//装油动画开始 2
  728. // WrDwinCmd16(0x102e,0x01);//装油动画开始 3
  729. // WrDwinCmd16(0x1030,0x01);//装油动画开始 4
  730. // WrDwinCmd16(0x1032,0x01);//装油动画开始 5
  731. // WrDwinCmd16(0x1034,0x01);//装油动画开始 6
  732. // WrDwinCmd16(0x1036,0x01);//装油动画开始 7
  733. // WrDwinCmd16(0x1038,0x01);//装油动画开始 8
  734. }
  735. /******************************************************************************
  736. 卸油动画
  737. 输入: sedata 装油的仓
  738. 输出返回:无
  739. ******************************************************************************/
  740. void Off_loading_draw(uint8_t se_data)
  741. {
  742. uint8_t i=0;
  743. if(se_data!=0)
  744. WrDwinCmd16(ADDR_DWIN_Operation_State,0x01);//罐仓状态 卸油中
  745. else
  746. WrDwinCmd16(ADDR_DWIN_Operation_State,0x00);//罐仓状态 空闲中
  747. WrDwinCmd16(ADDR_DWIN_Num_Of_CangId,se_data);//卸量仓12345678
  748. for(i=0;i<StoreNumber;i++)
  749. {
  750. WrDwinCmd16(ADDR_DWIN_UnLoading_Oil_Mode+i*2,(se_data&(0x01<<i))>>i);
  751. //HAL_Delay(10);//
  752. }
  753. // WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
  754. // WrDwinCmd16(0x1026,0x01);//油量仓
  755. // WrDwinCmd16(0x1024,0x01);//罐仓状态 卸油中
  756. //
  757. // WrDwinCmd16(0x1012,0x00);//1仓油量 数值控制
  758. // WrDwinCmd16(0x102a,0x01);//卸油动画开始 1
  759. //
  760. // WrDwinCmd16(0x1014,0x00);//1仓油量 数值控制
  761. // WrDwinCmd16(0x102c,0x01);//卸油动画开始 2
  762. //
  763. // WrDwinCmd16(0x1016,0x00);//1仓油量 数值控制
  764. // WrDwinCmd16(0x102e,0x01);//卸油动画开始 3
  765. //
  766. // WrDwinCmd16(0x1018,0x00);//1仓油量 数值控制
  767. // WrDwinCmd16(0x1030,0x01);//卸油动画开始 4
  768. //
  769. //
  770. // WrDwinCmd16(0x101a,0x00);//1仓油量 数值控制
  771. // WrDwinCmd16(0x1032,0x01);//卸油动画开始 5
  772. //
  773. // WrDwinCmd16(0x101c,0x00);//1仓油量 数值控制
  774. // WrDwinCmd16(0x1034,0x01);//卸油动画开始 6
  775. //
  776. // WrDwinCmd16(0x101e,0x00);//1仓油量 数值控制
  777. // WrDwinCmd16(0x1036,0x01);//卸油动画开始 7
  778. //
  779. // WrDwinCmd16(0x1020,0x00);//1仓油量 数值控制
  780. // WrDwinCmd16(0x1038,0x01);//卸油动画开始 8
  781. /*
  782. 5A A5 07 82 0082 6420 07D0
  783. (10秒后进入背光,点击变亮,10000/5=2000 换算成16进制为07D0,范围00-64,100级亮度调节)
  784. */
  785. }
  786. void Read_REAL_Time(void)
  787. {
  788. /*
  789. 5A A5 0B 82 009C 5A A5 12 06 1B 15 15 15 (18年6月27号21时21分21秒,16进制数据) 读RTC:5A A5 04 83 0010 04
  790. */
  791. RdDwinData16(0x0010,4);
  792. }
  793. void Wakeup_lcd(void)
  794. {
  795. uint8_t PopWinCmdBuf[14]={0x5A ,0xA5 ,0x0B ,0x82 ,0x00 ,0xD4 ,0x5A ,0xA5 ,0x00 ,0x04 ,0x00 ,0x00 ,0x00 ,0x00};
  796. //5A A5 0B 82 00D4 5AA5 0004 00EE 008F
  797. UartWrite(&huart2,PopWinCmdBuf,14);
  798. }
  799. void Display_input_time(uint8_t flag,uint8_t *time)
  800. {
  801. uint8_t arr[6]={0};
  802. uint8_t i =0;
  803. for(i=0;i<6;i++)
  804. {
  805. //arr[i]=time[i*2]-0x30+time[i*2+1]-0x30;
  806. if(time[i*2]!=0x00)
  807. {
  808. if(time[i*2+1]!=0x00)
  809. arr[i] = (time[i*2]-0x30)*10+(time[i*2+1]-0x30);
  810. else
  811. arr[i] = time[i*2]-0x30;
  812. }
  813. else
  814. {
  815. break;
  816. }
  817. }
  818. WrDwinCmd16(0x104e,arr[0]);//年
  819. HAL_Delay(10);//
  820. WrDwinCmd16(0x1050,arr[1]);//月
  821. HAL_Delay(10);//
  822. WrDwinCmd16(0x1052,arr[2]);//日
  823. HAL_Delay(10);//
  824. WrDwinCmd16(0x1054,arr[3]);//时
  825. HAL_Delay(10);//
  826. WrDwinCmd16(0x1056,arr[4]);//分
  827. HAL_Delay(10);//
  828. WrDwinCmd16(0x1058,arr[5]);//秒
  829. HAL_Delay(10);//
  830. if(flag ==1)//发送时间确认修改
  831. {
  832. flag =0;
  833. Send_Time(arr);
  834. }
  835. }
  836. //time 要修改的时间
  837. void Send_Time(uint8_t * time)
  838. {
  839. // u8 i =0;
  840. memcpy(time_Set_Dwin+8,time,6);
  841. UartWrite(&huart2,time_Set_Dwin,14);
  842. /* delay_ms(100);*/
  843. }
  844. //flag 显示密码错误信息 pawd_num 密码个数
  845. //登录用户名 104a
  846. //登录密码 104c
  847. //密码错误 105a
  848. void Dispay_login(uint8_t flag,uint8_t pawd_num)
  849. {
  850. WrDwinCmd16(0x104a,0);
  851. HAL_Delay(10);//
  852. if(pawd_num<7)
  853. WrDwinCmd16(0x104c,pawd_num);
  854. HAL_Delay(10);//
  855. if(flag==1)
  856. WrDwinCmd16(0x105a,1);//密码错误提示
  857. else
  858. WrDwinCmd16(0x105a,0);
  859. }