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