/* * 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 #include #include #include "opentx.h" #include "../timers.h" #include "model_init.h" void eeLoadModel(uint8_t index) { if (index < MAX_MODELS) { preModelLoad(); uint16_t size = eeLoadModelData(index); #if defined(SIMU) && defined(EEPROM_ZONE_SIZE) if (sizeof(uint16_t) + sizeof(g_model) > EEPROM_ZONE_SIZE) { TRACE("Model data size can't exceed %d bytes (%d bytes)", int(EEPROM_ZONE_SIZE-sizeof(uint16_t)), (int)sizeof(g_model)); } #endif #if defined(SIMU) if (size > 0 && size != sizeof(g_model)) { TRACE("Model data read=%d bytes vs %d bytes\n", size, (int)sizeof(ModelData)); } #endif bool alarms = true; if (size < EEPROM_MIN_MODEL_SIZE) { // if not loaded a fair amount setModelDefaults(index); storageCheck(true); alarms = false; } postModelLoad(alarms); } } void storageClearRadioSettings() { memclear(&g_eeGeneral, sizeof(RadioData)); } bool storageReadRadioSettings(bool allowFixes) { if (!eepromOpen() || !eeLoadGeneral(allowFixes)) { if (!allowFixes) { storageClearRadioSettings(); return false; } storageEraseAll(true); } else { loadModelHeaders(); } for (uint8_t i=0; languagePacks[i]; i++) { if (!strncmp(g_eeGeneral.ttsLanguage, languagePacks[i]->id, 2)) { currentLanguagePackIdx = i; currentLanguagePack = languagePacks[i]; } } postRadioSettingsLoad(); return true; } void storageReadCurrentModel() { eeLoadModel(g_eeGeneral.currModel); } void storageReadAll() { storageReadRadioSettings(); storageReadCurrentModel(); } void storageEraseAll(bool warn) { TRACE("storageEraseAll"); generalDefault(); setModelDefaults(0); if (warn) { ALERT(STR_STORAGE_WARNING, STR_BAD_RADIO_DATA, AU_BAD_RADIODATA); } RAISE_ALERT(STR_STORAGE_WARNING, STR_STORAGE_FORMAT, nullptr, AU_NONE); storageFormat(); storageDirty(EE_GENERAL|EE_MODEL); storageCheck(true); } void checkModelIdUnique(uint8_t index, uint8_t module) { if (isModuleXJTD8(module)) return; uint8_t modelId = g_model.header.modelId[module]; uint8_t additionalOnes = 0; char * name = reusableBuffer.moduleSetup.msg; memset(reusableBuffer.moduleSetup.msg, 0, sizeof(reusableBuffer.moduleSetup.msg)); if (modelId != 0) { for (uint8_t i = 0; i < MAX_MODELS; i++) { if (i != index) { if (modelId == modelHeaders[i].modelId[module]) { if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.moduleSetup.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") if (reusableBuffer.moduleSetup.msg[0] != '\0') { name = strAppend(name, ", "); } if (modelHeaders[i].name[0] == 0) { name = strAppend(name, STR_MODEL); name = strAppendUnsigned(name+strlen(name), i + 1, 2); } else { name = strAppend(name, modelHeaders[i].name, LEN_MODEL_NAME); } } else { additionalOnes++; } } } } } if (additionalOnes) { name = strAppend(name, " (+"); name = strAppendUnsigned(name, additionalOnes); strAppend(name, ")"); } if (reusableBuffer.moduleSetup.msg[0]) { POPUP_WARNING(STR_MODELIDUSED, reusableBuffer.moduleSetup.msg); } }