#include "prot_slave.h" #include "QDebug" void prot_slave::init() { if_ = interFaceFind("can"); codec_ = codecFind("codec_slave"); mycfg *cfg_ = syscfg(); if(if_==nullptr||codec_==nullptr){ return; } for (int i = 0; i < cfg_->slave_num; i++) { slaves.append(nullptr); } if_->set_irq([=](myarray recv) { int pack_len=0; if(pack_len=codec_->packCheck(recv),pack_len>0){ int cmd,src,dst; HandleSlave *handle=nullptr; myarray data=codec_->decode(src,dst,cmd,recv); if((src>slaves.size())||(src<=0)){ qWarning("slave addr err:%d",src); }else{ if((broadcast_!=nullptr)&&(broadcast_->busy)){ if(cmd==broadcast_->cmd){ if((broadcast_->addr_response&(1<<(src-1)))==0){ 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); } } } }else{ handle=slaves[src-1]; if(handle!=nullptr){ handle->dolater(cmd,data); // connect(this,&prot_slave::slave_dolater_signal,handle,&HandleSlave::dolater); // emit slave_dolater_signal(cmd,data); // disconnect(this,&prot_slave::slave_dolater_signal,handle,&HandleSlave::dolater); }else{ qWarning("slave addr=%d not have handle.",src); } } } } }); } bool prot_slave::set_slave_handle(int addr, HandleSlave *handle) { if ((addr > slaves.size()) || (addr <= 0)) { delete handle; return false; } HandleSlave *temp; temp = slaves[addr - 1]; if (temp != nullptr) { if (temp->busy != 0) { delete handle; return false; } else { delete temp; } } handle->addr=addr; connect(handle, &HandleSlave::send_data_signal, this, &prot_slave::send_data_slot); slaves.replace(addr - 1, handle); return true; } bool prot_slave::set_boardcast_handle(QList addrs,HandleBoardCast *handle) { if (broadcast_ != nullptr) { if (broadcast_->busy != 0) { delete handle; return false; } else { delete broadcast_; } } broadcast_=handle; broadcast_->trun_list_to_bit(addrs); connect(handle, &HandleBoardCast::send_data_signal, this, &prot_slave::send_data_slot); connect(this,&prot_slave::boardcast_dolater_signal,handle,&HandleBoardCast::dolater); return true; } void prot_slave::send_data_slot(int addr, int cmd, myarray data) { if ((if_ != nullptr) && (codec_ != nullptr)) { myarray send = codec_->encode(0, addr, cmd, data); if_->write(addr,send); } } static prot_slave *g_protslave; prot_slave *protSlave() { if (g_protslave == nullptr) { g_protslave = new prot_slave(); g_protslave->init(); } return g_protslave; }