#include "prot_slave.h" #include "QDebug" void prot_slave::init() { if_=interFaceFind("can"); codec_=codecFind("codec_slave"); mycfg *cfg_=syscfg(); for(int i=0;islave_num;i++){ slaves.append(nullptr); } if_->set_irq([=](myarray recv){ if(codec_->packCheck(recv)==true){ 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{ handle=slaves[src-1]; if(handle!=nullptr){ handle->dolater(cmd,data); }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; } } connect(handle,&HandleSlave::send_data_signal,this,&prot_slave::send_data_slot); slaves.replace(addr-1,handle); 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(send); } } static prot_slave *g_protslave; prot_slave *protSlave(){ if(g_protslave==nullptr){ g_protslave=new prot_slave(); //g_protslave->init(); } return g_protslave; }