Files
gcs-nf/App/CheckUI/CheckUI.cpp
T
2020-09-23 17:54:34 +08:00

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;
}
}
}
}
}