diff --git a/ground/openpilotgcs/src/plugins/config/config.pro b/ground/openpilotgcs/src/plugins/config/config.pro index 30199471c..082c89cd5 100644 --- a/ground/openpilotgcs/src/plugins/config/config.pro +++ b/ground/openpilotgcs/src/plugins/config/config.pro @@ -55,7 +55,8 @@ HEADERS += \ calibration/levelcalibrationmodel.h \ calibration/gyrobiascalibrationmodel.h \ calibration/calibrationuiutils.h \ - configoplinkwidget.h + configoplinkwidget.h \ + configrevonanohwwidget.h SOURCES += \ configplugin.cpp \ @@ -93,7 +94,8 @@ SOURCES += \ calibration/sixpointcalibrationmodel.cpp \ calibration/levelcalibrationmodel.cpp \ calibration/gyrobiascalibrationmodel.cpp \ - configoplinkwidget.cpp + configoplinkwidget.cpp \ + configrevonanohwwidget.cpp FORMS += \ airframe.ui \ @@ -115,6 +117,7 @@ FORMS += \ txpid.ui \ mixercurve.ui \ configrevohwwidget.ui \ - oplink.ui + oplink.ui \ + configrevonanohwwidget.ui RESOURCES += configgadget.qrc diff --git a/ground/openpilotgcs/src/plugins/config/configgadget.qrc b/ground/openpilotgcs/src/plugins/config/configgadget.qrc index 856c5edd4..6e96f1872 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadget.qrc +++ b/ground/openpilotgcs/src/plugins/config/configgadget.qrc @@ -53,5 +53,6 @@ images/calibration/board-swd.png images/gear.png images/error.svg + images/nano_top.png diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp index 51e69d562..7e288e7c9 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp @@ -187,6 +187,8 @@ void ConfigGadgetWidget::onAutopilotConnect() stackWidget->replaceTab(ConfigGadgetWidget::sensors, qwd); if (board == 0x0903) { qwd = new ConfigRevoHWWidget(this); + } else if (board == 0x0905) { + qwd = new ConfigRevoNanoHWWidget(this); } stackWidget->replaceTab(ConfigGadgetWidget::hardware, qwd); } else { diff --git a/ground/openpilotgcs/src/plugins/config/configrevonanohwwidget.cpp b/ground/openpilotgcs/src/plugins/config/configrevonanohwwidget.cpp new file mode 100644 index 000000000..f8f91e2fd --- /dev/null +++ b/ground/openpilotgcs/src/plugins/config/configrevonanohwwidget.cpp @@ -0,0 +1,317 @@ +/** + ****************************************************************************** + * + * @file configrevohwwidget.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup ConfigPlugin Config Plugin + * @{ + * @brief Revolution hardware configuration panel + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include "configrevonanohwwidget.h" + +#include +#include +#include +#include "hwsettings.h" +#include +#include +#include + + +ConfigRevoNanoHWWidget::ConfigRevoNanoHWWidget(QWidget *parent) : ConfigTaskWidget(parent), m_refreshing(true) +{ + m_ui = new Ui_RevoNanoHWWidget(); + m_ui->setupUi(this); + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + Core::Internal::GeneralSettings *settings = pm->getObject(); + if (!settings->useExpertMode()) { + m_ui->saveTelemetryToRAM->setEnabled(false); + m_ui->saveTelemetryToRAM->setVisible(false); + } + + addApplySaveButtons(m_ui->saveTelemetryToRAM, m_ui->saveTelemetryToSD); + + addWidgetBinding("HwSettings", "RM_FlexiPort", m_ui->cbFlexi); + addWidgetBinding("HwSettings", "RM_MainPort", m_ui->cbMain); + addWidgetBinding("HwSettings", "RM_RcvrPort", m_ui->cbRcvr); + + addWidgetBinding("HwSettings", "USB_HIDPort", m_ui->cbUSBHIDFunction); + addWidgetBinding("HwSettings", "USB_VCPPort", m_ui->cbUSBVCPFunction); + addWidgetBinding("HwSettings", "ComUsbBridgeSpeed", m_ui->cbUSBVCPSpeed); + + addWidgetBinding("HwSettings", "TelemetrySpeed", m_ui->cbFlexiTelemSpeed); + addWidgetBinding("HwSettings", "GPSSpeed", m_ui->cbFlexiGPSSpeed); + addWidgetBinding("HwSettings", "ComUsbBridgeSpeed", m_ui->cbFlexiComSpeed); + + addWidgetBinding("HwSettings", "TelemetrySpeed", m_ui->cbMainTelemSpeed); + addWidgetBinding("HwSettings", "GPSSpeed", m_ui->cbMainGPSSpeed); + addWidgetBinding("HwSettings", "ComUsbBridgeSpeed", m_ui->cbMainComSpeed); + + addWidgetBinding("HwSettings", "TelemetrySpeed", m_ui->cbRcvrTelemSpeed); + + // Add Gps protocol configuration + addWidgetBinding("GPSSettings", "DataProtocol", m_ui->cbMainGPSProtocol); + addWidgetBinding("GPSSettings", "DataProtocol", m_ui->cbFlexiGPSProtocol); + + connect(m_ui->cchwHelp, SIGNAL(clicked()), this, SLOT(openHelp())); + + setupCustomCombos(); + enableControls(true); + populateWidgets(); + refreshWidgetsValues(); + forceConnectedState(); + m_refreshing = false; +} + +ConfigRevoNanoHWWidget::~ConfigRevoNanoHWWidget() +{ + // Do nothing +} + +void ConfigRevoNanoHWWidget::setupCustomCombos() +{ + connect(m_ui->cbUSBHIDFunction, SIGNAL(currentIndexChanged(int)), this, SLOT(usbHIDPortChanged(int))); + connect(m_ui->cbUSBVCPFunction, SIGNAL(currentIndexChanged(int)), this, SLOT(usbVCPPortChanged(int))); + + connect(m_ui->cbFlexi, SIGNAL(currentIndexChanged(int)), this, SLOT(flexiPortChanged(int))); + connect(m_ui->cbMain, SIGNAL(currentIndexChanged(int)), this, SLOT(mainPortChanged(int))); + connect(m_ui->cbRcvr, SIGNAL(currentIndexChanged(int)), this, SLOT(rcvrPortChanged(int))); +} + +void ConfigRevoNanoHWWidget::refreshWidgetsValues(UAVObject *obj) +{ + m_refreshing = true; + ConfigTaskWidget::refreshWidgetsValues(obj); + + usbVCPPortChanged(0); + mainPortChanged(0); + flexiPortChanged(0); + rcvrPortChanged(0); + m_refreshing = false; +} + +void ConfigRevoNanoHWWidget::updateObjectsFromWidgets() +{ + ConfigTaskWidget::updateObjectsFromWidgets(); + + HwSettings *hwSettings = HwSettings::GetInstance(getObjectManager()); + HwSettings::DataFields data = hwSettings->getData(); + + // If any port is configured to be GPS port, enable GPS module if it is not enabled. + // Otherwise disable GPS module. + if (m_ui->cbFlexi->currentIndex() == HwSettings::RM_FLEXIPORT_GPS || m_ui->cbMain->currentIndex() == HwSettings::RM_MAINPORT_GPS) { + data.OptionalModules[HwSettings::OPTIONALMODULES_GPS] = HwSettings::OPTIONALMODULES_ENABLED; + } else { + data.OptionalModules[HwSettings::OPTIONALMODULES_GPS] = HwSettings::OPTIONALMODULES_DISABLED; + } + + hwSettings->setData(data); +} + +void ConfigRevoNanoHWWidget::usbVCPPortChanged(int index) +{ + Q_UNUSED(index); + + bool vcpComBridgeEnabled = m_ui->cbUSBVCPFunction->currentIndex() == HwSettings::USB_VCPPORT_COMBRIDGE; + + m_ui->lblUSBVCPSpeed->setVisible(vcpComBridgeEnabled); + m_ui->cbUSBVCPSpeed->setVisible(vcpComBridgeEnabled); + + if (!vcpComBridgeEnabled && m_ui->cbFlexi->currentIndex() == HwSettings::RM_FLEXIPORT_COMBRIDGE) { + m_ui->cbFlexi->setCurrentIndex(HwSettings::RM_FLEXIPORT_DISABLED); + } + m_ui->cbFlexi->model()->setData(m_ui->cbFlexi->model()->index(HwSettings::RM_FLEXIPORT_COMBRIDGE, 0), + !vcpComBridgeEnabled ? QVariant(0) : QVariant(1 | 32), Qt::UserRole - 1); + + if (!vcpComBridgeEnabled && m_ui->cbMain->currentIndex() == HwSettings::RM_MAINPORT_COMBRIDGE) { + m_ui->cbMain->setCurrentIndex(HwSettings::RM_MAINPORT_DISABLED); + } + m_ui->cbMain->model()->setData(m_ui->cbMain->model()->index(HwSettings::RM_MAINPORT_COMBRIDGE, 0), + !vcpComBridgeEnabled ? QVariant(0) : QVariant(1 | 32), Qt::UserRole - 1); + + // _DEBUGCONSOLE modes are mutual exclusive + if (m_ui->cbUSBVCPFunction->currentIndex() == HwSettings::USB_VCPPORT_DEBUGCONSOLE) { + if (m_ui->cbMain->currentIndex() == HwSettings::RM_MAINPORT_DEBUGCONSOLE) { + m_ui->cbMain->setCurrentIndex(HwSettings::RM_MAINPORT_DISABLED); + } + if (m_ui->cbFlexi->currentIndex() == HwSettings::RM_FLEXIPORT_DEBUGCONSOLE) { + m_ui->cbFlexi->setCurrentIndex(HwSettings::RM_FLEXIPORT_DISABLED); + } + } + + // _USBTELEMETRY modes are mutual exclusive + if (m_ui->cbUSBVCPFunction->currentIndex() == HwSettings::USB_VCPPORT_USBTELEMETRY) { + if (m_ui->cbUSBHIDFunction->currentIndex() == HwSettings::USB_HIDPORT_USBTELEMETRY) { + m_ui->cbUSBHIDFunction->setCurrentIndex(HwSettings::USB_HIDPORT_DISABLED); + } + } +} + +void ConfigRevoNanoHWWidget::usbHIDPortChanged(int index) +{ + Q_UNUSED(index); + + // _USBTELEMETRY modes are mutual exclusive + if (m_ui->cbUSBHIDFunction->currentIndex() == HwSettings::USB_HIDPORT_USBTELEMETRY) { + if (m_ui->cbUSBVCPFunction->currentIndex() == HwSettings::USB_VCPPORT_USBTELEMETRY) { + m_ui->cbUSBVCPFunction->setCurrentIndex(HwSettings::USB_VCPPORT_DISABLED); + } + } +} + +void ConfigRevoNanoHWWidget::flexiPortChanged(int index) +{ + Q_UNUSED(index); + + m_ui->cbFlexiTelemSpeed->setVisible(false); + m_ui->cbFlexiGPSSpeed->setVisible(false); + m_ui->cbFlexiComSpeed->setVisible(false); + m_ui->lblFlexiSpeed->setVisible(true); + + // Add Gps protocol configuration + m_ui->cbFlexiGPSProtocol->setVisible(false); + m_ui->lbFlexiGPSProtocol->setVisible(false); + + switch (m_ui->cbFlexi->currentIndex()) { + case HwSettings::RM_FLEXIPORT_TELEMETRY: + m_ui->cbFlexiTelemSpeed->setVisible(true); + if (m_ui->cbMain->currentIndex() == HwSettings::RM_MAINPORT_TELEMETRY) { + m_ui->cbMain->setCurrentIndex(HwSettings::RM_MAINPORT_DISABLED); + } + if (m_ui->cbRcvr->currentIndex() == HwSettings::RM_RCVRPORT_PPMTELEMETRY + || m_ui->cbRcvr->currentIndex() == HwSettings::RM_RCVRPORT_TELEMETRY) { + m_ui->cbRcvr->setCurrentIndex(HwSettings::RM_RCVRPORT_DISABLED); + } + break; + case HwSettings::RM_FLEXIPORT_GPS: + // Add Gps protocol configuration + m_ui->cbFlexiGPSProtocol->setVisible(true); + m_ui->lbFlexiGPSProtocol->setVisible(true); + + m_ui->cbFlexiGPSSpeed->setVisible(true); + if (m_ui->cbMain->currentIndex() == HwSettings::RM_MAINPORT_GPS) { + m_ui->cbMain->setCurrentIndex(HwSettings::RM_MAINPORT_DISABLED); + } + break; + case HwSettings::RM_FLEXIPORT_COMBRIDGE: + m_ui->cbFlexiComSpeed->setVisible(true); + if (m_ui->cbMain->currentIndex() == HwSettings::RM_MAINPORT_COMBRIDGE) { + m_ui->cbMain->setCurrentIndex(HwSettings::RM_MAINPORT_DISABLED); + } + break; + case HwSettings::RM_FLEXIPORT_DEBUGCONSOLE: + m_ui->cbFlexiComSpeed->setVisible(true); + if (m_ui->cbMain->currentIndex() == HwSettings::RM_MAINPORT_DEBUGCONSOLE) { + m_ui->cbMain->setCurrentIndex(HwSettings::RM_MAINPORT_DISABLED); + } + if (m_ui->cbUSBVCPFunction->currentIndex() == HwSettings::USB_VCPPORT_DEBUGCONSOLE) { + m_ui->cbUSBVCPFunction->setCurrentIndex(HwSettings::USB_VCPPORT_DISABLED); + } + break; + default: + m_ui->lblFlexiSpeed->setVisible(false); + break; + } +} + +void ConfigRevoNanoHWWidget::mainPortChanged(int index) +{ + Q_UNUSED(index); + + m_ui->cbMainTelemSpeed->setVisible(false); + m_ui->cbMainGPSSpeed->setVisible(false); + m_ui->cbMainComSpeed->setVisible(false); + m_ui->lblMainSpeed->setVisible(true); + + // Add Gps protocol configuration + m_ui->cbMainGPSProtocol->setVisible(false); + m_ui->lbMainGPSProtocol->setVisible(false); + + switch (m_ui->cbMain->currentIndex()) { + case HwSettings::RM_MAINPORT_TELEMETRY: + m_ui->cbMainTelemSpeed->setVisible(true); + if (m_ui->cbFlexi->currentIndex() == HwSettings::RM_FLEXIPORT_TELEMETRY) { + m_ui->cbFlexi->setCurrentIndex(HwSettings::RM_FLEXIPORT_DISABLED); + } + if (m_ui->cbRcvr->currentIndex() == HwSettings::RM_RCVRPORT_PPMTELEMETRY + || m_ui->cbRcvr->currentIndex() == HwSettings::RM_RCVRPORT_TELEMETRY) { + m_ui->cbRcvr->setCurrentIndex(HwSettings::RM_RCVRPORT_DISABLED); + } + break; + case HwSettings::RM_MAINPORT_GPS: + // Add Gps protocol configuration + m_ui->cbMainGPSProtocol->setVisible(true); + m_ui->lbMainGPSProtocol->setVisible(true); + + m_ui->cbMainGPSSpeed->setVisible(true); + if (m_ui->cbFlexi->currentIndex() == HwSettings::RM_FLEXIPORT_GPS) { + m_ui->cbFlexi->setCurrentIndex(HwSettings::RM_FLEXIPORT_DISABLED); + } + break; + case HwSettings::RM_MAINPORT_COMBRIDGE: + m_ui->cbMainComSpeed->setVisible(true); + if (m_ui->cbFlexi->currentIndex() == HwSettings::RM_FLEXIPORT_COMBRIDGE) { + m_ui->cbFlexi->setCurrentIndex(HwSettings::RM_FLEXIPORT_DISABLED); + } + break; + case HwSettings::RM_MAINPORT_DEBUGCONSOLE: + m_ui->cbMainComSpeed->setVisible(true); + if (m_ui->cbFlexi->currentIndex() == HwSettings::RM_FLEXIPORT_DEBUGCONSOLE) { + m_ui->cbFlexi->setCurrentIndex(HwSettings::RM_FLEXIPORT_DISABLED); + } + if (m_ui->cbUSBVCPFunction->currentIndex() == HwSettings::USB_VCPPORT_DEBUGCONSOLE) { + m_ui->cbUSBVCPFunction->setCurrentIndex(HwSettings::USB_VCPPORT_DISABLED); + } + break; + default: + m_ui->lblMainSpeed->setVisible(false); + break; + } +} + +void ConfigRevoNanoHWWidget::rcvrPortChanged(int index) +{ + Q_UNUSED(index); + + switch (m_ui->cbRcvr->currentIndex()) { + case HwSettings::RM_RCVRPORT_TELEMETRY: + case HwSettings::RM_RCVRPORT_PPMTELEMETRY: + m_ui->lblRcvrSpeed->setVisible(true); + m_ui->cbRcvrTelemSpeed->setVisible(true); + + if (m_ui->cbFlexi->currentIndex() == HwSettings::RM_FLEXIPORT_TELEMETRY) { + m_ui->cbFlexi->setCurrentIndex(HwSettings::RM_FLEXIPORT_DISABLED); + } + if (m_ui->cbMain->currentIndex() == HwSettings::RM_FLEXIPORT_TELEMETRY) { + m_ui->cbMain->setCurrentIndex(HwSettings::RM_FLEXIPORT_DISABLED); + } + break; + default: + m_ui->lblRcvrSpeed->setVisible(false); + m_ui->cbRcvrTelemSpeed->setVisible(false); + break; + } +} + +void ConfigRevoNanoHWWidget::openHelp() +{ + QDesktopServices::openUrl(QUrl(tr("http://wiki.openpilot.org/x/GgDBAQ"), QUrl::StrictMode)); +} diff --git a/ground/openpilotgcs/src/plugins/config/configrevonanohwwidget.h b/ground/openpilotgcs/src/plugins/config/configrevonanohwwidget.h new file mode 100644 index 000000000..7efebd326 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/config/configrevonanohwwidget.h @@ -0,0 +1,64 @@ +/** + ****************************************************************************** + * + * @file configrevohwwidget.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup ConfigPlugin Config Plugin + * @{ + * @brief Revolution hardware configuration panel + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef CONFIGREVONANOHWWIDGET_H +#define CONFIGREVONANOHWWIDGET_H + +#include "ui_configrevonanohwwidget.h" +#include "../uavobjectwidgetutils/configtaskwidget.h" +#include "extensionsystem/pluginmanager.h" +#include "uavobjectmanager.h" +#include "uavobject.h" +#include +#include + + +class ConfigRevoNanoHWWidget : public ConfigTaskWidget { + Q_OBJECT + +public: + ConfigRevoNanoHWWidget(QWidget *parent = 0); + ~ConfigRevoNanoHWWidget(); + +private: + bool m_refreshing; + Ui_RevoNanoHWWidget *m_ui; + void setupCustomCombos(); + +protected slots: + void refreshWidgetsValues(UAVObject *obj = NULL); + void updateObjectsFromWidgets(); + +private slots: + void usbVCPPortChanged(int index); + void usbHIDPortChanged(int index); + void flexiPortChanged(int index); + void mainPortChanged(int index); + void rcvrPortChanged(int index); + void openHelp(); +}; + +#endif // CONFIGREVONANOHWWIDGET_H diff --git a/ground/openpilotgcs/src/plugins/config/configrevonanohwwidget.ui b/ground/openpilotgcs/src/plugins/config/configrevonanohwwidget.ui new file mode 100644 index 000000000..c0862ed64 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/config/configrevonanohwwidget.ui @@ -0,0 +1,690 @@ + + + RevoNanoHWWidget + + + + 0 + 0 + 834 + 914 + + + + Form + + + + + + 0 + + + + true + + + HW settings + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + 255 + 255 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 255 + 255 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 232 + 232 + 232 + + + + + + + 232 + 232 + 232 + + + + + + + + border-color: rgb(255, 0, 0); + + + QFrame::NoFrame + + + QFrame::Plain + + + true + + + + + 0 + 0 + 812 + 828 + + + + + 12 + + + 12 + + + 12 + + + 12 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + 75 + true + + + + Changes on this page only take effect after board reset or power cycle + + + Qt::AlignCenter + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 10 + + + + + + + + + + + 0 + 0 + + + + Speed + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + + + + + + 0 + 0 + + + + + 500 + 350 + + + + + + + :/configgadget/images/nano_top.png + + + false + + + Qt::AlignCenter + + + Qt::NoTextInteraction + + + + + + + + + + + 0 + 0 + + + + Receiver Port + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + + + 0 + 0 + + + + USB HID Function + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + + + 0 + 0 + + + + Speed + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + true + + + + + + + + + + + + + + 0 + 0 + + + + USB VCP Function + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + + Main Port + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + + + + + Speed + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + + 0 + + + + + true + + + + + + + + + + + + + + + Protocol + + + Qt::AlignCenter + + + + + + + + + + + + + Protocol + + + Qt::PlainText + + + Qt::AlignCenter + + + + + + + 0 + + + + + true + + + + + + + + + + + + + + + Speed + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + + + + + Flexi Port + + + Qt::AlignBottom|Qt::AlignHCenter + + + + + + + + + + + + + + + + + 4 + + + + + Qt::Horizontal + + + + 369 + 20 + + + + + + + + + 0 + 0 + + + + + 25 + 25 + + + + + 25 + 25 + + + + Takes you to the wiki page + + + + + + + :/core/images/helpicon.svg:/core/images/helpicon.svg + + + + 25 + 25 + + + + true + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + + + 255 + 255 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 255 + 255 + 255 + + + + + + + 232 + 232 + 232 + + + + + + + + + 232 + 232 + 232 + + + + + + + 232 + 232 + 232 + + + + + + + + Send to OpenPilot but don't write in SD. +Beware of not locking yourself out! + + + false + + + + + + Apply + + + + 16 + 16 + + + + false + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Applies and Saves all settings to SD. +Beware of not locking yourself out! + + + false + + + + + + Save + + + + + + + + + + + + + diff --git a/ground/openpilotgcs/src/plugins/config/images/nano_top.png b/ground/openpilotgcs/src/plugins/config/images/nano_top.png new file mode 100644 index 000000000..4138c6696 Binary files /dev/null and b/ground/openpilotgcs/src/plugins/config/images/nano_top.png differ