
#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.params[0]);
	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);
  delay_ms(50);
	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(1,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(2,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(3,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(4,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(5,checker_runcfg.task_info.runindex);
		return;
	}
	//验证PWD
	memcpy(EW_RunBuf,EW_Test_PWD,checker_runcfg.pwd_len);
  delay_ms(200);
	uc_rtv = EW_VerfyPWD(checker_runcfg.netid,EW_RunBuf,checker_runcfg.pwd_len);
	if(uc_rtv > 0)
	{
		Checker_MaskResult(6,checker_runcfg.task_info.runindex);
		return;
	}
	//读状态
  delay_ms(200);
	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)
	if(uc_rtv > 0 || state.State_st.pswd_flag == 0)
	{
		Checker_MaskResult(7,checker_runcfg.task_info.runindex);
		return;
	}
	Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}

/*
@brief 自检
@param  自检模式
@param1 自检时间ms
@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);
  delay_ms(checker_runcfg.params[1]);
	Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
  Checker_SetRtv((uint16_t*)ul_temp,checker_runcfg.rtv_count);	
}

/*
@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,4);
		
		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:系统 1：UID配置地址 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 采样超时 0.01ms
@param1 起爆电流AD 
@param2 延迟采样ms
*/

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);
}








/*
@brief 写三码数据
*/
void EW_Test_WriteUID(void)
{
	uint8_t uc_rtv = 0;
	if(JQXT_Test_IsNeedBind() == 0)
	{
		Checker_MaskResult(0,checker_runcfg.task_info.runindex);
    return;
	}
	
	delay_os_ms(50);
	memcpy(EW_RunBuf,checker_runcfg.writeuid,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);
  if(uc_rtv){
    uc_rtv=1;
    goto end;
  }
	delay_os_ms(50);
	uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1);
  if(uc_rtv){
    uc_rtv=2;
    goto end;
  }
	delay_os_ms(50);
	memcpy(EW_RunBuf,checker_runcfg.writepwd,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);
  if(uc_rtv){
    uc_rtv=3;
    goto end;
  }
	delay_os_ms(50);
	uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x24,EW_RunBuf,checker_runcfg.pwd_len+1);
  if(uc_rtv){
    uc_rtv=4;
    goto end;
  }
	
  end:
	Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}

/*
@breif 验证写入的三码数据
*/
void EW_Test_VerifyUID(void)
{
	uint8_t uc_rtv = 0;
	System_State_un state;
	if(JQXT_Test_IsNeedBind() == 0)
	{
    uc_rtv=0;
    goto end;
	}
	//读UID MTP
  delay_ms(50);  
  memset(EW_RunBuf,0,sizeof(EW_RunBuf));
	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,checker_runcfg.writeuid,checker_runcfg.uid_len))
	{
		uc_rtv = 1;
	}
	if(uc_rtv > 0)
	{
    uc_rtv=1;
    goto end;
	}
  delay_ms(50);  
  memset(EW_RunBuf,0,sizeof(EW_RunBuf));
	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,checker_runcfg.writeuid,checker_runcfg.uid_len))
	{
		uc_rtv = 1;
	}
	if(uc_rtv > 0)
	{
    uc_rtv=2;
    goto end;
	}
		
	//读PWD MTP
  memset(EW_RunBuf,0,sizeof(EW_RunBuf));
  delay_ms(50);
	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,checker_runcfg.writepwd,checker_runcfg.pwd_len))
	{
		uc_rtv = 1;
	}
	if(uc_rtv > 0)
	{
    uc_rtv=3;
    goto end;
	}
  memset(EW_RunBuf,0,sizeof(EW_RunBuf));
  delay_ms(50);
	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,checker_runcfg.writepwd,checker_runcfg.pwd_len))
	{
		uc_rtv = 1;
	}
	if(uc_rtv > 0)
	{
    uc_rtv=4;
    goto end;
	}
	
	//读UID
  memset(EW_RunBuf,0,sizeof(EW_RunBuf));
  delay_ms(50);
	uc_rtv = EW_ReadUID(checker_runcfg.netid,EW_RunBuf,checker_runcfg.uid_len);
	if(0 != memcmp(EW_RunBuf,checker_runcfg.writeuid,checker_runcfg.uid_len))
	{
		uc_rtv = 1;
	}
	if(uc_rtv > 0)
	{
    uc_rtv=5;
    goto end;
	}
	//验证PWD
	memcpy(EW_RunBuf,checker_runcfg.writepwd,checker_runcfg.pwd_len);
  delay_ms(200);
	uc_rtv = EW_VerfyPWD(checker_runcfg.netid,EW_RunBuf,checker_runcfg.pwd_len);
	if(uc_rtv > 0)
	{
    uc_rtv=6;
    goto end;
	}
	//读状态
  delay_ms(200);
	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)
	if(uc_rtv > 0 || state.State_st.pswd_flag == 0)
	{
    uc_rtv=7;
    goto end;
	}
  
  end:
	Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}




