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 | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 159 insertions(+), 4 deletions(-)
diff --git a/Function/WirelessRemoteComm/wrc_sizhu_v4.c b/Function/WirelessRemoteComm/wrc_sizhu_v4.c
index 54187bc..14e4a90 100644
--- a/Function/WirelessRemoteComm/wrc_sizhu_v4.c
+++ b/Function/WirelessRemoteComm/wrc_sizhu_v4.c
@@ -10,11 +10,14 @@
#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 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ͨѶ�Ƿ�ɹ���һ��������һ�㣬ֻҪ�����ϱ���Ӧ�ɹ��������ϱ��ɹ����յ�����֡Ҳ����ɹ�
@@ -25,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;
+ }
}
@@ -85,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�洢
@@ -195,8 +237,7 @@
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++ ){
@@ -266,6 +307,7 @@
{
WRC_STATUS return_code = WRC_OFF;
int difference_value;
+ sClockBCD time_after_cali;
wrc_sizhuV4_result_flag = PASS;
report_sizhuV4_result_flag = PASS;
@@ -281,6 +323,10 @@
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;
@@ -378,6 +424,109 @@
}
+
+//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;
@@ -423,6 +572,12 @@
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;
}
--
Gitblit v1.9.3