diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 501bdf1a1..f52fc0d02 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -73,11 +73,6 @@ set(RADIO_BIN_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) configure_file(stamp.h.in stamp.h @ONLY) -set(EEPROM_VARIANT 0) -set(GVARS_VARIANT 1) -set(FRSKY_VARIANT 2) -set(3POS_VARIANT 4) - if(PCB STREQUAL X12S OR PCB STREQUAL X10) include(targets/horus/CMakeLists.txt) elseif(PCB STREQUAL NV14) @@ -151,7 +146,6 @@ include(gui/CMakeLists.txt) set(SRC ${SRC} storage/storage_common.cpp) set(SRC ${SRC} storage/sdcard_common.cpp) set(SRC ${SRC} storage/sdcard_yaml.cpp) -add_definitions(-DSDCARD_YAML) include(storage/yaml/CMakeLists.txt) if(STORAGE_MODELSLIST) set(SRC ${SRC} storage/modelslist.cpp) @@ -197,7 +191,6 @@ endif() if(GVARS) add_definitions(-DGVARS) set(SRC ${SRC} gvars.cpp) - math(EXPR EEPROM_VARIANT ${EEPROM_VARIANT}+${GVARS_VARIANT}) endif() if(FAI STREQUAL YES) @@ -242,11 +235,7 @@ if(SIMU_DISKIO) add_definitions(-DSIMU_DISKIO) endif() -if(SDCARD) - add_definitions(-DSDCARD) - set(SRC ${SRC} sdcard.cpp rtc.cpp logs.cpp lib_file.cpp) - set(FIRMWARE_SRC ${FIRMWARE_SRC}) -endif() +set(SRC ${SRC} sdcard.cpp rtc.cpp logs.cpp lib_file.cpp) if(BLUETOOTH) add_definitions(-DBLUETOOTH) @@ -320,10 +309,6 @@ if(IMU_LSM6DS33) add_definitions(-DIMU_LSM6DS33) endif() -if(EEPROM_VARIANT_NEEDED) - add_definitions(-DEEPROM_VARIANT=${EEPROM_VARIANT}) -endif() - if(TEST_BUILD_WARNING) add_definitions(-DTEST_BUILD_WARNING) endif() diff --git a/radio/src/audio.cpp b/radio/src/audio.cpp index a7e09bcf5..fb8c98bb1 100644 --- a/radio/src/audio.cpp +++ b/radio/src/audio.cpp @@ -69,8 +69,6 @@ const int16_t sineValues[] = #define SINE_INDEX_Q3 768 #define MAX_SINE_INDEX 1024 -#if defined(SDCARD) - const char * const unitsFilenames[] = { "", "volt", @@ -345,13 +343,6 @@ void playModelName() audioQueue.playFile(filename); } -#else // defined(SDCARD) - -#define isAudioFileReferenced(i, f) false - -#endif // defined(SDCARD) - - AudioQueue audioQueue __DMA; // to place it in the RAM section on Horus, to have file buffers in RAM for DMA access AudioBuffer audioBuffers[AUDIO_BUFFER_COUNT] __DMA; @@ -397,8 +388,6 @@ inline void mixSample(audio_data_t * result, int sample, unsigned int fade) *result = limit(AUDIO_DATA_MIN, *result + ((sample >> fade) >> (16-AUDIO_BITS_PER_SAMPLE)), AUDIO_DATA_MAX); } -#if defined(SDCARD) - #define RIFF_CHUNK_SIZE 12 uint8_t wavBuffer[AUDIO_BUFFER_SIZE*2] __DMA; @@ -485,12 +474,6 @@ int WavContext::mixBuffer(AudioBuffer *buffer, int volume, unsigned int fade) } return 0; } -#else -int WavContext::mixBuffer(AudioBuffer *buffer, int volume, unsigned int fade) -{ - return 0; -} -#endif const uint8_t toneVolumes[] = { 10, 8, 6, 4, 2 }; inline float evalVolumeRatio(int freq, int volume) @@ -737,7 +720,6 @@ void AudioQueue::playTone(uint16_t freq, uint16_t len, uint16_t pause, uint8_t f RTOS_UNLOCK_MUTEX(audioMutex); } -#if defined(SDCARD) void AudioQueue::playFile(const char * filename, uint8_t flags, uint8_t id, int8_t fragmentVolume) { #if defined(SIMU) @@ -800,8 +782,6 @@ void AudioQueue::stopSD() playTone(0, 0, 100, PLAY_NOW); // insert a 100ms pause } -#endif - void AudioQueue::stopAll() { flush(); @@ -931,14 +911,12 @@ void audioEvent(unsigned int index) } if (g_eeGeneral.beepMode >= e_mode_nokeys || (g_eeGeneral.beepMode >= e_mode_alarms && index <= AU_ERROR)) { -#if defined(SDCARD) char filename[AUDIO_FILENAME_MAXLEN + 1]; if (index < AU_SPECIAL_SOUND_FIRST && isAudioFileReferenced(index, filename)) { audioQueue.stopPlay(ID_PLAY_PROMPT_BASE + index); audioQueue.playFile(filename, 0, ID_PLAY_PROMPT_BASE + index); return; } -#endif switch (index) { case AU_INACTIVITY: audioQueue.playTone(2250, 80, 20, PLAY_REPEAT(2)); @@ -1090,7 +1068,6 @@ void audioEvent(unsigned int index) } } -#if defined(SDCARD) void pushUnit(uint8_t unit, uint8_t idx, uint8_t id, uint8_t fragmentVolume) { if (unit < DIM(unitsFilenames)) { @@ -1104,11 +1081,9 @@ void pushUnit(uint8_t unit, uint8_t idx, uint8_t id, uint8_t fragmentVolume) TRACE("pushUnit: out of bounds unit : %d", unit); // We should never get here, but given the nature of TTS files, this prevent segfault in case of bug there. } } -#endif void pushPrompt(uint16_t prompt, uint8_t id, uint8_t fragmentVolume) { -#if defined(SDCARD) char filename[AUDIO_FILENAME_MAXLEN+1]; char * str = strAppendSystemAudioPath(filename); strcpy(str, "0000" SOUNDS_EXT); @@ -1117,7 +1092,6 @@ void pushPrompt(uint16_t prompt, uint8_t id, uint8_t fragmentVolume) prompt /= 10; } audioQueue.playFile(filename, 0, id, fragmentVolume); -#endif } void onKeyError() diff --git a/radio/src/audio.h b/radio/src/audio.h index a78295375..b9b6fd751 100644 --- a/radio/src/audio.h +++ b/radio/src/audio.h @@ -668,7 +668,7 @@ void playModelName(); #define AUDIO_FLUSH() audioQueue.flush() #endif -#if defined(SDCARD) && defined(AUDIO) +#if defined(AUDIO) extern tmr10ms_t timeAutomaticPromptsSilence; void playModelEvent(uint8_t category, uint8_t index, event_t event=0); #define PLAY_PHASE_OFF(phase) playModelEvent(PHASE_AUDIO_CATEGORY, phase, AUDIO_EVENT_OFF) diff --git a/radio/src/edgetx.cpp b/radio/src/edgetx.cpp index 083f36790..671bbe36d 100644 --- a/radio/src/edgetx.cpp +++ b/radio/src/edgetx.cpp @@ -71,9 +71,7 @@ RadioData g_eeGeneral; ModelData g_model; -#if defined(SDCARD) Clipboard clipboard; -#endif GlobalData globalData; @@ -655,10 +653,6 @@ static void checkFailsafe() #if defined(GUI) void checkAll(bool isBootCheck) { -#if defined(EEPROM_RLC) && !defined(SDCARD_RAW) && !defined(SDCARD_YAML) - checkLowEEPROM(); -#endif - checkSDfreeStorage(); // we don't check the throttle stick if the radio is not calibrated @@ -735,17 +729,6 @@ void checkAll(bool isBootCheck) } #endif // GUI - -#if defined(EEPROM_RLC) && !defined(SDCARD_RAW) && !defined(SDCARD_YAML) -void checkLowEEPROM() -{ - if (g_eeGeneral.disableMemoryWarning) return; - if (EeFsGetFree() < 100) { - ALERT(STR_STORAGE_WARNING, STR_EEPROMLOWMEM, AU_ERROR); - } -} -#endif - bool isThrottleWarningAlertNeeded() { if (g_model.disableThrottleWarning) { @@ -1097,9 +1080,7 @@ void edgeTxClose(uint8_t shutdown) luaClose(&lsScripts); #endif -#if defined(SDCARD) logsClose(); -#endif storageFlushCurrentModel(); @@ -1127,9 +1108,7 @@ void edgeTxClose(uint8_t shutdown) #endif #endif -#if defined(SDCARD) sdDone(); -#endif } void edgeTxResume() @@ -1387,14 +1366,13 @@ void edgeTxInit() #endif // Load radio.yml so radio settings can be used - bool radioSettingsValid = false; #if defined(RTC_BACKUP_RAM) // Skip loading if EM startup and radio has RTC backup data if (!UNEXPECTED_SHUTDOWN()) - radioSettingsValid = storageReadRadioSettings(false); + storageReadRadioSettings(false); #else // No RTC backup - try and load even for EM startup - radioSettingsValid = storageReadRadioSettings(false); + storageReadRadioSettings(false); #endif #if defined(GUI) && !defined(COLORLCD) @@ -1419,7 +1397,6 @@ void edgeTxInit() #endif #endif -#if defined(SDCARD) // SDCARD related stuff, only enable if normal boot if (!UNEXPECTED_SHUTDOWN()) { @@ -1450,16 +1427,6 @@ void edgeTxInit() logsInit(); } -#endif // defined(SDCARD) - -#if defined(EEPROM) - if (!radioSettingsValid) { - storageReadRadioSettings(); - } - storageReadCurrentModel(); -#else - (void)radioSettingsValid; -#endif #if defined(COLORLCD) && defined(LUA) if (!UNEXPECTED_SHUTDOWN()) { @@ -1468,8 +1435,7 @@ void edgeTxInit() } #endif - // handling of storage for radios that have no EEPROM -#if !defined(EEPROM) + // handling of storage for radios #if defined(RTC_BACKUP_RAM) && !defined(SIMU) if (UNEXPECTED_SHUTDOWN()) { // SDCARD not available, try to restore last model from RAM @@ -1483,7 +1449,6 @@ void edgeTxInit() #else storageReadAll(); #endif -#endif // #if !defined(EEPROM) initSerialPorts(); @@ -1639,10 +1604,6 @@ int main() runFatalErrorScreen(STR_NO_SDCARD); } #endif - -#if defined(EEPROM) && defined(EEPROM_RLC) - eepromInit(); -#endif tasksStart(); } diff --git a/radio/src/edgetx.h b/radio/src/edgetx.h index f138ccd5a..77978b5be 100644 --- a/radio/src/edgetx.h +++ b/radio/src/edgetx.h @@ -447,9 +447,7 @@ enum FunctionsActive { FUNCTION_TRAINER_CHANNELS = FUNCTION_TRAINER_STICK1 + MAX_STICKS, FUNCTION_INSTANT_TRIM, FUNCTION_VARIO, -#if defined(SDCARD) FUNCTION_LOGS, -#endif FUNCTION_BACKGND_MUSIC, FUNCTION_BACKGND_MUSIC_PAUSE, FUNCTION_BACKLIGHT, @@ -586,9 +584,7 @@ enum AUDIO_SOUNDS { #include "haptic.h" #endif -#if defined(SDCARD) #include "sdcard.h" -#endif #if defined(RTCLOCK) #include "rtc.h" @@ -639,10 +635,7 @@ constexpr uint8_t TEXT_FILENAME_MAXLEN = 40; union ReusableBuffer { struct { -#if defined(EEPROM_RLC) && LCD_W < 212 - uint16_t eepromfree; -#endif -#if defined(SDCARD) && !defined(COLORLCD) +#if !defined(COLORLCD) char menu_bss[POPUP_MENU_MAX_LINES][MENU_LINE_LENGTH]; char mainname[45]; // because reused for SD backup / restore, max backup filename 44 chars: "/MODELS/MODEL0134353-2014-06-19-04-51-27.bin" #elif !defined(COLORLCD) @@ -685,7 +678,6 @@ union ReusableBuffer } inputs[MAX_ANALOG_INPUTS]; } calib; -#if defined(SDCARD) struct { #if defined(NUM_BODY_LINES) char lines[NUM_BODY_LINES][SD_SCREEN_FILE_LENGTH+1+1]; // the last char is used to store the flags (directory) of the line @@ -699,7 +691,6 @@ union ReusableBuffer char otaReceiverVersion[sizeof(TR_CURRENT_VERSION) + 12]; #endif } sdManager; -#endif struct { @@ -874,7 +865,6 @@ void varioWakeup(); #include "lua/lua_api.h" -#if defined(SDCARD) enum ClipboardType { CLIPBOARD_TYPE_NONE, CLIPBOARD_TYPE_CUSTOM_SWITCH, @@ -901,7 +891,6 @@ struct Clipboard { }; extern Clipboard clipboard; -#endif #if defined(INTERNAL_GPS) #include "gps.h" diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index 3126a8950..588b40a78 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -311,7 +311,6 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext } #endif -#if defined(SDCARD) case FUNC_PLAY_SOUND: case FUNC_PLAY_TRACK: case FUNC_PLAY_VALUE: @@ -352,51 +351,12 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext newActiveFunctions |= (1 << FUNCTION_BACKGND_MUSIC_PAUSE); break; -#else - case FUNC_PLAY_SOUND: - case FUNC_PLAY_TRACK: - case FUNC_PLAY_BOTH: - case FUNC_PLAY_VALUE: { - tmr10ms_t tmr10ms = get_tmr10ms(); - uint8_t repeatParam = CFN_PLAY_REPEAT(cfn); - if (!functionsContext.lastFunctionTime[i] || - (CFN_FUNC(cfn) == FUNC_PLAY_BOTH && - active != - (bool)(functionsContext.activeSwitches & switch_mask)) || - (repeatParam && - (signed)(tmr10ms - functionsContext.lastFunctionTime[i]) >= - 1000 * repeatParam)) { - functionsContext.lastFunctionTime[i] = tmr10ms; - uint8_t param = CFN_PARAM(cfn); - if (CFN_FUNC(cfn) == FUNC_PLAY_SOUND) { - AUDIO_PLAY(AU_SPECIAL_SOUND_FIRST + param); - } else if (CFN_FUNC(cfn) == FUNC_PLAY_VALUE) { - PLAY_VALUE(param, PLAY_INDEX); - } else { -#if defined(GVARS) - if (CFN_FUNC(cfn) == FUNC_PLAY_TRACK && param > 250) - param = GVAR_VALUE( - param - 251, - getGVarFlightMode(mixerCurrentFlightMode, param - 251)); -#endif - PUSH_CUSTOM_PROMPT(active ? param : param + 1, PLAY_INDEX); - } - } - if (!active) { - // PLAY_BOTH would change activeFnSwitches otherwise - switch_mask = 0; - } - break; - } -#endif - #if defined(VARIO) case FUNC_VARIO: newActiveFunctions |= (1u << FUNCTION_VARIO); break; #endif -#if defined(SDCARD) case FUNC_LOGS: if (CFN_PARAM(cfn)) { newActiveFunctions |= (1u << FUNCTION_LOGS); @@ -404,7 +364,6 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext cfn); // logging period is 0..25.5s in 100ms increments } break; -#endif case FUNC_BACKLIGHT: { newActiveFunctions |= (1u << FUNCTION_BACKLIGHT); diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index c5022f050..bf095c8a6 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -139,14 +139,10 @@ extern uint8_t s_copySrcCh; extern int8_t s_currCh; extern uint8_t s_maxLines; -#if defined(SDCARD) #define STATUS_LINE_LENGTH 32 extern char statusLineMsg[STATUS_LINE_LENGTH]; void showStatusLine(); void drawStatusLine(); -#else -#define drawStatusLine() -#endif void menuTextView(event_t event); void pushMenuTextView(const char *filename); diff --git a/radio/src/gui/128x64/menu_radio.cpp b/radio/src/gui/128x64/menu_radio.cpp index 640be4824..57afdae53 100644 --- a/radio/src/gui/128x64/menu_radio.cpp +++ b/radio/src/gui/128x64/menu_radio.cpp @@ -25,9 +25,7 @@ const MenuHandler menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { #if defined(RADIO_TOOLS) { menuRadioTools, nullptr }, #endif -#if defined(SDCARD) { menuRadioSdManager, nullptr }, -#endif { menuRadioSetup, nullptr }, { menuRadioSpecialFunctions, radioGFEnabled }, { menuRadioTrainer, radioTrainerEnabled }, diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index b071c85c6..27e5c526b 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -54,7 +54,7 @@ enum MenuRadioIndexes #if defined(RADIO_TOOLS) MENU_RADIO_TOOLS, #endif - CASE_SDCARD(MENU_RADIO_SD_MANAGER) + MENU_RADIO_SD_MANAGER, MENU_RADIO_SETUP, MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index 986a53190..42f020e03 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -53,7 +53,6 @@ void onModelSelectMenu(const char * result) s_copyTgtOfs = 0; s_copySrcRow = -1; } -#if defined(SDCARD) else if (result == STR_BACKUP_MODEL) { storageCheck(true); // force writing of current model data before this is changed POPUP_WARNING(backupModel(sub)); @@ -61,24 +60,17 @@ void onModelSelectMenu(const char * result) else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { const char* ext = nullptr; const char* path = nullptr; -#if defined(SDCARD_YAML) ext = STR_YAML_EXT; path = STR_BACKUP_PATH; -#else - ext = STR_MODELS_EXT; - path = STR_MODELS_PATH; -#endif if (sdListFiles(path, ext, MENU_LINE_LENGTH-1, nullptr)) POPUP_MENU_START(onModelSelectMenu); else POPUP_WARNING(STR_NO_MODELS_ON_SD); } -#endif else if (result == STR_DELETE_MODEL) { POPUP_CONFIRMATION(STR_DELETEMODEL, onDeleteModelConfirm); SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), 0); } -#if defined(SDCARD) else if (result != STR_EXIT) { // The user choosed a file on SD to restore storageCheck(true); @@ -87,7 +79,6 @@ void onModelSelectMenu(const char * result) loadModel(sub); } } -#endif } static void moveToFreeModelSlot(bool forward, int8_t& sub, int8_t oldSub) @@ -206,22 +197,18 @@ void menuModelSelect(event_t event) if (g_eeGeneral.currModel != sub) { if (modelExists(sub)) { POPUP_MENU_ADD_ITEM(STR_SELECT_MODEL); - POPUP_MENU_ADD_SD_ITEM(STR_BACKUP_MODEL); + POPUP_MENU_ADD_ITEM(STR_BACKUP_MODEL); POPUP_MENU_ADD_ITEM(STR_COPY_MODEL); POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL); POPUP_MENU_ADD_ITEM(STR_DELETE_MODEL); } else { -#if defined(SDCARD) POPUP_MENU_ADD_ITEM(STR_CREATE_MODEL); POPUP_MENU_ADD_ITEM(STR_RESTORE_MODEL); -#else - selectModel(sub); -#endif } } else { - POPUP_MENU_ADD_SD_ITEM(STR_BACKUP_MODEL); + POPUP_MENU_ADD_ITEM(STR_BACKUP_MODEL); POPUP_MENU_ADD_ITEM(STR_COPY_MODEL); POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL); } @@ -265,12 +252,6 @@ void menuModelSelect(event_t event) } } -#if defined(EEPROM) - lcdDrawText(9*FW-(LEN_FREE-4)*FW-4, 0, STR_FREE); - if (event) reusableBuffer.modelsel.eepromfree = EeFsGetFree(); - lcdDrawNumber(lcdLastRightPos+3, 0, reusableBuffer.modelsel.eepromfree, LEFT); -#endif - extern uint8_t menuSize(const MenuHandler*, uint8_t); uint8_t sz = menuSize(menuTabModel, DIM(menuTabModel)); #if defined(NAVIGATION_X7) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index b14bf7ef1..46c0a9ed0 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -30,10 +30,8 @@ #include "usb_joystick.h" #endif -#if !defined(EEPROM) #include "storage/sdcard_common.h" #include "storage/modelslist.h" -#endif #if defined(CROSSFIRE) #include "telemetry/crossfire.h" diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index 5288a758d..6a7396f40 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -28,7 +28,6 @@ #define MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF (19 * FW - 3) #define MODEL_SPECIAL_FUNC_5TH_COLUMN_ONOFF (20 * FW + 1) -#if defined(SDCARD) #define SD_LOGS_PERIOD_MIN 1 // 0.1s fastest period #define SD_LOGS_PERIOD_MAX 255 // 25.5s slowest period #define SD_LOGS_PERIOD_DEFAULT 10 // 1s default period for newly created SF @@ -75,7 +74,6 @@ void onCustomFunctionsFileSelectionMenu(const char * result) } } } -#endif // SDCARD #if defined(PCBTARANIS) void onAdjustGvarSourceLongEnterPress(const char * result) @@ -316,7 +314,6 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF lcdDrawNumber(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT); } #endif -#if defined(SDCARD) else if (func == FUNC_PLAY_TRACK || func == FUNC_BACKGND_MUSIC || func == FUNC_PLAY_SCRIPT || func == FUNC_RGB_LED) { coord_t x = MODEL_SPECIAL_FUNC_3RD_COLUMN - 6; if (func == FUNC_PLAY_SCRIPT) @@ -359,7 +356,6 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF INCDEC_ENABLE_CHECK(functionsContext == &globalFunctionsContext ? isSourceAvailableInGlobalFunctions : isSourceAvailable); } } -#endif // SDCARD else if (func == FUNC_VOLUME) { val_max = MIXSRC_LAST_CH; drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); @@ -376,7 +372,6 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF INCDEC_ENABLE_CHECK(isSourceAvailable); } } -#if defined(SDCARD) else if (func == FUNC_LOGS) { val_min = SD_LOGS_PERIOD_MIN; val_max = SD_LOGS_PERIOD_MAX; @@ -388,7 +383,6 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF lcdDrawNumber(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|PREC1|LEFT); lcdDrawChar(lcdLastRightPos, y, 's'); } -#endif #if defined(GVARS) else if (func == FUNC_ADJUST_GVAR) { switch (CFN_GVAR_MODE(cfn)) { diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index 9642a091e..c8b8e9105 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -243,7 +243,6 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int } #endif -#if defined(SDCARD) char statusLineMsg[STATUS_LINE_LENGTH]; tmr10ms_t statusLineTime = 0; uint8_t statusLineHeight = 0; @@ -272,4 +271,3 @@ void drawStatusLine() lcdDrawFilledRect(0, LCD_H-statusLineHeight, LCD_W, FH, SOLID); } } -#endif diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index 9ab4e9e07..3dd3aa40b 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -51,13 +51,8 @@ void onModelSelectMenu(const char * result) else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { const char* ext = nullptr; const char* path = nullptr; -#if defined(SDCARD_YAML) ext = STR_YAML_EXT; path = STR_BACKUP_PATH; -#else - ext = STR_MODELS_EXT; - path = STR_MODELS_PATH; -#endif if (sdListFiles(path, ext, MENU_LINE_LENGTH-1, nullptr)) POPUP_MENU_START(onModelSelectMenu); else @@ -201,7 +196,7 @@ void menuModelSelect(event_t event) if (g_eeGeneral.currModel != sub) { if (modelExists(sub)) { POPUP_MENU_ADD_ITEM(STR_SELECT_MODEL); - POPUP_MENU_ADD_SD_ITEM(STR_BACKUP_MODEL); + POPUP_MENU_ADD_ITEM(STR_BACKUP_MODEL); POPUP_MENU_ADD_ITEM(STR_COPY_MODEL); POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL); POPUP_MENU_ADD_ITEM(STR_DELETE_MODEL); @@ -212,7 +207,7 @@ void menuModelSelect(event_t event) } } else { - POPUP_MENU_ADD_SD_ITEM(STR_BACKUP_MODEL); + POPUP_MENU_ADD_ITEM(STR_BACKUP_MODEL); POPUP_MENU_ADD_ITEM(STR_COPY_MODEL); POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL); } @@ -241,12 +236,6 @@ void menuModelSelect(event_t event) } } -#if defined(EEPROM) - lcdDrawNumber(19*FW, 0, EeFsGetFree(), RIGHT); - lcdDrawText(19*FW + 3, 0, STR_BYTES); - lcdDrawText(lcdLastRightPos + 3, 0, STR_FREE); -#endif - extern uint8_t menuSize(const MenuHandler*, uint8_t); drawScreenIndex(MENU_MODEL_SELECT, menuSize(menuTabModel, DIM(menuTabModel)), 0); lcdDrawFilledRect(0, 0, LCD_W, FH, SOLID, FILL_WHITE|GREY_DEFAULT); @@ -279,9 +268,6 @@ void menuModelSelect(event_t event) if (modelExists(k)) { drawModelName(4*FW, y, modelHeaders[k].name, k, 0); -#if defined(EEPROM) - lcdDrawNumber(20*FW, y, eeModelSize(k), RIGHT); -#endif if (k==g_eeGeneral.currModel && (s_copyMode!=COPY_MODE || s_copySrcRow<0 || i+menuVerticalOffset!=(vertpos_t)sub)) lcdDrawChar(1, y, '*'); } diff --git a/radio/src/gui/212x64/model_special_functions.cpp b/radio/src/gui/212x64/model_special_functions.cpp index 0195e5a38..62b833ca8 100644 --- a/radio/src/gui/212x64/model_special_functions.cpp +++ b/radio/src/gui/212x64/model_special_functions.cpp @@ -304,7 +304,6 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF lcdDrawNumber(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT); } #endif -#if defined(SDCARD) else if (func == FUNC_PLAY_TRACK || func == FUNC_BACKGND_MUSIC || func == FUNC_PLAY_SCRIPT) { coord_t x = MODEL_SPECIAL_FUNC_3RD_COLUMN; if (ZEXIST(cfn->play.name)) @@ -338,7 +337,6 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF INCDEC_ENABLE_CHECK(functionsContext == &globalFunctionsContext ? isSourceAvailableInGlobalFunctions : isSourceAvailable); } } -#endif else if (func == FUNC_VOLUME) { val_max = MIXSRC_LAST_CH; drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); diff --git a/radio/src/gui/212x64/widgets.cpp b/radio/src/gui/212x64/widgets.cpp index 635381d13..1242fa1f5 100644 --- a/radio/src/gui/212x64/widgets.cpp +++ b/radio/src/gui/212x64/widgets.cpp @@ -203,7 +203,6 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int } #endif -#if defined(SDCARD) char statusLineMsg[STATUS_LINE_LENGTH]; tmr10ms_t statusLineTime = 0; uint8_t statusLineHeight = 0; @@ -232,4 +231,3 @@ void drawStatusLine() lcdDrawFilledRect(0, LCD_H-statusLineHeight, LCD_W, FH, SOLID); } } -#endif diff --git a/radio/src/gui/colorlcd/libui/view_text.cpp b/radio/src/gui/colorlcd/libui/view_text.cpp index 2f3461445..f25dbe527 100644 --- a/radio/src/gui/colorlcd/libui/view_text.cpp +++ b/radio/src/gui/colorlcd/libui/view_text.cpp @@ -425,11 +425,7 @@ static void replaceSpaceWithUnderscore(std::string& name) } while (index != std::string::npos); } -#if defined(SDCARD_YAML) #define MODEL_FILE_EXT YAML_EXT -#else -#define MODEL_FILE_EXT MODELS_EXT -#endif static bool checkNotesFile(std::string modelNotesName) { @@ -449,7 +445,6 @@ static std::string getModelNotesFile() if (checkNotesFile(modelNotesName)) return modelNotesName; -#if !defined(EEPROM) modelNotesName.assign(g_eeGeneral.currModelFilename); size_t index = modelNotesName.find(MODEL_FILE_EXT); if (index != std::string::npos) { @@ -461,7 +456,6 @@ static std::string getModelNotesFile() replaceSpaceWithUnderscore(modelNotesName); if (checkNotesFile(modelNotesName)) return modelNotesName; -#endif return std::string(""); } diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt index 17f8d753a..b58311f3a 100644 --- a/radio/src/gui/common/stdlcd/CMakeLists.txt +++ b/radio/src/gui/common/stdlcd/CMakeLists.txt @@ -16,6 +16,7 @@ set(GUI_SRC ../common/stdlcd/view_telemetry.cpp ../common/stdlcd/calibration.cpp ../common/stdlcd/splash.cpp + ../common/stdlcd/radio_sdmanager.cpp model_curve_edit.cpp ) @@ -27,13 +28,6 @@ if(HELI) set(GUI_SRC ${GUI_SRC} ../common/stdlcd/model_heli.cpp) endif() -if(SDCARD) - set(GUI_SRC - ${GUI_SRC} - ../common/stdlcd/radio_sdmanager.cpp - ) -endif() - if(PXX2) set(GUI_SRC ${GUI_SRC} diff --git a/radio/src/gui/common/stdlcd/features.h b/radio/src/gui/common/stdlcd/features.h index 959099398..d97f21c55 100644 --- a/radio/src/gui/common/stdlcd/features.h +++ b/radio/src/gui/common/stdlcd/features.h @@ -131,10 +131,4 @@ #define CASE_PCBX9E_PCBX9DP(x) #endif -#if defined(SDCARD) - #define CASE_SDCARD(x) x, -#else - #define CASE_SDCARD(x) -#endif - #define CASE_SPLASH_PARAM(x) x, diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index cb0f79ba0..0b53a3b5c 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -111,39 +111,31 @@ const char * runPopupMenu(event_t event) if (popupMenuSelectedItem > 0) { popupMenuSelectedItem--; } -#if defined(SDCARD) else if (popupMenuOffset > 0) { popupMenuOffset--; result = STR_UPDATE_LIST; } -#endif else { popupMenuSelectedItem = min(display_count, MENU_MAX_DISPLAY_LINES) - 1; -#if defined(SDCARD) if (popupMenuItemsCount > MENU_MAX_DISPLAY_LINES) { popupMenuOffset = popupMenuItemsCount - display_count; result = STR_UPDATE_LIST; } -#endif } } else if (IS_NEXT_EVENT(eventTemp)) { if (popupMenuSelectedItem < display_count - 1 && popupMenuOffset + popupMenuSelectedItem + 1 < popupMenuItemsCount) { popupMenuSelectedItem++; } -#if defined(SDCARD) else if (popupMenuItemsCount > popupMenuOffset + display_count) { popupMenuOffset++; result = STR_UPDATE_LIST; } -#endif else { popupMenuSelectedItem = 0; -#if defined(SDCARD) if (popupMenuOffset) { popupMenuOffset = 0; result = STR_UPDATE_LIST; } -#endif } } else if (eventTemp == EVT_KEY_BREAK(KEY_ENTER)) { result = popupMenuItems[popupMenuSelectedItem + (popupMenuOffsetType == MENU_OFFSET_INTERNAL ? popupMenuOffset : 0)]; diff --git a/radio/src/gui/common/stdlcd/popups.h b/radio/src/gui/common/stdlcd/popups.h index f9cfd8b8d..eee08b03e 100644 --- a/radio/src/gui/common/stdlcd/popups.h +++ b/radio/src/gui/common/stdlcd/popups.h @@ -92,12 +92,6 @@ enum WarningType extern void POPUP_MENU_ADD_ITEM(const char * s); -#if defined(SDCARD) - #define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s) -#else - #define POPUP_MENU_ADD_SD_ITEM(s) -#endif - extern void POPUP_MENU_SELECT_ITEM(uint8_t index); extern void POPUP_MENU_TITLE(const char * s); diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index 6541b3327..d400e75c6 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -87,10 +87,6 @@ enum { ITEM_RADIO_HARDWARE_DEBUG, #if defined(FUNCTION_SWITCHES) ITEM_RADIO_HARDWARE_DEBUG_FS, -#endif -#if defined(EEPROM) - ITEM_RADIO_BACKUP_EEPROM, - ITEM_RADIO_FACTORY_RESET, #endif ITEM_RADIO_HARDWARE_MAX }; @@ -124,17 +120,6 @@ static const IsValueAvailable _isSerialModeAvailable[MAX_SERIAL_PORTS] = { _isAux1ModeAvailable, _isAux2ModeAvailable, _isVCPModeAvailable }; -#if defined(EEPROM) -void onFactoryResetConfirm(const char* result) -{ - if (result == STR_OK) { - showMessageBox(STR_STORAGE_FORMAT); - storageEraseAll(false); - NVIC_SystemReset(); - } -} -#endif - static void _init_menu_tab_array(uint8_t* tab, size_t len) { memset((void*)tab, READONLY_ROW, sizeof(MENU_TAB_ARRAY_TYPE) * len); @@ -224,10 +209,6 @@ static void _init_menu_tab_array(uint8_t* tab, size_t len) #if defined(FUNCTION_SWITCHES) tab[ITEM_RADIO_HARDWARE_DEBUG_FS] = 0; #endif -#if defined(EEPROM) - tab[ITEM_RADIO_BACKUP_EEPROM] = 0; - tab[ITEM_RADIO_FACTORY_RESET] = 0; -#endif } void menuRadioHardware(event_t event) @@ -469,30 +450,6 @@ void menuRadioHardware(event_t event) break; #endif -#if defined(EEPROM) - case ITEM_RADIO_BACKUP_EEPROM: - if (LCD_W < 212) - lcdDrawText(LCD_W / 2, y, BUTTON(STR_EEBACKUP), attr | CENTERED); - else - lcdDrawText(HW_SETTINGS_COLUMN2, y, BUTTON(STR_EEBACKUP), attr); - if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { - s_editMode = EDIT_SELECT_FIELD; - eepromBackup(); - } - break; - - case ITEM_RADIO_FACTORY_RESET: - if (LCD_W < 212) - lcdDrawText(LCD_W / 2, y, BUTTON(STR_FACTORYRESET), attr | CENTERED); - else - lcdDrawText(HW_SETTINGS_COLUMN2, y, BUTTON(STR_FACTORYRESET), attr); - if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { - s_editMode = EDIT_SELECT_FIELD; - POPUP_CONFIRMATION(STR_CONFIRMRESET, onFactoryResetConfirm); - } - break; -#endif - default: if (k <= ITEM_RADIO_HARDWARE_STICK_END) { // Sticks diff --git a/radio/src/gui/navigation/navigation_x7.cpp b/radio/src/gui/navigation/navigation_x7.cpp index 4e045af71..089c97b83 100644 --- a/radio/src/gui/navigation/navigation_x7.cpp +++ b/radio/src/gui/navigation/navigation_x7.cpp @@ -153,7 +153,7 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, case EVT_KEY_LONG(KEY_MODEL): if (menuTab == menuTabModel) { if (modelHasNotes()) { - POPUP_MENU_ADD_SD_ITEM(STR_VIEW_CHANNELS); + POPUP_MENU_ADD_ITEM(STR_VIEW_CHANNELS); POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES); POPUP_MENU_START(onLongMenuPress); } diff --git a/radio/src/targets/taranis/eeprom_driver.cpp b/radio/src/hal/eeprom/eeprom_driver.cpp similarity index 100% rename from radio/src/targets/taranis/eeprom_driver.cpp rename to radio/src/hal/eeprom/eeprom_driver.cpp diff --git a/radio/src/hal/eeprom_driver.h b/radio/src/hal/eeprom/eeprom_driver.h similarity index 100% rename from radio/src/hal/eeprom_driver.h rename to radio/src/hal/eeprom/eeprom_driver.h diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index 0e0f029a5..3fd9e9ca9 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -135,12 +135,8 @@ const char * logsOpen() if (g_model.header.name[0]) { tmp = strAppend(tmp, sanitizeForFilename(g_model.header.name, LEN_MODEL_NAME)); } else { -#if defined(EEPROM) - uint8_t num = g_eeGeneral.currModel + 1; -#else // TODO uint8_t num = 1; -#endif tmp = strAppend(tmp, STR_MODEL); tmp = strAppendUnsigned(tmp, num, 2); } diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index efb94f6a9..b16cacfc8 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -30,9 +30,7 @@ #include "gvars.h" #include "mixes.h" -#if defined(SDCARD_YAML) #include -#endif #if defined(MULTIMODULE) #include "pulses/multi.h" @@ -97,9 +95,6 @@ static int luaModelSetInfo(lua_State *L) if (!strcmp(key, "name")) { const char * name = luaL_checkstring(L, -1); strncpy(g_model.header.name, name, sizeof(g_model.header.name)); -#if defined(EEPROM) - memcpy(modelHeaders[g_eeGeneral.currModel].name, g_model.header.name, sizeof(g_model.header.name)); -#endif } else if (!strcmp(key, "extendedLimits")) { g_model.extendedLimits = lua_toboolean(L, -1); @@ -238,9 +233,6 @@ static int luaModelSetModule(lua_State *L) } else if (!strcmp(key, "modelId")) { g_model.header.modelId[idx] = luaL_checkinteger(L, -1); -#if defined(EEPROM) - modelHeaders[g_eeGeneral.currModel].modelId[idx] = g_model.header.modelId[idx]; -#endif } else if (!strcmp(key, "firstChannel")) { module.channelsStart = luaL_checkinteger(L, -1); diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 18edb69d6..1e2a2627b 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -283,16 +283,7 @@ void checkHatsAsKeys() } #endif -#if defined(EEPROM) -void checkEeprom() -{ - if (eepromIsWriting()) - eepromWriteProcess(); - else if (TIME_TO_WRITE()) - storageCheck(false); -} -#else -void checkEeprom() +void checkStorageUpdate() { #if defined(RTC_BACKUP_RAM) && !defined(SIMU) if (TIME_TO_BACKUP_RAM()) { @@ -306,7 +297,6 @@ void checkEeprom() storageCheck(false); } } -#endif #define BAT_AVG_SAMPLES 8 @@ -524,7 +514,7 @@ void perMain() checkSpeakerVolume(); if (!usbPlugged() || (getSelectedUsbMode() == USB_UNSELECTED_MODE)) { - checkEeprom(); + checkStorageUpdate(); #if !defined(SIMU) // use FreeRTOS software timer if radio firmware initLoggingTimer(); // initialize software timer for logging @@ -567,7 +557,6 @@ void perMain() sdMount(); } -#if !defined(EEPROM) // In case the SD card is removed during the session if ((!usbPlugged() || (getSelectedUsbMode() == USB_UNSELECTED_MODE)) && !SD_CARD_PRESENT() && !UNEXPECTED_SHUTDOWN()) { @@ -577,7 +566,6 @@ void perMain() return; #endif } -#endif if (usbPlugged() && getSelectedUsbMode() == USB_MASS_STORAGE_MODE) { #if defined(LIBOPENUI) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 582153b11..1bb221468 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -27,13 +27,6 @@ #include "storage/yaml/yaml_defs.h" #include "hal/switch_driver.h" -#if defined(SDCARD_YAML) - #define EEPROM_VER 221 -#else - #define EEPROM_VER 220 -#endif -#define FIRST_CONV_EEPROM_VER 219 - #define GET_MODULE_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol #define GET_TRAINER_PPM_POLARITY() g_model.trainerData.pulsePol #define GET_SBUS_POLARITY(idx) g_model.moduleData[idx].sbus.noninverted diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index 9784699ce..17aee6a1a 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -348,7 +348,6 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen #endif // !LIBOPENUI -#if defined(SDCARD) const char * sdCopyFile(const char * srcPath, const char * destPath) { FIL srcFile; @@ -436,9 +435,6 @@ const char * sdMoveFile(const char * srcFilename, const char * srcDir, const cha return nullptr; } -#endif // defined(SDCARD) - - #if !defined(SIMU) || defined(SIMU_DISKIO) uint32_t sdGetNoSectors() { diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 112e38d36..147b290cf 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -46,7 +46,6 @@ extern FIL g_oLogFile; #define BITMAPS_PATH ROOT_PATH "IMAGES" #define FIRMWARES_PATH ROOT_PATH "FIRMWARE" #define AUTOUPDATE_FILENAME FIRMWARES_PATH PATH_SEPARATOR "autoupdate.frsk" -#define EEPROMS_PATH ROOT_PATH "EEPROM" #define BACKUP_PATH ROOT_PATH "BACKUP" #define SCRIPTS_PATH ROOT_PATH "SCRIPTS" #define WIZARD_PATH SCRIPTS_PATH PATH_SEPARATOR "WIZARD" @@ -62,11 +61,8 @@ extern FIL g_oLogFile; #define LEN_FILE_PATH_MAX (sizeof(SCRIPTS_TELEM_PATH)+1) // longest + "/" -#if defined(SDCARD_YAML) || defined(SDCARD_RAW) #define RADIO_FILENAME "radio.bin" -const char RADIO_MODELSLIST_PATH[] = RADIO_PATH PATH_SEPARATOR "models.txt"; const char RADIO_SETTINGS_PATH[] = RADIO_PATH PATH_SEPARATOR RADIO_FILENAME; -#if defined(SDCARD_YAML) #define LABELS_FILENAME "labels.yml" #define MODELS_FILENAME "models.yml" const char MODELSLIST_YAML_PATH[] = MODELS_PATH PATH_SEPARATOR MODELS_FILENAME; @@ -77,10 +73,8 @@ const char RADIO_SETTINGS_TMPFILE_YAML_PATH[] = RADIO_PATH PATH_SEPARATOR "radio const char RADIO_SETTINGS_ERRORFILE_YAML_PATH[] = RADIO_PATH PATH_SEPARATOR "radio_error.yml"; const char YAMLFILE_CHECKSUM_TAG_NAME[] = "checksum"; -#endif #define SPLASH_FILE "splash.png" #define SHUTDOWN_SPLASH_FILE "shutdown.png" -#endif #define MODELS_EXT ".bin" #define LOGS_EXT ".csv" @@ -92,7 +86,6 @@ const char YAMLFILE_CHECKSUM_TAG_NAME[] = "checksum"; #define SCRIPT_BIN_EXT ".luac" #define TEXT_EXT ".txt" #define FIRMWARE_EXT ".bin" -#define EEPROM_EXT ".bin" #define SPORT_FIRMWARE_EXT ".frk" #define FRSKY_FIRMWARE_EXT ".frsk" #define MULTI_FIRMWARE_EXT ".bin" diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 0f339f242..201b57d61 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -168,10 +168,6 @@ OpenTxSim::~OpenTxSim() simuStop(); stopAudioThread(); -#if defined(EEPROM) - stopEepromThread(); -#endif - delete bmp; delete sliders[0]; delete sliders[1]; @@ -645,13 +641,8 @@ int main(int argc, char ** argv) opentxSim->show(); // Otherwise the main window gets centred across my two monitors, split down the middle. #endif - printf("Model size = %d\n", (int)sizeof(g_model)); -#if defined(EEPROM) || defined(EEPROM_RLC) - startEepromThread(argc >= 2 ? argv[1] : "eeprom.bin"); -#endif - #if !defined(SIMU_BOOTLOADER) startAudioThread(); #endif diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index a59ebe894..f7895c9ac 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -25,7 +25,6 @@ using std::list; -#if defined(SDCARD_YAML) #include "edgetx.h" #include "storage/sdcard_yaml.h" #include "yaml/yaml_datastructs.h" @@ -33,8 +32,6 @@ using std::list; #include "yaml/yaml_modelslist.h" #include "yaml/yaml_parser.h" -#endif - #if defined(USBJ_EX) #include "usb_joystick.h" #endif @@ -920,44 +917,6 @@ void ModelsList::clear() init(); } -/** - * @brief Load and parse the models.txt file - * - * @return true On Success - * @return false On Failure - */ - -bool ModelsList::loadTxt() -{ - char line[LEN_MODELS_IDX_LINE + 1]; - ModelCell *model = nullptr; - - FRESULT result = - f_open(&file, RADIO_MODELSLIST_PATH, FA_OPEN_EXISTING | FA_READ); - if (result == FR_OK) { - // TXT reader - while (readNextLine(line, LEN_MODELS_IDX_LINE)) { - int len = strlen(line); // TODO could be returned by readNextLine - if (len > 2 && line[0] == '[' && line[len - 1] == ']') { - line[len - 1] = '\0'; - } else if (len > 0) { - model = new ModelCell(line); - push_back(model); - if (!strncmp(line, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME)) { - currentModel = model; - } - } - } - - f_close(&file); - return true; - } - - return false; -} - -#if defined(SDCARD_YAML) - /** * @brief Opens a YAML file, reads the data and updates the ModelCell * @@ -1222,35 +1181,19 @@ bool ModelsList::loadYaml() return true; } -#endif /** * @brief Called to load the model data from file * - * @param fmt Format::txt - Opens models.txt file, Format::yaml_txt - Opens - * labels.yml * @return true on success * @return false on failure */ -bool ModelsList::load(Format fmt) +bool ModelsList::load() { if (loaded) return true; - bool res = false; -#if !defined(SDCARD_YAML) - (void)fmt; - res = loadTxt(); -#else - FILINFO fno; - if (fmt == Format::txt || - (fmt == Format::yaml_txt && f_stat(MODELSLIST_YAML_PATH, &fno) != FR_OK && - f_stat(FALLBACK_MODELSLIST_YAML_PATH, &fno) != FR_OK)) { - res = loadTxt(); - } else { - res = loadYaml(); - } -#endif + bool res = loadYaml(); if (!currentModel) { TRACE("ERROR no Current Model Found"); @@ -1283,13 +1226,8 @@ bool ModelsList::load(Format fmt) const char *ModelsList::save(LabelsVector newOrder) { -#if !defined(SDCARD_YAML) - FRESULT result = - f_open(&file, RADIO_MODELSLIST_PATH, FA_CREATE_ALWAYS | FA_WRITE); -#else FRESULT result = f_open(&file, LABELSLIST_YAML_PATH, FA_CREATE_ALWAYS | FA_WRITE); -#endif if (result != FR_OK) return "Couldn't open labels.yml for writing"; // Save current selection @@ -1393,39 +1331,6 @@ void ModelsList::updateCurrentModelCell() } } -/** - * @brief Reads a line from a file. Used by loadTxt - * - * @param line Storage for the read line - * @param maxlen maximum read length - * @return true Success - * @return false Failure - */ - -bool ModelsList::readNextLine(char *line, int maxlen) -{ - while (maxlen > 0) { - unsigned int br; - FRESULT res = f_read(&file, line, 1, &br); - if (res == FR_OK && br == 1) { - // Return if line read - if (*line == 0 || *line == '\n') { - *line = 0; - return true; - } - // Move to next char unless '\r' read - if (*line != '\r') { - line += 1; - maxlen -= 1; - } - } else { - return false; - } - } - *line = 0; - return true; -} - /** * @brief Creates a new ModelCell * diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index 0a806286a..010465ee0 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -34,10 +34,6 @@ #include "sdcard.h" -#if !defined(SDCARD_YAML) -#include "sdcard_raw.h" -#endif - #include "dataconstants.h" #include "rtc.h" @@ -221,21 +217,10 @@ class ModelsList : public ModelsVector void init(); public: - enum class Format { - txt, -#if defined(SDCARD_YAML) - yaml, - yaml_txt, - load_default = yaml, -#else - load_default = txt, -#endif - }; - ModelsList(); ~ModelsList(); - bool load(Format fmt = Format::load_default); + bool load(); const char *save(LabelsVector newOrder=LabelsVector()); void clear(); @@ -249,8 +234,6 @@ class ModelsList : public ModelsVector return std::vector::size(); } - bool readNextLine(char *line, int maxlen); - ModelCell *addModel(const char *name, bool save = true, ModelCell *copyCell = nullptr); bool removeModel(ModelCell *model); bool moveModelTo(unsigned curindex, unsigned toindex); @@ -269,11 +252,8 @@ class ModelsList : public ModelsVector protected: FIL file; - bool loadTxt(); -#if defined(SDCARD_YAML) bool loadYaml(); bool loadYamlDirScanner(); -#endif }; ModelLabelsVector getUniqueLabels(); diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index 9be3d7e54..59e52c322 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -25,29 +25,10 @@ #include "translations.h" #define MODEL_FILENAME_PREFIX "model" -#if defined(SDCARD_RAW) -#define MODEL_FILENAME_SUFFIX ".bin" -#elif defined(SDCARD_YAML) #define MODEL_FILENAME_SUFFIX ".yml" -#endif #define DEFAULT_MODEL_FILENAME MODEL_FILENAME_PREFIX "1" MODEL_FILENAME_SUFFIX #define MODEL_FILENAME_PATTERN MODEL_FILENAME_PREFIX MODEL_FILENAME_SUFFIX -#if !defined(STORAGE_MODELSLIST) -extern ModelHeader modelHeaders[MAX_MODELS]; -#endif - -// opens radio.bin or model file -const char* openFileBin(const char* fullpath, FIL* file, uint16_t* size, - uint8_t* version); - -const char* writeFileBin(const char* fullpath, const uint8_t* data, - uint16_t size, uint8_t version = EEPROM_VER); - -// open, read, and close the file -const char *loadFileBin(const char *fullpath, uint8_t *data, - uint16_t maxsize, uint8_t *version); - // writes a complete YAML file struct YamlNode; const char* writeFileYaml(const char* path, const YamlNode* root_node, uint8_t* data, uint16_t checksum); @@ -62,6 +43,8 @@ const char * writeModel(); #if !defined(STORAGE_MODELSLIST) +extern ModelHeader modelHeaders[MAX_MODELS]; + // index storage vs modelslist void selectModel(uint8_t idx); const char* loadModel(uint8_t idx, bool alarms=true); diff --git a/radio/src/storage/sdcard_raw.h b/radio/src/storage/sdcard_raw.h deleted file mode 100644 index ec494316b..000000000 --- a/radio/src/storage/sdcard_raw.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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. - */ - -#pragma once - -#include "FatFs/ff.h" - -#if defined(SDCARD_RAW) - -#define writeModel writeModelBin -#define loadRadioSettings loadRadioSettingsBin -#define writeGeneralSettings writeGeneralSettingsBin - -const char* readModel(const char* filename, uint8_t* buffer, uint32_t size); - -#endif - -const char* loadRadioSettingsBin(); -const char * writeGeneralSettingsBin(); - -const char* openFileBin(const char* fullpath, FIL* file, uint16_t* size, - uint8_t* version); - -const char* readModelBin(const char* filename, uint8_t* buffer, uint32_t size, - uint8_t* version); - -const char* writeModelBin(); diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 1ef9d4c61..e601f96f7 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -25,7 +25,6 @@ #include "edgetx_helpers.h" #include "storage.h" #include "sdcard_common.h" -#include "sdcard_raw.h" #include "sdcard_yaml.h" #include "modelslist.h" @@ -34,12 +33,6 @@ #include "yaml/yaml_datastructs.h" #include "yaml/yaml_bits.h" - -#if defined(EEPROM_RLC) - #include "storage/eeprom_common.h" - #include "storage/eeprom_rlc.h" -#endif - const char * readYamlFile(const char* fullpath, const YamlParserCalls* calls, void* parser_ctx, ChecksumResult* checksum_result) { FIL file; diff --git a/radio/src/storage/storage.h b/radio/src/storage/storage.h index a341ea5fa..60d3e8892 100644 --- a/radio/src/storage/storage.h +++ b/radio/src/storage/storage.h @@ -58,7 +58,6 @@ void storageFlushCurrentModel(); void postRadioSettingsLoad(); void preModelLoad(); void postModelLoad(bool alarms); -void checkExternalAntenna(); #if !defined(STORAGE_MODELSLIST) extern ModelHeader modelHeaders[MAX_MODELS]; @@ -69,13 +68,7 @@ void loadModelHeaders(); uint8_t findNextUnusedModelId(uint8_t index, uint8_t module); #endif -#if defined(EEPROM) -#include "eeprom_common.h" -#endif - -#if defined(SDCARD_RAW) || defined(SDCARD_YAML) #include "sdcard_common.h" -#endif #if defined(RTC_BACKUP_RAM) #include "rtc_backup.h" diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index 8c1a44557..89bfc9c0b 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -63,9 +63,7 @@ void preModelLoad() { watchdogSuspend(500/*5s*/); -#if defined(SDCARD) logsClose(); -#endif bool needDelay = false; if (mixerTaskStarted()) { @@ -285,9 +283,7 @@ if(g_model.rssiSource) { pulsesStart(); } -#if defined(SDCARD) referenceModelAudioFiles(); -#endif #if defined(COLORLCD) LayoutFactory::loadCustomScreens(); diff --git a/radio/src/targets/common/arm/stm32/bootloader/bin_files.h b/radio/src/targets/common/arm/stm32/bootloader/bin_files.h index f7a8d1b04..2c9574eea 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/bin_files.h +++ b/radio/src/targets/common/arm/stm32/bootloader/bin_files.h @@ -32,11 +32,7 @@ enum MemoryType { MEM_EEPROM }; -#if defined(EEPROM) -#define getBinaryPath(mt) ((mt == MEM_FLASH) ? FIRMWARES_PATH : EEPROMS_PATH) -#else #define getBinaryPath(mt) (FIRMWARES_PATH) -#endif #if LCD_H == 480 #define MAX_NAMES_ON_SCREEN 13 diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index ce257c79e..32638e45e 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -48,7 +48,7 @@ #include "thirdparty/Segger_RTT/RTT/SEGGER_RTT.h" #endif -#if defined(EEPROM) || defined(SPI_FLASH) +#if defined(SPI_FLASH) #define MAIN_MENU_LEN 3 #else #define MAIN_MENU_LEN 2 @@ -79,11 +79,6 @@ uint32_t firmwareSize; uint32_t firmwareAddress = FIRMWARE_ADDRESS; uint32_t firmwareWritten = 0; -#if defined(EEPROM) -uint32_t eepromAddress = 0; -uint32_t eepromWritten = 0; -#endif - FlashCheckRes valid; MemoryType memoryType; uint32_t unlocked = 0; @@ -112,14 +107,7 @@ void per10ms() uint32_t isValidBufferStart(const uint8_t * buffer) { #if !defined(SIMU) -#if defined(EEPROM) - if (memoryType == MEM_FLASH) - return isFirmwareStart(buffer); - else - return isEepromStart(buffer); -#else return isFirmwareStart(buffer); -#endif #else return 1; #endif @@ -182,14 +170,6 @@ void flashWriteBlock() #endif // SIMU } -#if defined(EEPROM) -void writeEepromBlock() -{ - eepromWriteBlock(Block_buffer, eepromAddress, BlockCount); - eepromAddress += BlockCount; -} -#endif - #if !defined(SIMU) typedef void (*fctptr_t)(void); @@ -249,17 +229,13 @@ void bootloaderInitApp() TRACE("\nBootloader started :)"); - // TODO: move BT & EEPROM into board specifics + // TODO: move BT into board specifics #if defined(BLUETOOTH) // we shutdown the bluetooth module now to be sure it will be detected on // firmware start bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE, false); #endif -#if defined(EEPROM) && defined(EEPROM_RLC) - eepromInit(); -#endif - timersInit(); // SD card detect pin @@ -346,12 +322,7 @@ int bootloaderMain() memoryType = MEM_FLASH; state = ST_DIR_CHECK; break; -#if defined(EEPROM) - case 1: - memoryType = MEM_EEPROM; - state = ST_DIR_CHECK; - break; -#elif defined(SPI_FLASH) +#if defined(SPI_FLASH) case 1: state = ST_CLEAR_FLASH_CHECK; break; @@ -454,12 +425,6 @@ int bootloaderMain() firmwareAddress = APP_START_ADDRESS; firmwareWritten = 0; } -#if defined(EEPROM) - else { - eepromAddress = 0; - eepromWritten = 0; - } -#endif state = ST_FLASHING; } } @@ -476,13 +441,6 @@ int bootloaderMain() firmwareWritten += sizeof(Block_buffer); progress = (100 * firmwareWritten) / firmwareSize; } -#if defined(EEPROM) - else { - writeEepromBlock(); - eepromWritten += sizeof(Block_buffer); - progress = (100 * eepromWritten) / EEPROM_SIZE; - } -#endif bootloaderDrawScreen(state, progress); @@ -493,11 +451,6 @@ int bootloaderMain() else if (memoryType == MEM_FLASH && firmwareWritten >= FIRMWARE_MAX_LEN) { state = ST_FLASH_DONE; // Backstop } -#if defined(EEPROM) - else if (memoryType == MEM_EEPROM && eepromWritten >= EEPROM_SIZE) { - state = ST_FLASH_DONE; // Backstop - } -#endif #if defined(SPI_FLASH) } else if (state == ST_CLEAR_FLASH_CHECK) { bootloaderDrawScreen(state, vpos); diff --git a/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp b/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp index d7214fe40..458499664 100644 --- a/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp +++ b/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp @@ -152,11 +152,7 @@ int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_ #if defined(FWDRIVE) if (lun == STORAGE_EEPROM_LUN) { *block_size = BLOCK_SIZE; - #if defined(EEPROM) - *block_num = RESERVED_SECTORS + EEPROM_SIZE/BLOCK_SIZE + FLASHSIZE/BLOCK_SIZE; - #else *block_num = RESERVED_SECTORS + FLASHSIZE/BLOCK_SIZE; - #endif return 0; } #endif @@ -196,11 +192,6 @@ void usbInitLUNs() */ int8_t STORAGE_IsReady_FS(uint8_t lun) { -#if defined(FWDRIVE) && defined(EEPROM) - if (lun == STORAGE_EEPROM_LUN) { - return (lunReady[STORAGE_EEPROM_LUN] != 0) ? 0 : -1; - } -#endif return (lunReady[STORAGE_SDCARD_LUN] != 0 && storageIsPresent()) ? USBD_OK : USBD_FAIL; } @@ -300,11 +291,7 @@ const char firmware_txt[] = /** * FAT12 boot sector partition. */ - #if defined(EEPROM) - #define TOTALSECTORS (RESERVED_SECTORS + (EEPROM_SIZE/BLOCK_SIZE) + (FLASHSIZE/BLOCK_SIZE)) - #else - #define TOTALSECTORS (RESERVED_SECTORS + (FLASHSIZE/BLOCK_SIZE)) - #endif +#define TOTALSECTORS (RESERVED_SECTORS + (FLASHSIZE/BLOCK_SIZE)) const char g_FATboot[BLOCK_SIZE] = { 0xeb, 0x3c, 0x90, // Jump instruction. @@ -443,23 +430,6 @@ const FATDirEntry_t g_DIRroot[] = 0x0003, FLASHSIZE }, - #if defined(EEPROM) - { - { 'E', 'E', 'P', 'R', 'O', 'M', ' ', ' '}, - { 'B', 'I', 'N'}, - 0x20, // Archive - 0x00, - 0x3E, - 0xA301, - 0x3D55, - 0x3D55, - 0x0000, - 0xA302, - 0x3D55, - 0x0003 + (FLASHSIZE/BLOCK_SIZE)/8, - EEPROM_SIZE - }, - #endif // Emty entries are 0x00, omitted here. Up to 16 entries can be defined here }; @@ -511,13 +481,6 @@ int32_t fat12Read(uint8_t * buffer, uint16_t sector, uint16_t count) pushCluster (buffer, sector, cluster, rest, cluster+1); pushCluster (buffer, sector, cluster, rest, (uint16_t) 0xFFF); - #if defined(EEPROM) - // Entry for eeprom.bin - for (int i=0;i= (EEPROM_SIZE/BLOCK_SIZE)+(FLASHSIZE/BLOCK_SIZE)) { - TRACE("EEPROM end written at sector %d", sector-1); - operation = FATWRITE_NONE; - } - } - } - #endif return 0 ; } #endif diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 9db01414a..f5ee74652 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -12,7 +12,6 @@ option(MODULE_SIZE_STD "Standard size TX Module" ON) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F4) set(HSE_VALUE 12000000) -set(SDCARD YES) set(STORAGE_MODELSLIST YES) set(HAPTIC YES) set(GUI_DIR colorlcd) @@ -174,7 +173,7 @@ set(RADIO_DEPENDENCIES ) add_definitions(-DPCBHORUS -DSTM32F429_439xx -DSTM32F429xx -DSDRAM -DCCMRAM -DCOLORLCD -DHARDWARE_KEYS) -add_definitions(-DEEPROM_VARIANT=0 -DAUDIO -DVOICE -DRTCLOCK) +add_definitions(-DAUDIO -DVOICE -DRTCLOCK) add_definitions(-DGPS_USART_BAUDRATE=${INTERNAL_GPS_BAUDRATE}) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) add_definitions(-DSTM32_SUPPORT_32BIT_TIMERS) diff --git a/radio/src/targets/nv14/CMakeLists.txt b/radio/src/targets/nv14/CMakeLists.txt index 642e872a9..d68e85e5a 100644 --- a/radio/src/targets/nv14/CMakeLists.txt +++ b/radio/src/targets/nv14/CMakeLists.txt @@ -10,7 +10,6 @@ option(MODULE_SIZE_STD "Standard size TX Module" ON) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F4) set(HSE_VALUE 12000000) -set(SDCARD YES) set(STORAGE_MODELSLIST YES) set(HAPTIC YES) set(GUI_DIR colorlcd) diff --git a/radio/src/targets/pl18/CMakeLists.txt b/radio/src/targets/pl18/CMakeLists.txt index b6707c87b..9d4393ad9 100644 --- a/radio/src/targets/pl18/CMakeLists.txt +++ b/radio/src/targets/pl18/CMakeLists.txt @@ -9,7 +9,6 @@ option(MODULE_SIZE_STD "Standard size TX Module" ON) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F4) set(HSE_VALUE 12000000) -set(SDCARD YES) set(STORAGE_MODELSLIST YES) set(HAPTIC YES) set(GUI_DIR colorlcd) diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index 8fb272233..e18aebdbf 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -72,7 +72,7 @@ void simuMain(); #define configure_pins(...) -#if defined(SDCARD) && !defined(SKIP_FATFS_DECLARATION) && !defined(SIMU_DISKIO) +#if !defined(SKIP_FATFS_DECLARATION) && !defined(SIMU_DISKIO) #define SIMU_USE_SDCARD #endif diff --git a/radio/src/targets/simu/simufatfs.cpp b/radio/src/targets/simu/simufatfs.cpp index 6a946168a..20ee4933f 100644 --- a/radio/src/targets/simu/simufatfs.cpp +++ b/radio/src/targets/simu/simufatfs.cpp @@ -124,20 +124,12 @@ bool redirectToSettingsDirectory(const std::string & path) * model (*.bin) files in /MODELS directory */ if (!simuSettingsDirectory.empty()) { -#if defined(SDCARD_RAW) || defined(SDCARD_YAML) if (path == MODELS_PATH || path == RADIO_PATH) return true; - #if !defined(EEPROM_RLC) - if (path == RADIO_MODELSLIST_PATH || path == RADIO_SETTINGS_PATH) - return true; if (startsWith(path, MODELS_PATH) && endsWith(path, MODELS_EXT)) return true; - #endif -#endif -#if defined(SDCARD_YAML) if (path == MODELSLIST_YAML_PATH || path == RADIO_SETTINGS_YAML_PATH || path == RADIO_SETTINGS_TMPFILE_YAML_PATH || path == RADIO_SETTINGS_ERRORFILE_YAML_PATH) return true; if (startsWith(path, MODELS_PATH) && endsWith(path, YAML_EXT)) return true; -#endif } return false; } diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index d0d3006fb..99ee74af2 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -13,7 +13,6 @@ set(HARDWARE_EXTERNAL_MODULE YES) set(TARGET_DIR taranis) set(HSE_VALUE 12000000) -set(SDCARD YES) set(TARGET_DIR taranis) set(PPM_LIMITS_SYMETRICAL YES) @@ -27,7 +26,6 @@ if(PCB STREQUAL X9E) set(HAPTIC YES) set(FLAVOUR x9e) add_definitions(-DPCBX9E -DPCBX9) - add_definitions(-DEEPROM_VARIANT=0x8000) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} @@ -50,7 +48,6 @@ if(PCB STREQUAL X9E) elseif(PCB STREQUAL X9D+) set(HAPTIC YES) add_definitions(-DPCBX9DP -DPCBX9) - add_definitions(-DEEPROM_VARIANT=0) set(GUI_DIR 212x64) set(BITMAPS_DIR 212x64) set(BITMAPS_TARGET taranis_bitmaps) @@ -89,7 +86,6 @@ elseif(PCB STREQUAL X9D) set(CPU_TYPE_FULL STM32F205xE) option(HAPTIC "Haptic support" ON) # While the X9D doesn't have haptic OOTB, it can be added add_definitions(-DPCBX9D -DPCBX9) - add_definitions(-DEEPROM_VARIANT=0) set(GUI_DIR 212x64) set(BITMAPS_DIR 212x64) set(BITMAPS_TARGET taranis_bitmaps) @@ -118,7 +114,6 @@ elseif(PCB STREQUAL X7) set(CPU_TYPE_FULL STM32F205xE) add_definitions(-DRADIO_T12) add_definitions(-DRADIO_FAMILY_JUMPER_T12) - add_definitions(-DEEPROM_VARIANT=0x4001) add_definitions(-DMANUFACTURER_JUMPER) elseif(PCBREV STREQUAL TPRO) set(DEFAULT_INTERNAL_MODULE MULTIMODULE CACHE STRING "Default internal module") @@ -129,7 +124,6 @@ elseif(PCB STREQUAL X7) set(CPU_TYPE_FULL STM32F205xE) add_definitions(-DFUNCTION_SWITCHES) add_definitions(-DRADIO_TPRO) - add_definitions(-DEEPROM_VARIANT=0x4005) add_definitions(-DMANUFACTURER_JUMPER) set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough") elseif(PCBREV STREQUAL TPROV2) @@ -211,7 +205,6 @@ elseif(PCB STREQUAL X7) set(CPU_TYPE_FULL STM32F205xE) add_definitions(-DRADIO_TLITE) add_definitions(-DRADIO_FAMILY_JUMPER_T12) - add_definitions(-DEEPROM_VARIANT=0x4003) add_definitions(-DMANUFACTURER_JUMPER) set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough") elseif(PCBREV STREQUAL TLITEF4) @@ -222,7 +215,6 @@ elseif(PCB STREQUAL X7) set(CPU_TYPE_FULL STM32F407xE) # for size report add_definitions(-DRADIO_TLITE) add_definitions(-DRADIO_FAMILY_JUMPER_T12) - add_definitions(-DEEPROM_VARIANT=0x4003) add_definitions(-DMANUFACTURER_JUMPER) set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough") elseif(PCBREV STREQUAL LR3PRO) @@ -245,7 +237,6 @@ elseif(PCB STREQUAL X7) set(BLUETOOTH NO) set(USB_CHARGER YES) add_definitions(-DRADIO_TX12) - add_definitions(-DEEPROM_VARIANT=0x4002) add_definitions(-DMANUFACTURER_RADIOMASTER) elseif(PCBREV STREQUAL TX12MK2) set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module") @@ -259,7 +250,6 @@ elseif(PCB STREQUAL X7) set(AUX_SERIAL ON) endif() add_definitions(-DRADIO_TX12MK2) - add_definitions(-DEEPROM_VARIANT=0x4008) add_definitions(-DMANUFACTURER_RADIOMASTER) set(PXX2 ON) set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough") @@ -306,7 +296,6 @@ elseif(PCB STREQUAL X7) set(ROTARY_ENCODER YES) set(USB_CHARGER YES) add_definitions(-DRADIO_ZORRO) - add_definitions(-DEEPROM_VARIANT=0x4006) add_definitions(-DMANUFACTURER_RADIOMASTER) set(PXX2 ON) set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough") @@ -340,7 +329,6 @@ elseif(PCB STREQUAL X7) set(BIND_KEY YES) endif() add_definitions(-DRADIO_T8) - add_definitions(-DEEPROM_VARIANT=0x4004) add_definitions(-DMANUFACTURER_RADIOMASTER) elseif(PCBREV STREQUAL COMMANDO8) set(DEFAULT_INTERNAL_MODULE MULTIMODULE CACHE STRING "Default internal module") @@ -362,7 +350,6 @@ elseif(PCB STREQUAL X7) set(FLAVOUR x7access) set(CPU_TYPE_FULL STM32F407xE) add_definitions(-DRADIO_X7ACCESS) - add_definitions(-DEEPROM_VARIANT=0x4000) add_definitions(-DPCBREV=${PCBREV}) add_definitions(-DPCBX7ACCESS) add_definitions(-DHARDWARE_POWER_MANAGEMENT_UNIT) @@ -376,7 +363,6 @@ elseif(PCB STREQUAL X7) set(FLAVOUR x7) set(CPU_TYPE_FULL STM32F205xE) add_definitions(-DRADIO_X7) - add_definitions(-DEEPROM_VARIANT=0x4000) set(BLUETOOTH YES) add_definitions(-DBLUETOOTH_PROBE) set(ROTARY_ENCODER YES) @@ -402,7 +388,6 @@ elseif(PCB STREQUAL X9LITE) set(FLAVOUR x9lite) add_definitions(-DBOARD_NAME="x9lite") add_definitions(-DPCBX9LITE -DPCBX9 -DSOFTWARE_VOLUME -DHARDWARE_POWER_MANAGEMENT_UNIT) - add_definitions(-DEEPROM_VARIANT=0x0800) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(PXX2 ON) set(GUI_DIR 128x64) @@ -424,7 +409,6 @@ elseif(PCB STREQUAL X9LITES) set(FLAVOUR x9lites) add_definitions(-DBOARD_NAME="x9lites") add_definitions(-DPCBX9LITES -DPCBX9LITE -DPCBX9 -DSOFTWARE_VOLUME -DHARDWARE_POWER_MANAGEMENT_UNIT) - add_definitions(-DEEPROM_VARIANT=0x0801) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(PXX2 ON) set(GUI_DIR 128x64) @@ -446,7 +430,6 @@ elseif(PCB STREQUAL XLITE) set(HAPTIC YES) set(FLAVOUR xlite) add_definitions(-DPCBXLITE -DSOFTWARE_VOLUME) - add_definitions(-DEEPROM_VARIANT=0x2000) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(PXX2 ON) set(GUI_DIR 128x64) @@ -467,7 +450,6 @@ elseif(PCB STREQUAL XLITES) set(HAPTIC YES) set(FLAVOUR xlites) add_definitions(-DPCBXLITES -DPCBXLITE -DSOFTWARE_VOLUME -DHARDWARE_POWER_MANAGEMENT_UNIT) - add_definitions(-DEEPROM_VARIANT=0x1000) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(GUI_DIR 128x64) set(BITMAPS_DIR 128x64) @@ -572,7 +554,6 @@ set(BOOTLOADER_SRC ${BOOTLOADER_SRC} $) add_library(board OBJECT EXCLUDE_FROM_ALL ${BOARD_COMMON_SRC} ${TARGET_SRC_DIR}/volume_i2c.cpp - ${TARGET_SRC_DIR}/eeprom_driver.cpp targets/common/arm/stm32/audio_dac_driver.cpp targets/common/arm/stm32/delays_driver.cpp targets/common/arm/stm32/heartbeat_driver.cpp diff --git a/radio/src/targets/taranis/bootloader/boot_menu.cpp b/radio/src/targets/taranis/bootloader/boot_menu.cpp index f6c1b8896..d41363beb 100644 --- a/radio/src/targets/taranis/bootloader/boot_menu.cpp +++ b/radio/src/targets/taranis/bootloader/boot_menu.cpp @@ -77,12 +77,7 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) if (st == ST_START) { lcdDrawText(3*FW, 2*FH, TR_BL_WRITE_FW, opt == 0 ? INVERS : 0); -#if defined(EEPROM) - lcdDrawText(3*FW, 3*FH, TR_BL_RESTORE_EEPROM, opt == 1 ? INVERS : 0); - lcdDrawText(3*FW, 4*FH, TR_BL_EXIT, opt == 2 ? INVERS : 0); -#else lcdDrawText(3*FW, 3*FH, TR_BL_EXIT, opt == 1 ? INVERS : 0); -#endif lcdDrawText(LCD_W / 2, 5 * FH + FH / 2, TR_BL_OR_PLUGIN_USB_CABLE, CENTERED); diff --git a/radio/src/tests/CMakeLists.txt b/radio/src/tests/CMakeLists.txt index 14cb7eb9a..f0e9cd785 100644 --- a/radio/src/tests/CMakeLists.txt +++ b/radio/src/tests/CMakeLists.txt @@ -15,24 +15,6 @@ if(Qt5Widgets_FOUND) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_DEBUG} -O0 -fsanitize=address") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${WARNING_FLAGS} -fsanitize=address") - if(PCB STREQUAL X12S OR PCB STREQUAL X10) - - set(EXTRACT_MODEL_FILES model_23_x12s model_23_x10 model_25_tx16s) - - foreach(model_file ${EXTRACT_MODEL_FILES}) - add_custom_command( - DEPENDS ${TESTS_PATH}/${model_file}.otx - OUTPUT ${TESTS_BUILD_PATH}/${model_file}/RADIO/radio.bin - COMMAND mkdir -p ${model_file} && cd ${model_file} && unzip -o -q -DD ${TESTS_PATH}/${model_file}.otx >/dev/null - WORKING_DIRECTORY ${TESTS_BUILD_PATH} - ) - add_custom_target(${model_file}_files - DEPENDS ${TESTS_BUILD_PATH}/${model_file}/RADIO/radio.bin - ) - set(HORUS_MODEL_FILES ${HORUS_MODEL_FILES} ${model_file}_files) - endforeach() - endif() - if(WIN32) target_include_directories(gtests-radio-lib PUBLIC ${WIN_INCLUDE_DIRS}) target_link_libraries(gtests-radio-lib PRIVATE ${WIN_LINK_LIBRARIES}) @@ -63,9 +45,6 @@ if(Qt5Widgets_FOUND) target_compile_options(gtests-radio PRIVATE ${SIMU_SRC_OPTIONS}) add_dependencies(gtests-radio gtests-radio-lib) - if(PCB STREQUAL X12S OR PCB STREQUAL X10) - add_dependencies(gtests-radio ${HORUS_MODEL_FILES}) - endif() target_link_libraries(gtests-radio gtests-radio-lib pthread Qt5::Core Qt5::Widgets) message(STATUS "Added optional gtests target") endif() diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp deleted file mode 100644 index b1a5a3e2c..000000000 --- a/radio/src/tests/conversions.cpp +++ /dev/null @@ -1,550 +0,0 @@ -/* - * 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 "gtests.h" -#include "location.h" - -// TODO: Remove this file, and the eeprom_*.bin and model_*.otx files. - -#if 0 - -#if defined(SDCARD_YAML) -#include -#endif - -#if defined(PCBX9DP) -TEST(Conversions, ConversionX9DPFrom23) -{ -#if defined(SDCARD_YAML) - simuFatfsSetPaths(TESTS_BUILD_PATH "/", TESTS_BUILD_PATH "/"); - sdCheckAndCreateDirectory(RADIO_PATH); - sdCheckAndCreateDirectory(MODELS_PATH); -#endif - - loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+.bin"); - eepromOpen(); -#if defined(EEPROM) - eeLoadGeneralSettingsData(); - convertRadioData_219_to_220(g_eeGeneral); -#else - convertRadioData_219_to_220(); - convertRadioData_220_to_221(); - EXPECT_EQ(nullptr, loadRadioSettings()); -#endif - eeConvertModel(0, 219); - loadModel((uint8_t)0); - - EXPECT_EQ(-30, g_eeGeneral.vBatMin); - EXPECT_EQ(8, g_eeGeneral.speakerVolume); - EXPECT_EQ('e', g_eeGeneral.ttsLanguage[0]); - EXPECT_EQ('n', g_eeGeneral.ttsLanguage[1]); - - EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); - EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); - EXPECT_EQ(20, g_eeGeneral.customFn[0].all.val); - - EXPECT_STRNEQ("Tes", g_eeGeneral.switchNames[0]); // ZSTREQ - EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); - - swarnstate_t state = - (0x01) | // SA up - (0x03 << (3 * 1)) | // SB down - (0x02 << (3 * 2)) | // SC middle - (0x01 << (3 * 3)) | // SD up - (0x02 << (3 * 4)) | // SE middle - (0x03 << (3 * 5)) | // SF down - (0x02 << (3 * 6)); // SG middle - - // check only the "allowed switches" - EXPECT_EQ(state, g_model.switchWarning & 0xFFFFF); - - EXPECT_STRNEQ("Test", g_model.header.name); // ZSTREQ - EXPECT_EQ(TMRMODE_ON, g_model.timers[0].mode); // new! - EXPECT_EQ(SWSRC_SA0, g_model.timers[0].swtch); // new! - EXPECT_EQ(80, g_model.mixData[0].weight); - EXPECT_EQ(-100, g_model.limitData[0].max); // 90.0 - EXPECT_EQ(80, g_model.expoData[0].weight); - EXPECT_EQ(10, g_model.flightModeData[0].gvars[0]); - EXPECT_STRNEQ("Tes", g_model.gvars[0].name); // ZSTREQ - EXPECT_STRNEQ("Test", g_model.flightModeData[0].name); // ZSTREQ - - // Please note: we don't wipe the model's module settings - // in case the module is not supported anymore. - // - // #if defined(INTERNAL_MODULE_PXX2) - EXPECT_EQ(MODULE_TYPE_ISRM_PXX2, g_model.moduleData[INTERNAL_MODULE].type); - EXPECT_EQ(MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, g_model.moduleData[INTERNAL_MODULE].subType); - // #else - // EXPECT_EQ(MODULE_TYPE_NONE, g_model.moduleData[INTERNAL_MODULE].type); - // #endif - - EXPECT_EQ(MODULE_TYPE_R9M_PXX1, g_model.moduleData[EXTERNAL_MODULE].type); - EXPECT_EQ(MODULE_SUBTYPE_R9M_FCC, g_model.moduleData[EXTERNAL_MODULE].subType); - - EXPECT_STRNEQ("Rud", g_model.inputNames[0]); // ZSTREQ - EXPECT_STRNEQ("Tes", g_model.telemetrySensors[0].label); // ZSTREQ - EXPECT_EQ(10, g_model.telemetrySensors[0].id); - EXPECT_EQ(10, g_model.telemetrySensors[0].frskyInstance.physID); - EXPECT_EQ(MIXSRC_FIRST_TELEM, g_model.logicalSw[0].v1); - - EXPECT_STRNEQ("abc.wav", g_model.customFn[1].play.name); - -#if defined(SDCARD_YAML) - simuFatfsSetPaths("",""); -#endif -} - -TEST(Conversions, ConversionX9DPFrom23_2) -{ -#if defined(SDCARD_YAML) - simuFatfsSetPaths(TESTS_BUILD_PATH "/", TESTS_BUILD_PATH "/"); - sdCheckAndCreateDirectory(RADIO_PATH); - sdCheckAndCreateDirectory(MODELS_PATH); -#endif - - loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+2.bin"); - - eepromOpen(); -#if defined(EEPROM) - eeLoadGeneralSettingsData(); - convertRadioData_219_to_220(g_eeGeneral); -#else - convertRadioData_219_to_220(); - convertRadioData_220_to_221(); - EXPECT_EQ(nullptr, loadRadioSettings()); -#endif - eeConvertModel(6, 219); - loadModel((uint8_t)6); - - EXPECT_EQ(710, g_eeGeneral.calib[0].spanNeg); - EXPECT_EQ(944, g_eeGeneral.calib[0].mid); - EXPECT_EQ(770, g_eeGeneral.calib[0].spanPos); - - EXPECT_EQ(TMRMODE_ON, g_model.timers[0].mode); // new! - EXPECT_EQ(-SWSRC_SA0, g_model.timers[0].swtch); // new! - -#if defined(SDCARD_YAML) - simuFatfsSetPaths("",""); -#endif -} -#endif - -#if defined(PCBXLITE) && !defined(PCBXLITES) -TEST(Conversions, ConversionXLiteFrom23) -{ -#if defined(SDCARD_YAML) - simuFatfsSetPaths(TESTS_BUILD_PATH "/", TESTS_BUILD_PATH "/"); - sdCheckAndCreateDirectory(RADIO_PATH); - sdCheckAndCreateDirectory(MODELS_PATH); -#endif - - loadEEPROMFile(TESTS_PATH "/eeprom_23_xlite.bin"); - - eepromOpen(); -#if defined(EEPROM) - eeLoadGeneralSettingsData(); - convertRadioData_219_to_220(g_eeGeneral); -#else - convertRadioData_219_to_220(); - convertRadioData_220_to_221(); - EXPECT_EQ(nullptr, loadRadioSettings()); -#endif - eeConvertModel(0, 219); - loadModel((uint8_t)0); - - EXPECT_EQ(-30, g_eeGeneral.vBatMin); - EXPECT_EQ(8, g_eeGeneral.speakerVolume); - EXPECT_EQ('e', g_eeGeneral.ttsLanguage[0]); - EXPECT_EQ('n', g_eeGeneral.ttsLanguage[1]); - - EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); - EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); - EXPECT_EQ(20, g_eeGeneral.customFn[0].all.val); - - EXPECT_STRNEQ("Tes", g_eeGeneral.switchNames[0]); - EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); - - EXPECT_STRNEQ("Test", g_model.header.name); - EXPECT_EQ(MODULE_TYPE_R9M_PXX1, g_model.moduleData[EXTERNAL_MODULE].type); - EXPECT_EQ(MODULE_SUBTYPE_R9M_EU, g_model.moduleData[EXTERNAL_MODULE].subType); - EXPECT_EQ(80, g_model.mixData[0].weight); - EXPECT_EQ(80, g_model.expoData[0].weight); - EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.mixData[4].srcRaw); - EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_model.mixData[4].swtch); - EXPECT_EQ(SWASH_TYPE_120X, g_model.swashR.type); - EXPECT_STRNEQ("Thr", g_model.inputNames[0]); - - EXPECT_STRNEQ("Tes", g_model.telemetrySensors[0].label); - EXPECT_EQ(10, g_model.telemetrySensors[0].id); - EXPECT_EQ(8, g_model.telemetrySensors[0].frskyInstance.physID); - EXPECT_EQ(-100, g_model.limitData[0].max); // 90.0 - - EXPECT_EQ(LS_FUNC_VPOS, g_model.logicalSw[0].func); - EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.logicalSw[0].v1); - EXPECT_EQ(0, g_model.logicalSw[0].v2); - - EXPECT_EQ(TELEMETRY_SCREEN_TYPE_VALUES, g_model.screensType & 0x03); - EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.screens[0].lines[0].sources[0]); - EXPECT_EQ(MIXSRC_TIMER3, g_model.screens[0].lines[0].sources[1]); - -#if defined(SDCARD_YAML) - simuFatfsSetPaths("",""); -#endif -} -#endif - -#if defined(RADIO_X7) && (STORAGE_CONVERSIONS <= 219) - -static swarnstate_t get_configured_switch_warn_mask() -{ - swarnstate_t mask = 0; - for (uint8_t i=0; i - -// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' -#ifndef STBIWDEF -#ifdef STB_IMAGE_WRITE_STATIC -#define STBIWDEF static -#else -#ifdef __cplusplus -#define STBIWDEF extern "C" -#else -#define STBIWDEF extern -#endif -#endif -#endif - -#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations -extern int stbi_write_tga_with_rle; -extern int stbi_write_png_compression_level; -extern int stbi_write_force_png_filter; -#endif - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); -STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); -STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); - -#ifdef STBI_WINDOWS_UTF8 -STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); -#endif -#endif - -typedef void stbi_write_func(void *context, void *data, int size); - -STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); -STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); -STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); - -STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); - -#endif//INCLUDE_STB_IMAGE_WRITE_H - -#ifdef STB_IMAGE_WRITE_IMPLEMENTATION - -#ifdef _WIN32 - #ifndef _CRT_SECURE_NO_WARNINGS - #define _CRT_SECURE_NO_WARNINGS - #endif - #ifndef _CRT_NONSTDC_NO_DEPRECATE - #define _CRT_NONSTDC_NO_DEPRECATE - #endif -#endif - -#ifndef STBI_WRITE_NO_STDIO -#include -#endif // STBI_WRITE_NO_STDIO - -#include -#include -#include -#include - -#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) -// ok -#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." -#endif - -#ifndef STBIW_MALLOC -#define STBIW_MALLOC(sz) malloc(sz) -#define STBIW_REALLOC(p,newsz) realloc(p,newsz) -#define STBIW_FREE(p) free(p) -#endif - -#ifndef STBIW_REALLOC_SIZED -#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) -#endif - - -#ifndef STBIW_MEMMOVE -#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) -#endif - - -#ifndef STBIW_ASSERT -#include -#define STBIW_ASSERT(x) assert(x) -#endif - -#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) - -#ifdef STB_IMAGE_WRITE_STATIC -static int stbi_write_png_compression_level = 8; -static int stbi_write_tga_with_rle = 1; -static int stbi_write_force_png_filter = -1; -#else -int stbi_write_png_compression_level = 8; -int stbi_write_tga_with_rle = 1; -int stbi_write_force_png_filter = -1; -#endif - -static int stbi__flip_vertically_on_write = 0; - -STBIWDEF void stbi_flip_vertically_on_write(int flag) -{ - stbi__flip_vertically_on_write = flag; -} - -typedef struct -{ - stbi_write_func *func; - void *context; - unsigned char buffer[64]; - int buf_used; -} stbi__write_context; - -// initialize a callback-based context -static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) -{ - s->func = c; - s->context = context; -} - -#ifndef STBI_WRITE_NO_STDIO - -static void stbi__stdio_write(void *context, void *data, int size) -{ - fwrite(data,1,size,(FILE*) context); -} - -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) -#ifdef __cplusplus -#define STBIW_EXTERN extern "C" -#else -#define STBIW_EXTERN extern -#endif -STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); -STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); - -STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) -{ - return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); -} -#endif - -static FILE *stbiw__fopen(char const *filename, char const *mode) -{ - FILE *f; -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) - wchar_t wMode[64]; - wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename))) - return 0; - - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode))) - return 0; - -#if _MSC_VER >= 1400 - if (0 != _wfopen_s(&f, wFilename, wMode)) - f = 0; -#else - f = _wfopen(wFilename, wMode); -#endif - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f=0; -#else - f = fopen(filename, mode); -#endif - return f; -} - -static int stbi__start_write_file(stbi__write_context *s, const char *filename) -{ - FILE *f = stbiw__fopen(filename, "wb"); - stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); - return f != NULL; -} - -static void stbi__end_write_file(stbi__write_context *s) -{ - fclose((FILE *)s->context); -} - -#endif // !STBI_WRITE_NO_STDIO - -typedef unsigned int stbiw_uint32; -typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; - -static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) -{ - while (*fmt) { - switch (*fmt++) { - case ' ': break; - case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); - s->func(s->context,&x,1); - break; } - case '2': { int x = va_arg(v,int); - unsigned char b[2]; - b[0] = STBIW_UCHAR(x); - b[1] = STBIW_UCHAR(x>>8); - s->func(s->context,b,2); - break; } - case '4': { stbiw_uint32 x = va_arg(v,int); - unsigned char b[4]; - b[0]=STBIW_UCHAR(x); - b[1]=STBIW_UCHAR(x>>8); - b[2]=STBIW_UCHAR(x>>16); - b[3]=STBIW_UCHAR(x>>24); - s->func(s->context,b,4); - break; } - default: - STBIW_ASSERT(0); - return; - } - } -} - -static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) -{ - va_list v; - va_start(v, fmt); - stbiw__writefv(s, fmt, v); - va_end(v); -} - -static void stbiw__write_flush(stbi__write_context *s) -{ - if (s->buf_used) { - s->func(s->context, &s->buffer, s->buf_used); - s->buf_used = 0; - } -} - -static void stbiw__putc(stbi__write_context *s, unsigned char c) -{ - s->func(s->context, &c, 1); -} - -static void stbiw__write1(stbi__write_context *s, unsigned char a) -{ - if (s->buf_used + 1 > sizeof(s->buffer)) - stbiw__write_flush(s); - s->buffer[s->buf_used++] = a; -} - -static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) -{ - int n; - if (s->buf_used + 3 > sizeof(s->buffer)) - stbiw__write_flush(s); - n = s->buf_used; - s->buf_used = n+3; - s->buffer[n+0] = a; - s->buffer[n+1] = b; - s->buffer[n+2] = c; -} - -static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) -{ - unsigned char bg[3] = { 255, 0, 255}, px[3]; - int k; - - if (write_alpha < 0) - stbiw__write1(s, d[comp - 1]); - - switch (comp) { - case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case - case 1: - if (expand_mono) - stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp - else - stbiw__write1(s, d[0]); // monochrome TGA - break; - case 4: - if (!write_alpha) { - // composite against pink background - for (k = 0; k < 3; ++k) - px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; - stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); - break; - } - /* FALLTHROUGH */ - case 3: - stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); - break; - } - if (write_alpha > 0) - stbiw__write1(s, d[comp - 1]); -} - -static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) -{ - stbiw_uint32 zero = 0; - int i,j, j_end; - - if (y <= 0) - return; - - if (stbi__flip_vertically_on_write) - vdir *= -1; - - if (vdir < 0) { - j_end = -1; j = y-1; - } else { - j_end = y; j = 0; - } - - for (; j != j_end; j += vdir) { - for (i=0; i < x; ++i) { - unsigned char *d = (unsigned char *) data + (j*x+i)*comp; - stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); - } - stbiw__write_flush(s); - s->func(s->context, &zero, scanline_pad); - } -} - -static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) -{ - if (y < 0 || x < 0) { - return 0; - } else { - va_list v; - va_start(v, fmt); - stbiw__writefv(s, fmt, v); - va_end(v); - stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); - return 1; - } -} - -static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) -{ - int pad = (-x*3) & 3; - return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, - "11 4 22 4" "4 44 22 444444", - 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header - 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header -} - -STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) -{ - stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_bmp_core(&s, x, y, comp, data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) -{ - stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_bmp_core(&s, x, y, comp, data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif //!STBI_WRITE_NO_STDIO - -static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) -{ - int has_alpha = (comp == 2 || comp == 4); - int colorbytes = has_alpha ? comp-1 : comp; - int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 - - if (y < 0 || x < 0) - return 0; - - if (!stbi_write_tga_with_rle) { - return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, - "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); - } else { - int i,j,k; - int jend, jdir; - - stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); - - if (stbi__flip_vertically_on_write) { - j = 0; - jend = y; - jdir = 1; - } else { - j = y-1; - jend = -1; - jdir = -1; - } - for (; j != jend; j += jdir) { - unsigned char *row = (unsigned char *) data + j * x * comp; - int len; - - for (i = 0; i < x; i += len) { - unsigned char *begin = row + i * comp; - int diff = 1; - len = 1; - - if (i < x - 1) { - ++len; - diff = memcmp(begin, row + (i + 1) * comp, comp); - if (diff) { - const unsigned char *prev = begin; - for (k = i + 2; k < x && len < 128; ++k) { - if (memcmp(prev, row + k * comp, comp)) { - prev += comp; - ++len; - } else { - --len; - break; - } - } - } else { - for (k = i + 2; k < x && len < 128; ++k) { - if (!memcmp(begin, row + k * comp, comp)) { - ++len; - } else { - break; - } - } - } - } - - if (diff) { - unsigned char header = STBIW_UCHAR(len - 1); - stbiw__write1(s, header); - for (k = 0; k < len; ++k) { - stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); - } - } else { - unsigned char header = STBIW_UCHAR(len - 129); - stbiw__write1(s, header); - stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); - } - } - } - stbiw__write_flush(s); - } - return 1; -} - -STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) -{ - stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_tga_core(&s, x, y, comp, (void *) data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) -{ - stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR writer -// by Baldur Karlsson - -#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) - -static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) -{ - int exponent; - float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); - - if (maxcomp < 1e-32f) { - rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; - } else { - float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; - - rgbe[0] = (unsigned char)(linear[0] * normalize); - rgbe[1] = (unsigned char)(linear[1] * normalize); - rgbe[2] = (unsigned char)(linear[2] * normalize); - rgbe[3] = (unsigned char)(exponent + 128); - } -} - -static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) -{ - unsigned char lengthbyte = STBIW_UCHAR(length+128); - STBIW_ASSERT(length+128 <= 255); - s->func(s->context, &lengthbyte, 1); - s->func(s->context, &databyte, 1); -} - -static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) -{ - unsigned char lengthbyte = STBIW_UCHAR(length); - STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code - s->func(s->context, &lengthbyte, 1); - s->func(s->context, data, length); -} - -static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) -{ - unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; - unsigned char rgbe[4]; - float linear[3]; - int x; - - scanlineheader[2] = (width&0xff00)>>8; - scanlineheader[3] = (width&0x00ff); - - /* skip RLE for images too small or large */ - if (width < 8 || width >= 32768) { - for (x=0; x < width; x++) { - switch (ncomp) { - case 4: /* fallthrough */ - case 3: linear[2] = scanline[x*ncomp + 2]; - linear[1] = scanline[x*ncomp + 1]; - linear[0] = scanline[x*ncomp + 0]; - break; - default: - linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; - break; - } - stbiw__linear_to_rgbe(rgbe, linear); - s->func(s->context, rgbe, 4); - } - } else { - int c,r; - /* encode into scratch buffer */ - for (x=0; x < width; x++) { - switch(ncomp) { - case 4: /* fallthrough */ - case 3: linear[2] = scanline[x*ncomp + 2]; - linear[1] = scanline[x*ncomp + 1]; - linear[0] = scanline[x*ncomp + 0]; - break; - default: - linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; - break; - } - stbiw__linear_to_rgbe(rgbe, linear); - scratch[x + width*0] = rgbe[0]; - scratch[x + width*1] = rgbe[1]; - scratch[x + width*2] = rgbe[2]; - scratch[x + width*3] = rgbe[3]; - } - - s->func(s->context, scanlineheader, 4); - - /* RLE each component separately */ - for (c=0; c < 4; c++) { - unsigned char *comp = &scratch[width*c]; - - x = 0; - while (x < width) { - // find first run - r = x; - while (r+2 < width) { - if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) - break; - ++r; - } - if (r+2 >= width) - r = width; - // dump up to first run - while (x < r) { - int len = r-x; - if (len > 128) len = 128; - stbiw__write_dump_data(s, len, &comp[x]); - x += len; - } - // if there's a run, output it - if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd - // find next byte after run - while (r < width && comp[r] == comp[x]) - ++r; - // output run up to r - while (x < r) { - int len = r-x; - if (len > 127) len = 127; - stbiw__write_run_data(s, len, comp[x]); - x += len; - } - } - } - } - } -} - -static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) -{ - if (y <= 0 || x <= 0 || data == NULL) - return 0; - else { - // Each component is stored separately. Allocate scratch space for full output scanline. - unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); - int i, len; - char buffer[128]; - char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; - s->func(s->context, header, sizeof(header)-1); - -#ifdef __STDC_WANT_SECURE_LIB__ - len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); -#else - len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); -#endif - s->func(s->context, buffer, len); - - for(i=0; i < y; i++) - stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); - STBIW_FREE(scratch); - return 1; - } -} - -STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) -{ - stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_hdr_core(&s, x, y, comp, (float *) data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) -{ - stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif // STBI_WRITE_NO_STDIO - - -////////////////////////////////////////////////////////////////////////////// -// -// PNG writer -// - -#ifndef STBIW_ZLIB_COMPRESS -// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() -#define stbiw__sbraw(a) ((int *) (void *) (a) - 2) -#define stbiw__sbm(a) stbiw__sbraw(a)[0] -#define stbiw__sbn(a) stbiw__sbraw(a)[1] - -#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) -#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) -#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) - -#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) -#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) -#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) - -static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) -{ - int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; - void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); - STBIW_ASSERT(p); - if (p) { - if (!*arr) ((int *) p)[1] = 0; - *arr = (void *) ((int *) p + 2); - stbiw__sbm(*arr) = m; - } - return *arr; -} - -static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) -{ - while (*bitcount >= 8) { - stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); - *bitbuffer >>= 8; - *bitcount -= 8; - } - return data; -} - -static int stbiw__zlib_bitrev(int code, int codebits) -{ - int res=0; - while (codebits--) { - res = (res << 1) | (code & 1); - code >>= 1; - } - return res; -} - -static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) -{ - int i; - for (i=0; i < limit && i < 258; ++i) - if (a[i] != b[i]) break; - return i; -} - -static unsigned int stbiw__zhash(unsigned char *data) -{ - stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); - hash ^= hash << 3; - hash += hash >> 5; - hash ^= hash << 4; - hash += hash >> 17; - hash ^= hash << 25; - hash += hash >> 6; - return hash; -} - -#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) -#define stbiw__zlib_add(code,codebits) \ - (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) -#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) -// default huffman tables -#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) -#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) -#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) -#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) -#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) -#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) - -#define stbiw__ZHASH 16384 - -#endif // STBIW_ZLIB_COMPRESS - -STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) -{ -#ifdef STBIW_ZLIB_COMPRESS - // user provided a zlib compress implementation, use that - return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); -#else // use builtin - static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; - static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; - static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; - static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; - unsigned int bitbuf=0; - int i,j, bitcount=0; - unsigned char *out = NULL; - unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**)); - if (hash_table == NULL) - return NULL; - if (quality < 5) quality = 5; - - stbiw__sbpush(out, 0x78); // DEFLATE 32K window - stbiw__sbpush(out, 0x5e); // FLEVEL = 1 - stbiw__zlib_add(1,1); // BFINAL = 1 - stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman - - for (i=0; i < stbiw__ZHASH; ++i) - hash_table[i] = NULL; - - i=0; - while (i < data_len-3) { - // hash next 3 bytes of data to be compressed - int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; - unsigned char *bestloc = 0; - unsigned char **hlist = hash_table[h]; - int n = stbiw__sbcount(hlist); - for (j=0; j < n; ++j) { - if (hlist[j]-data > i-32768) { // if entry lies within window - int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); - if (d >= best) { best=d; bestloc=hlist[j]; } - } - } - // when hash table entry is too long, delete half the entries - if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { - STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); - stbiw__sbn(hash_table[h]) = quality; - } - stbiw__sbpush(hash_table[h],data+i); - - if (bestloc) { - // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal - h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); - hlist = hash_table[h]; - n = stbiw__sbcount(hlist); - for (j=0; j < n; ++j) { - if (hlist[j]-data > i-32767) { - int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); - if (e > best) { // if next match is better, bail on current match - bestloc = NULL; - break; - } - } - } - } - - if (bestloc) { - int d = (int) (data+i - bestloc); // distance back - STBIW_ASSERT(d <= 32767 && best <= 258); - for (j=0; best > lengthc[j+1]-1; ++j); - stbiw__zlib_huff(j+257); - if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); - for (j=0; d > distc[j+1]-1; ++j); - stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); - if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); - i += best; - } else { - stbiw__zlib_huffb(data[i]); - ++i; - } - } - // write out final bytes - for (;i < data_len; ++i) - stbiw__zlib_huffb(data[i]); - stbiw__zlib_huff(256); // end of block - // pad with 0 bits to byte boundary - while (bitcount) - stbiw__zlib_add(0,1); - - for (i=0; i < stbiw__ZHASH; ++i) - (void) stbiw__sbfree(hash_table[i]); - STBIW_FREE(hash_table); - - { - // compute adler32 on input - unsigned int s1=1, s2=0; - int blocklen = (int) (data_len % 5552); - j=0; - while (j < data_len) { - for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; } - s1 %= 65521; s2 %= 65521; - j += blocklen; - blocklen = 5552; - } - stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); - stbiw__sbpush(out, STBIW_UCHAR(s2)); - stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); - stbiw__sbpush(out, STBIW_UCHAR(s1)); - } - *out_len = stbiw__sbn(out); - // make returned pointer freeable - STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); - return (unsigned char *) stbiw__sbraw(out); -#endif // STBIW_ZLIB_COMPRESS -} - -static unsigned int stbiw__crc32(unsigned char *buffer, int len) -{ -#ifdef STBIW_CRC32 - return STBIW_CRC32(buffer, len); -#else - static unsigned int crc_table[256] = - { - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D - }; - - unsigned int crc = ~0u; - int i; - for (i=0; i < len; ++i) - crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; - return ~crc; -#endif -} - -#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) -#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); -#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) - -static void stbiw__wpcrc(unsigned char **data, int len) -{ - unsigned int crc = stbiw__crc32(*data - len - 4, len+4); - stbiw__wp32(*data, crc); -} - -static unsigned char stbiw__paeth(int a, int b, int c) -{ - int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); - if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); - if (pb <= pc) return STBIW_UCHAR(b); - return STBIW_UCHAR(c); -} - -// @OPTIMIZE: provide an option that always forces left-predict or paeth predict -static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) -{ - static int mapping[] = { 0,1,2,3,4 }; - static int firstmap[] = { 0,1,0,5,6 }; - int *mymap = (y != 0) ? mapping : firstmap; - int i; - int type = mymap[filter_type]; - unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); - int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; - - if (type==0) { - memcpy(line_buffer, z, width*n); - return; - } - - // first loop isn't optimized since it's just one pixel - for (i = 0; i < n; ++i) { - switch (type) { - case 1: line_buffer[i] = z[i]; break; - case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; - case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; - case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; - case 5: line_buffer[i] = z[i]; break; - case 6: line_buffer[i] = z[i]; break; - } - } - switch (type) { - case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; - case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; - case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; - case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; - case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; - case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; - } -} - -STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) -{ - int force_filter = stbi_write_force_png_filter; - int ctype[5] = { -1, 0, 4, 2, 6 }; - unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; - unsigned char *out,*o, *filt, *zlib; - signed char *line_buffer; - int j,zlen; - - if (stride_bytes == 0) - stride_bytes = x * n; - - if (force_filter >= 5) { - force_filter = -1; - } - - filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; - line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } - for (j=0; j < y; ++j) { - int filter_type; - if (force_filter > -1) { - filter_type = force_filter; - stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); - } else { // Estimate the best filter by running through all of them: - int best_filter = 0, best_filter_val = 0x7fffffff, est, i; - for (filter_type = 0; filter_type < 5; filter_type++) { - stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); - - // Estimate the entropy of the line using this filter; the less, the better. - est = 0; - for (i = 0; i < x*n; ++i) { - est += abs((signed char) line_buffer[i]); - } - if (est < best_filter_val) { - best_filter_val = est; - best_filter = filter_type; - } - } - if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it - stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); - filter_type = best_filter; - } - } - // when we get here, filter_type contains the filter type, and line_buffer contains the data - filt[j*(x*n+1)] = (unsigned char) filter_type; - STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); - } - STBIW_FREE(line_buffer); - zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); - STBIW_FREE(filt); - if (!zlib) return 0; - - // each tag requires 12 bytes of overhead - out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); - if (!out) return 0; - *out_len = 8 + 12+13 + 12+zlen + 12; - - o=out; - STBIW_MEMMOVE(o,sig,8); o+= 8; - stbiw__wp32(o, 13); // header length - stbiw__wptag(o, "IHDR"); - stbiw__wp32(o, x); - stbiw__wp32(o, y); - *o++ = 8; - *o++ = STBIW_UCHAR(ctype[n]); - *o++ = 0; - *o++ = 0; - *o++ = 0; - stbiw__wpcrc(&o,13); - - stbiw__wp32(o, zlen); - stbiw__wptag(o, "IDAT"); - STBIW_MEMMOVE(o, zlib, zlen); - o += zlen; - STBIW_FREE(zlib); - stbiw__wpcrc(&o, zlen); - - stbiw__wp32(o,0); - stbiw__wptag(o, "IEND"); - stbiw__wpcrc(&o,0); - - STBIW_ASSERT(o == out + *out_len); - - return out; -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) -{ - FILE *f; - int len; - unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); - if (png == NULL) return 0; - - f = stbiw__fopen(filename, "wb"); - if (!f) { STBIW_FREE(png); return 0; } - fwrite(png, 1, len, f); - fclose(f); - STBIW_FREE(png); - return 1; -} -#endif - -STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) -{ - int len; - unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); - if (png == NULL) return 0; - func(context, png, len); - STBIW_FREE(png); - return 1; -} - - -/* *************************************************************************** - * - * JPEG writer - * - * This is based on Jon Olick's jo_jpeg.cpp: - * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html - */ - -static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, - 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; - -static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { - int bitBuf = *bitBufP, bitCnt = *bitCntP; - bitCnt += bs[1]; - bitBuf |= bs[0] << (24 - bitCnt); - while(bitCnt >= 8) { - unsigned char c = (bitBuf >> 16) & 255; - stbiw__putc(s, c); - if(c == 255) { - stbiw__putc(s, 0); - } - bitBuf <<= 8; - bitCnt -= 8; - } - *bitBufP = bitBuf; - *bitCntP = bitCnt; -} - -static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { - float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; - float z1, z2, z3, z4, z5, z11, z13; - - float tmp0 = d0 + d7; - float tmp7 = d0 - d7; - float tmp1 = d1 + d6; - float tmp6 = d1 - d6; - float tmp2 = d2 + d5; - float tmp5 = d2 - d5; - float tmp3 = d3 + d4; - float tmp4 = d3 - d4; - - // Even part - float tmp10 = tmp0 + tmp3; // phase 2 - float tmp13 = tmp0 - tmp3; - float tmp11 = tmp1 + tmp2; - float tmp12 = tmp1 - tmp2; - - d0 = tmp10 + tmp11; // phase 3 - d4 = tmp10 - tmp11; - - z1 = (tmp12 + tmp13) * 0.707106781f; // c4 - d2 = tmp13 + z1; // phase 5 - d6 = tmp13 - z1; - - // Odd part - tmp10 = tmp4 + tmp5; // phase 2 - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - // The rotator is modified from fig 4-8 to avoid extra negations. - z5 = (tmp10 - tmp12) * 0.382683433f; // c6 - z2 = tmp10 * 0.541196100f + z5; // c2-c6 - z4 = tmp12 * 1.306562965f + z5; // c2+c6 - z3 = tmp11 * 0.707106781f; // c4 - - z11 = tmp7 + z3; // phase 5 - z13 = tmp7 - z3; - - *d5p = z13 + z2; // phase 6 - *d3p = z13 - z2; - *d1p = z11 + z4; - *d7p = z11 - z4; - - *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; -} - -static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { - int tmp1 = val < 0 ? -val : val; - val = val < 0 ? val-1 : val; - bits[1] = 1; - while(tmp1 >>= 1) { - ++bits[1]; - } - bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { - } - // end0pos = first element in reverse order !=0 - if(end0pos == 0) { - stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); - return DU[0]; - } - for(i = 1; i <= end0pos; ++i) { - int startpos = i; - int nrzeroes; - unsigned short bits[2]; - for (; DU[i]==0 && i<=end0pos; ++i) { - } - nrzeroes = i-startpos; - if ( nrzeroes >= 16 ) { - int lng = nrzeroes>>4; - int nrmarker; - for (nrmarker=1; nrmarker <= lng; ++nrmarker) - stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); - nrzeroes &= 15; - } - stbiw__jpg_calcBits(DU[i], bits); - stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); - stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); - } - if(end0pos != 63) { - stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); - } - return DU[0]; -} - -static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { - // Constants that don't pollute global namespace - static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; - static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; - static const unsigned char std_ac_luminance_values[] = { - 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, - 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, - 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, - 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, - 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, - 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, - 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa - }; - static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; - static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; - static const unsigned char std_ac_chrominance_values[] = { - 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, - 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, - 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, - 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, - 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, - 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, - 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa - }; - // Huffman tables - static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; - static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; - static const unsigned short YAC_HT[256][2] = { - {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} - }; - static const unsigned short UVAC_HT[256][2] = { - {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} - }; - static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, - 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; - static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, - 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; - static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, - 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; - - int row, col, i, k, subsample; - float fdtbl_Y[64], fdtbl_UV[64]; - unsigned char YTable[64], UVTable[64]; - - if(!data || !width || !height || comp > 4 || comp < 1) { - return 0; - } - - quality = quality ? quality : 90; - subsample = quality <= 90 ? 1 : 0; - quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; - quality = quality < 50 ? 5000 / quality : 200 - quality * 2; - - for(i = 0; i < 64; ++i) { - int uvti, yti = (YQT[i]*quality+50)/100; - YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); - uvti = (UVQT[i]*quality+50)/100; - UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); - } - - for(row = 0, k = 0; row < 8; ++row) { - for(col = 0; col < 8; ++col, ++k) { - fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); - fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); - } - } - - // Write Headers - { - static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; - static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; - const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), - 3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; - s->func(s->context, (void*)head0, sizeof(head0)); - s->func(s->context, (void*)YTable, sizeof(YTable)); - stbiw__putc(s, 1); - s->func(s->context, UVTable, sizeof(UVTable)); - s->func(s->context, (void*)head1, sizeof(head1)); - s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); - s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); - stbiw__putc(s, 0x10); // HTYACinfo - s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); - s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); - stbiw__putc(s, 1); // HTUDCinfo - s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); - s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); - stbiw__putc(s, 0x11); // HTUACinfo - s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); - s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); - s->func(s->context, (void*)head2, sizeof(head2)); - } - - // Encode 8x8 macroblocks - { - static const unsigned short fillBits[] = {0x7F, 7}; - int DCY=0, DCU=0, DCV=0; - int bitBuf=0, bitCnt=0; - // comp == 2 is grey+alpha (alpha is ignored) - int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; - const unsigned char *dataR = (const unsigned char *)data; - const unsigned char *dataG = dataR + ofsG; - const unsigned char *dataB = dataR + ofsB; - int x, y, pos; - if(subsample) { - for(y = 0; y < height; y += 16) { - for(x = 0; x < width; x += 16) { - float Y[256], U[256], V[256]; - for(row = y, pos = 0; row < y+16; ++row) { - // row >= height => use last input row - int clamped_row = (row < height) ? row : height - 1; - int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; - for(col = x; col < x+16; ++col, ++pos) { - // if col >= width => use pixel from last input column - int p = base_p + ((col < width) ? col : (width-1))*comp; - float r = dataR[p], g = dataG[p], b = dataB[p]; - Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; - U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; - V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; - } - } - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - - // subsample U,V - { - float subU[64], subV[64]; - int yy, xx; - for(yy = 0, pos = 0; yy < 8; ++yy) { - for(xx = 0; xx < 8; ++xx, ++pos) { - int j = yy*32+xx*2; - subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f; - subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f; - } - } - DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); - } - } - } - } else { - for(y = 0; y < height; y += 8) { - for(x = 0; x < width; x += 8) { - float Y[64], U[64], V[64]; - for(row = y, pos = 0; row < y+8; ++row) { - // row >= height => use last input row - int clamped_row = (row < height) ? row : height - 1; - int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; - for(col = x; col < x+8; ++col, ++pos) { - // if col >= width => use pixel from last input column - int p = base_p + ((col < width) ? col : (width-1))*comp; - float r = dataR[p], g = dataG[p], b = dataB[p]; - Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; - U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; - V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; - } - } - - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); - } - } - } - - // Do the bit alignment of the EOI marker - stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); - } - - // EOI - stbiw__putc(s, 0xFF); - stbiw__putc(s, 0xD9); - - return 1; -} - -STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) -{ - stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); -} - - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) -{ - stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif - -#endif // STB_IMAGE_WRITE_IMPLEMENTATION - -/* Revision history - 1.14 (2020-02-02) updated JPEG writer to downsample chroma channels - 1.13 - 1.12 - 1.11 (2019-08-11) - - 1.10 (2019-02-07) - support utf8 filenames in Windows; fix warnings and platform ifdefs - 1.09 (2018-02-11) - fix typo in zlib quality API, improve STB_I_W_STATIC in C++ - 1.08 (2018-01-29) - add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter - 1.07 (2017-07-24) - doc fix - 1.06 (2017-07-23) - writing JPEG (using Jon Olick's code) - 1.05 ??? - 1.04 (2017-03-03) - monochrome BMP expansion - 1.03 ??? - 1.02 (2016-04-02) - avoid allocating large structures on the stack - 1.01 (2016-01-16) - STBIW_REALLOC_SIZED: support allocators with no realloc support - avoid race-condition in crc initialization - minor compile issues - 1.00 (2015-09-14) - installable file IO function - 0.99 (2015-09-13) - warning fixes; TGA rle support - 0.98 (2015-04-08) - added STBIW_MALLOC, STBIW_ASSERT etc - 0.97 (2015-01-18) - fixed HDR asserts, rewrote HDR rle logic - 0.96 (2015-01-17) - add HDR output - fix monochrome BMP - 0.95 (2014-08-17) - add monochrome TGA output - 0.94 (2014-05-31) - rename private functions to avoid conflicts with stb_image.h - 0.93 (2014-05-27) - warning fixes - 0.92 (2010-08-01) - casts to unsigned char to fix warnings - 0.91 (2010-07-17) - first public release - 0.90 first internal release -*/ - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/radio/src/tests/switches.cpp b/radio/src/tests/switches.cpp index 12cb3f037..b23c533b6 100644 --- a/radio/src/tests/switches.cpp +++ b/radio/src/tests/switches.cpp @@ -114,11 +114,7 @@ TEST(evalLogicalSwitches, playFile) extern BitField<(MAX_LOGICAL_SWITCHES * 2/*on, off*/)> sdAvailableLogicalSwitchAudioFiles; char filename[AUDIO_FILENAME_MAXLEN+1]; -//#if defined(EEPROM) #define MODELNAME TR_MODEL "01" -/*#else -#define MODELNAME "Model00" -#endif*/ sdAvailableLogicalSwitchAudioFiles.setBit(INDEX_LOGICAL_SWITCH_AUDIO_FILE(0,AUDIO_EVENT_OFF)); sdAvailableLogicalSwitchAudioFiles.setBit(INDEX_LOGICAL_SWITCH_AUDIO_FILE(0,AUDIO_EVENT_ON)); diff --git a/radio/src/thirdparty/Lua/src/luaconf.h b/radio/src/thirdparty/Lua/src/luaconf.h index 3c3d74822..d141c1b3d 100644 --- a/radio/src/thirdparty/Lua/src/luaconf.h +++ b/radio/src/thirdparty/Lua/src/luaconf.h @@ -11,9 +11,7 @@ #include #include -#if defined(SDCARD) #define USE_FATFS -#endif // force ANSI mode: lua_number2integer() behaves the same way on all platforms (#3826) #define LUA_ANSI diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 8656b7ef4..6c39ba356 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -858,22 +858,12 @@ const char STR_PITCH_AT_ZERO[] = TR_PITCH_AT_ZERO; const char STR_PITCH_AT_MAX[] = TR_PITCH_AT_MAX; const char STR_REPEAT_AT_ZERO[] = TR_REPEAT_AT_ZERO; -#if defined(EEPROM) -const char STR_BAD_RADIO_DATA[] = TR_BADEEPROMDATA; -const char STR_STORAGE_FORMAT[] = TR_EEPROMFORMATTING; -const char STR_STORAGE_WARNING[] = TR_EEPROMWARN; -const char STR_EEPROMLOWMEM[] = TR_EEPROMLOWMEM; -#else const char STR_BAD_RADIO_DATA[] = TR_BAD_RADIO_DATA; const char STR_STORAGE_WARNING[] = TR_STORAGE_WARNING; const char STR_STORAGE_FORMAT[] = TR_STORAGE_FORMAT; -const char STR_SDCARD_CONVERSION_REQUIRE[] = TR_SDCARD_CONVERSION_REQUIRE; -const char STR_CONVERTING[] = TR_CONVERTING; const char STR_RADIO_DATA_UNRECOVERABLE[] = TR_RADIO_DATA_UNRECOVERABLE; const char STR_RADIO_DATA_RECOVERED[] = TR_RADIO_DATA_RECOVERED; -#endif const char STR_EEPROMOVERFLOW[] = TR_EEPROMOVERFLOW; -const char STR_EEPROM_CONVERTING[] = TR_EEPROM_CONVERTING; #if defined(LUA) const char STR_MENUCUSTOMSCRIPTS[] = TR_MENUCUSTOMSCRIPTS; diff --git a/radio/src/translations.h b/radio/src/translations.h index 18ca6c223..0f51e51a9 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -725,9 +725,6 @@ extern const char STR_EXT_MULTI_SPEC[]; extern const char STR_INT_MULTI_SPEC[]; extern const char STR_WARNING[]; extern const char STR_STORAGE_WARNING[]; -extern const char STR_EEPROM_CONVERTING[]; -extern const char STR_SDCARD_CONVERSION_REQUIRE[]; -extern const char STR_CONVERTING[]; extern const char STR_THROTTLE_UPPERCASE[]; extern const char STR_ALARMSWARN[]; extern const char STR_SWITCHWARN[]; diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 97e7fed12..2109320b5 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -655,11 +655,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "不兼容" #define TR_WARNING "警告" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "存储" -#define TR_EEPROM_CONVERTING "转换数据" -#define TR_SDCARD_CONVERSION_REQUIRE "需要转换SD卡" -#define TR_CONVERTING "转换:" #define TR_THROTTLE_UPPERCASE "油门" #define TR_ALARMSWARN "警告" #define TR_SWITCHWARN TR("开关", "开关位置") diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index abb2ecaeb..98bc8f13b 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -667,11 +667,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Nekompatibilní" #define TR_WARNING "KONTROLA" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "ÚLOŽIŠTĚ" -#define TR_EEPROM_CONVERTING "Aktualizuji EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "SD karta vyžaduje konverzi" -#define TR_CONVERTING "Konverze: " #define TR_THROTTLE_UPPERCASE "PLYNU" #define TR_ALARMSWARN "ALARMU" #define TR_SWITCHWARN "POZICE" diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 5950308da..d3674998d 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -659,11 +659,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Inkompatibel" #define TR_WARNING "ADVARSEL" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "LAGER" -#define TR_EEPROM_CONVERTING "Konverterer EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "SD kort konvertering krævet" -#define TR_CONVERTING "Konvertering: " #define TR_THROTTLE_UPPERCASE "GAS" #define TR_ALARMSWARN "ALARMER" #define TR_SWITCHWARN TR("KONTAKT", "KONTROL") diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 1cf5f7818..3dc4af69e 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -654,11 +654,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Nicht kompatibel" #define TR_WARNING "WARNUNG" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "SPEICHER" -#define TR_EEPROM_CONVERTING "EEPROM Konvertierung" -#define TR_SDCARD_CONVERSION_REQUIRE "SD Karte muss konvertiert werden" -#define TR_CONVERTING "konvertiere: " #define TR_THROTTLE_UPPERCASE "GAS" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "SCHALTER" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 496325938..1683780ce 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -657,11 +657,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Incompatible" #define TR_WARNING "WARNING" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" -#define TR_EEPROM_CONVERTING "Converting EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "SD card conversion required" -#define TR_CONVERTING "Converting: " #define TR_THROTTLE_UPPERCASE "THROTTLE" #define TR_ALARMSWARN "ALARMS" #define TR_SWITCHWARN TR("SWITCH", "CONTROL") diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index e4bef0964..28547e5ec 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -650,11 +650,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Incompatible" #define TR_WARNING "AVISO" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "ALMAC." -#define TR_EEPROM_CONVERTING "Convirtiendo EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "SD card conversion required" -#define TR_CONVERTING "Converting: " #define TR_THROTTLE_UPPERCASE TR("ACELERAD.", "ACELERADOR") #define TR_ALARMSWARN "ALARMAS" #define TR_SWITCHWARN TR("INTERRUP.", "INTERRUPTOR") diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 5081ba654..fc90ff002 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -665,11 +665,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Incompatible" #define TR_WARNING "WARNING" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" -#define TR_EEPROM_CONVERTING "EEPROM Converting" -#define TR_SDCARD_CONVERSION_REQUIRE "SD card conversion required" -#define TR_CONVERTING "Converting: " #define TR_THROTTLE_UPPERCASE "KAASU" #define TR_ALARMSWARN "HÄLYTYKSET" #define TR_SWITCHWARN TR("KYTKIN","CONTROL") diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index c6948cd7c..22ed0e9c7 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -656,11 +656,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Incompatible" #define TR_WARNING "ALERTE" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STOCKAGE" -#define TR_EEPROM_CONVERTING "Conversion EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "Conversion carte SD exigée" -#define TR_CONVERTING "Convertit: " #define TR_THROTTLE_UPPERCASE "GAZ" #define TR_ALARMSWARN "SON" #define TR_SWITCHWARN TR("INTERS","CONTRÔLES") diff --git a/radio/src/translations/he.h b/radio/src/translations/he.h index edcd478ca..c797fc4f8 100644 --- a/radio/src/translations/he.h +++ b/radio/src/translations/he.h @@ -658,11 +658,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Incompatible" #define TR_WARNING "אזהרה" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "איחסון" -#define TR_EEPROM_CONVERTING "Converting EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "SD card conversion required" -#define TR_CONVERTING ":ממיר " #define TR_THROTTLE_UPPERCASE "מצערת" #define TR_ALARMSWARN "התראות" #define TR_SWITCHWARN TR("SWITCH", "CONTROL") diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index 3a41da7d0..e23844ec8 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -653,11 +653,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Incompatibile" #define TR_WARNING "AVVISO" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" -#define TR_EEPROM_CONVERTING "Conversione EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "Conversione SD richiesta" -#define TR_CONVERTING "Conversione: " #define TR_THROTTLE_UPPERCASE "MOTORE" #define TR_ALARMSWARN "ALLARMI" #define TR_SWITCHWARN "CONTROLLI" diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index f86355981..ba5c4a5cc 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -658,11 +658,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "非対応" #define TR_WARNING "警告" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "ストレージ" -#define TR_EEPROM_CONVERTING "EEPROM変換" -#define TR_SDCARD_CONVERSION_REQUIRE "SDカードの変換が必要です" -#define TR_CONVERTING "変換: " #define TR_THROTTLE_UPPERCASE "THROTTLE" #define TR_ALARMSWARN "アラーム" #define TR_SWITCHWARN TR("スイッチ", "コントロール") diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 170b96cb1..e9f8606b9 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -651,11 +651,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Niet compatibel" #define TR_WARNING "MELDING" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" -#define TR_EEPROM_CONVERTING "EEPROM Converteren" -#define TR_SDCARD_CONVERSION_REQUIRE "SD card conversion required" -#define TR_CONVERTING "Converting: " #define TR_THROTTLE_UPPERCASE "GAS" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "SCHAKELAAR" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index 0a47cb059..4db64777e 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -652,11 +652,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Niekompatybilne" #define TR_WARNING "UWAGA" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" -#define TR_EEPROM_CONVERTING "Konwersja EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "SD card conversion required" -#define TR_CONVERTING "Konwertuję: " #define TR_THROTTLE_UPPERCASE "GAZ" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN TR("Przełą","Kontrola") diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 9566b85ff..e6be5ed2a 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -662,11 +662,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Incompativel" #define TR_WARNING "AVISO" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" -#define TR_EEPROM_CONVERTING "Convertendo EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "SD card conversion required" -#define TR_CONVERTING "Convertendo: " #define TR_THROTTLE_UPPERCASE "ACELERAD" #define TR_ALARMSWARN "ALARMS" #define TR_SWITCHWARN TR("SWITCH", "CONTROL") diff --git a/radio/src/translations/ru.h b/radio/src/translations/ru.h index 870354d8a..e902b196a 100644 --- a/radio/src/translations/ru.h +++ b/radio/src/translations/ru.h @@ -661,11 +661,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Несовмес" #define TR_WARNING "ВНИМАНИЕ" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "ПАМЯТЬ" -#define TR_EEPROM_CONVERTING "Преобр EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "Треб конверт SD карты" -#define TR_CONVERTING "Преобр: " #define TR_THROTTLE_UPPERCASE "Газ" #define TR_ALARMSWARN "СИГНАЛЫ" #define TR_SWITCHWARN TR("ТУМБЛЕРЫ", "ТУМБЛЕРЫ") diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index ff3c9320d..eb24e3ba3 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -670,11 +670,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Inkompatibel" #define TR_WARNING "VARNING" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "LAGRINGS-" -#define TR_EEPROM_CONVERTING "EEPROM konvertering" -#define TR_SDCARD_CONVERSION_REQUIRE "SD-kortet behöver konverteras" -#define TR_CONVERTING "Konverteras: " #define TR_THROTTLE_UPPERCASE "GAS-" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "BRYTAR-" diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 600aa62be..8fb30e771 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -660,11 +660,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "不兼容" #define TR_WARNING "警告" -#define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "存儲" -#define TR_EEPROM_CONVERTING "轉換數據" -#define TR_SDCARD_CONVERSION_REQUIRE "需要轉換SD卡" -#define TR_CONVERTING "轉換: " #define TR_THROTTLE_UPPERCASE "油門" #define TR_ALARMSWARN "警告" #define TR_SWITCHWARN TR("開關", "開關位置") diff --git a/radio/src/translations/ua.h b/radio/src/translations/ua.h index 6f04cfe23..707fb1561 100644 --- a/radio/src/translations/ua.h +++ b/radio/src/translations/ua.h @@ -661,11 +661,7 @@ #define TR_INT_MULTI_SPEC "stm-opentx-noinv" /*need to be clarified by context*/ #define TR_INCOMPATIBLE "Несумісне" #define TR_WARNING "ПОПЕРЕДЖЕННЯ" -#define TR_EEPROMWARN "EEPROM" /*use english*/ #define TR_STORAGE_WARNING "СХОВИЩЕ" -#define TR_EEPROM_CONVERTING "Перетворюю EEPROM" -#define TR_SDCARD_CONVERSION_REQUIRE "Потрібне перетворення SD карти" -#define TR_CONVERTING "Перетворення: " #define TR_THROTTLE_UPPERCASE "ГАЗ" #define TR_ALARMSWARN "АВАРІЇ" #define TR_SWITCHWARN TR("ПЕРЕМИКАЧ", "УПРАВЛІННЯ")