From 33910c8721b433a96919c101148bc1ed8f5129e0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 16 Feb 2016 20:45:25 +0100 Subject: [PATCH] [Horus] UI continued --- radio/src/bitmaps/horus/bmp_sleep.png | Bin 15868 -> 0 bytes .../bitmaps/horus/calibration/bmp_horus.png | Bin 50347 -> 0 bytes .../calibration/bmp_stick_background.png | Bin 5479 -> 0 bytes radio/src/gui/horus/bitmaps.cpp | 6 +- radio/src/gui/horus/layout.cpp | 14 ++ radio/src/gui/horus/layout.h | 1 + radio/src/gui/horus/menu_general_calib.cpp | 2 +- radio/src/gui/horus/screens_setup.cpp | 52 +++++- radio/src/gui/horus/theme.cpp | 14 ++ radio/src/gui/horus/theme.h | 5 + radio/src/gui/horus/widgets.cpp | 4 +- radio/src/gui/taranis/lcd.cpp | 4 +- radio/src/gui/taranis/lcd.h | 2 +- radio/src/lua/interface.cpp | 173 +++++++++++++++++- radio/src/lua/lua_api.h | 3 + radio/src/myeeprom.h | 3 +- radio/src/opentx.cpp | 29 +-- radio/src/sdcard.h | 3 +- radio/src/storage/storage_common.cpp | 7 +- radio/src/targets/simu/simpgmspace.cpp | 34 ++-- radio/src/tests/lua.cpp | 1 - radio/src/thirdparty/Lua/src/lrotable.c | 6 +- radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 35 files changed, 301 insertions(+), 75 deletions(-) delete mode 100644 radio/src/bitmaps/horus/bmp_sleep.png delete mode 100644 radio/src/bitmaps/horus/calibration/bmp_horus.png delete mode 100644 radio/src/bitmaps/horus/calibration/bmp_stick_background.png diff --git a/radio/src/bitmaps/horus/bmp_sleep.png b/radio/src/bitmaps/horus/bmp_sleep.png deleted file mode 100644 index 70e163272d0e325e9c29b836861fd2bb000008d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15868 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

