forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-06-07 fa6053f85287163f6e2d5dba690bec05cbc95f4a
Function/WirelessRemoteComm/wrc_sizhu_v4.c
@@ -9,12 +9,14 @@
#include "AES128.h"
#include "system_general_para.h"
#include "linked_list.h"
#include "uart.h"
static   SIZHU_V4_PROTOCOL_HEAD_T   protocol_head_up_g ={.frame_start_code = SIZHU_FRAME_HEAD,.data_start_code = SIZHU_DATA_HEAD};
static   SIZHU_V4_PROTOCOL_NORMAL_DATA_HEAD_T   up_data_head_g;
static   SIZHU_V4_PROTOCOL_TAIL_T   proto_tail_up_g = {.frame_end_code = SIZHU_FRAME_TAIL};
static   SIZHU_V4_REPORT_CTRL_PARA_T   report_ctrl_para_g;
ErrorStatus   wrc_sizhuV4_result_flag = FAIL;    //×îÖÕµÄͨѶ½á¹ûÅжϣ¬³õʼÖÃFAIL£¬×îÖÕ¸ù¾ÝЭÒéÈ·Èϱ¾´ÎͨѶÊÇ·ñ³É¹¦£¬±ÈÈç˼ÖþµÄЭÒéͨ¹ý½áÊøÖ¡ÅжÏÊÇ·ñ×îÖճɹ¦
ErrorStatus   report_sizhuV4_result_flag = FAIL; //Éϱ¨ÊÇ·ñ³É¹¦±êÖ¾£¬ÓÃÓÚÒ»ÌìÖ®ÄÚÓÐûÓÐÉÏ´«³É¹¦¹ý£¬¸úwrc_sizhuV4_result_flagͨѶÊÇ·ñ³É¹¦²»Ò»Ñù£¬¿íËÉÒ»µã£¬Ö»ÒªÊý¾ÝÉϱ¨ÏìÓ¦³É¹¦¼´´ú±íÉϱ¨³É¹¦£¬ÊÕµ½½áÊøÖ¡Ò²´ú±í³É¹¦
//static   uint16_t   current_report_data_num = 0;
@@ -41,7 +43,7 @@
   /*ͨѶÏà¹Ø*/
   wrc_ctrl_para_g.time_out_time_sec = wrc_para_sizhu_g.comm_timeout_time; //³¬Ê±Ê±¼ä
   wrc_sizhuV4_result_flag = FAIL;
   wrc_ctrl_para_g.wrc_restart_time_sec_cnt = wrc_para_sizhu_g.retransmission_interval ; //ÖÃÖØ±¨¼ä¸ôʱ¼ä
   wrc_ctrl_para_g.wrc_restart_time_sec_cnt = wrc_para_sizhu_g.retransmission_interval * 60 ; //ÖÃÖØ±¨¼ä¸ôʱ¼ä
   
   /*ЭÒéÏà¹Ø*/
   protocol_head_up_g.frame_start_code = SIZHU_FRAME_HEAD;
