#include "serial_at_cmd_app.h" #include "global_param.h" #include #include #include "dw_app.h" #include "RTC.h" #define MSG_RW 3 #define MSG_WTAG 6 #define MSG_PWTAG 8 #define MSG_REGTAGRESPONSE 0x0b #define MSG_TAGPOS 0x0D #define CMD_READ 1 #define CMD_WRITE 2 #define CMD_REPLY 3 struct pwtag_structure pwtag; typedef enum { UsartReceiveWaitHead0, UsartReceiveWaitHead1, UsartReceiveWaitMsgType, UsartReceiveWaitLength, UsartReceiveWaitCMD, UsartReceiveWaitIndex, UsartReceiveWaitDataLen, UsartReceiveWaitData, UsartReceiveWaitChecksum } UsartRecvPackState; uint8_t mUsartReceivePack[100] = {0}; uint8_t send_frame[200]; void SendConfigConfirm(uint8_t pack_msgtype,uint8_t pack_length) { uint16_t checksum = 0; send_frame[0] = 0x55; send_frame[1] = 0xAA; send_frame[2] = 0x09; send_frame[3] = 8; send_frame[4] = pack_msgtype; send_frame[5] = pack_length; checksum = Checksum_u16(&send_frame[2],8); memcpy(&send_frame[10],&checksum,2); UART_PushFrame(send_frame, 12); } void SendAnchorState(uint16_t state) { uint16_t checksum = 0; send_frame[0] = 0x55; send_frame[1] = 0xAA; send_frame[2] = 0x10; send_frame[3] = 14; memcpy(&send_frame[4],&dev_id,2); send_frame[6] = state; checksum = Checksum_u16(&send_frame[2],14); memcpy(&send_frame[16],&checksum,2); USART_puts(send_frame, 17); } void SendComMap(uint8_t data_length, uint8_t index) { uint16_t checksum = 0; send_frame[0] = 0x55; send_frame[1] = 0xAA; send_frame[2] = 0x03; send_frame[3] = data_length+5; send_frame[4] = CMD_REPLY; send_frame[5] = index; send_frame[6] = data_length; memcpy(&send_frame[7], &g_com_map[index>>1], data_length); checksum = Checksum_u16(&send_frame[2],5+data_length); memcpy(&send_frame[7+data_length],&checksum,2); UART_PushFrame(send_frame, data_length+9); } u8 remotetag_para[30],remotetag_paralen,userdatasend_flag[TAG_NUM_IN_SYS]; u8 remotesend_state=0; uint16_t configremotetagID,rec_times1,rec_times2; struct regtag_structure regtag_map; extern u16 taglist_pos; struct tagpos_structure tagpos[30]; void UsartParseDataHandler(uint8_t data) { static UsartRecvPackState usart_receive_state = UsartReceiveWaitHead0; uint16_t checksum = 0; static uint8_t pack_datalen = 0,pack_length = 0,pack_index = 0,pack_msgtype = 0,pack_cmd = CMD_READ; static uint8_t index = 0; uint8_t i; if(usart_receive_state == UsartReceiveWaitChecksum) { //ÈôÊÕµ½Ð£ÑéºÍ°ü checksum = 0; for(int i = 0; iAIRCR = 0X05FA0000|(unsigned int)0x04; //Èí¸´Î»»Øµ½bootloader } if(pack_index==CNT_UPDATE*2) { uint32_t result = 0; u16 tmp = 0xAAAA; SendAnchorState(SM_UPDATE); __disable_irq(); result = FLASH_Prepare(0x8004A38, 2); if(result) result = FLASH_Write(0x8004A38, (const uint8_t*)&tmp, 2); __enable_irq(); printf("½øÈëÉý¼¶Ä£Ê½\r\n"); //delay_ms(100); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //Èí¸´Î»»Øµ½bootloader } save_com_map_to_flash(); delay_ms(100); NVIC_SystemReset(); break; case CMD_READ: //read°üÖÐdata×Ö½Ú£¬¼´mUsartReceivePack[0]±íʾÊý¾Ý³¤¶È£» //´Óg_com_data½á¹¹ÌåÖеĵÚindexλÖöÁÈ¡³¤¶ÈΪmUsartReceivePack[0]µÄ×Ö½Ú£¬·¢ËͳöÀ´ rec_times2++; SendComMap(pack_datalen,pack_index); break; default: break; } break; case MSG_WTAG: //Ð޸ıêÇ©²ÎÊý remotesend_state=1; memcpy(&configremotetagID,&mUsartReceivePack[0],2); //configremotetagID = pack_cmd|pack_index<<8; //remotetag_para[0] = mUsartReceivePack[2]; remotetag_paralen = mUsartReceivePack[4]+3; memcpy(&remotetag_para[1],&mUsartReceivePack[3],remotetag_paralen); break; case MSG_PWTAG: //ÅúÁ¿Ð޸ıêÇ©²ÎÊý pwtag.groupnum = mUsartReceivePack[0]; pwtag.index = mUsartReceivePack[1]; pwtag.remain_time = 5; for(i=0; i