Files
checker_slave/source/elec_det/elec_det.c
2023-10-06 18:47:05 +08:00

249 lines
5.5 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 "board.h"
#include "bytearray.h"
#include "mystdlib.h"
#include "elec_det.h"
#include "base/delay.h"
#include "base/utility.h"
#include "hardware/adc_cfg.h"
#include "hardware/dac_cfg.h"
#include "hardware/gpio_cfg.h"
#include "hardware/jw3425iic.h"
#include "hardware/power.h"
#include "hardware/timer_cfg.h"
#include "driver/EWDriver.h"
#include "driver/JQDriver.h"
#include "driver/XTDriver.h"
#include "interface/BaseChecker.h"
#include "interface/JQChecker.h"
#include "interface/XTChecker.h"
#define PLAN_MAX_TASK 64
typedef struct{
CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//方案参数结构体指针
}self_def;
static self_def g_self;
// 获取本机地址
uint8_t elec_local_addr(void)
{
static uint8_t addr=0;
if(addr==0)
addr=Gpio_GetDeivceAddr();
return addr;
}
// 设置led1状态
void elec_led1_power(int power)
{
LED1_Out=power?1:0;
}
// 设置led2状态
void elec_led2_power(int power)
{
LED2_Out=power?1:0;
}
// 获取检测结果
array_def *elec_check_result(void)
{
array_def *r=arr_creat();
return arr_temp(r);
}
// 写硬件版本号
int elec_write_hardversion(int version)
{
board_st.hard_v=version;
return 0;
}
// 写电阻校准值
int elec_write_resistor_cbv(int cbv)
{
board_st.resistor_diff=cbv;
return 0;
}
// 测量桥丝阻值
array_def *elec_check_resistor(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(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;
default : us_resistor = 0;break;
}
array_def *r=arr_creat();
arr_append(r,0);
arr_append(r,us_resistor&0xff);
arr_append(r,(us_resistor >> 8) & 0xff);
return arr_temp(r);
}
// 校验方案,返0成功
static int elec_check_scheme(void)
{
uint32_t ul_crc32;
ul_crc32 = Crc32Calu((uint32_t*)APP_TEST_PLAN_ADDR,(APP_TEST_PLANINFO_SIZE-4));
if(ul_crc32 != (*(uint32_t*)(APP_TEST_PLAN_ADDR+APP_TEST_PLANINFO_SIZE-4)))
{
board_st.plan_id = ~0;
LED1_Out_Off;
return 1;
}
return 0;
}
// 加载方案
static void elec_load_scheme(void)
{
self_def *s=&g_self;
uint8_t uc_index = 0;
uint32_t ul_len;
CheckerTask_Info_st* pinfo_st = (CheckerTask_Info_st*)(APP_TEST_PLAN_ADDR+256);
for(uc_index = 0; uc_index < PLAN_MAX_TASK; uc_index++)
{
s->task_info_array[uc_index] = 0;
}
uc_index = 0;
while((pinfo_st->runindex != 0xFF) && (uc_index < PLAN_MAX_TASK))
{
s->task_info_array[uc_index++] = pinfo_st;
ul_len = pinfo_st->param_rtv_count & 0x0F;
ul_len = (ul_len<<1)+5;
pinfo_st = (CheckerTask_Info_st*)((uint8_t*)pinfo_st + ul_len);
}
}
// 进行检测
array_def *elec_check_with_scheme(array_def *uid_psw)
{
self_def *s=&g_self;
const uint8_t* ptaskindex = (uint8_t*)(APP_TEST_PLAN_ADDR+4);
CheckerTask *tasks_fun_table[]={jqtaskArray,xttaskArray};
CheckerTask_Info_st *task_par=0;
uint8_t chip_type=0;
uint8_t taskid=0;
CheckerTask task_fun=0;
uint8_t res=0;
array_def *r=arr_creat();
chip_type=(board_st.plan_id >> 12 ) & 0x0F;
if(chip_type>=LENGTH(tasks_fun_table)){
arr_append(r,1);
return arr_temp(r);
}
memset(&checker_runcfg,0,sizeof(Checker_RunCfg_st));
int task_index=0;
int err_flag=0;
LED1_Out_Off;
while((ptaskindex[task_index]!=0xff)&&(task_index<PLAN_MAX_TASK)){
memset(&checker_runcfg.task_info,0,sizeof(CheckerTask_Info_st));
taskid=ptaskindex[task_index];
memset(checker_runcfg.params,0,20);
checker_runcfg.param_count = 0;//参数个数
checker_runcfg.rtv_count = 0;//返回值个数
checker_runcfg.excue_rtv = 0;
checker_runcfg.task_info.retry_time = 0;
if(taskid>=CHECKER_MAXID_COUNT){
break;
}
task_par= s->task_info_array[task_index];
if(task_par==0){
break;
}
task_fun=tasks_fun_table[chip_type][taskid];
if(task_fun==0){
break;
}
// 装载参数
rt_memcpy(&checker_runcfg.task_info,task_par,sizeof(CheckerTask_Info_st));
checker_runcfg.param_count = checker_runcfg.task_info.param_rtv_count & 0x0F;
checker_runcfg.rtv_count = (checker_runcfg.task_info.param_rtv_count >> 4) & 0x0F;
rt_memcpy(checker_runcfg.params,checker_runcfg.task_info.params,checker_runcfg.param_count*2);
// 执行任务
for(int i=0;i<1+task_par->retry_time;i++)
{
checker_runcfg.excue_rtv=1;
task_fun();
Checker_Excueindex(task_index);
if(checker_runcfg.excue_rtv==0)
break;
}
// 找寻下一个任务
if((checker_runcfg.excue_rtv != 0)
&& (checker_runcfg.task_info.error_jumpto != 0)
&& (checker_runcfg.task_info.error_jumpto != 0xFF)
)
{
uint8_t uc_index = task_index+1;//如果时跳至下一个,直接顺序执行
task_index = checker_runcfg.task_info.error_jumpto;
while(uc_index < task_index)
{
Checker_MaskResult(1,uc_index);//将跳过的步骤标记未执行
//调整参数返回值下标,将跳过的步骤里面的返回值存储空间保留
checker_runcfg.rtv_index += (s->task_info_array[uc_index]->param_rtv_count >> 4) & 0x0F;
uc_index++;
}
}else{
task_index++;//正常情况直接顺序执行
}
}
arr_append(r,0);
arr_appends(r,checker_runcfg.Task_Result,8);
arr_appends(r,checker_runcfg.Task_Excute,8);
arr_appends(r,checker_runcfg.Test_Rtv,checker_runcfg.rtv_index*2);
return arr_temp(r);
}