广播命令可以接收各个从机的返回数据
This commit is contained in:
@@ -25,6 +25,8 @@ void prot_slave::init()
|
||||
}else{
|
||||
if((broadcast_!=nullptr)&&(broadcast_->busy)){
|
||||
broadcast_->addr_response|=1<<(src-1);
|
||||
// 存储从机的数据
|
||||
broadcast_->ret_data[src-1]=data;
|
||||
if(broadcast_->check_response()==true){
|
||||
// broadcast_->dolater(broadcast_->cmd,data);
|
||||
emit boardcast_dolater_signal(broadcast_->cmd,data);
|
||||
|
@@ -102,11 +102,46 @@ signals:
|
||||
|
||||
using namespace std;
|
||||
// using namespace std::placeholders;
|
||||
|
||||
typedef std::function<void(int addr,int ack,myarray data)> prots_end_cbfun;
|
||||
class slave_data;
|
||||
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 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
|
||||
@@ -140,18 +175,31 @@ public:
|
||||
int addr;
|
||||
int addr_response;
|
||||
int cmd;
|
||||
slave_data ret_data;
|
||||
public:
|
||||
// 判断是否所有从机都返回
|
||||
bool check_response(){
|
||||
return (addr^addr_response)==0?true:false;
|
||||
}
|
||||
// 把地址列表转化为bit
|
||||
void trun_list_to_bit(QList<int> addrs){
|
||||
int trun_list_to_bit(QList<int> addrs){
|
||||
addr=0;
|
||||
foreach(int adr,addrs){
|
||||
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){
|
||||
this->end_cb=end_fun;
|
||||
this->rate_cb=rate_fun;
|
||||
@@ -168,6 +216,7 @@ protected:
|
||||
this->data_send=data;
|
||||
this->times_retry=times;
|
||||
this->addr_response=0;
|
||||
this->ret_data.clear();
|
||||
if(timer_retry_==nullptr){
|
||||
timer_retry_=new QTimer();
|
||||
connect(timer_retry_,&QTimer::timeout,this,&HandleBoardCast::timeout_retry);
|
||||
@@ -180,7 +229,7 @@ protected:
|
||||
return 0;
|
||||
}
|
||||
// 发送操作结束信号
|
||||
int end(int ack,myarray data){
|
||||
int end(int ack,slave_data data){
|
||||
emit end_signal(0x1f,ack,data);
|
||||
if(end_cb!=nullptr){
|
||||
end_cb(0x1f,ack,data);
|
||||
@@ -252,12 +301,12 @@ private:
|
||||
QTimer *timer_;
|
||||
QTimer *timer_retry_;
|
||||
int times_retry;
|
||||
myarray data_send;
|
||||
myarray data_send;// 发送的数据
|
||||
prots_end_cbfun end_cb;
|
||||
prots_rate_cbfun rate_cb;
|
||||
signals:
|
||||
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);
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user