#include "serial_at_cmd_app.h"
|
#include "global_param.h"
|
#include <string.h>
|
#include <stdio.h>
|
#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; i<pack_length-2; i++) {
|
checksum += mUsartReceivePack[i];
|
}
|
checksum += pack_msgtype;
|
checksum += pack_length;
|
rec_times1++;
|
if(((data + checksum)&0xff) == 0xFF) //УÑéͨ¹ý
|
{
|
switch(pack_msgtype)
|
{
|
uint16_t serial_tag_id_recv;
|
case MSG_RW:
|
pack_cmd = mUsartReceivePack[0];
|
pack_index = mUsartReceivePack[1];
|
pack_datalen = mUsartReceivePack[2];
|
switch(pack_cmd)
|
{
|
case CMD_WRITE:
|
//´ÓmUsartReceivePackÖжÁÈ¡pack_length³¤¶ÈµÄ×Ö½Ú£¬·Åµ½È«¾Ö±äÁ¿ÖÐ
|
memcpy((uint8_t*)&g_com_map + pack_index, &mUsartReceivePack[3], pack_datalen);
|
// memcpy((uint8_t*)&g_com_map2 + pack_index, &mUsartReceivePack[3], pack_datalen);
|
//·µ»ØÒ»¸öerror״̬
|
//SendComMap(pack_datalen,pack_index);
|
if(pack_index==CNT_RESTART*2)
|
{
|
SendAnchorState(SM_RESTART);
|
SCB->AIRCR = 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<pwtag.groupnum;i++)
|
{
|
memcpy(pwtag.groupid[i],&mUsartReceivePack[i*6+2],4);
|
memcpy(&pwtag.group_interval[i],&mUsartReceivePack[i*6+6],2);
|
}
|
break;
|
case MSG_REGTAGRESPONSE:
|
regtag_map.index++;
|
if(regtag_map.index==MAX_REGTAGNUM)
|
{regtag_map.index = 0;}
|
regtag_map.remain_time[regtag_map.index]=5;
|
memcpy(®tag_map.tagid[regtag_map.index],&mUsartReceivePack[0],2);
|
memcpy(®tag_map.tag_frequency[regtag_map.index],&mUsartReceivePack[2],2);
|
memcpy(®tag_map.tag_slotpos[regtag_map.index],&mUsartReceivePack[4],2);
|
break;
|
case MSG_TAGPOS:
|
memcpy(&serial_tag_id_recv,&mUsartReceivePack[0],2);
|
taglist_pos=CmpTagInList(serial_tag_id_recv);
|
tagpos[taglist_pos].tagid = serial_tag_id_recv;
|
tagpos[taglist_pos].datalen = mUsartReceivePack[2];
|
if(mUsartReceivePack[2]<=MAX_FRAME_LEN&&taglist_pos<30)
|
{
|
userdatasend_flag[taglist_pos] = 1;
|
memcpy(&tagpos[taglist_pos].data,&mUsartReceivePack[3],mUsartReceivePack[2]);
|
}
|
break;
|
}
|
SendConfigConfirm(pack_msgtype,pack_length);
|
}
|
usart_receive_state = UsartReceiveWaitHead0;
|
pack_index = 0;
|
pack_length = 0;
|
index=0;
|
} else if(usart_receive_state == UsartReceiveWaitData) { //Èô¹ûÊÕµ½µÄÊÇÕý³£Í¨Ñ¶°ü
|
mUsartReceivePack[index] = data;
|
index++;
|
if(index == pack_length-2) { //Èç¹ûÊÕµ½µÄindexÓ볤¶ÈÏàµÈ
|
usart_receive_state = UsartReceiveWaitChecksum;
|
}
|
} else if(usart_receive_state == UsartReceiveWaitLength) { //ÊÕµ½³¤¶È×Ö½Ú
|
|
pack_length = data;
|
pack_index = 0;
|
usart_receive_state = UsartReceiveWaitData;
|
|
} else if((usart_receive_state == UsartReceiveWaitHead0) && (data == 0x55)) { //ÊÕµ½µÚÒ»¸ö°üÍ·
|
usart_receive_state = UsartReceiveWaitHead1;
|
} else if((usart_receive_state == UsartReceiveWaitHead1) && (data == 0xAA)) { //ÊÕµ½µÚ¶þ¸ö°üÍ·
|
usart_receive_state = UsartReceiveWaitMsgType;
|
}else if ((usart_receive_state == UsartReceiveWaitMsgType)) {
|
usart_receive_state = UsartReceiveWaitLength;
|
pack_msgtype = data;
|
}
|
else {
|
usart_receive_state = UsartReceiveWaitHead0;
|
pack_index = 0;
|
pack_length = 0;
|
}
|
|
}
|