518 lines
15 KiB
C++
518 lines
15 KiB
C++
#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<QPushButton *>(obj);
|
|
if(btn)
|
|
{
|
|
disconnect(btn,SIGNAL(clicked(bool)),
|
|
this,SLOT(on_commandClicked()));
|
|
delete btn;
|
|
}
|
|
|
|
QLabel *lab = qobject_cast<QLabel *>(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<QPushButton *>(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<QPushButton *>(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<int,QString>::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<int,QString>::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<int,QString>::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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|