109 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #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)){
 | |
|             broadcast_->addr_response|=1<<(src-1);
 | |
|             if(broadcast_->check_response()==true)
 | |
|               broadcast_->dolater(cmd,data);
 | |
|           }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;
 | |
|     }
 | |
|   }
 | |
|   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<int> 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);
 | |
|   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;
 | |
| }
 | 