@@ -107,19 +109,21 @@
{
   uint8_t yushu;
   uint8_t   fill_num;
   uint16_t   Encrypt_Bytes= 0;
   
   if((KeyVer&0x7f) > 8)
      return;
//   *length = ((*length % 16 )!=0) ? ((*length >>4) + 1)*16 : *length;
   /*²»ÊÇ16ÕûÊý±¶£¬ÔòÌî³äÖÁ16µÄÕûÊý±¶£¬È±N¸öÌî³äN¸öN*/
   yushu = (*length) & 0x0f;
   Encrypt_Bytes = *length;
   yushu = Encrypt_Bytes & 0x0f;
   if(yushu != 0){
      fill_num = 16 - yushu;
      for(uint8_t count_i=0;count_i < fill_num ;count_i ++){
         *(buf_in + *length + count_i) = fill_num;
         *(buf_in + Encrypt_Bytes + count_i) = fill_num;
      }
      *length = ((*length >>4) + 1) <<4;
      *length = ((Encrypt_Bytes >>4) + 1) <<4;
   }
   
   //°´16¸öΪһ×é½øÐмÓÃÜ
@@ -152,11 +156,12 @@
uint16_t   SizhuV4SendNormalData2buf(uint8_t * send_buf)
{
//   uint8_t send_buf[1024] = {0};
   uint16_t   data_length =0;
   uint16_t   crc_addr;
   uint8_t      current_frame_data_num;
   SIZHU_V4_PROTOCOL_NORMAL_DATA_PACK_T   one_pack_data;
   
   arrayA_2_arrayB((uint8_t*)&sys_clockBCD_g, (uint8_t*)&protocol_head_up_g.device_time, 8, LITTLE_ENDIAN);
   arrayA_2_arrayB((uint8_t*)&sys_clockBCD_g, (uint8_t*)&protocol_head_up_g.device_time, sizeof(sys_clockBCD_g), LITTLE_ENDIAN);
//   arrayA_2_arrayB((uint8_t*)system_alarm_word_g.alarm_word_union, (uint8_t*)&up_data_head_g.alarm_word, 14, LITTLE_ENDIAN); //ʱ¼äºÍ±¨¾¯×Ö»áËæÊ±¸üУ¬ËùÒÔ·ÅÔÚÉϱ¨Ç°¸³Öµ
   //ÔÚËùÓб¨¾¯×Ö¶¼ÊǽöÕ¼1¸öBitµÄÇé¿öÏ£¬¿ÉÒÔÓûò|À´µþ¼Ó±¨¾¯£¬ÕâÑù¿ÉÒÔ½«ÉÏ´ÎδÉϱ¨³É¹¦±¨¾¯×Öµþ¼Óеı¨¾¯×Ö¼ÌÐøÉϱ¨
   for(uint8_t count_i =0;count_i < 7;count_i ++){
@@ -181,9 +186,9 @@
   one_pack_data.temperature = flow_meter_data_g.temperature;
   one_pack_data.balance = save_realtime_data_g.realtime_billing_data_s.balance_now * 1000 ;
   one_pack_data.uint_price = save_realtime_data_g.realtime_billing_data_s.price_now;
   one_pack_data.lith_vcc = pwr_vol_g.lith_vcc;
   one_pack_data.lith_vcc = pwr_vol_g.lith_vcc * 10;
   one_pack_data.lith_vcc_per = pwr_vol_g.lith_synthesize_per;
   one_pack_data.alka_vcc = pwr_vol_g.alka_vcc;
   one_pack_data.alka_vcc = pwr_vol_g.alka_vcc * 10;
   one_pack_data.alka_vcc_per = pwr_vol_g.alka_vcc_per;
   arrayA_2_arrayB((uint8_t*)&system_status_word_g.status_word_union, (uint8_t*)&one_pack_data.status, 12, LITTLE_ENDIAN);
   
@@ -206,7 +211,9 @@
   
   //¼ÓÃÜ
   if((protocol_head_up_g.key_ver & 0x80) == 0x80){
      DataAes128EcbEncrypt(protocol_head_up_g.key_ver,(uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU],(uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU],&protocol_head_up_g.data_length);
      data_length = protocol_head_up_g.data_length;
      DataAes128EcbEncrypt(protocol_head_up_g.key_ver,(uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU],(uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU],&data_length);
      protocol_head_up_g.data_length = data_length;  //¼ÓÃÜÐèÒªÌî³ä£¬³¤¶È»á±ä
   }
   
   //ÓÉÓÚ¼ÓÃÜÌî³ä»áµ¼ÖÂÊý¾Ý³¤¶È±ä»¯£¬ËùÒÔÖ¡Í·µÄ×ªÒÆÐèÒª·ÅÔÚ¼ÓÃÜÖ®ºó
@@ -228,6 +235,7 @@
   WRC_STATUS   return_code = WRC_WAIT_REC_DATA;
   if(*receive_buf == 0x00){
      //ÏàÓ¦³É¹¦
      report_sizhuV4_result_flag = PASS;
      if(protocol_head_up_g.frame_num == 1){
         //?µÚÒ»ÕëÉϱ¨³É¹¦Ö®ºóÇå³ý±¨¾¯×Ö£¬½öÓÐһ֡ʱûÓÐÊý¾ÝÏìÓ¦Ö¡£¬ÔòÔÚ½áÊøÖ¡ÖлòÆäËûƽ̨±ØÏµÄÖ¸ÁîÖÐÔÙ´ÎÇå³ý±¨¾¯×Ö
         for(uint8_t count_j =0;count_j < 7;count_j ++){
@@ -260,6 +268,7 @@
   int difference_value;
   
   wrc_sizhuV4_result_flag = PASS;
   report_sizhuV4_result_flag = PASS;
   
   //?µÚÒ»ÕëÉϱ¨³É¹¦Ö®ºóÇå³ý±¨¾¯×Ö£¬½öÓÐһ֡ʱûÓÐÊý¾ÝÏìÓ¦Ö¡£¬ÔòÔÚ½áÊøÖ¡ÖлòÆäËûƽ̨±ØÏµÄÖ¸ÁîÖÐÔÙ´ÎÇå³ý±¨¾¯×Ö
   for(uint8_t count_j =0;count_j < 7;count_j ++){
@@ -324,6 +333,22 @@
   return return_code;
}
//ÉèÖÃÓà¶î¹Ø·§
WRC_STATUS   SetBalanceValveClosePro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
{
   WRC_STATUS   return_code = WRC_WAIT_REC_DATA;
   //?´æ´¢
   ack_buf[0]   = 0;//³É¹¦
   *ack_buf_length = 1; //¼ÓÃÜǰµÄÊý¾Ý³¤¶È
   return return_code;
}
WRC_STATUS   SetAccountPro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
{
   WRC_STATUS   return_code = WRC_WAIT_REC_DATA;
@@ -355,17 +380,17 @@
WRC_STATUS   SizhuV4ProtocolDataAnalysis(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
{
   char *buf_p = NULL;
   uint8_t *buf_p = NULL;
   uint16_t count_i = 0;
   SIZHU_V4_PROTOCOL_HEAD_T   protocol_head_rec;
   uint16_t   check_crc;
   uint16_t   check_crc,recv_crc;
   uint16_t   crc_addr;
   WRC_STATUS   return_code = WRC_WAIT_REC_DATA;
//   uint8_t   key_ver;
   uint16_t   ack_data_length = 0; //¼ÓÃÜǰµÄ³¤¶È
   count_i =0;
   buf_p +=2;  //ÒÆµ½ÏÂÒ»¸ö¶ººÅ
   buf_p =  receive_buf + 2;  //ÒÆµ½ÏÂÒ»¸ö¶ººÅ
   while(*buf_p != SIZHU_FRAME_HEAD)  //buf_pÖ¸ÏòÖ¡Í·
   {
      count_i++;
@@ -376,9 +401,12 @@
   }
   
   arrayA_2_arrayB((uint8_t*)buf_p, (uint8_t*)&protocol_head_rec, sizeof(protocol_head_rec), LITTLE_ENDIAN);
   arrayA_2_arrayB((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU + protocol_head_rec.data_length), (uint8_t*)&check_crc, 2, LITTLE_ENDIAN);
   if(check_crc == usMBCRC16(0xFFFF,(uint8_t *)buf_p,FIRST_DATA_SHIFT_SIZHU + protocol_head_rec.data_length)){
   arrayA_2_arrayB((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU + protocol_head_rec.data_length), (uint8_t*)&recv_crc, 2, BIG_ENDIAN);
   check_crc = usMBCRC16(0xFFFF,(uint8_t *)buf_p,FIRST_DATA_SHIFT_SIZHU + protocol_head_rec.data_length);
   if(check_crc == recv_crc){
      WRC_RX_DMA_CH3_reload(); //Êý¾ÝCRCͨ¹ý¿ÉÒÔÈÏΪµ±´ÎÏëÒª½ÓÊÕµÄÊý¾ÝÒѾ­Íê³É£¬ÐèÒªÖØÖÃDMA½ÓÊÕ,
      if((protocol_head_rec.key_ver & 0x80)==0x80){
         //? ¸ù¾ÝÃÜÔ¿ºÅ½âÃÜ
         DataAes128EcbDecrypt(protocol_head_rec.key_ver,(uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),(uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),protocol_head_rec.data_length);
@@ -392,6 +420,8 @@
         case SIZHU_CONTROL_CODE_MODIFY_KEY : return_code = SetKeyPro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length);   break;
         case SIZHU_CONTROL_CODE_PUSH_SETTLEMENT_INFO : return_code = PushSettlementInfoPro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length);   break;
         case SIZHU_CONTROL_CODE_ACCOUNT_STATUS : return_code = PushSettlementInfoPro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length);   break;
         case SIZHU_CONTROL_CODE_SET_BALANCE_INSUF_CLOSE_VALVE : return_code = SetBalanceValveClosePro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length);   break;
         //?´ý²¹³ä
         default: break;
      }