#include "wireless_remote_comm.h" #include "uart.h" #include "gpio.h" #include "system_mem_para.h" #include "wrc_sizhu_v4.h" #include "system_general_para.h" #include "linked_list.h" #include "sizhu_alarm_record.h" WRC_CTRL_PARA_T wrc_ctrl_para_g={.wrc_state=WRC_IDLE,.link_status = LINK_NONE,.wrc_err_code = WRC_ERR_NONE,.report_result_flag = FAIL}; 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); CloseIO(PWR_3V8_EN_PORT,PWR_3V8_EN_PIN); PWR_3V8_OFF; WRC_PWR_OFF; } 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) { if((dma_recv_cnt >= WRC_REC_BUF_LENGTH) || (dma_recv_cnt >= WRC_RECV_BUFF_LEN_MAX) ) return; 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] = WRC_MODULE_CMD_OPEN; buffer[1] = WRC_MODULE_CMD_OPEN; 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_UART_SEND(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]==WRC_MODULE_CMD_LINK_STATUS_ACK)&&(receive_buf[count_i+1]==WRC_MODULE_CMD_LINK_STATUS_ACK)) { 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){ WRC_RX_DMA_CH3_reload(); //Êý¾ÝУÑéͨ¹ý¿ÉÒÔÈÏΪµ±´ÎÏëÒª½ÓÊÕµÄÊý¾ÝÒѾ­Íê³É£¬ÐèÒªÖØÖÃDMA½ÓÊÕ, 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,uint8_t *ack_buf,uint16_t *ack_buf_length) { 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 , WRC_MODULE_CMD_DATA_RECV); if(buf_p != NULL){ buf_next_p = strstr(buf_p , ","); if(buf_next_p != NULL){ return SizhuV4ProtocolDataAnalysis((uint8_t *)buf_next_p,ack_buf,ack_buf_length); } } return WRC_WAIT_REC_DATA; } WRC_STATUS WrcOpenPwrPro(void) { WRC_PWR_GPIO_Init(); PWR_3V8_ON; delay_us(10); WRC_PWR_ON; wrc_ctrl_para_g.wrc_err_code = WRC_ERR_NONE; wrc_ctrl_para_g.wrc_OFF_cnt = 0; //±ØÒªµÄͨѶ²ÎÊý³õʼ»¯¿ÉÒÔ·ÅÔÚÕâÀï SizhuV4SendParaInit(); return WRC_CREATE_LINK; } WRC_STATUS WrcCreateLinkPro(void) { //´®¿ÚÅäÖà WRC_uart_Init(115200,NONE,OneBit); WRC_RX_DMA_CH3_Init(); uart_ctrl_para_g.WRC_rxto_flag = RESET; //·¢ËÍÃüÁîʹģ¿éÓë·þÎñÆ÷½¨Á¢Á´½Ó WrcSendCreateLinkCmd(); wrc_ctrl_para_g.link_status = LINK_NONE; __SYS_DELAY_SEC_TIME_SET_(wrc_timeout_para,wrc_ctrl_para_g.time_out_time_sec); return WRC_WAIT_REC_DATA; } WRC_STATUS WrcSendDataPro(void) { uint8_t send_buf[3+1024] = {0}; uint16_t send_length; //·¢ËÍÊý¾Ý´¦Àí send_length = SizhuV4SendNormalData2buf(&send_buf[3]); // wrc_ctrl_para_g.time_out_cnt = wrc_ctrl_para_g.time_out_time_sec; send_buf[0] = WRC_MODULE_CMD_DATA_UP; send_buf[1] = send_length &0xff; send_buf[2] = send_length >>8; if(send_length > sizeof(send_buf)){ wrc_ctrl_para_g.wrc_err_code = WRC_ERR_SEND_DATA; wrc_ctrl_para_g.wrc_OFF_cnt = 0; return WRC_OFF; } WRC_UART_SEND(send_buf,send_length + 3); __SYS_DELAY_SEC_TIME_SET_(wrc_timeout_para,wrc_ctrl_para_g.time_out_time_sec); return WRC_WAIT_REC_DATA; } WRC_STATUS WrcWaitRecDataPro(void) { WRC_STATUS return_status; uint8_t send_buf[3+1024] = {0}; uint16_t send_length = 0; //½ÓÊÕbuf´¦Àí if(uart_ctrl_para_g.WRC_rxto_flag ==SET){ uart_ctrl_para_g.WRC_rxto_flag = RESET; 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,&send_buf[3],&send_length);//ƽ̨ÏÂÐÐÊý¾Ý·ÖÎö if((send_length > 0)&&(send_length < sizeof(send_buf))){ //ƽÏìÓ¦Êý¾ÝÐèÒª·¢ËÍ send_buf[0] = WRC_MODULE_CMD_DATA_UP; send_buf[1] = send_length &0xff; send_buf[2] = send_length >>8; WRC_UART_SEND(send_buf,send_length + 3); __SYS_DELAY_SEC_TIME_SET_(wrc_timeout_para,wrc_ctrl_para_g.time_out_time_sec); } memset(wrc_uart_para_g.recv_buf,0,sizeof(wrc_uart_para_g.recv_buf)); return return_status; } } if(__SYS_DELAY_SEC_FLAG_GET(wrc_timeout_para) == SET){ //Åжϳ¬Ê±Í˳ö if(wrc_ctrl_para_g.link_status ==LINK_NONE) wrc_ctrl_para_g.wrc_err_code = WRC_ERR_WAIT_LINK_TIME_OUT; else if(wrc_ctrl_para_g.link_status ==LINK_OK) wrc_ctrl_para_g.wrc_err_code = WRC_ERR_WAIT_ACK_TIME_OUT; wrc_ctrl_para_g.wrc_OFF_cnt = 0; return WRC_OFF; } return WRC_WAIT_REC_DATA; } WRC_STATUS WrcClosePwrPro(void) { char send_buf[7] = {'A','T','C','L','O','S','E'}; //»ñÈ¡²»Í¬Ð­ÒéµÄͨѶ½á¹û wrc_ctrl_para_g.wrc_result_flag = wrc_sizhuV4_result_flag; wrc_ctrl_para_g.report_result_flag = (report_sizhuV4_result_flag == PASS)? PASS: wrc_ctrl_para_g.wrc_result_flag;//Ö»Óгɹ¦²Å¸Ä±ä״̬£¬·ñÔò±£³ÖÔ­Öµ report_sizhuV4_result_flag = FAIL; wrc_ctrl_para_g.wrc_OFF_cnt ++; if(wrc_ctrl_para_g.wrc_OFF_cnt == 1){ WRC_UART_SEND((uint8_t *)send_buf,sizeof(send_buf)); return WRC_OFF; }else if(wrc_ctrl_para_g.wrc_OFF_cnt == 3){ //¹Ø±ÕµçÔ´ WRC_PWR_OFF; delay_us(10); PWR_3V8_OFF; return WRC_OFF; }else if(wrc_ctrl_para_g.wrc_OFF_cnt >= 8){ //ÑÓ³ÙÍ˳öͨѶÁ÷³Ì£¬´ËʱµçÔ´ÒѾ­¹Ø±Õ£¬Ï൱ÓÚ¸øµçÈÝÒ»¶¨Ê±¼ä³äµç WRC_PWR_OFF; PWR_3V8_OFF; /*ÖØ±¨´¦Àí£¬¸ù¾ÝЭÒ鲻ͬ*/ if(wrc_ctrl_para_g.wrc_result_flag == FAIL){ if(wrc_ctrl_para_g.wrc_start_flag != WRC_MEANS_AGAIN){ //Èç¹û·ÇÖØ±¨£¬ÔòÖØÖÃÖØ±¨¼ÆÊýÖµ wrc_ctrl_para_g.wrc_restart_num_cnt = wrc_para_sizhu_g.retransmission_num; } }else{ //Éϱ¨³É¹¦²»ÐèÒªÖØ±¨ wrc_ctrl_para_g.wrc_restart_num_cnt = 0; } return WRC_IDLE; //¹Ø»úÍê±Ï£¬·µ»ØWRC_IDLE½áÊø±¾´ÎͨѶÁ÷³Ì } return WRC_OFF; } //¶àÌìδÉϱ¨³É¹¦Åжϣ¬Åжϱê×¼¿ÉÒÔ±ÈͨѶÊÇ·ñ³É¹¦¿íËÉÒ»µã£¬Ö»ÒªÊý¾ÝÓÐÉϱ¨ÏìÓ¦¼´¿ÉÅжϳɹ¦£¬µ¥Ö¡Êý¾ÝÎÞÏìÓ¦µÄÓýáÊøÖ¡»òÕ߯äËûÖ¡´ú±í³É¹¦ void LongTimeReportFailed(BILLING_VALVE_CTRL_PATA_T billing_valve_ctrl_para_in) { static uint8_t report_failed_days_cnt = 0; //ÒòΪ´ó²¿·Ö±í0µãÖ®ºó»áÓÐÒ»´ÎͨѶ£¬ÄÇôÅжÏʱ¼äµã¿ÉÒÔÑÓºóµ½ÔçÉÏ6µã55ÅÐ¶Ï if((&sys_clockBCD_g)->hour == 6 && (&sys_clockBCD_g)->min == 55 && (&sys_clockBCD_g)->sec == 0 ){ if(billing_valve_ctrl_para_in.no_wrc_days > 0){ //´óÓÚ0´ú±í¹¦ÄÜ¿ªÆô if(wrc_ctrl_para_g.report_result_flag == PASS){ report_failed_days_cnt = 0; __SYS_STATUS_BYTES_STATUS(no_gprs_date_up_to, RESET, ALARM_ID_N_DAYS_NO_REPORT_ARRIVE); }else{ if((report_failed_days_cnt++) >= billing_valve_ctrl_para_in.no_wrc_days){ //ºó++ÊÇÒòΪµÚÒ»´ÎÅжÏʱ²»Âú1Ìì __SYS_STATUS_ALARM_BYTES_SET(no_gprs_date_up_to,ALARM_ID_N_DAYS_NO_REPORT_ARRIVE); } } } } } void WirelessRemoteCommPro(FUN_START_CTRL_PARA_T * sys_fun_run_ctrl_p) { //·Ç485²É¼¯¡¢·§¿ØÆÚ¼ä²ÅÄܽøÈëͨѶÁ÷³Ì 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){ case WRC_IDLE: break; case WRC_OPEN_PWR: wrc_ctrl_para_g.wrc_state = WrcOpenPwrPro() ;break; case WRC_CREATE_LINK: wrc_ctrl_para_g.wrc_state = WrcCreateLinkPro();break; case WRC_SEND_DATA: wrc_ctrl_para_g.wrc_state = WrcSendDataPro();break; case WRC_WAIT_REC_DATA: wrc_ctrl_para_g.wrc_state = WrcWaitRecDataPro();break; case WRC_OFF: wrc_ctrl_para_g.wrc_state = WrcClosePwrPro();;break; 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; //¶àÌìδÉϱ¨³É¹¦Åжϣ¬²»Í¬Ð­ÒéÅжϵıê×¼²»Í¬ LongTimeReportFailed(billing_valve_ctrl_para_g); }