diff --git a/ReadMe.txt b/ReadMe.txt index 841f216..cfd3277 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -40,6 +40,11 @@ 2023.12.27 添加tcp心跳 添加升级小板程序、方案、jwt文件的进度条命令 +2023.12.29 + 添加tran命令透传小板命令 + 添加slave_info命令测试小板通信状态 + 添加cfginfo命令显示配置文件信息 + 按键处于按下状态才响应检测命令 diff --git a/complier_info.h b/complier_info.h index 0c2647e..035bebe 100644 --- a/complier_info.h +++ b/complier_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-12-27 11:25:22" +#define BUILD_DATE "2023-12-29 17:59:05" diff --git a/info.json b/info.json index f2434c7..b12c113 100644 --- a/info.json +++ b/info.json @@ -1,5 +1,5 @@ { - "build_date": "2023-12-27 11:25:22", + "build_date": "2023-12-29 17:59:05", "hard_version": "MHPZ2_V1.00", "private": [ "info.json", diff --git a/interface/codec_ym.cpp b/interface/codec_ym.cpp index b29eef4..8c97092 100644 --- a/interface/codec_ym.cpp +++ b/interface/codec_ym.cpp @@ -124,13 +124,17 @@ int CodecYm::packCheck(myarray data) return ack; } uint8_t chk_a = 0, chk_b = 0; + uint8_t rchk_a=uint8_t(data[data.size() - 2]),rchk_b=uint8_t(data[data.size() - 1]); crc::crc16((uint8_t *)data.data(), 2, len + 4, &chk_a, &chk_b); - if (chk_a != uint8_t(data[data.size() - 2]) || chk_b != uint8_t(data[data.size() - 1])) + if (chk_a != rchk_a || chk_b != rchk_b) { // crc校验不对 - qWarning("recv data check error:%02x,%02x %02x,%02x", chk_a, chk_b, int(data[data.size() - 2]), - int(data[data.size() - 1])); - failed=true; + if(rchk_a!=0xff||rchk_b!=0xff){ + qWarning("recv data check error:%02x,%02x %02x,%02x", chk_a, chk_b, rchk_a, rchk_b); + failed=true; + }else{ + qWarning("recv data check is 0xff 0xff,seen as check right."); + } } // 保存此流水号 cmd_no = data[5] | (data[6] << 8); diff --git a/interface/if_can.cpp b/interface/if_can.cpp index 9509caf..e4ded2f 100644 --- a/interface/if_can.cpp +++ b/interface/if_can.cpp @@ -80,6 +80,7 @@ can_host::can_host(int bitrate) this->bitrate = bitrate; this->can_ = nullptr; timer_ = nullptr; + recv_cb_fun=nullptr; } can_host::~can_host() @@ -166,8 +167,7 @@ void can_host::freams_sent_cb(qint64 count) void can_host::recv_data_cb() { YeCanID_un frame_id; - while (can_->framesAvailable()) - { + while (can_->framesAvailable()){ const QCanBusFrame frame = can_->readFrame(); frame_id.Exide = frame.frameId(); if (frame_id.Exide == 0x000000) @@ -178,49 +178,47 @@ void can_host::recv_data_cb() uint8_t seg_flag = frame_id.yecanid.SegFlag; int seg_num = frame_id.yecanid.SegNum; can_slave &slave = get_slave_by_addr(slave_addr); - if (seg_flag == 0x00) - { + if (seg_flag == 0x00){ // 不分段 slave.clear(); slave.append(payload); qDebug()<<"can recv from:"< can_recv_cb; + + + + // 定义can从机对象 class can_slave : public QObject { @@ -48,7 +58,9 @@ public: void init(); int write(myarray data){return 0;} int write(int dst,myarray data); - + void set_irq(can_recv_cb fun){ + recv_cb_fun=fun; + } private: can_slave &get_slave_by_addr(uint8_t addr); void append(uint8_t addr, uint8_t fun_class, QByteArray data); @@ -70,6 +82,7 @@ private: QList send_packets; QList recv_packets; QTimer *timer_; + can_recv_cb recv_cb_fun; }; #endif diff --git a/prot_cmd/cmd_cmdline.cpp b/prot_cmd/cmd_cmdline.cpp index 19dd97f..92f091c 100644 --- a/prot_cmd/cmd_cmdline.cpp +++ b/prot_cmd/cmd_cmdline.cpp @@ -9,10 +9,19 @@ #include "QFile" #include "base/base.h" #include "cmd_cmdline.h" +#include "interface/if_can.h" +#include "elec/mystring.h" +/* +命令行返回有三种 +data:[str] +rate:[rate%],[str] +end:[1:ok/0:failed],[str] + +*/ @@ -26,9 +35,10 @@ void rate_slot(int rate,mystring str) } void end_slot(int addr,int ack,slave_data data) { + // ack 0是成功,这里转化为1是成功 command *c=command_start(); mystring strs("ack:%1,%2"); - strs=strs.arg(ack).arg("end"); + strs=strs.arg(!ack).arg("end"); c->send(strs.data()); } @@ -79,8 +89,16 @@ cmdline_export(whos, whos, print device base info.); - -// mcu 相关 +static void mcu_cmdlines_help(){ + command *c=command_start(); + c->send("mcu updata [addrs] [file_name] to updata slave app,for example:\n" + "\tmcu updata 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 /home/root/config/checker_slave_app.pkt"); + c->send("mcu upjwt [addrs] [file_name] to updata jwt app,for example:\n" + "\tmcu upjwt 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 /home/root/config/jwt_app.jwt"); + c->send("mcu scheme [addrs] to updata slave scheme,for example:\n" + "\tmcu scheme 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20"); +} +// mcu 升级程序及方案等 static void mcu_cmdlines(QList args) { command *c=command_start(); @@ -89,11 +107,12 @@ static void mcu_cmdlines(QList args) check_cfg *ccfg_=check_plan(); if(args.size()<2){ c->send("cmd len too less."); + mcu_cmdlines_help(); return ; } if(args.size()>=4){ QList addrs=str_to_nums(args[2],','); - + qDebug()<<"addrs:"< args) } }else if(args.size()>=3){ QList addrs=str_to_nums(args[2],','); + qDebug()<<"addrs:"< args) qWarning("handle is busy."); }else{ b->set_cbfun([=](int addr,int ack,slave_data data){ - end_slot(addr,!ack,data); + end_slot(addr,ack,data); },[=](int rate,mystring str){ rate_slot(rate,str); }); @@ -165,7 +185,108 @@ static void mcu_cmdlines(QList args) } } } -cmdline_export(mcu, mcu_cmdlines, mcu cmdlines` input [mcu help] to detail.); +cmdline_export(mcu, mcu_cmdlines, mcu cmdlines` input [mcu] for detail.); + + + + + +static int g_slave_addr; +static void mcu_tran_cmdlines(QList args){ + command *c=command_start(); + mycfg *cfg_=syscfg(); + check_cfg *ccfg_=check_plan(); + can_host *can_=static_cast(interFaceFind("can")); + if(args.size()<3){ + c->send("cmd len too less."); + c->send("tran [addr] [cmdline],for example\n" + "\ttran 1 sysinfo"); + return ; + } + QList addrs=str_to_nums(args[1],','); + qDebug()<<"addrs:"<set_irq([=](int src,myarray data){ + if(str_is_print_str(data.data(),data.size())!=1){ + return; + } + if(g_slave_addr!=src){ + mystring str="src=%1"; + str=str.arg(src); + c->send(str.toLocal8Bit()); + } + c->send(data); + }); + can_->write(g_slave_addr,can_d); +} +cmdline_export(tran, mcu_tran_cmdlines, tran cmdline to slave.); + + + + + +static void slave_info(QList args){ + command *c=command_start(); + prot_slave *slave=protSlave(); + mycfg *cfg_=syscfg(); + HandleBoardCast *b=new slave_cmd2(); + bool ack=slave->set_boardcast_handle(cfg_->calc_slave_addrs(),b); + if(ack==false){ + qWarning("handle is busy."); + }else{ + b->set_cbfun([=](int addr,int ack,slave_data data){ + myarray r=myarray("data:",5); + for(int i=0;islave_num;i++){ + myarray t=data[i]; + if(t.size()>0){ + r.append("ok,"); + }else{ + r.append("ng,"); + } + } + c->send(r); + },nullptr); + b->cmd=0x13; + b->start(myarray()); + } +} +cmdline_export(slave_info, slave_info, get slave communicat info.); + + + + +#define print_item(str,data){\ + myarray r=str;\ + r[r.size()-1]=':';\ + r.append(data);\ + c->send(r);\ +} + + +static void cfginfo(QList args){ + command *c=command_start(); + prot_slave *slave=protSlave(); + mycfg *cfg_=syscfg(); + print_item("tcp_enable",cfg_->tcp_enable?"true":"false"); + print_item("server_ip",cfg_->server_ip.toLocal8Bit()); + print_item("server_port",mystring::number(cfg_->server_port).toLocal8Bit()); + print_item("local_id",mystring::number(cfg_->local_id).toLocal8Bit()); + print_item("can_bitrate",mystring::number(cfg_->can_bitrate).toLocal8Bit()); + print_item("slave_num",mystring::number(cfg_->slave_num).toLocal8Bit()); + print_item("moter_count",mystring::number(cfg_->moter_count).toLocal8Bit()); + print_item("uart_bsp",mystring::number(cfg_->uart_bsp).toLocal8Bit()); + print_item("coder_return_mode",mystring::number(cfg_->coder_return_mode).toLocal8Bit()); + print_item("slave_addr_start",mystring::number(cfg_->slave_addr_start).toLocal8Bit()); +} +cmdline_export(cfginfo, cfginfo, get cfg info.); + + + diff --git a/prot_cmd/cmd_coder.cpp b/prot_cmd/cmd_coder.cpp index 752d6ce..da9144a 100644 --- a/prot_cmd/cmd_coder.cpp +++ b/prot_cmd/cmd_coder.cpp @@ -5,6 +5,7 @@ #include "elec/JQ_PSDGenerate.h" #include "elec/JQ_UIDGenerate.h" #include "elec/PSDGenerate.h" +#include "prot_cmd/cmd_m4.h" @@ -655,19 +656,24 @@ int cmd_checker_check::dolater(int cmd, myarray 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;iset_irq_fun(moter_down_cb_fun,"moter down"); + emit send_to_m4_signal(moter_cmd); + }else{ + qWarning("key not pressed,check will not start."); + return 2; + } return 0; } diff --git a/prot_cmd/cmd_m4.cpp b/prot_cmd/cmd_m4.cpp index 44b5f2f..b360555 100644 --- a/prot_cmd/cmd_m4.cpp +++ b/prot_cmd/cmd_m4.cpp @@ -43,7 +43,15 @@ void cmd_m4_init() // },"key press"); } - +// 返回1则按键已按下 +int cmd_m4_key_pressed() +{ + if(g_self.key_pressed){ + return 1; + }else{ + return 0; + } +} diff --git a/prot_cmd/cmd_m4.h b/prot_cmd/cmd_m4.h index 6ae07b0..2d65a21 100644 --- a/prot_cmd/cmd_m4.h +++ b/prot_cmd/cmd_m4.h @@ -7,6 +7,7 @@ void cmd_m4_init(); +int cmd_m4_key_pressed(); diff --git a/prot_cmd/cmd_pc.cpp b/prot_cmd/cmd_pc.cpp index c4b78f1..6db62e6 100644 --- a/prot_cmd/cmd_pc.cpp +++ b/prot_cmd/cmd_pc.cpp @@ -8,6 +8,7 @@ #include "QDebug" #include "elec/elec_judge.h" #include "QDateTime" +#include "prot_cmd/cmd_m4.h" typedef struct { @@ -96,19 +97,24 @@ int selfdev_check::dolater(int cmd, myarray 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; + myarray moter_cmd=moter_ctrl("down"); + if(moter_cmd.size()==0){ + busy=0; + qWarning("moter failed."); + return 1; + } + if(cmd_m4_key_pressed()!=0){ + m4->set_irq_fun(moter_down_cb_fun,"moter down"); + emit send_to_m4_signal(moter_cmd); + }else{ + qWarning("key not pressed,check will not start."); + return 2; + } return 0; } diff --git a/prot_cmd/cmd_slave.cpp b/prot_cmd/cmd_slave.cpp index cc7fbe5..b44ead1 100644 --- a/prot_cmd/cmd_slave.cpp +++ b/prot_cmd/cmd_slave.cpp @@ -581,7 +581,7 @@ int slave_cmd::dolater(int cmd, myarray data) int slave_cmd2::start(myarray data) { - int timeout=5000; + int timeout=3500; busy=1; // 这里addr是bit数,用16进制打印 qDebug("addr 0x%06X start ,timeout=%d",addr,timeout);