masterslave.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. #include "masterslave.h"
  2. #include "up_4g.h"
  3. #include "air780e.h"
  4. #include "ota_update.h"
  5. #include "taskOpt.h"
  6. uint32_t _msgid = 0;
  7. void slave_send_data_to_uart(uint8_t type1, uint16_t type2,uint8_t *data,uint8_t len)
  8. {
  9. MasterSlave *msg = NULL;
  10. uint16_t crc ;
  11. uint8_t sendlen;
  12. msg = (MasterSlave*)usart485TX_Buffer;
  13. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  14. msg->start = 0xFEFE;
  15. msg->msgId = _msgid++;
  16. msg->proVer = 2;
  17. msg->msgType1 = type1;
  18. msg->msgType2 = type2;
  19. memcpy(msg->comInfo.info,data,len);
  20. sendlen = COMM_HEAD_LEN + len;
  21. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  22. crc = _crc16_get(usart485TX_Buffer,sendlen);
  23. msg->comInfo.info[len] = crc &0xff;
  24. msg->comInfo.info[len+1] = (crc>>8) &0xff;
  25. data_dump("send to 485:",usart485TX_Buffer,sendlen+2);
  26. usart_tx_dma_send(UART3,usart485TX_Buffer,sendlen+2);
  27. }
  28. void master_read_status(uint16_t cmd,DevMsg *dev)
  29. {
  30. MasterSlave *msg = NULL;
  31. uint16_t crc;
  32. uint8_t sendlen;
  33. msg = (MasterSlave*)usart485TX_Buffer;
  34. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  35. msg->start = 0xFEFE;
  36. msg->msgId = _msgid++;
  37. msg->proVer = 2;
  38. msg->msgType1 = 0x02;
  39. msg->msgType2 = cmd;
  40. msg->comInfo.statusMsg.devTypeM = dev->devType;
  41. msg->comInfo.statusMsg.devSnM = dev->devSn;
  42. msg->comInfo.statusMsg.devTypeS = dev->devTypeS;
  43. msg->comInfo.statusMsg.devSnS = dev->devSnS;
  44. sendlen = STATUS_COMM_LEN + COMM_HEAD_LEN;
  45. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  46. crc = _crc16_get(usart485TX_Buffer,sendlen);
  47. msg->comInfo.statusMsg.info[0] = crc &0xff;
  48. msg->comInfo.statusMsg.info[1] = (crc>>8) &0xff;
  49. data_dump("send to 485:",usart485TX_Buffer,sendlen+2);
  50. usart_tx_dma_send(UART3,usart485TX_Buffer,sendlen+2);
  51. //fifo_write(&g_txfifo,usart485TX_Buffer,sendlen+2);
  52. }
  53. void master_read_data_0x1061(DevMsg *dev,uint32_t recordId)
  54. {
  55. MasterSlave *msg = NULL;
  56. uint16_t crc;
  57. uint8_t sendlen;
  58. msg = (MasterSlave*)usart485TX_Buffer;
  59. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  60. msg->start = 0xFEFE;
  61. msg->msgId = _msgid++;
  62. msg->proVer = 2;
  63. msg->msgType1 = 0x03;
  64. msg->msgType2 = 0x1061;
  65. msg->comInfo.da1061.devTypeM = dev->devType;
  66. msg->comInfo.da1061.devSnM = dev->devSn;
  67. msg->comInfo.da1061.devTypeS = dev->devTypeS;
  68. msg->comInfo.da1061.devSnS = dev->devSnS;
  69. msg->comInfo.da1061.recordId = recordId;
  70. sendlen = DATA_1061_LEN + COMM_HEAD_LEN;
  71. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  72. crc = _crc16_get(usart485TX_Buffer,sendlen);
  73. msg->comInfo.da1061.info[0] = crc &0xff;
  74. msg->comInfo.da1061.info[1] = (crc>>8) &0xff;
  75. data_dump("send:",usart485TX_Buffer,sendlen+2);
  76. usart_tx_dma_send(UART3,usart485TX_Buffer,sendlen+2);
  77. }
  78. void master_read_data_0x1030(DevMsg *dev)
  79. {
  80. MasterSlave *msg = NULL;
  81. uint16_t crc;
  82. uint8_t sendlen;
  83. msg = (MasterSlave*)usart485TX_Buffer;
  84. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  85. msg->start = 0xFEFE;
  86. msg->msgId = _msgid++;
  87. msg->proVer = 2;
  88. msg->msgType1 = 0x01;
  89. msg->msgType2 = 0x1030;
  90. msg->comInfo.sysMsg.devTypeM = dev->devType;
  91. msg->comInfo.sysMsg.devSnM = dev->devSn;
  92. msg->comInfo.sysMsg.devTypeS = dev->devTypeS;
  93. msg->comInfo.sysMsg.devSnS = dev->devSnS;
  94. msg->comInfo.sysMsg.sDa.s0x1030.reserve = 0x00;
  95. sendlen = SYSTEM_1030_LEN + COMM_HEAD_LEN;
  96. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  97. crc = _crc16_get(usart485TX_Buffer,sendlen);
  98. msg->comInfo.sysMsg.sDa.s0x1030.info[0] = crc &0xff;
  99. msg->comInfo.sysMsg.sDa.s0x1030.info[1] = (crc>>8) &0xff;
  100. //data_dump("send:",usart485TX_Buffer,sendlen+2);
  101. usart_tx_dma_send(UART3,usart485TX_Buffer,sendlen+2);
  102. }
  103. void master_read_log_0x1063(DevMsg *dev)
  104. {
  105. MasterSlave *msg = NULL;
  106. uint16_t crc;
  107. uint8_t sendlen;
  108. msg = (MasterSlave*)usart485TX_Buffer;
  109. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  110. msg->start = 0xFEFE;
  111. msg->msgId = _msgid++;
  112. msg->proVer = 2;
  113. msg->msgType1 = 0x10;
  114. msg->msgType2 = 0x1063;
  115. msg->comInfo.lg1063.devTypeM = dev->devType;
  116. msg->comInfo.lg1063.devSnM = dev->devSn;
  117. msg->comInfo.lg1063.devTypeS = dev->devTypeS;
  118. msg->comInfo.lg1063.devSnS = dev->devSnS;
  119. msg->comInfo.lg1063.logType = 0x03;
  120. msg->comInfo.lg1063.time = 0x00;
  121. msg->comInfo.lg1063.interval = 0x00;
  122. msg->comInfo.lg1063.reserve = 0x00;
  123. sendlen = LOG_1063_LEN + COMM_HEAD_LEN;
  124. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  125. crc = _crc16_get(usart485TX_Buffer,sendlen);
  126. msg->comInfo.lg1063.info[0] = crc &0xff;
  127. msg->comInfo.lg1063.info[1] = (crc>>8) &0xff;
  128. data_dump("send:",usart485TX_Buffer,sendlen+2);
  129. usart_tx_dma_send(UART3,usart485TX_Buffer,sendlen+2);
  130. }
  131. //void master_get_self_0x2030(void)
  132. //{
  133. // uint8_t sendbuff[128],len;
  134. // memset(sendbuff,0,128);
  135. // up_system_cmd_0x2030(sendbuff,&g_7egDa[1],(uint8_t*)&g_table1027.confFileNum[0],&len);
  136. // add_data_to_4G_txfifo(sendbuff,len,0x01,0x2030);
  137. //}
  138. static void slave_get_status_0x1002(uint8_t *buf,uint8_t *len,uint16_t devtypeM,uint32_t devSnM,uint8_t bself)
  139. {
  140. status0x2002 *msg = (status0x2002*)buf;
  141. if(bself == SLAVE_OFFLINE){
  142. msg->devTypeM = g_devMsg.devType;
  143. msg->devSnM = g_devMsg.devSn;
  144. msg->devTypeS = devtypeM;
  145. msg->devSnS = devSnM;
  146. msg->identity = IDENTITY_SLAVE;
  147. msg->identity = g_iDentity;
  148. if(IDENTITY_MASTER == g_iDentity){
  149. memcpy(msg->cfgFileNo,g_table1027.confFileNum,8);
  150. msg->bHave4G = g_devMsg.bHave4G;
  151. }
  152. else{
  153. memset(msg->cfgFileNo,0,8);
  154. msg->bHave4G = 0;
  155. }
  156. msg->status = 0;
  157. }
  158. else {
  159. msg->devTypeM = devtypeM;
  160. msg->devSnM = devSnM;
  161. msg->devTypeS = g_devMsg.devType;
  162. msg->devSnS = g_devMsg.devSn;
  163. memcpy(msg->cfgFileNo,g_table1027.confFileNum,8);
  164. msg->identity = g_iDentity;
  165. msg->bHave4G = g_devMsg.bHave4G;
  166. msg->status = 1;
  167. msg->lastResetType = g_devResetMsg.resetflag;
  168. msg->resetNum = g_devResetMsg.resetNum;
  169. msg->runTime = Get_SysTick()/1000;
  170. msg->voltage = 0x00;
  171. msg->temperature = 0x00;
  172. msg->rssi4G = g_4gMsg.dBm + 1000;
  173. msg->snr4G = 0x00;
  174. msg->tempStamp = g_taskRunDa.timetamp;
  175. msg->reserve = 0x00;
  176. }
  177. *len = sizeof(status0x2002);
  178. return;
  179. }
  180. static void slave_get_status_0x1001(uint8_t *buf,uint8_t *len,uint16_t devtypeM,uint32_t devSnM)
  181. {
  182. status0x2001 *msg = (status0x2001*)buf;
  183. msg->devTypeM = devtypeM;
  184. msg->devSnM = devSnM;
  185. msg->devTypeS = g_devMsg.devType;
  186. msg->devSnS = g_devMsg.devSn;
  187. msg->upCode = 0;
  188. msg->bootVer = g_devAppVer.bootVer;
  189. msg->ptVer = g_devAppVer.ptVer;
  190. msg->appVer = g_devAppVer.app1Ver;
  191. memcpy(msg->uuid,g_devfirmMsg.uuid,12);
  192. memcpy(msg->imei,g_4gMsg.imei,15);
  193. memcpy(msg->iccid,g_4gMsg.iccid,20);
  194. msg->reserve = 0x00;
  195. *len = sizeof(status0x2001);
  196. return;
  197. }
  198. void slave_get_update_0x1001(uint8_t *outdata, uint8_t *len,uint16_t taskId)
  199. {
  200. update0x2001 *msg = (update0x2001*)outdata;
  201. msg->devType = g_devMsg.devType;
  202. msg->devSn = g_devMsg.devSn;
  203. msg->appVer = 0x1001234;
  204. msg->taskId = taskId;
  205. msg->reserve = 0x00;
  206. *len = sizeof(update0x2001);
  207. return;
  208. }
  209. void master_add_status_to_4g_txfifo(uint8_t type1,uint16_t type2,uint16_t devType,uint32_t devSn, uint8_t bself)
  210. {
  211. uint8_t sendbuff[128],sendlen;
  212. memset(sendbuff,0,128);
  213. if(0x2002 == type2) slave_get_status_0x1002(sendbuff,&sendlen,devType,devSn,bself);
  214. else slave_get_status_0x1001(sendbuff,&sendlen,devType,devSn);
  215. add_data_to_4G_txfifo(sendbuff,sendlen,type1,type2);
  216. }
  217. void slave_send_status_comm(uint16_t cmd,uint8_t *data,uint8_t len)
  218. {
  219. MasterSlave *msg = NULL;
  220. uint16_t crc ;
  221. uint8_t sendlen;
  222. msg = (MasterSlave*)usart485TX_Buffer;
  223. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  224. msg->start = 0xFEFE;
  225. msg->msgId = _msgid++;
  226. msg->proVer = 2;
  227. msg->msgType1 = 0x02;
  228. msg->msgType2 = cmd;
  229. memcpy(msg->comInfo.info,data,len);
  230. sendlen = COMM_HEAD_LEN + len;
  231. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  232. crc = _crc16_get(usart485TX_Buffer,sendlen);
  233. msg->comInfo.info[len] = crc &0xff;
  234. msg->comInfo.info[len+1] = (crc>>8) &0xff;
  235. data_dump("send:",usart485TX_Buffer,sendlen+2);
  236. usart_tx_dma_send(UART3,usart485TX_Buffer,sendlen+2);
  237. }
  238. void slave_send_data_0x2061(uint16_t devType, uint32_t devSn,uint8_t *data, uint8_t len,uint8_t bnew)
  239. {
  240. MasterSlave *msg = NULL;
  241. uint16_t crc ;
  242. uint8_t sendlen;
  243. msg = (MasterSlave*)usart485TX_Buffer;
  244. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  245. msg->start = 0xFEFE;
  246. msg->msgId = _msgid++;
  247. msg->proVer = 2;
  248. msg->msgType1 = 0x03;
  249. msg->msgType2 = 0x2061;
  250. msg->comInfo.da2061.devTypeM = devType;
  251. msg->comInfo.da2061.devSnM = devSn;
  252. msg->comInfo.da2061.devTypeS = g_devMsg.devType;
  253. msg->comInfo.da2061.devSnS = g_devMsg.devSn;
  254. msg->comInfo.da2061.bnewflag = bnew;
  255. msg->comInfo.da2061.palen = len;
  256. memcpy(msg->comInfo.da2061.info,data,len);
  257. sendlen = DATA_2061_LEN + COMM_HEAD_LEN + len;
  258. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  259. crc = _crc16_get(usart485TX_Buffer,sendlen);
  260. msg->comInfo.da2061.info[len] = crc &0xff;
  261. msg->comInfo.da2061.info[len+1] = (crc>>8) &0xff;
  262. data_dump("send:",usart485TX_Buffer,sendlen+2);
  263. usart_tx_dma_send(UART3,usart485TX_Buffer,sendlen+2);
  264. }
  265. void slave_send_data_0x2030(uint16_t devType, uint32_t devSn,uint8_t *data,uint8_t *cfigNo, uint8_t len)
  266. {
  267. MasterSlave *msg = NULL;
  268. uint16_t crc ;
  269. uint8_t sendlen;
  270. msg = (MasterSlave*)usart485TX_Buffer;
  271. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  272. msg->start = 0xFEFE;
  273. msg->msgId = _msgid++;
  274. msg->proVer = 2;
  275. msg->msgType1 = 0x01;
  276. msg->msgType2 = 0x2030;
  277. msg->comInfo.sysMsg.devTypeM = devType;
  278. msg->comInfo.sysMsg.devSnM = devSn;
  279. msg->comInfo.sysMsg.devTypeS = g_devMsg.devType;
  280. msg->comInfo.sysMsg.devSnS = g_devMsg.devSn;
  281. memcpy(msg->comInfo.sysMsg.sDa.s0x2030.configfileNo,cfigNo,8);// = bnew;
  282. msg->comInfo.sysMsg.sDa.s0x2030.reserve = 0;
  283. memcpy(msg->comInfo.info+SYSTEM_2030_LEN,data,len); // 24为2030的头
  284. sendlen = SYSTEM_2030_LEN + COMM_HEAD_LEN + len;
  285. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  286. crc = _crc16_get(usart485TX_Buffer,sendlen);
  287. msg->comInfo.info[len+SYSTEM_2030_LEN] = crc &0xff;
  288. msg->comInfo.info[len+1+SYSTEM_2030_LEN] = (crc>>8) &0xff;
  289. data_dump("send:",usart485TX_Buffer,sendlen+2);
  290. usart_tx_dma_send(UART3,usart485TX_Buffer,sendlen+2);
  291. }
  292. /*------------------------------------------- 主解析从的指令 并存储到4G 的发送fifo中---------------*/
  293. /*----------------------------------------------------------------------
  294. * 直接透传 状态指令 0x2002 0x2001
  295. * --------------------------------------------------------------------*/
  296. void master_analysis_status_cmd(uint8_t *data, uint8_t size)
  297. {
  298. fifo_write(&g_4Gtxfifo,data,size); // 直接透传
  299. //END_02_0x2002:
  300. timeout_stop(&g_uart485.time);
  301. return;
  302. }
  303. uint8_t master_check_dev_table(uint16_t devType, uint32_t devSn)
  304. {
  305. volatile uint8_t i = 0;
  306. uint8_t flag;
  307. flag = 0;
  308. g_runNode.slaveNum = (g_runNode.slaveNum>NODE_MAX_SIZE ? NODE_MAX_SIZE:g_runNode.slaveNum);
  309. for(i=0;i<g_runNode.slaveNum;i++){
  310. if((devType== g_runNode.nodMsg[i].devType) \
  311. && (devSn == g_runNode.nodMsg[i].devSn)) {
  312. flag = 1;
  313. break;
  314. }
  315. }
  316. if(flag == 1){
  317. g_runNode.nodMsg[i].readCount = 0;
  318. g_runNode.nodMsg[i].status = 1;
  319. return i;
  320. }
  321. else
  322. return 0xFF;
  323. }
  324. void slave_system_cmd_0x1026(uint8_t *data)
  325. {
  326. systemCmd *msg = (systemCmd*)(data);
  327. if((msg->sDa.s0x1026.appointDevModel == g_devMsg.devType)) {
  328. if((0xFFFFFFFF == msg->devSnS) ||(msg->devSnS == g_devMsg.devSn) ){ //
  329. exti_interrupt_flag_clear(g_extimsg.extiLine); /* 清除中断 */
  330. exti_interrupt_enable(g_extimsg.extiLine);
  331. epprom_init_com_config();
  332. epprom_write_com_config((uint8_t*)(&msg->sDa.s0x1026.priceInuseCout),sizeof(system0x1026)-6);
  333. epprom_read_com_config();
  334. exti_gpio_init();
  335. }
  336. }
  337. }
  338. /*----------------------------------------------------------------------------------
  339. * 解析系统类 0x01
  340. * ---------------------------------------------------------------------------------*/
  341. void analysis_cmd_system(uint16_t cmd, uint8_t *data,uint8_t len)
  342. {
  343. MasterSlave * pmsg = (MasterSlave*)data;
  344. commInfo_t *msg = &(pmsg->comInfo);
  345. if(0x2000 == (cmd&0x2000)){
  346. data_dump("收到数据",data,len);
  347. switch(cmd){
  348. case 0x2030: // 8段码数据上报
  349. if((msg->sysMsg.devSnM == g_devMsg.devSn) && (msg->sysMsg.devTypeM== g_devMsg.devType)) {
  350. fifo_write(&g_4Gtxfifo,data,len); // 直接透传
  351. timeout_stop(&g_uart485.time);
  352. break;
  353. }
  354. }
  355. }
  356. }
  357. /*----------------------------------------------------------------------------------
  358. * 解析状态类 0x02
  359. * ---------------------------------------------------------------------------------*/
  360. void analysis_cmd_status(uint16_t cmd, uint8_t *data,uint8_t len)
  361. {
  362. uint8_t sendbuff[128], sendlen,sIndex;
  363. MasterSlave *msg = (MasterSlave*)data;
  364. if(0x2000 == (cmd&0x2000)){
  365. data_dump("收到数据",data,len);
  366. sIndex = master_check_dev_table(msg->comInfo.statusMsg.devTypeS,msg->comInfo.statusMsg.devSnS);
  367. if(sIndex == 0xFF) return;
  368. switch(cmd){
  369. case 0x2002:case 0x2001: // 实时状态信息 // 固件信息
  370. master_analysis_status_cmd(data,len);
  371. break;
  372. }
  373. }
  374. else if(0x1000 == (cmd&0x1000)) { // 从设备处理
  375. if(0==check_dev_type_sn(msg->comInfo.statusMsg.devTypeS,msg->comInfo.statusMsg.devSnS)) return;
  376. data_dump("收到数据",data,len);
  377. memset(sendbuff,0,128);
  378. switch(cmd){
  379. case 0x1002: // 实时状态
  380. slave_get_status_0x1002(sendbuff,&sendlen,msg->comInfo.statusMsg.devTypeM,msg->comInfo.statusMsg.devSnM,SELF_STATUS);
  381. slave_send_status_comm(0x2002,sendbuff,sendlen);
  382. break;
  383. case 0x1001: // 固件信息
  384. slave_get_status_0x1001(sendbuff,&sendlen,msg->comInfo.statusMsg.devTypeM,msg->comInfo.statusMsg.devSnM);
  385. slave_send_status_comm(0x2001,sendbuff,sendlen);
  386. break;
  387. }
  388. }
  389. }
  390. /*----------------------------------------------------------------------------------
  391. * 解析数据类 0x03
  392. * ---------------------------------------------------------------------------------*/
  393. void analysis_cmd_data(uint16_t cmd,uint8_t *data,uint8_t len)
  394. {
  395. MasterSlave *msg = (MasterSlave*)data;
  396. uint16_t sIndex = 0xFF;
  397. uint8_t ret;
  398. switch (cmd) {
  399. case 0x1061:
  400. // if(0==check_dev_type_sn(msg->comInfo.da1061.devTypeS,msg->comInfo.da1061.devSnS)) break;
  401. // data_dump("收到数据",data,len);
  402. // if(0 == msg->comInfo.da1061.recordId) {
  403. //// slave_read_flash_data_to485(msg->comInfo.da1061.devTypeM,msg->comInfo.da1061.devSnM);
  404. // }
  405. // else if(0xFFFFFFFF == msg->comInfo.da1061.recordId){ // 主设备按键读取
  406. //// save_display_data_to_flash();
  407. //// slave_read_flash_data_to485(msg->comInfo.da1061.devTypeM,msg->comInfo.da1061.devSnM);
  408. // }
  409. // else { // 服务器读取
  410. // ret = xsp_check_point_record(msg->comInfo.da1061.recordId,g_xspReDa.data);
  411. // if(1 == ret ){ // 说明已经找到的记录
  412. // slave_send_data_0x2061(msg->comInfo.da1061.devTypeM,msg->comInfo.da1061.devSnM,g_xspReDa.data,64,2);
  413. // }
  414. // }
  415. break;
  416. case 0x2061:
  417. //if(g_iDentity == IDENTITY_SLAVE) break; // 从设备退出
  418. data_dump("收到数据",data,len);
  419. sIndex = master_check_dev_table(msg->comInfo.da2061.devTypeS,msg->comInfo.da2061.devSnS);
  420. if(sIndex == 0xFF) return;
  421. if(msg->comInfo.da2061.bnewflag != 0)
  422. fifo_write(&g_4Gtxfifo,data,len); // 直接透传
  423. timeout_stop(&g_uart485.time);
  424. break;
  425. default:
  426. break;
  427. }
  428. }
  429. /*----------------------------------------------------------------------------------
  430. * 解析升级类 0x04
  431. * ---------------------------------------------------------------------------------*/
  432. void analysis_cmd_update(uint16_t cmd,uint8_t *data,uint8_t len)
  433. {
  434. uint8_t sendbuff[128], sendlen;
  435. MasterSlave *msg = (MasterSlave*)data;
  436. if(0x2000 == (cmd&0x2000)){
  437. if((g_devMsg.workMode==WORK_UPDATE && g_updateDa.iDentity==IDENTITY_SLAVE)||0x01 ==g_updateDa.bResetUpdate) return;//被升级时,不处理
  438. data_dump("收到数据",data,len);
  439. switch(cmd){
  440. case 0x2001: // 获取设备版本上行
  441. fifo_write(&g_4Gtxfifo,data,len); // 直接透传
  442. break;
  443. case 0x2007: // 收到从设备上报的升级状态
  444. set_start_ota_timer(&g_otaTimer.upstatusTmr,10*1000);
  445. master_update_status_rcv(msg->comInfo.info,msg->palen-2);
  446. printf("收到从设备上报的升级状态\r\n");
  447. break;
  448. case 0x2005: // 收到从设备的重传指令
  449. ota_update_master_retransmit(msg->comInfo.info);
  450. break;
  451. }
  452. }
  453. else if(0x1000 == (cmd&0x1000)) { // 从设备处理
  454. memset(sendbuff,0,128);
  455. switch(cmd){
  456. case 0x1001: // 获取设备版本
  457. if(0==check_dev_type_sn(msg->comInfo.upMsg.up0x1001.devType,msg->comInfo.upMsg.up0x1001.devSn)) return;
  458. data_dump("收到数据",data,len);
  459. slave_get_update_0x1001(sendbuff,&sendlen,msg->comInfo.upMsg.up0x1001.taskId);
  460. slave_send_data_to_uart(0x04,0x2001,sendbuff,sendlen);
  461. break;
  462. case 0x1003: case 0x1004: case 0x1005: case 0x1007: // 需要在升级时处理
  463. if(0==check_dev_type_sn(msg->comInfo.upMsg.up0x1001.devType,msg->comInfo.upMsg.up0x1001.devSn)) return;
  464. ota_timer_stop(&g_otaTimer.randomTmr);
  465. if(0x1005 == cmd) g_updateDa.bRetransmit = 0;
  466. data_dump("收到升级指令",data,len);
  467. ota_update_slave_task(cmd,msg->comInfo.info,msg->palen-2);
  468. break;
  469. case 0x1006: // 离线升级
  470. ota_update_slave_offline(msg->comInfo.info,msg->palen-2);
  471. break;
  472. }
  473. }
  474. }
  475. /*----------------------------------------------------------------------------------
  476. * 解析日志类 0x10
  477. * ---------------------------------------------------------------------------------*/
  478. void analysis_cmd_log(uint16_t cmd,uint8_t *data,uint8_t len)
  479. {
  480. MasterSlave *msg = (MasterSlave*)data;
  481. uint16_t sIndex = 0xFF;
  482. switch(cmd){
  483. case 0x2062: // 错误数据
  484. sIndex = master_check_dev_table(msg->comInfo.lg2062.devTypeS,msg->comInfo.lg2062.devSnS);
  485. if(sIndex == 0xFF) {
  486. timeout_stop(&g_uart485.time);
  487. return;
  488. }
  489. fifo_write(&g_4Gtxfifo,data,len);// 直接透传
  490. timeout_stop(&g_uart485.time);
  491. break;
  492. case 0x2063: // 信号采样率上传
  493. // sIndex = master_check_dev_table(msg->comInfo.lg2063.devTypeS,msg->comInfo.lg2063.devSnS);
  494. // if(sIndex == 0xFF) {
  495. // timeout_stop(&g_uart485.time);
  496. // return;
  497. // }
  498. fifo_write(&g_4Gtxfifo,data,len);// 直接透传
  499. timeout_stop(&g_uart485.time);
  500. break;
  501. break;
  502. default: break;
  503. }
  504. }