2023-11-26 23:05:35 +08:00
|
|
|
#include "prot_slave.h"
|
|
|
|
#include "QDebug"
|
|
|
|
|
|
|
|
void prot_slave::init()
|
|
|
|
{
|
2023-11-27 14:31:00 +08:00
|
|
|
if_ = interFaceFind("can");
|
|
|
|
codec_ = codecFind("codec_slave");
|
|
|
|
mycfg *cfg_ = syscfg();
|
|
|
|
for (int i = 0; i < cfg_->slave_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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-11-26 23:05:35 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2023-11-27 14:31:00 +08:00
|
|
|
bool prot_slave::set_slave_handle(int addr, HandleSlave *handle)
|
2023-11-26 23:05:35 +08:00
|
|
|
{
|
2023-11-27 14:31:00 +08:00
|
|
|
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;
|
2023-11-26 23:05:35 +08:00
|
|
|
}
|
2023-11-27 14:31:00 +08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
delete temp;
|
2023-11-26 23:05:35 +08:00
|
|
|
}
|
2023-11-27 14:31:00 +08:00
|
|
|
}
|
|
|
|
connect(handle, &HandleSlave::send_data_signal, this, &prot_slave::send_data_slot);
|
|
|
|
slaves.replace(addr - 1, handle);
|
|
|
|
return true;
|
2023-11-26 23:05:35 +08:00
|
|
|
}
|
|
|
|
|
2023-11-27 14:31:00 +08:00
|
|
|
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);
|
|
|
|
}
|
2023-11-26 23:05:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static prot_slave *g_protslave;
|
2023-11-27 14:31:00 +08:00
|
|
|
prot_slave *protSlave()
|
|
|
|
{
|
|
|
|
if (g_protslave == nullptr)
|
|
|
|
{
|
|
|
|
g_protslave = new prot_slave();
|
|
|
|
// g_protslave->init();
|
|
|
|
}
|
|
|
|
return g_protslave;
|
2023-11-26 23:05:35 +08:00
|
|
|
}
|