添加广播方式升级
This commit is contained in:
@@ -30,8 +30,8 @@ myarray moter_ctrl(myarray op)
|
||||
moter->moter_run = 1;
|
||||
count = -moter->moter_count - 100;
|
||||
moter->moter_count = 0;
|
||||
QString s = QString("moter %1").arg(count);
|
||||
r = s.toLocal8Bit();
|
||||
mystring s = mystring("moter %1").arg(count);
|
||||
r = myarray(s.data());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -47,8 +47,9 @@ myarray moter_ctrl(myarray op)
|
||||
moter->moter_run = 1;
|
||||
count = cfg_->moter_count - moter->moter_count;
|
||||
moter->moter_count += count;
|
||||
QString s = QString("moter %1").arg(count);
|
||||
r = s.toLocal8Bit();
|
||||
mystring s = mystring("moter %1").arg(count);
|
||||
r = myarray(s.data());
|
||||
qDebug("moter down:%s",s.data());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -56,7 +57,8 @@ myarray moter_ctrl(myarray op)
|
||||
return r;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
qDebug("moter ctrl:%s",op.data());
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,23 +70,24 @@ int selfdev_check::dolater(int cmd, myarray data)
|
||||
mycfg *cfg=syscfg();
|
||||
busy=1;
|
||||
connect(this, &selfdev_check::send_to_m4_signal, m4, &prot_m4::send_data_slot);
|
||||
m4->set_irq_fun([=](myarray data)
|
||||
{
|
||||
m4->del_irq_fun(nullptr,"moter ");
|
||||
if(data=="down"){
|
||||
// 这里开始检测
|
||||
QList<int> addrs=cfg->calc_slave_addrs();
|
||||
HandleSlave *s=new slave_check();
|
||||
foreach(int addr, addrs){
|
||||
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_check::slave_end_slot);
|
||||
}
|
||||
prot_m4_cb moter_down_cb=[=](myarray data)
|
||||
{
|
||||
m4->del_irq_fun(moter_down_cb,"moter ");
|
||||
if(data=="down"){
|
||||
// 这里开始检测
|
||||
QList<int> addrs=cfg->calc_slave_addrs();
|
||||
HandleSlave *s=new slave_check();
|
||||
foreach(int addr, addrs){
|
||||
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_check::slave_end_slot);
|
||||
}
|
||||
}
|
||||
},"moter ");
|
||||
}
|
||||
};
|
||||
m4->set_irq_fun(moter_down_cb,"moter ");
|
||||
emit send_to_m4_signal(moter_ctrl("down"));
|
||||
slave_acked.clear();
|
||||
for(int i=0;i<cfg->slave_num;i++){
|
||||
@@ -148,8 +151,32 @@ void selfdev_check::slave_end_slot(int addr,int ack, myarray data)
|
||||
static HandlePc *get_selfdev_check(){
|
||||
return new selfdev_check();
|
||||
}
|
||||
protpc_export(0x30, get_selfdev_check);
|
||||
|
||||
protpc_export(0xff, get_selfdev_check);
|
||||
int selfdev_moter::dolater(int cmd, myarray data)
|
||||
{
|
||||
prot_m4 *m4 = protM4();
|
||||
connect(this, &selfdev_moter::send_to_m4_signal, m4, &prot_m4::send_data_slot);
|
||||
if(data[0]==0x02){
|
||||
emit send_to_m4_signal(moter_ctrl("up"));
|
||||
}else if(data[0]==0x03){
|
||||
emit send_to_m4_signal(moter_ctrl("down"));
|
||||
}
|
||||
emit send_data_signal(0x40,myarray(1,char(0)));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void selfdev_moter::timeout(){
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
static HandlePc *get_selfdev_moter(){
|
||||
return new selfdev_moter();
|
||||
}
|
||||
|
||||
protpc_export(0x40, get_selfdev_moter);
|
||||
|
||||
|
||||
|
||||
|
@@ -22,4 +22,22 @@ signals:
|
||||
void send_to_m4_signal(myarray data);
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 电机 自研批检仪
|
||||
class selfdev_moter : public HandlePc
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
selfdev_moter() : HandlePc() {}
|
||||
~selfdev_moter() {}
|
||||
int dolater(int cmd, myarray data);
|
||||
void timeout();
|
||||
signals:
|
||||
void send_to_m4_signal(myarray data);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -2,23 +2,26 @@
|
||||
#include "base/mycfg.h"
|
||||
#include "base/check_cfg.h"
|
||||
#include "QDebug"
|
||||
#include "base/crc.h"
|
||||
|
||||
|
||||
|
||||
int slave_check::start(myarray data)
|
||||
{
|
||||
mycfg *cfg_=syscfg();
|
||||
int timeout=100000;
|
||||
check_cfg *ccfg_=check_plan();
|
||||
int timeout=ccfg_->get_check_time_out();
|
||||
busy=1;
|
||||
cmd=0x0c;
|
||||
qDebug("addr %d start check,timeout=%d",addr,timeout);
|
||||
send_data(cmd,myarray());
|
||||
send_data(cmd,myarray(),3);
|
||||
timeout_start(timeout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void slave_check::timeout()
|
||||
{
|
||||
timeout_stop();
|
||||
qWarning("addr %d check timeout.",addr);
|
||||
end(1,myarray());
|
||||
busy=0;
|
||||
@@ -30,11 +33,255 @@ int slave_check::dolater(int cmd, myarray data)
|
||||
qWarning("addr %d recv err cmd:%02x",addr,cmd);
|
||||
return 1;
|
||||
}
|
||||
end(0,data);
|
||||
busy=0;
|
||||
timeout_stop_retry();
|
||||
if(data.size()<=16){
|
||||
qDebug("addr %d recv first ack.",addr);
|
||||
}else{
|
||||
qDebug("addr %d recv secend ack.",addr);
|
||||
send_data(0x14,myarray(),1);
|
||||
end(0,data);
|
||||
busy=0;
|
||||
timeout_stop();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void slave_result::timeout()
|
||||
{
|
||||
timeout_stop();
|
||||
qWarning("addr %d result timeout.",addr);
|
||||
end(1,myarray());
|
||||
busy=0;
|
||||
}
|
||||
|
||||
int slave_result::start(myarray data)
|
||||
{
|
||||
int timeout=2000;
|
||||
busy=1;
|
||||
cmd=0x02;
|
||||
qDebug("addr %d read result,timeout=%d",addr,timeout);
|
||||
send_data(cmd,myarray(),10);
|
||||
timeout_start(timeout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int slave_result::dolater(int cmd, myarray data)
|
||||
{
|
||||
if(cmd!=this->cmd){
|
||||
qWarning("addr %d recv err cmd:%02x",addr,cmd);
|
||||
return 1;
|
||||
}
|
||||
timeout_stop_retry();
|
||||
end(0,data);
|
||||
busy=0;
|
||||
timeout_stop();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void slave_sethardver::timeout()
|
||||
{
|
||||
timeout_stop();
|
||||
qWarning("addr %d sethardver timeout.",addr);
|
||||
end(1,myarray());
|
||||
busy=0;
|
||||
}
|
||||
|
||||
int slave_sethardver::start(myarray data)
|
||||
{
|
||||
int timeout=2000;
|
||||
busy=1;
|
||||
cmd=0x03;
|
||||
qDebug("addr %d read sethardver,timeout=%d",addr,timeout);
|
||||
send_data(cmd,data,10);
|
||||
timeout_start(timeout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int slave_sethardver::dolater(int cmd, myarray data)
|
||||
{
|
||||
if(cmd!=this->cmd){
|
||||
qWarning("addr %d recv err cmd:%02x",addr,cmd);
|
||||
return 1;
|
||||
}
|
||||
timeout_stop_retry();
|
||||
end(0,data);
|
||||
busy=0;
|
||||
timeout_stop();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void slave_setresver::timeout()
|
||||
{
|
||||
timeout_stop();
|
||||
qWarning("addr %d setresver timeout.",addr);
|
||||
end(1,myarray());
|
||||
busy=0;
|
||||
}
|
||||
|
||||
int slave_setresver::start(myarray data)
|
||||
{
|
||||
int timeout=2000;
|
||||
busy=1;
|
||||
cmd=0x04;
|
||||
qDebug("addr %d read setresver,timeout=%d",addr,timeout);
|
||||
send_data(cmd,data,10);
|
||||
timeout_start(timeout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int slave_setresver::dolater(int cmd, myarray data)
|
||||
{
|
||||
if(cmd!=this->cmd){
|
||||
qWarning("addr %d recv err cmd:%02x",addr,cmd);
|
||||
return 1;
|
||||
}
|
||||
timeout_stop_retry();
|
||||
end(0,data);
|
||||
busy=0;
|
||||
timeout_stop();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void slave_resvalue::timeout()
|
||||
{
|
||||
timeout_stop();
|
||||
qWarning("addr %d resvalue timeout.",addr);
|
||||
end(1,myarray());
|
||||
busy=0;
|
||||
}
|
||||
|
||||
int slave_resvalue::start(myarray data)
|
||||
{
|
||||
int timeout=2000;
|
||||
busy=1;
|
||||
cmd=0x05;
|
||||
qDebug("addr %d read resvalue,timeout=%d",addr,timeout);
|
||||
send_data(cmd,data,10);
|
||||
timeout_start(timeout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int slave_resvalue::dolater(int cmd, myarray data)
|
||||
{
|
||||
if(cmd!=this->cmd){
|
||||
qWarning("addr %d recv err cmd:%02x",addr,cmd);
|
||||
return 1;
|
||||
}
|
||||
timeout_stop_retry();
|
||||
end(0,data);
|
||||
busy=0;
|
||||
timeout_stop();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 定义地址宏
|
||||
// 本程序中程序下载地址不是这个地址,在此用来计算偏移量
|
||||
#define MCU_APP_ADDR_BASE 0x8004000
|
||||
#define MCU_TASKID_ADDR_BASE 0x803f000
|
||||
#define MCU_JWT_ADDR_BASE 0x803B000
|
||||
|
||||
|
||||
|
||||
void boardcast_updata::timeout()
|
||||
{
|
||||
timeout_stop();
|
||||
qWarning("addr %d updata timeout.",addr);
|
||||
end(1,myarray());
|
||||
busy=0;
|
||||
}
|
||||
|
||||
int boardcast_updata::start(myarray data)
|
||||
{
|
||||
int timeout=5000;
|
||||
busy=1;
|
||||
qWarning()<<"addr "<<addr<<" updata start.";
|
||||
timeout_start(timeout);
|
||||
// 擦除
|
||||
step=0;
|
||||
send_data(0xfe,data,10);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int boardcast_updata::dolater(int cmd, myarray data)
|
||||
{
|
||||
timeout_stop_retry();
|
||||
timeout_start(5000);
|
||||
if(step==0){
|
||||
if(send_packet()==true){
|
||||
step=1;
|
||||
}
|
||||
}else if(step==1){
|
||||
uint32_t addr_start=MCU_APP_ADDR_BASE;
|
||||
uint32_t addr_end=MCU_APP_ADDR_BASE+count_sent;
|
||||
uint32_t crc32=crc::crc32(this->data);
|
||||
myarray s;
|
||||
s.append((addr_start)&0xff);
|
||||
s.append((addr_start>>8)&0xff);
|
||||
s.append((addr_start>>16)&0xff);
|
||||
s.append((addr_start>>24)&0xff);
|
||||
s.append((addr_end)&0xff);
|
||||
s.append((addr_end>>8)&0xff);
|
||||
s.append((addr_end>>16)&0xff);
|
||||
s.append((addr_end>>24)&0xff);
|
||||
s.append((crc32)&0xff);
|
||||
s.append((crc32>>8)&0xff);
|
||||
s.append((crc32>>16)&0xff);
|
||||
s.append((crc32>>24)&0xff);
|
||||
send_data(0xfb,s,10);
|
||||
step=2;
|
||||
}else if(step==2){
|
||||
end(0,data);
|
||||
busy=0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool boardcast_updata::send_packet()
|
||||
{
|
||||
if(count_sent<data.size()){
|
||||
uint32_t addr=MCU_APP_ADDR_BASE+count_sent;
|
||||
int pack_size=240;
|
||||
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(0xfc,s,10);
|
||||
}
|
||||
if(count_sent<data.size()){
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@@ -4,6 +4,8 @@
|
||||
#include "prot/prot_slave.h"
|
||||
|
||||
|
||||
|
||||
// 从机检测命令
|
||||
class slave_check:public HandleSlave
|
||||
{
|
||||
public:
|
||||
@@ -13,4 +15,84 @@ public:
|
||||
void timeout();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// 获取检测结果命令
|
||||
class slave_result:public HandleSlave
|
||||
{
|
||||
public:
|
||||
slave_result():HandleSlave(){}
|
||||
int start(myarray data);
|
||||
int dolater(int cmd, myarray data);
|
||||
void timeout();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// 设置硬件版本号命令
|
||||
class slave_sethardver:public HandleSlave
|
||||
{
|
||||
public:
|
||||
slave_sethardver():HandleSlave(){}
|
||||
int start(myarray data);
|
||||
int dolater(int cmd, myarray data);
|
||||
void timeout();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// 设置电阻校准值命令
|
||||
class slave_setresver:public HandleSlave
|
||||
{
|
||||
public:
|
||||
slave_setresver():HandleSlave(){}
|
||||
int start(myarray data);
|
||||
int dolater(int cmd, myarray data);
|
||||
void timeout();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// 获取电阻值命令
|
||||
class slave_resvalue:public HandleSlave
|
||||
{
|
||||
public:
|
||||
slave_resvalue():HandleSlave(){}
|
||||
int start(myarray data);
|
||||
int dolater(int cmd, myarray data);
|
||||
void timeout();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 程序升级
|
||||
class boardcast_updata:public HandleBoardCast
|
||||
{
|
||||
public:
|
||||
boardcast_updata():HandleBoardCast(){step=0;count_sent=0;}
|
||||
int start(myarray data);
|
||||
int dolater(int cmd, myarray data);
|
||||
void timeout();
|
||||
bool send_packet();
|
||||
private:
|
||||
int step;
|
||||
myarray data;
|
||||
int count_sent;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // CMD_SLAVE_H
|
||||
|
Reference in New Issue
Block a user