添加读取电机步数命令

添加新赋码仪检测命令,赋码仪注码命令
  添加检测并写入流水号命令
This commit is contained in:
ranchuan
2023-12-22 19:07:05 +08:00
parent d1e617afd3
commit 8558857fd4
12 changed files with 324 additions and 39 deletions

View File

@@ -25,4 +25,7 @@
2023.12.21
实现赋码仪命令
升级小板程序失败时停止
2023.12.22
添加读取电机步数命令
添加新赋码仪检测命令,赋码仪注码命令
添加检测并写入流水号命令

View File

@@ -89,7 +89,7 @@ void print_to_console(QtMsgType type, const QMessageLogContext &context, const Q
QString current_date_time = QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
Q_UNUSED(current_date_time);
if(context.file!=0){
fprintf(stderr, "%s | %s | %s:%u | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), &context.file[20], context.line, localMsg.constData());
fprintf(stderr, "%s | %s | %s:%u | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), &context.file[10], context.line, localMsg.constData());
}else{
fprintf(stderr,"%s | %s | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), localMsg.constData());
}
@@ -105,7 +105,7 @@ void print_to_file(QtMsgType type, const QMessageLogContext &context, const QStr
{
QTextStream tWrite(g_debug.file);
if(context.file!=0){
tWrite << QString::asprintf("%s | %s | %s:%u | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), &context.file[20], context.line, localMsg.constData());
tWrite << QString::asprintf("%s | %s | %s:%u | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), &context.file[10], context.line, localMsg.constData());
}else{
tWrite << QString::asprintf("%s | %s | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), localMsg.constData());
}

View File

@@ -98,4 +98,6 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
DISTFILES += \
ReadMe.txt \
ReadMe.txt
ReadMe.txt \
info.json \
info.json

View File

@@ -6,7 +6,7 @@
#define BUILD_DATE "2023-12-21 18:29:22"
#define BUILD_DATE "2023-12-22 18:08:01"

View File

@@ -392,7 +392,7 @@ int elec_extract_chip(int id)
// 找到异常代码序号
int elec_report_err(elec_judge_def *e)
{
static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,9,20,0};
static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,9,10,20,0};
uint8_t index=0;
for (int i=0;i<sizeof(pro_table);i++){
for(int j=0;j<ERR_LIST_LEN;j++){

View File

@@ -1,10 +1,10 @@
{
"build_date": "2023-12-21 18:29:22",
"build_date": "2023-12-22 18:08:01",
"hard_version": "MHPZ2_V1.00",
"private": [
"info.json",
"json.lua",
"prints.lua"
],
"soft_version": "V2.00"
"soft_version": "V2.01"
}

View File

@@ -291,7 +291,7 @@ private:
emit send_data_signal(0x1f,cmd,s);
// timer_retry_->start(300);
//emit timeout_start_retry_signal(300);
timeout_start_retry_cb(1000);
timeout_start_retry_cb(2000);
}else{
// timer_retry_->stop();
timeout_stop_retry();

View File

@@ -51,6 +51,7 @@ static const task_def g_ew_task_table[]={
{"设置电阻校准值",37,1,1,0},
{"读取流水号",38,5,2,2},
{"写入流水号",39,5,2,0},
{"写固定延时",40,5,1,0},
{nullptr,0,0,0,0},
};
@@ -106,6 +107,7 @@ static const task_def g_jq_task_table[]={
{"设置电阻校准值",43,1,1,0},
{"写入流水号",44,5,2,0},
{"读取流水号",45,5,2,2},
{"写固定延时",46,5,1,0},
{nullptr,0,0,0,0},
};
@@ -216,16 +218,24 @@ int coder_slave_pack(myarray &d,int addr)
// 找到指定任务序号的数据
myarray coder_slave_find_ret_data(myarray data,int task_index)
myarray coder_slave_find_ret_data(myarray data,int task_index,int size)
{
myarray r;
for(int i=0;i<data.size();)
{
if(data[i]==task_index){
return data.mid(i+2,data[i+1]);
r=data.mid(i+2,data[i+1]);
break;
}
i+=2+data[i+1];
}
return myarray();
if(r.size()>=size){
r=r.left(size);
}else{
int len=size-r.size();
r.append(len,uint8_t(0));
}
return r;
}
@@ -251,7 +261,8 @@ myarray cmd_coder_check::ret_slave_to_pc(QList<myarray> data)
for (int i=0;i<data.size();i++)
{
myarray &sdata=data[i];
int addr=i+syscfg()->slave_addr_start;
int addr=sdata[0]-1+syscfg()->slave_addr_start;
sdata.remove(0,1);
r.append(uint8_t(addr));
if(sdata.size()>0){
r.append(sdata[0]);
@@ -286,8 +297,8 @@ protpc_export(0x01, get_coder_check);
myarray cmd_coder_check2::cmd_pc_to_slave(myarray data)
{
myarray d;
int chip=elec_extract_chip(check_plan()->get_plan_id());
const task_def *table=nullptr;
int chip=elec_extract_chip(check_plan()->get_plan_id());
if(chip==0){
uint16_t params[10]={20,4};
coder_add_task(d,"读OTP",1,1,params);
@@ -312,18 +323,16 @@ myarray cmd_coder_check2::ret_slave_to_pc(QList<myarray> data)
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);
int addr=sdata[0]-1+syscfg()->slave_addr_start;
sdata.remove(0,1);
myarray sret=coder_slave_find_ret_data(sdata.mid(1),1,4);
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(sret);
r.append(4,uint8_t(0));
}
}
@@ -404,7 +413,8 @@ myarray cmd_coder_code::ret_slave_to_pc(QList<myarray> data)
for (int i=0;i<data.size();i++)
{
myarray &sdata=data[i];
int addr=i+syscfg()->slave_addr_start;
int addr=sdata[0]-1+syscfg()->slave_addr_start;
sdata.remove(0,1);
r.append(uint8_t(addr));
if(sdata.size()>0){
r.append(sdata[0]);
@@ -431,6 +441,122 @@ protpc_export(0x02, get_coder_code);
// 赋码任务需要写入uid
myarray cmd_coder_code2::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};
delay=data[3]|(data[4]<<8);
// 移除前4个字节使数据对齐
data.remove(0,4);
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);
params[0]=delay;
coder_add_task(d,"写固定延时",1,2,params);
coder_add_task(d,"读延时",2,3,params);
if(chip_mode==0){
uint16_t params[10]={20,4};
coder_add_task(d,"读OTP",2,4,params);
}else if(chip_mode==2){
uint16_t params[10]={9,4};
coder_add_task(d,"读MTP",2,4,params);
}
coder_slave_pack(d,i+1);
ret+=d;
}
// 检测模式1,返回异常代码和任务插槽数据
ret.insert(0,uint8_t(1));
qDebug("tran pc data to slave end");
return ret;
}
// 把从机回复的数据转化为上位机能理解的格式
myarray cmd_coder_code2::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(!syscfg()->coder_return_mode));
for (int i=0;i<data.size();i++)
{
myarray &sdata=data[i];
uint8_t err=0;
int addr=sdata[0]-1+syscfg()->slave_addr_start;
sdata.remove(0,1);
r.append(uint8_t(addr));
if(sdata.size()>0){
err=sdata[0];
}else{
err=uint8_t(0xd0);
}
// 如果延时不对,则失败
myarray sret=coder_slave_find_ret_data(sdata.mid(1),3,2);
uint16_t sdelay=sret[0]|(sret[1]<<8);
if(sdelay!=delay){
if(err==0){
err=10;
}
}
r.append(err);
// 添加工厂信息
sret=coder_slave_find_ret_data(sdata.mid(1),4,4);
r.append(sret);
// 完整模式
if(syscfg()->coder_return_mode){
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;
}
static HandlePc *get_coder_code2(){
return new cmd_coder_code2();
}
protpc_export(0x11, get_coder_code2);
@@ -476,6 +602,57 @@ protpc_export(0x41, get_coder_setrtv);
// 批检仪检测并写入流水号,控制电机需要重载此函数
int cmd_checker_check::dolater(int cmd, myarray data)
{
prot_slave *slave=protSlave();
mycfg *cfg_=syscfg();
prot_m4 *m4 = protM4();
busy=1;
connect(this, &cmd_checker_check::send_to_m4_signal, m4, &prot_m4::send_data_slot);
addrs=cmd_pc_to_addrs(data);
moter_down_cb_fun=[=](myarray str)
{
m4->del_irq_fun(moter_down_cb_fun,"moter down");
{
// 这里开始检测
qDebug("runtask.");
HandleBoardCast *b=new slave_cmd();
bool ack=slave->set_boardcast_handle(addrs,b);
if(ack==false){
qWarning("handle is busy.");
busy=0;
}else{
connect(b,&HandleBoardCast::end_signal,this,&selfdev_runtask::slave_end_slot);
// 广播设置校准值,需使用新增命令
b->cmd=cmd_slave();
b->start(cmd_pc_to_slave(data));
if(cmd_pc_recv()!=0){
emit send_data_signal(cmd_pc_recv(),cmd_pc_recv_to_pc());
}
}
}
};
myarray moter_cmd=moter_ctrl("down");
if(moter_cmd.size()==0){
busy=0;
qWarning("moter failed.");
}else{
m4->set_irq_fun(moter_down_cb_fun,"moter down");
emit send_to_m4_signal(moter_cmd);
}
slave_acked.clear();
for(int i=0;i<addrs.size();i++){
slave_acked.append(myarray());
}
slave_acked_num=0;
return 0;
}
// 批检仪检测并写入流水号
myarray cmd_checker_check::cmd_pc_to_slave(myarray data)
{
@@ -495,6 +672,7 @@ myarray cmd_checker_check::cmd_pc_to_slave(myarray data)
// 检测模式0,返回原始检测结果
ret.insert(0,uint8_t(0));
// qDebug()<<"checker check pack data:"<<ret.toHex(' ');
return ret;
}
@@ -504,7 +682,11 @@ 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]));
myarray &sdata=data[i];
int addr=sdata[0]-1+syscfg()->slave_addr_start;
sdata.remove(0,1);
qDebug()<<"checker check ret data:"<<sdata.toHex(' ');
r.append(tran_slave_to_selfdev_check(sdata));
}
return r;
}

View File

@@ -219,6 +219,62 @@ protected:
// 赋码仪新赋码命令
class cmd_coder_code2 : public selfdev_runtask
{
Q_OBJECT
public:
cmd_coder_code2():selfdev_runtask(){
delay=0;
}
// pc指令转从机
myarray cmd_pc_to_slave(myarray data);
// pc指令生成从机列表
QList<int> cmd_pc_to_addrs(myarray data){
QList<int> addr_list;
addrs=data[0]|(data[1]<<8)|(data[2]<<16);
for(int i=0;i<20;i++){
if((addrs&(1<<i))!=0){
addr_list.append(i+1);
}
}
return addr_list;
}
// 从机发起命令
int cmd_slave(){
return 0x20;
}
// pc收到回复,返回0不回复
int cmd_pc_recv(){
return 0x02;
}
// 生成接收回复到pc
myarray cmd_pc_recv_to_pc(){
myarray r;
r.append(uint8_t(addrs));
r.append(uint8_t(0));
return r;
}
// pc回复命令,返回0不回复
int cmd_pc_ret(){
return 0x82;
}
// 从机返回转pc
myarray ret_slave_to_pc(QList<myarray> data);
protected:
int addrs;
int chip_mode;
uint16_t delay;
QList<uid_code> uid_codes;
};
// 设置电阻校准值
@@ -276,16 +332,26 @@ class cmd_checker_check : public selfdev_runtask
public:
cmd_checker_check():selfdev_runtask(){
}
~cmd_checker_check(){
if(moter_down_cb_fun!=nullptr){
// 取消电机下降到位回调
prot_m4 *m4 = protM4();
if(m4!=nullptr) {
m4->del_irq_fun(moter_down_cb_fun,"moter ");
}
}
}
int dolater(int cmd, myarray data);
// pc指令转从机
myarray cmd_pc_to_slave(myarray data);
// pc指令生成从机列表
QList<int> cmd_pc_to_addrs(myarray data){
QList<int> addr_list;
addrs=0;
// addrs=0;
int len=data.size();
for(int i=0;i<len;i+=5){
addr_list.append(data[i]);
addrs|=1<<(data[i]-1);
// addrs|=1<<(data[i]-1);
}
return addr_list;
}
@@ -310,8 +376,11 @@ public:
// 从机返回转pc
myarray ret_slave_to_pc(QList<myarray> data);
protected:
int addrs;
// int addrs;
int mode;
prot_m4_cb moter_down_cb_fun;
signals:
void send_to_m4_signal(myarray data);
};

View File

@@ -277,19 +277,32 @@ int selfdev_moter::dolater(int cmd, myarray data)
prot_m4 *m4 = protM4();
mycfg *cfg_=syscfg();
connect(this, &selfdev_moter::send_to_m4_signal, m4, &prot_m4::send_data_slot);
if(data[0]==0x02){
emit send_to_m4_signal(moter_ctrl("up"));
}else if(data[0]==0x03){
emit send_to_m4_signal(moter_ctrl("down"));
}else if(data[0]==0x01){
if(data.size()>=3){
int count=(data[1])|(data[2]<<8);
cfg_->moter_count=20000+count;
qDebug("moter count=%d",cfg_->moter_count);
cfg_->save();
if(cmd==0x40)
{
if(data[0]==0x02){
emit send_to_m4_signal(moter_ctrl("up"));
}else if(data[0]==0x03){
emit send_to_m4_signal(moter_ctrl("down"));
}else if(data[0]==0x01){
if(data.size()>=3){
int count=(data[1])|(data[2]<<8);
cfg_->moter_count=20000+count;
qDebug("moter count=%d",cfg_->moter_count);
cfg_->save();
}
}
emit send_data_signal(cmd,myarray(1,char(0)));
return 0;
}else if(cmd==0x47){
myarray r;
r.append(uint8_t(0));
int count=cfg_->moter_count-20000;
if(count<0) count=0;
r.append(uint8_t(count&0xff));
r.append(uint8_t((count>>8)&0xff));
emit send_data_signal(cmd,r);
return 0;
}
emit send_data_signal(0x40,myarray(1,char(0)));
return 0;
}
@@ -302,6 +315,15 @@ static HandlePc *get_selfdev_moter(){
}
protpc_export(0x40, get_selfdev_moter);
protpc_export(0x47, get_selfdev_moter);
@@ -853,8 +875,13 @@ void selfdev_runtask::slave_end_slot(int addr,int ack, slave_data data)
{
qDebug("selfdev runtask end.");
for(int i=0;i<data.size();i++){
qDebug("index=%d",i);
slave_ret slave=data.at(i);
slave_acked.replace(slave.addr-1,slave.data);
qDebug("index=%d end",i);
// 数据的第一位是来源的地址
slave.data.insert(0,slave.addr);
slave_acked.replace(i,slave.data);
// qDebug("index=%d end 2",i);
slave_acked_num++;
}
if(cmd_pc_ret()!=0){

View File

@@ -9,7 +9,8 @@
// 把小板的返回数据转化为自研批检仪上位机的格式
myarray tran_slave_to_selfdev_check(myarray &data);
// 电机控制
myarray moter_ctrl(myarray op);
// 检测 自研批检仪
class selfdev_check : public HandlePc

View File

@@ -0,0 +1 @@
V2.00 重构主板程序,添加检测并写入流水号命令,只支持V2.09及以上的小板程序