From 6e3f1f560d618b37ee1a47fa2b0f682b70c3ef1c Mon Sep 17 00:00:00 2001
From: jinlicong <493886250@qq.com>
Date: Wed, 19 Jun 2024 17:25:45 +0800
Subject: [PATCH] 增加OTA协议

---
 Function/WirelessRemoteComm/wrc_sizhu_v4.c |  451 ++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 403 insertions(+), 48 deletions(-)

diff --git a/Function/WirelessRemoteComm/wrc_sizhu_v4.c b/Function/WirelessRemoteComm/wrc_sizhu_v4.c
index fa4e781..14e4a90 100644
--- a/Function/WirelessRemoteComm/wrc_sizhu_v4.c
+++ b/Function/WirelessRemoteComm/wrc_sizhu_v4.c
@@ -8,12 +8,18 @@
 #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	data_head_g;
+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;
+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;
 
@@ -22,14 +28,53 @@
 	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;
+	}
 	
 }
 
@@ -40,7 +85,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;
@@ -51,24 +96,27 @@
 	protocol_head_up_g.cmd_code_u16 = SIZHU_CONTROL_CODE_DATAUP;
 	protocol_head_up_g.key_ver = KEY_VERSION + 0; //��0�Ų�����Կ����
 	
-	data_head_g.equipment_type = (0x02 <<6) + equipment_basic_inf_g.equipment_type;
-	data_head_g.device_type = equipment_basic_inf_g.product_type;
-	data_head_g.sys_send_type = wrc_ctrl_para_g.wrc_start_flag;
-	arrayA_2_arrayB((uint8_t*)&link_info_g.ICCID, (uint8_t*)&data_head_g.iccid, 20, LITTLE_ENDIAN);
-	data_head_g.signal_intensity = link_info_g.net_signal_intensity;
-	if(data_head_g.signal_intensity > 20)
-		data_head_g.signal_intensity_level = 1;
-	else if(data_head_g.signal_intensity > 15)
-		data_head_g.signal_intensity_level = 2;
+	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
-		data_head_g.signal_intensity_level = 3;
+		up_data_head_g.signal_intensity_level = 3;
 	
-	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*)&data_head_g.software_version, 4, LITTLE_ENDIAN);
-	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*)&data_head_g.alarm_word, 14, LITTLE_ENDIAN);
-	data_head_g.valve_close_reason = save_valve_para_g.valve_close_ID ;
-	data_head_g.data_package_format = 0;
+	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
@@ -79,7 +127,7 @@
 	#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 = (current_save_addr,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�洢
@@ -103,17 +151,23 @@
 {
 	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��Ϊһ����м���
 	for(uint16_t count_i =0;count_i < (*length >>4);count_i++){
 		
@@ -125,6 +179,9 @@
 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��Ϊһ����н���
@@ -141,11 +198,18 @@
 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 ++){
+		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
@@ -153,7 +217,7 @@
 	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;
-	data_head_g.data_pack_num = 1;
+	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;
@@ -164,32 +228,33 @@
 	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);
 	
 	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;
-	data_head_g.data_pack_num = current_frame_data_num;
+	up_data_head_g.data_pack_num = current_frame_data_num;
 	
 	#endif
 	
-	arrayA_2_arrayB((uint8_t*)&data_head_g, (uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU], DATA_PACKET_HEAD_LENGTH, LITTLE_ENDIAN);
+	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){
-		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;  //������Ҫ��䣬���Ȼ��
 	}
 	
 	//���ڼ������ᵼ�����ݳ��ȱ仯������֡ͷ��ת����Ҫ���ڼ���֮��
@@ -206,23 +271,275 @@
 
 
 
+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)
 {
-	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; //����ǰ�ij���
 
 	count_i =0;
-	buf_p +=2;  //�Ƶ���һ������
+	buf_p =  receive_buf + 2;  //�Ƶ���һ������
 	while(*buf_p != SIZHU_FRAME_HEAD)  //buf_pָ��֡ͷ
 	{
 		count_i++;
@@ -233,12 +550,11 @@
 	}
 	
 	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*)&sys_clockBCD_g, (uint8_t*)&protocol_head_up_g.device_time, sizeof(sys_clockBCD_g), 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){
 			//? ������Կ�Ž���
@@ -248,12 +564,20 @@
 		}
 		
 		switch(protocol_head_rec.cmd_code_u16){
-			case SIZHU_CONTROL_CODE_DATAUP :;  //?������
-				
+			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;
 		}
 		
@@ -262,6 +586,37 @@
 		
 	}
 	
-	return WRC_WAIT_REC_DATA;
+	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;
 	
 }

--
Gitblit v1.9.3