| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429 |
- #include "uart_pt.h"
- #include "includes.h"
- //#include "gw_ctrl.h"
- PtTest g_ptTest;
- char Send_Buf_Char[320];
- void gw_net_send_02(char *data, uint16_t len, uint16_t *llen)
- {
- int i;
- //char send_buf[320];
- char value = 0;
- int send_len=0;
- const uint16_t len1 = len;
- memset(Send_Buf_Char,0,sizeof(Send_Buf_Char));
- for(i = 0;i < len1;i++) {
- value = data[i];
- send_len += snprintf((char *)Send_Buf_Char + send_len, sizeof(Send_Buf_Char), "%02x", value);
- }
- *llen = send_len;
- }
- char sendbuff[320] = {0};
- uint8_t eeprom_buf[64] = {0};
- uint32_t eeprom_addr=0;
- #define EEPROM_PAGE 256
- #define EEPROM_BUF_LEN 64
- void pt_return_handle(char *data)
- {
- memset(sendbuff,0,sizeof(sendbuff));
- strcpy(sendbuff,data);
- uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
- }
- void uart_cmd_task(char *data, uint8_t len)
- {
- OS_ERR err;
- char * p_data = NULL;
- uint32_t device_sn; //设备sn
- uint32_t device_type; //设备类型
- uint32_t manufactures; //产品制造商
- uint32_t batch_number; //批次号
- uint32_t production_data; //出厂日期
- uint32_t pcb_ver; //PCB版本
- uint16_t i = 0;
- uint16_t eeprom_first = 0;
- uint16_t lent = 0;
- char tempbuff[130] = {0};
- char type[5] = {0};
- char ssn[11] = {0};
- char pcb[3] = {0};
- char bn[5] = {0};
- char mfrs[5] = {0};
- char pd[9] = {0};
- char port[6] = {0};
- char usr[40] = {0};
- char pwd[40] = {0};
- //eeprom
- char eepaddr[5] = {0};
- char eeplen[5] = {0};
- uint32_t eep_addr = 0;
- uint32_t eep_len = 0;
- uint16_t eep_len_temp = 0;
- //测试离线升级
- char master_snb[15] = {0};
- char slave_snb[15] = {0};
- char des_snb[15] = {0};
- unsigned int master_sn = 0;
- unsigned int slave_sn = 0;
- unsigned int des_sn = 0;
- if(strstr(data,"AT+PTMOD=ON\r\n"))//产测开始指令
- {
- g_ptTest.bTestStart = PT_ON;
-
- pt_return_handle("+PTMOD:ON,00000001\r\n");
- device_fixed_info.Work_State = DEV_WORK_STATE_PT;
-
- timeout_setValue(&g_ptTest.tt_pt_time,PT_TIME,1);//打开产测定时
- //关闭所有指示灯
- close_all_led();
- }
- else if(strstr(data,"AT+PTMOD\r\n"))
- { // 查询当前是否在产测模式下 产测版本
- if(g_ptTest.bTestStart==PT_ON)
- {
- pt_return_handle("+PTMOD:ON,00000001\r\n");
- }
- else
- {
- pt_return_handle("+PTMOD:OFF,00000001\r\n");
- }
- }
- if(g_ptTest.bTestStart == PT_ON)//打开产测后
- {
- if(strstr(data,"AT+PTMOD=OFF\r\n"))//关闭产测指令
- {
- g_ptTest.bTestStart = PT_OFF;
- pt_return_handle("+PTMOD:OFF,00000001\r\n");
- device_info_get();//读取eeprom中的设备信息
- if(device_info.alrd == DEVICE_ALRD)//已初始化
- {
- device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
- printf("normal\n");
- }
- else
- {
- device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
- printf("uninit\n");
- }
-
- timeout_stop(&g_ptTest.tt_pt_time);//关闭产测定时
- }
- else if(strstr(data,"AT+INITDEVINFO=WBJW,"))// 初始化信息 设备类型 sn 批次号 生产厂商 生产日期
- {
- p_data = strstr(data,"AT+INITDEVINFO=WBJW,");
- if(strstr(p_data,"\r\n"))
- {
- sscanf(p_data,"AT+INITDEVINFO=WBJW,%[^\r\n]\r\n",tempbuff);
- sscanf((char *)tempbuff,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",type,ssn,pcb,bn,mfrs,pd,tempbuff,port,usr,pwd);
- sscanf(type,"%04X",&device_type); // 设备类型
- sscanf(ssn,"%010u",&device_sn); //sn
- sscanf(pcb,"%02X",&pcb_ver); //PCB版本
- sscanf(bn,"%04X",&batch_number); //批次号
- sscanf(mfrs,"%04X",&manufactures); //生产厂商
- sscanf(pd,"%08X",&production_data); // 生产日期
- if(device_type_cmp(SOFTWARE_VERSION_APP,(u16)device_type) == 0)
- {
- pt_return_handle("+INITDEVINFO:ERR,DEVICE_TYPE_MISMATCH\r\n");
- memset(data,0,len);
- return;
- }
- device_info.alrd = DEVICE_ALRD;
- device_info.device_type = device_type;
- device_info.device_sn = device_sn;
- device_info.batch_number = batch_number;
- device_info.manufactures = manufactures;
- device_info.production_data = production_data;
- device_info.pcb_ver = pcb_ver;
- device_info_update();//写eeprom
- eeprom_first = EEPROM_FIRST_INIT_FLAG;
- AT24CXX_Write(EECFG_FIRST_INIT0, (uint8_t *)&eeprom_first, 2);
- pt_return_handle("+INITDEVINFO:OK\r\n");
- }
- }
- else if(strstr(data,"AT+DEVINFO\r\n"))// 读取信息
- {
- device_info_get();//读取eeprom中的设备信息
- memset(sendbuff,0,sizeof(sendbuff));
- strcpy(sendbuff,"+DEVINFO:"); // 文件头
- memset(tempbuff,0,sizeof(tempbuff));
- sprintf(tempbuff,"%04x,%010u,%02x,%04x,",device_info.device_type,\
- device_info.device_sn,\
- device_info.pcb_ver,device_fixed_info.MCU_Type_ID);
- strcat(sendbuff,tempbuff);
- gw_net_send_02((char*)device_fixed_info.MCU_UUID,12,&lent);
- memset(tempbuff,0,sizeof(tempbuff));
- memcpy(tempbuff,Send_Buf_Char,lent);
- strcat(sendbuff,tempbuff);
- strcat(sendbuff,",");
- memset(tempbuff,0,sizeof(tempbuff));
- sprintf(tempbuff,"%s,%08x,%08x,%04x,%04x,%08x,,,,","", device_fixed_info.Soft_ver_boot,\
- device_fixed_info.Soft_ver_app,device_info.batch_number,\
- device_info.manufactures,device_info.production_data);
- strcat(sendbuff,tempbuff);
- lent = strlen(sendbuff);
- sendbuff[lent] = 0x0D;
- sendbuff[lent+1] = 0x0A;
- uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
- }
- else if(strstr(data,"AT+EEPROMERASE="))//擦除整片eeprom
- {
- p_data = strstr(data,"AT+EEPROMERASE=");
- if(strstr(p_data,"\r\n"))
- {
- sscanf(p_data,"AT+EEPROMERASE=%[^\r\n]\r\n",tempbuff);
- sscanf(tempbuff,"%[^,]",type);
- sscanf(type,"%04X",&device_type); // 设备类型
- if(device_type_cmp(SOFTWARE_VERSION_APP,(u16)device_type) == 0)
- {
- pt_return_handle("+EEPROMERASE:ERR,DEVICE_TYPE_MISMATCH\r\n");
- memset(data,0,len);
- return;
- }
-
- eeprom_addr = 0;
- memset(eeprom_buf,0,EEPROM_BUF_LEN);
- for(i = 0; i < EEPROM_PAGE; i++)
- {
- AT24CXX_Write(eeprom_addr, eeprom_buf, EEPROM_BUF_LEN);
- eeprom_addr += EEPROM_BUF_LEN;
- }
- memset(sendbuff,0,sizeof(sendbuff));
- strcpy(sendbuff,"+EEPROMERASE:OK\r\n");
- uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
-
- //清除接收数据FIFO
- uart_blocking_read((char *)tempbuff, UART_DEBUG, 1);
- }
- }
- else if(strstr(data,"AT+RST\r\n"))//复位
- {
- pt_return_handle("+RST:OK\r\n");
- OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err);
- NVIC_SystemReset();
- }
- else if(strstr(data,"AT+EEPROMWR="))//测外部eeprom写
- {
- p_data=strstr(data,"AT+EEPROMWR=");
- if(strstr(p_data,"\r\n"))
- {
- memset(sendbuff,0,sizeof(sendbuff));
- sscanf(p_data,"AT+EEPROMWR=%[^\r\n]\r\n",tempbuff);
- sscanf(tempbuff,"%[^,]%[^,],%[^,],%[^,]",type,eepaddr,eeplen,sendbuff);
- sscanf(type,"%04X",&device_type); // 设备类型
- sscanf(eepaddr,"%04X",&eep_addr); //地址
- sscanf(eeplen,"%04X",&eep_len); //长度
- if(device_type_cmp(SOFTWARE_VERSION_APP,(u16)device_type) == 0)
- {
- pt_return_handle("+EEPROMWR:ERR,DEVICE_TYPE_MISMATCH\r\n");
- memset(data,0,len);
- return;
- }
- eep_len_temp = asciitohex(sendbuff,eeprom_buf,strlen(sendbuff)-2);
-
- if(eep_len == eep_len_temp) //OK
- {
- AT24CXX_Write(eep_addr,(uint8_t *)eeprom_buf,eep_len);
- pt_return_handle("+EEPROMWR:OK\r\n");
- }
- else//ERR
- {
- pt_return_handle("+EEPROMWR:ERR\r\n");
- }
- }
- }
- else if(strstr(data,"AT+EEPROMRD="))//测外部eeprom读
- {
- p_data=strstr(data,"AT+EEPROMRD=");
- if(strstr(p_data,"\r\n"))
- {
- sscanf(p_data,"AT+EEPROMRD=%[^\r\n]\r\n",tempbuff);
- sscanf(tempbuff,"%[^,],%[^,]",eepaddr,eeplen);
- sscanf(eepaddr,"%04X",&eep_addr); //地址
- sscanf(eeplen,"%04X",&eep_len); //长度
-
- AT24CXX_Read(eep_addr,eeprom_buf,eep_len);
-
- memset(Send_Buf_Char,0,sizeof(Send_Buf_Char));
- gw_net_send_02((char*)eeprom_buf,eep_len,&lent);
-
- memset(sendbuff,0,sizeof(sendbuff));
- strcpy(sendbuff,"+EEPROMRD:"); // 文件头
-
- memset(tempbuff,0,sizeof(tempbuff));
- sprintf(tempbuff,"%04x,%04x,",eep_addr,eep_len);
- strcat(sendbuff,tempbuff);
-
- strcat(sendbuff,Send_Buf_Char);
-
- lent = strlen(sendbuff);
- sendbuff[lent] = 0x0D;
- sendbuff[lent+1] = 0x0A;
- uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
- }
- }
- else if(strstr(data,"AT+INITLORAPARAINDEX=WBJW,")) //写LoRa参数当前组索引号
- {
- p_data=strstr(data,"AT+INITLORAPARAINDEX=WBJW,");
- if(strstr(p_data,"\r\n"))
- {
- sscanf(p_data,"AT+INITLORAPARAINDEX=WBJW,%[^\r\n]\r\n",tempbuff);
- sscanf(tempbuff,"%[^,]",type);
- sscanf(type,"%u",&device_type); //lora索引
- if(device_type < LORA_GROUP_NUM)//正确
- {
- eepaddr[0] = device_type;
- eepaddr[1] = ~eepaddr[0];
- AT24CXX_Write(LORA_ADDR,(uint8_t *)eepaddr,2);
- pt_return_handle("+INITLORAPARAINDEX:OK\r\n");
- }
- else
- {
- pt_return_handle("+INITLORAPARAINDEX:ERR\r\n");
- }
- }
- }
- else if(strstr(data,"AT+LORAPARAINDEX\r\n")) //读LoRa参数当前组索引号
- {
- memset(sendbuff,0,sizeof(sendbuff));
- strcpy(sendbuff,"+LORAPARAINDEX:"); // 文件头
-
- AT24CXX_Read(LORA_ADDR,(uint8_t *)eepaddr,2);
-
- memset(tempbuff,0,sizeof(tempbuff));
- sprintf(tempbuff,"%u",eepaddr[0]);
- strcat(sendbuff,tempbuff);
-
- lent = strlen(sendbuff);
- sendbuff[lent] = 0x0D;
- sendbuff[lent+1] = 0x0A;
- uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
- }
- else if(strstr(data,"AT+ENCRYPT\r\n")) //读连接器加密状态
- {
- memset(sendbuff,0,sizeof(sendbuff));
- strcpy(sendbuff,"+ENCRYPT:"); // 文件头
-
- memset(tempbuff,0,sizeof(tempbuff));
- sprintf(tempbuff,"%u",device_fixed_info.Encrypt);
- strcat(sendbuff,tempbuff);
-
- lent = strlen(sendbuff);
- sendbuff[lent] = 0x0D;
- sendbuff[lent+1] = 0x0A;
- uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
- }
- else if(strstr(data,"AT+OFFLINE=")) //测试。下发离线升级指令
- {
- p_data=strstr(data,"AT+OFFLINE=");
- if(strstr(p_data,"\r\n"))
- {
- sscanf(p_data,"AT+OFFLINE=%[^\r\n]\r\n",tempbuff);
- sscanf(tempbuff,"%[^,],%[^,],%[^,]",master_snb,slave_snb,des_snb);
- // sscanf((char*)p_data,"AT+OFFLINE=%[^,],%[^,],%[^,]\r\n",master_snb,slave_snb,des_snb);
- sscanf(master_snb,"%u",&master_sn);
- sscanf(slave_snb,"%u",&slave_sn);
- sscanf(des_snb,"%u",&des_sn);
- if(slave_sn != des_sn)//失败
- {
- pt_return_handle("+OFFLINE:ERR\r\n");
- }
- else //成功
- {
- pt_return_handle("+OFFLINE:OK\r\n");
- //退出产测
- g_ptTest.bTestStart = PT_OFF;
- printf("master:%u,slave:%u,des:%u\n",master_sn,slave_sn,des_sn);
- pt_return_handle("+PTMOD:OFF,00000001\r\n");
-
- if(device_info.alrd == DEVICE_ALRD)//已初始化
- {
- device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
- }
- else
- {
- device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
- }
- timeout_stop(&g_ptTest.tt_pt_time);//关闭产测定时
-
- // //Lora发送命令
- // lora_offline_update(master_sn,slave_sn,des_sn);
- }
- }
- }
- }
- memset(data,0,len);
- }
- //uint8_t rcv_buf_pt[256];
- //uint16_t rcv_size_pt = 0,rcv_size_temp_pt = 0;
- //产测执行函数
- void pt_handle(void)
- {
- rcv_size = uart_blocking_read((char *)rcv_buf, UART_DEBUG, 1);
- if(rcv_size)
- {
- rcv_size_temp = rcv_size;
- rcv_size = uart_blocking_read((char *)rcv_buf+rcv_size_temp, UART_DEBUG, 50);
- rcv_size += rcv_size_temp;
- uart_cmd_task((char *)rcv_buf,rcv_size);
-
- if(g_ptTest.bTestStart == PT_ON)
- {
- timeout_setValue(&g_ptTest.tt_pt_time,PT_TIME,1);//打开产测定时
- }
- }
-
- //产测超时判断
- //连续一段时间未收到产测指令,关闭产测
- if(timeout_isOut(&g_ptTest.tt_pt_time))
- {
- g_ptTest.bTestStart = PT_OFF;
-
- device_info_get();//读取eeprom中的设备信息
- if(device_info.alrd == DEVICE_ALRD)//已初始化
- {
- device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
- }
- else
- {
- device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
- }
- printf("pt off\n");
- }
- }
|