#include "tran_for_checker.h" #include "debug.h" #include "mymisc.h" #include "mystdlib.h" #include "board.h" #include "dev_flash.h" #include "tcp.h" #include "prot_uc.h" #include "handle_for_checker.h" typedef struct{ ucport_def u; uint16_t addrs; void (*doexert)(ucport_def *u); uint8_t ack_num; uint8_t ack_size; uint8_t ack[0]; }check_def; // 检测完成 static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_str) { check_def *w=(check_def *)u; uint8_t addr=port_get_addr(src); if(addr<=0||addr>10){ DBG_WARN("addr err:%d",addr); return; } int return_size=(check_scheme()->range_num*2+8); uint8_t *ack_d=&w->ack[(addr-1)*return_size]; if(return_size!=arr_length(data)){ DBG_WARN("data err:%d",addr); return; } memcpy(ack_d,arr_data(data),return_size); // TODO: 还有4字节数据 w->ack_num++; if(w->ack_num>=20) { array_def *a=arr_creat(); arr_append(a,0); arr_appends(a,w->ack,w->ack_size); emit tran_send_signal(w->u.p,0x31,arr_temp(a)); tran_set_busy(w->u.p,0); } } static void check_del(ucport_def *u) { free(u); } static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data) { if(arr_length(data)<7){ DBG_WARN("cmd format err."); return 0; } int return_size=(check_scheme()->range_num*2+8); check_def *u=calloc(1,sizeof(check_def)+return_size*10); u->ack_size=return_size*10; u->u.p=t; u->u.del=check_del; u->u.doend=check_end; tran_set_busy(t,1); for(int i=0;i<20;i++) { if(u->addrs&(1<u.p,i); // 这里打开检测 if(mcu){ port_start(mcu,check_creat(check_scheme())); } } } array_def *a=arr_creat(); arr_append(a,0); emit tran_reply_signal(u->u.p,arr_temp(a)); return (ucport_def *)u; } static ucport_def *bootinfo(tran_def *t,uint8_t cmd,array_def *data) { return 0; } transmit_export(ym_checker,0x30,check) transmit_export(ym_checker,0x34,bootinfo)