diff --git a/checher_slave.uvoptx b/checher_slave.uvoptx
index 2d0fd03..32729a5 100644
--- a/checher_slave.uvoptx
+++ b/checher_slave.uvoptx
@@ -299,7 +299,7 @@
1
0
- 1
+ 0
18
@@ -523,7 +523,7 @@
1
0
- 0
+ 1
18
@@ -551,7 +551,7 @@
1
0
0
- 6
+ 4
@@ -562,7 +562,7 @@
- STLink\ST-LINKIII-KEIL_SWO.dll
+ Segger\JL2CM3.dll
@@ -583,7 +583,7 @@
0
DLGUARM
- (105=-1,-1,-1,-1,0)
+ d
0
@@ -612,8 +612,8 @@
1
- 0
- uid_psw
+ 1
+ 0x200033B0
0
@@ -1459,6 +1459,18 @@
0
0
+
+ 6
+ 61
+ 1
+ 0
+ 0
+ 0
+ .\source\elec_det\elec_judge.c
+ elec_judge.c
+ 0
+ 0
+
@@ -1469,7 +1481,7 @@
0
7
- 61
+ 62
1
0
0
@@ -1481,7 +1493,7 @@
7
- 62
+ 63
1
0
0
@@ -1501,7 +1513,7 @@
0
8
- 63
+ 64
1
0
0
@@ -1513,7 +1525,7 @@
8
- 64
+ 65
1
0
0
@@ -1525,7 +1537,7 @@
8
- 65
+ 66
1
0
0
@@ -1537,7 +1549,7 @@
8
- 66
+ 67
1
0
0
@@ -1549,7 +1561,7 @@
8
- 67
+ 68
1
0
0
@@ -1561,7 +1573,7 @@
8
- 68
+ 69
1
0
0
@@ -1573,7 +1585,7 @@
8
- 69
+ 70
1
0
0
@@ -1585,7 +1597,7 @@
8
- 70
+ 71
1
0
0
@@ -1597,7 +1609,7 @@
8
- 71
+ 72
1
0
0
@@ -1609,7 +1621,7 @@
8
- 72
+ 73
1
0
0
@@ -1621,7 +1633,7 @@
8
- 73
+ 74
1
0
0
@@ -1633,7 +1645,7 @@
8
- 74
+ 75
1
0
0
@@ -1645,7 +1657,7 @@
8
- 75
+ 76
1
0
0
@@ -1657,7 +1669,7 @@
8
- 76
+ 77
1
0
0
@@ -1669,7 +1681,7 @@
8
- 77
+ 78
1
0
0
@@ -1681,7 +1693,7 @@
8
- 78
+ 79
1
0
0
@@ -1693,7 +1705,7 @@
8
- 79
+ 80
1
0
0
@@ -1705,7 +1717,7 @@
8
- 80
+ 81
1
0
0
@@ -1717,7 +1729,7 @@
8
- 81
+ 82
2
0
0
@@ -1737,7 +1749,7 @@
0
9
- 82
+ 83
1
0
0
@@ -1749,7 +1761,7 @@
9
- 83
+ 84
1
0
0
@@ -1761,7 +1773,7 @@
9
- 84
+ 85
1
0
0
@@ -1773,7 +1785,7 @@
9
- 85
+ 86
1
0
0
@@ -1785,7 +1797,7 @@
9
- 86
+ 87
1
0
0
@@ -1797,7 +1809,7 @@
9
- 87
+ 88
1
0
0
@@ -1809,7 +1821,7 @@
9
- 88
+ 89
1
0
0
@@ -1821,7 +1833,7 @@
9
- 89
+ 90
1
0
0
@@ -1833,7 +1845,7 @@
9
- 90
+ 91
1
0
0
@@ -1845,7 +1857,7 @@
9
- 91
+ 92
1
0
0
@@ -1857,7 +1869,7 @@
9
- 92
+ 93
1
0
0
@@ -1877,7 +1889,7 @@
0
10
- 93
+ 94
1
0
0
@@ -1889,7 +1901,7 @@
10
- 94
+ 95
1
0
0
@@ -1901,7 +1913,7 @@
10
- 95
+ 96
1
0
0
@@ -1913,7 +1925,7 @@
10
- 96
+ 97
1
0
0
@@ -1925,7 +1937,7 @@
10
- 97
+ 98
1
0
0
@@ -1945,7 +1957,7 @@
0
11
- 98
+ 99
1
0
0
@@ -1965,7 +1977,7 @@
0
12
- 99
+ 100
1
0
0
@@ -1977,7 +1989,7 @@
12
- 100
+ 101
1
0
0
@@ -1989,7 +2001,7 @@
12
- 101
+ 102
1
0
0
@@ -2001,7 +2013,7 @@
12
- 102
+ 103
1
0
0
@@ -2013,7 +2025,7 @@
12
- 103
+ 104
1
0
0
@@ -2025,7 +2037,7 @@
12
- 104
+ 105
1
0
0
@@ -2045,7 +2057,7 @@
0
13
- 105
+ 106
5
0
0
@@ -2065,7 +2077,7 @@
0
14
- 106
+ 107
5
0
0
@@ -2077,7 +2089,7 @@
14
- 107
+ 108
5
0
0
diff --git a/checher_slave.uvprojx b/checher_slave.uvprojx
index a6deba6..eda6663 100644
--- a/checher_slave.uvprojx
+++ b/checher_slave.uvprojx
@@ -929,6 +929,11 @@
1
.\source\elec_det\elec_io.c
+
+ elec_judge.c
+ 1
+ .\source\elec_det\elec_judge.c
+
@@ -3684,6 +3689,11 @@
1
.\source\elec_det\elec_io.c
+
+ elec_judge.c
+ 1
+ .\source\elec_det\elec_judge.c
+
@@ -4919,6 +4929,11 @@
1
.\source\elec_det\elec_io.c
+
+ elec_judge.c
+ 1
+ .\source\elec_det\elec_judge.c
+
diff --git a/python/prottcp.py b/python/prottcp.py
index e46c48a..8eb04c4 100644
--- a/python/prottcp.py
+++ b/python/prottcp.py
@@ -141,30 +141,36 @@ def scheme_to_byte(j:json):
# int转数组
def arr_from_int(num:int):
return bytearray([num&0xff,(num>>8)&0xff,(num>>16)&0xff,(num>>24)&0xff])
+# uchar转数组
+def arr_from_uchar(num:int):
+ return bytearray([num&0xff])
+# u16转数组
+def arr_from_u16(num:int):
+ return bytearray([num&0xff,(num>>8)&0xff])
# 提取方案中的范围数据, 先max后min
def scheme_get_task_range(j:json):
t=bytearray()
- t+=arr_from_int(j["TaskID"])
- t+=arr_from_int(j["TaskIndex"])
- t+=arr_from_int(j["ReturnCount"])
- t+=arr_from_int(j["ExecuteErrCode"])
+ t+=arr_from_uchar(j["TaskID"])
+ t+=arr_from_uchar(j["TaskIndex"])
+ t+=arr_from_uchar(j["ReturnCount"])
+ t+=arr_from_uchar(j["ExecuteErrCode"])
index=0
for i in j["TestStandard"]:
- t+=arr_from_int(i["Max"])
- t+=arr_from_int(i["Min"])
+ t+=arr_from_u16(i["Max"])
+ t+=arr_from_u16(i["Min"])
if (index=e->scheme->task_num) {\
+ elec_add_errcode(e,6);\
+ return ;}
+// 任务判定标志校验
+#define TASK_FLAG_CHECK(index){\
+ if(e->judge_flag[index/8]&(1<<(index%8))){\
+ return;}\
+ else{\
+ e->judge_flag[index/8]|=(1<<(index%8));}}\
+// 任务执行结果校验
+#define EXE_FLAG_CHECK(index)\
+ (e->exe_flag[index/8]&(1<<(index%8)))?1:0
+// 取任务结果的第index位
+#define GET_RET_DATA(i)\
+ (data[i*2]|(data[i*2+1]<<8))
+
+
+
+// 添加错误代码
+static void elec_add_errcode(elec_judge_def *e,int err)
+{
+ int index=-1;
+ for(int i=0;ierr_list[i]==0){
+ if(index<0) index=i;
+ }
+ if(e->err_list[i]==err){
+ return;
+ }
+ }
+ if(index>=0){
+ e->err_list[index]=err;
+ }
+}
+
+
+
+// 计算方案有多少个返回值
+static int elec_get_ret_num(void)
+{
+ const scheme_def *s=check_scheme();
+ const scheme_task_def *t;
+ int index=0;
+ for(int i=0;itask_num;i++)
+ {
+ t=&s->task[i];
+ index+=t->item_num;
+ }
+ return index;
+}
+
+
+
+
+// 通用任务判定函数
+static void elec_task_judge(elec_judge_def *e,int index,uint8_t *data)
+{
+ INDEX_CHECK(index);
+ TASK_FLAG_CHECK(index);
+ const scheme_task_def *task=&e->scheme->task[index];
+ uint16_t temp;
+ if(EXE_FLAG_CHECK(index)){
+ elec_add_errcode(e,task->err);
+ }
+ for(int i=0;iitem_num;i++){
+ temp=data[i*2]|(data[i*2+1]<<8);
+ if(temprange[i].min||temp>task->range[i].max){
+ elec_add_errcode(e,task->range[i].err);
+ }
+ }
+}
+
+
+
+// 电源准备
+static void elec_power_on(elec_judge_def *e,int index,uint8_t *data)
+{
+ INDEX_CHECK(index);
+ TASK_FLAG_CHECK(index);
+ const scheme_task_def *task=&e->scheme->task[index];
+ uint16_t temp;
+ if(EXE_FLAG_CHECK(index)){
+ elec_add_errcode(e,1);
+ }
+}
+
+
+// 上电充能
+static void elec_charge(elec_judge_def *e,int index,uint8_t *data)
+{
+ INDEX_CHECK(index);
+ TASK_FLAG_CHECK(index);
+ const scheme_task_def *task=&e->scheme->task[index];
+ uint16_t temp;
+ temp=GET_RET_DATA(0);
+ if(temprange[0].min||temp>task->range[0].max){
+ elec_add_errcode(e,1);
+ }
+ temp=GET_RET_DATA(1);
+ if(temprange[1].min||temp>task->range[1].max){
+ elec_add_errcode(e,task->range[1].err);
+ }
+}
+
+
+
+// 检测电流
+static void elec_current(elec_judge_def *e,int index,uint8_t *data)
+{
+ INDEX_CHECK(index);
+ TASK_FLAG_CHECK(index);
+ const scheme_task_def *task=&e->scheme->task[index];
+ uint16_t temp,temp2;
+ uint16_t short_c=e->short_circuited;
+ uint16_t open_c=e->open_circuited;
+ temp=GET_RET_DATA(0);
+ temp2=GET_RET_DATA(1);
+ if((temptask->range[0].max)&&(temptask->range[1].max)&&(temp2short_c)&&(temp2>short_c))
+ {
+ // 短路
+ elec_add_errcode(e,8);
+ }else{
+ if((temprange[0].min||temp>task->range[0].max)||
+ (temp2range[1].min||temp2>task->range[1].max))
+ {
+ // 芯片异常
+ elec_add_errcode(e,5);
+ }
+ }
+}
+
+
+
+
+
+
+
+
+const static elec_judge_fun g_jq_judge_table[]={
+elec_power_on, //0 电源准备
+elec_charge, //1 上电充能
+elec_task_judge, //2 设置总线电压
+elec_current, //3 获取总线电流
+elec_task_judge, //4 扫描UID
+elec_task_judge, //5 密码验证
+elec_task_judge, //6 读取芯片代码
+elec_task_judge, //7 OTP检测
+elec_task_judge, //8 工厂测试检测
+elec_task_judge, //9 读取状态
+elec_task_judge, //10 写工厂信息
+elec_task_judge, //11 充能统计
+elec_task_judge, //12 充电电压检测
+elec_task_judge, //13 延时等待
+elec_task_judge, //14 设置延时
+elec_task_judge, //15 读取延时
+elec_task_judge, //16 时钟校准
+elec_task_judge, //17 放电
+elec_task_judge, //18 复位
+elec_task_judge, //19 起爆使能
+elec_task_judge, //20 起爆充能
+elec_task_judge, //21 使能通讯末电流采集
+elec_task_judge, //22 获取通讯末电流
+elec_task_judge, //23 写OTP
+elec_task_judge, //24 读OTP
+elec_task_judge, //25 清除起爆计数
+elec_task_judge, //26 关总线
+elec_task_judge, //27 将缓存区数据写入OTP
+elec_task_judge, //28 三码写入错误
+elec_task_judge, //29 三码验证错误
+elec_task_judge, //30 测量电容压差
+elec_task_judge, //31 测量桥丝阻值
+elec_task_judge, //32 使能OTP写
+elec_task_judge, //33 写模块版本
+elec_task_judge, //34 读取版本号
+elec_task_judge, //35 写缓存数据
+elec_task_judge, //36 验证缓存数据
+0,
+};
+
+
+const static elec_judge_fun g_xt_judge_table[]={
+elec_power_on, //0 电源准备
+elec_charge, //1 上电充能
+elec_task_judge, //2 设置总线电压
+elec_current, //3 获取总线电流
+elec_task_judge, //4 扫描UID
+elec_task_judge, //5 写配置参数
+elec_task_judge, //6 验证配置
+elec_task_judge, //7 模拟注码
+elec_task_judge, //8 充能统计
+elec_task_judge, //9 写现场值 网络id 延时
+elec_task_judge, //10比对现场值
+elec_task_judge, //11 桥丝通断检测
+elec_task_judge, //12 电容容量统计
+elec_task_judge, //13 延时等待
+elec_task_judge, //14 写管壳号/工厂信息
+elec_task_judge, //15 写UID
+elec_task_judge, //16 写密码
+elec_task_judge, //17 写入/检测备份区标志
+elec_task_judge, //18 读取备份区数据
+elec_task_judge, //19 校准
+elec_task_judge, //20 使能通讯末电流采集
+elec_task_judge, //21 获取通讯末电流
+elec_task_judge, //22 放电
+elec_task_judge, //23 在线检测
+elec_task_judge, //24 状态检测
+elec_task_judge, //25 起爆
+elec_task_judge, //26 复位
+elec_task_judge, //27 关总线
+elec_task_judge, //28 芯片锁存
+elec_task_judge, //29 使能赋码设备
+elec_task_judge, //30 在线检测
+elec_task_judge, //31 密码验证
+elec_task_judge, //32 加载芯片配置
+elec_task_judge, //33 电容压差测试
+elec_task_judge, //34 桥丝电阻测试
+elec_task_judge, //35 检测过程中注码
+elec_task_judge, //36 验证注码
+elec_task_judge, //37 模块在线检测
+elec_task_judge, //38 验证管壳码
+0,
+};
+
+
+
+const static elec_judge_fun g_ew_judge_table[]={
+elec_power_on, //0 电源准备
+elec_charge, //1 上电充能
+elec_task_judge, //2 设置总线电压
+elec_current, //3 获取总线电流
+elec_task_judge, //4 扫描UID
+elec_task_judge, //5 写配置参数
+elec_task_judge, //6 验证配置
+elec_task_judge, //7 模拟注码
+elec_task_judge, //8 充能统计
+elec_task_judge, //9 写现场值 网络id 延时
+elec_task_judge, //10比对现场值
+elec_task_judge, //11 桥丝通断检测
+elec_task_judge, //12 电容容量统计
+elec_task_judge, //13 延时等待
+elec_task_judge, //14 写管壳号/工厂信息
+elec_task_judge, //15 写UID
+elec_task_judge, //16 写密码
+elec_task_judge, //17 写入/检测备份区标志
+elec_task_judge, //18 读取备份区数据
+elec_task_judge, //19 校准
+elec_task_judge, //20 使能通讯末电流采集
+elec_task_judge, //21 获取通讯末电流
+elec_task_judge, //22 放电
+elec_task_judge, //23 在线检测
+elec_task_judge, //24 状态检测
+elec_task_judge, //25 起爆
+elec_task_judge, //26 复位
+elec_task_judge, //27 关总线
+elec_task_judge, //28 芯片锁存
+elec_task_judge, //29 使能赋码设备
+elec_task_judge, //30 在线检测
+elec_task_judge, //31 密码验证
+elec_task_judge, //32 加载芯片配置
+elec_task_judge, //33 电容压差测试
+elec_task_judge, //34 桥丝电阻测试
+elec_task_judge, //35 检测过程中注码
+elec_task_judge, //36 验证注码
+elec_task_judge, //37 模块在线检测
+elec_task_judge, //38 升级
+0,
+};
+
+
+static const elec_judge_fun *g_judge_fun_table[]={g_jq_judge_table,g_xt_judge_table,g_ew_judge_table};
+
+static int elec_calc_judge_fun_num(const elec_judge_fun *table)
+{
+ int i=0;
+ while(table[i]){
+ i++;
+ }
+ return i;
+}
+
+
+// 根据方案获取模块芯片类型
+int elec_extract_chip(int id)
+{
+ const scheme_def *s=check_scheme();
+ if(id==0) id=s->plan_id;
+ // 日bit0~bit4 月bit5~bit8 年bit9~bit15
+ int sid=(id>>0)&0x7f;
+ int modele=(id>>7)&0x1f;
+ int chip=(id>>12)&0xf;
+ int day=(id>>16)&0x1f;
+ int month=(id>>21)&0xf;
+ int year=((id>>25)&0x7f)+2022;
+ return chip;
+}
+
+
+
+// 根据子错误找到主错误
+int elec_err_classify(int err)
+{
+ const scheme_def *s=check_scheme();
+ const marerr_def *marerr;
+ if(err<=20){
+ return err;
+ }
+ for(int i=0;imarerr_num;i++){
+ marerr=&s->marerr[i];
+ for(int j=0;jsuberr_num;j++){
+ if(marerr->suberr[j]==err)
+ return marerr->err;
+ }
+ }
+ return err;
+}
+
+// 根据优先级报错
+int elec_report_err(elec_judge_def *e)
+{
+ static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,0};
+ uint8_t err=0;
+ for (int i=0;ierr_list[j]==pro_table[i])
+ return pro_table[i];
+ if((err==0)&&(e->err_list[j]!=0)){
+ err=e->err_list[j];
+ }
+ }
+ }
+ return err;
+}
+
+
+
+// 异常判断
+// task_num,要判断的任务数
+void elec_judge(elec_judge_def *e,int task_num,uint8_t *exe_flag,uint8_t *data)
+{
+ const scheme_task_def *task;
+ memset(e,0,sizeof(elec_judge_def));
+ e->scheme=check_scheme();
+ e->judge_fun_table=g_judge_fun_table[elec_extract_chip(e->scheme->plan_id)];
+ e->judge_fun_num=elec_calc_judge_fun_num(e->judge_fun_table);
+ e->short_circuited=1500;
+ e->open_circuited=80;
+ e->exe_flag=exe_flag;
+ if(task_num>e->scheme->task_num)
+ task_num=e->scheme->task_num;
+ for(int i=0;ischeme->task[i];
+ if(task->taskidjudge_fun_num){
+ e->judge_fun_table[i](e,i,data);
+ }else{
+ elec_add_errcode(e,6);
+ }
+ data+=task->item_num*2;
+ }
+ DBG_LOG("err_table:%02x %02x %02x %02x %02x %02x %02x %02x",
+ e->err_list[0],e->err_list[1],e->err_list[2],e->err_list[3],e->err_list[4],
+ e->err_list[5],e->err_list[6],e->err_list[7],e->err_list[8],e->err_list[9]
+ );
+ for(int i=0;ierr_list[i]=elec_err_classify(e->err_list[i]);
+ }
+ DBG_LOG("err_table2:%02x %02x %02x %02x %02x %02x %02x %02x",
+ e->err_list[0],e->err_list[1],e->err_list[2],e->err_list[3],e->err_list[4],
+ e->err_list[5],e->err_list[6],e->err_list[7],e->err_list[8],e->err_list[9]
+ );
+ DBG_LOG("err report=%d",elec_report_err(e));
+}
+
+
+
diff --git a/source/elec_det/elec_judge.h b/source/elec_det/elec_judge.h
new file mode 100644
index 0000000..e3b0d8c
--- /dev/null
+++ b/source/elec_det/elec_judge.h
@@ -0,0 +1,41 @@
+
+#ifndef elec_judge_h__
+#define elec_judge_h__
+
+#include "dev_flash.h"
+
+
+// 定义错误列表长度
+#define ERR_LIST_LEN 10
+
+
+
+struct _elec_judge_def;
+typedef void (*elec_judge_fun)(struct _elec_judge_def *e,int index,uint8_t *data);
+
+typedef struct _elec_judge_def{
+ const scheme_def *scheme;
+ uint8_t judge_fun_num;
+ uint8_t judge_flag[8];
+ uint8_t *exe_flag;
+ uint8_t err_list[ERR_LIST_LEN];
+ uint16_t short_circuited;
+ uint16_t open_circuited;
+ const elec_judge_fun *judge_fun_table;
+}elec_judge_def;
+
+
+
+
+void elec_judge(elec_judge_def *e,int task_num,uint8_t *exe_flag,uint8_t *data);
+
+
+
+
+#endif
+
+
+
+
+
+
diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h
index e017d40..4ce92d4 100644
--- a/source/main/compiler_info.h
+++ b/source/main/compiler_info.h
@@ -6,7 +6,7 @@
-#define BUILD_DATE "2023-10-27 18:16:13"
+#define BUILD_DATE "2023-10-30 18:23:29"
#define SOFT_VERSION "2.03"
diff --git a/source/mycopy.py b/source/mycopy.py
index 90a78e6..c7fafed 100644
--- a/source/mycopy.py
+++ b/source/mycopy.py
@@ -97,6 +97,12 @@ def arr_byte_copy(byte:int,num:int):
# int转数组
def arr_from_int(num:int):
return bytearray([num&0xff,(num>>8)&0xff,(num>>16)&0xff,(num>>24)&0xff])
+# uchar转数组
+def arr_from_uchar(num:int):
+ return bytearray([num&0xff])
+# u16转数组
+def arr_from_u16(num:int):
+ return bytearray([num&0xff,(num>>8)&0xff])
# 字符串转数组,不足填充0
def arr_from_str(txt:str,num:int):
t=bytearray(txt.encode(encoding="utf-8"))
diff --git a/source/soft/debug.c b/source/soft/debug.c
index 311b1ed..6dca1fe 100644
--- a/source/soft/debug.c
+++ b/source/soft/debug.c
@@ -10,7 +10,7 @@
#endif
-#if 1
+#if 0
#define DBG_DEV_INIT() rtt()->init()