From cc5b1b74583f156b625c66addf90edc308a73907 Mon Sep 17 00:00:00 2001 From: ranchuan Date: Wed, 13 Dec 2023 18:29:46 +0800 Subject: [PATCH] =?UTF-8?q?=20=20=E5=B9=BF=E6=92=AD=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E5=B7=B2=E6=8E=A5=E6=94=B6=E7=9A=84=E5=9B=9E=E5=A4=8D=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E8=A7=A6=E5=8F=91=E5=9B=9E=E8=B0=83=20=20=20=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E5=91=BD=E4=BB=A40x0c=E5=8F=AA=E8=83=BD=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=8D=95=E6=92=AD=E6=96=B9=E5=BC=8F=EF=BC=8C=E5=B9=BF?= =?UTF-8?q?=E6=92=AD=E6=96=B9=E5=BC=8F=E5=9B=A0=E4=B8=BA=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E5=8D=B3=E6=97=B6=E5=9B=9E=E5=A4=8D=E5=81=9C=E6=AD=A2=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7=EF=BC=8C=E5=9B=9E=E5=A4=8D=E4=BC=9A=E5=87=BA=E9=94=99?= =?UTF-8?q?=20=20=20=E6=B7=BB=E5=8A=A0=E7=94=B5=E9=98=BB=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=EF=BC=8C=E6=B7=BB=E5=8A=A0=E8=87=AA=E6=A3=80?= =?UTF-8?q?=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReadMe.txt | 7 +- base/beep.cpp | 131 ++++++++++++++++++ base/beep.h | 45 ++++++ checker_host.pro | 6 + complier_info.h | 2 +- info.json | 2 +- interface/if_can.cpp | 2 +- main.cpp | 3 +- prot/prot_slave.cpp | 16 ++- prot_cmd/cmd_pc.cpp | 308 +++++++++++++++++++++++++++++++++-------- prot_cmd/cmd_pc.h | 95 ++++++++++++- prot_cmd/cmd_slave.cpp | 44 +++++- prot_cmd/cmd_slave.h | 21 ++- 13 files changed, 606 insertions(+), 76 deletions(-) create mode 100644 base/beep.cpp create mode 100644 base/beep.h diff --git a/ReadMe.txt b/ReadMe.txt index 9cb67ac..0cd90c1 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -12,4 +12,9 @@ 批检仪检测流程验证成功 2023.12.8 广播命令可以接收各个从机的返回数据,计划将所有命令转化为广播命令 - +2023.12.12 + 添加蜂鸣器 +2023.12.13 + 广播命令已接收的回复不再触发回调 + 检测命令0x0c只能使用单播方式,广播方式因为不能即时回复停止信号,回复会出错 + 添加电阻测试命令,添加自检命令 diff --git a/base/beep.cpp b/base/beep.cpp new file mode 100644 index 0000000..b61ee4a --- /dev/null +++ b/base/beep.cpp @@ -0,0 +1,131 @@ +#include "beep.h" +#include "QTimer" +#include "QThread" +beep::beep(QObject *parent) : QObject(parent) +{ + /* 开发板的 LED 控制接口 */ + file.setFileName("/sys/devices/platform/leds/leds/beep/brightness"); + if (!file.exists()) + { + qWarning()<<"beep init Fail!!"<state = true; + } + else + { + file.write("0"); + this->state = false; + } + file.close(); + + return true; +} + + +void beep::start() +{ + QTimer::singleShot(0,this, &beep::run_cb); +} + + +bool beep::stop() +{ + QMutexLocker locker(&lock); + is_run = false; + return true; +} + + +// 用户程序调用这个函数开启蜂鸣器 +void beep::set_beep(int delay_on_ms,int delay_off_ms,int ticks) +{ + + this->delay_on_ms = delay_on_ms; + this->delay_off_ms =delay_off_ms; + this->ticks = ticks; +} + + +// 执行线程 +void beep::run_cb() +{ + while(is_run) + { + QMutexLocker locker(&lock); + while(ticks>0) + { + ticks--; + set_state(true); + QThread::msleep(delay_on_ms); + set_state(false); + QThread::msleep(delay_off_ms); + } + + } +} + + + +beep *Beep(){ + static beep *b=nullptr; + static QThread thread; + if(b==nullptr){ + b=new beep(); + b->moveToThread(&thread); + thread.start(); + b->start(); + } + return b; +} + + + + + diff --git a/base/beep.h b/base/beep.h new file mode 100644 index 0000000..5e082a3 --- /dev/null +++ b/base/beep.h @@ -0,0 +1,45 @@ +#ifndef BEEP_H +#define BEEP_H + +#include +#include +#include +#include +#include +#include +class beep : public QObject +{ + Q_OBJECT +public: + explicit beep(QObject *parent = nullptr); + + bool stop(); + void start(); + // 用户程序调用这个函数开启蜂鸣器 + void set_beep(int delay_on_ms,int delay_off_ms,int ticks); +private: + bool get_state(); + bool set_state(bool state); +private: + bool is_run; + bool state; + + int delay_on_ms; + int delay_off_ms; + int ticks; + + QMutex lock; + QFile file; + +private slots: + void run_cb(); + +}; + + + +beep *Beep(); + + + +#endif // BEEP_H diff --git a/checker_host.pro b/checker_host.pro index fe8463e..e801ad2 100644 --- a/checker_host.pro +++ b/checker_host.pro @@ -21,6 +21,7 @@ DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ base/base.cpp \ + base/beep.cpp \ base/check_cfg.cpp \ base/crc.cpp \ base/debug.cpp \ @@ -48,6 +49,7 @@ SOURCES += \ HEADERS += \ base/base.h \ + base/beep.h \ base/check_cfg.h \ base/crc.h \ base/debug.h \ @@ -83,3 +85,7 @@ TRANSLATIONS += \ qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +DISTFILES += \ + ReadMe.txt \ + ReadMe.txt diff --git a/complier_info.h b/complier_info.h index 647a15f..008a94c 100644 --- a/complier_info.h +++ b/complier_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-12-08 10:04:55" +#define BUILD_DATE "2023-12-13 17:50:37" diff --git a/info.json b/info.json index 3f77825..c9d599c 100644 --- a/info.json +++ b/info.json @@ -1,5 +1,5 @@ { - "build_date": "2023-12-08 10:04:55", + "build_date": "2023-12-13 17:50:37", "hard_version": "MHPZ2_V1.00", "private": [ "info.json", diff --git a/interface/if_can.cpp b/interface/if_can.cpp index 39098a2..bd0b272 100644 --- a/interface/if_can.cpp +++ b/interface/if_can.cpp @@ -231,7 +231,7 @@ void can_host::recv_data_cb() int can_host::write(int dst,myarray data) { - // qDebug()<<"can send to:"<log_redirect=="file"){ diff --git a/prot/prot_slave.cpp b/prot/prot_slave.cpp index c41728c..6e6db3f 100644 --- a/prot/prot_slave.cpp +++ b/prot/prot_slave.cpp @@ -24,12 +24,16 @@ void prot_slave::init() qWarning("slave addr err:%d",src); }else{ if((broadcast_!=nullptr)&&(broadcast_->busy)){ - broadcast_->addr_response|=1<<(src-1); - // 存储从机的数据 - broadcast_->ret_data[src-1]=data; - if(broadcast_->check_response()==true){ - // broadcast_->dolater(broadcast_->cmd,data); - emit boardcast_dolater_signal(broadcast_->cmd,data); + if(cmd==broadcast_->cmd){ + if((broadcast_->addr_response&(1<<(src-1)))==0){ + broadcast_->addr_response|=1<<(src-1); + // 存储从机的数据 + broadcast_->ret_data[src-1]=data; + if(broadcast_->check_response()==true){ + // broadcast_->dolater(broadcast_->cmd,data); + emit boardcast_dolater_signal(broadcast_->cmd,data); + } + } } }else{ handle=slaves[src-1]; diff --git a/prot_cmd/cmd_pc.cpp b/prot_cmd/cmd_pc.cpp index ea6e5e8..2510a2a 100644 --- a/prot_cmd/cmd_pc.cpp +++ b/prot_cmd/cmd_pc.cpp @@ -126,6 +126,8 @@ static myarray tran_slave_to_selfdev_check(myarray &data) int paramerr_num=(return_num+7)/8; // 每个通道占用的长度 int len_for_each=1+8+paramerr_num+return_num*2; + // 去掉应答位 + data.remove(0,1); myarray r; if(data.size()<17){ r.append(char(208)); @@ -169,6 +171,77 @@ protpc_export(0x30, get_selfdev_check); +// 自研批检仪检测 +int selfdev_check2::dolater(int cmd, myarray data) +{ + prot_m4 *m4 = protM4(); + prot_slave *slave=protSlave(); + mycfg *cfg=syscfg(); + busy=1; + connect(this, &selfdev_check2::send_to_m4_signal, m4, &prot_m4::send_data_slot); + moter_down_cb_fun=[=](myarray data) + { + m4->del_irq_fun(moter_down_cb_fun,"moter down"); + { + // 这里开始检测 + qDebug("start check."); + emit send_data_signal(cmd,myarray(1,0)); + QList addrs=cfg->calc_slave_addrs(); + HandleBoardCast *s=new slave_check2(); + bool ack=slave->set_boardcast_handle(addrs,s); + if(ack==false){ + qWarning("handle is busy."); + }else{ + connect(s,&HandleBoardCast::end_signal,this,&selfdev_check2::slave_end_slot); + s->start(myarray()); + } + } + }; + myarray moter_cmd=moter_ctrl("down"); + if(moter_cmd.size()==0){ + busy=0; + qWarning("moter failed."); + }else{ + m4->set_irq_fun(moter_down_cb_fun,"moter down"); + emit send_to_m4_signal(moter_cmd); + } + slave_acked.clear(); + for(int i=0;islave_num;i++){ + slave_acked.append(myarray()); + } + slave_acked_num=0; + return 0; +} + +void selfdev_check2::timeout() +{ + busy=0; +} +void selfdev_check2::slave_end_slot(int addr,int ack, slave_data data) +{ + for(int i=0;istart(data); + myarray scheme=myarray((const char *)ccfg_->check_scheme(),ccfg_->check_scheme_size()); + b->start(scheme); } } else{ @@ -350,7 +424,7 @@ void selfdev_update_scheme::timeout(){ void selfdev_update_scheme::slave_end_slot(int addr,int ack, slave_data data) { - qDebug("slave update end,ack=%d",ack); + qDebug("slave update end,ack=%s",ack?"failed":"success"); busy=0; } @@ -449,24 +523,23 @@ protpc_export(0x27, get_selfdev_jwtupdate); int selfdev_bootinfo::dolater(int cmd, myarray data) { prot_slave *slave=protSlave(); - mycfg *cfg=syscfg(); + mycfg *cfg_=syscfg(); busy=1; // 这里开始检测 qDebug("get bootinfo."); emit send_data_signal(cmd,myarray(1,0)); - QList addrs=cfg->calc_slave_addrs(); - foreach(int addr, addrs){ - HandleSlave *s=new slave_check(); - bool ack=slave->set_slave_handle(addr,s); - if(ack==false){ - qWarning("addr %d handle is busy.",addr); - }else{ - connect(s,&HandleSlave::end_signal,this,&selfdev_bootinfo::slave_end_slot); - s->start(myarray()); - } + HandleBoardCast *b=new slave_cmd(); + bool ack=slave->set_boardcast_handle(cfg_->calc_slave_addrs(),b); + if(ack==false){ + qWarning("handle is busy."); + busy=0; + }else{ + connect(b,&HandleBoardCast::end_signal,this,&selfdev_bootinfo::slave_end_slot); + b->cmd=0x13; + b->start(data); } slave_acked.clear(); - for(int i=0;islave_num;i++){ + for(int i=0;islave_num;i++){ slave_acked.append(myarray()); } slave_acked_num=0; @@ -523,12 +596,13 @@ myarray bootinfo_fill_local(void) QStringList iplist; mycfg *cfg_=syscfg(); check_cfg *ccfg_=check_plan(); - uint8_t *d=(uint8_t *)calloc(1,sizeof(local_bootinfo)); - memcpy(d,cfg_->build_date.toLocal8Bit(),cfg_->build_date.size()+1);d+=20; - memcpy(d,cfg_->soft_version.toLocal8Bit(),cfg_->soft_version.size()+1);d+=8; + uint8_t *d=(uint8_t *)calloc(1,sizeof(local_bootinfo)+1); + uint8_t *d_free=d; + memcpy(d,cfg_->build_date.data(),cfg_->build_date.size()+1);d+=20; + memcpy(d,cfg_->soft_version.data(),cfg_->soft_version.size()+1);d+=8; memcpy(d,&tick,4);d+=4; memcpy(d,&wdog,1);d+=1; - memcpy(d,cfg_->device_type.toLocal8Bit(),cfg_->device_type.size()+1);d+=12; + memcpy(d,cfg_->device_type.data(),cfg_->device_type.size()+1);d+=12; iplist=cfg_->local_ip.split('.'); ip[0]=iplist[0].toInt(); ip[1]=iplist[1].toInt(); @@ -552,60 +626,44 @@ myarray bootinfo_fill_local(void) temp32|=1<slave_acked.size()){ - qWarning("slave addr err:%d",addr); - return; + qDebug("selfdev get bootinfo end."); + myarray r; + r.append(char(0)); + r+=bootinfo_fill_local(); + for(int i=0;i=slave_acked.size()){ - myarray r; - r.append(char(0)); - r+=bootinfo_fill_local(); - for(int i=0;idel_irq_fun(moter_down_cb_fun,"moter down"); + { + // 这里开始检测 + qDebug("start check."); + QList addrs=cfg->calc_slave_addrs(); + HandleBoardCast *s=new slave_cmd(); + bool ack=slave->set_boardcast_handle(addrs,s); + if(ack==false){ + qWarning("handle is busy."); + }else{ + connect(s,&HandleBoardCast::end_signal,this,&selfdev_measure_rescv::slave_end_slot); + s->cmd=0x05; + s->start(data); + } + } + }; + myarray moter_cmd=moter_ctrl("down"); + if(moter_cmd.size()==0){ + busy=0; + qWarning("moter failed."); + }else{ + m4->set_irq_fun(moter_down_cb_fun,"moter down"); + emit send_to_m4_signal(moter_cmd); + } + slave_acked.clear(); + for(int i=0;islave_num;i++){ + slave_acked.append(myarray()); + } + slave_acked_num=0; + return 0; +} + +void selfdev_measure_rescv::timeout() +{ + busy=0; +} + +void selfdev_measure_rescv::slave_end_slot(int addr,int ack, slave_data data) +{ + qDebug("selfdev measure_rescv end."); + emit send_to_m4_signal(moter_ctrl("up")); + myarray r; + r.append(char(0)); + for(int i=0;iset_boardcast_handle(cfg_->calc_slave_addrs(),b); + if(ack==false){ + qWarning("handle is busy."); + busy=0; + }else{ + connect(b,&HandleBoardCast::end_signal,this,&selfdev_set_rescv::slave_end_slot); + // 广播设置校准值,需使用新增命令 + b->cmd=0x13; + b->start(data); + } + slave_acked.clear(); + for(int i=0;islave_num;i++){ + slave_acked.append(myarray()); + } + slave_acked_num=0; + return 0; +} + +void selfdev_set_rescv::timeout() +{ + busy=0; +} + +void selfdev_set_rescv::slave_end_slot(int addr,int ack, slave_data data) +{ + qDebug("selfdev set_rescv end."); + myarray r; + r.append(char(0)); + emit send_data_signal(0x41,r); + busy=0; +} + +static HandlePc *get_selfdev_set_rescv(){ + return new selfdev_set_rescv(); +} +protpc_export(0x41, get_selfdev_set_rescv); + + + + + + diff --git a/prot_cmd/cmd_pc.h b/prot_cmd/cmd_pc.h index 997c32b..4368c42 100644 --- a/prot_cmd/cmd_pc.h +++ b/prot_cmd/cmd_pc.h @@ -38,6 +38,40 @@ signals: + +// 检测 自研批检仪 广播形式 +class selfdev_check2 : public HandlePc +{ + Q_OBJECT +public: + selfdev_check2() : HandlePc() { + slave_acked_num=0; + moter_down_cb_fun=nullptr; + } + ~selfdev_check2() { + if(moter_down_cb_fun!=nullptr){ + // 取消电机下降到位回调 + prot_m4 *m4 = protM4(); + if(m4!=nullptr) { + m4->del_irq_fun(moter_down_cb_fun,"moter "); + } + } + } + int dolater(int cmd, myarray data); + void timeout(); +public slots: + void slave_end_slot(int addr,int ack, slave_data data); +protected: + QList slave_acked; + int slave_acked_num; + prot_m4_cb moter_down_cb_fun; +signals: + void send_to_m4_signal(myarray data); +}; + + + + // 检测结束 自研批检仪 class selfdev_checkend : public HandlePc { @@ -148,8 +182,7 @@ public: int dolater(int cmd, myarray data); void timeout(); public slots: -// void slave_end_slot(int addr,int ack, slave_data data); - void slave_end_slot(int addr,int ack, myarray data); + void slave_end_slot(int addr,int ack, slave_data data); protected: QList slave_acked; int slave_acked_num; @@ -160,4 +193,62 @@ protected: + +// 测量电阻 +class selfdev_measure_rescv : public HandlePc +{ + Q_OBJECT +public: + selfdev_measure_rescv() : HandlePc() { + slave_acked_num=0; + } + ~selfdev_measure_rescv() { + if(moter_down_cb_fun!=nullptr){ + // 取消电机下降到位回调 + prot_m4 *m4 = protM4(); + if(m4!=nullptr) { + m4->del_irq_fun(moter_down_cb_fun,"moter "); + } + } + } + int dolater(int cmd, myarray data); + void timeout(); +public slots: + void slave_end_slot(int addr,int ack, slave_data data); +protected: + QList slave_acked; + int slave_acked_num; + prot_m4_cb moter_down_cb_fun; +signals: + void send_to_m4_signal(myarray data); +}; + + + + +// 设置电阻校准 +class selfdev_set_rescv : public HandlePc +{ + Q_OBJECT +public: + selfdev_set_rescv() : HandlePc() { + slave_acked_num=0; + } + ~selfdev_set_rescv() { + } + int dolater(int cmd, myarray data); + void timeout(); +public slots: + void slave_end_slot(int addr,int ack, slave_data data); +protected: + QList slave_acked; + int slave_acked_num; +signals: + void send_to_m4_signal(myarray data); +}; + + + + + #endif diff --git a/prot_cmd/cmd_slave.cpp b/prot_cmd/cmd_slave.cpp index d429498..63f4591 100644 --- a/prot_cmd/cmd_slave.cpp +++ b/prot_cmd/cmd_slave.cpp @@ -76,6 +76,7 @@ void slave_check2::timeout() int slave_check2::dolater(int cmd, myarray data) { + this->addr_response=0; timeout_stop_retry(); if(cmd==0x0c){ if(data.size()<=16){ @@ -449,7 +450,7 @@ int slave_bootinfo::start(myarray data) void slave_bootinfo::timeout() { timeout_stop(); - qWarning("addr %d get bootinfo.",addr); + qWarning("addr %d get bootinfo timeout.",addr); end(1,myarray()); busy=0; } @@ -460,6 +461,8 @@ int slave_bootinfo::dolater(int cmd, myarray data) qWarning("addr %d recv err cmd:%02x",addr,cmd); return 1; } + qWarning("addr %d get bootinfo success.",addr); + timeout_stop(); timeout_stop_retry(); end(0,data); busy=0; @@ -470,3 +473,42 @@ int slave_bootinfo::dolater(int cmd, myarray data) +int slave_cmd::start(myarray data) +{ + int timeout=5000; + busy=1; + qDebug("addr %d start ,timeout=%d",addr,timeout); + send_data(cmd,data,3); + timeout_start(timeout); + return 0; +} + +void slave_cmd::timeout() +{ + timeout_stop(); + qWarning("addr %d timeout.",addr); + end(1,ret_data); + busy=0; +} + +int slave_cmd::dolater(int cmd, myarray data) +{ + this->addr_response=0; + timeout_stop_retry(); + if(cmd==this->cmd){ + qDebug("cmd end success."); + busy=0; + end(0,ret_data); + timeout_stop(); + }else{ + qWarning("cmd:%02x err.",cmd); + } + return 0; +} + + + + + + + diff --git a/prot_cmd/cmd_slave.h b/prot_cmd/cmd_slave.h index ea42069..c009448 100644 --- a/prot_cmd/cmd_slave.h +++ b/prot_cmd/cmd_slave.h @@ -137,10 +137,23 @@ public: class slave_bootinfo:public HandleSlave { public: - slave_bootinfo():HandleSlave(){} - int start(myarray data); - int dolater(int cmd, myarray data); - void timeout(); + slave_bootinfo():HandleSlave(){} + int start(myarray data); + int dolater(int cmd, myarray data); + void timeout(); +}; + + + + +// 获取命令数据,使用前先设置cmd +class slave_cmd:public HandleBoardCast +{ +public: + slave_cmd():HandleBoardCast(){} + int start(myarray data); + int dolater(int cmd, myarray data); + void timeout(); };