#ifndef prot_pc_h__ #define prot_pc_h__ #include "QObject" #include "base/base.h" #include "QList" #include "interface/codec.h" #include "interface/interface.h" #include "base/mycfg.h" #include "QThread" #include "QTimer" // 定义处理命令的类 class HandlePc : public QObject { Q_OBJECT public: HandlePc() { busy = 0; timer_ = nullptr; } virtual ~HandlePc() { if(timer_!=nullptr){ delete timer_; } } virtual int dolater(int cmd, myarray data) = 0; virtual void timeout(){busy=0;} int busy; protected: void timeout_start(int ms){ if(timer_==nullptr){ timer_=new QTimer(); connect(timer_,&QTimer::timeout,this,&HandlePc::timeout); } timer_->start(ms); } void timeout_stop(){ if(timer_!=nullptr){ timer_->stop(); } } private: QTimer *timer_; signals: void send_data_signal(int cmd, myarray data); }; /* HandlePc 重载示例 class ChildPc:public HandlePc { // 重载此函数用于接收上位机命令 int dolater(int cmd, myarray data); // (可选)重载此函数处理超时的情况 void timeout(); // 此变量不为0则忙 int busy; // 调用此函数开始超时计时 void timeout_start(int ms); // 调用此函数停止超时计时 void timeout_stop(); // 调用此函数给上位机发送数据 void send_data_signal(int cmd, myarray data); } // .cpp 文件中做以下声明以启用 static HandlePc *get_ChidlPc(){ return new ChildPc();} protpc_export(0x30, get_ChidlPc); */ QList handlePcList(); class ProtPc : public QObject { Q_OBJECT public: ProtPc() { if_ = nullptr; codec_ = nullptr; handle_ = nullptr; } ~ProtPc() {} void init(); bool docmd(int cmd,myarray data); bool busy(){return ((handle_!=nullptr)&&(handle_->busy!=0));} public slots: void send_data_slot(int cmd, myarray data); protected: InterFace *if_; Codec *codec_; HandlePc *handle_; QThread thread; myarray recv_data; }; ProtPc *protPc(); typedef struct { int cmd; HandlePc *(*handle_get_fun)(); } handlepc_def; #define protpc_export(cmd_, fun_) \ __attribute__((used)) static handlepc_def _handlepc_##cmd_ __attribute__((section("protpc"))) = { \ .cmd = cmd_, \ .handle_get_fun = fun_, \ } #endif