#include #include #include #include #include "Usart.h" #include "mk_flash.h" //#include "dw_app.h" //#include "UsartII.h" //#include "main.h" #include "board.h" //#include "Spi.h" //#include "radio.h" //#define EUART0_RX_BUF_SIZE 100 #define Label_id_local 1 //±êÇ©id #define data_buff_MAX 50 //»ùÕ¾ÊýÁ¿ #define Lora_TXD_bff_MAX 220 //·¢ËÍ»º´æÇø´óС >4+8+4*»ùÕ¾ÊýÁ¿+2=14+4*»ùÕ¾ÊýÁ¿ uint8_t mUsartReceivePack[100] = {0}; uint8_t mUsart2ReceivePack[150] = {0}; uint8_t GPS_GGAmessage[150]={0}; uint8_t GPS_GSVmessage[150]={0}; double jd,wd; int analysis_num,pos_state; uint8_t state5V_prase_flag=1,gps_prase_flag=1; extern void IO_LED_control_change(uint8_t data); extern void IO_control_init(void); extern void blink_led(uint8_t*state); extern void updata_led_power_state(void); extern uint8_t gps_success_state,gps_open_flag; extern uint8_t gps_success_state,gps_enable_flag,gps_need_data_flag,gps_timeout_flag,gps_power_state; extern uint16_t gps_wait_count; typedef enum { BLE_RECV_STATE_IDLE = 0, BLE_RECV_STATE_MAC, BLE_RECV_STATE_RSSI, //BLE_RECV_STATE_LF, } E_BLERecvState; static char gps_header[20]; typedef struct { char m_pData[100]; uint32_t m_u32Len; } GGA_DataStruct; typedef struct { E_BLERecvState m_eState; char m_macHeader[100],m_rssiHeader2[100]; uint32_t m_u32HeaderLen,m_u32Header2Len; char m_acRecvBuf[128]; uint32_t m_u32RecvLen; } ST_BLERecv; uint8_t mUsart2ReceivePack_before , mUsart2ReceivePack_now; uint8_t j_ct=0,CT_satrt_temp=0,CT_satrt=0,numb_base=0 ; uint8_t id_cmpare[12]= {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x30, 0x30, 0x30, 0x31}; //123456780001//²âÊÔ//RC2202A£º uint32_t CT_sum=0; char char_broadcast_data[80];//¹ã²¥Êý¾Ý uint8_t Lora_TXD_bff[Lora_TXD_bff_MAX]; //lora·¢ËÍ»º´æÇø uint16_t data_buff[data_buff_MAX][2]; //»ùÕ¾Êý¾Ý»º´æÇø char char_mac[14],char_ssi[6]; //int32_t distance_int; double ssi_double; uint16_t temp_16,temp_16_id,temp_16_distance,data_buff_start; uint16_t Checksum_u16(uint8_t* pdata, uint32_t len) { uint16_t sum = 0; uint32_t i; for(i=0; i 0) { // ¼ÆËãÔ´µØÖ·ºÍÄ¿±êµØÖ· void *src = (uint32_t *)tag_authorization_idlist + (index + 1); void *dest =(uint32_t *)tag_authorization_idlist + index; // ʹÓÃmemmove½øÐÐÄÚ´æ¿éÒÆ¶¯£¨´¦ÀíÖØµþÄÚ´æÇøÓò£© memmove(dest, src, elements_to_move * 4); *authorization_list_num=*authorization_list_num-1;//³É¹¦É¾³ýÒ»¸ö¸üÐÂÊýÁ¿ tag_authorization_idlist[*authorization_list_num]=0xffffffff;//½«¶àÓàÖØµþ²¿·ÖÖØÖà }else if (elements_to_move==0&&index==0){ *authorization_list_num=*authorization_list_num-1;//³É¹¦É¾³ýÒ»¸ö¸üÐÂÊýÁ¿ tag_authorization_idlist[index]=0xffffffff; } } } } extern uint8_t bind_flag; void Usart0ParseDataHandler(uint8_t data) { if(state5V_prase_flag&&!g_com_map[MODBUS_MODE]) { //Éý¼¶³ÌÐò 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; if(usart_receive_state == UsartReceiveWaitChecksum) { //ÈôÊÕµ½Ð£ÑéºÍ°ü checksum = 0; for(int i = 0; i>1); break; default: break; } } usart_receive_state = UsartReceiveWaitHead0; pack_index = 0; pack_length = 0; index=0; } else if((usart_receive_state == UsartReceiveWaitData) ) { //Èô¹ûÊÕµ½µÄÊÇÕý³£Í¨Ñ¶°ü mUsart2ReceivePack[index] = data; index++; if(index == pack_length-5) { //Èç¹ûÊÕµ½µÄindexÓ볤¶ÈÏàµÈ usart_receive_state = UsartReceiveWaitChecksum; } } else if(usart_receive_state == UsartReceiveWaitDataLen) { //ÊÕµ½Ö¸ÁîÀàÐÍ×Ö½Ú pack_datalen = data; usart_receive_state = UsartReceiveWaitData; } else if(usart_receive_state == UsartReceiveWaitIndex) { //ÊÕµ½Ö¸ÁîÀàÐÍ×Ö½Ú pack_index = data; usart_receive_state = UsartReceiveWaitDataLen; } else if(usart_receive_state == UsartReceiveWaitCMD) { //ÊÕµ½Ö¸ÁîÀàÐÍ×Ö½Ú pack_cmd = data; usart_receive_state = UsartReceiveWaitIndex; } else if(usart_receive_state == UsartReceiveWaitLength) { //ÊÕµ½³¤¶È×Ö½Ú pack_length = data; pack_index = 0; usart_receive_state = UsartReceiveWaitCMD; } 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) && (data == 0x3)) { usart_receive_state = UsartReceiveWaitLength; pack_msgtype = data; } else { usart_receive_state = UsartReceiveWaitHead0; pack_index = 0; pack_length = 0; } } } void Usart3ParseDataHandler(uint8_t data) { // È«¾Ö±äÁ¿ static Usart0ReceiveState usart0_receive_state = Usart0ReceiveWaitHead0; static uint8_t index = 0; // »º³åÇøË÷Òý static uint8_t pack_cmd_type = 0; // Ö¸ÁîÀàÐÍ static uint8_t pack_msg_type = 0; // ÏûÏ¢ÀàÐÍ static uint8_t pack_data_len = 0; // Êý¾Ý³¤¶È static uint8_t pack_param_addr = 0; // ²ÎÊýµØÖ· static uint16_t pack_checksum = 0; // ½ÓÊÕµ½µÄУÑéºÍ static uint16_t calculated_checksum = 0; // ¼ÆËãµÃµ½µÄУÑéºÍ static uint8_t send_frame[256]; // ÓÃÓÚ¼ÆËãУÑéºÍµÄÖ¡ static uint8_t frame_index = 0; // Ö¡»º³åÇøË÷Òý static uint8_t pack_datalen = 0; LOG_INFO(TRACE_MODULE_APP,"ÊÕµ½Êý¾Ý%c\r\n",data); //LOG_INFO(TRACE_MODULE_APP,"ÊÕµ½ %#x\r\n",data); switch(usart0_receive_state) { case Usart0ReceiveWaitHead0: if(data == 0x55) { usart0_receive_state = Usart0ReceiveWaitHead1; // ³õʼ»¯Ö¡»º³åÇø frame_index = 0; send_frame[frame_index++] = data; } break; case Usart0ReceiveWaitHead1: if(data == 0xAA) { usart0_receive_state = Usart0ReceiveWaitCmdType; send_frame[frame_index++] = data; } else { usart0_receive_state = Usart0ReceiveWaitHead0; } break; case Usart0ReceiveWaitCmdType: if(data == 0x23) { pack_cmd_type = data; usart0_receive_state = Usart0ReceiveWaitMsgType; send_frame[frame_index++] = data; } else { usart0_receive_state = Usart0ReceiveWaitHead0; } break; case Usart0ReceiveWaitMsgType: if(data == 0x2||data==0x1||data == 0x3||data==0x4||data==0x5||data==0x6) { // ¶Áд»Ø¸´ÏûÏ¢ÀàÐÍ pack_msg_type = data; usart0_receive_state = Usart0ReceiveWaitDataLen; send_frame[frame_index++] = data; } else { usart0_receive_state = Usart0ReceiveWaitHead0; } break; case Usart0ReceiveWaitDataLen: pack_data_len = data; index = 0; usart0_receive_state = Usart0ReceiveWaitData; send_frame[frame_index++] = data; if( pack_data_len-3==0)//ÈôµÈÓÚ0Ìáǰµ÷µ½Ð£Ñé usart0_receive_state=Usart0ReceiveWaitChecksum1; break; // case Usart0ReceiveWaitParamAddr: // pack_param_addr = data; // if(pack_msg_type==CMD_READ) // { // usart0_receive_state = Usart0ReceiveWaitChecksum1; // pack_datalen=pack_data_len-6; // }else{ // usart0_receive_state = Usart0ReceiveWaitData; // } // send_frame[frame_index++] = data; // break; case Usart0ReceiveWaitData: send_frame[frame_index++] = data; mUsart2ReceivePack[index++] = data; if(index == pack_data_len-3) { usart0_receive_state = Usart0ReceiveWaitChecksum1; //pack_datalen=pack_data_len; } break; case Usart0ReceiveWaitChecksum1: pack_checksum = data; // µÍ×Ö½Ú pack_checksum_test = data; // µÍ×Ö½Ú send_frame[frame_index++] = data; usart0_receive_state = Usart0ReceiveWaitChecksum2; LOG_INFO(TRACE_MODULE_APP,"ÊÕµ½Ð£Ñé1 %#x\r\n",data); break; case Usart0ReceiveWaitChecksum2: pack_checksum |= data<<8; // ¸ß×Ö½Ú pack_checksum_test |= data<<8; // ¸ß×Ö½Ú LOG_INFO(TRACE_MODULE_APP,"ÊÕµ½Ð£Ñé2 %#x\r\n",data); // ¼ÆËãУÑéºÍ (´ÓµÚ3¸ö×Ö½Ú¿ªÊ¼£¬³¤¶ÈΪ4+Êý¾Ý³¤¶È) // if(pack_msg_type!=CMD_REPLY) // { calculated_checksum = Checksum_u16(&send_frame[2],pack_data_len); // }else{ // //calculated_checksum = Checksum_u16(&send_frame[2],4); // // } test_calculate=calculated_checksum; LOG_INFO(TRACE_MODULE_APP,"ÊÕµ½Ð£Ñé %#x,%#x\r\n",calculated_checksum,pack_checksum); // Ñé֤УÑéºÍ if(pack_checksum == calculated_checksum) { // УÑéͨ¹ý£¬´¦ÀíÊý¾Ý switch(pack_msg_type) { case BIND_DISTANCE_FOR_TAG: memcpy(&bind_distance,&mUsart2ReceivePack[0],2); memcpy(&g_com_map[BIND_DISTANCE],&bind_distance,2); bind_flag=1; save_com_map_to_flash(); break; case DELETE_ALL: memset(tag_id_authorization_list,0,sizeof(tag_id_authorization_list)); save_taglist_map_to_flash(); break; case DELETE_PART: delete_authorization_list(&mUsart2ReceivePack,&tag_id_authorization_list,&tag_id_authorization_list_num);//ɾ±íÖÐÔªËØ²Ù×÷ save_taglist_map_to_flash(); break; case SET_DISTANCE_DETERMINATION: memcpy(&button_determinate_distance,&mUsart2ReceivePack[0],2);//É趨¿ª¹ØÅжϾàÀë memcpy(&g_com_map[DETERMINATION_DISTANCE],&button_determinate_distance,2); save_com_map_to_flash(); break; case SET_FREQUENCE_BY_DISTANCE: memcpy(&change_by_frequency_distance,&mUsart2ReceivePack[0],2);//É趨¸½½ü¾àÀë memcpy(&g_com_map[FREQUENCY_DISTANCE],&change_by_frequency_distance,2); tag_near_frequency=mUsart2ReceivePack[2];//»ñÈ¡É趨ƵÂÊ memcpy(&g_com_map[NERA_FREQUENCY],&tag_near_frequency,1); save_com_map_to_flash(); break; case ADD_NEW_TAG_IN_LIST: add_new_tag_id_to_list(&mUsart2ReceivePack,&tag_id_authorization_list,&tag_id_authorization_list_num); save_taglist_map_to_flash();//´æÈëflash break; default: break; } } // ÖØÖÃ״̬»ú usart0_receive_state = Usart0ReceiveWaitHead0; index = 0; frame_index = 0; break; default: usart0_receive_state = Usart0ReceiveWaitHead0; index = 0; frame_index = 0; break; } } void Usart1ParseDataHandler(uint8_t data) { if(state5V_prase_flag&&!g_com_map[MODBUS_MODE]) { //Éý¼¶³ÌÐò 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; if(usart_receive_state == UsartReceiveWaitChecksum) { //ÈôÊÕµ½Ð£ÑéºÍ°ü checksum = 0; for(int i = 0; i>1); break; default: break; } } 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-5) { //Èç¹ûÊÕµ½µÄindexÓ볤¶ÈÏàµÈ usart_receive_state = UsartReceiveWaitChecksum; } } else if(usart_receive_state == UsartReceiveWaitDataLen) { //ÊÕµ½Ö¸ÁîÀàÐÍ×Ö½Ú pack_datalen = data; usart_receive_state = UsartReceiveWaitData; } else if(usart_receive_state == UsartReceiveWaitIndex) { //ÊÕµ½Ö¸ÁîÀàÐÍ×Ö½Ú pack_index = data; usart_receive_state = UsartReceiveWaitDataLen; } else if(usart_receive_state == UsartReceiveWaitCMD) { //ÊÕµ½Ö¸ÁîÀàÐÍ×Ö½Ú pack_cmd = data; usart_receive_state = UsartReceiveWaitIndex; } else if(usart_receive_state == UsartReceiveWaitLength) { //ÊÕµ½³¤¶È×Ö½Ú pack_length = data; pack_index = 0; usart_receive_state = UsartReceiveWaitCMD; } 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) && (data == 0x3)) { usart_receive_state = UsartReceiveWaitLength; pack_msgtype = data; } else { usart_receive_state = UsartReceiveWaitHead0; pack_index = 0; pack_length = 0; } } else if(gps_prase_flag) { static uint8_t index = 0; //GPS½âÎöÊý¾Ý // static ST_BLERecv BLE_recvive; GGA_DataStruct jdrecv,wdrecv,Posstate; //½ÓÊÕÊý¾Ý¿ªÊ¼·ÖÎö mUsart2ReceivePack[index] = data; //charÊý×é´«½øÀ´²ÎÊýdata mUsart2ReceivePack_before = mUsart2ReceivePack_now; mUsart2ReceivePack_now=data; index++; if( mUsart2ReceivePack_before == 0x0D && mUsart2ReceivePack_now==0x0A )//½ÓÊÕÊý¾Ýµ½¡°0x0D 0x0A¡±½áÊø { //½âÎö¸ÃÌõGPS±¨ÎÄ analysis_num=sscanf((char*)mUsart2ReceivePack,"$%[^,],%*[^,],%[^,],%*[^,],%[^,],%*[^,],%[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*s",gps_header,wdrecv.m_pData,jdrecv.m_pData,Posstate.m_pData); if(!memcmp(gps_header,"GNGGA",5)) { memcpy(GPS_GGAmessage,mUsart2ReceivePack,strlen(mUsart2ReceivePack)-2); wd=strtod(wdrecv.m_pData,NULL); jd=strtod(jdrecv.m_pData,NULL); if(wd!=0) pos_state=atoi(Posstate.m_pData); if(pos_state!=0) { pos_state=0;//·ÀÖ¹¶à´Î½øÈë } } // if(!memcmp(gps_header,"GBGSV",5)) // {memcpy(GPS_GSVmessage,mUsart2ReceivePack,strlen(mUsart2ReceivePack)-2); // GPS_ParseGSV(GPS_GSVmessage,strlen(GPS_GSVmessage)); // // } memset(mUsart2ReceivePack,0,sizeof(mUsart2ReceivePack)); memset(wdrecv.m_pData,0,sizeof(wdrecv.m_pData)); memset(jdrecv.m_pData,0,sizeof(jdrecv.m_pData)); memset(Posstate.m_pData,0,sizeof(Posstate.m_pData)); index=0; mUsart2ReceivePack_before=0; mUsart2ReceivePack_now=0; } } }