diff --git a/checker_gen1.uvoptx b/checker_gen1.uvoptx index cb09555..c139aca 100644 --- a/checker_gen1.uvoptx +++ b/checker_gen1.uvoptx @@ -120,7 +120,7 @@ 0 DLGUARM - 5 + d 0 diff --git a/python/checker_test.py b/python/checker_test.py new file mode 100644 index 0000000..4d25709 --- /dev/null +++ b/python/checker_test.py @@ -0,0 +1,125 @@ +import serial +import serial.tools.list_ports +import threading +import time +import socket + +# 把tcp封装为串口 +class utcp: + is_open=False + def __init__(self,port:int)->None: + self.ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.ser.bind(("",port)) + self.ser.settimeout(10) + self.ser.listen(128) + print("wait for mcu connect.") + self.client,self.client_addr=self.ser.accept() + print("client:",self.client_addr) + self.is_open=True + def read(self,len:int): + return self.client.recv(len) + def write(self,data:bytearray): + return self.client.send(data) + def close(self): + self.client.close() + self.ser.close() + self.is_open=False + +class port: + def __init__(self) -> None: + pass + def open(self,name:str,bsp:int): + if(name!="utcp"): + self.ser = serial.Serial(port=name, baudrate=bsp,bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE, + stopbits=serial.STOPBITS_ONE,timeout=None) + else: + self.ser=utcp(9527) + def start_recv(self): + self.thread_ = threading.Thread(target=self.recv, args=()) + self.thread_.start() + def recv(self,num:int): + d=bytes() + try: + d=self.ser.read(num) + except Exception as a: + print("port closed") + return + # print("recv:",d.hex(" ")) + def send(self,data:bytearray): + self.ser.write(data) + # 测试上位机 + def ecode_test(self,times:int): + print("检测赋码系统耗时测试:") + tick=0 + while(tickrun=1; sprintf(name,"sig_mq#%d",count); - run->mb=rt_mq_create(name,(sizeof(slot_msg_def)+sizeof(uint32_t)*8),50,RT_IPC_FLAG_FIFO); + run->mb=rt_mq_create(name,(sizeof(slot_msg_def)+sizeof(uint32_t)*8),100,RT_IPC_FLAG_FIFO); sprintf(name,"sig_t#%d",count); rt_thread_t rt_t=rt_thread_create(name,slot_run,run,2048,pro,20); rt_thread_startup(rt_t); diff --git a/source/task/moter.c b/source/task/moter.c index 4e9dae9..7f98d1a 100644 --- a/source/task/moter.c +++ b/source/task/moter.c @@ -24,6 +24,8 @@ typedef struct{ int count; int max_count; moter_stat stat; + void (*fun_in_end)(void *t); + void *t; }self_def; @@ -73,12 +75,42 @@ static void moter_run(void *t) s->stat=STOP; DBG_LOG("moter stoped."); emit moter_end_signal(s); + if(s->fun_in_end){ + s->fun_in_end(s->t); + s->fun_in_end=0; + s->t=0; + } } ev=0; } } + + +// ½ʱص +void moter_down(void (*fun)(void *t),void *t) +{ + self_def *s=&g_self; + if(fun){ + s->fun_in_end=fun; + s->t=t; + } + moter_start(0,MOTER_MAX_COUNT-s->count); +} + +// ʱص +void moter_up(void (*fun)(void *t),void *t) +{ + self_def *s=&g_self; + if(fun){ + s->fun_in_end=fun; + s->t=t; + } + moter_start(0,-s->count-100); +} + + void moter_start(int fre,int step_count) { self_def *s=&g_self; @@ -101,6 +133,7 @@ void moter_start_slot(void *t,int fre,int step_count) if(s->count+step_count>s->max_count) { DBG_WARN("steps count exceeded limit!,max=%d",s->max_count); + end_irq(s); return ; } else{ diff --git a/source/task/moter.h b/source/task/moter.h index ca2ae45..42c5613 100644 --- a/source/task/moter.h +++ b/source/task/moter.h @@ -16,6 +16,9 @@ void moter_start_slot(void *t,int fre,int step_count); void moter_start(int fre,int step_count); +void moter_down(void (*fun)(void *t),void *t); + +void moter_up(void (*fun)(void *t),void *t); diff --git a/source/task/tran_for_checker.c b/source/task/tran_for_checker.c index 1e98c1a..56313ae 100644 --- a/source/task/tran_for_checker.c +++ b/source/task/tran_for_checker.c @@ -9,6 +9,7 @@ #include "handle_for_checker.h" #include "compiler_info.h" #include "dev_backup.h" +#include "moter.h" @@ -81,10 +82,29 @@ static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_s arr_append(a,0); arr_appends(a,w->ack,w->ack_size); emit tran_send_signal(w->u.p,0x31,arr_temp(a)); + // 把命令字改为0x31用于接收主机应答 + w->u.cmd=0x31; tran_set_busy(w->u.p,0); } } +// 电机上升之后解除忙状态 +static void check_when_moter_up(void *t) +{ + ucport_def *u=t; + tran_set_busy(u->p,0); +} + + +static int check_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + if(cmd==0x31) + { + moter_up(check_when_moter_up,u); + } + return 0; +} + static void check_del(ucport_def *u) { @@ -92,6 +112,23 @@ static void check_del(ucport_def *u) } +// 电机下降之后开始检测 +static void check_when_moter_down(void *t) +{ + ucport_def *u=t; + for(int i=0;i<20;i++) + { + port_mcu *mcu=tran_get_portm(u->p,i); + // 这里打开检测 + if(mcu){ + port_start(mcu,check_creat(check_scheme())); + } + } +} + + + + static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data) { int return_size=(check_scheme()->range_num*2+8+(check_scheme()->range_num+7)/8); @@ -100,18 +137,11 @@ static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data) u->ack_size=return_size*20; u->u.p=t; u->u.del=check_del; + u->u.dolater=check_dolater; u->u.doend=check_end; DBG_LOG("check: skip=%d",u->ret_skip); tran_set_busy(t,1); - for(int i=0;i<20;i++) - { - port_mcu *mcu=tran_get_portm(u->u.p,i); - // 这里打开检测 - if(mcu){ - port_start(mcu,check_creat(check_scheme())); - } - } - + moter_down(check_when_moter_down,u); array_def *a=arr_creat(); arr_append(a,0); emit tran_reply_signal(u->u.p,arr_temp(a));