From d3c3f120e780bb174cbe5a32fb2c4a6c1551bf0d Mon Sep 17 00:00:00 2001 From: andy Date: Wed, 14 Jun 2023 22:15:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=82=E6=95=B0=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=92=8C=E8=87=AA=E6=A3=80=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- checker_gen1.uvoptx | 2 +- checker_gen1.uvprojx | 18 +-- source/ReadMe.txt | 6 +- source/dev/dev_flash.h | 3 + source/interface/if_uart_dma.c | 6 +- source/main/compiler_info.h | 3 +- source/main/main.c | 39 ++++-- source/prebuild.py | 1 + source/rt_thread/board.h | 2 +- source/task/prot_mcu.c | 2 +- source/task/prot_uc.c | 6 +- source/task/tcp.c | 2 +- source/task/tran_for_checker.c | 249 ++++++++++++++++++++++++++++++++- source/task/tran_for_coder2.c | 70 ++++++--- 14 files changed, 353 insertions(+), 56 deletions(-) diff --git a/checker_gen1.uvoptx b/checker_gen1.uvoptx index 9be9586..1d0b0c8 100644 --- a/checker_gen1.uvoptx +++ b/checker_gen1.uvoptx @@ -1165,7 +1165,7 @@ rt_thread - 0 + 1 0 0 0 diff --git a/checker_gen1.uvprojx b/checker_gen1.uvprojx index c0e465f..1734718 100644 --- a/checker_gen1.uvprojx +++ b/checker_gen1.uvprojx @@ -10,7 +10,7 @@ app 0x4 ARM-ADS - 5060750::V5.06 update 6 (build 750)::ARMCC + 5060960::V5.06 update 7 (build 960)::.\ARMCC 0 @@ -185,6 +185,7 @@ 0 2 0 + 0 1 0 8 @@ -351,7 +352,7 @@ 0 0 0 - 0 + 4 @@ -1534,6 +1535,7 @@ 0 2 0 + 0 1 0 8 @@ -1700,7 +1702,7 @@ 0 0 0 - 0 + 4 @@ -2257,7 +2259,7 @@ 2 2 2 - 2 + 0 @@ -3181,7 +3183,7 @@ 2 2 2 - 2 + 0 @@ -3275,7 +3277,7 @@ 2 2 2 - 2 + 0 @@ -3992,7 +3994,7 @@ 2 2 2 - 2 + 0 @@ -4141,7 +4143,7 @@ 2 2 2 - 2 + 0 diff --git a/source/ReadMe.txt b/source/ReadMe.txt index 29bdb8e..f85033c 100644 --- a/source/ReadMe.txt +++ b/source/ReadMe.txt @@ -97,4 +97,8 @@ 赋码无论成功失败都返回3码数据 流水号相同的命令直接返回上次的返回结果 命令不存在,命令参数错误,设备忙,返回错误码 - 波特率、命令返回格式、小板起始地址可配置 \ No newline at end of file + 波特率、命令返回格式、小板起始地址可配置 +2023.6.14 + 添加参数设置,自检命令 + 添加波特率,命令返回格式,小板起始地址设置项 + \ No newline at end of file diff --git a/source/dev/dev_flash.h b/source/dev/dev_flash.h index 8eb29cb..31a1b2a 100644 --- a/source/dev/dev_flash.h +++ b/source/dev/dev_flash.h @@ -70,6 +70,9 @@ typedef struct{ int local_cmd_port;// 本机命令端口 int host_log_port;// 主机log端口 int local_id;// 本机识别号 + int uartbsp;// 串口4的波特率 + int coder_ret_mode;// 注码指令返回格式 + int slave_addr_start;// 小板起始地址 }sys_param_def; diff --git a/source/interface/if_uart_dma.c b/source/interface/if_uart_dma.c index 1ddfb1d..95d391d 100644 --- a/source/interface/if_uart_dma.c +++ b/source/interface/if_uart_dma.c @@ -5,7 +5,6 @@ #include "if_uart_dma.h" - #ifndef RT_THREAD #define rt_interrupt_enter() @@ -316,7 +315,7 @@ def_find_fun(uart_dtb,g_uartdtb) -static int init(uart_def *u) +static int init(uart_def *u,int bsp) { param_check(u); if(u->private_data) return 0; @@ -334,7 +333,8 @@ static int init(uart_def *u) { u->private_data=self; dtb->uart_clock_fun(dtb->uart_rcc,ENABLE); - init2.USART_BaudRate = dtb->baudrate; + if(bsp==0) bsp=dtb->baudrate; + init2.USART_BaudRate = bsp; USART_Init(dtb->uart, &init2); USART_Cmd(dtb->uart, ENABLE); diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index 1fa91e7..0daa751 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,7 +6,8 @@ -#define BUILD_DATE "2023-06-14 15:49:07" +#define BUILD_DATE "2023-06-14 22:00:30" +#define SOFT_VERSION "0.01" diff --git a/source/main/main.c b/source/main/main.c index 4fec6ae..8c6521a 100644 --- a/source/main/main.c +++ b/source/main/main.c @@ -230,7 +230,7 @@ static int sysinfo(list_def *argv) { const sys_param_def *par=sys_param(); cmd_print("build time: %s",BUILD_DATE); - cmd_print("soft version: 0.01"); + cmd_print("soft version: %s",SOFT_VERSION); cmd_print("run time: %d",rt_tick_get()/1000); cmd_print("startup: %s",bk_get_currtype()); cmd_print("watch dog: %s",bk_wdog_fun()?"on":"off"); @@ -248,14 +248,17 @@ commend_export(sysinfo,sysinfo,"print the sortware info") static void print_sys_help(void) { cmd_print("example for how to set system params:"); - cmd_print("set hostif uart4/utcp"); - cmd_print("set devicetype checker/coder"); - cmd_print("set localip 192.168.80.10"); - cmd_print("set hostip 192.168.80.100"); - cmd_print("set hostport 7777"); - cmd_print("set localcmdport 7777"); - cmd_print("set hostlogport 12345"); - cmd_print("set localid 1"); + cmd_print("set hostif uart4/utcp"); + cmd_print("set devicetype checker/coder"); + cmd_print("set localip 192.168.80.10"); + cmd_print("set hostip 192.168.80.100"); + cmd_print("set hostport 7777"); + cmd_print("set localcmdport 7777"); + cmd_print("set hostlogport 12345"); + cmd_print("set localid 1"); + cmd_print("set uartbsp 115200"); + cmd_print("set codermode 1/0"); + cmd_print("set slave_addr_start 1/0"); cmd_print("set save"); } @@ -349,6 +352,24 @@ static int sys_set(list_def *argv) spar->local_id=str_atoi(str); cmd_print("local id: %d",spar->local_id); } + else if(strcmp(list_get_str(argv,1),"uartbsp")==0) + { + char *str=list_get_str(argv,2); + spar->uartbsp=str_atoi(str); + cmd_print("uart bsp: %d",spar->uartbsp); + } + else if(strcmp(list_get_str(argv,1),"codermode")==0) + { + char *str=list_get_str(argv,2); + spar->coder_ret_mode=str_atoi(str); + cmd_print("coder ret mode: %d",spar->coder_ret_mode); + } + else if(strcmp(list_get_str(argv,1),"slave_addr_start")==0) + { + char *str=list_get_str(argv,2); + spar->slave_addr_start=str_atoi(str); + cmd_print("slave addr start: %d",spar->slave_addr_start); + } else{ cmd_print("unknown cmd for sysset."); print_sys_help(); diff --git a/source/prebuild.py b/source/prebuild.py index 5837c1b..ba5f379 100644 --- a/source/prebuild.py +++ b/source/prebuild.py @@ -126,6 +126,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("\n\n\n\n\n\n\n#endif\n") diff --git a/source/rt_thread/board.h b/source/rt_thread/board.h index f95af8f..b3c45e5 100644 --- a/source/rt_thread/board.h +++ b/source/rt_thread/board.h @@ -16,7 +16,7 @@ struct dev_struct{ typedef struct __uart_def{ const char *name; - int (*init)(struct __uart_def *u); + int (*init)(struct __uart_def *u,int bsp); int (*deinit)(struct __uart_def *u); int (*set_irq)(struct __uart_def *u,void (*irq)(void *t,uint8_t d),void *t); int (*set_end_irq)(struct __uart_def *u,uint8_t *rx_buff,int rx_buff_size, diff --git a/source/task/prot_mcu.c b/source/task/prot_mcu.c index f95481a..9972954 100644 --- a/source/task/prot_mcu.c +++ b/source/task/prot_mcu.c @@ -317,7 +317,7 @@ protm_def *protm_creat(uart_def *uart,int *addrs,int num) sprintf(name,"protm_t#%d",count); rt_thread_t rt_t=rt_thread_create(name,protm_run,p,2048,5+count,20); rt_thread_startup(rt_t); - p->uart->init(p->uart); + p->uart->init(p->uart,0); //p->uart->set_irq(p->uart,recv_irq,p); p->uart->set_end_irq(p->uart,p->buff,RECV_BUFF_SIZE,recv_end_irq,p); diff --git a/source/task/prot_uc.c b/source/task/prot_uc.c index 12f0be6..8afc40c 100644 --- a/source/task/prot_uc.c +++ b/source/task/prot_uc.c @@ -233,7 +233,11 @@ protu_def *protu_creat(uart_def *uart) sprintf(name,"protu_t#%d",count); rt_thread_t rt_t=rt_thread_create(name,protu_run,p,2048,5,20); rt_thread_startup(rt_t); - p->uart->init(p->uart); + int bsp=sys_param()->uartbsp; + if(bsp==9600) + p->uart->init(p->uart,9600); + else + p->uart->init(p->uart,0); //p->uart->set_irq(p->uart,recv_irq,p); p->uart->set_end_irq(p->uart,p->buff,RECV_BUFF_SIZE,recv_end_irq,p); diff --git a/source/task/tcp.c b/source/task/tcp.c index 7f00302..ce8613d 100644 --- a/source/task/tcp.c +++ b/source/task/tcp.c @@ -90,7 +90,7 @@ static self_def *mytcp_init(void) -static int init(uart_def *u){ +static int init(uart_def *u,int bsp){ self_def *s=mytcp_init(); u->private_data=s; app_variable("tcp",s,0); diff --git a/source/task/tran_for_checker.c b/source/task/tran_for_checker.c index 663de09..7b0dce3 100644 --- a/source/task/tran_for_checker.c +++ b/source/task/tran_for_checker.c @@ -7,7 +7,8 @@ #include "tcp.h" #include "prot_uc.h" #include "handle_for_checker.h" - +#include "compiler_info.h" +#include "dev_backup.h" @@ -95,30 +96,266 @@ static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data) +__packed +typedef struct{ + char build_time[20]; + char softverion[8]; + int runtime; + uint8_t wdog; + char devicetype[12]; + uint8_t localip[4]; + uint8_t hostip[4]; + uint16_t hostport; + uint8_t localid; + uint32_t schemeid; + uint32_t slave_online; +}local_bootinfo; +typedef struct{ + ucport_def u; + void (*doexert)(ucport_def *u); + uint8_t ack_num; + uint8_t slave_num; + uint8_t end_cmd; + int ack_size; + uint8_t ack[0]; +}bootinfo_def; - - -static ucport_def *bootinfo(tran_def *t,uint8_t cmd,array_def *data) +// 检测完成 +static void bootinfo_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_str) { - return 0; + bootinfo_def *w=(bootinfo_def *)u; + uint8_t addr=port_get_addr(src); + if(addr<=0||addr>w->slave_num){ + DBG_WARN("addr err:%d",addr); + return; + } + + uint8_t *d=&w->ack[sizeof(local_bootinfo)+sizeof(bootinfo_data)*(addr-1)]; + if(data){ + memcpy(d,data,sizeof(bootinfo_data)); + } + w->ack_num++; + if(w->ack_num>=w->slave_num) + { + array_def *a=arr_creat(); + arr_append(a,0); + arr_appends(a,w->ack,w->ack_size); + emit tran_send_signal(w->u.p,w->end_cmd,arr_temp(a)); + tran_set_busy(w->u.p,0); + } +} + + +static void bootinfo_del(ucport_def *u) +{ + free(u); +} + + +// 填充本机自检信息 +static void bootinfo_fill_local(uint8_t *d) +{ + int tick=rt_tick_get()/1000; + uint8_t wdog=bk_wdog_fun()?1:0; + tran_def *t=app_variable("tran",0,0); + uint32_t temp32=0; + uint16_t temp16=0; + uint8_t temp8=0; + memcpy(d,BUILD_DATE,strlen(BUILD_DATE)+1);d+=20; + memcpy(d,SOFT_VERSION,strlen(SOFT_VERSION)+1);d+=8; + memcpy(d,&tick,4);d+=4; + memcpy(d,&wdog,1);d+=1; + memcpy(d,sys_param()->device_type,12);d+=12; + memcpy(d,sys_param()->local_ip,4);d+=4; + memcpy(d,sys_param()->host_ip,4);d+=4; + temp16=sys_param()->host_port; + memcpy(d,&temp16,2);d+=2; + temp8=sys_param()->local_id; + memcpy(d,&temp8,1);d+=1; + temp32=check_scheme()->plan_id; + memcpy(d,&temp32,4);d+=4; + if(t){ + uint32_t temp32=tran_get_slave_online(t); + memcpy(d,&temp32,4);d+=4; + }else + { + memset(d,0,4);d+=4; + } + } +static ucport_def *bootinfo_self(tran_def *t, int slave_num,uint8_t cmd,array_def *data) +{ + int return_size=sizeof(local_bootinfo)+sizeof(bootinfo_data)*slave_num; + bootinfo_def *u=calloc(1,sizeof(bootinfo_def)+return_size); + u->ack_size=return_size; + u->slave_num=slave_num; + u->u.p=t; + u->u.del=bootinfo_del; + u->u.doend=bootinfo_end; + tran_set_busy(t,1); + bootinfo_fill_local(u->ack); + for(int i=0;iu.p,i); + // 这里打开检测 + if(mcu){ + port_start(mcu,bootinfo_creat()); + } + } + + 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_coder(tran_def *t,uint8_t cmd,array_def *data) +{ + // 对于赋码仪,从机个数为10 + bootinfo_def *u=(bootinfo_def *)bootinfo_self(t,10,cmd,data); + u->end_cmd=0x84; + + return (ucport_def *)u; +} + + +static ucport_def *bootinfo_checker(tran_def *t,uint8_t cmd,array_def *data) +{ + // 对于批检仪,从机个数为20 + bootinfo_def *u=(bootinfo_def *)bootinfo_self(t,20,cmd,data); + u->end_cmd=0x35; + + return (ucport_def *)u; +} + + + transmit_export(ym_checker,0x30,check) -transmit_export(ym_checker,0x34,bootinfo) +transmit_export(ym_checker,0x34,bootinfo_checker) +transmit_export(ym_checker,0x04,bootinfo_coder) + + + +__packed +typedef struct{ + char devicetype[12]; + char hostif[8]; + uint8_t localip[4]; + uint8_t hostip[4]; + uint16_t hostport; + uint8_t localid; + int uartbsp; + uint8_t coder_return_mode; + uint8_t slave_addr_start; +}paraminfo_def; +typedef struct{ + ucport_def u; + paraminfo_def par; +}param_def; + +static void param_del(ucport_def *u) +{ + free(u); +} + + +// 填充配置项 +static void paraminfo_fill(paraminfo_def *p) +{ + memcpy(p->devicetype,sys_param()->device_type,12); + memcpy(p->hostif,sys_param()->host_if,8); + memcpy(p->localip,sys_param()->local_ip,4); + memcpy(p->hostip,sys_param()->host_ip,4); + p->hostport=sys_param()->host_port; + p->localid=sys_param()->local_id; + p->uartbsp=sys_param()->uartbsp; + p->coder_return_mode=sys_param()->coder_ret_mode; + p->slave_addr_start=sys_param()->slave_addr_start; +} + + +// 保存配置项 +static void paraminfo_save(paraminfo_def *p) +{ + sys_param_def *spar=0; + spar=calloc(1,sizeof(sys_param_def)); + memcpy(spar,sys_param(),sizeof(sys_param_def)); + + memcpy(spar->device_type,p->devicetype,12); + memcpy(spar->host_if,p->hostif,8); + memcpy(spar->local_ip,p->localip,4); + memcpy(spar->host_ip,p->hostip,4); + spar->host_port=p->hostport; + spar->local_id=p->localid; + spar->uartbsp=p->uartbsp; + spar->coder_ret_mode=p->coder_return_mode; + spar->slave_addr_start=p->slave_addr_start; + flash_save_param(spar); +} + + +static ucport_def *param(tran_def *t, uint8_t cmd,array_def *data) +{ + if(arr_length(data)<1){ + DBG_WARN("cmd format err."); + return 0; + } + param_def *u=calloc(1,sizeof(param_def)); + u->u.p=t; + u->u.del=param_del; + + uint8_t op=arr_get(data,0); + // 1是写,0是读 + if(op==0) + { + paraminfo_fill(&u->par); + uint8_t *d=(uint8_t *)(&u->par); + array_def *a=arr_creat(); + arr_append(a,0); + arr_appends(a,d,sizeof(paraminfo_def)); + emit tran_reply_signal(u->u.p,arr_temp(a)); + }else if(op==1) + { + array_def *a=arr_creat(); + if(arr_length(data)<1+sizeof(paraminfo_def)){ + arr_append(a,1); + emit tran_reply_signal(u->u.p,arr_temp(a)); + }else{ + memcpy(&u->par,arr_data(data)+1,sizeof(paraminfo_def)); + paraminfo_save(&u->par); + arr_append(a,0); + emit tran_reply_signal(u->u.p,arr_temp(a)); + } + paraminfo_save(&u->par); + + } + + return (ucport_def *)u; +} + + +transmit_export(ym_checker,0x08,param) + + + diff --git a/source/task/tran_for_coder2.c b/source/task/tran_for_coder2.c index ff36ab3..5a77ab2 100644 --- a/source/task/tran_for_coder2.c +++ b/source/task/tran_for_coder2.c @@ -16,6 +16,15 @@ +// 从机地址偏移 +static inline int slave_addr_off(void) +{ + if(sys_param()->slave_addr_start) + return 1; + else + return 0; +} + typedef struct{ @@ -44,18 +53,35 @@ static void write_uid_end(ucport_def *u,port_mcu *src,void *data,int ack,char *e DBG_WARN("addr err:%d",addr); return; } - uint8_t *d=&w->ack[(addr-1)*39]; + addr-=1; + + uint8_t *d=&w->ack[(addr)*39]; w->ack_num++; - d[0]=addr-1; + d[0]=addr+slave_addr_off(); d[1]=ack; - memcpy(&d[2],w->item[addr-1].shell_code,13); - memcpy(&d[2+13],w->item[addr-1].uid_code,16); - memcpy(&d[2+13+16],w->item[addr-1].password,8); + memcpy(&d[2],w->item[addr].shell_code,13); + memcpy(&d[2+13],w->item[addr].uid_code,16); + memcpy(&d[2+13+16],w->item[addr].password,8); if(w->ack_num>=10) { array_def *a=arr_creat(); arr_append(a,w->addrs_num); - arr_appends(a,w->ack,390); + // arr_appends(a,w->ack,390); + for(int i=0;i<10;i++) + { + uint8_t *d=&w->ack[i*39]; + if(sys_param()->coder_ret_mode) + { + // 完整模式 + arr_appends(a,d,39); + } + else{ + // 精简模式 + arr_appends(a,d,2); + d+=2+13+16; + arr_appends(a,d,8); + } + } emit tran_send_signal(w->u.p,0x82,arr_temp(a)); tran_set_busy(w->u.p,0); } @@ -72,7 +98,7 @@ static void write_uid_return_ok(void *p) arr_append(a,u->addrs_num); for(int i=0;i<10;i++) { - arr_append(a,i); + arr_append(a,i+slave_addr_off()); arr_append(a,0); arr_append_num(a,37,'0'); } @@ -125,7 +151,7 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data) // 默认失败 for(int i=0;i<10;i++) { - u->ack[i*39+0]=i; + u->ack[i*39+0]=i+slave_addr_off(); u->ack[i*39+1]=1; } tran_set_busy(t,1); @@ -165,19 +191,15 @@ static void write_uid2_end(ucport_def *u,port_mcu *src,void *data,int ack,char * DBG_WARN("addr err:%d",addr); return; } - uint8_t *d=&w->ack[(addr-1)*39]; + addr-=1; + + uint8_t *d=&w->ack[(addr)*39]; w->ack_num++; - d[0]=addr-1; + d[0]=addr+slave_addr_off(); d[1]=ack; - if(ack==0) - { - memcpy(&d[2],w->item[addr-1].shell_code,13); - memcpy(&d[2+13],w->item[addr-1].uid_code,16); - memcpy(&d[2+13+16],w->item[addr-1].password,8); - }else{ - // 失败的数据全部填充'0' - memset(&d[2],'0',37); - } + memcpy(&d[2],w->item[addr].shell_code,13); + memcpy(&d[2+13],w->item[addr].uid_code,16); + memcpy(&d[2+13+16],w->item[addr].password,8); if(w->ack_num>=10) { array_def *a=arr_creat(); @@ -233,8 +255,10 @@ static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_s DBG_WARN("addr err:%d",addr); return; } - uint8_t *ack_d=&w->ack[(addr-1)*6]; - ack_d[0]=addr-1; + addr-=1; + + uint8_t *ack_d=&w->ack[(addr)*6]; + ack_d[0]=addr+slave_addr_off(); ack_d[1]=ack; // TODO: 还有4字节数据 @@ -260,7 +284,7 @@ static void check_return_ok(void *p) arr_append(a,u->type); // 固定返回6*10个字节,如果不检测某通道,则该通道填充占位符 for(int i=0;i<10;i++){ - arr_append(a,i); + arr_append(a,i+slave_addr_off()); arr_append(a,0);// 成功 arr_append_num(a,4,0); } @@ -291,7 +315,7 @@ static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data) // 默认失败 for(int i=0;i<10;i++) { - u->ack[i*6+0]=i; + u->ack[i*6+0]=i+slave_addr_off(); u->ack[i*6+1]=1; } tran_set_busy(t,1);