广播方式升级从机成功

This commit is contained in:
ranchuan
2023-12-05 18:37:40 +08:00
parent 2451c5dfc5
commit 32129cbf9a
14 changed files with 431 additions and 54 deletions

View File

@@ -5,8 +5,38 @@
#include "QtNetwork"
#include "prot/prot_slave.h"
#include "prot_cmd/cmd_slave.h"
#include "base/check_cfg.h"
#include "QFile"
#include "base/base.h"
#include "cmd_cmdline.h"
void rate_slot(int rate,mystring str)
{
command *c=command_start();
mystring strs("rate:%1,%2");
strs=strs.arg(rate).arg(str);
c->send(strs.data());
}
void end_slot(int addr,int ack,myarray data)
{
command *c=command_start();
mystring strs("ack:%1,%2");
strs=strs.arg(ack).arg("end");
c->send(strs.data());
}
@@ -54,33 +84,83 @@ cmdline_export(whos, whos, print device base info.);
static void mcu_cmdlines(QList<myarray> args)
{
command *c=command_start();
prot_slave *slave=protSlave();
mycfg *cfg_=syscfg();
check_cfg *ccfg_=check_plan();
if(args.size()<2){
c->send("cmd len too less.");
return ;
}
if((args.size()>=4)&&(args[1]=="updata")){
if(args.size()>=4){
QList<int> addrs=str_to_nums<int>(args[2],',');
HandleBoardCast *b=new boardcast_updata();
prot_slave *slave=protSlave();
mycfg *cfg_=syscfg();
bool ack=slave->set_boardcast_handle(addrs,b);
if(ack==false){
qWarning("handle is busy.");
}else{
// connect(b,&HandleBoardCast::end_signal,nullptr,[=](int addr,int ack, myarray data){
// if(ack==0)
// c->send("slave updata success.");
// else
// c->send("slave updata failed.");
// });
QFile file;
file.setFileName(args[3]);
if(file.open(QIODevice::ReadOnly)){
myarray data=file.readAll();
b->start(data);
file.close();
// 升级小板程序
if(args[1]=="updata"){
HandleBoardCast *b=new boardcast_updata();
bool ack=slave->set_boardcast_handle(addrs,b);
if(ack==false){
qWarning("handle is busy.");
}else{
qWarning("open file failed.");
b->set_cbfun([=](int addr,int ack,myarray data){
end_slot(addr,!ack,data);
},[=](int rate,mystring str){
rate_slot(rate,str);
});
QFile file;
file.setFileName(args[3]);
if(file.open(QIODevice::ReadOnly)){
myarray data=file.readAll();
b->start(data);
file.close();
}else{
qWarning("open file failed.");
}
}
}
// 升级jwt程序
else if(args[1]=="upjwt"){
HandleBoardCast *b=new boardcast_updata_jwt();
bool ack=slave->set_boardcast_handle(addrs,b);
if(ack==false){
qWarning("handle is busy.");
}else{
b->set_cbfun([=](int addr,int ack,myarray data){
end_slot(addr,!ack,data);
},[=](int rate,mystring str){
rate_slot(rate,str);
});
QFile file;
file.setFileName(args[3]);
if(file.open(QIODevice::ReadOnly)){
myarray data=file.readAll();
b->start(data);
file.close();
}else{
qWarning("open file failed.");
}
}
}
}else if(args.size()>=3){
QList<int> addrs=str_to_nums<int>(args[2],',');
// 升级方案
if(args[1]=="scheme"){
HandleBoardCast *b=new boardcast_updata_scheme();
bool ack=slave->set_boardcast_handle(addrs,b);
if(ack==false){
qWarning("handle is busy.");
}else{
b->set_cbfun([=](int addr,int ack,myarray data){
end_slot(addr,!ack,data);
},[=](int rate,mystring str){
rate_slot(rate,str);
});
myarray data;
if(cfg_->slave_scheme_ext==0){
data=myarray((const char *)ccfg_->check_scheme()->slave_data,2048);
}else{
data=myarray((const char *)ccfg_->check_scheme(),ccfg_->check_scheme_size());
}
b->start(data);
}
}
}

30
prot_cmd/cmd_cmdline.h Normal file
View File

@@ -0,0 +1,30 @@
#ifndef CMD_CMDLINE_H
#define CMD_CMDLINE_H
#include "QObject"
#include "base/base.h"
//class cmd_line_slots:public QObject
//{
// Q_OBJECT
//public:
// cmd_line_slots(){}
// ~cmd_line_slots(){}
//public slots:
// void rate_slot(int rate,mystring str);
// void end_slot(int addr,int ack,myarray data);
//};
#endif // CMD_CMDLINE_H

View File

@@ -234,6 +234,7 @@ int selfdev_slaveupdate::dolater(int cmd, myarray data)
mystring name=data.mid(1,len_filename);
prot_slave *slave=protSlave();
mycfg *cfg_=syscfg();
busy=1;
qInfo()<<"slave_app name:"<<name<<endl;
data.remove(0,len_filename+1);
@@ -249,6 +250,7 @@ int selfdev_slaveupdate::dolater(int cmd, myarray data)
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_slaveupdate::slave_end_slot);
b->start(data);
@@ -258,12 +260,14 @@ int selfdev_slaveupdate::dolater(int cmd, myarray data)
}
void selfdev_slaveupdate::timeout(){
busy=0;
qDebug("slave update timeout");
}
void selfdev_slaveupdate::slave_end_slot(int addr,int ack, myarray data)
{
qDebug("slave update end,ack=%d",ack);
busy=0;
}
static HandlePc *get_selfdev_slaveupdate(){
@@ -276,3 +280,86 @@ protpc_export(0xfe, get_selfdev_slaveupdate);
int selfdev_update_scheme::dolater(int cmd, myarray data)
{
myarray r;
int len_filename=data[0];
mystring name=data.mid(1,len_filename);
prot_slave *slave=protSlave();
mycfg *cfg_=syscfg();
check_cfg *ccfg_=check_plan();
uint8_t rw=data[0];
data.remove(0,1);
busy=1;
if(rw==0)
{
// 读方案
r.append(char(0));
r.append(rw);
r.append(ccfg_->scheme_to_jstring());
emit send_data_signal(0x22,r);
busy=0;
}
else
{
// 写方案
bool ack=ccfg_->updata(QString(data));
r.append(ack?char(0):char(1));
r.append(rw);
if(ack){
// 检测数据保存
// if(comm_f_!=nullptr){
// delete comm_f_;
// comm_f_=nullptr;
// }
// 自动给小板升级
HandleBoardCast *b=new boardcast_updata_scheme();
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_update_scheme::slave_end_slot);
b->start(data);
}
}
else{
r.append("方案解析失败");
qWarning("scheme check failed.");
}
emit send_data_signal(0x22,r);
}
return 0;
}
void selfdev_update_scheme::timeout(){
busy=0;
qDebug("slave update timeout");
}
void selfdev_update_scheme::slave_end_slot(int addr,int ack, myarray data)
{
qDebug("slave update end,ack=%d",ack);
busy=0;
}
static HandlePc *get_selfdev_update_scheme(){
return new selfdev_update_scheme();
}
protpc_export(0x22, get_selfdev_update_scheme);

View File

@@ -90,5 +90,25 @@ signals:
// 升级方案
class selfdev_update_scheme : public HandlePc
{
Q_OBJECT
public:
selfdev_update_scheme() : HandlePc() {}
~selfdev_update_scheme() {}
int dolater(int cmd, myarray data);
void timeout();
public slots:
void slave_end_slot(int addr,int ack, myarray data);
signals:
void send_to_m4_signal(myarray data);
};
#endif

View File

@@ -218,7 +218,7 @@ void boardcast_updata::timeout()
int boardcast_updata::start(myarray data)
{
int timeout=50000;
int timeout=5000;
busy=1;
qWarning()<<"addr "<<addr<<" updata start.";
timeout_start(timeout);
@@ -231,8 +231,7 @@ int boardcast_updata::start(myarray data)
int boardcast_updata::dolater(int cmd, myarray data)
{
timeout_stop_retry();
timeout_start(50000);
timeout_start(5000);
if(step==0){
if(send_packet()==true){
step=1;
@@ -257,6 +256,8 @@ int boardcast_updata::dolater(int cmd, myarray data)
send_data(0xfb,s,10);
step=2;
}else if(step==2){
timeout_stop();
timeout_stop_retry();
qDebug("slave updata end.");
end(0,data);
busy=0;
@@ -268,7 +269,7 @@ bool boardcast_updata::send_packet()
{
if(count_sent<data.size()){
uint32_t addr=MCU_APP_ADDR_BASE+count_sent;
int pack_size=240;
int pack_size=236;
myarray s;
if(pack_size>data.size()-count_sent){
pack_size=data.size()-count_sent;
@@ -280,6 +281,7 @@ bool boardcast_updata::send_packet()
s+=data.mid(count_sent,pack_size);
count_sent+=pack_size;
send_data(0xfc,s,10);
rate(count_sent*100/data.size(),"slave_updata");
}
if(count_sent<data.size()){
return false;
@@ -289,3 +291,95 @@ bool boardcast_updata::send_packet()
}
void boardcast_updata_scheme::timeout()
{
timeout_stop();
qWarning("slave updata timeout.");
end(1,myarray());
busy=0;
}
int boardcast_updata_scheme::start(myarray data)
{
int timeout=5000;
busy=1;
base_addr=MCU_TASKID_ADDR_BASE;
qWarning()<<"addr "<<addr<<" updata start.";
timeout_start(timeout);
// 擦除
step=0;
this->data=data;
send_packet();
return 0;
}
int boardcast_updata_scheme::dolater(int cmd, myarray data)
{
timeout_start(5000);
if(step==0){
if(send_packet()==true){
step=1;
}
}else if(step==1){
send_data(0x15,myarray(),10);
step=2;
}else if(step==2){
timeout_stop();
timeout_stop_retry();
qDebug("slave updata scheme end.");
end(0,data);
busy=0;
}
return 0;
}
bool boardcast_updata_scheme::send_packet()
{
if(count_sent<data.size()){
uint32_t addr=base_addr+count_sent;
int pack_size=236;
myarray s;
if(pack_size>data.size()-count_sent){
pack_size=data.size()-count_sent;
}
s.append((addr)&0xff);
s.append((addr>>8)&0xff);
s.append((addr>>16)&0xff);
s.append((addr>>24)&0xff);
s+=data.mid(count_sent,pack_size);
count_sent+=pack_size;
send_data(0x11,s,10);
rate(count_sent*100/data.size(),"slave_updata_scheme");
}
if(count_sent<data.size()){
return false;
}else{
return true;
}
}
int boardcast_updata_jwt::start(myarray data)
{
int timeout=5000;
busy=1;
base_addr=MCU_JWT_ADDR_BASE;
qWarning()<<"addr "<<addr<<" updata start.";
timeout_start(timeout);
// 擦除
step=0;
this->data=data;
send_packet();
return 0;
}

View File

@@ -90,6 +90,33 @@ private:
// 方案升级
class boardcast_updata_scheme:public HandleBoardCast
{
public:
boardcast_updata_scheme():HandleBoardCast(){step=0;count_sent=0;base_addr=0;}
virtual int start(myarray data);
int dolater(int cmd, myarray data);
void timeout();
bool send_packet();
protected:
int step;
myarray data;
int count_sent;
uint32_t base_addr;
};
// jwt升级
class boardcast_updata_jwt:public boardcast_updata_scheme
{
public:
boardcast_updata_jwt():boardcast_updata_scheme(){step=0;count_sent=0;base_addr=0;}
int start(myarray data);
};