78 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "prot_slave.h"
 | |
| #include "QDebug"
 | |
| 
 | |
| void prot_slave::init()
 | |
| {
 | |
|   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);
 | |
|               }
 | |
|           }
 | |
|       }
 | |
|     });
 | |
| }
 | |
| 
 | |
| 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;
 | |
| }
 | 
