void ThermalCalibrationHelper::createDebugLog()
{
    if (m_debugFile.isOpen()) {
        closeDebugLog();
    }
    if (m_tempdir->isValid()) {
        QString filename = QStringLiteral("thcaldebug_%1.txt").arg(QDateTime::currentDateTime().toString("dd.MM.yyyy-hh.mm.ss.zzz"));
        QDir dir = QDir(m_tempdir->path());
        m_debugFile.setFileName(dir.filePath(filename));
        if (!m_debugFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
            m_debugStream.setDevice(0);
            return;
        }
        qDebug() << "Saving debug data for this session to " << dir.filePath(filename);

        m_debugStream.setDevice(&m_debugFile);

        ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
        UAVObjectUtilManager *utilMngr     = pm->getObject<UAVObjectUtilManager>();
        deviceDescriptorStruct board = utilMngr->getBoardDescriptionStruct();

        m_debugStream << "INFO::Hardware" << " type:" << QString().setNum(board.boardType, 16)
                      << " revision:" << QString().setNum(board.boardRevision, 16)
                      << " serial:" << QString(utilMngr->getBoardCPUSerial().toHex()) << endl;

        QString uavo = board.uavoHash.toHex();
        m_debugStream << "INFO::firmware tag:" << board.gitTag
                      << " date:" << board.gitDate
                      << " hash:" << board.gitHash
                      << " uavo:" << uavo.left(8) << endl;

        m_debugStream << "INFO::gcs tag:" << VersionInfo::tagOrBranch() + VersionInfo::dirty()
                      << " date:" << VersionInfo::dateTime()
                      << " hash:" << VersionInfo::hash().left(8)
                      << " uavo:" << VersionInfo::uavoHash().left(8) << endl;
    }
}
void UsageTrackerPlugin::collectUsageParameters(QMap<QString, QString> &parameters)
{
    ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
    UAVObjectUtilManager *utilMngr     = pm->getObject<UAVObjectUtilManager>();

    QByteArray description = utilMngr->getBoardDescription();
    deviceDescriptorStruct devDesc;

    if (UAVObjectUtilManager::descriptionToStructure(description, devDesc)) {
        int boardModel = utilMngr->getBoardModel();
        parameters["board_type"]   = "0x" + QString::number(boardModel, 16).toLower();
        parameters["board_serial"] = utilMngr->getBoardCPUSerial().toHex();
        parameters["bl_version"]   = QString::number(utilMngr->getBootloaderRevision());
        parameters["fw_tag"] = devDesc.gitTag;
        parameters["fw_hash"] = devDesc.gitHash;
        parameters["os_version"]   = QSysInfo::prettyProductName() + " " + QSysInfo::currentCpuArchitecture();
        parameters["os_threads"]   = QString::number(QThread::idealThreadCount());
        parameters["os_timezone"]  = QTimeZone::systemTimeZoneId();
        parameters["gcs_version"]  = VersionInfo::revision();

        // Configuration parameters
        ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
        UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();

        parameters["conf_receiver"] = getUAVFieldValue(objManager, "ManualControlSettings", "ChannelGroups", 0);
        parameters["conf_vehicle"]  = getUAVFieldValue(objManager, "SystemSettings", "AirframeType");

        if ((boardModel & 0xff00) == 0x0400) {
            // CopterControl family
            parameters["conf_rport"] = getUAVFieldValue(objManager, "HwSettings", "CC_RcvrPort");
            parameters["conf_mport"] = getUAVFieldValue(objManager, "HwSettings", "CC_MainPort");
            parameters["conf_fport"] = getUAVFieldValue(objManager, "HwSettings", "CC_FlexiPort");
        } else if ((boardModel & 0xff00) == 0x0900) {
            // Revolution family
            parameters["conf_rport"]  = getUAVFieldValue(objManager, "HwSettings", "RM_RcvrPort");
            parameters["conf_mport"]  = getUAVFieldValue(objManager, "HwSettings", "RM_MainPort");
            parameters["conf_fport"]  = getUAVFieldValue(objManager, "HwSettings", "RM_FlexiPort");
            parameters["conf_fusion"] = getUAVFieldValue(objManager, "RevoSettings", "FusionAlgorithm");
        }

        parameters["conf_uport"]    = getUAVFieldValue(objManager, "HwSettings", "USB_HIDPort");
        parameters["conf_vport"]    = getUAVFieldValue(objManager, "HwSettings", "USB_VCPPort");

        parameters["conf_rotation"] = QString("[%1:%2:%3]")
                                      .arg(getUAVFieldValue(objManager, "AttitudeSettings", "BoardRotation", 0))
                                      .arg(getUAVFieldValue(objManager, "AttitudeSettings", "BoardRotation", 1))
                                      .arg(getUAVFieldValue(objManager, "AttitudeSettings", "BoardRotation", 2));
        parameters["conf_pidr"] = QString("[%1:%2:%3:%4][%5:%6:%7:%8][%9:%10:%11:%12]")
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "RollRatePID", 0))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "RollRatePID", 1))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "RollRatePID", 2))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "RollRatePID", 3))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "PitchRatePID", 0))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "PitchRatePID", 1))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "PitchRatePID", 2))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "PitchRatePID", 3))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "YawRatePID", 0))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "YawRatePID", 1))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "YawRatePID", 2))
                                  .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "YawRatePID", 3));
        parameters["conf_pia"] = QString("[%1:%2:%3][%4:%5:%6][%7:%8:%9]")
                                 .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "RollPI", 0))
                                 .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "RollPI", 1))
                                 .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "RollPI", 2))
                                 .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "PitchPI", 0))
                                 .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "PitchPI", 1))
                                 .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "PitchPI", 2))
                                 .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "YawPI", 0))
                                 .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "YawPI", 1))
                                 .arg(getUAVFieldValue(objManager, "StabilizationSettingsBank1", "YawPI", 2));

        parameters["conf_tps"]     = getUAVFieldValue(objManager, "StabilizationSettingsBank1", "EnableThrustPIDScaling");
        parameters["conf_piro"]    = getUAVFieldValue(objManager, "StabilizationSettingsBank1", "EnablePiroComp");

        parameters["conf_fmcount"] = getUAVFieldValue(objManager, "ManualControlSettings", "FlightModeNumber");
        parameters["conf_fmodes"]  = QString("[%1:%2:%3]").arg(getUAVFieldValue(objManager, "FlightModeSettings", "FlightModePosition", 0))
                                     .arg(getUAVFieldValue(objManager, "FlightModeSettings", "FlightModePosition", 1))
                                     .arg(getUAVFieldValue(objManager, "FlightModeSettings", "FlightModePosition", 2));
    }
}