Files
checker_gen1/source/task/tran_for_checker.c
2023-06-10 11:52:00 +08:00

125 lines
2.0 KiB
C

#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<<i)){
port_mcu *mcu=tran_get_portm(u->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)