Files
vd_960/vd960Loop/utilities/at32f421_freertos_demo/src/storage.c
wangfq 1831291d76 fix: 离开延时 OUT_DELAY 改为可配置 relay_delay
- Loop154_Unit 新增 relay_delay 字段
- storage.c 从 delay_time 计算: relay_delay = delay_time * 2
- TMR15_GLOBAL_IRQHandler 使用 unit->relay_delay 替代固定 OUT_DELAY
2026-06-26 10:31:53 +08:00

236 lines
7.5 KiB
C

#include "storage.h"
#include "flash.h"
#include <stdlib.h>
#include "TaskLoop.h"
Loop_Balance_PlanB g_loop_balance_planB;
Loop_Cng_Info g_loop_cng_info = {0, {0}};
Loop_Sens_List g_loop_sens_list;
uint8_t loop_cng_default[8] = {2,1,0,0,4,0,0,0};
uint8_t loops_cng_default[LOOP_CAPTURE_MAX][8] = {
{2, 1, 0, 0, Freq_Low, 0, 0, 0 },
{2, 1, 0, 0, Freq_Middle_High, 0, 0, 0},
{2, 1, 0, 0, Freq_Middle_Low, 0, 0, 0 },
{2, 1, 0, 0, Freq_Low, 0, 0, 0 }
};
void set_factory_param(void)
{
uint8_t i;
g_loop_cng_info.smart_mode = Smart_Mode_Disable;
Loop_Cng_Unit *unit = g_loop_cng_info.loop_cng;
for(i = 0; i < LOOP_CAPTURE_MAX; i++)
{
memcpy(unit, loops_cng_default[i], 8);
unit++;
}
g_loop_sens_list.total = SENS_Default_Amount;
for(i = 0; i < g_loop_sens_list.total && i < 4; i++)
{
g_loop_sens_list.sens[i].sens_in = SensTable[i];
g_loop_sens_list.sens[i].sens_out = SensTable_1[i];
}
}
void storage_dev(void)
{
uint8_t i = 0, k = 0;
uint8_t *rBuf = (uint8_t *)malloc(MAX_Store_Size);
if(rBuf == NULL){
// PRINT("Not enough memory!!");
nvic_system_reset();
}
for(i = 0; i < MAX_Store_Size; i++){
rBuf[i] = 0;
}
PRINT("Will_storage_dev\r\n");
rBuf[0] = 0x33;
rBuf[1] = 0xBB;
rBuf[2] = 0xC3;
rBuf[3] = 0x3C;
// g_freq_sens = 1;
rBuf[Addr_Sens_Amount_Offset] = g_loop_sens_list.total;
rBuf[Addr_Smart_Mode_Offset] = g_loop_cng_info.smart_mode;
i = Addr_Loop_Cng_Offset;
memcpy(&rBuf[i], (uint8_t *)g_loop_cng_info.loop_cng, sizeof(Loop_Cng_Unit) * LOOP_CAPTURE_MAX );
i += sizeof(Loop_Cng_Unit) * LOOP_CAPTURE_MAX;
// i = Addr_Loop_PlanB_Cng_Offset;
// rBuf[i++] = g_loop_balance_planB.sample_cng.flag;
// rBuf[i++] = g_loop_balance_planB.sample_cng.max_amplitude;
// rBuf[i++] = g_loop_balance_planB.sample_cng.max_amplitude >> 8;
// rBuf[i++] = g_loop_balance_planB.balance_ori_cng.flag;
// rBuf[i++] = g_loop_balance_planB.balance_ori_cng.max_cnt;
// rBuf[i++] = g_loop_balance_planB.balance_ori_cng.max_cnt >> 8;
// rBuf[i++] = g_loop_balance_planB.release_ori_planB.flag_weight;
// rBuf[i++] = g_loop_balance_planB.release_ori_planB.max_amplitude;
// rBuf[i++] = g_loop_balance_planB.release_ori_planB.max_amplitude >> 8;
// rBuf[i++] = g_loop_balance_planB.release_ori_planB.timeout;
//
// rBuf[i++] = g_loop_balance_planB.release_change_rate.flag_weight;
// rBuf[i++] = g_loop_balance_planB.release_change_rate.rate_first;
// rBuf[i++] = g_loop_balance_planB.release_change_rate.rate_second;
// rBuf[i++] = g_loop_balance_planB.release_change_rate.mode;
i = Addr_Loop_Sens_List_Offset;
if(g_loop_sens_list.total > MAX_LOOP_SENS_AMOUNT)
{
g_loop_sens_list.total = MAX_LOOP_SENS_AMOUNT;
}
for(k = 0; k < MAX_LOOP_SENS_AMOUNT; k++)
{
rBuf[i++] = g_loop_sens_list.sens[k].sens_in;
rBuf[i++] = g_loop_sens_list.sens[k].sens_in >> 8;
rBuf[i++] = g_loop_sens_list.sens[k].sens_out;
rBuf[i++] = g_loop_sens_list.sens[k].sens_out >> 8;
}
// PRINT("Will_write: \n");
// for(i = 0; i < MAX_Store_Size; i++)
// {
// PRINT(" %02X", rBuf[i]);
// }
flash_write(Addr_Dev_Flag_Offset, (uint16_t *)rBuf, DLD_BUFEER_SIZE/2);
free(rBuf);
}
// set frequent level
void set_flp_level(uint8_t loop_num, uint8_t freq_level)
{
switch( freq_level)
{
case Freq_High: // 33nF
{
if(loop_num == 0) { FLPA1_HIGH; FLPA2_HIGH; }
else if(loop_num == 1){ FLPB1_HIGH; FLPB2_HIGH; }
else if(loop_num == 2){ FLPC1_HIGH; FLPC2_HIGH; }
else if(loop_num == 3){ FLPD1_HIGH; FLPD2_HIGH; }
} break;
case Freq_Middle_High: // 43nF
{
if(loop_num == 0) { FLPA1_HIGH; FLPA2_LOW; }
else if(loop_num == 1){ FLPB1_HIGH; FLPB2_LOW; }
else if(loop_num == 2){ FLPC1_HIGH; FLPC2_LOW; }
else if(loop_num == 3){ FLPD1_HIGH; FLPD2_LOW; }
} break;
case Freq_Middle_Low: // 66nF
{
if(loop_num == 0) { FLPA1_LOW; FLPA2_HIGH; }
else if(loop_num == 1){ FLPB1_LOW; FLPB2_HIGH; }
else if(loop_num == 2){ FLPC1_LOW; FLPC2_HIGH; }
else if(loop_num == 3){ FLPD1_LOW; FLPD2_HIGH; }
} break;
case Freq_Low: //76nF
{
if(loop_num == 0) { FLPA1_LOW; FLPA2_LOW; }
else if(loop_num == 1){ FLPB1_LOW; FLPB2_LOW; }
else if(loop_num == 2){ FLPC1_LOW; FLPC2_LOW; }
else if(loop_num == 3){ FLPD1_LOW; FLPD2_LOW; }
} break;
}
}
void para_store_init(void)
{
uint8_t i;
uint8_t *rBuf = (uint8_t *)malloc(MAX_Store_Size);
if(rBuf == NULL){
// PRINT("Not enough memory!!");
nvic_system_reset();
}
memset(rBuf, 0, MAX_Store_Size);
flash_read(DLD_FLASH_ADDRESS_START, (uint16_t *)rBuf, MAX_Store_Size/2);
PRINT("Read_Cng_Store:\n");
for(i = 0; i < MAX_Store_Size; i++){
PRINT("%02X ", rBuf[i]);
}
PRINT("\n");
if(rBuf[0] == 0x33 && rBuf[1] == 0xBB && rBuf[2] == 0xC3 && rBuf[3] == 0x3C){
g_loop_sens_list.total = rBuf[Addr_Sens_Amount_Offset];
g_loop_cng_info.smart_mode = rBuf[Addr_Smart_Mode_Offset];
memcpy(g_loop_cng_info.loop_cng, &rBuf[Addr_Loop_Cng_Offset], sizeof(Loop_Cng_Unit) * LOOP_CAPTURE_MAX);
memcpy(&g_loop_sens_list.sens, &rBuf[Addr_Loop_Sens_List_Offset], sizeof(g_loop_sens_list) - 1);
Loop_Cng_Unit *unitout = g_loop_cng_info.loop_cng;
for(i = 0; i < LOOP_CAPTURE_MAX; i++)
{
PRINT("loop_%d, sens:%d,delay:%d, exit_mode:%d, out_put:%d\n", i, unitout->sensitvity, unitout->delay_time, unitout->exist_mode, unitout->output_mode);
set_flp_level(i, unitout->loopFreq_Level);
// 同步灵敏度到检测单元
g_loop_states.loop_unit[i].loop_SensLevel = unitout->sensitvity & 0x03;
g_loop_states.loop_unit[i].SET_PLUS = unitout->output_mode & 0x01;
g_loop_states.loop_unit[i].SET_DLY = (unitout->output_mode >> 1) & 0x01;
g_loop_states.loop_unit[i].hold_time = unitout->exist_mode * 20 * 5;
g_loop_states.loop_unit[i].relay_delay = unitout->delay_time * 2;
unitout++;
}
// g_loop_out_delay = g_loop_cng_unit.delay_time * 2; // 定时器以 50ms 为单位, 延时以100ms为单位
// g_hold_time = g_loop_cng_unit.exist_mode * 30 * 20; //50ms/per, 30s
// g_safe_max_cnt = g_loop_cng_unit.loopSafe_Timeout * 10 * (1000 / 50);
// g_freq_level = g_loop_cng_unit.loopFreq_Level - 1;
// flt_mgr.max_cnt_flat_release = g_loop_cng_unit.delay_time * 20 /2;
// if(flt_mgr.max_cnt_flat_release < 40){ // 至少检查400毫秒
// flt_mgr.max_cnt_flat_release = 40;
// }
free(rBuf);
}
else{
free(rBuf);
//TODO: need to be normal
set_factory_param();
storage_dev();
//
delay_ms(10);
nvic_system_reset();
}
}
void test_factory(void)
{
set_factory_param();
storage_dev();
// delay_ms(10);
}