实现赋码仪命令

升级小板程序失败时停止
This commit is contained in:
ranchuan
2023-12-21 18:51:58 +08:00
parent af964ad733
commit d1e617afd3
22 changed files with 1291 additions and 43 deletions

View File

@@ -1,8 +1,10 @@
#include "cmd_coder.h"
#include "QDebug"
#include "elec/elec_judge.h"
#include "elec/coder_lib.h"
#include "elec/JQ_PSDGenerate.h"
#include "elec/JQ_UIDGenerate.h"
#include "elec/PSDGenerate.h"
@@ -47,6 +49,8 @@ static const task_def g_ew_task_table[]={
{"读MTP",35,5,2,8},
{"写MTP",36,5,10,0},
{"设置电阻校准值",37,1,1,0},
{"读取流水号",38,5,2,2},
{"写入流水号",39,5,2,0},
{nullptr,0,0,0,0},
};
@@ -100,6 +104,8 @@ static const task_def g_jq_task_table[]={
{"配置三码数据到小板",41,1,10,0},
{"任务插槽",42,1,1,0},
{"设置电阻校准值",43,1,1,0},
{"写入流水号",44,5,2,0},
{"读取流水号",45,5,2,2},
{nullptr,0,0,0,0},
};
@@ -123,8 +129,13 @@ const task_def *coder_find_task(const char *str)
{
int chip=elec_extract_chip(check_plan()->get_plan_id());
const task_def *table=nullptr;
qDebug("find task in ext_table.");
table=g_ext_task_table;
for(int i=0;i<100;i++){
if(table[i].name==nullptr){
break;
}
if(qstrcmp(str,table[i].name)==0){
return &table[i];
}
@@ -132,14 +143,20 @@ const task_def *coder_find_task(const char *str)
table=nullptr;
if(chip==0){
table=g_jq_task_table;
qDebug("find task in jq_table.");
}else if(chip==2){
table=g_ew_task_table;
qDebug("find task in ew_table.");
}
if(table==nullptr){
return nullptr;
}
for(int i=0;i<100;i++){
if(table[i].name==nullptr){
break;
}
if(qstrcmp(str,table[i].name)==0){
qDebug("find task index=%d.",i);
return &table[i];
}
}
@@ -167,7 +184,11 @@ int coder_add_task(myarray &d,const char *name,int slot_index,int task_index,uin
const task_def *task=nullptr;
task=coder_find_task(name);
if(task==nullptr){
qWarning("can not find task with %s.",name);
return -1;
}else{
qDebug("task_name:%s,task_id=%d,par_count=%d,ret_count=%d,err=%d",name,task->task_id,
task->par_count,task->ret_count,task->errcode);
}
char *par=(char *)params;
d.append(uint8_t(slot_index));
@@ -176,7 +197,9 @@ int coder_add_task(myarray &d,const char *name,int slot_index,int task_index,uin
d.append(uint8_t(task->ret_count));
d.append(uint8_t(task->errcode));
d.append(uint8_t(task_index));
d.append(par,task->par_count*2);
if(task->par_count*2>0){
d.append(par,task->par_count*2);
}
return 0;
}
@@ -192,6 +215,18 @@ int coder_slave_pack(myarray &d,int addr)
}
// 找到指定任务序号的数据
myarray coder_slave_find_ret_data(myarray data,int task_index)
{
for(int i=0;i<data.size();)
{
if(data[i]==task_index){
return data.mid(i+2,data[i+1]);
}
i+=2+data[i+1];
}
return myarray();
}
@@ -199,8 +234,6 @@ int coder_slave_pack(myarray &d,int addr)
// 检测任务需要读取模块工厂信息
myarray cmd_coder_check::cmd_pc_to_slave(myarray data)
{
myarray d;
@@ -220,7 +253,11 @@ myarray cmd_coder_check::ret_slave_to_pc(QList<myarray> data)
myarray &sdata=data[i];
int addr=i+syscfg()->slave_addr_start;
r.append(uint8_t(addr));
r.append(sdata[0]);
if(sdata.size()>0){
r.append(sdata[0]);
}else{
r.append(uint8_t(0xd0));
}
r.append(4,uint8_t(0));
}
return r;
@@ -274,7 +311,21 @@ myarray cmd_coder_check2::ret_slave_to_pc(QList<myarray> data)
r.append(uint8_t(coder_chip_type()));
for (int i=0;i<data.size();i++)
{
myarray &sdata=data[i];
int addr=i+syscfg()->slave_addr_start;
myarray sret=coder_slave_find_ret_data(sdata.mid(1),1);
r.append(uint8_t(addr));
if(sdata.size()==0){
r.append(uint8_t(0xd0));
r.append(8,uint8_t(0));
}else{
r.append(sdata[0]);
if(sret.size()<4){
sret.append(4-sret.size(),uint8_t(0));
}
r.append(sret.left(4));
r.append(4,uint8_t(0));
}
}
return r;
}
@@ -300,31 +351,73 @@ myarray cmd_coder_code::cmd_pc_to_slave(myarray data)
myarray ret;
const task_def *table=nullptr;
uint16_t params[10]={0};
chip_mode=elec_extract_chip(check_plan()->get_plan_id());
char year[10]={0};
memcpy(year,data.mid(1,4).data(),4);
qDebug("tran pc data to slave");
for (int i=0;i<addrs;i++){
myarray d;
uid_code uid={{0},{0},{0},{0}};
memcpy(uid.shell,data.mid(5+i*14+1,13).data(),13);
if(check_shell_code(uid.shell)==1){
// 只有管壳码验证通过时才计算uid和密码
if(chip_mode!=0){
coder_shell_to_uid(year,uid.shell,uid.uid);
// 生成存储码
coder_uid_to_save(uid.uid,(uint8_t *)uid.uid_psw);
// 生成密码
GetPasswordByUidCode((uint8_t *)uid.uid,(uint8_t *)&uid.uid_psw[8]);
// 生成密码字符串
sprintf(uid.psw,"%02X%02X%02X%02X",uid.uid_psw[8],
uid.uid_psw[9],uid.uid_psw[10],uid.uid_psw[11]);
}else{
coder_shell_to_uid_jq(year,uid.shell,uid.uid);
// 生成存储码
UidCode_YM2JQ((PST_JQUID_TYPEDEF)uid.uid_psw,(PST_YMUID_TYPEDEF)uid.uid);
// 生成密码
JQ_GetPasswordByUidCode((uint8_t *)uid.uid,(uint8_t *)&uid.uid_psw[8]);
// 生成密码字符串
sprintf(uid.psw,"%02X%02X%02X%02X",uid.uid_psw[11],
uid.uid_psw[10],uid.uid_psw[9],uid.uid_psw[8]);
}
}
uid_codes.append(uid);
params[0]=(8)|(4<<8);
memcpy(&params[1],uid.uid_psw,12);
coder_add_task(d,"配置三码数据到小板",1,1,params);
coder_add_task(d,"写入三码数据",1,2,params);
coder_add_task(d,"验证三码数据",2,3,params);
// coder_add_task(d,"写入三码数据",1,2,params);
// coder_add_task(d,"验证三码数据",2,3,params);
coder_slave_pack(d,i+1);
ret+=d;
}
// 检测模式1,返回异常代码和任务插槽数据
d.insert(0,uint8_t(1));
return d;
ret.insert(0,uint8_t(1));
qDebug("tran pc data to slave end");
return ret;
}
// 把从机回复的数据转化为上位机能理解的格式
myarray cmd_coder_code::ret_slave_to_pc(QList<myarray> data)
{
myarray r;
r.append(uint8_t(addrs&0xff));
r.append(uint8_t((addrs>>8)&0xff));
r.append(uint8_t((addrs>>16)&0xff));
r.append(uint8_t(coder_chip_type()));
r.append(uint8_t(addrs));
for (int i=0;i<data.size();i++)
{
myarray &sdata=data[i];
int addr=i+syscfg()->slave_addr_start;
r.append(uint8_t(addr));
if(sdata.size()>0){
r.append(sdata[0]);
}else{
r.append(uint8_t(0xd0));
}
r.append(uid_codes[i].shell,13);
if(chip_mode==0){
r.append(uid_codes[i].uid,15);
}else{
r.append(uid_codes[i].uid,16);
}
r.append(uid_codes[i].psw,8);
}
return r;
}
@@ -383,5 +476,50 @@ protpc_export(0x41, get_coder_setrtv);
// 批检仪检测并写入流水号
myarray cmd_checker_check::cmd_pc_to_slave(myarray data)
{
myarray ret;
const task_def *table=nullptr;
uint16_t params[10]={0};
int len=data.size();
for(int i=0;i<len;i+=5){
myarray d;
params[0]=data[i+1]|(data[i+2]<<8);
params[1]=data[i+3]|(data[i+4]<<8);
coder_add_task(d,"写入流水号",1,1,params);
coder_add_task(d,"读取流水号",2,2,params);
coder_slave_pack(d,data[i]);
ret+=d;
}
// 检测模式0,返回原始检测结果
ret.insert(0,uint8_t(0));
return ret;
}
// 把从机回复的数据转化为上位机能理解的格式
myarray cmd_checker_check::ret_slave_to_pc(QList<myarray> data)
{
myarray r;
r.append(char(0));
for(int i=0;i<data.size();i++){
r.append(tran_slave_to_selfdev_check(data[i]));
}
return r;
}
static HandlePc *get_checker_check(){
return new cmd_checker_check();
}
protpc_export(0x48, get_checker_check);

