#include "CheckUI.h" #include "ui_CheckUI.h" const char* CheckUI::_versionJsonKey = "version"; const char* CheckUI::_spacingJsonKey = "spacing"; const char* CheckUI::_commentJsonKey = "comment"; const char* CheckUI::_vehicleJsonKey = "vehicle"; const char* CheckUI::_ButtonJsonKey = "Button"; const char* CheckUI::_WidthJsonKey = "Width"; const char* CheckUI::_HeightJsonKey = "Height"; const char* CheckUI::_TextJsonKey = "Text"; const char* CheckUI::_rowJsonKey = "row"; const char* CheckUI::_descriptionJsonKey = "description"; const char* CheckUI::_columnJsonKey = "column"; const char* CheckUI::_param1JsonKey = "param1"; const char* CheckUI::_param2JsonKey = "param2"; const char* CheckUI::_param3JsonKey = "param3"; const char* CheckUI::_param4JsonKey = "param4"; const char* CheckUI::_param5JsonKey = "param5"; const char* CheckUI::_param6JsonKey = "param6"; const char* CheckUI::_param7JsonKey = "param7"; const char* CheckUI::_commandJsonKey = "command"; const char* CheckUI::_confirmJsonKey = "confirm"; CheckUI::CheckUI(QWidget *parent) : QWidget(parent), ui(new Ui::CheckUI) { ui->setupUi(this); //检测文件夹,如果不存在,那么就新建一个 QDir *Dir = new QDir; if(!Dir->exists("./checks")) Dir->mkdir("./checks");//如果文件夹不存在就新建 //load qss QFile file(":/qss/CheckUI.qss"); file.open(QFile::ReadOnly); QTextStream filetext(&file); QString stylesheet = filetext.readAll(); this->setStyleSheet(stylesheet); file.close(); //载入json LoadCheckFiles("./checks"); //loadCommandJson(":/json/Check.json"); //loadCommandJson("./json/Check.json"); } CheckUI::~CheckUI() { delete ui; } void CheckUI::reBuild(void) { //将旧的按键全部删除 QObjectList olist = ui->frame_check->children(); foreach (QObject *obj, olist) { QPushButton *btn = qobject_cast(obj); if(btn) { disconnect(btn,SIGNAL(clicked(bool)), this,SLOT(on_commandClicked())); delete btn; } QLabel *lab = qobject_cast(obj); if(lab) { delete lab; } } //添加新的按键 ui->gridLayout_Check->setSpacing(spacing); for(QJsonValue info: infoArray) { if (!info.isObject()) { return; } QPushButton *btn = new QPushButton(ui->frame_check); btn->setText(info.toObject().find(_TextJsonKey).value().toString()); btn->setFixedSize(width,height); ui->gridLayout_Check->addWidget(btn, info.toObject().find(_rowJsonKey).value().toInt(), info.toObject().find(_columnJsonKey).value().toInt()); btn->setProperty("CheckState",CheckState::Init); btn->style()->unpolish(btn); btn->style()->polish(btn); QLabel *lab = new QLabel(ui->frame_check); lab->adjustSize(); lab->setWordWrap(true); lab->setText(info.toObject().find(_descriptionJsonKey).value().toString()); ui->gridLayout_Check->addWidget(lab, info.toObject().find(_rowJsonKey).value().toInt(), info.toObject().find(_columnJsonKey).value().toInt() + 1); connect(btn,SIGNAL(clicked(bool)), this,SLOT(on_commandClicked())); } } void CheckUI::loadCommandJson(QJsonObject json) { version = json.value(_versionJsonKey).toInt(); qDebug() << "check version :" << version; spacing = json.value(_spacingJsonKey).toInt(); width = json.value(_WidthJsonKey).toInt(); height = json.value(_HeightJsonKey).toInt(); QJsonValue jsonValue = json.value(_ButtonJsonKey); if (!jsonValue.isArray()) { qWarning() << "Button not array"; return; } infoArray = jsonValue.toArray(); for(QJsonValue info: infoArray) { if (!info.isObject()) { qWarning() << "Array should contain objects"; return; } } } void CheckUI::on_commandClicked() { //找到消息的发送者 QPushButton *btn = qobject_cast(sender()); for(QJsonValue info: infoArray) { if (!info.isObject()) { return; } //找到id或者名字一样的按键,找到参数,发出去 QString _name = info.toObject().find(_TextJsonKey).value().toString(); QString _text = btn->text(); if(_name == _text) { float param1 = info.toObject().find(_param1JsonKey).value().toDouble(); float param2 = info.toObject().find(_param2JsonKey).value().toDouble(); float param3 = info.toObject().find(_param3JsonKey).value().toDouble(); float param4 = info.toObject().find(_param4JsonKey).value().toDouble(); float param5 = info.toObject().find(_param5JsonKey).value().toDouble(); float param6 = info.toObject().find(_param6JsonKey).value().toDouble(); float param7 = info.toObject().find(_param7JsonKey).value().toDouble(); uint16_t command = info.toObject().find(_commandJsonKey).value().toInt(); uint8_t confirm = info.toObject().find(_confirmJsonKey).value().toInt(); emit cmd_long(param1,param2, param3,param4,param5,param6,param7,command,confirm); } } } void CheckUI::commandAccepted(bool flag,uint16_t command,uint8_t result) { //找到消息的发送者 QObjectList list = ui->frame_check->children(); for(QJsonValue info: infoArray) { if (!info.isObject()) { return; } if(command == info.toObject().find(_commandJsonKey).value().toInt()) { foreach (QObject *obj, list) { QPushButton *btn = qobject_cast(obj); if(btn) { if(btn->text() == info.toObject().find(_TextJsonKey).value().toString()) { if(flag) { btn->setProperty("state",CheckState::Pass); } else { btn->setProperty("state",CheckState::Fail); } btn->style()->unpolish(btn); btn->style()->polish(btn); } } } } } } void CheckUI::RecieveMsg(mavlink_message_t msg) { switch (msg.msgid) { case MAVLINK_MSG_ID_AUTOPILOT_VERSION: { mavlink_msg_autopilot_version_decode(&msg,&autopilot_version); }break; case MAVLINK_MSG_ID_SYS_STATUS: { mavlink_msg_sys_status_decode(&msg,&sys_status); }break; case MAVLINK_MSG_ID_HEARTBEAT: { mavlink_msg_heartbeat_decode(&msg,&heartbeat); }break; case MAVLINK_MSG_ID_PING: { mavlink_msg_ping_decode(&msg,&ping); }break; case MAVLINK_MSG_ID_ATTITUDE: { mavlink_msg_attitude_decode(&msg,&attitude); }break; case MAVLINK_MSG_ID_GPS_RAW_INT: { mavlink_msg_gps_raw_int_decode(&msg,&gps_raw_int); }break; case MAVLINK_MSG_ID_GLOBAL_POSITION_INT: { mavlink_msg_global_position_int_decode(&msg,&global_position_int); }break; case MAVLINK_MSG_ID_SERVO_OUTPUT_RAW: { mavlink_msg_servo_output_raw_decode(&msg,&servo_output_raw); }break; case MAVLINK_MSG_ID_RC_CHANNELS_RAW: { mavlink_msg_rc_channels_raw_decode(&msg,&rc_channels_raw); }break; case MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT: { mavlink_msg_nav_controller_output_decode(&msg,&nav_controller_output); }break; case MAVLINK_MSG_ID_AIRSPEED_AUTOCAL: { mavlink_msg_airspeed_autocal_decode(&msg,&airspeed_autocal); }break; case MAVLINK_MSG_ID_RPM: { mavlink_msg_rpm_decode(&msg,&rpm); }break; case MAVLINK_MSG_ID_SCALED_PRESSURE: { mavlink_msg_scaled_pressure_decode(&msg,&scaled_pressure); }break; case MAVLINK_MSG_ID_EXTENDED_SYS_STATE: { mavlink_msg_extended_sys_state_decode(&msg,&extended_sys_state); }break; case MAVLINK_MSG_ID_BATTERY_STATUS: { mavlink_msg_battery_status_decode(&msg,&battery_status); }break; case MAVLINK_MSG_ID_VIBRATION: { mavlink_msg_vibration_decode(&msg,&vibration); }break; case MAVLINK_MSG_ID_EngineState: { mavlink_msg_enginestate_decode(&msg,&enginestate); }break; case MAVLINK_MSG_ID_VFR_HUD: { mavlink_msg_vfr_hud_decode(&msg,&vfr_hud); }break; } } //添加一个设备, void CheckUI::addVehicles(int sysid, int compid) { Q_UNUSED(compid) if(!Vehicles.keys().contains(sysid)) { Vehicles.insert(sysid,tr("Vehicle %1").arg(sysid)); if(ui->pushButton_Vehicle->text().isEmpty()) { ui->pushButton_Vehicle->setText(tr("Vehicle %1").arg(sysid)); //检查是否有专属的检查文件,如果有,那么载入,如果没有载入通用的检查文件 if(CheckFiles.contains(sysid)) { loadCommandJson(CheckFiles.value(sysid)); reBuild(); } else { qDebug() << tr("not Contains special check file") << sysid; if(CheckFiles.contains(0xFFFF))//默认文件 { loadCommandJson(CheckFiles.value(0xFFFF)); reBuild(); } else { qDebug() << tr("not Contains Default check file") << sysid; } } } } } QJsonObject CheckUI::parseCheckfiles(const QString& jsonFilename) { QJsonObject json; QFile jsonFile(jsonFilename); if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) { qWarning() << "Unable to open file" << jsonFilename << jsonFile.errorString(); return json; } QByteArray bytes = jsonFile.readAll(); jsonFile.close(); QJsonParseError jsonParseError; QJsonDocument doc = QJsonDocument::fromJson(bytes, &jsonParseError); if (jsonParseError.error != QJsonParseError::NoError) { qWarning() << jsonFilename << "Unable to open json document" << jsonParseError.errorString(); return json; } json = doc.object(); return json; } void CheckUI::LoadCheckFiles(QString path) { QDir dir(path); QFileInfoList file_list = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks); foreach(QFileInfo fileinfo, file_list) { QString filter; filter = fileinfo.suffix(); //后缀名 if(filter == "json") { QJsonObject json = parseCheckfiles(fileinfo.absoluteFilePath()); if(&json) { int vehicle = json.value(_vehicleJsonKey).toInt(); CheckFiles.insert(vehicle,json); } } } } void CheckUI::setVehicle(QVariant value) { ui->pushButton_Vehicle->setText(value.toString()); //从新载入一次文件 LoadCheckFiles("./checks"); int index = value.toString().indexOf(' '); QString selectid = value.toString().mid(index); int vehicle = selectid.toInt(); //检查是否有专属的检查文件,如果有,那么载入,如果没有载入通用的检查文件 if(CheckFiles.contains(vehicle)) { loadCommandJson(CheckFiles.value(vehicle)); reBuild(); } else { qDebug() << tr("not Contains special check file") << vehicle; if(CheckFiles.contains(0xFFFF))//默认文件 { loadCommandJson(CheckFiles.value(0xFFFF)); reBuild(); } else { qDebug() << tr("not Contains Default check file") << vehicle; } } } void CheckUI::on_pushButton_Vehicle_clicked() { if(!ui->pushButton_Vehicle->text().isEmpty()) { Selector *selector = new Selector(this); selector->setGeometry(0,0,this->geometry().width(),this->geometry().height()); //selector->setGeometry(0,0,this->width(),this->height()); QStringList list; list.clear(); for(QHash::iterator ite=Vehicles.begin(); ite!=Vehicles.end();++ite)//每一个key下面都是一个设备的所有参数 { list.append(tr("Vehicle %1").arg(ite.key())); } selector->setList(list,ui->pushButton_Vehicle->text()); connect(selector,SIGNAL(confirmValue(QVariant)), this,SLOT(setVehicle(QVariant))); selector->show(); } } void CheckUI::on_pushButton_Previous_clicked() { if(!ui->pushButton_Vehicle->text().isEmpty()) { int index = ui->pushButton_Vehicle->text().indexOf(' '); QString selectid = ui->pushButton_Vehicle->text().mid(index); int vehicle = selectid.toInt(); qDebug() << vehicle << Vehicles.keys() << Vehicles.values(); bool isLast = false; for(QHash::const_iterator ite=Vehicles.begin(); ite!=Vehicles.end();(isLast)?(ite--):(ite++))//每一个key下面都是一个设备的所有参数 { qDebug() << ite.value() << "isLast" << isLast; if(isLast) { setVehicle(tr("Vehicle %1").arg(ite.key())); break; } else { if(ite.key() == vehicle) { isLast = true; } } } } } void CheckUI::on_pushButton_Next_clicked() { if(!ui->pushButton_Vehicle->text().isEmpty()) { int index = ui->pushButton_Vehicle->text().indexOf(' '); QString selectid = ui->pushButton_Vehicle->text().mid(index); int vehicle = selectid.toInt(); qDebug() << vehicle << Vehicles.keys() << Vehicles.values(); bool isNext = false; for(QHash::iterator ite=Vehicles.begin(); ite!=Vehicles.end();++ite)//每一个key下面都是一个设备的所有参数 { qDebug() << ite.value() << "Next" << isNext; if(isNext) { setVehicle(tr("Vehicle %1").arg(ite.key())); break; } else { if(ite.key() == vehicle) { isNext = true; } } } } }