Files
checker_slave/source/elec_det/elec_det.c

668 lines
15 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 "mystring.h"
#include "debug.h"
#include "stdlib.h"
#include "dev_flash.h"
#include "compiler_info.h"
#include "elec_judge.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"
#include "interface/EWChecker.h"
#include "interface/CheckerExt.h"
/*
此文件定义了电子模块与外界软件程序交互的接口
*/
#define PLAN_MAX_TASK 64
#define TASK_PAR_BACK_LEN 10
typedef struct{
CheckerTask_Info_st task_par;
int par_count;
int ret_count;
int rtv_index;// 返回值下标
uint16_t params[10];
}task_par_back;
typedef struct{
CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//方案参数结构体指针
const uint8_t* taskid_table;
CheckerTask *tasks_fun_table[3];
CheckerTask_Info_st *task_par;
CheckerTask task_fun;
uint8_t chip_type;
int task_index;
int task_num;
int scheme_inited;
array_def *data;
task_par_back *task_back_table[TASK_PAR_BACK_LEN];
int task_back_index;
}self_def;
static self_def g_self={
.taskid_table=(uint8_t*)(APP_TEST_PLAN_ADDR+4),
// .tasks_fun_table={jqtaskArray,xttaskArray,ewtaskArray},
.tasks_fun_table={jqtaskArray,0,ewtaskArray},
};
static int elec_check_scheme(void);
static void elec_load_scheme(void);
static int elec_parper_power(void);
// 初始化
int elec_init(void)
{
void Ye_BoardInit(void);
Ye_BoardInit();
elec_bootinfo();
DBG_LOG("local addr:%d.",elec_local_addr());
return elec_scheme_init();
}
// 初始化方案
int elec_scheme_init(void)
{
self_def *s=&g_self;
int ret=0;
if(elec_check_scheme()!=0){
// 方案校验失败
DBG_WARN("scheme check failed.");
s->scheme_inited=0;
return 1;
}
s->scheme_inited=1;
elec_load_scheme();
ret=elec_parper_power();
return ret;
}
// 方案去初始化
int elec_scheme_deinit(void)
{
self_def *s=&g_self;
s->scheme_inited=0;
board_st.plan_id = ~0;
return 0;
}
// 找到第一个指定taskid的任务
static CheckerTask_Info_st *elec_find_task_by_taskid(int id)
{
self_def *s=&g_self;
CheckerTask_Info_st *task_par=0;
for(int i=0;i<s->task_num;i++){
task_par= s->task_info_array[i];
if(task_par->taskid==id){
return task_par;
}
}
return 0;
}
// 调压
static int elec_parper_power(void)
{
self_def *s=&g_self;
CheckerTask_Info_st *task_par=0;
int ret=0;
task_par= elec_find_task_by_taskid(0);
if(task_par==0){
// 找不到调压任务,失败
DBG_WARN("parper power failed,can not find task with id 0.");
return 1;
}
// 装载参数
checker_runcfg.power_prapare_exe=0;
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);
Checker_PowerPrapare();
ret=checker_runcfg.excue_rtv;
if(ret){
DBG_WARN("parper power failed,ret=%d.",ret);
}else{
checker_runcfg.power_prapare_exe=1;
}
JQBUS_OFF;
delay_ms(20);
PowerCalibration_set(POWER_DEF_V,POWER_DEF_V-10);
return ret;
}
// 获取本机地址
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?0:1;
}
// 设置led2状态
void elec_led2_power(int power)
{
LED2_Out=power?0:1;
}
// 获取小板硬件版本号
int elec_hard_version(void)
{
return HARD_VERSION;
}
// 获取自检参数
array_def *elec_bootinfo(void)
{
void Ye_BoardCheck(void);
Ye_BoardCheck();
board_st.hard_v=sys_param()->hard_version;
board_st.resistor_diff=sys_param()->resistor_diff;
//board_st.hard_v=rt_tick_get()/1000;
board_st.hard_v=HARD_VERSION;
board_st.soft_v=(int)(str_atof(SOFT_VERSION)*100+0.5);
array_def *r=arr_creat();
arr_append(r,0);
arr_appends(r,&board_st,sizeof(BoartCheck_st));
return arr_temp(r);
}
// 获取检测结果
array_def *elec_check_result(void)
{
self_def *s=&g_self;
array_def *r=0;
if(s->data){
r=arr_duplicate(s->data);
}
return arr_temp(r);
}
// 清除检测结果
void elec_check_result_clear(void)
{
self_def *s=&g_self;
CHECK_DO(s->data,arr_delete);
}
// 写硬件版本号
array_def *elec_write_hardversion(int version)
{
sys_param_def *spar=0;
spar=calloc(1,sizeof(sys_param_def));
memcpy(spar,sys_param(),sizeof(sys_param_def));
spar->hard_version=version;
flash_save_param(spar);
free(spar);
board_st.hard_v=version;
array_def *r=arr_creat();
arr_append(r,0);
return arr_temp(r);
}
// 写电阻校准值
array_def *elec_write_resistor_cbv(int cbv)
{
sys_param_def *spar=0;
spar=calloc(1,sizeof(sys_param_def));
memcpy(spar,sys_param(),sizeof(sys_param_def));
spar->resistor_diff=cbv;
flash_save_param(spar);
free(spar);
board_st.resistor_diff=cbv;
array_def *r=arr_creat();
arr_append(r,0);
return arr_temp(r);
}
// 写缓存
array_def *elec_write_fat_buff(array_def *d)
{
int ret=0;
int num=arr_length(d);
if(num<CHECKER_FAC_BUF_LEN){
memcpy(Checker_FacBuf,arr_data(d),num);
DBG_LOG("facbuf:%s.",str_temp(arr_string(d)));
ret=0;
}else{
ret=1;
}
array_def *r=arr_creat();
arr_append(r,ret);
return arr_temp(r);
}
// 测量桥丝阻值
array_def *elec_check_resistor(uint8_t index)
{
/*
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(index)
{
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 5: us_resistor = board_st.resistor_diff;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;
}else{
board_st.plan_id = *((uint32_t*)APP_TEST_PLAN_ADDR);
}
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;
s->task_num=0;
while((pinfo_st->runindex != 0xFF) && (uc_index < PLAN_MAX_TASK))
{
s->task_info_array[uc_index++] = pinfo_st;
s->task_num++;
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);
}
}
// 注码 参数校验 1,检测时注码0,单独注码;-1,失败
static int elec_code_param_check(array_def *uid_psw)
{
if((uid_psw==0)||(arr_length(uid_psw)==0)){
return -1;
}
if(arr_length(uid_psw)!=(arr_get(uid_psw,0)+arr_get(uid_psw,1)+3)){
return -1;
}
if((arr_get(uid_psw,0)>13)||(arr_get(uid_psw,1)>8)){
return -1;
}
if(arr_get(uid_psw,2)!=0){
return 1;
}
return 0;
}
// 注码 准备参数
static int elec_code_load_param(array_def *uid_psw)
{
uint8_t pwd_len=0,uid_len=0;
uid_len = arr_get(uid_psw,0);
pwd_len = arr_get(uid_psw,1);
checker_runcfg.uid_len=uid_len;
checker_runcfg.pwd_len=pwd_len;
memcpy(checker_runcfg.writeuid,arr_data(uid_psw)+3,uid_len);
memcpy(checker_runcfg.writepwd,arr_data(uid_psw)+3+uid_len,pwd_len);
return 0;
}
// 检测 准备参数
int elec_check_load_task_param(uint8_t task_index)
{
self_def *s=&g_self;
uint8_t taskid;
CheckerTask_Info_st *task_par;
taskid=s->taskid_table[task_index];
s->task_fun=elec_get_task_fun(taskid);
task_par= s->task_info_array[task_index];
memset(&checker_runcfg.task_info,0,sizeof(CheckerTask_Info_st));
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+CHECKER_EXTID_COUNT)){
DBG_WARN("taskid=%d out of bound.",taskid);
return 1;
}
if(task_par==0){
DBG_WARN("can not find task params.");
return 2;
}
if(s->task_fun==0){
DBG_WARN("can not find task fun.");
return 3;
}
// 装载参数
s->task_par=task_par;
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;
memcpy(checker_runcfg.params,checker_runcfg.task_info.params,checker_runcfg.param_count*2);
return 0;
}
// 备份任务运行环境,0成功
int elec_task_env_back(void)
{
self_def *s=&g_self;
task_par_back *b=0;
if(s->task_back_index>=TASK_PAR_BACK_LEN){
return 1;
}
s->task_back_table[s->task_back_index]=calloc(1,sizeof(task_par_back));
b=s->task_back_table[s->task_back_index];
if(b==0){
return 2;
}
b->par_count=checker_runcfg.param_count;
b->ret_count=checker_runcfg.rtv_count;
b->rtv_index=checker_runcfg.rtv_index;
memcpy(&b->task_par, &checker_runcfg.task_info,sizeof(CheckerTask_Info_st));
memcpy(b->params,checker_runcfg.params,checker_runcfg.param_count*2);
s->task_back_index++;
return 0;
}
// 恢复任务运行环境,0成功
int elec_task_env_restore(void)
{
self_def *s=&g_self;
task_par_back *b=0;
if(s->task_back_index<=0){
return 1;
}
b=s->task_back_table[s->task_back_index-1];
checker_runcfg.param_count=b->par_count;
checker_runcfg.rtv_count=b->ret_count;
checker_runcfg.rtv_index=b->rtv_index;
memcpy(&checker_runcfg.task_info,&b->task_par, sizeof(CheckerTask_Info_st));
memcpy(checker_runcfg.params,b->params,checker_runcfg.param_count*2);
free(b);
s->task_back_index--;
return 0;
}
// 根据任务id获取检测函数
CheckerTask elec_get_task_fun(uint8_t taskid)
{
self_def *s=&g_self;
CheckerTask task_fun=0;
CheckerTask **tasks_fun_table=s->tasks_fun_table;
uint8_t chip_type=s->chip_type;
if(taskid<CHECKER_MAXID_COUNT){
if(tasks_fun_table[chip_type]){
task_fun=tasks_fun_table[chip_type][taskid];
}
}else if((taskid>=CHECKER_MAXID_COUNT)&&
(taskid<(CHECKER_MAXID_COUNT+CHECKER_EXTID_COUNT)))
{
task_fun=exttaskArray[taskid-CHECKER_MAXID_COUNT];
}
s->task_fun=task_fun;
return task_fun;
}
// 执行任务
void elec_exe_task(void)
{
self_def *s=&g_self;
if(s->task_fun==0){
return;
}
DBG_LOG("start task_index:%d",s->task_index);
for(int i=0;i<1+s->task_par->retry_time;i++)
{
checker_runcfg.excue_rtv=1;
s->task_fun();
Checker_Excueindex(s->task_index);
checker_runcfg.rtv_index-=checker_runcfg.rtv_count;
if(checker_runcfg.excue_rtv==0)
break;
}
char *str=malloc(200);
int str_len=0;
for(int i=0;i<checker_runcfg.rtv_count;i++)
{
str_len+=sprintf(str+str_len,"%d,",checker_runcfg.Test_Rtv[checker_runcfg.rtv_index+i]);
}
checker_runcfg.rtv_index+=checker_runcfg.rtv_count;
if(checker_runcfg.rtv_count>0){
DBG_LOG("task_index:%d,taskid:%d,ret=%d,rtv_index=%d.",s->task_index,
s->task_par->taskid,checker_runcfg.excue_rtv,checker_runcfg.rtv_index);
DBG_LOG("rets:%s\n",str);
}else{
DBG_LOG("task_index:%d,taskid:%d,ret=%d,rtv_index=%d.\n",s->task_index,
s->task_par->taskid,checker_runcfg.excue_rtv,checker_runcfg.rtv_index);
}
free(str);
}
// 进行检测
array_def *elec_check_with_scheme(array_def *uid_psw)
{
self_def *s=&g_self;
s->task_par=0;
s->chip_type=0;
uint8_t taskid=0;
uint8_t res=0;
s->task_index=0;
array_def *r=arr_creat();
if(s->scheme_inited==0){
DBG_WARN("scheme not init.");
arr_append(r,20);
return arr_temp(r);
}
res=checker_runcfg.power_prapare_exe;
memset(&checker_runcfg,0,sizeof(Checker_RunCfg_st));
checker_runcfg.power_prapare_exe=res;
s->chip_type=(board_st.plan_id >> 12 ) & 0x0F;
if(elec_code_param_check(uid_psw)==1){
elec_code_load_param(uid_psw);
}
if(s->chip_type>=LENGTH(s->tasks_fun_table)){
DBG_WARN("unknown chip type.");
arr_append(r,20);
return arr_temp(r);
}
elec_check_result_clear();
LED1_Out_Off;
while(s->task_index<s->task_num){
if(elec_check_load_task_param(s->task_index)){
break;
}
elec_exe_task();
// 找寻下一个任务
s->task_index++;
if(checker_runcfg.excue_rtv != 0){
uint8_t err_to=checker_runcfg.task_info.error_jumpto;
uint8_t temp;
if(err_to==0xff) continue;
if(err_to>s->task_num-1) err_to=s->task_num-1;
for(;s->task_index<err_to;s->task_index++){
Checker_MaskResult(1,s->task_index);
temp=(s->task_info_array[s->task_index]->param_rtv_count >> 4) & 0x0F;
checker_runcfg.rtv_index+=temp;
}
}
}
elec_judge_def *e=malloc(sizeof(elec_judge_def));
elec_judge(e,s->task_num,checker_runcfg.Task_Result,
checker_runcfg.Task_Excute,
(uint8_t *)checker_runcfg.Test_Rtv,&res,0);
free(e);
arr_append(r,res);
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);
s->data=arr_duplicate(r);
return arr_temp(r);
}
// 单独注码
array_def *elec_code(array_def *uid_psw)
{
self_def *s=&g_self;
array_def *r=arr_creat();
uint8_t ret=0;
int check_ret=0;
elec_check_result_clear();
check_ret=elec_code_param_check(uid_psw);
if(check_ret!=0){
arr_append(r,1);
return arr_temp(r);
}
elec_code_load_param(uid_psw);
// ret = XT_UID_PWD_Bind();
arr_append(r,ret);
s->data=arr_duplicate(r);
return arr_temp(r);
}
// 执行任务插槽
array_def *elec_check_slot(void)
{
self_def *s=&g_self;
s->task_par=0;
s->chip_type=0;
uint8_t taskid=0;
uint8_t res=0;
s->task_index=0;
array_def *r=arr_creat();
res=checker_runcfg.power_prapare_exe;
memset(&checker_runcfg,0,sizeof(Checker_RunCfg_st));
checker_runcfg.power_prapare_exe=res;
if(s->scheme_inited){
s->chip_type=(board_st.plan_id >> 12 ) & 0x0F;
}
checker_runcfg.param_count=1;
checker_runcfg.params[0]=1;
CheckerExt_Slot();
elec_judge_def *e=malloc(sizeof(elec_judge_def));
elec_judge(e,s->task_num,checker_runcfg.Task_Result,
checker_runcfg.Task_Excute,
(uint8_t *)checker_runcfg.Test_Rtv,&res,0);
free(e);
arr_append(r,res);
return arr_temp(r);
}