#include "wrc_sizhu_v4.h"
|
#include "wireless_remote_comm.h"
|
#include "mbcrc1.h"
|
#include "system_mem_para.h"
|
#include "sizhu_ctrl_word.h"
|
#include "main.h"
|
#include "rs485_data_analysis_pro.h"
|
#include "power_manage.h"
|
#include "AES128.h"
|
#include "system_general_para.h"
|
#include "linked_list.h"
|
#include "uart.h"
|
#include "sizhu_event_record.h"
|
#include "sizhu_history_record.h"
|
#include "bootloader_iap.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 __attribute__ ((aligned (4))) 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;
|
|
uint32_t DataReadAddrInit(uint32_t current_save_addr,uint16_t data_num)
|
{
|
uint32_t read_start_addr ;
|
//?»ñÈ¡ÆðʼµØÖ·£¬Ã»Ð´Íê
|
read_start_addr = current_save_addr;
|
if(data_num == 0)
|
return read_start_addr;
|
|
while(data_num--){
|
if(read_start_addr <= HISTORY_INTERVAL_START_ADDR){
|
read_start_addr = HISTORY_INTERVAL_END_ADDR;
|
}else{
|
read_start_addr -= HISTORY_INTERVAL_LENGTH;
|
}
|
}
|
return read_start_addr;
|
}
|
|
|
//´Ó´æ´¢ÀïÃæ¶ÁÈ¡Êý¾Ý£¬Í¬Ê±µØÖ·Ö¸ÏòºóÒ»ÌõÊý¾Ý
|
void ReadDataFromRecord(uint32_t * read_addr ,uint8_t *buf)
|
{
|
SIZHU_HISTORY_INTERVAL_T history_interval_l;
|
SIZHU_V4_PROTOCOL_NORMAL_DATA_PACK_T up_data_pack_l;
|
//?´Ó´æ´¢ÀïÃæ¶ÁÈ¡Êý¾Ýµ½buf,Èç¹ûÅжϴ洢¶ÁÈ¡µÄÊý¾ÝÒì³££¬ÔòÌî³ä0»òÕßÈÝÒ×ʶ±ðµÄÊý¾Ý
|
//read_addr++
|
if(FlashMultipleReadAndCrcCheck((uint8_t *)&history_interval_l,*read_addr,HISTORY_INTERVAL_LENGTH)== PASS){
|
arrayA_2_arrayB((uint8_t *)&history_interval_l.record_time_BCD, (uint8_t *)&up_data_pack_l.sample_time, sizeof(up_data_pack_l.sample_time), LITTLE_ENDIAN);
|
up_data_pack_l.sc_cumulate = history_interval_l.forward_cumulate_sc * 10000;
|
up_data_pack_l.wc_cumulate = history_interval_l.forward_cumulate_wc * 10000;
|
up_data_pack_l.sc_instant = history_interval_l.instant_sc * 10000;
|
up_data_pack_l.wc_instant = history_interval_l.instant_wc * 10000;
|
up_data_pack_l.pressure = history_interval_l.pressure;
|
up_data_pack_l.temperature = history_interval_l.temperature;
|
up_data_pack_l.balance = history_interval_l.residual_amount * 1000;
|
up_data_pack_l.uint_price = history_interval_l.current_price;
|
up_data_pack_l.lith_vcc = history_interval_l.lith_bat_v;
|
up_data_pack_l.lith_vcc_per = history_interval_l.lith_bat_per;
|
up_data_pack_l.alka_vcc = history_interval_l.alka_bat_v;
|
up_data_pack_l.alka_vcc_per = history_interval_l.alka_bat_per;
|
arrayA_2_arrayB((uint8_t *)&history_interval_l.status_word, (uint8_t *)&up_data_pack_l.status, 12, LITTLE_ENDIAN);
|
|
arrayA_2_arrayB((uint8_t *)&up_data_pack_l, buf, DATA_PACKET_LENGTH, LITTLE_ENDIAN);
|
}else{
|
memset(buf,0,DATA_PACKET_LENGTH);
|
}
|
|
if(*read_addr >= HISTORY_INTERVAL_END_ADDR){
|
*read_addr = HISTORY_INTERVAL_START_ADDR;
|
}else{
|
*read_addr += HISTORY_INTERVAL_LENGTH;
|
}
|
|
}
|
|
|
|
void SizhuV4SendParaInit(void)
|
{
|
/*ͨѶÏà¹Ø*/
|
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 * 60 ; //ÖÃÖØ±¨¼ä¸ôʱ¼ä
|
|
/*ÐÒéÏà¹Ø*/
|
protocol_head_up_g.frame_start_code = SIZHU_FRAME_HEAD;
|
arrayA_2_arrayB((uint8_t*)equipment_basic_inf_g.serial_number, (uint8_t*)&protocol_head_up_g.device_num, 8, LITTLE_ENDIAN);
|
protocol_head_up_g.data_start_code = SIZHU_DATA_HEAD;
|
// arrayA_2_arrayB((uint8_t*)&sys_clockBCD_g, (uint8_t*)&protocol_head_up_g.device_time, 8, LITTLE_ENDIAN);
|
protocol_head_up_g.protocol_ver = SIZHU_PROTOCOL_VERSION;
|
protocol_head_up_g.cmd_code_u16 = SIZHU_CONTROL_CODE_DATAUP;
|
protocol_head_up_g.key_ver = KEY_VERSION + 0; //ÓÃ0ºÅ²âÊÔÃØÔ¿¼ÓÃÜ
|
|
up_data_head_g.equipment_type = (0x02 <<6) + equipment_basic_inf_g.equipment_type;
|
up_data_head_g.device_type = equipment_basic_inf_g.product_type;
|
up_data_head_g.sys_send_type = wrc_ctrl_para_g.wrc_start_flag;
|
arrayA_2_arrayB((uint8_t*)&link_info_g.ICCID, (uint8_t*)&up_data_head_g.iccid, 20, LITTLE_ENDIAN);
|
up_data_head_g.signal_intensity = link_info_g.net_signal_intensity;
|
if(up_data_head_g.signal_intensity > 20)
|
up_data_head_g.signal_intensity_level = 1;
|
else if(up_data_head_g.signal_intensity > 15)
|
up_data_head_g.signal_intensity_level = 2;
|
else
|
up_data_head_g.signal_intensity_level = 3;
|
|
up_data_head_g.net_info = link_info_g.SIM_Type ;
|
arrayA_2_arrayB((uint8_t*)main_equipment_hardware_software_inf_g.soft_serial_number, (uint8_t*)&up_data_head_g.software_version, 4, LITTLE_ENDIAN);
|
up_data_head_g.account_state = __SYS_STATUS_BYTES_GET(account_state);
|
|
|
// arrayA_2_arrayB((uint8_t*)system_alarm_word_g.alarm_word_union, (uint8_t*)&up_data_head_g.alarm_word, 14, LITTLE_ENDIAN); //
|
|
up_data_head_g.valve_close_reason = save_valve_para_g.valve_close_ID ;
|
up_data_head_g.data_package_format = 0;
|
|
//²âÊÔ·¢ËÍÒ»Ö¡µ±Ç°Êý¾Ý
|
#ifdef WRC_TEST_MODE_1
|
protocol_head_up_g.frame_sum = 1;
|
protocol_head_up_g.frame_num = 1;
|
|
|
#else
|
report_ctrl_para_g.current_report_data_num = wrc_data_num_ctrl_para_sizhu_g.report_data_save_num + wrc_data_num_ctrl_para_sizhu_g.report_data_left_num ;
|
report_ctrl_para_g.current_report_data_num = (report_ctrl_para_g.current_report_data_num > ONCE_REPORT_MAX_NUM)? ONCE_REPORT_MAX_NUM:report_ctrl_para_g.current_report_data_num; //ÏÞÖÆÉϱ¨ÌõÊý
|
report_ctrl_para_g.report_data_read_addr = DataReadAddrInit(log_sizhu_history_ctrl_g.per_interval_log.log_addr_save,report_ctrl_para_g.current_report_data_num);
|
wrc_data_num_ctrl_para_sizhu_g.report_data_save_num =0 ;
|
wrc_data_num_ctrl_para_sizhu_g.report_data_left_num = report_ctrl_para_g.current_report_data_num;
|
//?wrc_data_num_ctrl_para_sizhu_g´æ´¢
|
|
//¼ÆËã×ÜÖ¡Êý¼°×îºóÒ»Ö¡ÌõÊý
|
protocol_head_up_g.frame_sum = 1;
|
report_ctrl_para_g.last_frame_data_num = report_ctrl_para_g.current_report_data_num;
|
while(report_ctrl_para_g.last_frame_data_num > FRAME_DATA_MAX) {
|
report_ctrl_para_g.last_frame_data_num -= FRAME_DATA_MAX;
|
protocol_head_up_g.frame_sum ++;
|
}
|
|
protocol_head_up_g.frame_num = 1;
|
|
#endif
|
|
}
|
|
|
void DataAes128EcbEncrypt(uint8_t KeyVer,uint8_t *buf_in,uint8_t *buf_out,uint16_t *length)
|
{
|
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*/
|
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 + Encrypt_Bytes + count_i) = fill_num;
|
}
|
*length = ((Encrypt_Bytes >>4) + 1) <<4;
|
}
|
|
//°´16¸öΪһ×é½øÐмÓÃÜ
|
for(uint16_t count_i =0;count_i < (*length >>4);count_i++){
|
|
AES128_ECB_encrypt(buf_in + count_i*16, (u8*)wrc_para_sizhu_g.KVer_AES_128[KeyVer&0x7f], buf_out + count_i*16);
|
}
|
|
}
|
|
void DataAes128EcbDecrypt(uint8_t KeyVer,uint8_t *buf_in,uint8_t *buf_out,uint16_t length)
|
{
|
if(((length) & 0x0f)!=0)
|
return;
|
|
if((KeyVer&0x7f) > 8)
|
return;
|
|
//°´16¸öΪһ×é½øÐнâÃÜ
|
for(uint16_t count_i =0;count_i < (length >>4);count_i++){
|
|
AES128_ECB_decrypt(buf_in + count_i*16, (u8*)wrc_para_sizhu_g.KVer_AES_128[KeyVer&0x7f], buf_out + count_i*16);
|
}
|
|
}
|
|
|
|
//·µ»ØÊý¾Ý³¤¶È
|
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, 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 ++){
|
up_data_head_g.alarm_word[count_i] |= system_alarm_word_g.alarm_word_union[count_i];
|
system_alarm_word_g.alarm_word_union[count_i] = 0;//×ªÒÆÍê¾ÍÇåÁã
|
}
|
|
//Ìî³äÊý¾Ý
|
#ifdef WRC_TEST_MODE_1
|
//²âÊÔ·¢ËÍÒ»Ö¡µ±Ç°Êý¾Ý
|
protocol_head_up_g.frame_sum = 1;
|
protocol_head_up_g.frame_num = 1;
|
protocol_head_up_g.data_length = DATA_PACKET_HEAD_LENGTH + DATA_PACKET_LENGTH;
|
up_data_head_g.data_pack_num = 1;
|
|
arrayA_2_arrayB((uint8_t*)&sys_clockBCD_g, (uint8_t*)&one_pack_data.sample_time, 8, LITTLE_ENDIAN);
|
one_pack_data.sc_cumulate = flow_meter_data_g.cumulate_s.forward_cumulate_sc * 10000;
|
one_pack_data.wc_cumulate = flow_meter_data_g.cumulate_s.forward_cumulate_wc * 10000;
|
one_pack_data.sc_instant = flow_meter_data_g.instant_sc * 10000;
|
one_pack_data.wc_instant = flow_meter_data_g.instant_wc * 10000;
|
one_pack_data.pressure = flow_meter_data_g.pressure;
|
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 * 10;
|
one_pack_data.lith_vcc_per = pwr_vol_g.lith_synthesize_per;
|
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);
|
|
arrayA_2_arrayB((uint8_t*)&one_pack_data, (uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU + DATA_PACKET_HEAD_LENGTH], DATA_PACKET_LENGTH, LITTLE_ENDIAN);
|
|
#else
|
//´Ó´æ´¢ÀïÃæ¶ÁÈ¡¼ä¸ô¶³½á¼Ç¼½øÐÐÉϱ¨
|
current_frame_data_num = (protocol_head_up_g.frame_num < protocol_head_up_g.frame_sum)? FRAME_DATA_MAX:report_ctrl_para_g.last_frame_data_num;
|
|
for(uint8_t count_i =0;count_i < current_frame_data_num;count_i++ ){
|
ReadDataFromRecord(&report_ctrl_para_g.report_data_read_addr ,(uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU + DATA_PACKET_HEAD_LENGTH + count_i * DATA_PACKET_LENGTH]);
|
}
|
protocol_head_up_g.data_length = DATA_PACKET_HEAD_LENGTH + DATA_PACKET_LENGTH * current_frame_data_num;
|
up_data_head_g.data_pack_num = current_frame_data_num;
|
|
#endif
|
|
arrayA_2_arrayB((uint8_t*)&up_data_head_g, (uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU], DATA_PACKET_HEAD_LENGTH, LITTLE_ENDIAN);
|
|
//¼ÓÃÜ
|
if((protocol_head_up_g.key_ver & 0x80) == 0x80){
|
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; //¼ÓÃÜÐèÒªÌî³ä£¬³¤¶È»á±ä
|
}
|
|
//ÓÉÓÚ¼ÓÃÜÌî³ä»áµ¼ÖÂÊý¾Ý³¤¶È±ä»¯£¬ËùÒÔÖ¡Í·µÄ×ªÒÆÐèÒª·ÅÔÚ¼ÓÃÜÖ®ºó
|
arrayA_2_arrayB((uint8_t*)&protocol_head_up_g, (uint8_t*)&send_buf[0], FIRST_DATA_SHIFT_SIZHU, LITTLE_ENDIAN);
|
|
//¼ÆËãcrc
|
crc_addr = protocol_head_up_g.data_length + FIRST_DATA_SHIFT_SIZHU;
|
proto_tail_up_g.check_crc = usMBCRC16(0xFFFF, send_buf, crc_addr);
|
proto_tail_up_g.frame_end_code = SIZHU_FRAME_TAIL;
|
arrayA_2_arrayB((uint8_t*)&proto_tail_up_g, (uint8_t*)&send_buf[crc_addr], FRAME_TAIL_LENGTH, LITTLE_ENDIAN);
|
//·¢ËÍ
|
return FIRST_DATA_SHIFT_SIZHU + protocol_head_up_g.data_length + FRAME_TAIL_LENGTH;
|
}
|
|
|
|
WRC_STATUS DataReportAckPro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
|
{
|
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 ++){
|
up_data_head_g.alarm_word[count_j] = 0;
|
}
|
}
|
|
if(protocol_head_up_g.frame_num < protocol_head_up_g.frame_sum){ //Êý¾ÝÖ¡»¹Ã»·¢Íê
|
|
return_code = WRC_SEND_DATA;
|
protocol_head_up_g.frame_num ++;
|
}
|
}
|
|
if(wrc_data_num_ctrl_para_sizhu_g.report_data_left_num >= FRAME_DATA_MAX){
|
wrc_data_num_ctrl_para_sizhu_g.report_data_left_num -= FRAME_DATA_MAX;
|
}else{
|
wrc_data_num_ctrl_para_sizhu_g.report_data_left_num = 0;
|
}
|
//? ´æ´¢
|
*ack_buf_length = 0; //ÎÞÐèÏìÓ¦£¬³¤¶ÈÖÃ0
|
return return_code;
|
}
|
|
|
|
WRC_STATUS EndFramePro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
|
{
|
WRC_STATUS return_code = WRC_OFF;
|
int difference_value;
|
sClockBCD time_after_cali;
|
|
wrc_sizhuV4_result_flag = PASS;
|
report_sizhuV4_result_flag = PASS;
|
|
//?µÚÒ»ÕëÉϱ¨³É¹¦Ö®ºóÇå³ý±¨¾¯×Ö£¬½öÓÐһ֡ʱûÓÐÊý¾ÝÏìÓ¦Ö¡£¬ÔòÔÚ½áÊøÖ¡ÖлòÆäËûƽ̨±ØÏµÄÖ¸ÁîÖÐÔÙ´ÎÇå³ý±¨¾¯×Ö
|
for(uint8_t count_j =0;count_j < 7;count_j ++){
|
up_data_head_g.alarm_word[count_j] = 0;
|
}
|
|
//?×Ô¶¯Ð£Ê±,ʱ¼äÏà²î³¬¹ý5·ÖÖÓ×Ô¶¯Ð£Ê±
|
difference_value = Datecmp(receive_buf, (uint8_t *)&sys_clockBCD_g);
|
difference_value = abs(difference_value); // ¾ø¶ÔÖµ
|
if(difference_value >= 300){
|
Set_Extern_Rtc_Time(receive_buf[0],receive_buf[1],receive_buf[2],1,receive_buf[3],receive_buf[4],receive_buf[5]);
|
}
|
|
//´æ´¢Ð£Ê±¼Ç¼
|
arrayA_2_arrayB(receive_buf,(uint8_t *)&time_after_cali,sizeof(time_after_cali),LITTLE_ENDIAN);
|
sizhuSetTimeLogHandle(SET_TIME_SOURCE_AUTO , 0, time_after_cali);
|
|
//ÒÅÁôÊý¾ÝÇå¿Õ
|
wrc_data_num_ctrl_para_sizhu_g.report_data_left_num = 0;
|
//? ´æ´¢
|
|
*ack_buf_length = 0; //ÎÞÐèÏìÓ¦£¬³¤¶ÈÖÃ0
|
return return_code;
|
}
|
|
WRC_STATUS SetKeyPro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
|
{
|
WRC_STATUS return_code = WRC_WAIT_REC_DATA;
|
|
//½ÓÊÕ8×éÔËÓªÃØÔ¿
|
arrayA_2_arrayB(receive_buf, (uint8_t*)&wrc_para_sizhu_g.KVer_AES_128[1], 8*16, LITTLE_ENDIAN);
|
//?´æ´¢
|
|
ack_buf[0] = 0;//³É¹¦
|
*ack_buf_length = 1; //¼ÓÃÜǰµÄÊý¾Ý³¤¶È
|
return return_code;
|
}
|
|
WRC_STATUS PushSettlementInfoPro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
|
{
|
WRC_STATUS return_code = WRC_WAIT_REC_DATA;
|
|
int64_t recv_cumulate_sc,now_cumulate_sc,balance;
|
uint32_t price;
|
uint8_t ladder;
|
|
arrayA_2_arrayB(receive_buf + 6, (uint8_t*)&recv_cumulate_sc, sizeof(recv_cumulate_sc), LITTLE_ENDIAN);
|
arrayA_2_arrayB(receive_buf + 14, (uint8_t*)&balance, sizeof(balance), LITTLE_ENDIAN);
|
arrayA_2_arrayB(receive_buf + 22, (uint8_t*)&price, sizeof(price), LITTLE_ENDIAN);
|
ladder = *(receive_buf + 26);
|
|
save_realtime_data_g.realtime_billing_data_s.price_now = price;
|
save_realtime_data_g.realtime_billing_data_s.ladder_now = ladder;
|
now_cumulate_sc = save_realtime_data_g.realtime_flow_data_s.forward_cumulate_sc * 10000;
|
if(now_cumulate_sc > recv_cumulate_sc){
|
//½áËãÆøÁ¿Âäºóµ±Ç°ÆøÁ¿£¬ÔòÐèÒª²¹¿Û£¬·ñÔò»á¸úƽ̨ÓÐÓà¶î²î
|
save_realtime_data_g.realtime_billing_data_s.balance_now = balance * 0.001 - (now_cumulate_sc - recv_cumulate_sc)*0.0001 * price * 0.0001;
|
}else{
|
save_realtime_data_g.realtime_billing_data_s.balance_now = balance * 0.001;
|
}
|
|
//?´æ´¢
|
|
ack_buf[0] = 0;//³É¹¦
|
*ack_buf_length = 1; //¼ÓÃÜǰµÄÊý¾Ý³¤¶È
|
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;
|
|
ack_buf[0] = 0;//³É¹¦
|
|
if(*receive_buf == 1){
|
if(__SYS_STATUS_BYTES_GET(account_state) == RESET){
|
__SYS_STATUS_BYTES_STATUS(account_state, SET, ALARM_ID_NORMAL);
|
system_function_ctrl_word_g.fun_ctrl_word.account_open = 1;
|
//?´æ´¢
|
}
|
}else if(*receive_buf == 2){
|
if(__SYS_STATUS_BYTES_GET(account_state) == SET){
|
__SYS_STATUS_BYTES_STATUS(account_state, RESET, ALARM_ID_NORMAL);
|
system_function_ctrl_word_g.fun_ctrl_word.account_open = 0;
|
//?´æ´¢
|
}
|
|
}else{
|
ack_buf[0] = 1;//ʧ°Ü
|
}
|
|
// ack_buf[0] = 0;//³É¹¦
|
*ack_buf_length = 1; //¼ÓÃÜǰµÄÊý¾Ý³¤¶È
|
return return_code;
|
}
|
|
|
|
//OTA
|
WRC_STATUS OTA_config(uint8_t *receive_buf,uint16_t receive_data_length,uint8_t *ack_buf,uint16_t *ack_buf_length)
|
{
|
WRC_STATUS return_code = WRC_WAIT_REC_DATA;
|
uint8_t return_flag = SUCCESS_0;
|
ack_buf[0] = 0;//³É¹¦
|
|
return_flag = BootLoader_IapConfigSetHander(receive_buf,receive_data_length);
|
if(return_flag == SUCCESS_0){
|
ack_buf[0] = 0;
|
}else{
|
ack_buf[0] = return_flag;
|
}
|
|
// ack_buf[0] = 0;//³É¹¦
|
*ack_buf_length = 1; //¼ÓÃÜǰµÄÊý¾Ý³¤¶È
|
return return_code;
|
}
|
|
//OTA
|
WRC_STATUS OTA_DiffData(uint8_t *receive_buf,uint16_t receive_data_length,uint8_t *ack_buf,uint16_t *ack_buf_length)
|
{
|
WRC_STATUS return_code = WRC_WAIT_REC_DATA;
|
uint8_t return_flag = SUCCESS_0;
|
uint32_t offset_addr = (receive_buf[3] << 24) | (receive_buf[2] << 16) | (receive_buf[1] << 8) | receive_buf[0];
|
uint32_t data_len = receive_data_length - 4; //¼õÈ¥µØÖ·
|
ack_buf[0] = 0;//³É¹¦
|
|
//Êý¾Ý´Ó[4]¿ªÊ¼
|
return_flag = BootLoader_IapDiffDataHandler(&receive_buf[4],offset_addr,data_len);
|
if(return_flag == SUCCESS_0){
|
ack_buf[0] = 0;
|
}else{
|
ack_buf[0] = return_flag;
|
}
|
|
// ack_buf[0] = 0;//³É¹¦
|
*ack_buf_length = 1; //¼ÓÃÜǰµÄÊý¾Ý³¤¶È
|
return return_code;
|
}
|
|
//OTA
|
WRC_STATUS OTA_check(uint8_t *receive_buf,uint16_t receive_data_length,uint8_t *ack_buf,uint16_t *ack_buf_length)
|
{
|
WRC_STATUS return_code = WRC_WAIT_REC_DATA;
|
uint8_t return_flag = SUCCESS_0;
|
ack_buf[0] = 0;//³É¹¦
|
|
return_flag = BootLoader_IapConfigCheckHandler();
|
if(return_flag == SUCCESS_0){
|
ack_buf[0] = 0;
|
}else{
|
ack_buf[0] = return_flag;
|
}
|
|
// ack_buf[0] = 0;//³É¹¦
|
*ack_buf_length = 1; //¼ÓÃÜǰµÄÊý¾Ý³¤¶È
|
return return_code;
|
}
|
|
//OTA
|
WRC_STATUS OTA_DiffMap(uint8_t *receive_buf,uint16_t receive_data_length,uint8_t *ack_buf,uint16_t *ack_buf_length)
|
{
|
WRC_STATUS return_code = WRC_WAIT_REC_DATA;
|
uint8_t return_flag = SUCCESS_0;
|
uint32_t offset_addr = (receive_buf[3] << 24) | (receive_buf[2] << 16) | (receive_buf[1] << 8) | receive_buf[0];
|
uint32_t data_len = receive_data_length - 4; //¼õÈ¥µØÖ·
|
ack_buf[0] = 0;//³É¹¦
|
|
//Êý¾Ý´Ó[4]¿ªÊ¼
|
return_flag = BootLoader_IapDiffMapSetHandler(&receive_buf[4],offset_addr,data_len);
|
if(return_flag == SUCCESS_0){
|
ack_buf[0] = 0;
|
}else{
|
ack_buf[0] = return_flag;
|
}
|
|
// ack_buf[0] = 0;//³É¹¦
|
*ack_buf_length = 1; //¼ÓÃÜǰµÄÊý¾Ý³¤¶È
|
return return_code;
|
}
|
|
//OTA
|
WRC_STATUS OTA_config_bsdiff_lzma(uint8_t *receive_buf,uint16_t receive_data_length,uint8_t *ack_buf,uint16_t *ack_buf_length)
|
{
|
WRC_STATUS return_code = WRC_WAIT_REC_DATA;
|
uint8_t return_flag = SUCCESS_0;
|
ack_buf[0] = 0;//³É¹¦
|
|
return_flag = BootLoader_IapConfigLzmaSetHander(receive_buf,receive_data_length);
|
if(return_flag == SUCCESS_0){
|
ack_buf[0] = 0;
|
}else{
|
ack_buf[0] = return_flag;
|
}
|
|
// ack_buf[0] = 0;//³É¹¦
|
*ack_buf_length = 1; //¼ÓÃÜǰµÄÊý¾Ý³¤¶È
|
return return_code;
|
}
|
|
|
WRC_STATUS SizhuV4ProtocolDataAnalysis(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
|
{
|
uint8_t *buf_p = NULL;
|
uint16_t count_i = 0;
|
SIZHU_V4_PROTOCOL_HEAD_T protocol_head_rec;
|
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 = receive_buf + 2; //ÒÆµ½ÏÂÒ»¸ö¶ººÅ
|
while(*buf_p != SIZHU_FRAME_HEAD) //buf_pÖ¸ÏòÖ¡Í·
|
{
|
count_i++;
|
buf_p ++;
|
if(count_i>10){
|
return WRC_WAIT_REC_DATA; //10¸öÖ®ÄÚËѲ»µ½Ö¡Í·£¬Êý¾ÝÎÞЧ
|
}
|
}
|
|
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*)&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);
|
}else{
|
// arrayA_2_arrayB((uint8_t*)buf_p, (uint8_t*)&ack_buf[FIRST_DATA_SHIFT_SIZHU], protocol_head_rec.data_length, LITTLE_ENDIAN);//Ã÷ÎÄ
|
}
|
|
switch(protocol_head_rec.cmd_code_u16){
|
case SIZHU_CONTROL_CODE_DATAUP : return_code = DataReportAckPro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
|
case SIZHU_CONTROL_CODE_END : return_code = EndFramePro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
|
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;
|
//?´ý²¹³ä
|
|
case SIZHU_CONTROL_OTA_CONFIG : return_code = OTA_config((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),protocol_head_rec.data_length,ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
|
case SIZHU_CONTROL_OTA_DIFF_DATA : return_code = OTA_DiffData((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),protocol_head_rec.data_length,ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
|
case SIZHU_CONTROL_OTA_CHECK : return_code = OTA_check((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),protocol_head_rec.data_length,ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
|
case SIZHU_CONTROL_OTA_DIFF_MAP : return_code = OTA_DiffMap((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),protocol_head_rec.data_length,ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
|
case SIZHU_CONTROL_OTA_CONFIG_BSDIFF_LZMA : return_code = OTA_config_bsdiff_lzma((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),protocol_head_rec.data_length,ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
|
default: break;
|
}
|
|
|
}else{
|
|
}
|
|
if(ack_data_length > 0){
|
//ÐèÒªÏìÓ¦Êý¾Ý£¬
|
//ÉÏÐÐÊý¾ÝÍ·¸³Öµ
|
arrayA_2_arrayB((uint8_t*)&sys_clockBCD_g, (uint8_t*)&protocol_head_up_g.device_time, sizeof(sys_clockBCD_g), LITTLE_ENDIAN);
|
protocol_head_up_g.frame_num =1;
|
protocol_head_up_g.frame_sum = 1;
|
protocol_head_up_g.cmd_code_u16 = protocol_head_rec.cmd_code_u16;
|
protocol_head_up_g.key_ver = protocol_head_rec.key_ver;
|
|
//¼ÓÃܸù¾ÝÏÂÐеÄÃØÔ¿°æ±¾¼ÓÃÜ´¦Àí
|
if((protocol_head_rec.key_ver & 0x80) == 0x80){
|
DataAes128EcbEncrypt(protocol_head_rec.key_ver,ack_buf + FIRST_DATA_SHIFT_SIZHU,ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length);
|
protocol_head_up_g.data_length = ack_data_length;
|
}else{
|
protocol_head_up_g.data_length = ack_data_length;
|
}
|
|
//Í·½á¹¹Ìå´¦ÀíÍê±ÏÖ®ºóתÈëbuf
|
arrayA_2_arrayB((uint8_t*)&protocol_head_up_g, ack_buf, FIRST_DATA_SHIFT_SIZHU, LITTLE_ENDIAN);
|
//¼ÆËãCRC
|
crc_addr = protocol_head_up_g.data_length + FIRST_DATA_SHIFT_SIZHU;
|
proto_tail_up_g.check_crc = usMBCRC16(0xFFFF, ack_buf, crc_addr);
|
proto_tail_up_g.frame_end_code = SIZHU_FRAME_TAIL;
|
arrayA_2_arrayB((uint8_t*)&proto_tail_up_g, (uint8_t*)&ack_buf[crc_addr], FRAME_TAIL_LENGTH, LITTLE_ENDIAN);
|
|
//¸ø³öÏìÓ¦BufµÄ×ܳ¤¶È
|
*ack_buf_length = FIRST_DATA_SHIFT_SIZHU + protocol_head_up_g.data_length + FRAME_TAIL_LENGTH;
|
}else{
|
*ack_buf_length = 0; //²»ÐèÒªÓ¦´ðÔò³¤¶ÈÖÃ0
|
}
|
|
return return_code;
|
|
}
|