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_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 c6ed527..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(ticklen(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/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..c53d27a 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-04 09:17:01" +#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/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 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