自研批检仪检测命令测试成功

广播方式升级从机发现卡死现象
This commit is contained in:
ranchuan
2023-12-04 18:15:37 +08:00
parent 66b9453255
commit 2451c5dfc5
19 changed files with 256 additions and 69 deletions

View File

@@ -45,19 +45,26 @@ void prot_m4::send_data_slot(myarray data)
bool prot_m4::exe_cb_fun(myarray data)
{
int left;
QList<HandleM4_def> 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 = funs[i].cmd.size()-1;
if (data.left(left) == funs[i].cmd)
left = qstrlen(cb_funs[i].cmd.data());
// qDebug()<<"cmp m4 str:"<<data.left(left)<<cb_funs[i].cmd;
// if (data.left(left) == funs[i].cmd)
if (qstrncmp(data.data(),cb_funs[i].cmd.data(),left)==0)
{
for(int j=0;j<funs[i].funs.size();j++){
prot_m4_cb fun=funs[i].funs[j];
for(int j=0;j<cb_funs[i].funs.size();j++){
prot_m4_cb fun=cb_funs[i].funs[j];
if(fun!=nullptr){
fun(data.mid(left));
return true;
}
}
return true;
}
}
return false;

View File

@@ -40,6 +40,7 @@ void ProtPc::init()
qDebug("host recv:%s",recv_data.toHex(' ').data());
myarray data=codec_->decode(src,dst,cmd,recv_data);
recv_data.remove(0,pack_len);
// qDebug("host recv removed:%s",recv_data.toHex(' ').data());
if(handle_!=nullptr){
if(handle_->busy==0){
disconnect(handle_,&HandlePc::send_data_signal,this,&ProtPc::send_data_slot);

View File

@@ -33,7 +33,7 @@ public:
public:
virtual int start(myarray data) = 0;
virtual int dolater(int cmd, myarray data) = 0;
virtual void timeout(){timer_->stop();};
virtual void timeout(){timer_->stop();}
int busy;
int addr;
int cmd;
@@ -45,9 +45,9 @@ protected:
this->times_retry=times;
if(timer_retry_==nullptr){
timer_retry_=new QTimer();
connect(timer_,&QTimer::timeout,this,&HandleSlave::timeout_retry);
connect(timer_retry_,&QTimer::timeout,this,&HandleSlave::timeout_retry);
}
timer_retry_->start(60);
timeout_retry();
return 0;
}
// 发送操作结束信号
@@ -82,7 +82,9 @@ private:
void timeout_retry(){
if(times_retry>0){
times_retry--;
qDebug("send to slave:%d",addr);
emit send_data_signal(addr,cmd,data_send);
timer_retry_->start(60);
}else{
timer_retry_->stop();
}
@@ -126,7 +128,7 @@ public:
public:
virtual int start(myarray data) = 0;
virtual int dolater(int cmd, myarray data) = 0;
virtual void timeout(){timer_->stop();};
virtual void timeout(){timer_->stop();}
int busy;
int addr;
int addr_response;
@@ -143,6 +145,11 @@ public:
addr|=1<<(adr-1);
}
}
signals:
void timeout_stop_retry_signal();
void timeout_stop_signal();
void timeout_start_signal(int ms);
void timeout_start_retry_signal(int ms);
protected:
// 发送数据到从机
int send_data(int cmd,myarray data,int times){
@@ -152,8 +159,11 @@ protected:
if(timer_retry_==nullptr){
timer_retry_=new QTimer();
connect(timer_,&QTimer::timeout,this,&HandleBoardCast::timeout_retry);
connect(this,&HandleBoardCast::timeout_stop_retry_signal,timer_retry_,&QTimer::stop);
connect(this,&HandleBoardCast::timeout_start_retry_signal,this,&HandleBoardCast::timeout_start_retry_cb);
}
timer_retry_->start(300);
qDebug("handle_board:start retry");
timeout_retry();
return 0;
}
// 发送操作结束信号
@@ -163,29 +173,39 @@ protected:
}
// 开始超时计时器,此计时器用于整个操作的超时
void timeout_start(int ms){
qDebug("handle_board:start timeout");
if(timer_==nullptr){
timer_=new QTimer();
connect(timer_,&QTimer::timeout,this,&HandleBoardCast::timeout);
connect(this,&HandleBoardCast::timeout_stop_signal,timer_,&QTimer::stop);
connect(this,&HandleBoardCast::timeout_start_signal,this,&HandleBoardCast::timeout_start_cb);
}else{
emit timeout_start_signal(ms);
// timer_->start(ms);
}
}
void timeout_start_cb(int ms){
timer_->start(ms);
}
void timeout_start_retry_cb(int ms){
timer_retry_->start(ms);
}
// 停止超时计时器,此方法同时停止重发计时器
void timeout_stop(){
if(timer_!=nullptr){
timer_->stop();
}
qDebug("handle_board:stop timeout");
emit timeout_stop_signal();
timeout_stop_retry();
}
// 停止数据回复超时重试计时器
void timeout_stop_retry(){
if(timer_retry_!=nullptr){
timer_retry_->stop();
}
qDebug("handle_board:stop retry");
emit timeout_stop_retry_signal();
times_retry=0;
}
private:
// 重试回调
void timeout_retry(){
qDebug("in retry.");
if(times_retry>0){
times_retry--;
myarray s;
@@ -196,8 +216,11 @@ private:
s.append((addr_retry>>16)&0xff);
s.append(data_send);
emit send_data_signal(0x1f,cmd,s);
// timer_retry_->start(300);
emit timeout_start_retry_signal(300);
}else{
timer_retry_->stop();
// timer_retry_->stop();
emit timeout_stop_retry_signal();
}
}
private: