Files
edgetx-gx12/radio/src/model_init.cpp
T

162 lines
4.1 KiB
C++

/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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.
*/
#include "opentx.h"
#include "hal/adc_driver.h"
#include "input_mapping.h"
#include "mixes.h"
void clearInputs()
{
memset(g_model.expoData, 0, sizeof(g_model.expoData));
}
void setDefaultInputs()
{
auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN);
for (int i = 0; i < max_sticks; i++) {
uint8_t stick_index = inputMappingChannelOrder(i);
ExpoData *expo = expoAddress(i);
expo->srcRaw = MIXSRC_FIRST_STICK + stick_index;
expo->curve.type = CURVE_REF_EXPO;
expo->chn = i;
expo->weight = 100;
expo->mode = 3; // TODO constant
strncpy(g_model.inputNames[i], getMainControlLabel(stick_index), LEN_INPUT_NAME);
}
storageDirty(EE_MODEL);
}
void clearMixes()
{
memset(g_model.mixData, 0, sizeof(g_model.mixData));
}
void setDefaultMixes()
{
auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN);
for (int i = 0; i < max_sticks; i++) {
MixData * mix = mixAddress(i);
mix->destCh = i;
mix->weight = 100;
mix->srcRaw = i+1;
}
storageDirty(EE_MODEL);
}
void setDefaultModelRegistrationID()
{
memcpy(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID);
}
void setDefaultGVars()
{
#if defined(FLIGHT_MODES) && defined(GVARS)
for (int fmIdx = 1; fmIdx < MAX_FLIGHT_MODES; fmIdx++) {
for (int gvarIdx = 0; gvarIdx < MAX_GVARS; gvarIdx++) {
g_model.flightModeData[fmIdx].gvars[gvarIdx] = GVAR_MAX + 1;
}
}
#endif
}
void setDefaultRSSIValues()
{
// Set to legacy FrSky values until
// a better solution is found (module specific?)
//
g_model.rfAlarms.warning = 45;
g_model.rfAlarms.critical = 42;
}
void setVendorSpecificModelDefaults(uint8_t id)
{
#if defined(RADIOMASTER_RTF_RELEASE)
// Those settings are for headless radio
g_model.trainerData.mode = TRAINER_MODE_SLAVE;
g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_MULTIMODULE;
g_model.moduleData[INTERNAL_MODULE].multi.rfProtocol = MODULE_SUBTYPE_MULTI_FRSKY;
g_model.moduleData[INTERNAL_MODULE].subType = MULTI_FRSKYD_SUBTYPE_D8;
g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES;
#endif
}
void applyDefaultTemplate()
{
setDefaultInputs();
setDefaultMixes();
setDefaultGVars();
setDefaultRSSIValues();
setDefaultModelRegistrationID();
#if defined(FUNCTION_SWITCHES)
g_model.functionSwitchConfig = DEFAULT_FS_CONFIG;
g_model.functionSwitchGroup = DEFAULT_FS_GROUPS;
g_model.functionSwitchStartConfig = DEFAULT_FS_STARTUP_CONFIG;
g_model.functionSwitchLogicalState = 0;
#endif
#if defined(COLORLCD)
LayoutFactory::loadDefaultLayout();
// enable switch warnings
for (int i = 0; i < MAX_SWITCHES; i++) {
if (SWITCH_EXISTS(i)) {
g_model.switchWarningState |= (1 << (3 * i));
}
}
#else
// enable switch warnings
for (int i = 0; i < MAX_SWITCHES; i++) {
if (SWITCH_WARNING_ALLOWED(i))
g_model.switchWarningState |= (1 << (3 * i));
}
#endif
#if defined(USE_HATS_AS_KEYS)
g_model.hatsMode = HATSMODE_GLOBAL;
#endif
}
void setModelDefaults(uint8_t id)
{
memset(&g_model, 0, sizeof(g_model));
applyDefaultTemplate();
setVendorSpecificModelDefaults(id);
#if !defined(STORAGE_MODELSLIST)
// EEPROM model indexes starting with 0
id++;
#endif
strAppendUnsigned(strAppend(g_model.header.name, STR_MODEL), id, 2);
#if defined(LUA) && defined(PCBTARANIS)
if (isFileAvailable(WIZARD_PATH "/" WIZARD_NAME)) {
f_chdir(WIZARD_PATH);
luaExec(WIZARD_NAME);
}
#endif
}