From 41c1e97ba54868aa19ccd8b5f6a61d125aec1a19 Mon Sep 17 00:00:00 2001 From: ranchuan Date: Mon, 3 Jul 2023 18:27:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- checker_gen1.uvoptx | 53 ++- python/checker_test.py | 3 +- .../file/EX三码绑定测试2023-07-3.json | 407 ++++++++++++++++++ source/ReadMe.txt | 3 + source/main/compiler_info.h | 4 +- source/prebuild.py | 9 +- source/soft/mystdlib.c | 5 + source/task/tran_for_coder2.c | 18 +- source/task/transmit.c | 3 + 9 files changed, 489 insertions(+), 16 deletions(-) create mode 100644 python/file/EX三码绑定测试2023-07-3.json diff --git a/checker_gen1.uvoptx b/checker_gen1.uvoptx index 2d73e36..18269cd 100644 --- a/checker_gen1.uvoptx +++ b/checker_gen1.uvoptx @@ -120,7 +120,7 @@ 0 DLGUARM - d + 4 0 @@ -153,12 +153,36 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - + + + 0 + 0 + 99 + 1 +
134399730
+ 0 + 0 + 0 + 0 + 0 + 1 + .\source\rt_thread\board.c + + \\checker_gen1_app\source/rt_thread/board.c\99 +
+
+ + + 0 + 1 + g_tempptr + + 1 - 0 - errbit + 8 + file 0 @@ -370,7 +394,24 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - + + + 0 + 0 + 99 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + .\source\rt_thread\board.c + + +
+
0 @@ -1428,7 +1469,7 @@ lwip - 1 + 0 0 0 0 diff --git a/python/checker_test.py b/python/checker_test.py index c6ed527..45d28b2 100644 --- a/python/checker_test.py +++ b/python/checker_test.py @@ -173,5 +173,6 @@ class port: if __name__ == "__main__": p=port() # 批检仪测试 - p.open("com5",115200) + # p.open("com5",115200) + p.open("utcp",115200) p.checker_test(5) diff --git a/python/file/EX三码绑定测试2023-07-3.json b/python/file/EX三码绑定测试2023-07-3.json new file mode 100644 index 0000000..b952ae0 --- /dev/null +++ b/python/file/EX三码绑定测试2023-07-3.json @@ -0,0 +1,407 @@ +{ + "PlanID": 48435330, + "PlanBrief": "模拟工厂注码", + "CheckSoftVersion": [ + 1 + ], + "CheckHardVersion": [ + 1 + ], + "TimeOutS": 4, + "TimeOutM": 10, + "TimeOutUI": 12, + "TaskIDMax": 26, + "TaskArray": [ + { + "TaskID": 0, + "TaskBrief": "电源准备", + "TaskIndex": 0, + "ParamCount": 1, + "ParamInfo": [ + "预设电压1" + ], + "ParamVal": [ + 88 + ], + "TestStandard": [], + "ReturnCount": 0, + "ReturnInfo": [], + "ErrJumpTo": 255, + "ExecuteErrCode": 254, + "ResultErrCode": [], + "RetryCount": 0 + }, + { + "TaskID": 1, + "TaskBrief": "上电充能", + "TaskIndex": 1, + "ParamCount": 3, + "ParamInfo": [ + "总线电压", + "采样超时0.1ms", + "计时启停ADC" + ], + "ParamVal": [ + 88, + 5000, + 400 + ], + "TestStandard": [ + { + "Max": 95, + "Min": 80 + }, + { + "Max": 800, + "Min": 100 + } + ], + "ReturnCount": 2, + "ReturnInfo": [ + "总线电压", + "大于启停的时间" + ], + "ErrJumpTo": 255, + "ExecuteErrCode": 254, + "ResultErrCode": [ + 23, + 22 + ], + "RetryCount": 0 + }, + { + "TaskID": 5, + "TaskBrief": "写配置参数(正式删除)", + "TaskIndex": 2, + "ParamCount": 4, + "ParamInfo": [ + "UID长度", + "密码长度", + "电流挡位", + "版本号" + ], + "ParamVal": [ + 8, + 4, + 0, + 1 + ], + "TestStandard": [], + "ReturnCount": 0, + "ReturnInfo": [], + "ErrJumpTo": 13, + "ExecuteErrCode": 28, + "ResultErrCode": [], + "RetryCount": 1 + }, + { + "TaskID": 32, + "TaskBrief": "加载配置", + "TaskIndex": 3, + "ParamCount": 0, + "ParamInfo": [], + "ParamVal": [], + "TestStandard": [ + { + "Max": 8, + "Min": 8 + }, + { + "Max": 4, + "Min": 4 + }, + { + "Max": 1, + "Min": 1 + } + ], + "ReturnCount": 3, + "ReturnInfo": [ + "UID长度", + "密码长度", + "版本号" + ], + "ErrJumpTo": 255, + "ExecuteErrCode": 29, + "ResultErrCode": [ + 29, + 29, + 29, + 255 + ], + "RetryCount": 0 + }, + { + "TaskID": 4, + "TaskBrief": "扫描UID", + "TaskIndex": 4, + "ParamCount": 2, + "ParamInfo": [ + "UID长度", + "使1/失0UID对比" + ], + "ParamVal": [ + 8, + 0 + ], + "TestStandard": [], + "ReturnCount": 0, + "ReturnInfo": [], + "ErrJumpTo": 255, + "ExecuteErrCode": 24, + "ResultErrCode": [], + "RetryCount": 0 + }, + { + "TaskID": 11, + "TaskBrief": "桥丝检测", + "TaskIndex": 5, + "ParamCount": 0, + "ParamInfo": [], + "ParamVal": [], + "TestStandard": [ + { + "Max": 240, + "Min": 0 + } + ], + "ReturnCount": 1, + "ReturnInfo": [ + "桥丝ADC" + ], + "ErrJumpTo": 255, + "ExecuteErrCode": 30, + "ResultErrCode": [ + 30 + ], + "RetryCount": 0 + }, + { + "TaskID": 8, + "TaskBrief": "充能统计", + "TaskIndex": 6, + "ParamCount": 5, + "ParamInfo": [ + "充电挡位", + "统计超时", + "电流判线AD", + "充电结束值0.1uA", + "充电超时0.1S" + ], + "ParamVal": [ + 34, + 5000, + 100, + 600, + 5 + ], + "TestStandard": [ + { + "Max": 4000, + "Min": 1000 + }, + { + "Max": 600, + "Min": 200 + }, + { + "Max": 100, + "Min": 10 + } + ], + "ReturnCount": 3, + "ReturnInfo": [ + "充能值0.1ms", + "充末电流0.1uA", + "最大充电电流0.1mA" + ], + "ErrJumpTo": 255, + "ExecuteErrCode": 254, + "ResultErrCode": [ + 34, + 35, + 32, + 255 + ], + "RetryCount": 0 + }, + { + "TaskID": 24, + "TaskBrief": "状态码检测", + "TaskIndex": 7, + "ParamCount": 2, + "ParamInfo": [ + "比较掩码", + "比较位" + ], + "ParamVal": [ + 130, + 0 + ], + "TestStandard": [ + { + "Max": 255, + "Min": 0 + } + ], + "ReturnCount": 1, + "ReturnInfo": [ + "状态值" + ], + "ErrJumpTo": 15, + "ExecuteErrCode": 46, + "ResultErrCode": [ + 46 + ], + "RetryCount": 0 + }, + { + "TaskID": 26, + "TaskBrief": "复位", + "TaskIndex": 8, + "ParamCount": 0, + "ParamInfo": [], + "ParamVal": [], + "TestStandard": [], + "ReturnCount": 0, + "ReturnInfo": [], + "ErrJumpTo": 255, + "ExecuteErrCode": 254, + "ResultErrCode": [], + "RetryCount": 0 + }, + { + "TaskID": 9, + "TaskBrief": "设置现场值", + "TaskIndex": 9, + "ParamCount": 3, + "ParamInfo": [ + "编号", + "延时", + "孔号" + ], + "ParamVal": [ + 20, + 100, + 20 + ], + "TestStandard": [], + "ReturnCount": 0, + "ReturnInfo": [], + "ErrJumpTo": 255, + "ExecuteErrCode": 254, + "ResultErrCode": [], + "RetryCount": 0 + }, + { + "TaskID": 19, + "TaskBrief": "时钟校准", + "TaskIndex": 10, + "ParamCount": 3, + "ParamInfo": [ + " 1快速0全", + "校准周期", + "校准时长" + ], + "ParamVal": [ + 0, + 1000, + 110 + ], + "TestStandard": [], + "ReturnCount": 0, + "ReturnInfo": [], + "ErrJumpTo": 255, + "ExecuteErrCode": 254, + "ResultErrCode": [], + "RetryCount": 0 + }, + { + "TaskID": 24, + "TaskBrief": "状态码检测", + "TaskIndex": 11, + "ParamCount": 2, + "ParamInfo": [ + "比较掩码", + "比较位" + ], + "ParamVal": [ + 10, + 10 + ], + "TestStandard": [ + { + "Max": 255, + "Min": 0 + } + ], + "ReturnCount": 1, + "ReturnInfo": [ + "状态值" + ], + "ErrJumpTo": 255, + "ExecuteErrCode": 46, + "ResultErrCode": [ + 255 + ], + "RetryCount": 0 + }, + { + "TaskID": 10, + "TaskBrief": "比对现场值", + "TaskIndex": 12, + "ParamCount": 4, + "ParamInfo": [ + "编号", + "延时", + "孔号", + "1使/0失反馈采集" + ], + "ParamVal": [ + 20, + 100, + 20, + 1 + ], + "TestStandard": [ + { + "Max": 170, + "Min": 80 + }, + { + "Max": 400, + "Min": 150 + } + ], + "ReturnCount": 2, + "ReturnInfo": [ + "最大反馈电流", + "最大反馈时间" + ], + "ErrJumpTo": 255, + "ExecuteErrCode": 255, + "ResultErrCode": [ + 43, + 44, + 255, + 255 + ], + "RetryCount": 0 + }, + { + "TaskID": 27, + "TaskBrief": "关总线", + "TaskIndex": 13, + "ParamCount": 0, + "ParamInfo": [], + "ParamVal": [], + "TestStandard": [], + "ReturnCount": 0, + "ReturnInfo": [], + "ErrJumpTo": 255, + "ExecuteErrCode": 254, + "ResultErrCode": [], + "RetryCount": 0 + } + ] +} \ No newline at end of file diff --git a/source/ReadMe.txt b/source/ReadMe.txt index 191a7bc..e37a5cd 100644 --- a/source/ReadMe.txt +++ b/source/ReadMe.txt @@ -129,4 +129,7 @@ 解决不插网线会导致程序重启的bug 2023.6.28 要实现重复注相同码不报错的功能,重复检测不报错,要使用两套方案 +2023.7.3 + 检测错误码 + 解决tcp下升级方案死机的问题,原因是内存没有回收导致的内存不足 \ No newline at end of file diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index d731545..a160232 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,8 +6,8 @@ -#define BUILD_DATE "2023-06-28 18:04:06" -#define SOFT_VERSION "0.01" +#define BUILD_DATE "2023-07-03 18:20:09" +#define SOFT_VERSION "0.10" diff --git a/source/prebuild.py b/source/prebuild.py index ba5f379..006dd11 100644 --- a/source/prebuild.py +++ b/source/prebuild.py @@ -4,6 +4,13 @@ import datetime from datetime import datetime, timedelta + + +# 定义软件版本号 +SOFT_VERION = "0.10" + + + # 定义mod文件的名称和路径 MOD_FILE="mod_signals.c" MOD_PATH="./source/task/" @@ -126,7 +133,7 @@ def creat_compile_info(dst:str): f.write("#ifndef compiler_info__\n") f.write("#define compiler_info__\n\n\n\n\n\n\n") f.write("#define BUILD_DATE \""+utc_time+"\"\n") - f.write("#define SOFT_VERSION \"0.01\"\n") + f.write("#define SOFT_VERSION \""+SOFT_VERION+"\"\n") f.write("\n\n\n\n\n\n\n#endif\n") diff --git a/source/soft/mystdlib.c b/source/soft/mystdlib.c index 4e77273..67d5035 100644 --- a/source/soft/mystdlib.c +++ b/source/soft/mystdlib.c @@ -144,12 +144,17 @@ void *malloc(uint32_t size) { mallco_dev *self=&g_self; uint32_t offset; + int used=0; void *ret_addr=NULL; offset=mem_malloc(size); if (offset!=0XFFFFFFFF) { ret_addr=(void*)((uint32_t)self->membase+offset); } + else{ + used=mem_perused(); + param_check(used); + } return ret_addr; } diff --git a/source/task/tran_for_coder2.c b/source/task/tran_for_coder2.c index a14edd5..8dcd71c 100644 --- a/source/task/tran_for_coder2.c +++ b/source/task/tran_for_coder2.c @@ -319,13 +319,19 @@ static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_s uint32_t errcode=0; uint8_t *ack_d=&w->ack[(addr)*6]; ack_d[0]=addr+slave_addr_off(); - ack_d[1]=ack; + if(ack==-1) ack_d[1]=208; // 208表示通信超时 + else ack_d[1]=ack==0?0:209;// 209表示小板返回了命令失败 // TODO: 还有4字节数据 - errcode=in_range_err(arr_data(data)+8+8,arr_data(data)); - ack_d[2]=errcode&0xff; - ack_d[3]=(errcode>>8)&0xff; - ack_d[4]=(errcode>>16)&0xff; - ack_d[5]=(errcode>>24)&0xff; + if(data) + { + errcode=in_range_err(arr_data(data)+8+8,arr_data(data)); + ack_d[2]=errcode&0xff; + ack_d[3]=(errcode>>8)&0xff; + ack_d[4]=(errcode>>16)&0xff; + ack_d[5]=(errcode>>24)&0xff; + if(ack_d[1]==0) ack_d[1]=ack_d[2]; + }else{ + } w->ack_num++; if(w->ack_num>=10) diff --git a/source/task/transmit.c b/source/task/transmit.c index 419208c..4e9e191 100644 --- a/source/task/transmit.c +++ b/source/task/transmit.c @@ -371,6 +371,9 @@ static void when_scheme_done(ucport_def *u) DBG_WARN("can not fond variable \"tran\""); return; } + DBG_LOG("memused:%d",mem_perused()); + rt_thread_mdelay(100); + DBG_LOG("memused:%d",mem_perused()); for(int i=0;i Date: Tue, 4 Jul 2023 18:48:14 +0800 Subject: [PATCH 2/2] =?UTF-8?q?checker=5Fsave.py=20=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E6=96=B9=E6=A1=88=E6=9D=A5=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=95=B0=E6=8D=AE=EF=BC=8C=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E8=B0=83=E7=94=A8lua=E8=84=9A=E6=9C=AC=E6=9D=A5=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=20=E6=B7=BB=E5=8A=A0xt=E8=B5=8B=E7=A0=81=E4=BB=AA?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E8=84=9A=E6=9C=AC=EF=BC=8C=E8=BF=98=E6=9C=89?= =?UTF-8?q?=E7=82=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/checker_save.py | 90 ++-- python/checker_test.py | 11 +- python/file/EX_Coder_Test_2023-07-4.json | 407 ++++++++++++++++ python/file/Ym_Coder.bin | Bin 36356 -> 38376 bytes python/file/judge-xt.lua | 560 +++++++++++++++++++++++ python/prottcp.py | 6 +- source/main/compiler_info.h | 2 +- source/soft/bytearray.c | 2 +- 8 files changed, 1039 insertions(+), 39 deletions(-) create mode 100644 python/file/EX_Coder_Test_2023-07-4.json create mode 100644 python/file/judge-xt.lua diff --git a/python/checker_save.py b/python/checker_save.py index d93f66f..e057a32 100644 --- a/python/checker_save.py +++ b/python/checker_save.py @@ -2,21 +2,69 @@ import lupa from lupa import LuaRuntime import execjs +import json + + + + +def lua_test(lua_file:str,json_file:str,data:bytearray): + # 初始化lua运行环境 + lua = LuaRuntime(unpack_returned_tuples=True) + # 初始化全局变量 json + save_json=lua.eval("function(a) json=a end") + with open("file/json.lua",encoding="utf-8") as f: + save_json(lua.execute(f.read())) + # 初始化全局变量 prints + save_prints=lua.eval("function(a) prints=a end") + with open("file/prints.lua",encoding="utf-8") as f: + save_prints(lua.execute(f.read())) + # 初始化全局变量 cfg_name + lua.execute("cfg_name=\""+json_file+"\"\n") + # 初始化全局变量 check_data + s=data.hex(' ') + # print("输入数据",s) + s=s.replace(" ",",0x") + s="0x"+s + lua.execute("check_data={"+s+"}\n") + # 执行判定脚本 + with open(lua_file,encoding="utf-8") as f: + a,b=lua.execute(f.read()) + print(a,b) + + class save: - def __init__(self) -> None: - pass + def __init__(self,scheme:str) -> None: + self.scheme=scheme + with open(scheme,"rb") as f: + self.json_obj=json.loads(f.read()) + + # 计算返回参数个数 + def calc_retnum(self): + num=0 + for i in self.json_obj["TaskArray"]: + num=num+i["ReturnCount"] + return num + # 计算超限错误字节个数 + def calc_parerrnum(self): + return (self.calc_retnum()+7)//8 + + # 调用这个函数保存数据 def save(self,data:bytearray): d=data[1:] + ret_num=self.calc_retnum()*2+8+self.calc_parerrnum() for i in range(20): - self.save_item(d[i*28:i*28+28]) + self.save_item(d[i*ret_num:i*ret_num+ret_num]) def save_item(self,d:bytearray): + # print("save_item",d.hex(" ")) + errnum=self.calc_parerrnum() s='=\"'+d[0:8].hex()+'\"'+',' - s+='=\"'+self.hex2bit(d[8:10])+'\"'+',' - s+=self.hex2int(d[10:]) - print(d[8:10].hex(' ')) + s+='=\"'+self.hex2bit(d[8:8+errnum])+'\"'+',' + s+=self.hex2int(d[8+errnum:]) + # print(d[8:8+errnum].hex(' ')) print(s) + lua_test("file/judge-xt.lua",self.scheme,d) with open("./file/save.csv","+a") as f: f.write(s+'\n') def hex2int(self,d:bytearray): @@ -40,25 +88,6 @@ class save: -def lua_test(): - # 初始化lua运行环境 - lua = LuaRuntime(unpack_returned_tuples=True) - # 初始化全局变量 json - save_json=lua.eval("function(a) json=a end") - with open("file/json.lua",encoding="utf-8") as f: - save_json(lua.execute(f.read())) - # 初始化全局变量 prints - save_prints=lua.eval("function(a) prints=a end") - with open("file/prints.lua",encoding="utf-8") as f: - save_prints(lua.execute(f.read())) - # 初始化全局变量 cfg_name - lua.execute("cfg_name=\"file/checker_ye_cfg.json\"\n") - # 初始化全局变量 check_data - lua.execute("check_data={0xB5,0x96,0xEC,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x21,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0xB5,0x00,0xB1,0x00,0x6B,0x00,0x00,0x00,0xA5,0x02,0xA4,0x02,0x00,0x00,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}\n") - # 执行判定脚本 - with open("file/judge.lua",encoding="utf-8") as f: - a,b=lua.execute(f.read()) - print(a,b) def js_test(): @@ -71,7 +100,10 @@ def js_test(): if __name__ == "__main__": - sa=save() - print(sa.hex2bit(bytes([0xab,0xcd]))) - # lua_test() - js_test() + # sa=save() + # print(sa.hex2bit(bytes([0xab,0xcd]))) + # js_test() + check_data=bytearray([0xB5,0x96,0xEC,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x21,0x00,0x12,0x01,0x00,0x00,0x00,0x00,0xB5,0x00,0xB1,0x00,0x6B,0x00,0x00,0x00,0xA5,0x02,0xA4,0x02,0x00,0x00,0xA4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]) + lua_test("file/judge-xt.lua","file/EX_Coder_Test_2023-07-4.json".encode("gbk").decode("utf-8"),check_data) + # lua_test("file/judge-xt.lua","file/checker_ye_cfg.json",check_data) + diff --git a/python/checker_test.py b/python/checker_test.py index 45d28b2..42167d2 100644 --- a/python/checker_test.py +++ b/python/checker_test.py @@ -144,13 +144,14 @@ class port: def send(self,cmd:int,data:bytearray): self.cmd=cmd self.cmd_no+=1 - # print("send:",data.hex(",")) - self.ser.write(self.encode(data)) + d=self.encode(data) + # print("send:",d.hex(",")) + self.ser.write(d) # 测试批检仪 - def checker_test(self,times:int): + def checker_test(self,times:int,scheme:str): print("批检仪测试:") tick=0 - save=checker_save.save() + save=checker_save.save(scheme) data=bytearray() while(tickTRR{yv$K!+f6wd&u>YTaHurt*x#!$_ z?z!ijVat=^iQkCRJTsUqR4{4gHB5RRX#>(v>X;P1l}YTs{tK^S((BU_^$XDVuPr;K zO%d;%x?|eNp)+q_QX%RFf17UDF|An4yk*CIwOmGZ$0Gb1n@{);f6i7R zHb?niZ24j|gMV!sIdxZzxtoVsl&50DLz(_9jZ(khW+*?5dKu}CSb9iG)*rH1lzUO% zbeefB%9a?PV|SGvi;I~1PtmcM$BVfuG548hr8##l>SjgweRiL4CGWRaiSI|aZZF2% z`<*Fo2*PguH>pT;NBCK3if}itORX51qWnE9$k~CnwFd+bhJP03Evbuz*Z04jS|;Q- zg?qJHw!1Oq*y|_R5Nm&vBBTpSvCgAu)!r2Sx&f-j5|jga<0;3Qjz;kqlNS#d1A_9h zKIE~EM&s-iF9*(gy>kb^AdldEV3WI1@U_lroy8b$PR|Vv=<=GCYnnT}#hbchA5+T1 zDLyJyEgVvn=4Wk!C!@b)bXs4E@@81@*biHjCnL){sOKMILP$i9-V@3u#zF!%hb#o7 z*4A04k!RgI_6lylXi@g)g1ZCh^GK~A-Lps~pGCPv2VHF->@_-9((|)l)p|ANSO{`< zgctY?^*dgWQ8BFpOg7Y#cuJX2%G@(i|3WOKOf0p#8ZRwA7cV;;S~47vY7jT`AOvqo?i zBY%5TaJ!Jc5~I>xJd#m1FFz)@b5J@N$;Mx7oP$Gw)b1##HPkb4COZRCvlBb=*TM?fuI!Bqa$Z2L zlbVO2?nxm#|lyH$IiwRM{C@ZWKsDfZb{Cz!e9pv znu}-?ncR*o$lBeFtys`#%rqKMcbYS;i~rnFn$dLn;kC?N=1)=fMEGb&u{A}xI>P5U z#s}+wTdIkdAlprh>?TIJz%oCcm~~~mwRdoa3>%Y)bSFTUl5P-ux1nAH=A?y$-L()E z!vlf)yiVao5*y8~ce-rVr;g;9G?DjVulI@A`zfJb&B|D3TBvuDW=F=33W&Q-F$BVQ zvV*knhBk&x`exh;5{z-Q;BeTrl3vD$884*rHyvYxghy64tN26Hi#}HVtnXJoCchQf z1pXN6{`f(E`+aZyU>TpgPpFpqEulC3Z-6rCNMA#m5_%oyOjaDsQF{PefF^wfHE;dE z9L$q;ObY$p&stKHhvO;AbCDI0A`i#T3>fOtXY!*!aD>1r9t{=X@I8#$7xdwptuq&;9oPgZ z$}{No5PH?JP1+dz>R3nX2%jHY?DLr2_tCzB(mLOEj1w=@c__QGFh!}?@5Wp;d)dJa zfz+1y+6dM@%Y*(;are-lI@V&8y=O?s?W1GAKgNGIbi8nse>v1$ouc%FrSUTZsdZ9; zR5~M&qU=L?QedA}BXP!_$NGYcU4lN&IlJ(WEtvE`=D&pKcme@MKz^0|6rQo;P&gB0f{WpG3 zOHAIA#$*zGbPVge^Jw#U-`#j|k0nHGD2%QsX4T<-N67AGI1+mx%eg5z zf?}xsVb*Cy)2%W3yE`)eV zA*4t~JtT@Layu-d@)jf%fqMg~ zBwH>p`a%=jA^>)WO&LcRLC(zpc89X~J$XN$xgSDM0$ML4bs+r>m4V(1NJ}xzm63Lt z5ODkmfg-fLrPJNuMD8JeOMiv3Z(?z=dU{(nw!oVtxTC>!msSl zHQ@_vC`ONOPqbB=ZQ1>MU93~iV2?@3dKvYSIbR&}*)YN$vYspBipKnHy?k+Dc`7$7 zK1;|@AL3gJ-7Smbtjy_?cBMf$#E}`Gy+lypD`5?}-T%}S$ zT-+@xwm7eMl}>v)Cb^w{QTaM1y7Q5?MTJt)Jq$VA|E1Z!9OO1*GiM{cCd%AHkbZ@7 zCeoEr{;10}^rpD5TTt5Lse6^)g;tzi>;6BvJ{81kBmC*&Qv1A!>~r+;4aKr}afF{h zQXS!GCD%-vn$G0bZfH;IScT}$@W<6#aK_S*7DRrh(oqx9 z+I?wAbuGo0iqsRf`y`}~gNq&?uIXo>A>1Xe3Nm*gBtoT-zpnskl_2#1@mb7m3+4H} zOIVLRBg=?`w!?#SJzjSM8oOq^ugcio?lWn4ZMyu#%${$fX z5p^}+L}#`8GJLFZpO00s3Z}fN<;pf?2AKU5jDA_i1lSn=jzg=_7vd`0t3Ams$L(-$ zhu0~$Zw@iJDR71bGtf*-89=+|$Q>7qwKRhvW_#1BLo9QYbCd z{|mG@Lq5#$OLGpNyTF{|DL%9GqTugvLei3$rI>Rhv=gQjX?`#=y4?k0L~&6J>L(iV zN$M&;K%6@h1OzEq{1DDfPt?(icEzocCeA$R$I@_p+#8Ln_i0uiL`%n(M&X#%Z*8~A zLNyK#aUlypGE6`Mu}ygofG;x3CL5K5DEoO$SxL4PwRZd@{L-igUs_f$Z9JCIkX*(z za~T(#1bzersE!)yGLy((X@+`LtRAW(lgFPUXkL{6zO3t_KSTtX^vkBxFSpv1*CR|; z@%$KE^-xSjR4`YMJfT4-5GrYWS9ysrjlYe*Rs4AQWN}S|yDIX920o#pBsd#g1_|~n z&Cxp*<<@Q+b`~p7gLeI8G>tGim>x<&>1fpMO96vqEw|YU;nVEe()HWMlSf*6=_SN4 zme7D2TF&HBu%B3*3uNWw>Wj>Exy;qul&C&03o6MWW1h+NxOx#kUQu<0O;Ml%rJW6hpjH!D(`migh68k7Hyxw^>FQQrmd{eP*C#=(^7`ybmd3BCET3jq-q72M z-|J#yP8?I}nO$>}AZW5tI)9`}25LDvf30dn{j5!p4a0oJkc%wMP;ZQ} z8p|=#A(=8wOGt*FM-26&cy5SQ9q^@v+UzM=c*5{1Pub<2v3sCMK-ekJ z1A&A?;t1k+DB}QQLTnyM)a`>?agcUQo|S~KJIr@_h;9#s`5PXh+x>t!F-f;^=r!&F zx@|@qJz;3kcOpM3x#$t*qDNdnw_CzQx3Y6|YlezCg6Osw!wQlh<{+P!1d(fY&AEVX z)5H9Z5k$99VgC4t>L3V+{uN2oO3me#n#d74x)xJ^6C-Vk$%W^3r>-$MKPmArQ*)j< zn)?3({Wc|3t?iuv;;Y|NNP?s$CB{=bG0U!s%l*QZP)5Dr^nelhZE@4{FMB^+_Fab`wqO=r+{<==1_* za$IeM&|{41rS4R`7z$WS-Dco1muw$<0gSuMB|zVvII1}FZ`jJL^9ElUj{cW?`KU{S z|JD-I3A^L!1bqV(bMp)~ZQVPWwEuRjuXC?f)VxYJcn|&5Hy)gylb!~-vZ{(!nElM-f_AW8lX*Vy+ zt0Ffz((rbvLrZmZTDM2Df}S?h643(1EB3 zXVU5)jjLO zZ}N$y`EDY9U&Q7UYgnI9PWLfL31b(P2&9aS=hW(x9414F9nU$txhd^X)~*6~6Z;?q zGY!r`^98$E7VZux3=q9E%~Slbnj&jV9WeN7H6v|zV%7}aJ9_xfM_1P@7(}5m^Q368 zz|=$|{HV1MVyLxQ?4?e#_F{hJ=w(7C?-^Z{wgBdj8z8;0-fu^j3SaWfF*U(jlSCdc z+-+#*Nc3Jj7u$jC9Jt6JR;wXJ9A^2bx}mij;GK03bu< zlL8^B#D-vek)sRenG`PU+~`YM8sL=}?OiWnBawPJ#v$&Gsd2+de!7GHmq;)c{|W*cbxvddQ%SQIDx$4LJCLyIM&g@4hIq(!uoB;HzfaY*8KSbhiQVjOKFy+SL?MT+35BOts6>=f!pVe&D!eR6d z2^BOSG5u&P0f&E4S3A?IkEa8~m`6NDW{)kJXs$3rhaq`1p)9y-pzT3bj-3~T5DaH_ zgV2msp{4_ zMy=DCjJKw_2Np&7lyT1B)F@N7$4G}x5U>TyxZbq!5n*zZ3p%geI=bzqSa5^Khfb+w$vz)O|241(hT#@pRNWje_RrclGf2Q){&tt} z9g`Y;BYgFcRF~>j-*1y+bCY9Vj(#+7lW(MNvbk^OYQzNLaFD>Waw${~+v6#?&Aj%HzF}GAdUQzT28eHvkthT`@#@;Sye|Mu)!;VQ6 z&ZeSCQ-G8gNC_rVk_l}Psg(|_I=Y?kYB2G#@H68k%x%OZhs{Z}ZfL=pP>xU-6c5(%~rz`tXlDD}fx2WnUVeRoywhu+-W&vrrRskiVdWK}k$6C} zrPh;@P^1X}GMGyMawh>zj{I?;1U&`n$%=49H#OS&C=cCThjn;5Z5wO#-;PM7!vZZn ztFpkbmgWR9>%`qwlhiz> z$JMKiQ5Q&~xcW>mM&c;0Rv9EgZHMWM2_XG@I&9qKDWP{xT7(jqAcPmCMTvEtIZ}u% z^R_{fl;mh!-Gn>lDbRtzD(30QNkVvDKQ_S1)8SCatY=H#Ihi5|d*&}Wf3T$LlUQJ- zRBh`cO^qgfP`8F?t;GB7SZl9&u`>DHH2%8@&Q#b@-~eE3B=4W#9v@e~!i8#69t_{% zBFx@s{QgLNp~v}F7d=mBf&i>rDis43kmqV0ei?Q&bARQ;(L(CGJmX37eD!X?{%FOEhK~WCUeiKMYdz z*bpn*0Mr$xXO~r3qcP=ssJ19IGbKA&y9%{m;<8$So+-(?C0cHc@QJTl{5bKl_VCH| zIgRf{QXr(#{ZVyGg!Ba&!mc;cjz_Q1;zfQI+HHZT>W#n%*vu+xeV>C`+h=%z4P%eY zm|^8VtDl0k=V^jG!o1}@=Kap(o$Yc*RNWA{$5#Ph^8m~q+2kuj-jDoly&ZqoMz(f& zKoG8tl`YCQ26s%JE52>;=E*K6O)&$%4S1br!QnwqTiWOGD1T(~ed0fJdFhnOtgB)o zj29jsam;V!S4=6MHX4Hx&$4vbJYeHe=4iC87xWZ!UG>P<;a;S5)j(s2s?R{@S2j(> zxOyw^n$n)usHK^5-)Zov7ZuB1^csN^5LIJgdXd}q)?zy9kEf0oWA3`hnU;+)!tSX0 zO`Jb{(X+v7v?ipVy}I<{zn`!w7AbS+aMuW*2(EkZBkquI#y>0}aRN_~XEB#JExn>@&;bn%91 zMJoDvnbCQ zR`~WU%07c%>unKN8~iU`Pww?3!hkugh%mP(a}6#v%=OIB$>d&xJ!6Lfv11nOOW?Uh z8EMKqW@X-a7_!jHH#W?Mou9cwxwzb7?}UDTvb~9d0VJ^IO4O4gwkUQWv@{tEAfkL3 z>M0Gxej8exthb`vfO<+Vj_nLBNY+az!&nI^VyJboUxel+>m4YMKt0l+S`q6A1(FRi z8j8?BX+dm5XhyQ$3k2&>-;A^-)*8A5^{GJgkk!C=Gdcky zAUAQ>WaOsm9$9pMAhOaAzhRCEfr&e<$|#Kt&61C`k%}Q2{^1~CDw6e8s z*}9gsE0?ceP(qpf20Zm4bNT$NUl&wE<`7z~IBK#GYXpY<-cf-fQl(+fkvy0N##cj~5$bRq=7cMQh z^xC)t^EaKV8r(33`ZXTAB&To=_45XC_#5L9^%bbhIQSjs4dRA6)HEwB!!5rA_HI`Y zktqvNSd8Bl_+5qHHTdDSS!VYQ@pYO8$bMW_tb*cf7|fqiv!T8R!Um0mU`WS48`CN( z*TU%uM+trWR=Oj6+yG zHumw{v(56>M$6|>6?)$cR#7pdyYUF*s$eS3*k`zf$p9xRHE}+5PJYg#hN0eKEH>Ri zj8PEJYQA#LxL}5l*nEs$kKF>6lor(gF1ib4frZR6Q?jBXeQ9n_ zi=lqS`nf-dB%)Wa^po4q~zwGj&;C)GQI&i&r zBwv18&6nR6Q@uK+YL!8wWyqi(RF>&N_{6_-D$#r85Jk*Upmf~ z^nOTEQkc|(JkIGY$@xCRxYdETFE*c=H<;jB%n94TM(9XYDLAYPqbr~oxV7P|&9%L& zZOoY?5Ci9?epTny3-Tw!E!jd5LVM5ngVN#V;sqE|2fHYh+2O)aQ=;9mvv|(zp)F(4 zvZ*lx{Q~@_3q}=e)R%@}?y1ZTU33AQlwT@4Y&7QI#UvC0iWll%Tel!eY2&@J9 zV7N2Fw=LQxeya1VE9MOq5#h*W&$-Emhk5H2`MIJpBwQF`a>D0F$6g5YC$Gr2iijTJ z2d?mp5tU=wf0NW^P6*{oPZ-B9AS%!N$?(;p@*2jBF?$K{s*y+;W#UXTbfK;4oS1nI zrLqgejN2SV{hrq7?P{z3RFTs01Zy=;})_8ACxi=b@t7|ME~R zOVUeF{)qt(W59(jDysdzTvTJ>;P{J?@K8n6-)Vy$s)%|PTlhSmV3QwuWodA-P6o5e zY$u{mH^5CbwI`3t?z{jymF>{g5jw?HR0;V#De@46yHyEURCW&uWchWxY|^NdosQAZ z>(=R0d&ojsLltI0#p^}j8a|7sPf#kXuDJ+A0|CKpns?HBx=@M?` zUtQTWu|~5^C&_!iZkx^?C40J+kqLxYAZQ7V>HNm4W&~SdQLu-G z1pFI?J#K(F426SyVD}kmCIB6Vnbd&rsIGpAP!nBUq{FS$nJ^BE0Lj8}5Qwk@V;Urw z!}CpU3d;MYV<6#+NH_(^Kl!9E)bywUUJQow=}E(%pmd>o+6BG?5=T!8iD*e3D%E+O zyr)U$+!!=5k6z_+9>Kfa5-RW;Y7DuWeZ!L2|HR;9udWp0{K~6KvUGJUyeprX1~06C z+tmw&OZbtiYs9bOJZ*`bp{t+69z>)Drzb8cEq#of9e^Zb<-JfSO>U6qq@vzE54^lX z<998YeTl9<5T6Prl2=n#|JT^iOWwT_mN3!B)l6doS}U{1&Q2RkTf|V`4O^!R?pg@u zn7Wo*mR=%U&ZjS37Sz?E_~1%)btSO<8H_LqjPMY}1|We;_V+=hbkO-#k5H&Em^GYc z5|}6d*f4X>p|cY+Ho{0W#Q)ZM);Yv9*!3b{Me=5V8HF%xTHzcMLqf0|eC#Bm(~3Wf z4Th-dstk|Hc|;uDZUC>!rX7pmqgY&Z$LrliKwy(Gcs306`EUZ6w~F!t8B456J8Sop z^;?ylY^O(nz0}cb#vI{X5Q+#y35Vs{{IT%WpZdhloN($qRyZX8RDpE z`(7WAJLg+v_RdD)27Ih;_*l!%`B*KckCko-p|cHJ{!zml#FbNuCmq=i%Mr;eD6LWP zHUQ*nc})EvBzErhacEe66}V4w^RkNE5zR(e$+0RnUd=J@LYM6K=UlP^T(U9s`B(-RMMu*H zSG)r**`aXBX22zz3zsapX7iFRS%TLPPcdDxw1vqAvInM)O`1oLdVmOZfQA}ZYonRwQKfLg9s@_9JPlu!&@q0i zC?y~*Vdlv>@4wd71Cazr68AzYoQw7F-Pep8;FTdGyE6ihq;)B>u zoE?FvZ&7&|I$t6b27!<|_gq`-o@0U?q&87L;U=c1?Ft~<%%2!j6^yAn@O~yAFd{EZ zP?rPLpxD0{`C%8x@r2N)rB2kdf8+z!)!VW4(-?veA_*UGDi%#XU|pRNrTdG7&`F)n zW<_ioNN!?gGkw84@4Dj4n;@PoA&S0SgB+q*TUckp9jvSGBb;MUB4^_@N2?)15E0@y zq_DOq-V8IgO)nMh~& zK-f^fg_hplZZ)j$asCg~G@QsrW5fU`n_(+(}3{3(C zDCvkuv|^tR-mTj&K!C2T!JB1%IIeycu16$qSgntkw?%dq*u4~@k2J1y^X3rXX@-9b zS4V3v=~8rVY=O)rHU&yaPnK9N`%d8&P3!=E)k?o-E0&Yu_inU91Xe->zO|9Gv_Vl= zlEelo!k<^l)oDO|tm!}2)d#gPrvDg@z;g016R~ye`+<7*NT7H?=Xt9t^Y7P-{BLh0 zb9_GLaUx#`oPVqFg{#WN+$g_mm8W{K8Er(vU&Kc{PbSeL-!E|=jKIFC#|KDZb&1YD zS~b@df?7i~-f85Rly@X`iMZMw;q}*h@=lQkl-ykbXy}Pu#P7Jibk;Z&J?09+>MKU& zxfPTqS5RiIz>Ud{hl_Am7Rm@Ps3q@rL4F}>d&5pF<{SR^>x;5}53X9_gLBlz)xRPr zy2X`rOPT&6&gM>ju$|mbpI6f6-D|JSSWT zdO@Ztoe(lHH4KI3?Tz{7boWH~XDu^o3zMfdtggniPn+7@AmLyEgx4_}4rQ|Yl2dGB z9M0iND^qTW^E+-R71r^`ZYT;Wv9WOTkTW_puJtA?j-$;7Y|Xg`Y+OAS^PUnL6aCKM zE&^K+|HI_R@uYbiT<{2cJeT*4bw3I{E~>782K&q8tog`4Y`#SV`RC^IafhkTk`yh7 zM}z8YV{6y48sX@In(V{S?32S{2%y=HjugMM#T23m8%S#}#e^E_^?K(%CT~pk{u;eE zBzvznd$*aBNb=VMX;}IPF%q3$Ym|Q%p(S77)cvA|EFi%IZTB*k0=t-f*M4M@5&qS!PRc;-i2^Pg- z>SOVQqFs;kR%+6Uf-q?t%*W`u+f{^0%Wd8 z4jqr7WyztkIdO?O(k_o5FqK`18&@D}i5=pm6XZ?2vdOJWH(>(dq2{E#uJ_tljqH~JbIT4JyNEUIf?ntUyZAb^NXL`V`b~-h+*&xdsMHv1xdLt}@ zWDAL@3*ehvU7oe#f~qNT-nZIm)zlh;f4|!0`YbB$p^$`m3+Y<`5dbFP+ZqD2Cd?~u z9+|JfKQ5US`4@osKE_*a9_`g5=O^pK_3Y^0hA%ltnJ&Z;l2|4p2{Li>Y3d*2S#E-U zJRfyB-c#Fs?_PmI zknvj1iPzxM0$u$(BA7-6H1*$51T=M-!I#`3<25xA{vf(!v!G4qvcf<|yX0%{@H!5) zJ4%HY9T2}2$sVytuU1N-j0pYD4oI5>Q%8-eVq|Uhzpn0xHLuatpT(B1r;rCn@6PqPo+W)lk7jr- z?vsuRo??7~Sk`Cpc>1iK;{NJTwkKHMHx!LIo?w4NsKB$l&wg~6XLjFk&)mLz&+Yw} zhcwSMePPeFeTL_j{#6Lcp$L7l5WlHW3313_6kp+h)4iPBwW;V@k}Tb>O@Kkll`O3Yk476*NE6H$NUUMW{H8!x7Y0Z;P zhS$ClRX+{$4Xydoaa{Ox#Q6WVmJfM6(%j*h(Tss%Jkwiw_ANQwxh8GsBSv#aer=-u zWej*HlTTbzT)Yw0tSC|aOH>~h62Sn^t=H8}QNDIf?UFm7K;-zn9gVK+01>Upc<$Uc z)M52$+}rdGb;ZIASjXrKYRT^f&!s-5Oo|8|>tXtWI;>u72qChcv4ejbppOaZ!@`ic z80W=dgzR8wUFS!mU->k za{1EewXarhWV48BNc6E6sZlVfqwMAmV9A(~-ZimCiU6Pa4yF*F;`-TUoHi z6w20<83J7`8lD;?rlF-F*00jcSv`n$toZt_ynVvxw0^wS@U1QdP}3K|^c~>iaWOPg z5p2Zz1fDBRJa5&=URULY(60l0R*;{A^}G?O>@ieZ1c$%10H%=9!~561f;fqm&V2|| zYisMFfHeBT6&ntMo5Xioz`usR{$k355u)Otiu*1|K>LZPNJ}J25>*G6`g<*vr9c)% z)zgRvK2OF3dNQ;%e5DEIy?I-{uQ>c;LJ|q>W)C7-0@5Ks`qTdhNmEZj`=Tf%>}=&W zzxe4Ze9F2jgg5w(b(dtV#XAkwz-K1!gDZDG|6<*$TsL;&&RZS(WZ$k^JMfvUrn+># z`1aMsmqCUROV_>=Z&oihaGbZ8li+Z2C zC9M7-US4!bQA_dGE*gAOoYkB<8dhJz6?MldYgm0P&ZRp`i}8MqHz`If>y%DfC00p& z^Wv=fOY~hF=l(lqNJq38j;MMRy5gO3@GQtm4tG~~RPEFw>UFWJC0 z4SXD5`$~=<9L3RiGkonU2(rM39q;J~^P+#J;ktygJw1@IlVY>zE+#j7!r9K0U4|uu zj|d=*UybV!9Yn}Iiym9m&H0Aly@1YS z`8rkA4F2f)Ypg0XYOb&MT)xGyo72L zAohiBB7ZXVdCHJ)`uPA1WV2uh^p(IHX4K-mZYK|!3VSbKcNf85YVc3*DqnIU2Cuec zJ(SHc+Q49C#vdCK@5=CFo)5pIWIPr(_utxg(r$U z6&di{6Tjx{|8B!2g77mwYGYV9!7GAp;ct9a&|Rr?TR?IbLRqCyW!spxvxT+A6hyhg zb+ha8Vm9*hXY8QT%UgndsWV_JKLI!FpLs)j*)@-aRdoYCA}5LEDKgZSxECni8I^rs zB6P&$<62d{3Ex?e%t73C+=KS((Qc@7Vy$>w4EDM5T%WaOpGAmF;qSChn<_>(wuqtU zF??c6ebKhYaKE7{(U~w0$!n$326JJPfrcx($wZ?bXh?BCrWqdP(>Be?{ug5W^1-kA z*Xg7n?uS3IX^i|yq#j*9Bv0Qa>q!@4bzMwV4@KBPs((AezuiX#SsgoH;u zJ(PDu_?*p7{7WgH9l2X9z_LqAOf-wR)rkpVpD2h6AeE{J}XelkeM7=DgdO zS#0;u(cK}Nt}!@PQ1y|`l^U$t$D@B!bo zt;9JWvn6PGTO=V1{uQPf0%3l5n^T+==4ZE+i=HrdZC@gufumx3x%jolcW%$ijp-hM zuE2}zIJQcl-R*c8$FRpdGX!t9#$6qAm*1r08%dl`GRcSo$-Z`VJ@DvX2u(Plc zB&G{dE@QfJ93x1C7vj`!>^Bjb0!dI^beh2a4 z?T7nq_m30CzW550cHws=qI;i0`W$}MxD&{iiGOv3{occ*6Fp3#e}Tkx31cUo;Ws`| z7<4RJ&~W*}I(f!r4f2AOx2%xUO8q%Y$K^`zFU*zd7UxQz&&`#F{iIMD;mG;vqFm|S z%L}EY)|^FG7`odOXWG?`GrzZIdaZASI)gnh0+9v^D%2q z&y|Ieknj9=x%1wI&JV{IK6mwa=aP8^)fqWoji0<*FoY2~Z=`ekgX3*4=4Fpv%rAa0 zKS)?y{6Ma>{%5(;U)yt~mmbWO+?~17&0BJ%t(#oZyW6FqJ94G@TMMNdTsgY zBjthn;cmPUmodGGOCc3(c;5V+H;=PT6-P1GO{r^?ZB(i?rU!Bzb>b+O5 zUcGv++Ap5tw;$qXdTNNsYpj%_9siztiMK86 zA;Q`o+G}0Tf2UG=Oi|86%_3T)D?^+ZD+!7tkmuv1VlB__Rvd)YB`Ng!7%z90J{6PC zU#-%=#-#C`iS+ZB2{W2P#9g0iks3nd0;7G~tA!!XO;BEjdJ*Z8(5QeAtv_k8NSC9& z_B^SwNWKtVXmjN}8s;(g%W8#alhzxKKmq1{I9y=P?Lgf|gYLF@xhv?9t&krGQq`7) zxsN+zU*@>^^q)c||GG+l6sB{Tv^*|_`IWgJ)nzEPkV0gSvo8y*pD~`Vwm&>Ki z3-&8zr4x zU7;pD(phc%c=hxCAFHYsoyDSgxT?J!?&{(%rP)?*{>D`sNnw3wm8-s;llH0Nx~6p~ zWp(t5ULuLXST8FTE>0>Ge5950j2g-=i5s*@=QYj~bIKw$`hyLftn1BM{})n6Gl9T} zoL^{ZnYRgf(szFk=l1ay=}v`ncOqSn)C$(!id67gr0Gh8uM?C532Dgan?84sp*#{qtIEE}vs_S0n$dX3MqY*xj>`e*$@HPO^Ij z@{ejWd_)RpbZ^3>1-o_5U4&wv#<|C%u_)}p-$9KG6d=7!BOY}q7rB3;#*H-7tl`{Q z$ZrmFZWq#5G*;S5M~%*{69Fd$rC=x-e;>uDB&6}?sL{whiJDPJzX~(RAQk!ffMY|t zM@#M@{Y2oZNFG-u5WebU0^KsYm;b>*D-x^u^Re{K#Q7}wL!vi}m+sWbz`xE)DMYmQ z5pfilTlIZ-T|B6HFGLHHa&Eknar!(F!XYB8M*hA8BC_Qrd88o6*QHco(QRi$-|W^h zuOUBeu$6M5zRaFpX2`luM5kYKDs}`c%{%;*tZ&v_C1+_gUCB zhYSd8Bn;H!j>rHTMRPr21JaZ+71yT?e6Lppj-mzC4kgzLVr=EdG?%= zs_(~-A?{qCP5Q_XTcs1?Mj|DVY<~xU3tl!wHEGDq@THg8q`d~+V4uX_q0%FEXV!8x zGVv|pmj2;s&c_mwP1{1~^~n`&ESuOz@?WWa)=Tmp_dekz;>!SCK@2&h|K8WW`_&&T zlN`smB4Nl9c+vMFFdT*S1*EZo-$B$x$xiHLzXh|&02$~-&8t5UJMqMy5du9v(i|(r zgkq&sr4foIM!j&>kUMlko^5dATo{%~WiEr)ZHuBSld`4Bla=@TM8VXhye z{UB=d4U&H_kPfka5Tz_*oD$RJK}p-daBm$t>qoh~8x#hAG zmH=A=sx)SiqToP>Bs|>a$J@F9kwOkMYuJq=J{1 z4u|L)sd;I?Q@EU}@AGCa@>!(43d=1-Zn<(`tc!0`Xx3QgxTiw3=iBR#Duh_YeTs#w z_D;iA{spZayMWJC=%KNBe6d3RFt*OaOP?D|WjKJ#$H0pB@zRiCDi4MW6i5y5`XGi* zA9uk0t_nne(BF~T84Fk$h`oh02NPUFza5u8>J^nKSSQN+XmVP{oafB)7?khEIhqXd zuRUK?cQJCK&~{L*Jzrn-Q>_Jv^FZ8&w%zo$w9Jxa=t1hBkrd8j8;XTY-k}koP9!H5 zp{0u8gtkdntBj#9#vFesEuN2`8myJtt3XnS{>@p?{8(tUH&Rig@zSemBD!+^ll3k0 z2v(f0D(ka)t@*X*%S0mWP-48+;&DR>KC-$>;z_(;Xb`+L4XgylG(>u>XT8v4_K(^+ zp$ex`gU4IePnTybUH%16q-iFQyrC2m2uDDD!=!fBQe?K+hk9J3OH3e-2xhGtwKxR< zP6s#}dfNgK@T|<6;9G$-b-4249yBaoOTdutr?Xw|=J!>S>+}kb#e*@MLImfS@YpEi z?+h98Lt!ZP{sc(bUi@xvZd$u`eJeSL{2gU0H?*$2<&F(atza4yT;IJtR_|!q~vM_DqqJvNif=SB@|>%pc~Z+%P@w%4vH!B)FZB8*7+%ry+ev<#Kp; zDsoSUxSV8f3UZG@hLe$QQi(eWsRaksXr$ZJOf0k&+~23fkU0Fc5e|Q237c&o%pK;W ze}v-e(K3)DRBsL!DU12UzpS8W06vdq3-7%;c3K7qRK?`yx>2+de z{&VQ*@#^x`|Iw4x^q4(a?iu>1c-_nogWJ4`eqC+~ZiSHTnXStQf*sybs96?l_r@b# z3R@=*>CT|dDzISBNBLx|T>cTQ@?JEl0dKxf$@o4l{4 zg?AHdID7xC^opER_a7987$ezL-n|Utj^kA2q&f{ykWMg&G=X;HjBBdHrfWn$JxIhw z<|)aE3;cOFedn8}FKhcTxEE6YWpIs`JF*v64{3%yWb|Wg*mkaRw)c`QB3@>WV*Nh= ztm%FiU~pn3;8#*DXU@dm1}*uc0%9i{10(SiQXJH*|1)TD2E3T#pgD&ZGQ;M0pWdE( zY1>_Z79Yhd)|?~O#EeK;iVrLb?;>O|xG)L7;RCtMX`or#CWo)y$(F=%CqrE_~VcgE_owp&XuXnmMz4ljVzn1DEQDc%C$ z+b^1E0OfZ2Nv&&5d&|5TXqbs#6@JzD`S3HXq5{Zf9w{W^oG9nR3K3^V>6>ZNcbQ4w zL*UGL#gHG?823Lz?tlhvwu90UPJgV>Kwj^qyA@7kW>xL^=UZZ=Z2&045E^F2d`!)l z!`eMA;aCz~tFEcc#!*4&F z3YbASV9ux=Bg`0W9H|JPn!>gA*pK|?Op>P)3J9n7WOBNgz=_)*Q|HKaT!x^yksvj@ouyU05w+G`kpaVqB(BA7_qrpk;TPCYWZW zE?1~AQL_^HkN~wctOl61Tl{5s_5^0T*7qnGRXs{(%jk1FC&C0>7_xfv(2_xVF66f5 z8T1PN@Plev@z(C++?=$2xD!auIQJ4QfwR z7Xz5hezMn)KT>hJcdhouLrZ*3A1zwYwk;Sjr@6zryiMH%bDB|WtenPRv|~Id&IHBT zU1R_nq6waYuG$}s7Se?sFe*arhd5~rc@te*nlQ;T8y`^nw+vk zEsP7N$v__t9OhcFV)EY^31G)k*biyJql(adREe)+(;ih4*pZ7gkwnPlL2d$=xzP9( zqgd!$ZQiFQszQHDUo4{?G-uR}_cAYu6yl>?{#I!*ImCFM8XD&Pzo6#Wn$WDKv4y() zj#*?U9y|FM_)1fKldd&hJ}1r1nEwI2tt5M5k5Xw4WQ$2e*rqKubE$2xl@4QJB1`)y z;0;5np|6#sjDIQw4_UEo=uyyQc=$nz~hvphKk@aS1sVbIvyE zE}b{-I*jFu$skt%5w=+1c47F`(YDf5ZZ3VWbS0NcFO(L>e+jq1YUp#2RZy10eNFvk z#Sm_6E$2J>oxh$VXQb% z?$O$NvHpZPJxc9tt^EqSKZ-znrZIDPb63ODF}ysHJ>gLqW63ElZ@7D*F?`+B+b?7+_Q{rBK=+YM2D^q_t9kCa7AQ6FVC9yna<2??zsuxa&yaFfRV%%0eoR(ow>uB z{2?Zo-C7CE{sxcH=cdO9@`7zj@*+rC>5UbWCm%KYF$x~Xt(UEfDOb!W8b}K;ll2@9 ziqC^A_f2p$4i`iIJAJz%UwjYsPb)D++$oq)0WP1-$CmKcC>%OwVp&^_I+Y0w&SU-z z^DJ~Kyh)*5g+sK2p@Lp~ z99s~c;7SV^Iz;eiFgQ1TVPak3S0k5uP5w&n|H9~CWDeVeC&L0U?Lt~SDZi~KWSv9A zF;OwefDU3RznkO4(dJPx+7uLa0PsN~C5M@{9btPjh<^@i77>VUZJ3?IqH6E6nHs05ErU2YU<+yd3T7RB{?hC=ST623-0NkjIUV(wjU5&ur)qT!*J&q%2r(qg^SyrXqT!^eha?1 zSRdD1h5Qw0kMW1)`C1HGNkN(SLnz{1H4gwALLRC)Na*7;rdtt3fgf+i*pi*FCG#=1 z4rA?Fhc_2_AM(B7cKqF>?dbJ@eyUW!gP*U{yvr65S8U6HylZZDyKoY@}#T`(SVX|gLw>ti0hS^;url$n;#4AZ4wE3|jko&YLr+v^F8?ZIIc&&AsI7lF zo2`he!u1WU-KM3*%FM@wgF7!N5D$0Zp^%Uh=Z{71OXO_+801KpoZthEE=$q3?~(yi zvcg1oCV@_$Q!y&-1b49KLicUwhQ`y4bDrb~b=9QVHK1t$xz~mpv0SHBT2oWat)jbX zic1jZ5^JS^yR#uy6dK@}b^EZJ7KPXX;2-QZi!@HRN?(U8Qm#(_RnyFWtkH#YJ&q5d zxfsTb5{9uwdR3#Ha~FB;R&i;Uim^yGIGa1?5%WR_V%Pw}97FXO(nzR2cYfQwa1I6> zhP*?2BkfqHgkEYn^Ltcb?nc$BX|JxedwejQjEt+%2)7xgTit#t>k ziq;D#PeVORCuNt1X`4J=>kRm#4I&!cXkclkwkc2(t*-)tlTlxfv|MWm z%tCz}5It#y{~h)4cw$7Jc4J_Av_*(9WS7~}Za3s{+SP$c(H0+Ck|JZ!(iX4z1Es^$ z0LZ_>xCmw`MyC*f*2k!ace%`v zKMbb@oY58^T87LPf|kFAN2LW)qrf`R^hRV5rWrVXX5PO!?qT}2f3A3U$nGACC9Q)a z4AP!SI+=dfjuH15A1+ftS}{M*^AC7;V_R(grPEF}!6A-@%%DYD!2}5|>cv>`rNnem zZ<&9dv(noa>=*}GAJCy9A{u*?f8O_Hb}^VvZ?jPrj<<) zdol^w-`L!A=RW(A9Cn0?Atu5U#Rqbyp6ueXUf(0*YO5t>@cS8ixt-_!utYAd+# zGK^mq{n&t$Y5nCYr_oy$<)(1qZr5wQ++iYpjsPb+n_TpXMYH2xiX)kzXSL^M3d_>+b+S98Su#n%H%7H2SiGchQga;*M&| zhnid#wAPUP{F=V%kDy?g>4yVT9L>B&?DEe`zkr`!@H<8>|1o|$@>blK|6~~Q8e^&H zS7D*`C+V5GiEYhcwjOt=vEHO(ocP08#`uuj9op*6@Q380P>0uvbWm;gCKn|P@drcl z0kqBbhU6@?IncH+1q?>R7weFSOO)dC}TjgSa2w69oh*mIx=P%_g{J zbJ|w6;z3dv8wks#dLt|hw=#|}%d@rg!be10F*0=yAY5mT;l!nYx)gcZbB%4<)lds% zcpB7m!Ph37s?WL-K*|-nSth44U?-UE_U^2O^T#w-prxZa0sVaR-`8A{{-v@afJ<+I zBXH?OaAMC)r4yGHUS49xFeaQSX1CT8J-tP^55Pguo)8$1nw{1BhlT#c_Lx9{S>oQw zLn#k=@kE|4racG01f1ifa|fR8WYK4qmag8Tkb%Lu#`%fQ6EQBzoO_grx1HTgttP?D z-+qW=mK)pR!#Ao!OnKtR6e?4uOsO)3D)gnBN`2KuO8q`Mds#|b=P>&*!%o0tGi)KjK`pNG+RMpu0UAZ{=rMK+{MA^EQdV$3B+G#AmT zHPJca6jCUzj!wGD1h&eYl&v|Q6BHm+lb42d{{a!rWjp!j!*tWNbz|^a34Wf!=;WN# zZqSdfO)KN1RwE;Tqiv+&X48Am_{5p6pm9;Gd@Y=GgFy?f^H@2_i3=fnBx83?cI7f;N^e?zSsQ%F`s2OAf^r=6Vfi1}B+N<3!`;J6d*Q(#t?b&~ z(m!n<5q@pT3S%x)wVc$3`TuXnIw!5tRr#}@Io4V2&m8M3N7%Ip1K$3bXPuK4VZi_P ztXE+2DSE`Q9+E#EajYZ%GsimJx+14-U6}bj3X+|8KekY{dS{#%%gXMte)4^?U6mWc zV^A*S(oV$U$ml>Wk(J#^{zRWDUm1>PrQ}f2fB+S!M~O`wV#^a>d6|qkvuu z(y{dgoIo$D&rS@WlewgML>pCWPcUu+16OaOXN3a&q3* zS?D{$m_l4=*_4}@hc>^`T?e*)q0;Lc=FbYrKPof8Pxjmf`QWC078l4S5ig;Rms69` zT98~ZKfZ#k7T#%L4LCRR6>9P+dbVK}_Yy6-GeGmR2^(4j(AeeFnK6QPMRN?u@yd-1mCM0NmqjD!R$wzT&N;le1JpD zl==KXW*g9-rwj*DkPlWy*Y565un0zAAk#^~Rv+w|xjok*K!2TnO z5t6qmY$y>`guU$j!~Gth>zYdKuZ5WdH)0ubQjbb|nw++WRZV_cqk~P3wy7ho_mDg_ z>Utkm@yyGKGbY~#2ZJX60_t0nPiWS!w-W@X)^T4|Sz-O^Vjv{980jA8hs~}xdn<}l z&!}=hZS^FcVO)Dm(&%yt+E$@`7&>Qiu(aRn8{ zpiXyOO`4hM*v`0tQiA!`2{_)(^UCaxN9*!wcwFsrCWqp zHz-;D+Vdw{bouEpz4NA9Jumj-`mp{K(Nf)ooy1zGv<%lM4L>QCBVKjL=bh;)# z0q+wpHDG*N6xQ{~N1m5PqNoV?UI9=J#=>ASz+~Ec5d~$z7*%czu|SN5$Fq?@Oq{v% z`NOLGsc!B^NZAKkD`@*bn>i99f?WOBoOPweutMXpw?z5K;q6v4>57D7RQcFQfB<>( z^f|}>Z}>?Qb8x^^6TLUI3|>vF9Nq27h}f4vc6qC zSa&Sk!=Xw%KMu;14f^Wp349`~jn%&DPxM4QsZ6(X=i&(YdT`xqKg_enLC8Ir(5Rw>9O!y4zDWWYbBF%#%OY*`cnXdgO{Ejx!GATUD0HJ=;Bxfcs8>C zKEM^r+<#x)?D6>2_<*qBxRNOzS2D_$*<+B;K&wX`mbd5e{)TPVwLY$m-n2F|exq4o z9#{LUla7NmWvW%^#* z!hEV@ATUnkGq6m9L7H|;9zR{9GjH(}y)=TYB}@hmLCZ6)rsM2k9AKhP@+$G1JBX** z^uR5PT&ECp^FWMpj1*I`+oOkxE`JoJ;afaozd?sc&`On`fRif1Njm-3oVI-^dZHBA zLj@xgG1(lTj%cBXAXk~o*X~MB%Rp_mh9^_fr&tNo=)mz3eRqhACzTy-y(^2k(@TnzPq7OO(^&{pVA%Gk&gw9AR);yP zrJp@ef`OrS!3TCvwD%_T-WctDr`h`sv$r6Ael{M^8cZdVsIvTZ+FDb-nAt$22ZA0E z0q85Vn^0Mp%&bKsy$c0Gqi;W5@|=O?KCM?^vToOgA9B5q?MXSz4tIkA=7ys)lv;F5YC|q}2^?#rCnb}t}{r-gIRtfgX z3A~nzf=L9J>L{35CYYHf7^~QNmLd8B{A+I+Q%#hn0i`QLj5m{_qyLQyenoV2sX01w z8Hy2?on@#O``XBgOGa>y+#3j7bCG)kJ2Z04VUgRAO`K`s&b~na?m#^~in{Y6)KjCA z9|IKjCWt|?n^0JE_7E2zCd`J~ERGVJZjQSD|pci62}lQ$dm*4y(EAGoNh(V*S8JFP*u$>=M$yIj1^ zAF;wOTDRB-0PKapP53s10eTc)_}o4rEhyih3TB1xA~0zNt=v#jHQ}NvRi6oe>P|fI zWj0|3wv9kWBjh<6$3sxQL``%v=*b#)WEj0qbo%s$EMRXR!Tv({C+y$U>Bk%LCOl-G z?PY!U_HgXcTT4jJ4;CX#8j{c9QgMktD6fEq2+Ds~>5Mx>*w;SA4t#_1op@pDAQ}G7 zcEQ`;S!F-jZqMPKwZj0O8tu`99yu@!t$2fq=hGdWX@rI42g4%7XS5$9urTa%jj(); z7M7Rjg5TFsZ0_({lrPt<{!Wxx`#ddyHjuF?6}kmJ0z?JSt@#Xe&^BT4~tWSxpA*{oNZKP%HM+37(2U+iA|@ z9OOOOgBH)7L%D%uPwC(o&!oW=&uv4MfppK(!8Y6JRL|_eah|z@X`ZGbe?ajp84P;r zhn6D5T@IfPbAbO5Otk;H1d>J*=%onUA)DXlY__4%%{~rSriVfh;jQTDnV_ zjGnG&X}3}Wb1|(cTHF{cL?bqV3Dl#+vj+-hetXb~mc(djypnOR=7i3|3X+^9HM*gN~>yug~N6TvxlF$TZDNk=EsTk z?ZkaUXC1x{du%Z)aV3^PPHgC`U(5&UJ3Te^fE~orwe-_p-<6kC8TzTRSZkr5Y)El6 zbPDNdIaWWB+(vz8T3KYsI81k60!?hq%8ElZ$&6GRFe_GL@l7l?s`7mXo!?p}ehl*> z#aGo??Mn7D9-q>m8u?5uDDyh~MXNLCJ(crVPqEL@R2dPH0CQ@Pfq$Oe3I8Jdkfhn9 zdeKv1ydi*8hUE&K(ch*L^2n+qOPIJZ(J|j6wyb|46~o07aoB(?*1KQ7;f4QX2P3>K zOs8+m6TgI4{e~Bq?6Hqk*as?X&Q_#s-oFQS9_o`sa;V?m|4;Hv`3xYX+4Cj~Hi&xia;4BWQMa?#<(v@^o9z zC2;IKQsiZ(^;5_R9_wj4+6p}gx*T%0lK1+nBo}+hfTIKjRUfy-zWHb05Xkty{smQj zQ=JT(dWOoDau&AxW|eN)ymJaZ5HlZ9*vzN1tYeEh70+QSz3ygJo}}hw&dOx>S~mDh zkQ9G^T9va^I(^G3tBMbR=#yJ=vQ+sK_@9k3(j}a;3Z#Jb?F^ElPto_!LHa*iYJ>&h z8hcp2HAKtW#I`L!i-jRwePKB(9Ky5vakxi}^LJLq56=F+69LtCAVw)Z_U%kqu7f1N z<%Y+)`60ZYVlmJ>O8`%spuL{bRqRbBhDVk>vg*w> zL_h$L{=MxPdp3M5Ozb`8ld#JU(VgvC!VG*6TZ13%YIjUy86ST3J_X+-;;9VWCRHxd zi?33!LlyZ4NYFRdi1e@zNG5o#ZU*r!8f-63cnbTyj$d82RLmi$g z*BjPz3ki|_Y}5hD<`9vd35jcjW8#|bvx>Y9L8lk-?I}MPSi>S~tj`*>A7BB6c~)!BV#oZ6lNh8MV2E`xK=eOO}pddzRa;de-#iX2p^1`i0$XalT&3Wl?d)9FK zl#zC}2gT;@bB-7mQ27EjM@xUi;hNy>GFNK)@m>7-li(~f-1dq;8OJ{EVFM^7^LTUH14eZG@zugD8AhHYAW zji9ql<3qb4uY}_Lsn7J0K0C}lQ_Po7bbIH_8IJIlWYWRd|7yf~(;!rpzh~l)&*|uO_m+ysjY@Pm zYJO2_J?FxsFc*>K!+7w?>K`-ck$dy_-3A@JcZTCOd=HQ}j)-4G#ZZ>veHV9E@pBD& z!|uHCv$dzU-L#(R3#r4TDPNZJ3>(mKfa;Z+=R_p;4SjxhMz!6zP2vgeM3^Vu;EFjA zRDnCgg|oLKd<{bIf#l&m?7P>)d#bVyZ)5#_)I9<2pyve3OFB*1<76(yJ=y#_`f=Z$ z1TM2F+~^XEKZa@jePbO-ArC<3Yli#@j^vg;EIvNpxKHFR(C6-R z+wTh-@(FW0FnFC|diuUa4V$qKPhikfEf3>Z}vEElgRAO>XLUD@$>Y0 zge7^Bb^<4x#F6^-j0wztevA5#FJtYU^9=b#z+p9atK?WJV-iGTKi$(cK4&F9G94Hs z18i|q!<+gEKA2;B(uyERD(Ygx^!=`dm;4Wu%CLmV@`rGQv#I}~4NuANeka8EhhXjf z#p4d(-KDav_)BFDBj9ML9q|)9siybezlVE}W*%^J+v%(W=~h|B{~2KUft-0Vy!jEJ zMgIYG0w(_VS!fEpjQZ(k2M5!!#2fK(Q7xEf;5QJ~<^MkZ=7EV^#h1S!!YBAWI*SNr zkbZ{WTBvzE;Slk~Ao;C_2-aRAu&)PQvj|yukWP3Yqb*~}RkN>LTrSpJK3lx1>DERu zo-g!m+&q-qK5I^QRm$ZP9m2k=975bR4x#^Yhw#Y~hw$x{4#B_JA>4b#C4$?U?ns%u z)FHf9n;}fIrj%D^2s_H08}l;y>n5dJk#V|RDYq=j5Q28+ic05GdCs@Mk2wUNLdf5bC8yig&mhE&1k90bOrcDmv z?OhIG#l4um%^{?2b_kbk#q7IX!Y%ENbWF9yA(U4-gpGS#f`4yWdXZCeIMZFu)P$6d zZ5hI|R%eqnW%CY)@LorTaLngiEjmXxJ5!n*PQT0fp4B;Ramr`gc|+hXqrZ93X|2es Ku+qOg==^_EYG6PB diff --git a/python/file/judge-xt.lua b/python/file/judge-xt.lua new file mode 100644 index 0000000..f25d615 --- /dev/null +++ b/python/file/judge-xt.lua @@ -0,0 +1,560 @@ +---@diagnostic disable: lowercase-global, undefined-global + + + + +-- 芯跳赋码仪错误判定脚本 + + + +-- 方案配置文件: +-- cfg_name +-- 检测数据 +-- check_data +-- 当前路径 +-- get_path() +-- 打印表 +-- prints:print_t() +-- json解码 +-- json:decode() + + + + + +-- 读取方案配置信息 +-- print(cfg_name) +check_cfg_file=io.open(cfg_name,"r") +check_cfg_str=check_cfg_file:read("*a") +check_cfg_file:close() +json_table = json:decode(check_cfg_str) + + + + + + + +-- 表长度 +function len(t) + local res=0 + if(t==nil)then return 0 end + for k,v in pairs(t) do + res=res+1 + end + return res +end + +-- 截取数组 +function mid(array,start,length) + if(len(array)<(start+length-1)) then + print("mid:out of range",start,length) + return nil + end + return table.pack(table.unpack(array,start,start+length-1)) +end + + +-- 把n插入t中,不允许重复 +function insert(t,n) + for k,v in pairs(t) do + if(v==n) then + return + end + end + table.insert(t,n) +end + + +-- 删除t中的值n +function del(t,n) + for k,v in pairs(t) do + if(v==n) then + table.remove(t,k) + break + end + end +end + +-- 删除t中除n之外的所有值 +function only(t,n) + for k,v in pairs(t) do + if(v~=n) then + -- table.remove(t,k) + t[k]=nil + end + end +end + + + + +-- 计算2的n次幂 +function exp2(n) + local ret=1 + for i=1,n,1 do + ret=ret*2 + end + return ret +end + + +-- 计算参数错误占用的字节 +function clac_cfg_errbytenum() + local num=0 + local tasks=json_table["TaskArray"] + for i=1,len(tasks),1 do + num=num+tasks[i]["ReturnCount"] + end + return math.floor((num+7)/8) +end + + + +-- 8个字节描述执行结果0成功,1失败 +function find_ack(index,acks) + if(index>len(acks)*8) or index<1 then + print("index out of range.index=",index) + return false + end + local temp=acks[math.floor((index-1)/8)+1] + local i=(index-1)%8 + if ((math.floor((temp % exp2(i+1))/exp2(i)))~=0) then + return false + else + return true + end +end + + +-- 展示任务回复,0成功,1失败 +function show_acks(acks) + -- prints:print_a(acks) + print("return_ack:(0:ok;1:err)") + local str="" + for i=1,len(json_table["TaskArray"]),1 do + local ack=find_ack(i,acks) + if ack==true then + str=str.."0, " + else + str=str.."1, " + end + end + print(str) +end + + + +-- 统计指定index之前应该跳过的数据长度和当前index的返回长度 +function calc_skip(index,tasks) + local len=0 + -- for i=1,table.getn(tasks),1 do + local i=1 + while i39000) then + del(err_code,0) + print("check current") + return find_index(task["TaskIndex"]+2,3) + elseif(ret_value[2]<1) then + -- 新小板程序在开路时会返回0,保险起见还是看一下电流 + del(err_code,0) + print("check current") + return find_index(task["TaskIndex"]+2,3) + end + ---- 排除检测板异常 + del(err_code,1) + print("check chip UID") + -- 下一步检测UID + return find_index(task["TaskIndex"]+2,4) + end +end + + + + +-- 扫描uid,成功则芯片正常,返回下一个检测任务,nil停止检测 +function XT_Test_ScanUID(task,err_code) + if(find_ack(task["TaskIndex"]+1,mid(check_data,1,8))==false)then + -- 通信失败,返回芯片异常,检测结束 + print("task failed.task_index=",task["TaskIndex"]) + only(err_code,5) + return nil + else + -- ret_value=find_return(task["TaskIndex"]+1) + -- -- 最大反馈时间在范围之外,芯片异常 + -- if(ret_value[2]task["TestStandard"][2]["Max"]) then + -- only(err_code,5) + -- return nil + -- end + + print("check charge") + return find_index(task["TaskIndex"]+2,8) + --print("读取芯片代码") + --return find_index(task["TaskIndex"]+2,6) + end +end + + + + + + +-- 判断低压电流,返回下一个检测任务,nil停止检测 +function XT_Test_BaseCurLow(task,err_code) + if(find_ack(task["TaskIndex"]+1,mid(check_data,1,8))==false)then + -- 电流检测错误只能是检测器异常,检测结束 + print("task failed.task_index=",task["TaskIndex"]) + only(err_code,1) + return nil + else + -- 返回正向电流,反向电流 + ret_value=find_return(task["TaskIndex"]+1) + print("current:",ret_value[1]) + -- 电流为0,开路,返回接触异常 + if(ret_value[1]<10) and (ret_value[2]<10)then + only(err_code,3) + return nil + -- 电流过大,短路,返回芯片异常 + elseif((ret_value[1]>task["TestStandard"][1]["Max"]) and (ret_value[1]<1500)) + or ((ret_value[2]>task["TestStandard"][2]["Max"]) and (ret_value[2]<1500)) + then + only(err_code,5) + return nil + elseif((ret_value[1]>1500) and (ret_value[2]>1500))then + only(err_code,3) + return nil + end + -- 排除接触异常 + del(err_code,3) + print("read chip UID") + -- 下一步检测芯片 + return find_index(task["TaskIndex"]+2,4) + -- print("读取芯片代码") + -- return find_index(task["TaskIndex"]+2,6) + end +end + + +-- 检测充能,失败则电容异常 +function JQ_Test_ChgEnergy(task,err_code) + if(find_ack(task["TaskIndex"]+1,mid(check_data,1,8))==false)then + -- 充能错误只能是检测器异常,检测结束 + print("task failed.task_index=",task["TaskIndex"]) + only(err_code,1) + return nil + else + ret_value=find_return(task["TaskIndex"]+1) + if((ret_value[1]>task["TestStandard"][1]["Max"]) or (ret_value[1]task["TestStandard"][2]["Max"]) or (ret_value[2]task["TestStandard"][3]["Max"]) or (ret_value[3]1)then + -- 如果找不到任务,则应该是方案错误,这里返回其他异常 + print("can not find task,fun_index=",fun_index) + insert(err_code,6) + end + break + end + fun_index=task["TaskIndex"]+1 + task=tasks_judge_fun[fun_index](task,err_code) + end + return err_code +end + +-- 判断一个任务的子错误 +function judge_task(task,data) + local range=task["TestStandard"] + local ret={} + -- print("judge task") + if range~=nil then + -- print("judge task") + for i=1,len(range),1 do + if(data[i]range[i]["Max"]) then + -- print("task=",task["TaskBrief"],"out of range:") + -- print("err code=",task["ResultErrCode"][i]) + table.insert(ret,task["ResultErrCode"][i]) + end + end + end + return ret +end + + +-- 依次判断主错误 +function judge_list() + local acks=mid(check_data,1,8) + for i=1,len(json_table["TaskArray"]),1 do + local ack=find_ack(i,acks) + local task_p=json_table["TaskArray"][i] + local ret_value=find_return(i) + local err_code=judge_task(task_p,ret_value) + if ack==false then + table.insert(err_code,task_p["ExecuteErrCode"]) + end + if len(err_code)>0 then + print("task:",task_p["TaskBrief"],"err_code:") + prints:print_a(err_code) + return get_err_code(err_code) + end + end + return nil +end + + +-- 要校验小板的版本号,方案的版本号 +-- 脚本产生的异常从210开始,0xd2 + +function check_env() + -- 校验输入数据的长度 + local skip,l=calc_skip(len(json_table["TaskArray"]),json_table["TaskArray"]) + -- print("requier len=",skip+l) + local num_requre=skip+l+8+check_erryternum + if(num_requre>len(check_data)) then + print("check data too less.",num_requre,len(check_data)) + return "数据长度与方案不符",210 + end + -- if(json_table["PlanID"]~=PLAN_ID) then + -- print("plan id check err.") + -- return "方案ID不符",211 + -- end + return "ok",0 +end + + + + + +function main() + check_erryternum=clac_cfg_errbytenum() + local err_str_table={"检测器异常","主电容异常","接触异常","桥丝阻值异常","芯片异常"} + local ch_err,ch_code=check_env() + if(ch_code~=0) then + return ch_err,ch_code + end + -- 展示任务执行结果 + show_acks(mid(check_data,1,8)) + -- 开始判定 + local err_code=judge() + if(len(err_code)>1) then + prints:print_a(err_code) + return "检测项目不足,无法判定",212 + end + prints:print_a(err_code) + local err=get_err_code(err_code) + if(err~=nil) then + if(err==0) then + err=judge_list() + if(err==nil)then + return "ok",0 + else + return "具体错误待定义",err + end + else + return err_str_table[err],err + end + else + print("err:err_code is none.") + return "数据不合规",213 + end +end + + +-- 先返回错误描述,再返回错误码 +return main() + + + diff --git a/python/prottcp.py b/python/prottcp.py index 1d285b5..ca03f77 100644 --- a/python/prottcp.py +++ b/python/prottcp.py @@ -441,12 +441,12 @@ if __name__ == "__main__": # u.init("utcp:7777") # u.send_file(0xee,"file/JQ_JCXB_V54.bin") # u.send_file(0xed,"../Objects/checker_gen1_app_20230602.bin") - u.cmd=0x01 + u.cmd=0x34 print(u.encode(bytearray([0x0a,0x00])).hex(' ')) - # with open("file/EX三码绑定测试2023-06-26.json","rb") as f: + # with open("file/EX三码绑定测试2023-07-3.json","rb") as f: # json_obj=json.loads(f.read()) # d=scheme_to_byte(json_obj) - # # print("len=",len(d),d.hex(",")) + # print("len=",len(d),d.hex(",")) # d+=scheme_to_host(json_obj) diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index a160232..c53d27a 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-07-03 18:20:09" +#define BUILD_DATE "2023-07-04 09:17:01" #define SOFT_VERSION "0.10" diff --git a/source/soft/bytearray.c b/source/soft/bytearray.c index de50686..ac50bde 100644 --- a/source/soft/bytearray.c +++ b/source/soft/bytearray.c @@ -9,7 +9,7 @@ -#define ARR_MAX_PRINT_LEN 20 +#define ARR_MAX_PRINT_LEN 50 #define ARRAY_APPEND_SKIP 50