闫刚 qgc模块mavlinklog实现过程
mavlink log
qml部分
这样logController就和LogDownloadController进行了绑定。
AnalyzeView.qml
Rectangle {
id: setupView
GeoTagController {
id: geoController
}
LogDownloadController {
id: logController
}
MavlinkConsoleController {
id: conController
}
}
LogDownloadPage.qml
定义4个button,reflash, download, erase, cancel
Column {
spacing: _margin
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
QGCButton {
enabled:
text: qsTr("Refresh")
width: _butttonWidth
QGCButton {
logController.refresh()
QGCButton {
onAcceptedForLoad: {
logController.download(file)
QGCButton {
onClicked: logController.cancel()
cpp部分
log下载的对象创建
class LogDownloadController : public QObject
{
Q_INVOKABLE void refresh ();
Q_INVOKABLE void download (QString path = QString());
Q_INVOKABLE void eraseAll ();
Q_INVOKABLE void cancel ();
LogDownloadController声明
qmlRegisterType<LogDownloadController> (kQGCControllers, 1, 0, "LogDownloadController");
qmlRegisterType<GeoTagController> (kQGCControllers, 1, 0, "GeoTagController");
qmlRegisterType<MavlinkConsoleController> (kQGCControllers, 1, 0, "MavlinkConsoleController");
下载log的实现过程
mavlink_msg_log_request_data_pack_chan是mavlink包的接口了
LogDownloadController::download(QString path)
downloadToDirectory(dir);//选择文件
-> LogDownloadController::_setDownloading(bool active)
-> emit downloadingLogsChanged();
-> LogDownloadController::_receivedAllData()
-> LogDownloadController::_prepareLogDownload()
->_downloadData = new LogDownloadData(entry);
-> _downloadData->file.open(QIODevice::WriteOnly) //创建文件
-> _requestLogData(_downloadData->ID, 0, _downloadData->chunk_table.size()*MAVLINK_MSG_LOG_DATA_FIELD_DATA_LEN);
_timer.start(kTimeOutMilliseconds);
-> mavlink_msg_log_request_data_pack_chan(
-> _vehicle->sendMessageOnLink(_vehicle->priorityLink(), msg);
LogDownloadController::_setActiveVehicle(Vehicle* vehicle)
connect(_uas, &UASInterface::logEntry, this, &LogDownloadController::_logEntry);
connect(_uas, &UASInterface::logData, this, &LogDownloadController::_logData);
接收数据的过程
_logData就是从mavlink发送过程
LogDownloadController::_logData(UASInterface* uas,
-> const QString status = QString("%1 (%2/s)").arg(QGCMapEngine::bigSizeToString(_downloadData->written),
QGCMapEngine::bigSizeToString(_downloadData->rate_avg));
-> _downloadData->entry->setStatus(status);
-> if(_downloadData->file.write((const char*)data, count)) {