uart_pt.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. #include "uart_pt.h"
  2. #include "includes.h"
  3. //#include "gw_ctrl.h"
  4. PtTest g_ptTest;
  5. char Send_Buf_Char[320];
  6. void gw_net_send_02(char *data, uint16_t len, uint16_t *llen)
  7. {
  8. int i;
  9. //char send_buf[320];
  10. char value = 0;
  11. int send_len=0;
  12. const uint16_t len1 = len;
  13. memset(Send_Buf_Char,0,sizeof(Send_Buf_Char));
  14. for(i = 0;i < len1;i++) {
  15. value = data[i];
  16. send_len += snprintf((char *)Send_Buf_Char + send_len, sizeof(Send_Buf_Char), "%02x", value);
  17. }
  18. *llen = send_len;
  19. }
  20. char sendbuff[320] = {0};
  21. uint8_t eeprom_buf[64] = {0};
  22. uint32_t eeprom_addr=0;
  23. #define EEPROM_PAGE 256
  24. #define EEPROM_BUF_LEN 64
  25. void pt_return_handle(char *data)
  26. {
  27. memset(sendbuff,0,sizeof(sendbuff));
  28. strcpy(sendbuff,data);
  29. uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
  30. }
  31. void uart_cmd_task(char *data, uint8_t len)
  32. {
  33. OS_ERR err;
  34. char * p_data = NULL;
  35. uint32_t device_sn; //设备sn
  36. uint32_t device_type; //设备类型
  37. uint32_t manufactures; //产品制造商
  38. uint32_t batch_number; //批次号
  39. uint32_t production_data; //出厂日期
  40. uint32_t pcb_ver; //PCB版本
  41. uint16_t i = 0;
  42. uint16_t eeprom_first = 0;
  43. uint16_t lent = 0;
  44. char tempbuff[130] = {0};
  45. char type[5] = {0};
  46. char ssn[11] = {0};
  47. char pcb[3] = {0};
  48. char bn[5] = {0};
  49. char mfrs[5] = {0};
  50. char pd[9] = {0};
  51. char port[6] = {0};
  52. char usr[40] = {0};
  53. char pwd[40] = {0};
  54. //eeprom
  55. char eepaddr[5] = {0};
  56. char eeplen[5] = {0};
  57. uint32_t eep_addr = 0;
  58. uint32_t eep_len = 0;
  59. uint16_t eep_len_temp = 0;
  60. //测试离线升级
  61. char master_snb[15] = {0};
  62. char slave_snb[15] = {0};
  63. char des_snb[15] = {0};
  64. unsigned int master_sn = 0;
  65. unsigned int slave_sn = 0;
  66. unsigned int des_sn = 0;
  67. if(strstr(data,"AT+PTMOD=ON\r\n"))//产测开始指令
  68. {
  69. g_ptTest.bTestStart = PT_ON;
  70. pt_return_handle("+PTMOD:ON,00000001\r\n");
  71. device_fixed_info.Work_State = DEV_WORK_STATE_PT;
  72. timeout_setValue(&g_ptTest.tt_pt_time,PT_TIME,1);//打开产测定时
  73. //关闭所有指示灯
  74. close_all_led();
  75. }
  76. else if(strstr(data,"AT+PTMOD\r\n"))
  77. { // 查询当前是否在产测模式下 产测版本
  78. if(g_ptTest.bTestStart==PT_ON)
  79. {
  80. pt_return_handle("+PTMOD:ON,00000001\r\n");
  81. }
  82. else
  83. {
  84. pt_return_handle("+PTMOD:OFF,00000001\r\n");
  85. }
  86. }
  87. if(g_ptTest.bTestStart == PT_ON)//打开产测后
  88. {
  89. if(strstr(data,"AT+PTMOD=OFF\r\n"))//关闭产测指令
  90. {
  91. g_ptTest.bTestStart = PT_OFF;
  92. pt_return_handle("+PTMOD:OFF,00000001\r\n");
  93. device_info_get();//读取eeprom中的设备信息
  94. if(device_info.alrd == DEVICE_ALRD)//已初始化
  95. {
  96. device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  97. printf("normal\n");
  98. }
  99. else
  100. {
  101. device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
  102. printf("uninit\n");
  103. }
  104. timeout_stop(&g_ptTest.tt_pt_time);//关闭产测定时
  105. }
  106. else if(strstr(data,"AT+INITDEVINFO=WBJW,"))// 初始化信息 设备类型 sn 批次号 生产厂商 生产日期
  107. {
  108. p_data = strstr(data,"AT+INITDEVINFO=WBJW,");
  109. if(strstr(p_data,"\r\n"))
  110. {
  111. sscanf(p_data,"AT+INITDEVINFO=WBJW,%[^\r\n]\r\n",tempbuff);
  112. sscanf((char *)tempbuff,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",type,ssn,pcb,bn,mfrs,pd,tempbuff,port,usr,pwd);
  113. sscanf(type,"%04X",&device_type); // 设备类型
  114. sscanf(ssn,"%010u",&device_sn); //sn
  115. sscanf(pcb,"%02X",&pcb_ver); //PCB版本
  116. sscanf(bn,"%04X",&batch_number); //批次号
  117. sscanf(mfrs,"%04X",&manufactures); //生产厂商
  118. sscanf(pd,"%08X",&production_data); // 生产日期
  119. if(device_type_cmp(SOFTWARE_VERSION_APP,(u16)device_type) == 0)
  120. {
  121. pt_return_handle("+INITDEVINFO:ERR,DEVICE_TYPE_MISMATCH\r\n");
  122. memset(data,0,len);
  123. return;
  124. }
  125. device_info.alrd = DEVICE_ALRD;
  126. device_info.device_type = device_type;
  127. device_info.device_sn = device_sn;
  128. device_info.batch_number = batch_number;
  129. device_info.manufactures = manufactures;
  130. device_info.production_data = production_data;
  131. device_info.pcb_ver = pcb_ver;
  132. device_info_update();//写eeprom
  133. eeprom_first = EEPROM_FIRST_INIT_FLAG;
  134. AT24CXX_Write(EECFG_FIRST_INIT0, (uint8_t *)&eeprom_first, 2);
  135. pt_return_handle("+INITDEVINFO:OK\r\n");
  136. }
  137. }
  138. else if(strstr(data,"AT+DEVINFO\r\n"))// 读取信息
  139. {
  140. device_info_get();//读取eeprom中的设备信息
  141. memset(sendbuff,0,sizeof(sendbuff));
  142. strcpy(sendbuff,"+DEVINFO:"); // 文件头
  143. memset(tempbuff,0,sizeof(tempbuff));
  144. sprintf(tempbuff,"%04x,%010u,%02x,%04x,",device_info.device_type,\
  145. device_info.device_sn,\
  146. device_info.pcb_ver,device_fixed_info.MCU_Type_ID);
  147. strcat(sendbuff,tempbuff);
  148. gw_net_send_02((char*)device_fixed_info.MCU_UUID,12,&lent);
  149. memset(tempbuff,0,sizeof(tempbuff));
  150. memcpy(tempbuff,Send_Buf_Char,lent);
  151. strcat(sendbuff,tempbuff);
  152. strcat(sendbuff,",");
  153. memset(tempbuff,0,sizeof(tempbuff));
  154. sprintf(tempbuff,"%s,%08x,%08x,%04x,%04x,%08x,,,,","", device_fixed_info.Soft_ver_boot,\
  155. device_fixed_info.Soft_ver_app,device_info.batch_number,\
  156. device_info.manufactures,device_info.production_data);
  157. strcat(sendbuff,tempbuff);
  158. lent = strlen(sendbuff);
  159. sendbuff[lent] = 0x0D;
  160. sendbuff[lent+1] = 0x0A;
  161. uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
  162. }
  163. else if(strstr(data,"AT+EEPROMERASE="))//擦除整片eeprom
  164. {
  165. p_data = strstr(data,"AT+EEPROMERASE=");
  166. if(strstr(p_data,"\r\n"))
  167. {
  168. sscanf(p_data,"AT+EEPROMERASE=%[^\r\n]\r\n",tempbuff);
  169. sscanf(tempbuff,"%[^,]",type);
  170. sscanf(type,"%04X",&device_type); // 设备类型
  171. if(device_type_cmp(SOFTWARE_VERSION_APP,(u16)device_type) == 0)
  172. {
  173. pt_return_handle("+EEPROMERASE:ERR,DEVICE_TYPE_MISMATCH\r\n");
  174. memset(data,0,len);
  175. return;
  176. }
  177. eeprom_addr = 0;
  178. memset(eeprom_buf,0,EEPROM_BUF_LEN);
  179. for(i = 0; i < EEPROM_PAGE; i++)
  180. {
  181. AT24CXX_Write(eeprom_addr, eeprom_buf, EEPROM_BUF_LEN);
  182. eeprom_addr += EEPROM_BUF_LEN;
  183. }
  184. memset(sendbuff,0,sizeof(sendbuff));
  185. strcpy(sendbuff,"+EEPROMERASE:OK\r\n");
  186. uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
  187. //清除接收数据FIFO
  188. uart_blocking_read((char *)tempbuff, UART_DEBUG, 1);
  189. }
  190. }
  191. else if(strstr(data,"AT+RST\r\n"))//复位
  192. {
  193. pt_return_handle("+RST:OK\r\n");
  194. OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err);
  195. NVIC_SystemReset();
  196. }
  197. else if(strstr(data,"AT+EEPROMWR="))//测外部eeprom写
  198. {
  199. p_data=strstr(data,"AT+EEPROMWR=");
  200. if(strstr(p_data,"\r\n"))
  201. {
  202. memset(sendbuff,0,sizeof(sendbuff));
  203. sscanf(p_data,"AT+EEPROMWR=%[^\r\n]\r\n",tempbuff);
  204. sscanf(tempbuff,"%[^,]%[^,],%[^,],%[^,]",type,eepaddr,eeplen,sendbuff);
  205. sscanf(type,"%04X",&device_type); // 设备类型
  206. sscanf(eepaddr,"%04X",&eep_addr); //地址
  207. sscanf(eeplen,"%04X",&eep_len); //长度
  208. if(device_type_cmp(SOFTWARE_VERSION_APP,(u16)device_type) == 0)
  209. {
  210. pt_return_handle("+EEPROMWR:ERR,DEVICE_TYPE_MISMATCH\r\n");
  211. memset(data,0,len);
  212. return;
  213. }
  214. eep_len_temp = asciitohex(sendbuff,eeprom_buf,strlen(sendbuff)-2);
  215. if(eep_len == eep_len_temp) //OK
  216. {
  217. AT24CXX_Write(eep_addr,(uint8_t *)eeprom_buf,eep_len);
  218. pt_return_handle("+EEPROMWR:OK\r\n");
  219. }
  220. else//ERR
  221. {
  222. pt_return_handle("+EEPROMWR:ERR\r\n");
  223. }
  224. }
  225. }
  226. else if(strstr(data,"AT+EEPROMRD="))//测外部eeprom读
  227. {
  228. p_data=strstr(data,"AT+EEPROMRD=");
  229. if(strstr(p_data,"\r\n"))
  230. {
  231. sscanf(p_data,"AT+EEPROMRD=%[^\r\n]\r\n",tempbuff);
  232. sscanf(tempbuff,"%[^,],%[^,]",eepaddr,eeplen);
  233. sscanf(eepaddr,"%04X",&eep_addr); //地址
  234. sscanf(eeplen,"%04X",&eep_len); //长度
  235. AT24CXX_Read(eep_addr,eeprom_buf,eep_len);
  236. memset(Send_Buf_Char,0,sizeof(Send_Buf_Char));
  237. gw_net_send_02((char*)eeprom_buf,eep_len,&lent);
  238. memset(sendbuff,0,sizeof(sendbuff));
  239. strcpy(sendbuff,"+EEPROMRD:"); // 文件头
  240. memset(tempbuff,0,sizeof(tempbuff));
  241. sprintf(tempbuff,"%04x,%04x,",eep_addr,eep_len);
  242. strcat(sendbuff,tempbuff);
  243. strcat(sendbuff,Send_Buf_Char);
  244. lent = strlen(sendbuff);
  245. sendbuff[lent] = 0x0D;
  246. sendbuff[lent+1] = 0x0A;
  247. uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
  248. }
  249. }
  250. else if(strstr(data,"AT+INITLORAPARAINDEX=WBJW,")) //写LoRa参数当前组索引号
  251. {
  252. p_data=strstr(data,"AT+INITLORAPARAINDEX=WBJW,");
  253. if(strstr(p_data,"\r\n"))
  254. {
  255. sscanf(p_data,"AT+INITLORAPARAINDEX=WBJW,%[^\r\n]\r\n",tempbuff);
  256. sscanf(tempbuff,"%[^,]",type);
  257. sscanf(type,"%u",&device_type); //lora索引
  258. if(device_type < LORA_GROUP_NUM)//正确
  259. {
  260. eepaddr[0] = device_type;
  261. eepaddr[1] = ~eepaddr[0];
  262. AT24CXX_Write(LORA_ADDR,(uint8_t *)eepaddr,2);
  263. pt_return_handle("+INITLORAPARAINDEX:OK\r\n");
  264. }
  265. else
  266. {
  267. pt_return_handle("+INITLORAPARAINDEX:ERR\r\n");
  268. }
  269. }
  270. }
  271. else if(strstr(data,"AT+LORAPARAINDEX\r\n")) //读LoRa参数当前组索引号
  272. {
  273. memset(sendbuff,0,sizeof(sendbuff));
  274. strcpy(sendbuff,"+LORAPARAINDEX:"); // 文件头
  275. AT24CXX_Read(LORA_ADDR,(uint8_t *)eepaddr,2);
  276. memset(tempbuff,0,sizeof(tempbuff));
  277. sprintf(tempbuff,"%u",eepaddr[0]);
  278. strcat(sendbuff,tempbuff);
  279. lent = strlen(sendbuff);
  280. sendbuff[lent] = 0x0D;
  281. sendbuff[lent+1] = 0x0A;
  282. uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
  283. }
  284. else if(strstr(data,"AT+ENCRYPT\r\n")) //读连接器加密状态
  285. {
  286. memset(sendbuff,0,sizeof(sendbuff));
  287. strcpy(sendbuff,"+ENCRYPT:"); // 文件头
  288. memset(tempbuff,0,sizeof(tempbuff));
  289. sprintf(tempbuff,"%u",device_fixed_info.Encrypt);
  290. strcat(sendbuff,tempbuff);
  291. lent = strlen(sendbuff);
  292. sendbuff[lent] = 0x0D;
  293. sendbuff[lent+1] = 0x0A;
  294. uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
  295. }
  296. else if(strstr(data,"AT+OFFLINE=")) //测试。下发离线升级指令
  297. {
  298. p_data=strstr(data,"AT+OFFLINE=");
  299. if(strstr(p_data,"\r\n"))
  300. {
  301. sscanf(p_data,"AT+OFFLINE=%[^\r\n]\r\n",tempbuff);
  302. sscanf(tempbuff,"%[^,],%[^,],%[^,]",master_snb,slave_snb,des_snb);
  303. // sscanf((char*)p_data,"AT+OFFLINE=%[^,],%[^,],%[^,]\r\n",master_snb,slave_snb,des_snb);
  304. sscanf(master_snb,"%u",&master_sn);
  305. sscanf(slave_snb,"%u",&slave_sn);
  306. sscanf(des_snb,"%u",&des_sn);
  307. if(slave_sn != des_sn)//失败
  308. {
  309. pt_return_handle("+OFFLINE:ERR\r\n");
  310. }
  311. else //成功
  312. {
  313. pt_return_handle("+OFFLINE:OK\r\n");
  314. //退出产测
  315. g_ptTest.bTestStart = PT_OFF;
  316. printf("master:%u,slave:%u,des:%u\n",master_sn,slave_sn,des_sn);
  317. pt_return_handle("+PTMOD:OFF,00000001\r\n");
  318. if(device_info.alrd == DEVICE_ALRD)//已初始化
  319. {
  320. device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  321. }
  322. else
  323. {
  324. device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
  325. }
  326. timeout_stop(&g_ptTest.tt_pt_time);//关闭产测定时
  327. // //Lora发送命令
  328. // lora_offline_update(master_sn,slave_sn,des_sn);
  329. }
  330. }
  331. }
  332. }
  333. memset(data,0,len);
  334. }
  335. //uint8_t rcv_buf_pt[256];
  336. //uint16_t rcv_size_pt = 0,rcv_size_temp_pt = 0;
  337. //产测执行函数
  338. void pt_handle(void)
  339. {
  340. rcv_size = uart_blocking_read((char *)rcv_buf, UART_DEBUG, 1);
  341. if(rcv_size)
  342. {
  343. rcv_size_temp = rcv_size;
  344. rcv_size = uart_blocking_read((char *)rcv_buf+rcv_size_temp, UART_DEBUG, 50);
  345. rcv_size += rcv_size_temp;
  346. uart_cmd_task((char *)rcv_buf,rcv_size);
  347. if(g_ptTest.bTestStart == PT_ON)
  348. {
  349. timeout_setValue(&g_ptTest.tt_pt_time,PT_TIME,1);//打开产测定时
  350. }
  351. }
  352. //产测超时判断
  353. //连续一段时间未收到产测指令,关闭产测
  354. if(timeout_isOut(&g_ptTest.tt_pt_time))
  355. {
  356. g_ptTest.bTestStart = PT_OFF;
  357. device_info_get();//读取eeprom中的设备信息
  358. if(device_info.alrd == DEVICE_ALRD)//已初始化
  359. {
  360. device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  361. }
  362. else
  363. {
  364. device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
  365. }
  366. printf("pt off\n");
  367. }
  368. }