Files
checker_slave/source/elec_det/interface/EWChecker.c
2023-12-14 18:57:04 +08:00

870 lines
22 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "EWChecker.h"
#include "EWUpdata.h"
#include "driver/EWDriver.h"
#include "base/delay.h"
#include "hardware/adc_cfg.h"
#include "base/utility.h"
#include "hardware/power.h"
#include "hardware/timer_cfg.h"
#include "debug.h"
#include "commend.h"
#include "mystring.h"
#include "mystdlib.h"
#include "interface/checkerext.h"
#define EW_CHECKER_RUN_BUF 32
uint8_t EW_Test_UID[13]="123456789ACDE";
uint8_t EW_Test_PWD[8]="FBCDabcd";
uint8_t EW_RunBuf[EW_CHECKER_RUN_BUF];
/*
@brief 统计模块的上电充能,具有电压设置功能,采集档位 R10_0p1mA_1p6mA_UC
@param0 总线电压
@param1 超时时间 0.1ms
@param2 充电结束时的AD值
@rtv0 返回总线电压
@rtv1 返回总线电流低于设置AD值的时间
*/
void EW_Test_PowerOn()
{
uint8_t uc_rtv = 0;
uint16_t us_rsult[2];
uint16_t us_max;
uint16_t us_shake;
EW_BUS_OFF;
uc_rtv = PowerCalibration_set(checker_runcfg.params[0],checker_runcfg.params[0]-1);
checker_runcfg.netid = 1;
Power_SetSampleRange_Seep(Checker_PowerOn_Sample_R,ADC_SPEED_HIGH);
//POWER_ON
delay_os_ms(100);
EW_BUS_ON;
delay_us(20);
us_rsult[1] = AD_GetChgEnergy(checker_runcfg.params[1],checker_runcfg.params[2], &us_max,&us_shake);
delay_os_ms(100);
us_rsult[0] = Power_GetBousV();
Checker_SetRtv(us_rsult,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 设置总线电压
@param1 总线电压
@rtv1 总线电压
*/
void EW_Test_SetBusV(void)
{
Checker_RunCfg_st *cfg=&checker_runcfg;
uint8_t uc_rtv = 0;
uint16_t us_h_v,us_m_v;
us_h_v = cfg->params[0];
if(us_h_v < 55)
{
uc_rtv = 1;
}else{
us_m_v = (us_h_v>>1) > 50 ? (us_h_v>>1):50;
uc_rtv |= PowerCalibration_set(us_h_v,us_m_v);
EW_BUS_ON
us_m_v = ((us_h_v/80)+2)*60;
delay_ms(us_m_v);
us_h_v = Power_GetBousV();
}
Checker_SetRtv(&us_h_v,cfg->rtv_count);
Checker_MaskResult(uc_rtv,cfg->task_info.runindex);
}
/*
@brief 测量总线基本电压
@rtv1 返回总线电流 单位0.1uA
*/
void EW_Test_BaseCur(void)
{
uint16_t ul_cur[2];
EW_DIFF_MOD_H
delay_ms(250);
ul_cur[0] = ADC_GetBaseStableCur();
EW_DIFF_MOD_L
delay_ms(100);
ul_cur[1] = ADC_GetBaseStableCur();
EW_DIFF_MOD_H
delay_ms(20);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(ul_cur,checker_runcfg.rtv_count);
}
/*
@breif 使能MTP擦写
@param 0 失能 1 使能
*/
void EW_Test_EnMTP(void)
{
uint8_t uc_ack = 0;
uc_ack = EW_EnWriteMTP(checker_runcfg.netid,checker_runcfg.params[0]);
delay_ms(5);
Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
}
/*
@brief 扫描总线上的电子模块 1发
@param0 UID长度
@param1 使能或失能 UID对比
@param2 使能反馈监控
@rtv1 最大反馈电流
@rtv2 最大反馈时间
@rtv3 最小反馈电流
@rtv4 最小反馈时间
@rtv5 UID 2Bytes
@rtv6 UID 2Bytes
@rtv7 UID 2Bytes
@rtv8 UID 2Bytes
*/
void EW_Test_ReadUID(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
uint16_t aus_temp[14];
uint32_t ul_temp = 0;
memset(EW_RunBuf,0,EW_CHECKER_RUN_BUF);
if(checker_runcfg.params[0] == 0)
{
checker_runcfg.params[0] = checker_runcfg.uid_len;
if(checker_runcfg.params[0] == 0)
{
checker_runcfg.params[0] = 7;
}
}
if(checker_runcfg.params[2] > 0)
{
EW_FreeBack_Prapare();
}
uc_rtv = EW_ReadUID(checker_runcfg.netid,EW_RunBuf,checker_runcfg.params[0]);
if(checker_runcfg.params[1] > 0)
{
for(uc_count = 0; uc_count < checker_runcfg.params[0];uc_count++)
{
if(checker_runcfg.writeuid[uc_count] != EW_RunBuf[uc_count])
{
uc_rtv |= 0x01;
}
}
}
memcpy(checker_runcfg.writeuid,EW_RunBuf,checker_runcfg.uid_len);
ul_temp = Power_ConvCur(EW_FreeBack_MaxCur,EWDriver_Sample_R);
ul_temp = (ul_temp + 500)/1000;
aus_temp[0] = ul_temp ;
aus_temp[1] = EW_FreeBack_MaxTime;
ul_temp = Power_ConvCur(EW_FreeBack_MinCur,EWDriver_Sample_R);
ul_temp = (ul_temp + 500)/1000;
aus_temp[2] = ul_temp;
aus_temp[3] = EW_FreeBack_MinTime;
uc_count = 0;
if(uc_rtv == 0)
{
checker_runcfg.uid_len = checker_runcfg.params[0];
memcpy(checker_runcfg.writeuid,EW_RunBuf,checker_runcfg.uid_len);
uc_count = (checker_runcfg.params[0]+7+1)/2;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
memcpy(aus_temp+4,EW_RunBuf,16);
Checker_SetRtv(aus_temp,checker_runcfg.rtv_count);
}
/*
@brief 写模块运行时的配置参数
@param0 起爆MOS选择 0内部/1外部
@param1 通信信号源 0:rxh 1:rxl 2:rx
@param2 通信模式 1:差分 2:单端
@param3 起爆日志标记周期 0:不标记 1:5ms 2:10ms 3:20ms 4:50ms 5:10ms 6:150ms 7:200ms
@param4 UID长度
@param5 密码长度
@param6 模块版本
*/
void EW_Test_SetRunCfg()
{
uint8_t uc_rtv = 0;
RunCfg_un run_cfg;
if(checker_runcfg.params[4] > 14)
{
checker_runcfg.params[4] = 14;
}
checker_runcfg.uid_len = checker_runcfg.params[4];
checker_runcfg.params[4] -= 7;
if(checker_runcfg.params[5] > 7)
{
checker_runcfg.params[5] = 7;
}
checker_runcfg.pwd_len = checker_runcfg.params[5];
checker_runcfg.params[5] -= 4;
if(checker_runcfg.params[6] > 31)
{
checker_runcfg.params[6] = 31;
}
run_cfg.runcfg_st.fire_mos_sw = checker_runcfg.params[0];
run_cfg.runcfg_st.vbus_rx_sg = checker_runcfg.params[1];
run_cfg.runcfg_st.vbus_mode = checker_runcfg.params[2];
run_cfg.runcfg_st.reset_run_step = checker_runcfg.params[3];
run_cfg.runcfg_st.uid_len = checker_runcfg.params[4];
run_cfg.runcfg_st.pwd_len = checker_runcfg.params[5];
run_cfg.runcfg_st.version = checker_runcfg.params[6];
run_cfg.run_cfg_buf[3] = CheckCRC_8(run_cfg.run_cfg_buf,3);
uc_rtv = EW_WriteRunCfg(checker_runcfg.netid,&run_cfg);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 验证模组运行时配置
@param0 起爆MOS选择 0内部/1外部
@param1 通信信号源 0:rxh 1:rxl 2:rx
@param2 通信模式 1:差分 2:单端
@param3 起爆日志标记周期 0:不标记 1:5ms 2:10ms 3:20ms 4:50ms 5:10ms 6:150ms 7:200ms
@param4 UID长度
@param5 密码长度
@param6 模块版本
*/
void EW_Test_CheckRunCfg()
{
uint8_t uc_rtv = 0;
uint16_t aus_temp[3];
RunCfg_un run_cfg;
uc_rtv = EW_ReadRunCfgVersion(checker_runcfg.netid,(uint8_t*)&run_cfg,&aus_temp[2]);
if(run_cfg.runcfg_st.fire_mos_sw != checker_runcfg.params[0])
{
uc_rtv |= 0x01;
}
if(run_cfg.runcfg_st.vbus_rx_sg != checker_runcfg.params[1])
{
uc_rtv |= 0x02;
}
if(run_cfg.runcfg_st.vbus_mode != checker_runcfg.params[2])
{
uc_rtv |= 0x04;
}
if(run_cfg.runcfg_st.reset_run_step != checker_runcfg.params[3])
{
uc_rtv |= 0x08;
}
checker_runcfg.uid_len = checker_runcfg.params[4];
if((checker_runcfg.params[4] <7 ) || (run_cfg.runcfg_st.uid_len != (checker_runcfg.params[4])-7))
{
uc_rtv |= 0x10;
}
checker_runcfg.pwd_len = checker_runcfg.params[5];
if((checker_runcfg.params[5] < 4) ||(run_cfg.runcfg_st.pwd_len != (checker_runcfg.params[5] - 4)))
{
uc_rtv |= 0x20;
}
if(run_cfg.runcfg_st.version != checker_runcfg.params[6])
{
uc_rtv |= 0x40;
}
memcpy(aus_temp,run_cfg.run_cfg_buf,4);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(aus_temp,checker_runcfg.rtv_count);
}
/*
@brief 验证配置
@param0 配置验证掩码低2bytes
@param1 配置验证掩码高2bytes
@param2 配置验证比较低2bytes
@param3 配置验证比较高2bytes
*/
void EW_Test_VerifyRunCfg()
{
uint8_t uc_rtv = 0;
uint32_t ul_mask = 0;
uint32_t ul_cfg = 0;
uint8_t uc_ack = 1;
ul_mask = checker_runcfg.params[1];
ul_mask <<=16;
ul_mask |= checker_runcfg.params[0];
ul_cfg = checker_runcfg.params[3];
ul_cfg <<=16;
ul_cfg |= checker_runcfg.params[2];
//比较通过返码
uc_rtv = EW_CheckRunCfg(checker_runcfg.netid,ul_mask,ul_cfg,&uc_ack);
if(uc_ack == 0)
{
uc_rtv = 1;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 写三码数据测试
*/
void EW_Test_WriteThreedCode(void)
{
uint8_t uc_rtv = 0;
if(checker_runcfg.uid_len ==0 || checker_runcfg.uid_len > 14 \
|| checker_runcfg.pwd_len ==0 || checker_runcfg.pwd_len > 7)
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
memcpy(checker_runcfg.writeuid,EW_Test_UID,checker_runcfg.uid_len);
memcpy(checker_runcfg.writepwd,EW_Test_PWD,checker_runcfg.pwd_len);
memcpy(EW_RunBuf,EW_Test_UID,checker_runcfg.uid_len);
EW_RunBuf[checker_runcfg.uid_len] = CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len);
uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x00,EW_RunBuf,checker_runcfg.uid_len+1);
delay_os_ms(50);
uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1);
delay_os_ms(50);
memcpy(EW_RunBuf,EW_Test_PWD,checker_runcfg.pwd_len);
EW_RunBuf[checker_runcfg.pwd_len] = CheckCRC_8(EW_RunBuf,checker_runcfg.pwd_len);
uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x04,EW_RunBuf,checker_runcfg.pwd_len+1);
delay_os_ms(50);
uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x24,EW_RunBuf,checker_runcfg.pwd_len+1);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@breif 验证测试的三码数据
*/
void EW_Test_VerifyThreedCode(void)
{
uint8_t uc_rtv = 0;
System_State_un state;
//读UID MTP
EW_ReadMTP(checker_runcfg.netid,0x00,EW_RunBuf,checker_runcfg.uid_len+1);
if(EW_RunBuf[checker_runcfg.uid_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len))
{
uc_rtv = 1;
}
if(0 != memcmp(EW_RunBuf,EW_Test_UID,checker_runcfg.uid_len))
{
uc_rtv = 1;
}
if(uc_rtv > 0)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
EW_ReadMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1);
if(EW_RunBuf[checker_runcfg.uid_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len))
{
uc_rtv = 1;
}
if(0 != memcmp(EW_RunBuf,EW_Test_UID,checker_runcfg.uid_len))
{
uc_rtv = 1;
}
if(uc_rtv > 0)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
//读PWD MTP
EW_ReadMTP(checker_runcfg.netid,0x04,EW_RunBuf,checker_runcfg.pwd_len+1);
if(EW_RunBuf[checker_runcfg.pwd_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.pwd_len))
{
uc_rtv = 1;
}
if(0 != memcmp(EW_RunBuf,EW_Test_PWD,checker_runcfg.pwd_len))
{
uc_rtv = 1;
}
if(uc_rtv > 0)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
EW_ReadMTP(checker_runcfg.netid,0x24,EW_RunBuf,checker_runcfg.pwd_len+1);
if(EW_RunBuf[checker_runcfg.pwd_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.pwd_len))
{
uc_rtv = 1;
}
if(0 != memcmp(EW_RunBuf,EW_Test_PWD,checker_runcfg.pwd_len))
{
uc_rtv = 1;
}
if(uc_rtv > 0)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
//读UID
uc_rtv = EW_ReadUID(checker_runcfg.netid,EW_RunBuf,checker_runcfg.uid_len);
if(0 != memcmp(EW_RunBuf,EW_Test_UID,checker_runcfg.uid_len))
{
uc_rtv = 1;
}
if(uc_rtv > 0)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
//验证PWD
memcpy(EW_RunBuf,EW_Test_PWD,checker_runcfg.pwd_len);
uc_rtv = EW_VerfyPWD(checker_runcfg.netid,EW_RunBuf,checker_runcfg.pwd_len);
if(uc_rtv > 0)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
//读状态
uc_rtv = EW_ReadState(checker_runcfg.netid,(uint8_t*)state.datas);
if(uc_rtv > 0 || state.State_st.erprom_error >0 || state.State_st.pswd_flag == 0)
{
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
return;
}
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
}
/*
@brief 自检
@param 自检模式
@rtv 自检模式0x08的回读数据
*/
void EW_Test_CheckSelf()
{
uint8_t uc_rtv = 0;
uint32_t ul_temp;
uint8_t uc_mode = checker_runcfg.params[0];
uc_rtv = EW_ChecSelf(checker_runcfg.netid,uc_mode,(uint8_t*)&ul_temp);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 状态码比较
@param0 掩码参数
@param1 比较结果值
@rtv0 状态值低2字节
@rtv1 状态值高2字节
*/
void EW_Test_CheckeState(void)
{
uint8_t uc_rtv;
System_State_un state;
uc_rtv = EW_ReadState(checker_runcfg.netid,(uint8_t*)state.datas);
if(uc_rtv > 0 || ((state.us_data[0] & checker_runcfg.params[0] )!= checker_runcfg.params[1]))
{
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
Checker_SetRtv((uint16_t*)state.us_data,checker_runcfg.rtv_count);
return;
}
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv((uint16_t*)state.us_data,checker_runcfg.rtv_count);
}
/*
@brief 充电
@param0 充电模式
@param1 充电分组
*/
void EW_Test_Charge()
{
uint8_t uc_rtv = 0;
uc_rtv = EW_Charge(checker_runcfg.netid, checker_runcfg.params[0],checker_runcfg.params[1]);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 充能统计
@param0 充电挡位
@param1 充电电流判线值,AD值
@param2 充电末电流结束值单位0.1uA
@param3 充电最长时间,单位100ms
@param4 充电高压保持时间单位0.1s
@rtv0 充能值 单位0.1ms
@rtv1 充末电流 单位0.1uA
@rtv2 充电最大电流 单位0.1Ma
@rtv3 充电抖动幅值 adv
*/
void EW_Test_ChgEnergy(void)
{
uint8_t uc_charge_class = checker_runcfg.params[0];
uint16_t us_sample_timeout = checker_runcfg.params[1];
uint16_t us_adend = checker_runcfg.params[2];
uint16_t us_chgend_cur = checker_runcfg.params[3];
uint16_t us_timeout = checker_runcfg.params[4];
uint32_t ul_holdtime = checker_runcfg.params[5];
uint16_t us_array[4];
uint16_t us_energy = 0;
uint16_t us_end_cur = 2000;
uint16_t us_max_cur = 0;
uint16_t us_shake = 65535;
uint32_t ul_temp;
uint8_t uc_rtv = 0;
uc_rtv = EW_Charge(0, uc_charge_class,0);
if(us_adend > 10)
{
Power_SetSampleRange_Seep(EWChecker_ChgEnger_Sample_R,ADC_SPEED_HIGH);
delay_ms(1);
us_energy = AD_GetChgEnergy(us_sample_timeout,us_adend,&us_max_cur,&us_shake);
us_max_cur = ( Power_ConvCur(us_max_cur,EWChecker_ChgEnger_Sample_R) /100+5)/10;
ADC_CurChnnelSet(AN_MAL_CH, ADC_SPEED_MIDLE);
ul_temp = AD_CurMonitor(ul_holdtime*1000);
if(ul_temp > us_shake)
{
us_shake = ul_temp;
}
}else{
us_shake = 0;
us_max_cur = 0;
us_energy = 0;
}
us_timeout++;
us_array[0] = ADC_GetBaseStableCur();
us_array[1] = ADC_GetBaseStableCur();
us_array[2] = ADC_GetBaseStableCur();
while(us_timeout > 0)
{
us_array[3] = ADC_GetBaseStableCur();
Bubble_Sort_u16(us_array,3);
us_end_cur = us_array[0];
if(us_end_cur < us_chgend_cur )
{
break;
}
us_timeout--;
}
// if(us_end_cur > us_chgend_cur)
// {
// uc_rtv = 1;
// }
CurrentSampleR_Def;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
us_array[0] = us_energy;
us_array[1] = us_end_cur;
us_array[2] = us_max_cur;
us_array[3] = us_shake;
Checker_SetRtv(us_array,checker_runcfg.rtv_count);
}
/*
@brief 放电
*/
void EW_Test_DisChg()
{
uint8_t uc_rtv = 0;
uc_rtv = EW_DisCharge(0);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 写延时
@param0 写延时
*/
void EW_Test_SetDelay()
{
uint8_t uc_rtv = 0;
uc_rtv = EW_SetDelay(checker_runcfg.netid,checker_runcfg.params[0]);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 读延时
*/
void EW_Test_ReadDelay()
{
uint8_t uc_rtv = 0;
uint16_t aus_temp[2];
uc_rtv = EW_ReadDelay(checker_runcfg.netid,aus_temp);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(aus_temp,checker_runcfg.rtv_count);
}
/*
@brief 时钟校准
@param 校准周期
@param 校准脉冲数据
@rtv 校准值真实值的4倍
*/
void EW_Test_ClkAmend()
{
uint8_t uc_rtv = 0;
uint32_t ul_temp = 0;
uc_rtv = EW_ClkAmend(checker_runcfg.netid,checker_runcfg.params[0],checker_runcfg.params[1]);
delay_os_ms(1000);
uc_rtv |= EW_ReadClkAmend(checker_runcfg.netid,&ul_temp);
ul_temp >>= 2;
Checker_SetRtv((uint16_t*)&ul_temp,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 设置通信地址
@param0 通信地址
@param1 设置模式 0:系统 1UID配置地址 2快速配置
@param2 延时
@rtv 延时
*/
void EW_Test_SetAddr(void)
{
uint8_t uc_rtv = 0;
uint16_t us_temp = 0;
checker_runcfg.netid = checker_runcfg.params[0];
if(checker_runcfg.params[1] == 0)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_temp,checker_runcfg.rtv_count);
return;
}
if(checker_runcfg.params[1] == 1)
{
uc_rtv = EW_SetAddrByUID(checker_runcfg.netid,checker_runcfg.writeuid,checker_runcfg.uid_len);
}else{
uc_rtv = EW_FastSetByUID (checker_runcfg.netid,checker_runcfg.params[2],checker_runcfg.writeuid,checker_runcfg.uid_len,(uint8_t*)&us_temp);
}
Checker_SetRtv(&us_temp,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 状态巡检测试系统只能巡检一个地址起始地址应该大于1结束地址小于1024,两个地址差值应该小于256
@param0 起始地址
@param1 结束地址
@param2 状态码
@rtv 地址结果
*/
void EW_Test_Inspect(void)
{
uint8_t uc_rtv = 0;
uint16_t us_temp = 0;
uint16_t us_count = 0;
uint8_t uc_temp;
uint16_t uc_rtv_count = 0;
memset(EW_RunBuf,0,EW_CHECKER_RUN_BUF);
if(checker_runcfg.params[0] > 0 || checker_runcfg.params[1] < 1024 \
| checker_runcfg.params[0] < checker_runcfg.params[1] \
| (checker_runcfg.params[1] - checker_runcfg.params[0]) < 256)
{
uc_rtv = 1;
Checker_SetRtv(&us_temp,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
uc_rtv = EW_Inspect(checker_runcfg.params[0],checker_runcfg.params[1],checker_runcfg.params[2],EW_RunBuf);
us_temp = 0;
for(us_count = 0,uc_rtv_count = 0; us_count < (checker_runcfg.params[1] - checker_runcfg.params[0]);us_count++)
{
uc_temp = EW_RunBuf[us_count >> 3];
uc_temp = uc_temp & (0x01 <<(us_count & 0x07));
if(uc_temp > 0)
{
us_temp = us_count;
uc_rtv_count++;
}
}
if(uc_rtv_count > 1)
{
uc_rtv = 1;
}
Checker_SetRtv(&us_temp,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 起爆使能
*/
void EW_Test_EnBoom(void)
{
uint8_t uc_rtv = 0;
uc_rtv = EW_EnWriteMTP(0,1);
uc_rtv |= EW_SaveFireInfo(0);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 起爆
@param0 采样超时
@param1 起爆电流AD
@param2 延迟采样
*/
void EW_Test_Boom()
{
uint8_t uc_rtv;
uint16_t us_temp = 0;
uc_rtv = EW_Boom(0,0);
Power_SetSampleRange_Seep(EWChecker_ChgEnger_Sample_R,ADC_SPEED_HIGH);
ADC_GetCurADCFast();
delay_ms(checker_runcfg.params[2]);
if(checker_runcfg.params[0] > 0 || checker_runcfg.params[1] > 0)
{
us_temp = AD_GetBusCurUp(checker_runcfg.params[1],checker_runcfg.params[0]);
}
Checker_SetRtv(&us_temp,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 运行BootLoader
@param0 0 立即跳转 1 等待升级
*/
void EW_Test_RunBoot()
{
uint8_t uc_rtv = 0;
uc_rtv = EW_RunBootLoader(0,checker_runcfg.params[0]);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 缓存信息写入MTP
@param0 MTP地址
@param1 缓存地址
@param2 写入长度
*/
void EW_Test_WriteFacBuff()
{
uint8_t uc_rtv = 0;
uint8_t uc_mtpAddr = checker_runcfg.params[0] >> 2;
uint8_t uc_bufIndex = checker_runcfg.params[1];
uint8_t uc_writeCount = checker_runcfg.params[2];
//Checker_FacBuf 验证合法性
if(0 != Checker_FacBufCheck())
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
uc_rtv = EW_WriteMTP(checker_runcfg.netid,uc_mtpAddr,(Checker_FacBuf+2+uc_bufIndex),uc_writeCount);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
/*
@brief 验证OTP内部与缓存比较
@param0 OTP起始地址
@param1 缓存首地址
@param2 验证长度
*/
void EW_Test_VerifyFacBuff(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_mtpAddr = checker_runcfg.params[0] >> 2;
uint8_t uc_bufIndex = checker_runcfg.params[1];
uint8_t uc_verifyCount = checker_runcfg.params[2];
uint8_t uc_count = 0;
if(0 != Checker_FacBufCheck())
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
EW_ReadMTP(checker_runcfg.netid,uc_mtpAddr,EW_RunBuf,uc_verifyCount);
uc_bufIndex += 2;
for(uc_count = 0; uc_count < uc_verifyCount; uc_count++,uc_bufIndex++)
{
if(EW_RunBuf[uc_count] != Checker_FacBuf[uc_bufIndex])
{
break;
}
}
uc_rtv = 0;
if(uc_verifyCount != uc_count)
{
uc_rtv = 1;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
/*
@brief 关闭桥输出
*/
void EW_Test_PowerOFF(void)
{
uint8_t uc_rtv = 0;
delay_os_ms(100);
XTBUS_OFF;
PowerCalibration_set(POWER_DEF_V,45);
POWER_OFF;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
void EW_Empty(void)
{
Checker_RunCfg_st *cfg=&checker_runcfg;
int count=cfg->rtv_count;
while(count > 0)
{
cfg->Test_Rtv[cfg->rtv_index++] = 0;
count--;
}
Checker_MaskResult(0,cfg->task_info.runindex);
}
CheckerTask ewtaskArray[CHECKER_MAXID_COUNT] ={
Checker_PowerPrapare, //0 电源准备
Checker_WaitDelay, //1 延时等待
Checker_ResistorSample, //2 桥丝电阻测试
EW_Test_PowerOn, //3 上电充能
EW_Test_SetBusV, //4 设置总线电压
EW_Test_BaseCur, //5 获取总线电流
EW_Test_EnMTP , //6 使能MTP
EW_Test_ReadUID, //7 扫描UID
EW_Test_SetRunCfg, //8 写配置参数
EW_Test_CheckRunCfg, //9 检测配置
EW_Test_VerifyRunCfg, //10 验证配置
EW_Test_WriteThreedCode, //11 模拟注码
EW_Test_VerifyThreedCode, //12
EW_Test_CheckSelf, //13 芯片自检
EW_Test_CheckeState, //14状态检测
EW_Test_Charge, //15 充电
EW_Test_DisChg, //16 放电
EW_Test_SetDelay, //17写延时
EW_Test_ReadDelay, //18读延时
EW_Test_ClkAmend, //19时钟校准
EW_Test_SetAddr, //20设置通信地址
EW_Test_Inspect, //21状态巡检
EW_Test_EnBoom, //22起爆使能
EW_Test_Boom, //23起爆检测
EW_Test_WriteFacBuff, //24缓存数据写入MTP
EW_Test_VerifyFacBuff, //25验证缓存数据
EW_Test_PowerOFF, //26 关总线
EW_Updata, //27 升级
EW_Test_ChgEnergy, //28 充能统计
CheckerExt_CalcErr, //29 计算异常
CheckerExt_Repeat, //30 重新执行一次指定任务
(void*)0 //数组结束
};