2020-03-20 22:54:20 +08:00
|
|
|
#include "ParameterInspector.h"
|
|
|
|
|
#include "ui_ParameterInspector.h"
|
|
|
|
|
|
|
|
|
|
ParameterInspector::ParameterInspector(QWidget *parent) :
|
|
|
|
|
QWidget(parent),
|
|
|
|
|
ui(new Ui::ParameterInspector)
|
|
|
|
|
{
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
|
|
|
|
|
setWindowTitle(tr("ParameterInspector"));
|
|
|
|
|
|
2020-03-22 22:40:26 +08:00
|
|
|
// Make sure "All" is an option for both the system and components
|
|
|
|
|
ui->systemComboBox->addItem(tr("All"), 0);
|
|
|
|
|
ui->componentComboBox->addItem(tr("All"), 0);
|
2020-03-20 22:54:20 +08:00
|
|
|
|
2020-03-22 22:40:26 +08:00
|
|
|
// Set up the column headers for the message listing
|
|
|
|
|
QStringList header;
|
|
|
|
|
header << tr("Name");
|
|
|
|
|
header << tr("Value");
|
|
|
|
|
ui->treeWidget->setHeaderLabels(header);
|
2020-03-20 22:54:20 +08:00
|
|
|
|
2020-03-24 21:49:35 +08:00
|
|
|
|
|
|
|
|
TimerRunningFlag = true;
|
2020-03-24 19:23:40 +08:00
|
|
|
QTimer::singleShot(1000,this,SLOT(mReflush()));
|
2020-03-20 22:54:20 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ParameterInspector::~ParameterInspector()
|
|
|
|
|
{
|
2020-03-24 21:49:35 +08:00
|
|
|
TimerRunningFlag = false;
|
|
|
|
|
|
|
|
|
|
//clear 那些消息
|
|
|
|
|
|
2020-03-20 22:54:20 +08:00
|
|
|
delete ui;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
void ParameterInspector::mReflush()
|
|
|
|
|
{
|
|
|
|
|
if(isReflush == true)
|
|
|
|
|
{
|
|
|
|
|
isReflush = false;
|
|
|
|
|
|
|
|
|
|
ui->progressBar->setValue(currentpersent);
|
|
|
|
|
|
|
|
|
|
refreshView();
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-24 21:49:35 +08:00
|
|
|
if(TimerRunningFlag == true)
|
|
|
|
|
{
|
|
|
|
|
QTimer::singleShot(10,this,SLOT(mReflush()));
|
|
|
|
|
}
|
2020-03-23 18:39:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-03-20 22:54:20 +08:00
|
|
|
void ParameterInspector::resizeEvent(QResizeEvent * event)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(event);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
//添加一个设备,
|
2020-04-14 18:43:01 +08:00
|
|
|
void ParameterInspector::addVehicles(uint16_t sysid,uint16_t compid)
|
2020-03-23 18:39:05 +08:00
|
|
|
{
|
2020-04-14 18:43:01 +08:00
|
|
|
if(!vehicles.keys().contains(sysid))
|
2020-03-23 18:39:05 +08:00
|
|
|
{
|
|
|
|
|
//如果还没有这个设备,就添加一个
|
|
|
|
|
QMap<int, mavlink_param_value_t> param;
|
2020-04-14 18:43:01 +08:00
|
|
|
vehicles.insert(sysid,param);
|
2020-03-23 18:39:05 +08:00
|
|
|
|
|
|
|
|
//同时检查combox有没有,没有就添加
|
2020-04-14 18:43:01 +08:00
|
|
|
if(ui->systemComboBox->findText(tr("Vehicle %1").arg(sysid)) == (-1))
|
2020-03-23 18:39:05 +08:00
|
|
|
{
|
2020-04-14 18:43:01 +08:00
|
|
|
ui->systemComboBox->addItem(tr("Vehicle %1").arg(sysid), sysid);
|
2020-03-23 18:39:05 +08:00
|
|
|
}
|
2020-04-14 18:43:01 +08:00
|
|
|
}
|
2020-03-24 19:23:40 +08:00
|
|
|
|
|
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
|
2020-04-14 18:43:01 +08:00
|
|
|
//同时检查combox有没有,没有就添加
|
|
|
|
|
if(ui->componentComboBox->findText(tr("Comp %1").arg(compid)) == (-1))
|
|
|
|
|
{
|
|
|
|
|
ui->componentComboBox->addItem(tr("Comp %1").arg(compid), compid);
|
|
|
|
|
}
|
2020-03-24 19:23:40 +08:00
|
|
|
|
|
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
}
|
|
|
|
|
|
2020-03-20 22:54:20 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-03-22 22:40:26 +08:00
|
|
|
//直接接受整个msg,这个函数传来的只有param_value这一帧,因此不需要识别
|
|
|
|
|
void ParameterInspector::appendParameter(mavlink_message_t msg)
|
2020-03-20 22:54:20 +08:00
|
|
|
{
|
2020-03-22 22:40:26 +08:00
|
|
|
//查找这个消息归属的设备和部件
|
|
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
if(!vehicles.keys().contains(msg.sysid))
|
2020-03-20 22:54:20 +08:00
|
|
|
{
|
2020-03-23 18:39:05 +08:00
|
|
|
//如果还没有这个设备,就添加一个
|
|
|
|
|
QMap<int, mavlink_param_value_t> param;
|
|
|
|
|
vehicles.insert(msg.sysid,param);
|
|
|
|
|
|
|
|
|
|
//同时检查combox有没有,没有就添加
|
|
|
|
|
if(ui->systemComboBox->findText(tr("Vehicle %1").arg(msg.sysid)) == (-1))
|
|
|
|
|
{
|
|
|
|
|
ui->systemComboBox->addItem(tr("Vehicle %1").arg(msg.sysid), msg.sysid);
|
|
|
|
|
}
|
2020-03-20 22:54:20 +08:00
|
|
|
}
|
|
|
|
|
|
2020-03-22 22:40:26 +08:00
|
|
|
//解码
|
|
|
|
|
mavlink_param_value_t param_value;//
|
|
|
|
|
mavlink_msg_param_value_decode(&msg,¶m_value);
|
|
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
|
|
|
|
|
//如果当前是航点0,那么设置状态条
|
|
|
|
|
if(param_value.param_index == 0)
|
2020-03-22 22:40:26 +08:00
|
|
|
{
|
2020-03-23 18:39:05 +08:00
|
|
|
ui->progressBar->setMaximum(0);
|
|
|
|
|
ui->progressBar->setMaximum(param_value.param_count - 1);
|
2020-03-22 22:40:26 +08:00
|
|
|
}
|
|
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
//这里可能有bug,程序会死机
|
|
|
|
|
//ui->progressBar->setValue((int)param_value.param_index);
|
2020-03-22 22:40:26 +08:00
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
currentpersent = param_value.param_index;
|
2020-03-22 22:40:26 +08:00
|
|
|
|
|
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
//qDebug() << QThread::currentThreadId();
|
2020-03-22 22:40:26 +08:00
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
//检查是否包含了该参数,如果没有,那么添加
|
|
|
|
|
QMap<int, mavlink_param_value_t> ParameterStorage;
|
|
|
|
|
ParameterStorage = vehicles.value(msg.sysid);
|
2020-03-22 22:40:26 +08:00
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
ParameterStorage.insert(param_value.param_index,param_value);
|
|
|
|
|
vehicles.insert(msg.sysid,ParameterStorage);
|
2020-03-22 22:40:26 +08:00
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
//需要刷新一次
|
2020-03-20 22:54:20 +08:00
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
isReflush = true;
|
2020-03-20 22:54:20 +08:00
|
|
|
}
|
2020-03-23 18:39:05 +08:00
|
|
|
void ParameterInspector::refreshView()//来一个参数更新一次
|
2020-03-20 22:54:20 +08:00
|
|
|
{
|
2020-03-24 19:23:40 +08:00
|
|
|
QMap<int,QMap<int,mavlink_param_value_t>>::iterator ite;
|
2020-03-20 22:54:20 +08:00
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
for(ite=vehicles.begin(); ite!=vehicles.end();++ite)//每一个key下面都是一个设备的所有参数
|
2020-03-23 18:39:05 +08:00
|
|
|
{
|
2020-03-24 19:23:40 +08:00
|
|
|
//查找参数的index
|
|
|
|
|
QMap<int,mavlink_param_value_t> params = ite.value();//得到所有参数item
|
|
|
|
|
QMap<int,mavlink_param_value_t>::iterator param_ite;
|
2020-03-20 22:54:20 +08:00
|
|
|
|
2020-03-22 22:40:26 +08:00
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
QMap<int, QTreeWidgetItem* > widgetitems;//获取单独一个设备的参数显示条
|
|
|
|
|
widgetitems = uasParamTreeItems.value(ite.key());
|
2020-03-22 22:40:26 +08:00
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
for(param_ite=params.begin(); param_ite!=params.end();++param_ite)//历遍每一个参数
|
|
|
|
|
{
|
|
|
|
|
mavlink_param_value_t param = param_ite.value();//每一个value
|
|
|
|
|
QString paraName = param_id(param.param_id); //得到名称
|
|
|
|
|
|
|
|
|
|
qDebug() << paraName;//ok
|
|
|
|
|
|
|
|
|
|
//查找这个value是不是已经存,存在更新,不存在则建立
|
|
|
|
|
bool paramFound = false;
|
|
|
|
|
|
|
|
|
|
foreach (QTreeWidgetItem* Item, widgetitems.values()) {
|
|
|
|
|
if(Item->data(0,Qt::DisplayRole) == param_id(param.param_id))
|
|
|
|
|
{
|
|
|
|
|
//这个设备已经存在
|
|
|
|
|
paramFound = true;
|
|
|
|
|
//更新该参数
|
2020-03-24 20:12:29 +08:00
|
|
|
Item->setData(1,Qt::DisplayRole,param_value(param));
|
2020-03-24 19:23:40 +08:00
|
|
|
widgetitems.insert(param.param_index,Item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!paramFound)//没有找到
|
|
|
|
|
{
|
|
|
|
|
//没有找到,新建一个组
|
|
|
|
|
QTreeWidgetItem* paraItem = new QTreeWidgetItem();
|
|
|
|
|
paraItem->setData(0,Qt::DisplayRole,param_id(param.param_id));
|
2020-03-24 20:12:29 +08:00
|
|
|
paraItem->setData(1,Qt::DisplayRole,param_value(param));
|
2020-03-24 19:23:40 +08:00
|
|
|
widgetitems.insert(param.param_index,paraItem);
|
|
|
|
|
}
|
2020-03-22 22:40:26 +08:00
|
|
|
}
|
|
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
uasParamTreeItems.insert(ite.key(),widgetitems);//保存一整个设备的参数
|
2020-03-22 22:40:26 +08:00
|
|
|
|
2020-03-20 22:54:20 +08:00
|
|
|
|
|
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
//得到一个vehicle
|
|
|
|
|
bool VehicleFound = false;
|
|
|
|
|
foreach (QTreeWidgetItem* Item, uasTopLevelItems.values()) {
|
|
|
|
|
if(Item->data(0,Qt::DisplayRole) == tr("Vehicle %1").arg(ite.key()))
|
2020-03-23 18:39:05 +08:00
|
|
|
{
|
2020-03-24 19:23:40 +08:00
|
|
|
//这个设备已经存在
|
|
|
|
|
VehicleFound = true;
|
|
|
|
|
//存在测更新
|
|
|
|
|
Item->addChildren(uasParamTreeItems.value(ite.key()).values());
|
|
|
|
|
uasTopLevelItems.insert(ite.key(),Item);
|
2020-03-23 18:39:05 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
if(!VehicleFound)//没有找到
|
2020-03-23 18:39:05 +08:00
|
|
|
{
|
2020-03-24 19:23:40 +08:00
|
|
|
//没有找到,新建一个组
|
|
|
|
|
QTreeWidgetItem* TopItem = new QTreeWidgetItem();
|
|
|
|
|
TopItem->setData(0,Qt::DisplayRole,tr("Vehicle %1").arg(ite.key()));
|
|
|
|
|
|
|
|
|
|
TopItem->addChildren(uasParamTreeItems.value(ite.key()).values());
|
|
|
|
|
|
|
|
|
|
uasTopLevelItems.insert(ite.key(),TopItem);
|
2020-03-23 18:39:05 +08:00
|
|
|
}
|
|
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
ui->treeWidget->addTopLevelItems(uasTopLevelItems.values());
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-23 18:39:05 +08:00
|
|
|
|
|
|
|
|
|
2020-03-25 12:11:44 +08:00
|
|
|
void ParameterInspector::clearview(void)
|
|
|
|
|
{
|
|
|
|
|
QMap<int, QMap<int, QTreeWidgetItem*>>::iterator ite;
|
|
|
|
|
for (ite=uasParamTreeItems.begin(); ite!=uasParamTreeItems.end();++ite)
|
|
|
|
|
{
|
|
|
|
|
QMap<int, QTreeWidgetItem*> param_ite = ite.value();
|
|
|
|
|
|
|
|
|
|
QList<int> groupKeys = param_ite.uniqueKeys();
|
|
|
|
|
QList<int>::iterator listKeys;
|
|
|
|
|
for (listKeys=groupKeys.begin();listKeys!=groupKeys.end();++listKeys)
|
|
|
|
|
{
|
|
|
|
|
delete param_ite.take(*listKeys);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
uasParamTreeItems.clear();
|
|
|
|
|
|
|
|
|
|
QMap<int, QTreeWidgetItem* >::iterator iteTree;
|
|
|
|
|
for(iteTree=uasTopLevelItems.begin(); iteTree!=uasTopLevelItems.end();++iteTree)
|
|
|
|
|
{
|
|
|
|
|
delete iteTree.value();
|
|
|
|
|
iteTree.value() = NULL;
|
|
|
|
|
}
|
|
|
|
|
uasTopLevelItems.clear();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QMap<int,QMap<int,mavlink_param_value_t>>::iterator vehicle_ite;//删除这个
|
|
|
|
|
for (vehicle_ite=vehicles.begin(); vehicle_ite!=vehicles.end();++vehicle_ite)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
vehicle_ite.value().clear();
|
|
|
|
|
//delete vehicle_ite.value();
|
|
|
|
|
//vehicle_ite.value() = NULL;
|
|
|
|
|
}
|
|
|
|
|
vehicles.clear();
|
|
|
|
|
|
|
|
|
|
ui->treeWidget->clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-03-24 20:12:29 +08:00
|
|
|
QVariant ParameterInspector::param_value(mavlink_param_value_t param)
|
2020-03-24 19:23:40 +08:00
|
|
|
{
|
2020-03-24 20:12:29 +08:00
|
|
|
QVariant value;
|
|
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
switch (param.param_type)
|
|
|
|
|
{
|
2020-03-24 20:12:29 +08:00
|
|
|
case MAV_PARAM_TYPE_UINT8:
|
2020-03-22 22:40:26 +08:00
|
|
|
{
|
2020-03-24 20:12:29 +08:00
|
|
|
value = ((uint8_t *)¶m.param_value)[0];
|
|
|
|
|
}break;
|
2020-03-24 19:23:40 +08:00
|
|
|
case MAV_PARAM_TYPE_INT8:
|
2020-03-20 22:54:20 +08:00
|
|
|
{
|
2020-03-24 20:12:29 +08:00
|
|
|
value = ((int8_t *)¶m.param_value)[0];
|
|
|
|
|
}break;
|
|
|
|
|
case MAV_PARAM_TYPE_UINT16:
|
|
|
|
|
{
|
|
|
|
|
value = ((uint16_t *)¶m.param_value)[0];
|
|
|
|
|
}break;
|
2020-03-24 19:23:40 +08:00
|
|
|
case MAV_PARAM_TYPE_INT16:
|
2020-03-22 22:40:26 +08:00
|
|
|
{
|
2020-03-24 20:12:29 +08:00
|
|
|
value = ((int16_t *)¶m.param_value)[0];
|
|
|
|
|
}break;
|
|
|
|
|
case MAV_PARAM_TYPE_UINT32:
|
|
|
|
|
{
|
|
|
|
|
value = ((uint32_t *)¶m.param_value)[0];
|
|
|
|
|
}break;
|
2020-03-24 19:23:40 +08:00
|
|
|
case MAV_PARAM_TYPE_INT32:
|
|
|
|
|
{
|
2020-03-24 20:12:29 +08:00
|
|
|
value = ((int32_t *)¶m.param_value)[0];
|
|
|
|
|
}break;
|
|
|
|
|
case MAV_PARAM_TYPE_UINT64:
|
2020-03-24 19:23:40 +08:00
|
|
|
{
|
2020-03-24 20:12:29 +08:00
|
|
|
value = ((uint64_t *)¶m.param_value)[0];
|
|
|
|
|
}break;
|
|
|
|
|
case MAV_PARAM_TYPE_INT64:
|
2020-03-24 19:23:40 +08:00
|
|
|
{
|
2020-03-24 20:12:29 +08:00
|
|
|
value = ((int64_t *)¶m.param_value)[0];
|
|
|
|
|
}break;
|
|
|
|
|
case MAV_PARAM_TYPE_REAL32:
|
2020-03-24 19:23:40 +08:00
|
|
|
{
|
2020-03-24 20:12:29 +08:00
|
|
|
value = ((float *)¶m.param_value)[0];
|
|
|
|
|
}break;
|
|
|
|
|
case MAV_PARAM_TYPE_REAL64:
|
|
|
|
|
{
|
|
|
|
|
value = ((double *)¶m.param_value)[0];
|
|
|
|
|
}break;
|
|
|
|
|
default:
|
|
|
|
|
{
|
|
|
|
|
value = ((int32_t *)¶m.param_value)[0];
|
|
|
|
|
qDebug() << "Unsupported type " << param.param_type;
|
|
|
|
|
}break;
|
|
|
|
|
|
2020-03-22 22:40:26 +08:00
|
|
|
}
|
2020-03-20 22:54:20 +08:00
|
|
|
|
2020-03-24 20:12:29 +08:00
|
|
|
return value;
|
2020-03-20 22:54:20 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
char* ParameterInspector::param_id(char *id)//设置id,如果id小于16,那么能够找到/0,如果等于或者大于,那么会找不到,因此乱码
|
|
|
|
|
{
|
|
|
|
|
uint8_t len = 0;
|
|
|
|
|
while(len < 16)
|
|
|
|
|
{
|
|
|
|
|
if(id[len] != '\0')
|
|
|
|
|
{
|
|
|
|
|
//continue;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
len++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
id[16] = '\0';
|
|
|
|
|
return id;
|
|
|
|
|
}
|
2020-03-20 22:54:20 +08:00
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
void ParameterInspector::on_ReadButton_clicked()
|
2020-03-20 22:54:20 +08:00
|
|
|
{
|
2020-03-23 18:39:05 +08:00
|
|
|
uint8_t m_sysid = 0;
|
|
|
|
|
uint8_t m_compid = 1;
|
|
|
|
|
uint8_t m_type = 0;
|
2020-03-22 22:40:26 +08:00
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
m_sysid = ui->systemComboBox->currentData().toInt();
|
2020-04-14 18:43:01 +08:00
|
|
|
m_compid = ui->componentComboBox->currentData().toInt();
|
2020-03-22 22:40:26 +08:00
|
|
|
|
2020-03-23 18:39:05 +08:00
|
|
|
emit ReadCmd(m_sysid,m_compid,m_type);
|
2020-03-20 22:54:20 +08:00
|
|
|
}
|
2020-03-24 19:23:40 +08:00
|
|
|
|
|
|
|
|
void ParameterInspector::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
|
|
|
|
|
{
|
2020-03-24 21:49:35 +08:00
|
|
|
|
|
|
|
|
ui->SearchlineEdit->setText(item->data(0,Qt::DisplayRole).toString());
|
|
|
|
|
|
|
|
|
|
//根据type 设置这个value
|
|
|
|
|
|
|
|
|
|
ui->ValuelineEdit->setText(item->data(1,Qt::DisplayRole).toString());
|
|
|
|
|
|
2020-03-24 19:23:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ParameterInspector::on_clearButton_clicked()
|
|
|
|
|
{
|
2020-03-28 21:27:22 +08:00
|
|
|
//清除所有的存储数据,包括显示
|
2020-03-25 12:11:44 +08:00
|
|
|
clearview();
|
2020-03-24 19:23:40 +08:00
|
|
|
}
|
2020-03-28 21:27:22 +08:00
|
|
|
|
|
|
|
|
void ParameterInspector::on_WriteButton_clicked()
|
|
|
|
|
{
|
|
|
|
|
//读取是哪设备,是哪个参数,然后发送出去
|
|
|
|
|
}
|