Dwin.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038
  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. {
  405. Jump_page_id(1);//跳到主界面常规1仓
  406. Run_mode_key_info.Main_Page_id =1;//状态界面
  407. Run_mode_key_info.Full_oil_id = 10;//装油界面
  408. Run_mode_key_info.offLoading_oil_id =19;//卸油界面
  409. }break;
  410. case 2:
  411. {
  412. // if((StoreNumber == 1)&&Special_Stor)//跳到1仓2盖((Config_info_all.ManHole_Big_info&0x0f)==0x02)
  413. // {
  414. // Jump_page_id(2);
  415. // Run_mode_key_info.Main_Page_id =2;
  416. // Run_mode_key_info.Full_oil_id = 11;
  417. // Run_mode_key_info.offLoading_oil_id =20;
  418. // }
  419. // else //常规2仓
  420. // {
  421. Jump_page_id(3);
  422. Run_mode_key_info.Main_Page_id =3;
  423. Run_mode_key_info.Full_oil_id = 12;
  424. Run_mode_key_info.offLoading_oil_id =21;
  425. // }
  426. } break;
  427. case 3:
  428. {
  429. Jump_page_id(4);
  430. Run_mode_key_info.Main_Page_id =4;
  431. Run_mode_key_info.Full_oil_id = 13;
  432. Run_mode_key_info.offLoading_oil_id =22;
  433. } break;
  434. case 4:
  435. {
  436. Jump_page_id(5);
  437. Run_mode_key_info.Main_Page_id =5;
  438. Run_mode_key_info.Full_oil_id = 14;
  439. Run_mode_key_info.offLoading_oil_id =23;
  440. } break;
  441. case 5:
  442. {
  443. Jump_page_id(6);
  444. Run_mode_key_info.Main_Page_id =6;
  445. Run_mode_key_info.Full_oil_id = 15;
  446. Run_mode_key_info.offLoading_oil_id =24;
  447. } break;
  448. case 6:
  449. {
  450. Jump_page_id(7);
  451. Run_mode_key_info.Main_Page_id =7;
  452. Run_mode_key_info.Full_oil_id = 16;
  453. Run_mode_key_info.offLoading_oil_id =25;
  454. }break;
  455. case 7:
  456. {
  457. Jump_page_id(8);
  458. Run_mode_key_info.Main_Page_id =8;
  459. Run_mode_key_info.Full_oil_id = 17;
  460. Run_mode_key_info.offLoading_oil_id =26;
  461. }break;
  462. case 8:
  463. {
  464. Jump_page_id(9);
  465. Run_mode_key_info.Main_Page_id =9;
  466. Run_mode_key_info.Full_oil_id = 18;
  467. Run_mode_key_info.offLoading_oil_id =27;
  468. }break;
  469. default:break;
  470. }
  471. Run_mode_key_info.Liquid_id = 54;
  472. }
  473. /******************************************************************************
  474. 屏幕初始化
  475. 输入:无
  476. 输出返回:无
  477. ******************************************************************************/
  478. void Lcd_Init(void)
  479. {
  480. //初始化界面
  481. uint8_t i=0;
  482. WrDwinCmd16(ADDR_DWIN_CoverSmall,0x00);//人孔小盖关
  483. // HAL_Delay(15);
  484. WrDwinCmd16(ADDR_DWIN_CoverBig,0x00);//人孔大盖关
  485. // HAL_Delay(15);
  486. //WrDwinCmd16(ADDR_DWIN_HaiDiFa,0x00);//底阀关
  487. // HAL_Delay(15);
  488. for(i=0;i<StoreNumber;i++){
  489. WrDwinCmd16(ADDR_DWIN_UnloadVlave_Status+2*i, VALVESTATUS_CLOSE);
  490. WrDwinCmd16(ADDR_DWIN_SeaVlave_Status+2*i, VALVESTATUS_CLOSE);
  491. }
  492. //WrDwinCmd16(ADDR_DWIN_XieYouFa,0x00);//卸油阀关
  493. // HAL_Delay(15);
  494. WrDwinCmd16(ADDR_DWIN_Seal_Lock,0xff);//锁不显示--
  495. // HAL_Delay(15);
  496. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,0xff);//锁开不显示
  497. // HAL_Delay(15);
  498. WrDwinCmd16(ADDR_DWIN_Car_State,0x00);//状态正常
  499. // HAL_Delay(15);
  500. Go_homepage();//回到首页
  501. // //位控制
  502. // WrDwinCmd16(0x1000,0xff);//人孔小盖开 位控制
  503. // WrDwinCmd16(0x1003,0xff);//人孔大盖开
  504. // WrDwinCmd16(0x1006,0xff);//底阀开
  505. // WrDwinCmd16(0x1009,0xff);//卸油阀开
  506. // WrDwinCmd16(0x100c,0xFF);//锁不显示
  507. // WrDwinCmd16(0x100F,0x00);//锁开显示
  508. //
  509. // WrDwinCmd16(0x1000,0x00);//人孔小盖关
  510. // WrDwinCmd16(0x1003,0x00);//人孔大盖关
  511. // WrDwinCmd16(0x1006,0x00);//底阀关
  512. // WrDwinCmd16(0x1009,0x00);//卸油阀关
  513. //
  514. // WrDwinCmd16(0x100c,0x00);//锁显示
  515. // WrDwinCmd16(0x100F,0xff);//锁开不显示
  516. //
  517. // WrDwinCmd16(0x100c,0xff);//锁不显示
  518. // WrDwinCmd16(0x100F,0xff);//锁开不显示
  519. // WrDwinCmd16(0x1022,0x00);//状态正常
  520. //
  521. //
  522. // WrDwinCmd16(0x1012,0x04);//油量 数值控制
  523. // WrDwinCmd16(0x1014,0x01);//
  524. // WrDwinCmd16(0x1016,0x02);//
  525. // WrDwinCmd16(0x1018,0x03);//油量
  526. // WrDwinCmd16(0x101a,0x04);//
  527. // WrDwinCmd16(0x101c,0x02);//
  528. // WrDwinCmd16(0x101e,0x00);//油量
  529. // WrDwinCmd16(0x1020,0x01);//
  530. // WrDwinCmd16(0x1022,0x01);//状态异常
  531. //
  532. // //进入装油界面
  533. // WrDwinCmd32(0x0084,0x5A010000|18);
  534. //
  535. // WrDwinCmd16(0x1028,0x01);//装油模式 上装
  536. // WrDwinCmd16(0x1026,0x00);//油量仓
  537. // WrDwinCmd16(0x1024,0x01);//罐仓状态 装油中
  538. // WrDwinCmd16(0x102a,0x01);//装油动画开始 1
  539. // WrDwinCmd16(0x102c,0x01);//装油动画开始 2
  540. // WrDwinCmd16(0x102e,0x01);//装油动画开始 3
  541. // WrDwinCmd16(0x1030,0x01);//装油动画开始 4
  542. // WrDwinCmd16(0x1032,0x01);//装油动画开始 5
  543. // WrDwinCmd16(0x1034,0x01);//装油动画开始 6
  544. // WrDwinCmd16(0x1036,0x01);//装油动画开始 7
  545. // WrDwinCmd16(0x1038,0x01);//装油动画开始 8
  546. //
  547. //
  548. //
  549. // WrDwinCmd16(0x1028,0x00);//装油模式 下装
  550. // WrDwinCmd16(0x1026,0x08);//油量仓
  551. // WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
  552. // WrDwinCmd16(0x102a,0x00);//装油动画停止 1
  553. // WrDwinCmd16(0x102c,0x00);//装油动画停止 2
  554. // WrDwinCmd16(0x102e,0x00);//装油动画停止 3
  555. // WrDwinCmd16(0x1030,0x00);//装油动画停止 4
  556. // WrDwinCmd16(0x1032,0x00);//装油动画停止 5
  557. // WrDwinCmd16(0x1034,0x00);//装油动画停止 6
  558. // WrDwinCmd16(0x1036,0x00);//装油动画停止 7
  559. // WrDwinCmd16(0x1038,0x00);//装油动画停止 8
  560. //
  561. //
  562. //
  563. ////进入卸油界面
  564. // WrDwinCmd32(0x0084,0x5A010000|27);
  565. // WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
  566. // WrDwinCmd16(0x1026,0x01);//油量仓
  567. // WrDwinCmd16(0x1024,0x01);//罐仓状态 卸油中
  568. //
  569. // WrDwinCmd16(0x1012,0x00);//1仓油量 数值控制
  570. // WrDwinCmd16(0x102a,0x01);//卸油动画开始 1
  571. //
  572. // WrDwinCmd16(0x1014,0x00);//1仓油量 数值控制
  573. // WrDwinCmd16(0x102c,0x01);//卸油动画开始 2
  574. //
  575. // WrDwinCmd16(0x1016,0x00);//1仓油量 数值控制
  576. // WrDwinCmd16(0x102e,0x01);//卸油动画开始 3
  577. //
  578. // WrDwinCmd16(0x1018,0x00);//1仓油量 数值控制
  579. // WrDwinCmd16(0x1030,0x01);//卸油动画开始 4
  580. //
  581. //
  582. // WrDwinCmd16(0x101a,0x00);//1仓油量 数值控制
  583. // WrDwinCmd16(0x1032,0x01);//卸油动画开始 5
  584. //
  585. // WrDwinCmd16(0x101c,0x00);//1仓油量 数值控制
  586. // WrDwinCmd16(0x1034,0x01);//卸油动画开始 6
  587. //
  588. // WrDwinCmd16(0x101e,0x00);//1仓油量 数值控制
  589. // WrDwinCmd16(0x1036,0x01);//卸油动画开始 7
  590. //
  591. // WrDwinCmd16(0x1020,0x00);//1仓油量 数值控制
  592. // WrDwinCmd16(0x1038,0x01);//卸油动画开始 8
  593. // WrDwinCmd16(0x103a,0x01);//仓数显示
  594. // WrDwinCmd16(0x103c,0x01);//装油警告,弹窗
  595. // WrDwinCmd16(0x103e,0x01);//卸油油警告,弹窗
  596. // WrDwinCmd16(0x1040,0x01);//指纹识别,弹窗
  597. //卸油阀异常 1042
  598. //底阀异常 1044
  599. //人孔小盖异常 1046
  600. //人孔大盖异常 1048
  601. //登录用户名 104a
  602. //登录密码 104c
  603. //密码错误 104e
  604. //时间设置
  605. //年 104e
  606. //月 1050
  607. //日 1052
  608. //时 1054
  609. //分 1056
  610. //秒 1058
  611. }
  612. /******************************************************************************
  613. 显示车辆状态与阀门状态
  614. 输入:无
  615. 输出返回:无
  616. ******************************************************************************/
  617. //uint8_t a=0,b=0,c=0,d=0;
  618. uint8_t e1=0,f1=0;
  619. void Dispaly_CarAndValveState(void)
  620. {
  621. uint8_t e=0,f=0,g=0,h=0;
  622. uint8_t i=0;
  623. uint8_t SeaValue001=0x00;//8个海底阀的状态
  624. uint8_t UnloadingValve001=0x00;//8个泄油阀的状态
  625. uint8_t ManHole_CoverBig001=0x00;//8个人孔大盖的状态
  626. uint8_t ManHole_CoverSmall001=0x00;//8个人孔小盖的状态
  627. //uint8_t Unloaded001=0x00;//8个卸尽状态, 卸尽仓置1
  628. static uint8_t static_unloadvalve_state[8] ={VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK\
  629. ,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK};
  630. static uint8_t static_seavalve_state[8] ={VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK\
  631. ,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK};
  632. for(i=0;i<StoreNumber;i++)
  633. {
  634. //a|= (0x0001&(IO_Date.IO_state[0]>>i*4))<<i;
  635. //b|= (0x0001&(IO_Date.IO_state[0]>>(i*4+1)))<<i;
  636. //c|= (0x0001&(IO_Date.IO_state[0]>>(i*4+2)))<<i;
  637. //d|= (0x0001&(IO_Date.IO_state[0]>>(i*4+3)))<<i;
  638. e|= (0x0001&(IO_Date.IO_normalstate[0]>>i*4))<<i;
  639. f|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+1)))<<i;
  640. g|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+2)))<<i;
  641. h|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+3)))<<i;
  642. 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))
  643. WrDwinCmd16(ADDR_DWIN_Loading_Oil+(i*2),(((~IO_Date.IO_unload_switch>>i)&0x01)==0x01?0:00));//本仓在卸油或者装油,显示动画,不显示油量Ever_Oil_baseaddr
  644. else
  645. WrDwinCmd16(ADDR_DWIN_Loading_Oil+(i*2),(((~IO_Date.IO_unload_switch>>i)&0x01)==0x01?0x00:0x04));
  646. }
  647. // WrDwinCmd16(0x1000,a);//人孔小盖关
  648. // WrDwinCmd16(0x1003,b);//人孔大盖关
  649. // WrDwinCmd16(0x1006,d);//底阀关
  650. // WrDwinCmd16(0x1009,c);//卸油阀关
  651. PreProcess_GetValveStatus(&ManHole_CoverBig001, &ManHole_CoverSmall001, &SeaValue001, &UnloadingValve001);
  652. if(e1!=e)
  653. {
  654. WrDwinCmd16(ADDR_DWIN_StateYiChang_CoverSmall,e);//人孔小盖异常
  655. e1=e;
  656. }
  657. if(f1!=f)
  658. {
  659. WrDwinCmd16(ADDR_DWIN_StateYiChang_CoverBig,f);//人孔大盖异常
  660. f1=f;
  661. }
  662. #if 0
  663. if(h1!=h)
  664. {
  665. WrDwinCmd16(ADDR_DWIN_StateYiChang_HaiDiFa,h);//底阀异常
  666. h1 = h;
  667. }
  668. if(g1!=g)
  669. {
  670. WrDwinCmd16(ADDR_DWIN_StateYiChang_XieYouFa,g);//卸油阀异常
  671. g1 = g;
  672. }
  673. #else
  674. for(i=0;i<StoreNumber;i++)
  675. {
  676. uint8_t status = VALVESTATUS_CLOSE;
  677. if((g&(0x01<<i)) > 0){ //异常了
  678. status = VALVESTATUS_EXCEPTION;
  679. }else{
  680. if((UnloadingValve001&(0x01<<i)) == 0){ //关
  681. status = VALVESTATUS_CLOSE;
  682. }else{ //开
  683. status = VALVESTATUS_OPEN;
  684. }
  685. }
  686. if(static_unloadvalve_state[i] != status){
  687. WrDwinCmd16(ADDR_DWIN_UnloadVlave_Status+2*i, status);
  688. static_unloadvalve_state[i] = status;
  689. }
  690. //SealVlave
  691. if((h&(0x01<<i)) > 0){ //异常了
  692. status = VALVESTATUS_EXCEPTION;
  693. }else{
  694. if((SeaValue001&(0x01<<i)) == 0){ //关
  695. status = VALVESTATUS_CLOSE;
  696. }else{ //开
  697. status = VALVESTATUS_OPEN;
  698. }
  699. }
  700. if(static_seavalve_state[i] != status){
  701. WrDwinCmd16(ADDR_DWIN_SeaVlave_Status+2*i, status);
  702. static_seavalve_state[i] = status;
  703. }
  704. }
  705. #endif
  706. #if 0
  707. if(Full_Oil_allinfo.Null_ID!=Full_Oil_allinfo.Null_ID_disp)
  708. {
  709. WrDwinCmd16(0x1012,(((Full_Oil_allinfo.Null_ID>>0)&0x01)==0x01?0:0x04));//油量 数值控制 1 0x04为油量
  710. WrDwinCmd16(0x1014,(((Full_Oil_allinfo.Null_ID>>1)&0x01)==0x01?0:0x04));// 2
  711. WrDwinCmd16(0x1016,(((Full_Oil_allinfo.Null_ID>>2)&0x01)==0x01?0:0x04));// 3
  712. WrDwinCmd16(0x1018,(((Full_Oil_allinfo.Null_ID>>3)&0x01)==0x01?0:0x04));//油量 4
  713. // WrDwinCmd16(0x101a,(((Full_Oil_allinfo.Null_ID>>4)&0x01)==0x01?0:0x04));// 5
  714. // WrDwinCmd16(0x101c,(((Full_Oil_allinfo.Null_ID>>5)&0x01)==0x01?0:0x04));// 6
  715. // WrDwinCmd16(0x101e,(((Full_Oil_allinfo.Null_ID>>6)&0x01)==0x01?0:0x04));//油量 7
  716. // WrDwinCmd16(0x1020,(((Full_Oil_allinfo.Null_ID>>7)&0x01)==0x01?0:0x04));// 8
  717. Full_Oil_allinfo.Null_ID_disp=Full_Oil_allinfo.Null_ID;
  718. }
  719. #endif
  720. if((Full_Oil_allinfo.Auto_sealedOK_ID ==0)&&(Full_Oil_allinfo.Break_sealing_Id ==0))//
  721. {//解封状态两把锁均不显示
  722. WrDwinCmd16(ADDR_DWIN_Seal_Lock,0xff);//锁不显示
  723. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,0xff);//锁开不显示
  724. }
  725. else
  726. { //显示施封图片--一把锁上的锁;该处逻辑是反的----某一位为0,则显示该位的锁
  727. WrDwinCmd16(ADDR_DWIN_Seal_Lock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁显示
  728. }
  729. if((Full_Oil_allinfo.Break_sealing_Id>0)&&(IO_Date.IO_unload_switch>0))
  730. {
  731. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Break_sealing_Id));//锁开显示
  732. //WrDwinCmd16(ADDR_DWIN_Seal_Lock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁显示
  733. // WrDwinCmd16(ADDR_DWIN_Seal_Lock,(Full_Oil_allinfo.Break_sealing_Id));//锁不显示 李伟添加 20211028 避免图标混乱
  734. //
  735. // FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID,(uint8_t)Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200428
  736. // FM25L16B_WriteByte(ADDR_Break_sealing_Id,Full_Oil_allinfo.Break_sealing_Id);//保存破封状态20200428
  737. // //WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁不显示 李伟添加 20211028 避免图标混乱
  738. }
  739. else
  740. {
  741. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Break_sealing_Id));//锁开bu显示
  742. }
  743. if(Full_Oil_allinfo.Car_state!=Full_Oil_allinfo.Car_state_disp)
  744. {
  745. if (Full_Oil_allinfo.Car_state == 0) //车辆状态OK
  746. WrDwinCmd16(ADDR_DWIN_Car_State, 0x00); //状态正常
  747. else if (Full_Oil_allinfo.Car_state == 1)
  748. WrDwinCmd16(ADDR_DWIN_Car_State, 0x02); //状态NOK
  749. else
  750. WrDwinCmd16(ADDR_DWIN_Car_State, 0x01); //状态破封
  751. Full_Oil_allinfo.Car_state_disp=Full_Oil_allinfo.Car_state;
  752. }
  753. if(Lcd_sleep_flag ==1)//屏幕休眠
  754. {
  755. WrDwinCmd16(0x0082,0x0000);//亮度调节0x0000~0x6464
  756. }
  757. else if(Lcd_sleep_flag==2)//唤醒休眠
  758. {
  759. Lcd_sleep_flag =3;
  760. //Jump_page_id(Run_mode_key_info.current_page);
  761. WrDwinCmd16(0x0082,0x3600);//亮度调节0x0000~0x646
  762. }
  763. }
  764. /******************************************************************************
  765. 装油动画
  766. 输入:mode 装油模式 sedata 装油的仓
  767. 输出返回:无
  768. ******************************************************************************/
  769. void FULL_oil_draw(uint8_t mode,uint8_t se_data)//装油动画
  770. {
  771. uint8_t i=0;
  772. if(se_data!=0)
  773. WrDwinCmd16(ADDR_DWIN_Operation_State,0x01);//罐仓状态 装油中
  774. else
  775. WrDwinCmd16(ADDR_DWIN_Operation_State,0x00);//罐仓状态 空闲中
  776. WrDwinCmd16(ADDR_DWIN_Loading_Oil_Mode,mode);//装油模式 上装1 下装0
  777. WrDwinCmd16(ADDR_DWIN_Num_Of_CangId,se_data);//油量仓12345678
  778. for(i=0;i<StoreNumber;i++)
  779. {
  780. WrDwinCmd16(ADDR_DWIN_UnLoading_Oil_Mode+i*2,(se_data&(0x01<<i))>>i);
  781. //HAL_Delay(10);//
  782. }
  783. // WrDwinCmd16(0x102a,0x01);//装油动画开始 1
  784. // WrDwinCmd16(0x102c,0x01);//装油动画开始 2
  785. // WrDwinCmd16(0x102e,0x01);//装油动画开始 3
  786. // WrDwinCmd16(0x1030,0x01);//装油动画开始 4
  787. // WrDwinCmd16(0x1032,0x01);//装油动画开始 5
  788. // WrDwinCmd16(0x1034,0x01);//装油动画开始 6
  789. // WrDwinCmd16(0x1036,0x01);//装油动画开始 7
  790. // WrDwinCmd16(0x1038,0x01);//装油动画开始 8
  791. }
  792. /******************************************************************************
  793. 卸油动画
  794. 输入: sedata 装油的仓
  795. 输出返回:无
  796. ******************************************************************************/
  797. void Off_loading_draw(uint8_t se_data)
  798. {
  799. uint8_t i=0;
  800. if(se_data!=0)
  801. WrDwinCmd16(ADDR_DWIN_Operation_State,0x01);//罐仓状态 卸油中
  802. else
  803. WrDwinCmd16(ADDR_DWIN_Operation_State,0x00);//罐仓状态 空闲中
  804. WrDwinCmd16(ADDR_DWIN_Num_Of_CangId,se_data);//卸量仓12345678
  805. for(i=0;i<StoreNumber;i++)
  806. {
  807. WrDwinCmd16(ADDR_DWIN_UnLoading_Oil_Mode+i*2,(se_data&(0x01<<i))>>i);
  808. //HAL_Delay(10);//
  809. }
  810. // WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
  811. // WrDwinCmd16(0x1026,0x01);//油量仓
  812. // WrDwinCmd16(0x1024,0x01);//罐仓状态 卸油中
  813. //
  814. // WrDwinCmd16(0x1012,0x00);//1仓油量 数值控制
  815. // WrDwinCmd16(0x102a,0x01);//卸油动画开始 1
  816. //
  817. // WrDwinCmd16(0x1014,0x00);//1仓油量 数值控制
  818. // WrDwinCmd16(0x102c,0x01);//卸油动画开始 2
  819. //
  820. // WrDwinCmd16(0x1016,0x00);//1仓油量 数值控制
  821. // WrDwinCmd16(0x102e,0x01);//卸油动画开始 3
  822. //
  823. // WrDwinCmd16(0x1018,0x00);//1仓油量 数值控制
  824. // WrDwinCmd16(0x1030,0x01);//卸油动画开始 4
  825. //
  826. //
  827. // WrDwinCmd16(0x101a,0x00);//1仓油量 数值控制
  828. // WrDwinCmd16(0x1032,0x01);//卸油动画开始 5
  829. //
  830. // WrDwinCmd16(0x101c,0x00);//1仓油量 数值控制
  831. // WrDwinCmd16(0x1034,0x01);//卸油动画开始 6
  832. //
  833. // WrDwinCmd16(0x101e,0x00);//1仓油量 数值控制
  834. // WrDwinCmd16(0x1036,0x01);//卸油动画开始 7
  835. //
  836. // WrDwinCmd16(0x1020,0x00);//1仓油量 数值控制
  837. // WrDwinCmd16(0x1038,0x01);//卸油动画开始 8
  838. /*
  839. 5A A5 07 82 0082 6420 07D0
  840. (10秒后进入背光,点击变亮,10000/5=2000 换算成16进制为07D0,范围00-64,100级亮度调节)
  841. */
  842. }
  843. void Read_REAL_Time(void)
  844. {
  845. /*
  846. 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
  847. */
  848. RdDwinData16(0x0010,4);
  849. }
  850. void Wakeup_lcd(void)
  851. {
  852. uint8_t PopWinCmdBuf[14]={0x5A ,0xA5 ,0x0B ,0x82 ,0x00 ,0xD4 ,0x5A ,0xA5 ,0x00 ,0x04 ,0x00 ,0x00 ,0x00 ,0x00};
  853. //5A A5 0B 82 00D4 5AA5 0004 00EE 008F
  854. UartWrite(&huart2,PopWinCmdBuf,14);
  855. }
  856. void Display_input_time(uint8_t flag,uint8_t *time)
  857. {
  858. uint8_t arr[6]={0};
  859. uint8_t i =0;
  860. for(i=0;i<6;i++)
  861. {
  862. //arr[i]=time[i*2]-0x30+time[i*2+1]-0x30;
  863. if(time[i*2]!=0x00)
  864. {
  865. if(time[i*2+1]!=0x00)
  866. arr[i] = (time[i*2]-0x30)*10+(time[i*2+1]-0x30);
  867. else
  868. arr[i] = time[i*2]-0x30;
  869. }
  870. else
  871. {
  872. break;
  873. }
  874. }
  875. WrDwinCmd16(0x104e,arr[0]);//年
  876. HAL_Delay(10);//
  877. WrDwinCmd16(0x1050,arr[1]);//月
  878. HAL_Delay(10);//
  879. WrDwinCmd16(0x1052,arr[2]);//日
  880. HAL_Delay(10);//
  881. WrDwinCmd16(0x1054,arr[3]);//时
  882. HAL_Delay(10);//
  883. WrDwinCmd16(0x1056,arr[4]);//分
  884. HAL_Delay(10);//
  885. WrDwinCmd16(0x1058,arr[5]);//秒
  886. HAL_Delay(10);//
  887. if(flag ==1)//发送时间确认修改
  888. {
  889. flag =0;
  890. Send_Time(arr);
  891. }
  892. }
  893. //time 要修改的时间
  894. void Send_Time(uint8_t * time)
  895. {
  896. // u8 i =0;
  897. memcpy(time_Set_Dwin+8,time,6);
  898. UartWrite(&huart2,time_Set_Dwin,14);
  899. /* delay_ms(100);*/
  900. }
  901. //flag 显示密码错误信息 pawd_num 密码个数
  902. //登录用户名 104a
  903. //登录密码 104c
  904. //密码错误 105a
  905. void Dispay_login(uint8_t flag,uint8_t pawd_num)
  906. {
  907. WrDwinCmd16(0x104a,0);
  908. HAL_Delay(10);//
  909. if(pawd_num<7)
  910. WrDwinCmd16(0x104c,pawd_num);
  911. HAL_Delay(10);//
  912. if(flag==1)
  913. WrDwinCmd16(0x105a,1);//密码错误提示
  914. else
  915. WrDwinCmd16(0x105a,0);
  916. }