View File

@@ -157,7 +157,12 @@ protected:
typedef struct{
char shell[20];
char uid[20];
char psw[20];
char uid_psw[20];
}uid_code;
// 赋码仪赋码命令
@@ -204,6 +209,8 @@ public:
myarray ret_slave_to_pc(QList<myarray> data);
protected:
int addrs;
int chip_mode;
QList<uid_code> uid_codes;
};
@@ -262,6 +269,56 @@ protected:
// 批检仪检测并设置模块流水号
class cmd_checker_check : public selfdev_runtask
{
Q_OBJECT
public:
cmd_checker_check():selfdev_runtask(){
}
// pc指令转从机
myarray cmd_pc_to_slave(myarray data);
// pc指令生成从机列表
QList<int> cmd_pc_to_addrs(myarray data){
QList<int> addr_list;
addrs=0;
int len=data.size();
for(int i=0;i<len;i+=5){
addr_list.append(data[i]);
addrs|=1<<(data[i]-1);
}
return addr_list;
}
// 从机发起命令
int cmd_slave(){
return 0x20;
}
// pc收到回复,返回0不回复
int cmd_pc_recv(){
return 0x48;
}
// 生成接收回复到pc
myarray cmd_pc_recv_to_pc(){
myarray r;
r.append(uint8_t(0));
return r;
}
// pc回复命令,返回0不回复
int cmd_pc_ret(){
return 0x31;
}
// 从机返回转pc
myarray ret_slave_to_pc(QList<myarray> data);
protected:
int addrs;
int mode;
};
#endif // CMD_CODER_H

