forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-05-21 a05cacad5239ab3f35ffb58f443356b484e6cc1b
Function/WirelessRemoteComm/wireless_remote_comm.c
@@ -1,42 +1,180 @@
#include "wireless_remote_comm.h"
#include "uart.h"
#include "gpio.h"
#include "system_mem_para.h"
#include "wrc_sizhu_v4.h"
WRC_CTRL_PARA_T wrc_ctrl_para_g={.wrc_state=WRC_IDLE};
WRC_UART_PARA_T   wrc_uart_para_g = {.recv_flag = RESET};
LINK_INFO_T   link_info_g;
void WRC_PWR_GPIO_Init(void)
{
   OutputIO(WRC_PWR_PORT,WRC_PWR_PIN,OUT_PUSHPULL);
   OutputIO(PWR_3V8_O_PORT,PWR_3V8_O_PIN,OUT_PUSHPULL);
}
void WRC_RX_DMA_check(WRC_UART_PARA_T * wrc_ctrl_para_p)
{
   uint16_t timeout_cnt = 0,dma_recv_cnt;
   uint32_t dma_mar_reg_read = DMA_CHxMAR_Read(WRC_DMA_CHX);
   if(dma_mar_reg_read != (uint32)WRC_recv_buff){
      delay_ms(2);
      while(dma_mar_reg_read != DMA_CHxMAR_Read(WRC_DMA_CHX)){
         dma_mar_reg_read = DMA_CHxMAR_Read(WRC_DMA_CHX);
         delay_ms(2);
         if(timeout_cnt++ > 100)
            break;
      }
   }
   else
      return ;
   dma_recv_cnt = dma_mar_reg_read - (uint32)WRC_recv_buff;
   if(dma_recv_cnt)
   {
      wrc_ctrl_para_p->recv_length = dma_recv_cnt;
      arrayA_2_arrayB(WRC_recv_buff , wrc_ctrl_para_p->recv_buf, dma_recv_cnt, LITTLE_ENDIAN) ;
      wrc_ctrl_para_p->recv_flag = SET;//½ÓÊÕÍê³É
   }
}
void WrcSendCreateLinkCmd(void)
{
   uint8_t buffer[255];
   uint8_t   i_index;
   
   //?·¢ËÍÄÚÈÝ´¦Àí
   buffer[0] = 0x1b;
   buffer[1] = 0x1b;
   buffer[2] = 0x00;
   
   arrayA_2_arrayB((uint8_t*)wrc_para_sizhu_g.ip1, &buffer[3], 4, LITTLE_ENDIAN);
   arrayA_2_arrayB((uint8_t*)&wrc_para_sizhu_g.ip_port1, &buffer[7], 2, LITTLE_ENDIAN);
   for(i_index = 0; i_index < 64; i_index ++){
      buffer[9+i_index] = 0;
   }
   arrayA_2_arrayB((uint8_t*)&wrc_para_sizhu_g.comm_timeout_time, &buffer[74], 2, LITTLE_ENDIAN);
   buffer[76]   =  0x02;// imeiºÍiccid¶¼ÐèÒª
   buffer[77]   =  0x01; //ÐÅÏ¢°ü1
   buffer[78]   =  wrc_para_sizhu_g.ip1_connect_type;
   buffer[79]   =  0;//²»ÐèÒªAPN
   for(i_index = 0; i_index < 64; i_index ++){
      buffer[80+i_index] = 0;
   }
   for(i_index = 0; i_index < 32; i_index ++){
      buffer[144+i_index] = 0;
   }
   for(i_index = 0; i_index < 20; i_index ++){
      buffer[176+i_index] = 0;
   }
   for(i_index = 0; i_index < 7; i_index ++){
      buffer[196+i_index] = 0x00;
   }
   buffer[203] = 0;
   for(i_index = 0; i_index < 203; i_index ++)
   {
      buffer[203] += buffer[i_index];
   }
   buffer[204] = 0x16;
   
   WRC_SEND_NORMAL(buffer,205);
}
LINK_STATUS      LinkDataAnalysis(uint8_t *receive_buf)
{
   char *buf_p = NULL;
   uint8_t check_sum = 0;
   uint16_t count_i = 0;
   LINK_STATUS   return_flag = LINK_NONE;
   for(count_i = 0;count_i< 100;count_i++){
      if((receive_buf[count_i]==0x41)&&(receive_buf[count_i+1]==0x41))
      {
         buf_p = (char *)(&(receive_buf[count_i]));
         break;
      }
   }
   if(buf_p !=NULL){
      check_sum = 0;
      for(count_i = 0;count_i< 89;count_i++)
         check_sum += *(buf_p + count_i);
      if((*(buf_p + 89) == check_sum)&&(*(buf_p + 90) == 0x16)){
         if(*(buf_p + 2) == 1){
            return_flag = LINK_OK;
            if((*(buf_p+3) != 1)&&(*(buf_p+3) <0x39)){
               link_info_g.net_signal_intensity = *(buf_p+3);
            }
            else{
               link_info_g.net_signal_intensity = 0;
            }
            arrayA_2_arrayB((uint8_t *)(buf_p+4), (uint8_t *)link_info_g.ICCID, 20, LITTLE_ENDIAN);
            link_info_g.SIM_Type = *(buf_p + 24);
            arrayA_2_arrayB((uint8_t *)(buf_p+27), (uint8_t *)link_info_g.IMEI, 15, LITTLE_ENDIAN);
            arrayA_2_arrayB((uint8_t *)(buf_p+44), (uint8_t *)link_info_g.SNR, 2, LITTLE_ENDIAN);
         }else{
            return_flag = LINK_NONE;
         }
      }
   }
   return   return_flag;
}
WRC_STATUS   ProtocolDataAnalysis(uint8_t *receive_buf)
{
   char *buf_p = NULL;
   char *buf_next_p = NULL;
//   uint16_t check_crc = 0;
   uint16_t count_i = 0;
   buf_p = strstr((char *)receive_buf , "+R");
   if(buf_p != NULL){
      buf_next_p = strstr(buf_p , ",");
      if(buf_next_p != NULL){
         return SizhuV4ProtocolDataAnalysis((uint8_t *)buf_next_p);
      }
   }
   return   WRC_WAIT_REC_DATA;
}
WRC_STATUS   WrcOpenPwrPro(void)
{
   
   WRC_PWR_GPIO_Init();
   PWR_3V8_ON;
   delay_us(10);
   WRC_PWR_ON;
   
   //?´®¿Ú³õʼ»¯
   //?±ØÒªµÄͨѶ²ÎÊý³õʼ»¯¿ÉÒÔ·ÅÔÚÕâÀï,Ò²¿ÉÒÔ·ÅÔÚÁªÍø³É¹¦Ö®ºó
   SizhuV4SendParaInit();
   
   return WRC_SEND_DATA;
}
@@ -44,7 +182,13 @@
WRC_STATUS   WrcCreateLinkPro(void)
{
   
   //´®¿ÚÅäÖÃ
   WRC_uart_Init(115200,NONE,OneBit);
   //?·¢ËÍÃüÁîʹģ¿éÓë·þÎñÆ÷½¨Á¢Á´½Ó
   WrcSendCreateLinkCmd();
   wrc_ctrl_para_g.link_status = LINK_NONE;
   
   
   return WRC_WAIT_REC_DATA;
@@ -63,13 +207,28 @@
WRC_STATUS   WrcWaitRecDataPro(void)
{
   WRC_STATUS   return_status;
   //½ÓÊÕbuf´¦Àí
   WRC_RX_DMA_check(&wrc_uart_para_g);
   
   //?·¢ËÍÊý¾Ý´¦Àí
   //½ÓÊÕÊý¾ÝÅжÏ
   if(wrc_uart_para_g.recv_flag == SET){
      wrc_uart_para_g.recv_flag = RESET;
      if(wrc_ctrl_para_g.link_status ==LINK_NONE){
         wrc_ctrl_para_g.link_status = LinkDataAnalysis(wrc_uart_para_g.recv_buf);
         if(wrc_ctrl_para_g.link_status ==LINK_OK){
            memset(wrc_uart_para_g.recv_buf,0,sizeof(wrc_uart_para_g.recv_buf));
            return WRC_SEND_DATA;
         }
      }else if(wrc_ctrl_para_g.link_status ==LINK_OK){
         return_status = ProtocolDataAnalysis(wrc_uart_para_g.recv_buf);
         memset(wrc_uart_para_g.recv_buf,0,sizeof(wrc_uart_para_g.recv_buf));
         return return_status;
      }
   }
   return WRC_SEND_DATA;
   
   //Åжϳ¬Ê±Í˳ö
   return WRC_CLOSE_PWR;
   
}
@@ -78,7 +237,7 @@
WRC_STATUS   WrcClosePwrPro(void)
{
   
   //?·¢ËÍÊý¾Ý´¦Àí
   
   
@@ -90,11 +249,16 @@
void WirelessRemoteCommPro(void)
void WirelessRemoteCommPro(FUN_START_CTRL_PARA_T * sys_fun_run_ctrl_p)
{
   
   //?·Ç485²É¼¯¡¢·§¿ØÆÚ¼ä²ÅÄܽøÈëͨѶÁ÷³Ì
   //wrc_ctrl_para_g.wrc_state = WRC_OPEN_PWR;
   if((sys_fun_run_ctrl_p->wrc_ctrl_flag.start_flag ==SET)&&(sys_fun_run_ctrl_p->valve_ctrl_flag.running_flag == RESET)&&(sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag == RESET))//?ÅжÏ485²É¼¯±êʶ
   {
      sys_fun_run_ctrl_p->wrc_ctrl_flag.start_flag =RESET;
      if(wrc_ctrl_para_g.wrc_state == WRC_IDLE)
         wrc_ctrl_para_g.wrc_state = WRC_OPEN_PWR;
   }
   
   
   switch (wrc_ctrl_para_g.wrc_state){
@@ -108,5 +272,11 @@
        default:;
    }
   
   if(wrc_ctrl_para_g.wrc_state==WRC_IDLE)
      sys_fun_run_ctrl_p->wrc_ctrl_flag.running_flag = RESET;
   else
      sys_fun_run_ctrl_p->wrc_ctrl_flag.running_flag = SET;
}