// 读mtp
void EW_Test_ReadMTP(void)
{
  uint8_t uc_rtv=0;
  uint8_t addr=checker_runcfg.params[0];
  uint8_t len=checker_runcfg.params[1];
  delay_ms(50);
	uc_rtv|=EW_ReadMTP(checker_runcfg.netid,addr,EW_RunBuf,len);
	Checker_SetRtv((uint16_t *)EW_RunBuf,checker_runcfg.rtv_count);
	Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
// 写mtp
void EW_Test_WriteMTP(void)
{
  uint8_t uc_rtv=0;
  uint8_t addr=checker_runcfg.params[0];
  uint8_t len=checker_runcfg.params[1];
  delay_ms(50);
  memcpy(EW_RunBuf,&checker_runcfg.params[1],len);
	uc_rtv |= EW_WriteMTP(checker_runcfg.netid,addr,EW_RunBuf,len);
	Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}





// 读流水号
void EW_Test_ReadSN(void)
{
  uint8_t uc_rtv=0;
  uint8_t addr=9;
  uint8_t len=4;
  // 缓存开大一点防止数据越界
	typedef union{
    uint8_t arr[6];
    uint32_t data;
  }temp_def;
  temp_def temp={0};
  uint32_t sn;
  sn=checker_runcfg.params[0]|(checker_runcfg.params[1]<<16);
  
  if(sn>=134217728)
  {
    // 如果流水号超过了2^27 则失败
    uc_rtv=1;
    goto end;
  }

  delay_ms(50);
	uc_rtv|=EW_ReadMTP(checker_runcfg.netid,addr,temp.arr,len);
  if(uc_rtv){
    uc_rtv=2;
    goto end;
  }
  // 流水号域如果不为要设置的流水号则失败
  temp.data>>=5;
  if((temp.data)!=sn){
    uc_rtv=3;
  }
  end:
	Checker_SetRtv((uint16_t *)&temp,checker_runcfg.rtv_count);
	Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
// 写流水号,读改写
void EW_Test_WriteSN(void)
{
  uint8_t uc_rtv=0;
  uint8_t addr=9;
  uint8_t len=4;
  // 缓存开大一点防止数据越界
	typedef union{
    uint8_t arr[6];
    uint32_t data;
  }temp_def;
  temp_def temp={0};
  uint32_t sn;
  delay_ms(50);
  sn=checker_runcfg.params[0]|(checker_runcfg.params[1]<<16);
	uc_rtv|=EW_ReadMTP(checker_runcfg.netid,addr,temp.arr,len);
  if(uc_rtv){
    uc_rtv=1;
    goto end;
  }

  if(sn>=134217728)
  {
    // 如果流水号超过了2^27 则失败
    uc_rtv=2;
    goto end;
  }
  delay_ms(50);
  temp.data=(temp.data&0x1f)|(sn<<5);
	uc_rtv |= EW_WriteMTP(checker_runcfg.netid,addr,temp.arr,len);
  if(uc_rtv){
    uc_rtv=3;
    goto end;
  }
  end:
	Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}




// 写固定延时
void EW_Test_WriteDelay(void)
{
  uint8_t uc_rtv=0;
  uint8_t addr[2]={0x48/4,0xa8/4};
  uint8_t len=4;
  // 缓存开大一点防止数据越界
	typedef union{
    uint8_t arr[6];
    uint16_t data;
  }temp_def;
  temp_def temp={0};
  uint16_t delay;
  delay=checker_runcfg.params[0];
  for(int i=0;i<2;i++)
  {
//    delay_ms(50);
//    uc_rtv|=EW_ReadMTP(checker_runcfg.netid,addr[i],temp.arr,len);
//    if(uc_rtv){
//      uc_rtv=1+i;
//      goto end;
//    }
    delay_ms(50);
    temp.data=delay;
    temp.arr[len-1]=CheckCRC_8(temp.arr,len-1);
    uc_rtv |= EW_WriteMTP(checker_runcfg.netid,addr[i],temp.arr,len);
    if(uc_rtv){
      uc_rtv=2+i;
      goto end;
    }
  }
  end:
	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 重新执行一次指定任务
EW_Test_WriteUID,         //31 写入三码数据
EW_Test_VerifyUID,        //32 验证三码数据
CheckerExt_SetUID,        //33 配置三码数据到小板
CheckerExt_Slot,          //34 任务插槽
EW_Test_ReadMTP,          //35 读取mtp
EW_Test_WriteMTP,         //36 写入mtp
CheckerExt_SetCbv,        //37 设置电阻校准值
EW_Test_ReadSN,           //38 读取流水号
EW_Test_WriteSN,          //39 写入流水号
EW_Test_WriteDelay,       //40 写固定延时
EW_Test_RunBoot,          //41 复位，0复位至boot；1复位至app
(void*)0              		//数组结束
};


