masterslave.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. #include "masterslave.h"
  2. #include "ota_update.h"
  3. #include "taskOpt.h"
  4. uint32_t _msgid = 0;
  5. void slave_send_data_to_uart(uint8_t type1, uint16_t type2,uint8_t *data,uint8_t len)
  6. {
  7. MasterSlave *msg = NULL;
  8. uint16_t crc ;
  9. uint8_t sendlen;
  10. msg = (MasterSlave*)usart485TX_Buffer;
  11. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  12. msg->start = 0xFEFE;
  13. msg->msgId = _msgid++;
  14. msg->proVer = 2;
  15. msg->msgType1 = type1;
  16. msg->msgType2 = type2;
  17. memcpy(msg->comInfo.info,data,len);
  18. sendlen = COMM_HEAD_LEN + len;
  19. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  20. crc = _crc16_get(usart485TX_Buffer,sendlen);
  21. msg->comInfo.info[len] = crc &0xff;
  22. msg->comInfo.info[len+1] = (crc>>8) &0xff;
  23. data_dump("send to 485:",usart485TX_Buffer,sendlen+2);
  24. usart_tx_dma_send(USART1,usart485TX_Buffer,sendlen+2);
  25. }
  26. static void slave_get_status_0x1002(uint8_t *buf,uint8_t *len,uint16_t devtypeM,uint32_t devSnM,uint8_t bself)
  27. {
  28. status0x2002 *msg = (status0x2002*)buf;
  29. if(bself == SLAVE_OFFLINE){
  30. msg->devTypeM = g_devMsg.devType;
  31. msg->devSnM = g_devMsg.devSn;
  32. msg->devTypeS = devtypeM;
  33. msg->devSnS = devSnM;
  34. msg->identity = IDENTITY_SLAVE;
  35. msg->identity = g_iDentity;
  36. if(IDENTITY_MASTER == g_iDentity){
  37. memcpy(msg->cfgFileNo,g_table1027.confFileNum,8);
  38. msg->bHave4G = g_devMsg.bHave4G;
  39. }
  40. else{
  41. memset(msg->cfgFileNo,0,8);
  42. msg->bHave4G = 0;
  43. }
  44. msg->status = 0;
  45. }
  46. else {
  47. msg->devTypeM = devtypeM;
  48. msg->devSnM = devSnM;
  49. msg->devTypeS = g_devMsg.devType;
  50. msg->devSnS = g_devMsg.devSn;
  51. memcpy(msg->cfgFileNo,g_table1027.confFileNum,8);
  52. msg->identity = g_iDentity;
  53. msg->bHave4G = g_devMsg.bHave4G;
  54. msg->status = 1;
  55. msg->lastResetType = g_devResetMsg.resetflag;
  56. msg->resetNum = g_devResetMsg.resetNum;
  57. msg->runTime = Get_SysTick()/1000;
  58. msg->voltage = 0x00;
  59. msg->temperature = 0x00;
  60. msg->rssi4G = 0 + 1000;
  61. msg->snr4G = 0x00;
  62. msg->tempStamp = g_taskRunDa.timetamp;
  63. msg->reserve = 0x00;
  64. }
  65. *len = sizeof(status0x2002);
  66. return;
  67. }
  68. static void slave_get_status_0x1001(uint8_t *buf,uint8_t *len,uint16_t devtypeM,uint32_t devSnM)
  69. {
  70. status0x2001 *msg = (status0x2001*)buf;
  71. msg->devTypeM = devtypeM;
  72. msg->devSnM = devSnM;
  73. msg->devTypeS = g_devMsg.devType;
  74. msg->devSnS = g_devMsg.devSn;
  75. msg->upCode = 0;
  76. msg->bootVer = g_devAppVer.bootVer;
  77. msg->ptVer = g_devAppVer.ptVer;
  78. msg->appVer = g_devAppVer.app1Ver;
  79. memcpy(msg->uuid,g_devfirmMsg.uuid,12);
  80. memset(msg->imei,0,15);
  81. memset(msg->iccid,0,20);
  82. msg->reserve = 0x00;
  83. *len = sizeof(status0x2001);
  84. return;
  85. }
  86. void slave_get_update_0x1001(uint8_t *outdata, uint8_t *len,uint16_t taskId)
  87. {
  88. update0x2001 *msg = (update0x2001*)outdata;
  89. msg->devType = g_devMsg.devType;
  90. msg->devSn = g_devMsg.devSn;
  91. msg->appVer = 0x1001234;
  92. msg->taskId = taskId;
  93. msg->reserve = 0x00;
  94. *len = sizeof(update0x2001);
  95. return;
  96. }
  97. void slave_send_status_comm(uint16_t cmd,uint8_t *data,uint8_t len)
  98. {
  99. MasterSlave *msg = NULL;
  100. uint16_t crc ;
  101. uint8_t sendlen;
  102. msg = (MasterSlave*)usart485TX_Buffer;
  103. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  104. msg->start = 0xFEFE;
  105. msg->msgId = _msgid++;
  106. msg->proVer = 2;
  107. msg->msgType1 = 0x02;
  108. msg->msgType2 = cmd;
  109. memcpy(msg->comInfo.info,data,len);
  110. sendlen = COMM_HEAD_LEN + len;
  111. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  112. crc = _crc16_get(usart485TX_Buffer,sendlen);
  113. msg->comInfo.info[len] = crc &0xff;
  114. msg->comInfo.info[len+1] = (crc>>8) &0xff;
  115. data_dump("send:",usart485TX_Buffer,sendlen+2);
  116. usart_tx_dma_send(USART1,usart485TX_Buffer,sendlen+2);
  117. }
  118. void slave_send_data_0x2061(uint16_t devType, uint32_t devSn,uint8_t *data, uint8_t len,uint8_t bnew)
  119. {
  120. MasterSlave *msg = NULL;
  121. uint16_t crc ;
  122. uint8_t sendlen;
  123. msg = (MasterSlave*)usart485TX_Buffer;
  124. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  125. msg->start = 0xFEFE;
  126. msg->msgId = _msgid++;
  127. msg->proVer = 2;
  128. msg->msgType1 = 0x03;
  129. msg->msgType2 = 0x2061;
  130. msg->comInfo.da2061.devTypeM = devType;
  131. msg->comInfo.da2061.devSnM = devSn;
  132. msg->comInfo.da2061.devTypeS = g_devMsg.devType;
  133. msg->comInfo.da2061.devSnS = g_devMsg.devSn;
  134. msg->comInfo.da2061.bnewflag = bnew;
  135. msg->comInfo.da2061.palen = len;
  136. memcpy(msg->comInfo.da2061.info,data,len);
  137. sendlen = DATA_2061_LEN + COMM_HEAD_LEN + len;
  138. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  139. crc = _crc16_get(usart485TX_Buffer,sendlen);
  140. msg->comInfo.da2061.info[len] = crc &0xff;
  141. msg->comInfo.da2061.info[len+1] = (crc>>8) &0xff;
  142. data_dump("send:",usart485TX_Buffer,sendlen+2);
  143. usart_tx_dma_send(USART1,usart485TX_Buffer,sendlen+2);
  144. }
  145. void slave_send_log_0x2062(uint16_t devType, uint32_t devSn,uint8_t *data, uint8_t len)
  146. {
  147. MasterSlave *msg = NULL;
  148. uint16_t crc ;
  149. uint8_t sendlen;
  150. msg = (MasterSlave*)usart485TX_Buffer;
  151. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  152. msg->start = 0xFEFE;
  153. msg->msgId = _msgid++;
  154. msg->proVer = 2;
  155. msg->msgType1 = 0x10;
  156. msg->msgType2 = 0x2062;
  157. msg->comInfo.lg2062.devTypeM = devType;
  158. msg->comInfo.lg2062.devSnM = devSn;
  159. msg->comInfo.lg2062.devTypeS = g_devMsg.devType;
  160. msg->comInfo.lg2062.devSnS = g_devMsg.devSn;
  161. msg->comInfo.lg2062.palen = len;
  162. memcpy(msg->comInfo.lg2062.info,data,len);
  163. sendlen = LOG_2062_LEN + COMM_HEAD_LEN + len;
  164. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  165. crc = _crc16_get(usart485TX_Buffer,sendlen);
  166. msg->comInfo.lg2062.info[len] = crc &0xff;
  167. msg->comInfo.lg2062.info[len+1] = (crc>>8) &0xff;
  168. // data_dump_00("send:",usart485TX_Buffer,sendlen+2);
  169. usart_tx_dma_send(USART1,usart485TX_Buffer,sendlen+2);
  170. }
  171. void slave_send_log_0x2063(uint16_t devType, uint32_t devSn,uint8_t logtype,uint8_t *data, uint8_t len)
  172. {
  173. MasterSlave *msg = NULL;
  174. uint16_t crc ;
  175. uint8_t sendlen;
  176. msg = (MasterSlave*)usart485TX_Buffer;
  177. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  178. msg->start = 0xFEFE;
  179. msg->msgId = _msgid++;
  180. msg->proVer = 2;
  181. msg->msgType1 = 0x10;
  182. msg->msgType2 = 0x2063;
  183. msg->comInfo.lg2063.devTypeM = devType;
  184. msg->comInfo.lg2063.devSnM = devSn;
  185. msg->comInfo.lg2063.devTypeS = g_devMsg.devType;
  186. msg->comInfo.lg2063.devSnS = g_devMsg.devSn;
  187. msg->comInfo.lg2063.logtype = logtype;
  188. msg->comInfo.lg2063.reserve = 0x00;
  189. msg->comInfo.lg2063.palen = len;
  190. memcpy(msg->comInfo.lg2063.info,data,len);
  191. sendlen = LOG_2063_LEN + COMM_HEAD_LEN + len;
  192. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  193. crc = _crc16_get(usart485TX_Buffer,sendlen);
  194. msg->comInfo.lg2063.info[len] = crc &0xff;
  195. msg->comInfo.lg2063.info[len+1] = (crc>>8) &0xff;
  196. // data_dump_00("send:",usart485TX_Buffer,sendlen+2);
  197. usart_tx_dma_send(USART1,usart485TX_Buffer,sendlen+2);
  198. }
  199. void slave_send_data_0x2030(uint16_t devType, uint32_t devSn,uint8_t *data,uint8_t *cfigNo, uint8_t len)
  200. {
  201. MasterSlave *msg = NULL;
  202. uint16_t crc ;
  203. uint8_t sendlen;
  204. msg = (MasterSlave*)usart485TX_Buffer;
  205. memset(usart485TX_Buffer,0,sizeof(usart485TX_Buffer));
  206. msg->start = 0xFEFE;
  207. msg->msgId = _msgid++;
  208. msg->proVer = 2;
  209. msg->msgType1 = 0x01;
  210. msg->msgType2 = 0x2030;
  211. msg->comInfo.sysMsg.devTypeM = devType;
  212. msg->comInfo.sysMsg.devSnM = devSn;
  213. msg->comInfo.sysMsg.devTypeS = g_devMsg.devType;
  214. msg->comInfo.sysMsg.devSnS = g_devMsg.devSn;
  215. memcpy(msg->comInfo.sysMsg.sDa.s0x2030.configfileNo,cfigNo,8);// = bnew;
  216. msg->comInfo.sysMsg.sDa.s0x2030.reserve = 0;
  217. memcpy(msg->comInfo.info+SYSTEM_2030_LEN,data,len); // 24为2030的头
  218. sendlen = SYSTEM_2030_LEN + COMM_HEAD_LEN + len;
  219. msg->palen = sendlen + 2 - COMM_HEAD_LEN;
  220. crc = _crc16_get(usart485TX_Buffer,sendlen);
  221. msg->comInfo.info[len+SYSTEM_2030_LEN] = crc &0xff;
  222. msg->comInfo.info[len+1+SYSTEM_2030_LEN] = (crc>>8) &0xff;
  223. data_dump("send:",usart485TX_Buffer,sendlen+2);
  224. usart_tx_dma_send(USART1,usart485TX_Buffer,sendlen+2);
  225. }
  226. /*------------------------------------------- 主解析从的指令 并存储到4G 的发送fifo中---------------*/
  227. /*-----------------------------------------------------------------------------
  228. * 从设备读取flash 中的交易记录 放入到485的发送fifo中
  229. * flag : 1:主设备读取的,2:服务器读取的
  230. * ----------------------------------------------------------------------------*/
  231. void slave_read_flash_data_to485(uint16_t devType, uint32_t devSn)
  232. {
  233. uint8_t ret;
  234. XspDataInfo xspda;
  235. ret = read_flash(xspda.data,1);
  236. if(ret==1){ // 有新的交易记录
  237. printf("发送数据到服务器:recordId=%d,amount=%d,oil=%d,tamout=%lld,toil=%lld\r\n",\
  238. xspda.reDa.recordId,xspda.reDa.amount,xspda.reDa.oil,\
  239. xspda.reDa.tamount,xspda.reDa.toil);
  240. // 组成数据
  241. if((0xFFFFFFFF == xspda.reDa.recordId) && (xspda.reDa.price==0xFFFFFFFF)) {// 错误数据不上传
  242. slave_send_data_0x2061(devType, devSn,xspda.data,0,0);
  243. }
  244. else
  245. slave_send_data_0x2061(devType,devSn,xspda.data,64,1);
  246. }
  247. else { // 无新的交易记录
  248. slave_send_data_0x2061(devType, devSn,xspda.data,0,0);
  249. }
  250. }
  251. uint8_t master_check_dev_table(uint16_t devType, uint32_t devSn)
  252. {
  253. volatile uint8_t i = 0;
  254. uint8_t flag;
  255. flag = 0;
  256. g_runNode.slaveNum = (g_runNode.slaveNum>NODE_MAX_SIZE ? NODE_MAX_SIZE:g_runNode.slaveNum);
  257. for(i=0;i<g_runNode.slaveNum;i++){
  258. if((devType== g_runNode.nodMsg[i].devType) \
  259. && (devSn == g_runNode.nodMsg[i].devSn)) {
  260. flag = 1;
  261. break;
  262. }
  263. }
  264. if(flag == 1){
  265. g_runNode.nodMsg[i].readCount = 0;
  266. g_runNode.nodMsg[i].status = 1;
  267. return i;
  268. }
  269. else
  270. return 0xFF;
  271. }
  272. void slave_system_cmd_0x1026(uint8_t *data)
  273. {
  274. systemCmd *msg = (systemCmd*)(data);
  275. if((msg->sDa.s0x1026.appointDevModel == g_devMsg.devType)) {
  276. if((0xFFFFFFFF == msg->devSnS) ||(msg->devSnS == g_devMsg.devSn) ){ //
  277. // exti_interrupt_flag_clear(g_extimsg.extiLine); /* 清除中断 */
  278. // exti_interrupt_disable(g_extimsg.extiLine);
  279. epprom_init_com_config();
  280. epprom_write_com_config((uint8_t*)(&msg->sDa.s0x1026.priceInuseCout),sizeof(system0x1026)-6);
  281. epprom_read_com_config();
  282. exti_gpio_init();
  283. // exti_interrupt_enable(g_extimsg.extiLine);
  284. power_up_read_comm_min_time();
  285. }
  286. }
  287. }
  288. void anlaysis_0x1027(uint8_t *data,uint8_t framNo,uint16_t time)
  289. {
  290. static uint8_t groupId;
  291. uint8_t flag = 0,i=0;
  292. sysCmd1027 *msg = (sysCmd1027*)data;
  293. if(0xFF == framNo){ // 单帧
  294. groupId = 0;
  295. memcpy((uint8_t*)&g_table1027,data,sizeof(sysCmd1027));
  296. g_table1027.groupNum = msg->groupNum;
  297. flag = 1;
  298. }
  299. else if((framNo&0x80) == 0x80){ // 多帧的第一帧
  300. groupId = 0;
  301. memcpy((uint8_t*)&g_temtable1027,data,sizeof(sysCmd1027));
  302. groupId = msg->groupNum;
  303. }
  304. else if((framNo%0x0F) != 0x01) { // 多帧的中间帧
  305. memcpy(g_temtable1027.table[groupId],msg->table,sizeof(sysCmd1027)-11);
  306. groupId += msg->groupNum;
  307. }
  308. else if((framNo&0x01) == 0x01) { // 多帧的最后一帧
  309. memcpy(g_temtable1027.table[groupId],msg->table,sizeof(sysCmd1027)-11);
  310. groupId += msg->groupNum;
  311. g_temtable1027.groupNum = groupId;
  312. flag = 1;
  313. memcpy(&g_table1027,&g_temtable1027,sizeof(sysCmd1027));// 将临时表中的数据放入到用到的表中
  314. }
  315. if( (1 == flag) ){
  316. if((0==time)){
  317. epprom_write_pin_config((uint8_t*)&g_table1027,(uint16_t)sizeof(sysCmd1027)); // 写入EEPROm中
  318. g_taskRunDa.bcfgfiletime = 0;
  319. }
  320. else {
  321. timeout_setValue(&g_taskRunDa.cfigFileTime,time*1000);
  322. timeout_start(&g_taskRunDa.cfigFileTime);
  323. g_taskRunDa.bcfgfiletime = 1;
  324. }
  325. for(i=0;i<g_table1027.groupNum;i++){
  326. if(i%10 == 0) printf("\r\n");
  327. printf("{%d,%2d},",g_table1027.table[i][0],g_table1027.table[i][1]);
  328. }
  329. }
  330. }
  331. void slave_system_cmd_0x1027(uint8_t *data)
  332. {
  333. systemCmd *msg = (systemCmd*)data;
  334. if(msg->sDa.s0x1027.da1027.appointDevModel != g_devMsg.devType) return; // 不是本设备的设备类型
  335. if((0xFFFFFFFF != msg->devSnS) && (msg->devSnS != g_devMsg.devSn)) return;
  336. if((0xFF ==msg->sDa.s0x1027.framNo) ||(0x80 == (msg->sDa.s0x1027.framNo&0x80)) ){
  337. if(0 == msg->sDa.s0x1027.expireTime) epprom_init_pin_config();
  338. }
  339. anlaysis_0x1027((uint8_t*)&msg->sDa.s0x1027.da1027,msg->sDa.s0x1027.framNo,msg->sDa.s0x1027.expireTime);
  340. }
  341. void slave_system_cmd_0x1028(uint8_t *data)
  342. {
  343. systemCmd *msg = (systemCmd*)data;
  344. uint8_t flag = 0; // 1: 主 2: 从 3: 主从
  345. if(0xFFFF == msg->devTypeS) flag = 3;
  346. else if(0xFFFFFFFF == msg->devSnS) flag = 3;
  347. else if(msg->devSnS == g_devMsg.devSn) flag = 1;
  348. else flag = 2;
  349. if((3==flag) ||(1==flag)){
  350. g_up7segData.bOpen = 1;
  351. if(0xFFFFFFFF == msg->sDa.s0x1028.time) {
  352. timeout_setValue(&g_up7segData.upTime,4000);
  353. g_up7segData.bofflineTest = 1;
  354. }
  355. else{
  356. timeout_setValue(&g_up7segData.upTime,msg->sDa.s0x1028.time*1000);
  357. g_up7segData.bofflineTest = 0;
  358. }
  359. timeout_start(&g_up7segData.upTime);
  360. }
  361. }
  362. void slave_system_cmd_0x1029(uint8_t *data)
  363. {
  364. systemCmd *msg = (systemCmd*)data;
  365. uint8_t flag = 0; // 1: 主 2: 从 3: 主从
  366. if(0xFFFF == msg->devTypeS) flag = 3;
  367. else if(0xFFFFFFFF == msg->devSnS) flag = 3;
  368. else if(msg->devSnS == g_devMsg.devSn) flag = 1;
  369. else flag = 2;
  370. g_up7segData.bofflineTest = 0;
  371. if((3==flag) ||(1==flag)){
  372. g_up7segData.bOpen = 0;
  373. timeout_stop(&g_up7segData.upTime);
  374. if(msg->sDa.s0x1029.status == 1){ // 1保存
  375. epprom_write_pin_config((uint8_t*)&g_table1027,(uint16_t)sizeof(sysCmd1027));
  376. }
  377. else if(msg->sDa.s0x1029.status == 2){ //2放弃不存储,要读取回原来的数据
  378. epprom_read_pin_config();
  379. }
  380. }
  381. }
  382. /*----------------------------------------------------------------------------------
  383. * 解析系统类 0x01
  384. * ---------------------------------------------------------------------------------*/
  385. void analysis_cmd_system(uint16_t cmd, uint8_t *data,uint8_t len)
  386. {
  387. MasterSlave * pmsg = (MasterSlave*)data;
  388. commInfo_t *msg = &(pmsg->comInfo);
  389. if(0x1000 == (cmd&0x1000)) {
  390. if(0x1015 == cmd ){
  391. printf("收到时间同步指令\r\n");
  392. set_time(msg->sysMsg.sDa.s0x1015.timer);
  393. g_taskRunDa.timetamp = msg->sysMsg.sDa.s0x1015.timer;
  394. return;
  395. }
  396. if(0==check_dev_type_sn01(msg->sysMsg.devTypeS,msg->sysMsg.devSnS)) return;
  397. data_dump("收到数据",data,len);
  398. switch(cmd){
  399. case 0x1021: // 系统重启
  400. if(0x02 == msg->sysMsg.sDa.s0x1021.object)NVIC_SystemReset();
  401. break;
  402. case 0x1015: // 时间同步
  403. printf("收到时间同步指令\r\n");
  404. set_time(msg->sysMsg.sDa.s0x1015.timer);
  405. break;
  406. case 0x1026: // com配置文件
  407. slave_system_cmd_0x1026((uint8_t *)msg);
  408. break;
  409. case 0x1027: // 探针脚配置表
  410. slave_system_cmd_0x1027((uint8_t*)msg);
  411. break;
  412. case 0x1028: // 开启8段码上报
  413. slave_system_cmd_0x1028((uint8_t*)msg);
  414. break;
  415. case 0x1029: // 关闭8段码上报
  416. slave_system_cmd_0x1029((uint8_t*)msg);
  417. break;
  418. case 0x1030:
  419. slave_send_data_0x2030(msg->sysMsg.devTypeM,msg->sysMsg.devSnM,&g_7egDa[1],&g_table1027.confFileNum[0],28);
  420. break;
  421. }
  422. }
  423. }
  424. /*----------------------------------------------------------------------------------
  425. * 解析状态类 0x02
  426. * ---------------------------------------------------------------------------------*/
  427. void analysis_cmd_status(uint16_t cmd, uint8_t *data,uint8_t len)
  428. {
  429. uint8_t sendbuff[128], sendlen;
  430. MasterSlave *msg = (MasterSlave*)data;
  431. if(0x1000 == (cmd&0x1000)) { // 从设备处理
  432. if(0==check_dev_type_sn(msg->comInfo.statusMsg.devTypeS,msg->comInfo.statusMsg.devSnS)) return;
  433. data_dump("收到数据",data,len);
  434. memset(sendbuff,0,128);
  435. switch(cmd){
  436. case 0x1002: // 实时状态
  437. slave_get_status_0x1002(sendbuff,&sendlen,msg->comInfo.statusMsg.devTypeM,msg->comInfo.statusMsg.devSnM,SELF_STATUS);
  438. slave_send_status_comm(0x2002,sendbuff,sendlen);
  439. break;
  440. case 0x1001: // 固件信息
  441. slave_get_status_0x1001(sendbuff,&sendlen,msg->comInfo.statusMsg.devTypeM,msg->comInfo.statusMsg.devSnM);
  442. slave_send_status_comm(0x2001,sendbuff,sendlen);
  443. break;
  444. }
  445. }
  446. }
  447. /*----------------------------------------------------------------------------------
  448. * 解析数据类 0x03
  449. * ---------------------------------------------------------------------------------*/
  450. void analysis_cmd_data(uint16_t cmd,uint8_t *data,uint8_t len)
  451. {
  452. MasterSlave *msg = (MasterSlave*)data;
  453. // uint16_t sIndex = 0xFF;
  454. uint8_t ret;
  455. switch (cmd) {
  456. case 0x1061:
  457. if(0==check_dev_type_sn(msg->comInfo.da1061.devTypeS,msg->comInfo.da1061.devSnS)) break;
  458. data_dump("收到数据",data,len);
  459. if(0 == msg->comInfo.da1061.recordId) {
  460. if(g_xspErrDa.bsend ==2 ){
  461. slave_send_log_0x2062(msg->comInfo.da1061.devTypeM,msg->comInfo.da1061.devSnM,g_xspErrDa.segDa,16);
  462. g_xspErrDa.bsend = 1;
  463. //printf("~~~~~~~~~~~~~~~~~~~~~~~~发送错误数据\r\n");
  464. }
  465. else slave_read_flash_data_to485(msg->comInfo.da1061.devTypeM,msg->comInfo.da1061.devSnM);
  466. }
  467. else if(0xFFFFFFFF == msg->comInfo.da1061.recordId){ // 主设备按键读取
  468. // save_display_data_to_flash();
  469. // slave_read_flash_data_to485(msg->comInfo.da1061.devTypeM,msg->comInfo.da1061.devSnM);
  470. }
  471. else { // 服务器读取
  472. ret = xsp_check_point_record(msg->comInfo.da1061.recordId,g_xspReDa.data);
  473. if(1 == ret ){ // 说明已经找到的记录
  474. slave_send_data_0x2061(msg->comInfo.da1061.devTypeM,msg->comInfo.da1061.devSnM,g_xspReDa.data,64,2);
  475. }
  476. }
  477. break;
  478. default:
  479. break;
  480. }
  481. }
  482. /*----------------------------------------------------------------------------------
  483. * 解析升级类 0x04
  484. * ---------------------------------------------------------------------------------*/
  485. void analysis_cmd_update(uint16_t cmd,uint8_t *data,uint8_t len)
  486. {
  487. uint8_t sendbuff[128], sendlen;
  488. MasterSlave *msg = (MasterSlave*)data;
  489. if(0x2000 == (cmd&0x2000)){
  490. if((g_devMsg.workMode==WORK_UPDATE && g_updateDa.iDentity==IDENTITY_SLAVE)||0x01 ==g_updateDa.bResetUpdate) return;//被升级时,不处理
  491. data_dump("收到数据",data,len);
  492. switch(cmd){
  493. case 0x2007: // 收到从设备上报的升级状态
  494. set_start_ota_timer(&g_otaTimer.upstatusTmr,10*1000);
  495. master_update_status_rcv(msg->comInfo.info,msg->palen-2);
  496. printf("收到从设备上报的升级状态\r\n");
  497. break;
  498. case 0x2005: // 收到从设备的重传指令
  499. ota_update_master_retransmit(msg->comInfo.info);
  500. break;
  501. }
  502. }
  503. else if(0x1000 == (cmd&0x1000)) { // 从设备处理
  504. memset(sendbuff,0,128);
  505. switch(cmd){
  506. case 0x1001: // 获取设备版本
  507. if(0==check_dev_type_sn(msg->comInfo.upMsg.up0x1001.devType,msg->comInfo.upMsg.up0x1001.devSn)) return;
  508. data_dump("收到数据",data,len);
  509. slave_get_update_0x1001(sendbuff,&sendlen,msg->comInfo.upMsg.up0x1001.taskId);
  510. slave_send_data_to_uart(0x04,0x2001,sendbuff,sendlen);
  511. break;
  512. case 0x1003: case 0x1004: case 0x1005: case 0x1007: // 需要在升级时处理
  513. if(0==check_dev_type_sn(msg->comInfo.upMsg.up0x1001.devType,msg->comInfo.upMsg.up0x1001.devSn)) return;
  514. ota_timer_stop(&g_otaTimer.randomTmr);
  515. if(0x1005 == cmd) g_updateDa.bRetransmit = 0;
  516. //data_dump("收到升级指令",data,len);
  517. ota_update_slave_task(cmd,msg->comInfo.info,msg->palen-2);
  518. break;
  519. case 0x1006: // 离线升级
  520. ota_update_slave_offline(msg->comInfo.info,msg->palen-2);
  521. break;
  522. }
  523. }
  524. }
  525. /*----------------------------------------------------------------------------------
  526. * 解析日志类 0x10
  527. * ---------------------------------------------------------------------------------*/
  528. void analysis_cmd_log(uint16_t cmd,uint8_t *data,uint8_t len)
  529. {
  530. MasterSlave *msg = (MasterSlave*)data;
  531. // uint16_t sIndex = 0xFF;
  532. switch(cmd){
  533. case 0x1062:
  534. if(msg->comInfo.lg1062.devTypeS != DEV_TYPE) break;
  535. if((msg->comInfo.lg1062.devSnS != 0xFFFFFFFF)&& (msg->comInfo.lg1062.devSnS!= g_devMsg.devSn)) break;
  536. if(msg->comInfo.lg1062.time != 0) {
  537. g_logMsg.logType = msg->comInfo.lg1062.logType;
  538. g_logMsg.blogOpen = 1;
  539. timeout_setValue(&g_logMsg.timer,msg->comInfo.lg1062.time*1000);
  540. timeout_start(&g_logMsg.timer);
  541. }
  542. else{
  543. g_logMsg.logType = 0;
  544. g_logMsg.blogOpen = 0;
  545. timeout_stop(&g_logMsg.timer);
  546. }
  547. printf("收到 10---1062, delay = %d, type=%d\r\n",msg->comInfo.lg1062.time,msg->comInfo.lg1062.logType);
  548. break;
  549. case 0x1063:
  550. if(msg->comInfo.lg1063.devTypeS != DEV_TYPE) break;
  551. if((msg->comInfo.lg1063.devSnS != 0xFFFFFFFF)&& (msg->comInfo.lg1063.devSnS!= g_devMsg.devSn)) break;
  552. slave_send_log_0x2063(msg->comInfo.lg1063.devTypeM,msg->comInfo.lg1063.devSnM,msg->comInfo.lg1063.logType,g_testCollDa.sendCollNum,192);
  553. break;
  554. // case 0x2062: // 错误数据
  555. // sIndex = master_check_dev_table(msg->comInfo.lg2062.devTypeS,msg->comInfo.lg2062.devSnS);
  556. // if(sIndex == 0xFF) return;
  557. // fifo_write(&g_4Gtxfifo,data,len);// 直接透传
  558. // timeout_stop(&g_uart485.time);
  559. // break;
  560. }
  561. }