/****************************************************************************
 *
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

#include "ArduPlaneFirmwarePlugin.h"

bool ArduPlaneFirmwarePlugin::_remapParamNameIntialized = false;
FirmwarePlugin::remapParamNameMajorVersionMap_t ArduPlaneFirmwarePlugin::_remapParamName;

APMPlaneMode::APMPlaneMode(uint32_t mode, bool settable)
    : APMCustomMode(mode, settable)
{
    setEnumToStringMapping({ 
        { MANUAL,           "Manual" },
        { CIRCLE,           "Circle" },
        { STABILIZE,        "Stabilize" },
        { TRAINING,         "Training" },
        { ACRO,             "Acro" },
        { FLY_BY_WIRE_A,    "FBW A" },
        { FLY_BY_WIRE_B,    "FBW B" },
        { CRUISE,           "Cruise" },
        { AUTOTUNE,         "Autotune" },
        { AUTO,             "Auto" },
        { RTL,              "RTL" },
        { LOITER,           "Loiter" },
        { TAKEOFF,          "Takeoff" },
        { AVOID_ADSB,       "Avoid ADSB" },
        { GUIDED,           "Guided" },
        { INITIALIZING,     "Initializing" },
        { QSTABILIZE,       "QuadPlane Stabilize" },
        { QHOVER,           "QuadPlane Hover" },
        { QLOITER,          "QuadPlane Loiter" },
        { QLAND,            "QuadPlane Land" },
        { QRTL,             "QuadPlane RTL" },
        { QAUTOTUNE,        "QuadPlane AutoTune" },
        { QACRO,            "QuadPlane Acro" },
    });
}

ArduPlaneFirmwarePlugin::ArduPlaneFirmwarePlugin(void)
{
    setSupportedModes({
        APMPlaneMode(APMPlaneMode::MANUAL,          true),
        APMPlaneMode(APMPlaneMode::CIRCLE,          true),
        APMPlaneMode(APMPlaneMode::STABILIZE,       true),
        APMPlaneMode(APMPlaneMode::TRAINING,        true),
        APMPlaneMode(APMPlaneMode::ACRO,            true),
        APMPlaneMode(APMPlaneMode::FLY_BY_WIRE_A,   true),
        APMPlaneMode(APMPlaneMode::FLY_BY_WIRE_B,   true),
        APMPlaneMode(APMPlaneMode::CRUISE,          true),
        APMPlaneMode(APMPlaneMode::AUTOTUNE,        true),
        APMPlaneMode(APMPlaneMode::AUTO,            true),
        APMPlaneMode(APMPlaneMode::RTL,             true),
        APMPlaneMode(APMPlaneMode::LOITER,          true),
        APMPlaneMode(APMPlaneMode::TAKEOFF,         true),
        APMPlaneMode(APMPlaneMode::AVOID_ADSB,      false),
        APMPlaneMode(APMPlaneMode::GUIDED,          true),
        APMPlaneMode(APMPlaneMode::INITIALIZING,    false),
        APMPlaneMode(APMPlaneMode::QSTABILIZE,      true),
        APMPlaneMode(APMPlaneMode::QHOVER,          true),
        APMPlaneMode(APMPlaneMode::QLOITER,         true),
        APMPlaneMode(APMPlaneMode::QLAND,           true),
        APMPlaneMode(APMPlaneMode::QRTL,            true),
        APMPlaneMode(APMPlaneMode::QAUTOTUNE,       true),
        APMPlaneMode(APMPlaneMode::QACRO,           true),
    });

    if (!_remapParamNameIntialized) {
        FirmwarePlugin::remapParamNameMap_t& remapV3_10 = _remapParamName[3][10];

        remapV3_10["BATT_ARM_VOLT"] =    QStringLiteral("ARMING_VOLT_MIN");
        remapV3_10["BATT2_ARM_VOLT"] =   QStringLiteral("ARMING_VOLT2_MIN");

        _remapParamNameIntialized = true;
    }
}

int ArduPlaneFirmwarePlugin::remapParamNameHigestMinorVersionNumber(int majorVersionNumber) const
{
    // Remapping supports up to 3.10
    return majorVersionNumber == 3 ? 10 : Vehicle::versionNotSetValue;
}