View File

@@ -117,7 +117,7 @@ void selfdev_check::timeout()
}
// 把小板的返回数据转化为自研批检仪上位机的格式
static myarray tran_slave_to_selfdev_check(myarray &data)
myarray tran_slave_to_selfdev_check(myarray &data)
{
check_cfg *ccfg_=check_plan();
// 返回值个数
@@ -126,13 +126,14 @@ static myarray tran_slave_to_selfdev_check(myarray &data)
int paramerr_num=(return_num+7)/8;
// 每个通道占用的长度
int len_for_each=1+8+paramerr_num+return_num*2;
// 去掉应答位
data.remove(0,1);
myarray r;
if(data.size()<17){
// 无返回则填充为异常
r.append(char(208));
r.append((len_for_each-1),char(0xff));
}else{
// 去掉应答位
data.remove(0,1);
myarray paramerr=ccfg_->returns_to_paramerr(data.right(return_num*2));
r=data.left(8)+paramerr+data.right(return_num*2);
uint8_t marerr=0,suberr=0;
@@ -818,8 +819,8 @@ int selfdev_runtask::dolater(int cmd, myarray data)
mycfg *cfg_=syscfg();
busy=1;
// 这里开始检测
qDebug("set_rescv.");
emit send_data_signal(cmd,myarray(1,0));
qDebug("runtask.");
// emit send_data_signal(cmd,myarray(1,0));
HandleBoardCast *b=new slave_cmd();
addrs=cmd_pc_to_addrs(data);
bool ack=slave->set_boardcast_handle(addrs,b);
@@ -868,3 +869,179 @@ void selfdev_runtask::slave_end_slot(int addr,int ack, slave_data data)
#pragma pack(1)
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;
#pragma pack()
static void ip_fill(QString str,uint8_t *ip){
QStringList snums = str.split('.');
for(int i=0;i<snums.size();i++){
ip[i]=snums[i].toInt(nullptr, 10);
}
}
// 填充配置项
static void paraminfo_fill(paraminfo_def *p)
{
mycfg *cfg_=syscfg();
memcpy(p->devicetype,cfg_->device_type.toLocal8Bit(),cfg_->device_type.size()+1);
if(cfg_->tcp_enable==true){
memcpy(p->hostif,"utcp",5);
}else{
memcpy(p->hostif,"uart4",6);
}
ip_fill(cfg_->local_ip,p->localip);
ip_fill(cfg_->server_ip,p->hostip);
p->hostport=cfg_->server_port;
p->localid=cfg_->local_id;
p->uartbsp=cfg_->uart_bsp;
p->coder_return_mode=cfg_->coder_return_mode;
p->slave_addr_start=cfg_->slave_addr_start;
}
// 保存配置项
static int paraminfo_save(paraminfo_def *p)
{
int ret=0;
mycfg *cfg_=syscfg();
uint8_t ip_zero[4]={0,0,0,0};
if(strcmp("coder",p->devicetype)==0||strcmp("checker",p->devicetype)==0)
cfg_->device_type=QString(p->devicetype);
else {
qWarning()<<"devicetype param must be \"coder\" or \"checker\"."<<p->devicetype;
ret=1;return ret;}
if(strcmp("utcp",p->hostif)==0){
cfg_->tcp_enable=true;
}else{
cfg_->tcp_enable=false;
}
if(memcmp(p->localip,ip_zero,4)!=0){
cfg_->local_ip=QString("%1.%2.%3.%4").arg(p->localip[0]).arg(p->localip[1]).arg(p->localip[2]).arg(p->localip[3]);
}else {
qWarning()<<"localip param must not be all zero";
ret=3;return ret;}
if(memcmp(p->hostip,ip_zero,4)!=0){
cfg_->server_ip=QString("%1.%2.%3.%4").arg(p->hostip[0]).arg(p->hostip[1]).arg(p->hostip[2]).arg(p->hostip[3]);
}else {
qWarning()<<"hostip param must not be all zero";
ret=4;return ret;}
cfg_->server_port=p->hostport;
cfg_->local_id=p->localid;
if(p->uartbsp==115200||p->uartbsp==9600)
cfg_->uart_bsp=p->uartbsp;
else {
qWarning()<<"uartbsp param must be 115200 or 9600";
ret=5;return ret;}
if(p->coder_return_mode==0||p->coder_return_mode==1)
cfg_->coder_return_mode=p->coder_return_mode;
else {
qWarning()<<"coder_return_mode param must be 0 or 1";
ret=6;return ret;}
if(p->slave_addr_start==0||p->slave_addr_start==1)
cfg_->slave_addr_start=p->slave_addr_start;
else {
qWarning()<<"slave_addr_start param must be 0 or 1";
ret=7;return ret;}
cfg_->save();
return ret;
}
// 赋码仪配置参数
int coder_sysparam::dolater(int cmd, myarray data)
{
uint8_t op=data[1];
paraminfo_def par={{0},{0},{0},{0},{0},{0},{0},{0},{0}};
// 1是写,0是读
if(op==0)
{
paraminfo_fill(&par);
uint8_t *d=(uint8_t *)(&par);
QByteArray arr;
// 赋码仪添加通道数
arr.append(data[0]);
// 赋码仪添加读写位
arr.append(op);
arr.append(uint8_t(0));
QByteArray temp=QByteArray::fromRawData((const char *)d,sizeof(paraminfo_def));
arr.append(temp);
emit send_data_signal(cmd,arr);
}else if(op==1)
{
QByteArray arr;
// 赋码仪添加通道数
arr.append(data[0]);
// 赋码仪添加读写位
arr.append(op);
if(data.size()<1+1+sizeof(paraminfo_def)){
arr.append(uint8_t(0xff));
emit send_data_signal(cmd,arr);
}else{
qDebug()<<"param:"<<data.toHex(' ')<<endl;
memcpy(&par,data.data()+1+1,sizeof(paraminfo_def));
int ret=paraminfo_save(&par);
arr.append(uint8_t(ret));
emit send_data_signal(cmd,arr);
}
}
return 0;
}
void coder_sysparam::timeout()
{
}
static HandlePc *get_coder_sysparam(){
return new coder_sysparam();
}
protpc_export(0x08, get_coder_sysparam);
void coder_bootinfo::slave_end_slot(int addr,int ack, slave_data data)
{
qDebug("selfdev get bootinfo end.");
myarray r;
r.append(uint8_t(syscfg()->slave_num));
r.append(char(0));
r+=bootinfo_fill_local();
for(int i=0;i<data.size();i++){
slave_ret slave=data.at(i);
slave_acked.replace(slave.addr-1,slave.data);
slave_acked_num++;
}
for(int i=0;i<slave_acked.size();i++){
r.append(slave_to_bootinfo_byte(slave_acked[i]));
}
emit send_data_signal(0x84,r);
busy=0;
}
static HandlePc *get_coder_bootinfo(){
return new coder_bootinfo();
}
protpc_export(0x04, get_coder_bootinfo);

View File

@@ -6,6 +6,11 @@
#include "prot_cmd/cmd_slave.h"
// 把小板的返回数据转化为自研批检仪上位机的格式
myarray tran_slave_to_selfdev_check(myarray &data);
// 检测 自研批检仪
class selfdev_check : public HandlePc
{
@@ -182,7 +187,7 @@ public:
int dolater(int cmd, myarray data);
void timeout();
public slots:
void slave_end_slot(int addr,int ack, slave_data data);
virtual void slave_end_slot(int addr,int ack, slave_data data);
protected:
QList<myarray> slave_acked;
int slave_acked_num;
@@ -294,6 +299,35 @@ signals:
// 赋码仪配置参数
class coder_sysparam : public HandlePc
{
Q_OBJECT
public:
coder_sysparam() : HandlePc() {
}
~coder_sysparam() {
}
int dolater(int cmd, myarray data);
void timeout();
};
// 赋码仪基本信息
class coder_bootinfo : public selfdev_bootinfo
{
Q_OBJECT
public:
coder_bootinfo() : selfdev_bootinfo() {
}
~coder_bootinfo() {
}
void slave_end_slot(int addr,int ack, slave_data data);
};

View File

@@ -280,6 +280,16 @@ int boardcast_updata::start(myarray data)
int boardcast_updata::dolater(int cmd, myarray data)
{
for(int i=0;i<ret_data.size();i++){
if(ret_data[i][0]!=0){
timeout_stop();
timeout_stop_retry();
qDebug("slave updata failed.");
end(1,ret_data);
busy=0;
return -1;
}
}
timeout_start(5000);
if(step==0){
if(send_packet()==true){
@@ -483,7 +493,11 @@ int slave_cmd::start(myarray data)
end(0,ret_data);
return 0;
}
// timeout=check_plan()->get_check_time_out()*1000;
step=0;
// 执行模式不为3时使用方案中的超时时间
if(data[0]!=3){
timeout=check_plan()->get_check_time_out()*1000;
}
qDebug("addr %d start ,timeout=%d",addr,timeout);
this->data=data;
send_pack_num=0;
@@ -531,10 +545,17 @@ int slave_cmd::dolater(int cmd, myarray data)
timeout_stop_retry();
if(cmd==this->cmd){
if(send_next()==true){
qDebug("cmd end success.");
busy=0;
end(0,ret_data);
timeout_stop();
if(step==0){
qDebug("cmd send success.");
step=1;
addr_response=0;
ret_data.clear();
}else{
qDebug("cmd end success.");
busy=0;
end(0,ret_data);
timeout_stop();
}
}
}else{
qWarning("cmd:%02x err.",cmd);

View File

@@ -153,6 +153,7 @@ public:
slave_cmd():HandleBoardCast(){
send_bytes=0;
send_pack_num=0;
step=0;
}
int start(myarray data);
int dolater(int cmd, myarray data);
@@ -162,6 +163,7 @@ protected:
int send_bytes;
int send_pack_num;
myarray data;
int step;
};