masterslave.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  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. extern timeout_t g_upstatusTime;
  304. uint8_t master_check_dev_table(uint16_t devType, uint32_t devSn)
  305. {
  306. volatile uint8_t i = 0;
  307. uint8_t flag;
  308. flag = 0;
  309. g_runNode.slaveNum = (g_runNode.slaveNum>NODE_MAX_SIZE ? NODE_MAX_SIZE:g_runNode.slaveNum);
  310. for(i=0;i<g_runNode.slaveNum;i++){
  311. if((devType== g_runNode.nodMsg[i].devType) \
  312. && (devSn == g_runNode.nodMsg[i].devSn)) {
  313. flag = 1;
  314. break;
  315. }
  316. }
  317. if(flag == 1){
  318. g_runNode.nodMsg[i].readCount = 0;
  319. if(g_runNode.nodMsg[i].status == 0){ // 前一次是离线,离线后再上线
  320. timeout_stop(&g_upstatusTime);
  321. g_runNode.nodMsg[i].status = 1;
  322. g_runNode.devRunMsg[i].readNum = 4;
  323. }
  324. return i;
  325. }
  326. else
  327. return 0xFF;
  328. }
  329. void slave_system_cmd_0x1026(uint8_t *data)
  330. {
  331. systemCmd *msg = (systemCmd*)(data);
  332. if((msg->sDa.s0x1026.appointDevModel == g_devMsg.devType)) {
  333. if((0xFFFFFFFF == msg->devSnS) ||(msg->devSnS == g_devMsg.devSn) ){ //
  334. exti_interrupt_flag_clear(g_extimsg.extiLine); /* 清除中断 */
  335. exti_interrupt_enable(g_extimsg.extiLine);
  336. epprom_init_com_config();
  337. epprom_write_com_config((uint8_t*)(&msg->sDa.s0x1026.priceInuseCout),sizeof(system0x1026)-6);
  338. epprom_read_com_config();
  339. exti_gpio_init();
  340. }
  341. }
  342. }
  343. /*----------------------------------------------------------------------------------
  344. * 解析系统类 0x01
  345. * ---------------------------------------------------------------------------------*/
  346. void analysis_cmd_system(uint16_t cmd, uint8_t *data,uint8_t len)
  347. {
  348. MasterSlave * pmsg = (MasterSlave*)data;
  349. commInfo_t *msg = &(pmsg->comInfo);
  350. if(0x2000 == (cmd&0x2000)){
  351. data_dump("收到数据",data,len);
  352. switch(cmd){
  353. case 0x2030: // 8段码数据上报
  354. if((msg->sysMsg.devSnM == g_devMsg.devSn) && (msg->sysMsg.devTypeM== g_devMsg.devType)) {
  355. fifo_write(&g_4Gtxfifo,data,len); // 直接透传
  356. timeout_stop(&g_uart485.time);
  357. break;
  358. }
  359. }
  360. }
  361. }
  362. /*----------------------------------------------------------------------------------
  363. * 解析状态类 0x02
  364. * ---------------------------------------------------------------------------------*/
  365. void analysis_cmd_status(uint16_t cmd, uint8_t *data,uint8_t len)
  366. {
  367. uint8_t sendbuff[128], sendlen,sIndex;
  368. MasterSlave *msg = (MasterSlave*)data;
  369. status0x2001 *s2001Msg = NULL;
  370. if(0x2000 == (cmd&0x2000)){
  371. data_dump("收到数据",data,len);
  372. sIndex = master_check_dev_table(msg->comInfo.statusMsg.devTypeS,msg->comInfo.statusMsg.devSnS);
  373. if(sIndex == 0xFF) return;
  374. switch(cmd){
  375. case 0x2002:// 实时状态信息 // 固件信息
  376. g_runNode.devRunMsg[sIndex].readNum++;
  377. if(g_runNode.devRunMsg[sIndex].readNum<4) break;
  378. master_analysis_status_cmd(data,len);
  379. g_runNode.devRunMsg[sIndex].readNum = 0;
  380. break;
  381. case 0x2001:
  382. s2001Msg = (status0x2001*)msg->comInfo.info;
  383. //data_dump("aaaaa",msg->comInfo.info,len-12);
  384. printf("aaaaaaaaaa %08x,%08x\n",g_runNode.devRunMsg[sIndex].devAppVer,s2001Msg->appVer);
  385. if(g_runNode.devRunMsg[sIndex].devAppVer != s2001Msg->appVer) {// APP版本不一样时,则上报
  386. timeout_stop(&g_runNode.devRunMsg[sIndex].firmTime);
  387. master_analysis_status_cmd(data,len);
  388. timeout_setValue(&g_runNode.devRunMsg[sIndex].firmTime,UP_STATUS_2001);
  389. timeout_start(&g_runNode.devRunMsg[sIndex].firmTime);
  390. g_runNode.devRunMsg[sIndex].devAppVer = s2001Msg->appVer;
  391. }
  392. else {
  393. if(timeout_isOut(&g_runNode.devRunMsg[sIndex].firmTime)){
  394. master_analysis_status_cmd(data,len);
  395. timeout_setValue(&g_runNode.devRunMsg[sIndex].firmTime,UP_STATUS_2001);
  396. timeout_start(&g_runNode.devRunMsg[sIndex].firmTime);
  397. printf("ccccccccccccccccc\n");
  398. }
  399. }
  400. break;
  401. }
  402. }
  403. else if(0x1000 == (cmd&0x1000)) { // 从设备处理
  404. if(0==check_dev_type_sn(msg->comInfo.statusMsg.devTypeS,msg->comInfo.statusMsg.devSnS)) return;
  405. data_dump("收到数据",data,len);
  406. memset(sendbuff,0,128);
  407. switch(cmd){
  408. case 0x1002: // 实时状态
  409. slave_get_status_0x1002(sendbuff,&sendlen,msg->comInfo.statusMsg.devTypeM,msg->comInfo.statusMsg.devSnM,SELF_STATUS);
  410. slave_send_status_comm(0x2002,sendbuff,sendlen);
  411. break;
  412. case 0x1001: // 固件信息
  413. slave_get_status_0x1001(sendbuff,&sendlen,msg->comInfo.statusMsg.devTypeM,msg->comInfo.statusMsg.devSnM);
  414. slave_send_status_comm(0x2001,sendbuff,sendlen);
  415. break;
  416. }
  417. }
  418. }
  419. /*----------------------------------------------------------------------------------
  420. * 解析数据类 0x03
  421. * ---------------------------------------------------------------------------------*/
  422. void analysis_cmd_data(uint16_t cmd,uint8_t *data,uint8_t len)
  423. {
  424. MasterSlave *msg = (MasterSlave*)data;
  425. uint16_t sIndex = 0xFF;
  426. uint8_t ret;
  427. switch (cmd) {
  428. case 0x1061:
  429. // if(0==check_dev_type_sn(msg->comInfo.da1061.devTypeS,msg->comInfo.da1061.devSnS)) break;
  430. // data_dump("收到数据",data,len);
  431. // if(0 == msg->comInfo.da1061.recordId) {
  432. //// slave_read_flash_data_to485(msg->comInfo.da1061.devTypeM,msg->comInfo.da1061.devSnM);
  433. // }
  434. // else if(0xFFFFFFFF == msg->comInfo.da1061.recordId){ // 主设备按键读取
  435. //// save_display_data_to_flash();
  436. //// slave_read_flash_data_to485(msg->comInfo.da1061.devTypeM,msg->comInfo.da1061.devSnM);
  437. // }
  438. // else { // 服务器读取
  439. // ret = xsp_check_point_record(msg->comInfo.da1061.recordId,g_xspReDa.data);
  440. // if(1 == ret ){ // 说明已经找到的记录
  441. // slave_send_data_0x2061(msg->comInfo.da1061.devTypeM,msg->comInfo.da1061.devSnM,g_xspReDa.data,64,2);
  442. // }
  443. // }
  444. break;
  445. case 0x2061:
  446. //if(g_iDentity == IDENTITY_SLAVE) break; // 从设备退出
  447. data_dump("收到数据",data,len);
  448. sIndex = master_check_dev_table(msg->comInfo.da2061.devTypeS,msg->comInfo.da2061.devSnS);
  449. if(sIndex == 0xFF) return;
  450. if(msg->comInfo.da2061.bnewflag != 0)
  451. fifo_write(&g_4Gtxfifo,data,len); // 直接透传
  452. timeout_stop(&g_uart485.time);
  453. break;
  454. default:
  455. break;
  456. }
  457. }
  458. /*----------------------------------------------------------------------------------
  459. * 解析升级类 0x04
  460. * ---------------------------------------------------------------------------------*/
  461. void analysis_cmd_update(uint16_t cmd,uint8_t *data,uint8_t len)
  462. {
  463. uint8_t sendbuff[128], sendlen;
  464. MasterSlave *msg = (MasterSlave*)data;
  465. if(0x2000 == (cmd&0x2000)){
  466. if((g_devMsg.workMode==WORK_UPDATE && g_updateDa.iDentity==IDENTITY_SLAVE)||0x01 ==g_updateDa.bResetUpdate) return;//被升级时,不处理
  467. data_dump("收到数据",data,len);
  468. switch(cmd){
  469. case 0x2001: // 获取设备版本上行
  470. fifo_write(&g_4Gtxfifo,data,len); // 直接透传
  471. break;
  472. case 0x2007: // 收到从设备上报的升级状态
  473. set_start_ota_timer(&g_otaTimer.upstatusTmr,10*1000);
  474. master_update_status_rcv(msg->comInfo.info,msg->palen-2);
  475. printf("收到从设备上报的升级状态\r\n");
  476. break;
  477. case 0x2005: // 收到从设备的重传指令
  478. ota_update_master_retransmit(msg->comInfo.info);
  479. break;
  480. }
  481. }
  482. else if(0x1000 == (cmd&0x1000)) { // 从设备处理
  483. memset(sendbuff,0,128);
  484. switch(cmd){
  485. case 0x1001: // 获取设备版本
  486. if(0==check_dev_type_sn(msg->comInfo.upMsg.up0x1001.devType,msg->comInfo.upMsg.up0x1001.devSn)) return;
  487. data_dump("收到数据",data,len);
  488. slave_get_update_0x1001(sendbuff,&sendlen,msg->comInfo.upMsg.up0x1001.taskId);
  489. slave_send_data_to_uart(0x04,0x2001,sendbuff,sendlen);
  490. break;
  491. case 0x1003: case 0x1004: case 0x1005: case 0x1007: // 需要在升级时处理
  492. if(0==check_dev_type_sn(msg->comInfo.upMsg.up0x1001.devType,msg->comInfo.upMsg.up0x1001.devSn)) return;
  493. ota_timer_stop(&g_otaTimer.randomTmr);
  494. if(0x1005 == cmd) g_updateDa.bRetransmit = 0;
  495. data_dump("收到升级指令",data,len);
  496. ota_update_slave_task(cmd,msg->comInfo.info,msg->palen-2);
  497. break;
  498. case 0x1006: // 离线升级
  499. ota_update_slave_offline(msg->comInfo.info,msg->palen-2);
  500. break;
  501. }
  502. }
  503. }
  504. /*----------------------------------------------------------------------------------
  505. * 解析日志类 0x10
  506. * ---------------------------------------------------------------------------------*/
  507. void analysis_cmd_log(uint16_t cmd,uint8_t *data,uint8_t len)
  508. {
  509. MasterSlave *msg = (MasterSlave*)data;
  510. uint16_t sIndex = 0xFF;
  511. switch(cmd){
  512. case 0x2062: // 错误数据
  513. sIndex = master_check_dev_table(msg->comInfo.lg2062.devTypeS,msg->comInfo.lg2062.devSnS);
  514. if(sIndex == 0xFF) {
  515. timeout_stop(&g_uart485.time);
  516. return;
  517. }
  518. fifo_write(&g_4Gtxfifo,data,len);// 直接透传
  519. timeout_stop(&g_uart485.time);
  520. break;
  521. case 0x2063: // 信号采样率上传
  522. // sIndex = master_check_dev_table(msg->comInfo.lg2063.devTypeS,msg->comInfo.lg2063.devSnS);
  523. // if(sIndex == 0xFF) {
  524. // timeout_stop(&g_uart485.time);
  525. // return;
  526. // }
  527. fifo_write(&g_4Gtxfifo,data,len);// 直接透传
  528. timeout_stop(&g_uart485.time);
  529. break;
  530. break;
  531. default: break;
  532. }
  533. }