‘航线读取状态机完成,可以很快安全的传输航线,关于部分航线功能后面优化,同时发现串口缓存存在bug,明日修复

This commit is contained in:
hm
2020-03-18 00:17:40 +08:00
parent 3555b4ad94
commit f5b3fa5a09
6 changed files with 54 additions and 22 deletions
+1 -1
View File
@@ -109,7 +109,7 @@ void MainWindow::keyPressEvent(QKeyEvent *event) //键盘按下事件
if(event->modifiers() == Qt::AltModifier)
{
qInfo() << "alt + D";
dlink->mavlinknode->Mission->ReadCmd(0,0);
dlink->mavlinknode->Mission->ReadCmd(1,1);
}
break;
case Qt::Key_U :
+21 -7
View File
@@ -50,11 +50,11 @@ void MavLinkNode::start()
running_flag = true;
Nodethread->start();
qDebug() << "thread start" << running_flag;
qDebug() << "MavLinkNode thread start" << running_flag;
}
else
{
qDebug() << "thread has started";
qDebug() << "MavLinkNode thread has started";
}
}
@@ -89,6 +89,7 @@ void MavLinkNode::process()//线程函数
datagram = readbuff(SourceType::c_sock);//每次全部读取
if(!datagram.isEmpty())
{
//qDebug() << "client parse";
Mavlinkparse(SourceType::c_sock,datagram);
}
@@ -131,7 +132,7 @@ void MavLinkNode::setbuff(quint32 src,QByteArray data)
client_buff.buff[client_buff.select].clear();
}
client_buff.buff[client_buff.select].append(data);
//qDebug() << "set buff";
qDebug() << "buff" << client_buff.select << client_buff.buff[client_buff.select].size() ;
break;
case SourceType::s_port:
//当前的buff超过10M字节之后就清除,防爆机制,不然buff太大后容易卡死
@@ -154,12 +155,16 @@ QByteArray MavLinkNode::readbuff(quint32 src)
if(client_buff.select == 0)
{
datagram.setRawData(client_buff.buff[1],client_buff.buff[1].size());
//清除这个未选择的buff
client_buff.buff[1].clear();
//读取完成,可以往这个内存里面写数了
client_buff.select = 1;
}
else if(client_buff.select == 1)
{
datagram.setRawData(client_buff.buff[0],client_buff.buff[0].size());
//清除这个未选择的buff
client_buff.buff[0].clear();
//读取完成,可以往这个内存里面写数了
client_buff.select = 0;
}
@@ -276,16 +281,25 @@ void MavLinkNode::MAVLinkRcv_Handler(mavlink_message_t msg)
case MAVLINK_MSG_ID_EngineState:
case MAVLINK_MSG_ID_VFR_HUD:
StatusParse(msg);
//qDebug() << msg.compid << msg.sysid;
break;
//航线部分
case MAVLINK_MSG_ID_MISSION_REQUEST_LIST:
case MAVLINK_MSG_ID_MISSION_COUNT:
case MAVLINK_MSG_ID_MISSION_CURRENT:
case MAVLINK_MSG_ID_MISSION_ITEM:
case MAVLINK_MSG_ID_MISSION_ITEM_INT:
case MAVLINK_MSG_ID_MISSION_REQUEST:
case MAVLINK_MSG_ID_MISSION_REQUEST_INT:
case MAVLINK_MSG_ID_MISSION_REQUEST:
case MAVLINK_MSG_ID_MISSION_ITEM_INT:
case MAVLINK_MSG_ID_MISSION_ITEM:
case MAVLINK_MSG_ID_MISSION_ACK:
case MAVLINK_MSG_ID_MISSION_CURRENT:
case MAVLINK_MSG_ID_MISSION_SET_CURRENT:
case MAVLINK_MSG_ID_MISSION_CLEAR_ALL:
case MAVLINK_MSG_ID_MISSION_ITEM_REACHED:
case MAVLINK_MSG_ID_MISSION_REQUEST_PARTIAL_LIST:
case MAVLINK_MSG_ID_MISSION_WRITE_PARTIAL_LIST:
Mission->MissionParse(msg);
break;
+25 -7
View File
@@ -100,6 +100,7 @@ void MissionProcess::MissionParse(mavlink_message_t msg)
}break;
case MAVLINK_MSG_ID_MISSION_COUNT: {
mavlink_msg_mission_count_decode(&msg,&mission_count);
//qDebug() << "mission_count" << mission_count.count;
isRecieveCount = true;
}break;
case MAVLINK_MSG_ID_MISSION_REQUEST_INT: {
@@ -112,10 +113,12 @@ void MissionProcess::MissionParse(mavlink_message_t msg)
}break;
case MAVLINK_MSG_ID_MISSION_ITEM_INT: {
mavlink_msg_mission_item_int_decode(&msg,&mission_item_int);
isWaitingforItem = false;
//qDebug() << "recieve item int:" << mission_item_int.seq;
isWaitingforItem = false;//已经收到航点,不用再等待
}break;
case MAVLINK_MSG_ID_MISSION_ITEM: {
mavlink_msg_mission_item_decode(&msg,&mission_item);
//qDebug() << "recieve item:" << mission_item.seq;
isWaitingforItem = false;
}break;
case MAVLINK_MSG_ID_MISSION_ACK: {
@@ -153,9 +156,12 @@ void MissionProcess::ReadStateMachine(void)
if(step == 0)
{
qDebug() << "start reading mission";
isRecieveCount = false;
request_list();//请求读取某一个设备的航线
step++;//下一个阶段
time = QTime::currentTime().msecsSinceStartOfDay();
}
else if(step == 1)//等待收到Count
{
@@ -177,28 +183,38 @@ void MissionProcess::ReadStateMachine(void)
{
if(isRecieveCount == true)//收到count
{
qDebug() << "step" << step << "isRecieveCount" << isRecieveCount;
timeout_count = 0;
isWaitingforItem = false;
isRecieveCount = false;
isWaitingforItem = true;
request_int(0);//读取0点
step ++;
}
}
}
else if(step ==3)//请求航点
else if(step ==2)//请求航点
{
if(isWaitingforItem == false)
{
//分成两类,int和不带int
if(mission_item_int.seq < mission_count.count)
if((mission_item_int.seq+1) < mission_count.count)
{
qDebug() << "mission_item_int.seq+1" << (mission_item_int.seq+1);
isWaitingforItem = true;
request_int(mission_item_int.seq+1);
//定时
time = QTime::currentTime().msecsSinceStartOfDay();
isWaitingforItem = true;
}
else
{
qDebug() << "mission recieve all";
step++;
}
}
@@ -216,7 +232,7 @@ void MissionProcess::ReadStateMachine(void)
timeout_count = 0;
qDebug() << "mission read fail";
}
isWaitingforItem = false;
isWaitingforItem = false;//重新发送一次
}
else
{
@@ -224,8 +240,10 @@ void MissionProcess::ReadStateMachine(void)
}
}
}
else if(step == 4)//航线传输结束,发送ack
else if(step == 3)//航线传输结束,发送ack
{
qDebug() << "step" << step << "transmit ok";
ack();
step = 0;
m_TransmitMode = 0;//切换到什么都不做
+1 -1
View File
@@ -80,7 +80,7 @@ private slots:
signals:
void readError();
void SendMessageTo(uint8_t ch, uint8_t *data,uint16_t len);
void SendMessageTo(quint8 ch, quint8 *data,quint16 len);
private:
+4 -4
View File
@@ -9,9 +9,9 @@ DLink::DLink(QObject *parent) : QObject(parent)
{
qDebug() << "Dlink " << QThread::currentThreadId();
mavlinknode = new MavLinkNode(this);
// connect(mavlinknode->Mission,SIGNAL(SendMessageTo(uint8_t,uint8_t*,uint16_t)),
// this,SLOT(SendMessageTo(uint8_t,uint8_t*,uint16_t)));
mavlinknode = new MavLinkNode();//不允许带参数,因为这是单独的线程
connect(mavlinknode->Mission,SIGNAL(SendMessageTo(quint8,quint8*,quint16)),
this,SLOT(SendMessageTo(quint8,quint8*,quint16)));
}
DLink::~DLink()
{
@@ -20,7 +20,7 @@ DLink::~DLink()
}
int DLink::SendMessageTo(uint8_t ch, uint8_t *msg, uint16_t len)
int DLink::SendMessageTo(quint8 ch, quint8 *msg, quint16 len)
{
if (DLink::Clientsock)
{
+1 -1
View File
@@ -51,7 +51,7 @@ public slots:
void readPendingDatagramsClient(void);
int SendMessageTo(uint8_t ch, uint8_t *msg, uint16_t len);
int SendMessageTo(quint8 ch, quint8 *msg, quint16 len);
protected: