Files
checker_slave/source/elec_det/interface/BaseChecker.c
ranchuan cbbb2af298 解决自动更新bootloader死机的问题
软件版本2.00
解决检测任务中重试失败后不会填充返回值的bug
2023-10-16 18:53:12 +08:00

234 lines
5.1 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 "Basechecker.h"
#include "base/utility.h"
#include "hardware/power.h"
#include "base/delay.h"
#include "hardware/gpio_cfg.h"
Checker_RunCfg_st checker_runcfg;
uint8_t Checker_FacBuf[CHECKER_FAC_BUF_LEN];
volatile uint8_t ThreeBindResult_flag = 1;
volatile uint16_t Checker_First_Set_Voltage = 88;
/*
@brief 标记执行结果
@param rtv 执行返回值 1表示失败 0 表示成功
@param taskindex 任务项目ID号
*/
void Checker_MaskResult(uint8_t rtv,uint8_t taskindex)
{
uint8_t uc_index = taskindex >> 3;
uint8_t uc_bitindex = taskindex & 0x07;
if(taskindex >= CHECKER_MAXRT_COUNT)
{
return;
}
checker_runcfg.excue_rtv = rtv;
uc_bitindex = (0x01<<uc_bitindex) & 0xFF;
if(rtv == 0)
{
checker_runcfg.Task_Result[uc_index] &= (~uc_bitindex);
}else{
checker_runcfg.Task_Result[uc_index] |= uc_bitindex;
}
CurrentSampleR_Def;
}
/*
@brief 标记任务序列执行
@param taskindex 任务序列号
*/
void Checker_Excueindex(uint8_t taskindex)
{
uint8_t uc_index = taskindex >> 3;
uint8_t uc_bitindex = taskindex & 0x07;
if(taskindex >= CHECKER_MAXRT_COUNT)
{
return;
}
uc_bitindex = (0x01<<uc_bitindex) & 0xFF;
checker_runcfg.Task_Excute[uc_index] |= uc_bitindex;
}
/*
@brief 保存测试结果值
@param *pus_rtv 测量结果缓存
@param count 缓存个数
*/
void Checker_SetRtv(uint16_t* pus_rtv, uint8_t count)
{
while(count > 0)
{
checker_runcfg.Test_Rtv[checker_runcfg.rtv_index++] = *pus_rtv;
pus_rtv++;
count--;
}
}
/*
brief 准备测试用电压
@param 设置电压值最多支持10个参数
*/
void Checker_PowerPrapare(void)
{
uint8_t uc_index = 0;
uint8_t uc_rtv = 0;
uint16_t us_h_v,us_m_v;
if(checker_runcfg.power_prapare_exe > 0 || checker_runcfg.param_count == 0){
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return ;
}
Checker_First_Set_Voltage = checker_runcfg.params[0];
Bubble_Sort_u16(checker_runcfg.params,checker_runcfg.param_count);
POWER_OFF;
while(uc_index < checker_runcfg.param_count)
{
us_h_v = checker_runcfg.params[uc_index];
uc_index++;
if(us_h_v < 55)
{
uc_rtv = 1;
continue;
}
us_m_v = (us_h_v>>1) > 50 ? (us_h_v>>1):50;
uc_rtv |= PowerCalibration_set(us_h_v,us_m_v);
}
PowerCalibration_set(POWER_DEF_V,POWER_DEF_V-10);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 延时
@pram1 延时时间 0.1S
@param 使能总线电流监控
@rtv1 波动AD值
*/
void Checker_WaitDelay(void)
{
uint32_t ul_delaytime = checker_runcfg.params[0];
uint8_t us_monito_flag = checker_runcfg.params[1];
uint16_t us_temp;
if(us_monito_flag == 0)
{
while(ul_delaytime > 0)
{
delay_os_ms(100);
ul_delaytime--;
}
}else{
Power_SetSampleRange_Seep(Checker_MonitorBuf_Sample_R,ADC_SPEED_MIDLE);
delay_ms(1);
us_temp = AD_CurMonitor(ul_delaytime*1000);
CurrentSampleR_Def;
}
Power_SetSampleCurrentRange(Current_Max);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_temp,checker_runcfg.rtv_count);
}
/*
@brief 电阻检测
@param0 电阻检测模式 0 4线制 1 2线 1-42 2线 2-3 通
@rtv0 电阻检测值
*/
void Checker_ResistorSample(void)
{
/*
1 通道1-4通过桥丝
2 通道2-3通过桥丝
3 通道1-3通测阻抗
4 通道2-4通测阻抗
*/
uint16_t aus_sample[5];
uint16_t us_resistor;
uint8_t uc_index = 0;
AD_SampleResistor(aus_sample);
for(uc_index = 0; uc_index < 5; uc_index++)
{
aus_sample[uc_index] -= board_st.resistor_diff;
}
switch(checker_runcfg.params[0])
{
case 0: us_resistor = aus_sample[0];break;
case 1: us_resistor = aus_sample[1];break;
case 2: us_resistor = aus_sample[2];break;
case 3: us_resistor = aus_sample[3];break;
case 4: us_resistor = aus_sample[4];break;
default : us_resistor = 0;break;
}
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_resistor,checker_runcfg.rtv_count);
}
/*
@brief 判断是否需要注码
@rtv 0 不需要注码 1 注码
*/
uint8_t JQXT_Test_IsNeedBind(void)
{
uint8_t uc_index = 0;
if(checker_runcfg.uid_len == 0 || checker_runcfg.pwd_len == 0)
{
return 0;
}
for(uc_index = 0; uc_index < checker_runcfg.uid_len ; uc_index++)
{
if(checker_runcfg.writeuid[uc_index] != 0)
{
break;
}
}
if(uc_index != checker_runcfg.uid_len)
{
return 1;
}
for(uc_index = 0; uc_index < checker_runcfg.pwd_len ; uc_index++)
{
if(checker_runcfg.writepwd[uc_index] != 0)
{
break;
}
}
if(uc_index != checker_runcfg.pwd_len)
{
return 1;
}
return 0;
}
/*
检测执行函数是否正常
*/
uint8_t Checker_FunIsValid(CheckerTask* taskArray,uint16_t run_index)
{
uint16_t index = 0;
while((*taskArray !=0) && (index < CHECKER_MAXID_COUNT))
{
index++;
}
if(run_index >= index)
{
return 1;
}
return 0;
}
/*
@brief 缓存空间检测
@rtv 1 失败 0 成功
*/
uint8_t Checker_FacBufCheck()
{
uint8_t uc_len = Checker_FacBuf[0];
uint8_t uc_crc = Checker_FacBuf[1];
if(uc_len > (CHECKER_FAC_BUF_LEN-2) || uc_len == 0)
{
return 1;
}
if(uc_crc != CheckCRC_8(Checker_FacBuf+2,uc_len))
{
return 1;
}
return 0;
}