78 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.7 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;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | 
