#include "prot_m4.h" #include "QDebug" void prot_m4::init() { if_ = interFaceFind("uart_m4"); codec_ = codecFind("codec_m4"); if(if_==nullptr||codec_==nullptr){ return; } if_->set_irq([=](myarray recv) { recv_data+=recv; int pack_len=0; while(pack_len=codec_->packCheck(recv_data),pack_len>0){ int cmd,src,dst; myarray data=codec_->decode(src,dst,cmd,recv_data); recv_data.remove(0,pack_len); if(wait>0) wait--; if(exe_cb_fun(data)==false){ qWarning("can not find cb fun with:\"%s\"",data.data()); } if(send_list.size()>0){ if_->write(send_list.takeFirst()); wait+=2; } } }); } void prot_m4::send_data_slot(myarray data) { if ((if_ != nullptr) && (codec_ != nullptr)) { myarray send = codec_->encode(0, 0, 0, data); send_list.append(send); if(wait==0){ wait+=2; qDebug("send m4:%s",data.data()); if_->write(send_list.takeFirst()); } } } bool prot_m4::exe_cb_fun(myarray data) { int left; QList cb_funs; for (int i = 0; i < funs.size(); i++) { cb_funs.append(this->funs[i]); } for (int i = 0; i < cb_funs.size(); i++) { // 这里size包含结尾符,要去掉 left = qstrlen(cb_funs[i].cmd.data()); // qDebug()<<"cmp m4 str:"<init(); } return g_protm4; } bool prot_m4::set_irq_fun(prot_m4_cb fun, myarray data) { if(fun==nullptr) return false; int left; for (int i = 0; i < funs.size(); i++) { left = funs[i].cmd.size(); if (data.left(left) == funs[i].cmd) { for(int j=0;j()==temp.target()){ qDebug("this function pointer was exited."); return false; } } qDebug("add function pointer success."); funs[i].funs.append(fun); return true; } } HandleM4_def m4_cmd; m4_cmd.cmd = data; m4_cmd.funs.append(fun); funs.append(m4_cmd); return true; } bool prot_m4::del_irq_fun(prot_m4_cb fun, myarray data) { int left; for (int i = 0; i < funs.size(); i++) { left = funs[i].cmd.size(); if (data.left(left) == funs[i].cmd) { if(fun==nullptr){ qDebug("del the same string cb."); funs.removeAt(i); return true; }else{ for(int j=0;j()==temp.target()){ qDebug("del the same function pointer."); funs[i].funs.removeAt(j); if(funs[i].funs.size()==0){ funs.removeAt(i); } return true; } } return false; } } } return false; }