- Loop154_Unit 新增 relay_delay 字段 - storage.c 从 delay_time 计算: relay_delay = delay_time * 2 - TMR15_GLOBAL_IRQHandler 使用 unit->relay_delay 替代固定 OUT_DELAY
236 lines
7.5 KiB
C
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);
|
|
|
|
}
|
|
|
|
|