#include "board.h" #include "bytearray.h" #include "mystdlib.h" #include "debug.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" #define PLAN_MAX_TASK 64 typedef struct{ CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//方案参数结构体指针 int scheme_inited; }self_def; static self_def g_self; // 初始化 int elec_init(void) { self_def *s=&g_self; void Ye_BoardInit(void); void Ye_BoardCheck(void); int elec_check_scheme(void); void elec_load_scheme(void); Ye_BoardInit(); Ye_BoardCheck(); if(elec_check_scheme()!=0){ // 方案校验失败 DBG_WARN("scheme check failed."); s->scheme_inited=0; return 1; } s->scheme_inited=1; elec_load_scheme(); return 0; } // 获取本机地址 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(); arr_append(r,3); return arr_temp(r); } // 写硬件版本号 array_def *elec_write_hardversion(int version) { array_def *r=arr_creat(); board_st.hard_v=version; arr_append(r,0); return arr_temp(r); } // 写电阻校准值 array_def *elec_write_resistor_cbv(int cbv) { array_def *r=arr_creat(); board_st.resistor_diff=cbv; arr_append(r,0); 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* taskid_table = (uint8_t*)(APP_TEST_PLAN_ADDR+4); CheckerTask *tasks_fun_table[]={jqtaskArray,xttaskArray,ewtaskArray}; 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(s->scheme_inited==0){ DBG_WARN("scheme not init."); arr_append(r,1); return arr_temp(r); } if(chip_type>=LENGTH(tasks_fun_table)){ DBG_WARN("unknown chip type."); arr_append(r,2); return arr_temp(r); } memset(&checker_runcfg,0,sizeof(Checker_RunCfg_st)); int task_index=0; int err_flag=0; LED1_Out_Off; while((taskid_table[task_index]!=0xff)&&(task_index=CHECKER_MAXID_COUNT){ DBG_WARN("tiskid out of bound."); break; } task_par= s->task_info_array[task_index]; if(task_par==0){ DBG_WARN("can not find task params."); break; } task_fun=tasks_fun_table[chip_type][taskid]; if(task_fun==0){ DBG_WARN("can not find task fun."); 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; checker_runcfg.rtv_index-=checker_runcfg.rtv_count; } // 找寻下一个任务 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); }