广播命令可以接收各个从机的返回数据

This commit is contained in:
ranchuan
2023-12-09 10:37:48 +08:00
parent dc6487c309
commit fe11c52253
10 changed files with 156 additions and 21 deletions

View File

@@ -10,5 +10,6 @@
广播方式升级从机成功 广播方式升级从机成功
2023.12.7 2023.12.7
批检仪检测流程验证成功 批检仪检测流程验证成功
2023.12.8
广播命令可以接收各个从机的返回数据,计划将所有命令转化为广播命令

View File

@@ -6,7 +6,7 @@
#define BUILD_DATE "2023-12-07 18:27:08" #define BUILD_DATE "2023-12-08 10:04:55"

View File

@@ -1,5 +1,5 @@
{ {
"build_date": "2023-12-07 18:27:08", "build_date": "2023-12-08 10:04:55",
"hard_version": "MHPZ2_V1.00", "hard_version": "MHPZ2_V1.00",
"private": [ "private": [
"info.json", "info.json",

View File

@@ -25,6 +25,8 @@ void prot_slave::init()
}else{ }else{
if((broadcast_!=nullptr)&&(broadcast_->busy)){ if((broadcast_!=nullptr)&&(broadcast_->busy)){
broadcast_->addr_response|=1<<(src-1); broadcast_->addr_response|=1<<(src-1);
// 存储从机的数据
broadcast_->ret_data[src-1]=data;
if(broadcast_->check_response()==true){ if(broadcast_->check_response()==true){
// broadcast_->dolater(broadcast_->cmd,data); // broadcast_->dolater(broadcast_->cmd,data);
emit boardcast_dolater_signal(broadcast_->cmd,data); emit boardcast_dolater_signal(broadcast_->cmd,data);

View File

@@ -102,11 +102,46 @@ signals:
using namespace std; using namespace std;
// using namespace std::placeholders; // using namespace std::placeholders;
class slave_data;
typedef std::function<void(int addr,int ack,myarray data)> prots_end_cbfun; typedef std::function<void(int addr,int ack,slave_data data)> prots_end_cbfun;
typedef std::function<void(int rate,mystring data)> prots_rate_cbfun; typedef std::function<void(int rate,mystring data)> prots_rate_cbfun;
typedef struct{
int addr;
myarray data;
}slave_ret;
// 定义保存从机数据的类
class slave_data{
public:
QList<slave_ret> data;
// 重载括号操作符index为地址-1
myarray &operator [](int index){
for(int i=0;i<data.size();i++){
if(data[i].addr==(index+1)){
return data[i].data;
}
}
slave_ret r;
r.addr=index+1;
data.append(r);
return data.last().data;
}
// 清除
void clear(){
data.clear();
}
int size(){
return data.size();
}
slave_ret &at(int index){
return data[index];
}
};
class HandleBoardCast : public QObject class HandleBoardCast : public QObject
@@ -140,18 +175,31 @@ public:
int addr; int addr;
int addr_response; int addr_response;
int cmd; int cmd;
slave_data ret_data;
public: public:
// 判断是否所有从机都返回 // 判断是否所有从机都返回
bool check_response(){ bool check_response(){
return (addr^addr_response)==0?true:false; return (addr^addr_response)==0?true:false;
} }
// 把地址列表转化为bit // 把地址列表转化为bit
void trun_list_to_bit(QList<int> addrs){ int trun_list_to_bit(QList<int> addrs){
addr=0; addr=0;
foreach(int adr,addrs){ foreach(int adr,addrs){
addr|=1<<(adr-1); addr|=1<<(adr-1);
} }
return addr;
} }
// 把bit转化为地址列表
QList<int> trun_bit_to_list(int addrs){
QList<int> l;
for(int i=0;i<32;i++){
if(addrs&(1<<i)){
l.append(i+1);
}
}
return l;
}
void set_cbfun(prots_end_cbfun end_fun,prots_rate_cbfun rate_fun){ void set_cbfun(prots_end_cbfun end_fun,prots_rate_cbfun rate_fun){
this->end_cb=end_fun; this->end_cb=end_fun;
this->rate_cb=rate_fun; this->rate_cb=rate_fun;
@@ -168,6 +216,7 @@ protected:
this->data_send=data; this->data_send=data;
this->times_retry=times; this->times_retry=times;
this->addr_response=0; this->addr_response=0;
this->ret_data.clear();
if(timer_retry_==nullptr){ if(timer_retry_==nullptr){
timer_retry_=new QTimer(); timer_retry_=new QTimer();
connect(timer_retry_,&QTimer::timeout,this,&HandleBoardCast::timeout_retry); connect(timer_retry_,&QTimer::timeout,this,&HandleBoardCast::timeout_retry);
@@ -180,7 +229,7 @@ protected:
return 0; return 0;
} }
// 发送操作结束信号 // 发送操作结束信号
int end(int ack,myarray data){ int end(int ack,slave_data data){
emit end_signal(0x1f,ack,data); emit end_signal(0x1f,ack,data);
if(end_cb!=nullptr){ if(end_cb!=nullptr){
end_cb(0x1f,ack,data); end_cb(0x1f,ack,data);
@@ -252,12 +301,12 @@ private:
QTimer *timer_; QTimer *timer_;
QTimer *timer_retry_; QTimer *timer_retry_;
int times_retry; int times_retry;
myarray data_send; myarray data_send;// 发送的数据
prots_end_cbfun end_cb; prots_end_cbfun end_cb;
prots_rate_cbfun rate_cb; prots_rate_cbfun rate_cb;
signals: signals:
void send_data_signal(int addr, int cmd, myarray data); void send_data_signal(int addr, int cmd, myarray data);
void end_signal(int addr,int ack,myarray data); void end_signal(int addr,int ack,slave_data data);
void rate_signal(int rate,mystring str); void rate_signal(int rate,mystring str);
}; };

View File

@@ -24,7 +24,7 @@ void rate_slot(int rate,mystring str)
strs=strs.arg(rate).arg(str); strs=strs.arg(rate).arg(str);
c->send(strs.data()); c->send(strs.data());
} }
void end_slot(int addr,int ack,myarray data) void end_slot(int addr,int ack,slave_data data)
{ {
command *c=command_start(); command *c=command_start();
mystring strs("ack:%1,%2"); mystring strs("ack:%1,%2");
@@ -101,7 +101,7 @@ static void mcu_cmdlines(QList<myarray> args)
if(ack==false){ if(ack==false){
qWarning("handle is busy."); qWarning("handle is busy.");
}else{ }else{
b->set_cbfun([=](int addr,int ack,myarray data){ b->set_cbfun([=](int addr,int ack,slave_data data){
end_slot(addr,!ack,data); end_slot(addr,!ack,data);
},[=](int rate,mystring str){ },[=](int rate,mystring str){
rate_slot(rate,str); rate_slot(rate,str);
@@ -124,7 +124,7 @@ static void mcu_cmdlines(QList<myarray> args)
if(ack==false){ if(ack==false){
qWarning("handle is busy."); qWarning("handle is busy.");
}else{ }else{
b->set_cbfun([=](int addr,int ack,myarray data){ b->set_cbfun([=](int addr,int ack,slave_data data){
end_slot(addr,!ack,data); end_slot(addr,!ack,data);
},[=](int rate,mystring str){ },[=](int rate,mystring str){
rate_slot(rate,str); rate_slot(rate,str);
@@ -149,7 +149,7 @@ static void mcu_cmdlines(QList<myarray> args)
if(ack==false){ if(ack==false){
qWarning("handle is busy."); qWarning("handle is busy.");
}else{ }else{
b->set_cbfun([=](int addr,int ack,myarray data){ b->set_cbfun([=](int addr,int ack,slave_data data){
end_slot(addr,!ack,data); end_slot(addr,!ack,data);
},[=](int rate,mystring str){ },[=](int rate,mystring str){
rate_slot(rate,str); rate_slot(rate,str);

View File

@@ -272,7 +272,7 @@ void selfdev_slaveupdate::timeout(){
qDebug("slave update timeout"); qDebug("slave update timeout");
} }
void selfdev_slaveupdate::slave_end_slot(int addr,int ack, myarray data) void selfdev_slaveupdate::slave_end_slot(int addr,int ack, slave_data data)
{ {
qDebug("slave update end,ack=%d",ack); qDebug("slave update end,ack=%d",ack);
busy=0; busy=0;
@@ -348,7 +348,7 @@ void selfdev_update_scheme::timeout(){
qDebug("slave update timeout"); qDebug("slave update timeout");
} }
void selfdev_update_scheme::slave_end_slot(int addr,int ack, myarray data) void selfdev_update_scheme::slave_end_slot(int addr,int ack, slave_data data)
{ {
qDebug("slave update end,ack=%d",ack); qDebug("slave update end,ack=%d",ack);
busy=0; busy=0;
@@ -563,6 +563,27 @@ static myarray slave_to_bootinfo_byte(myarray data){
return data; return data;
} }
//void selfdev_bootinfo::slave_end_slot(int addr,int ack, slave_data data)
//{
// if(addr<=0||addr>slave_acked.size()){
// qWarning("slave addr err:%d",addr);
// return;
// }
// 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++;
// myarray r;
// r.append(char(0));
// r+=bootinfo_fill_local();
// for(int i=0;i<slave_acked.size();i++){
// r.append(slave_to_bootinfo_byte(slave_acked[i]));
// }
// emit send_data_signal(0x34,r);
// busy=0;
// }
//}
void selfdev_bootinfo::slave_end_slot(int addr,int ack, myarray data) void selfdev_bootinfo::slave_end_slot(int addr,int ack, myarray data)
{ {
if(addr<=0||addr>slave_acked.size()){ if(addr<=0||addr>slave_acked.size()){
@@ -583,6 +604,8 @@ void selfdev_bootinfo::slave_end_slot(int addr,int ack, myarray data)
} }
} }
static HandlePc *get_selfdev_bootinfo(){ static HandlePc *get_selfdev_bootinfo(){
return new selfdev_bootinfo(); return new selfdev_bootinfo();
} }

View File

@@ -3,6 +3,7 @@
#include "prot/prot_pc.h" #include "prot/prot_pc.h"
#include "prot/prot_m4.h" #include "prot/prot_m4.h"
#include "prot_cmd/cmd_slave.h"
// 检测 自研批检仪 // 检测 自研批检仪
@@ -80,7 +81,7 @@ public:
int dolater(int cmd, myarray data); int dolater(int cmd, myarray data);
void timeout(); void timeout();
public slots: public slots:
void slave_end_slot(int addr,int ack, myarray data); void slave_end_slot(int addr,int ack, slave_data data);
signals: signals:
void send_to_m4_signal(myarray data); void send_to_m4_signal(myarray data);
}; };
@@ -100,7 +101,7 @@ public:
int dolater(int cmd, myarray data); int dolater(int cmd, myarray data);
void timeout(); void timeout();
public slots: public slots:
void slave_end_slot(int addr,int ack, myarray data); void slave_end_slot(int addr,int ack, slave_data data);
signals: signals:
void send_to_m4_signal(myarray data); void send_to_m4_signal(myarray data);
}; };
@@ -147,6 +148,7 @@ public:
int dolater(int cmd, myarray data); int dolater(int cmd, myarray data);
void timeout(); void timeout();
public slots: public slots:
// void slave_end_slot(int addr,int ack, slave_data data);
void slave_end_slot(int addr,int ack, myarray data); void slave_end_slot(int addr,int ack, myarray data);
protected: protected:
QList<myarray> slave_acked; QList<myarray> slave_acked;

View File

@@ -52,6 +52,54 @@ int slave_check::dolater(int cmd, myarray data)
int slave_check2::start(myarray data)
{
mycfg *cfg_=syscfg();
check_cfg *ccfg_=check_plan();
int timeout=ccfg_->get_check_time_out()*1000;
busy=1;
cmd=0x0c;
qDebug("addr %d start check,timeout=%d",addr,timeout);
send_data(cmd,myarray(),3);
timeout_start(timeout);
return 0;
}
void slave_check2::timeout()
{
timeout_stop();
qWarning("addr %d check timeout.",addr);
end(1,ret_data);
busy=0;
}
int slave_check2::dolater(int cmd, myarray data)
{
timeout_stop_retry();
if(cmd==0x0c){
if(data.size()<=16){
qDebug("addr %d recv first ack.",addr);
}else{
qDebug("addr %d recv secend ack.",addr);
send_data(0x14,myarray(),5);
end(0,ret_data);
timeout_stop();
}
}else if(cmd==0x14){
// 所有从机都 停止上报时取消忙状态
busy=0;
}
return 0;
}
void slave_result::timeout() void slave_result::timeout()
{ {
timeout_stop(); timeout_stop();
@@ -212,7 +260,7 @@ void boardcast_updata::timeout()
{ {
timeout_stop(); timeout_stop();
qWarning("slave updata timeout."); qWarning("slave updata timeout.");
end(1,myarray()); end(1,ret_data);
busy=0; busy=0;
} }
@@ -259,7 +307,7 @@ int boardcast_updata::dolater(int cmd, myarray data)
timeout_stop(); timeout_stop();
timeout_stop_retry(); timeout_stop_retry();
qDebug("slave updata end."); qDebug("slave updata end.");
end(0,data); end(0,ret_data);
busy=0; busy=0;
} }
return 0; return 0;
@@ -301,7 +349,7 @@ void boardcast_updata_scheme::timeout()
{ {
timeout_stop(); timeout_stop();
qWarning("slave updata timeout."); qWarning("slave updata timeout.");
end(1,myarray()); end(1,ret_data);
busy=0; busy=0;
} }
@@ -333,7 +381,7 @@ int boardcast_updata_scheme::dolater(int cmd, myarray data)
timeout_stop(); timeout_stop();
timeout_stop_retry(); timeout_stop_retry();
qDebug("slave updata scheme end."); qDebug("slave updata scheme end.");
end(0,data); end(0,ret_data);
busy=0; busy=0;
} }
return 0; return 0;

View File

@@ -16,6 +16,16 @@ public:
}; };
// 从机检测命令
class slave_check2:public HandleBoardCast
{
public:
slave_check2():HandleBoardCast(){}
int start(myarray data);
int dolater(int cmd, myarray data);
void timeout();
};
// 获取检测结果命令 // 获取检测结果命令