Q@JywLm0&M5||C7`2?YR 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 S`wQf>LDCX(;+3L$e*XnfCcAr=J6 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%0DoC0ScX$Lq9V(TJLP_x|l^= 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�+t_aZ3_t6AY3Eshs8^#W)O1T+Ty5MM-Log|&& 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.screenData[0].layoutData); + } +} \ No newline at end of file diff --git a/radio/src/gui/horus/layout.h b/radio/src/gui/horus/layout.h index 885ecf38e..0bc6cfe11 100644 --- a/radio/src/gui/horus/layout.h +++ b/radio/src/gui/horus/layout.h @@ -161,5 +161,6 @@ class BaseLayoutFactory: public LayoutFactory extern unsigned int countRegisteredLayouts; extern const LayoutFactory * registeredLayouts[MAX_REGISTERED_LAYOUTS]; Layout * loadLayout(const char * name, Layout::PersistentData * persistentData); +void loadCustomScreens(); #endif // _LAYOUT_H_ diff --git a/radio/src/gui/horus/menu_general_calib.cpp b/radio/src/gui/horus/menu_general_calib.cpp index 50c0a37db..404dd5ae6 100644 --- a/radio/src/gui/horus/menu_general_calib.cpp +++ b/radio/src/gui/horus/menu_general_calib.cpp @@ -182,7 +182,7 @@ bool menuCommonCalib(evt_t event) break; } - lcdDrawBitmap((LCD_W-206)/2, LCD_H-220, LBM_HORUS); + lcdDrawAlphaBitmap((LCD_W-206)/2, LCD_H-220, LBM_HORUS); drawSticks(); drawPots(); diff --git a/radio/src/gui/horus/screens_setup.cpp b/radio/src/gui/horus/screens_setup.cpp index f72c91e20..82e555589 100644 --- a/radio/src/gui/horus/screens_setup.cpp +++ b/radio/src/gui/horus/screens_setup.cpp @@ -301,10 +301,9 @@ bool menuScreensTheme(evt_t event) lcdDrawText(MENUS_MARGIN_LEFT, y + FH / 2, "Theme"); const Theme * new_theme = editThemeChoice(SCREENS_SETUP_2ND_COLUMN, y, registeredThemes, countRegisteredThemes, theme, needsOffsetCheck, attr, event); if (new_theme) { - theme = new_theme; - theme->load(); - // strncpy(g_model.screenData[T].layoutName, factory->getName(), sizeof(g_model.screenData[T].layoutName)); - storageDirty(EE_MODEL); + loadTheme(new_theme); + strncpy(g_eeGeneral.themeName, new_theme->getName(), sizeof(g_eeGeneral.themeName)); + storageDirty(EE_GENERAL); } break; } @@ -317,12 +316,8 @@ bool menuScreensTheme(evt_t event) return true; } -bool menuScreenAdd(evt_t event) -{ - menuPageCount = updateMainviewsMenu(); - MENU_WITH_OPTIONS("Add main view", LBM_MAINVIEWS_ICONS, menuTabMainviews, menuPageCount, menuPageCount-1, 0, { uint8_t(NAVIGATION_LINE_BY_LINE|uint8_t(countRegisteredLayouts-1)), ORPHAN_ROW, 0, 0, 0, 0 }); - return true; -} +bool menuScreenAdd(evt_t event); +void onScreenSetupMenu(const char * result); template bool menuScreenSetup(evt_t event) @@ -342,6 +337,8 @@ bool menuScreenSetup(evt_t event) menuPageCount = updateMainviewsMenu(); MENU_WITH_OPTIONS(title, LBM_MAINVIEWS_ICONS, menuTabMainviews, menuPageCount, T+1, linesCount, { uint8_t(NAVIGATION_LINE_BY_LINE|uint8_t(countRegisteredLayouts-1)), ORPHAN_ROW, 0, 0, 0, 0 }); + + for (int i=0; i 0 && event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(KEY_ENTER); + menuHorizontalPosition = T; + POPUP_MENU_ADD_ITEM(STR_REMOVE_SCREEN); + popupMenuHandler = onScreenSetupMenu; + } + return true; } @@ -419,3 +423,31 @@ int updateMainviewsMenu() } return 1+MAX_CUSTOM_SCREENS; } + +bool menuScreenAdd(evt_t event) +{ + menuPageCount = updateMainviewsMenu(); + + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + customScreens[menuPageCount-2] = registeredLayouts[0]->create(&g_model.screenData[menuPageCount-2].layoutData); + chainMenu(menuMainviews[menuPageCount-2]); + return false; + } + + MENU_WITH_OPTIONS("Add main view", LBM_MAINVIEWS_ICONS, menuTabMainviews, menuPageCount, menuPageCount-1, 0, { uint8_t(NAVIGATION_LINE_BY_LINE|uint8_t(countRegisteredLayouts-1)), ORPHAN_ROW, 0, 0, 0, 0 }); + + return true; +} + +void onScreenSetupMenu(const char * result) +{ + if (result == STR_REMOVE_SCREEN) { + if (menuHorizontalPosition != MAX_CUSTOM_SCREENS-1) { + memmove(&g_model.screenData[menuHorizontalPosition], &g_model.screenData[menuHorizontalPosition + 1], sizeof(CustomScreenData) * (MAX_CUSTOM_SCREENS - menuHorizontalPosition - 1)); + memmove(&customScreens[menuHorizontalPosition], &customScreens[menuHorizontalPosition + 1], sizeof(Layout *) * (MAX_CUSTOM_SCREENS - menuHorizontalPosition - 1)); + } + memset(&g_model.screenData[MAX_CUSTOM_SCREENS-1], 0, sizeof(CustomScreenData)); + customScreens[MAX_CUSTOM_SCREENS-1] = NULL; + chainMenu(menuMainviews[menuHorizontalPosition > 0 ? menuHorizontalPosition-1 : 0]); + } +} diff --git a/radio/src/gui/horus/theme.cpp b/radio/src/gui/horus/theme.cpp index 8f01958b1..9d3cb7763 100644 --- a/radio/src/gui/horus/theme.cpp +++ b/radio/src/gui/horus/theme.cpp @@ -40,3 +40,17 @@ const Theme * getTheme(const char * name) return NULL; } +void loadTheme(const Theme * new_theme) +{ + theme = new_theme; + theme->load(); +} + +void loadTheme() +{ + char name[sizeof(g_eeGeneral.themeName)+1]; + memset(name, 0, sizeof(name)); + strncpy(name, g_eeGeneral.themeName, sizeof(g_eeGeneral.themeName)); + const Theme * new_theme = getTheme(name); + loadTheme(new_theme ? new_theme : theme); +} \ No newline at end of file diff --git a/radio/src/gui/horus/theme.h b/radio/src/gui/horus/theme.h index b0b842d69..ca8421bca 100644 --- a/radio/src/gui/horus/theme.h +++ b/radio/src/gui/horus/theme.h @@ -61,6 +61,11 @@ extern const Theme * theme; #define MAX_REGISTERED_THEMES 10 extern unsigned int countRegisteredThemes; +void registerTheme(const Theme * theme); extern const Theme * registeredThemes[MAX_REGISTERED_THEMES]; // TODO dynamic +const Theme * getTheme(const char * name); +void loadTheme(const Theme * theme); +void loadTheme(); + #endif // _THEME_H_ diff --git a/radio/src/gui/horus/widgets.cpp b/radio/src/gui/horus/widgets.cpp index 8365229a1..131b4fb67 100644 --- a/radio/src/gui/horus/widgets.cpp +++ b/radio/src/gui/horus/widgets.cpp @@ -50,7 +50,7 @@ void drawTopbarDatetime() #define STICK_PANEL_WIDTH 68 void drawStick(coord_t x, coord_t y, int16_t xval, int16_t yval) { - lcdDrawBitmap(x, y, LBM_STICK_BACKGROUND); + lcdDrawAlphaBitmap(x, y, LBM_STICK_BACKGROUND); lcdDrawAlphaBitmap(x + 2 + STICK_PANEL_WIDTH/2 + STICK_PANEL_WIDTH/2 * xval/RESX, y + 2 + STICK_PANEL_WIDTH/2 - STICK_PANEL_WIDTH/2 * yval/RESX, LBM_STICK_POINTER); } @@ -426,7 +426,7 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int void drawSleepBitmap() { lcdClear(); - lcdDrawBitmap((LCD_W-SLEEP_BITMAP_WIDTH)/2, (LCD_H-SLEEP_BITMAP_HEIGHT)/2, LBM_SLEEP); + lcdDrawAlphaBitmap((LCD_W-SLEEP_BITMAP_WIDTH)/2, (LCD_H-SLEEP_BITMAP_HEIGHT)/2, LBM_SLEEP); lcdRefresh(); } diff --git a/radio/src/gui/taranis/lcd.cpp b/radio/src/gui/taranis/lcd.cpp index 1e20ee9ee..c3b134c5f 100644 --- a/radio/src/gui/taranis/lcd.cpp +++ b/radio/src/gui/taranis/lcd.cpp @@ -498,9 +498,9 @@ void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat, Lc } } -void lcdDrawSolidVerticalLine(coord_t x, scoord_t y, scoord_t h) +void lcdDrawSolidVerticalLine(coord_t x, scoord_t y, scoord_t h, LcdFlags att) { - lcdDrawVerticalLine(x, y, h, SOLID); + lcdDrawVerticalLine(x, y, h, SOLID, att); } #endif diff --git a/radio/src/gui/taranis/lcd.h b/radio/src/gui/taranis/lcd.h index 1f7262104..6711a247b 100644 --- a/radio/src/gui/taranis/lcd.h +++ b/radio/src/gui/taranis/lcd.h @@ -179,7 +179,7 @@ void lcdDrawPoint(coord_t x, coord_t y, LcdFlags att=0); void lcdMaskPoint(uint8_t *p, uint8_t mask, LcdFlags att=0); void lcdDrawSolidHorizontalLine(coord_t x, coord_t y, coord_t w, LcdFlags att=0); void lcdDrawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t pat, LcdFlags att=0); -void lcdDrawSolidVerticalLine(coord_t x, scoord_t y, scoord_t h); +void lcdDrawSolidVerticalLine(coord_t x, scoord_t y, scoord_t h, LcdFlags att=0); void lcdDrawVerticalLine(coord_t x, scoord_t y, scoord_t h, uint8_t pat, LcdFlags att=0); void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat=SOLID, LcdFlags att=0); void lcdDrawFilledRect(coord_t x, scoord_t y, coord_t w, coord_t h, uint8_t pat=SOLID, LcdFlags att=0); diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 2d5c1b5f4..2cf8a8c42 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -39,7 +39,7 @@ #include "opentx.h" #include "bin_allocator.h" #include "lua/lua_api.h" - + #if defined(LUA_COMPILER) && defined(SIMU) #include #include @@ -185,7 +185,12 @@ void luaRegisterAll() void luaInit() { + TRACE("luaInit"); + +#if !defined(COLORLCD) luaClose(); +#endif + if (luaState != INTERPRETER_PANIC) { #if defined(USE_BIN_ALLOCATOR) L = lua_newstate(bin_l_alloc, NULL); //we use our own allocator! @@ -212,6 +217,10 @@ void luaInit() luaDisable(); } } + +#if defined(COLORLCD) + luaLoadThemes(); +#endif } void luaFree(ScriptInternalData & sid) @@ -271,7 +280,7 @@ static void luaCompileAndSave(const char *bytecodeName) } #endif -int luaLoad(const char *filename, ScriptInternalData & sid, ScriptInputsOutputs * sio=NULL) +int luaLoad(const char * filename, ScriptInternalData & sid, ScriptInputsOutputs * sio=NULL) { int init = 0; @@ -301,7 +310,7 @@ int luaLoad(const char *filename, ScriptInternalData & sid, ScriptInputsOutputs luaL_checktype(L, -1, LUA_TTABLE); for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { - const char *key = lua_tostring(L, -2); + const char * key = lua_tostring(L, -2); if (!strcmp(key, "init")) { init = luaL_ref(L, LUA_REGISTRYINDEX); lua_pushnil(L); @@ -529,9 +538,12 @@ void luaError(uint8_t error, bool acknowledge) } } -void luaExec(const char *filename) +void luaExec(const char * filename) { +#if !defined(COLORLCD) luaInit(); +#endif + if (luaState != INTERPRETER_PANIC) { standaloneScript.state = SCRIPT_NOFILE; int result = luaLoad(filename, standaloneScript); @@ -618,7 +630,7 @@ void luaDoOneRunStandalone(evt_t evt) } } } - + bool luaDoOneRunPermanentScript(uint8_t evt, int i, uint32_t scriptType) { ScriptInternalData & sid = scriptInternalData[i]; @@ -761,10 +773,12 @@ bool luaTask(uint8_t evt, uint8_t scriptType, bool allowLcdUsage) // run permanent scripts if (luaState & INTERPRETER_RELOAD_PERMANENT_SCRIPTS) { luaState = 0; +#if !defined(COLORLCD) luaInit(); if (luaState == INTERPRETER_PANIC) return false; luaLoadPermanentScripts(); if (luaState == INTERPRETER_PANIC) return false; +#endif } for (int i=0; iloadFunction = loadFunction; + theme->drawBackgroundFunction = drawBackgroundFunction; + theme->drawTopbarBackgroundFunction = drawTopbarBackgroundFunction; + } + } + else { + TRACE("Error in script %s: %s", filename, lua_tostring(L, -1)); + } + } + else { + luaDisable(); + return SCRIPT_PANIC; + } + UNPROTECT_LUA(); +} + +void luaLoadThemes() +{ + char path[THEME_FILENAME_MAXLEN+1] = THEMES_PATH; + FILINFO fno; + DIR dir; + char * fn; /* This function is assuming non-Unicode cfg. */ + TCHAR lfn[_MAX_LFN + 1]; + fno.lfname = lfn; + fno.lfsize = sizeof(lfn); + + FRESULT res = f_opendir(&dir, path); /* Open the directory */ + if (res == FR_OK) { + for (;;) { + res = f_readdir(&dir, &fno); /* Read a directory item */ + if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */ + fn = * fno.lfname ? fno.lfname : fno.fname; + uint8_t len = strlen(fn); + bool found = false; + + // Eliminates directories / non wav files + if (len < 5 || strcasecmp(fn+len-4, SCRIPTS_EXT) || (fno.fattrib & AM_DIR)) continue; + path[sizeof(THEMES_PATH)-1] = '/'; + strcpy(path+sizeof(THEMES_PATH), fn); + luaLoadTheme(path); + } + } +} +#endif diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index 115f1f56e..5e93a3188 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -152,8 +152,11 @@ struct LuaField { char desc[50]; }; bool luaFindFieldByName(const char * name, LuaField & field, unsigned int flags=0); +void luaLoadThemes(); #else // defined(LUA) +#define luaInit() #define LUA_LOAD_MODEL_SCRIPTS() +#define luaLoadThemes() #endif // defined(LUA) #endif // _LUA_API_H_ diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index e548b9096..24bce8ee8 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -440,7 +440,8 @@ enum UartModes { char anaNames[NUM_STICKS+NUM_POTS][LEN_ANA_NAME]; \ char currModelFilename[LEN_MODEL_FILENAME+1]; \ uint8_t bluetoothEnable; \ - char bluetoothName[LEN_BLUETOOTH_NAME]; + char bluetoothName[LEN_BLUETOOTH_NAME]; \ + char themeName[8]; #elif defined(PCBFLAMENCO) #define LEN_SWITCH_NAME 3 #define LEN_ANA_NAME 3 diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 524d36000..42d9cd24f 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1880,24 +1880,6 @@ void doMixerCalculations() s_mixer_first_run_done = true; } -#if defined(COLORLCD) -void loadCustomScreens() -{ - for (unsigned int i=0; icreate(&g_model.screenData[0].layoutData); - } -} -#else - #define loadCustomScreens() -#endif - #if defined(NAVIGATION_STICKS) uint8_t StickScrollAllowed; uint8_t StickScrollTimer; @@ -1938,13 +1920,16 @@ void opentxStart() } #endif +#if defined(COLORLCD) + luaInit(); + loadTheme(); +#endif + #if defined(GUI) checkAlarm(); checkAll(); #endif - loadCustomScreens(); - #if defined(GUI) if (g_eeGeneral.chkSum != evalChkSum()) { chainMenu(menuFirstCalib); @@ -2601,10 +2586,6 @@ int main(void) lcdInit(); #endif -#if defined(COLORLCD) - theme->load(); -#endif - stackPaint(); #if defined(GUI) diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 87dbd4429..047442fb6 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -36,6 +36,7 @@ #define EEPROMS_PATH ROOT_PATH "EEPROMS" #define SCRIPTS_PATH ROOT_PATH "SCRIPTS" #define WIZARD_PATH SCRIPTS_PATH "/WIZARD" +#define THEMES_PATH SCRIPTS_PATH "/THEMES" #define WIZARD_NAME "wizard.lua" #define TEMPLATES_PATH SCRIPTS_PATH "/TEMPLATES" #define SCRIPTS_MIXES_PATH SCRIPTS_PATH "/MIXES" diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index 00a171bae..ee4b68a98 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -87,9 +87,12 @@ void postModelLoad(bool newModel) referenceModelAudioFiles(); #endif +#if defined(COLORLCD) + loadCustomScreens(); +#endif + LOAD_MODEL_BITMAP(); LUA_LOAD_MODEL_SCRIPTS(); SEND_FAILSAFE_1S(); PLAY_MODEL_NAME(); } - diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 5f566ee6d..4dcc55b90 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -300,7 +300,7 @@ void *eeprom_write_function(void *) } eeprom_pointer++; eeprom_buffer_data++; - + if (fp && eeprom_buffer_size == 1) { fflush(fp); } @@ -326,14 +326,10 @@ void * main_thread(void *) try { #endif -#if defined(PCBHORUS) - theme->load(); -#endif - #if defined(CPUARM) stackPaint(); #endif - + s_current_protocol[0] = 255; menuLevel = 0; @@ -415,11 +411,11 @@ void StartMainThread(bool tests) #endif /* - g_tmr10ms must be non-zero otherwise some SF functions (that use this timer as a marker when it was last executed) + g_tmr10ms must be non-zero otherwise some SF functions (that use this timer as a marker when it was last executed) will be executed twice on startup. Normal radio does not see this issue because g_tmr10ms is already a big number before the first call to the Special Functions. Not so in the simulator. - There is another issue, some other function static variables depend on this value. If simulator is started + There is another issue, some other function static variables depend on this value. If simulator is started multiple times in one Companion session, they are set to their initial values only first time the simulator is started. Therefore g_tmr10ms must also be set to non-zero value only the first time, then it must be left alone to continue from the previous simulator session value. See the issue #2446 @@ -428,11 +424,11 @@ void StartMainThread(bool tests) if (g_tmr10ms == 0) { g_tmr10ms = 1; } - + #if defined(RTCLOCK) g_rtcTime = time(0); #endif - + main_thread_running = (tests ? 1 : 2); pthread_create(&main_thread_pid, NULL, &main_thread, NULL); } @@ -484,10 +480,10 @@ int32_t getVolume() #if defined(SIMU_AUDIO) && defined(CPUARM) -void copyBuffer(uint8_t * dest, uint16_t * buff, unsigned int samples) +void copyBuffer(uint8_t * dest, uint16_t * buff, unsigned int samples) { for(unsigned int i=0; id_name); fileMap.insert(filemap_t:: value_type(path, result)); simu::closedir(dir); - return result; + return result; } } } @@ -1047,7 +1043,7 @@ FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs) { // just fake that we always have some clusters free *nclst = 10; - return FR_OK; + return FR_OK; } #if defined(PCBSKY9X) @@ -1107,7 +1103,7 @@ void traceDiskStatus() { if (noDiskStatus > 0) { TRACE("disk_status() called %d times", noDiskStatus); - noDiskStatus = 0; + noDiskStatus = 0; } } @@ -1186,7 +1182,7 @@ DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff) DWORD noSectors = buf.st_size / 512; *(DWORD*)buff = noSectors; TRACE("disk_ioctl(GET_SECTOR_COUNT) = %u", noSectors); - return RES_OK; + return RES_OK; } return RES_ERROR; } diff --git a/radio/src/tests/lua.cpp b/radio/src/tests/lua.cpp index 906a9acf0..a0e3cad58 100644 --- a/radio/src/tests/lua.cpp +++ b/radio/src/tests/lua.cpp @@ -44,7 +44,6 @@ extern const char * zchar2string(const char * zstring, int size); #define EXPECT_ZSTREQ(c_string, z_string) EXPECT_STREQ(c_string, zchar2string(z_string, sizeof(z_string))) -extern void luaInit(); ::testing::AssertionResult __luaExecStr(const char * str) { diff --git a/radio/src/thirdparty/Lua/src/lrotable.c b/radio/src/thirdparty/Lua/src/lrotable.c index 93b418ab4..c188d9603 100644 --- a/radio/src/thirdparty/Lua/src/lrotable.c +++ b/radio/src/thirdparty/Lua/src/lrotable.c @@ -32,7 +32,7 @@ static luaR_result luaR_findkey(const void *where, const char *key, int type, in /* Find a global "read only table" in the constant lua_rotable array */ luaR_result luaR_findglobal(const char *name, lu_byte *ptype) { - unsigned i; + unsigned i; *ptype = LUA_TNIL; if (strlen(name) > LUA_MAX_ROTABLE_NAME) return 0; @@ -60,13 +60,13 @@ int luaR_findfunction(lua_State *L, const luaL_Reg *ptable) { lua_pushlightfunction(L, (void*)(size_t)res); else lua_pushnil(L); - return 1; + return 1; } luaR_result luaR_findentry(void *data, const char *key, lu_byte *ptype) { int found; unsigned idx = (unsigned)(size_t)data - 1; - luaR_result res; + luaR_result res; *ptype = LUA_TNIL; /* First look at the functions */ res = luaR_findkey(lua_rotable[idx].pfuncs, key, LUAR_FINDFUNCTION, &found); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 0a5d861dc..894498c89 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -578,6 +578,7 @@ const pm_char STR_MODEL_SELECT[] PROGMEM = TR_MODEL_SELECT; const pm_char STR_SELECT_WIDGET[] PROGMEM = TR_SELECT_WIDGET; const pm_char STR_REMOVE_WIDGET[] PROGMEM = TR_REMOVE_WIDGET; const pm_char STR_WIDGET_SETTINGS[] PROGMEM = TR_WIDGET_SETTINGS; +const pm_char STR_REMOVE_SCREEN[] PROGMEM = TR_REMOVE_SCREEN; #endif #if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) diff --git a/radio/src/translations.h b/radio/src/translations.h index d8cc93467..4b63563cd 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -829,6 +829,7 @@ extern const pm_char STR_BLCOLOR[]; extern const pm_char STR_SELECT_WIDGET[]; extern const pm_char STR_REMOVE_WIDGET[]; extern const pm_char STR_WIDGET_SETTINGS[]; +extern const pm_char STR_REMOVE_SCREEN[]; #endif #if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 77ca34cc8..034ad67b9 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1102,6 +1102,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" #define TR_MENU_INPUTS "\314Vstupy" #define TR_MENU_LUA "\322Lua skripty" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 68639e5d6..b070d77ac 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1105,6 +1105,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" // ----------------------------- Symbole für Auswahlliste---------- #define TR_MENU_INPUTS "\314Inputs" #define TR_MENU_LUA "\322Lua Scripte" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index e10c5a2fa..206019a9e 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1131,6 +1131,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" #define TR_MENU_INPUTS "\314Inputs" #define TR_MENU_LUA "\322Lua scripts" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 0620b3db7..07ed9fa7c 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1057,6 +1057,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" #define TR_MENU_INPUTS "\314Inputs" #define TR_MENU_LUA "\322Lua scripts" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 1c7a97c87..872c47228 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1057,6 +1057,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" #define TR_MENU_INPUTS "\314Inputs" #define TR_MENU_LUA "\322Lua scripts" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index fa2f477fd..79c4baf56 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1092,6 +1092,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" #define TR_MENU_INPUTS "\314Entrées" #define TR_MENU_LUA "\322Scripts Lua" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 9dc59f46d..c46f0b80c 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1104,6 +1104,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" #define TR_MENU_INPUTS "\314Ingressi" #define TR_MENU_LUA "\322Lua scripts" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 6451aba44..c8b3f5eef 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1123,6 +1123,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" #define TR_MENU_INPUTS "\314Inputs" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 66f7de1c2..f54c038cd 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1105,6 +1105,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" #define TR_MENU_INPUTS "\314Wejści" #define TR_MENU_LUA "\322SkryptyLUA" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index ba16649a7..e8ae773a3 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1051,6 +1051,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" #define TR_MENU_INPUTS "\314Inputs" #define TR_MENU_LUA "\322Lua scripts" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 553e23723..de92c3ab1 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1128,6 +1128,7 @@ #define TR_SELECT_WIDGET "Select widget" #define TR_REMOVE_WIDGET "Remove widget" #define TR_WIDGET_SETTINGS "Widget settings" +#define TR_REMOVE_SCREEN "Remove screen" #define TR_MENU_INPUTS "\314Inputs" #define TR_MENU_LUA "\322Lua scripts"