diff --git a/radio/src/lua.cpp b/radio/src/lua.cpp index d2e877972..b12ad20a4 100644 --- a/radio/src/lua.cpp +++ b/radio/src/lua.cpp @@ -63,7 +63,7 @@ ScriptInternalData standaloneScript = { SCRIPT_NOFILE, 0 }; #define PERMANENT_SCRIPTS_MAX_INSTRUCTIONS (1000/100) #define MANUAL_SCRIPTS_MAX_INSTRUCTIONS (10000/100) -#define SCRIPTS_MAX_HEAP 50 +#define SCRIPTS_MAX_HEAP 100 #define SET_LUA_INSTRUCTIONS_COUNT(x) (instructionsPercent=0, lua_sethook(L, hook, LUA_MASKCOUNT, x)) static int instructionsPercent = 0; @@ -193,6 +193,12 @@ static int luaPlayNumber(lua_State *L) return 0; } +static int luaKillEvents(lua_State *L) +{ + int event = luaL_checkinteger(L, 1); + killEvents(event); + return 0; +} static int luaLcdLock(lua_State *L) { @@ -993,6 +999,7 @@ void luaInit() lua_register(L, "playNumber", luaPlayNumber); lua_register(L, "popupInput", luaPopupInput); lua_register(L, "channelOrder", luaChannelOrder); + lua_register(L, "killEvents", luaKillEvents); // Push OpenTX constants lua_registerint(L, "FULLSCALE", RESX); @@ -1012,6 +1019,7 @@ void luaInit() lua_registerint(L, "SOURCE_FIRST_CH", MIXSRC_FIRST_CH); lua_registerint(L, "EVT_MENU_BREAK", EVT_KEY_BREAK(KEY_MENU)); lua_registerint(L, "EVT_PAGE_BREAK", EVT_KEY_BREAK(KEY_PAGE)); + lua_registerint(L, "EVT_PAGE_LONG", EVT_KEY_LONG(KEY_PAGE)); lua_registerint(L, "EVT_ENTER_BREAK", EVT_KEY_BREAK(KEY_ENTER)); lua_registerint(L, "EVT_EXIT_BREAK", EVT_KEY_BREAK(KEY_EXIT)); lua_registerint(L, "EVT_PLUS_BREAK", EVT_KEY_BREAK(KEY_PLUS)); diff --git a/radio/wizard/engine-0.bmp b/radio/wizard/engine-0.bmp new file mode 100755 index 000000000..04198eef7 Binary files /dev/null and b/radio/wizard/engine-0.bmp differ diff --git a/radio/wizard/engine-1.bmp b/radio/wizard/engine-1.bmp new file mode 100755 index 000000000..24a936cd4 Binary files /dev/null and b/radio/wizard/engine-1.bmp differ diff --git a/radio/wizard/images/engine.png b/radio/wizard/images/engine.png deleted file mode 100644 index f839cc3f3..000000000 Binary files a/radio/wizard/images/engine.png and /dev/null differ diff --git a/radio/wizard/images/engine_n.png b/radio/wizard/images/engine_n.png deleted file mode 100644 index 9b09200d4..000000000 Binary files a/radio/wizard/images/engine_n.png and /dev/null differ diff --git a/radio/wizard/wizard.lua b/radio/wizard/wizard.lua index bbc9e3a33..895ca4df5 100755 --- a/radio/wizard/wizard.lua +++ b/radio/wizard/wizard.lua @@ -6,7 +6,8 @@ local HELI_MENU = PLANE_MENU+10 local DELTA_MENU = HELI_MENU+10 local QUADRI_MENU = DELTA_MENU+10 -local AILERONS_MENU = PLANE_MENU +local ENGINE_MENU = PLANE_MENU +local AILERONS_MENU = PLANE_MENU+1 local page = MODELTYPE_MENU local dirty = true @@ -15,38 +16,26 @@ local choice = 0 local edit = false local field = 0 local fieldsMax = 0 +local engineMode = 0 +local engineCH1 = 0 local aileronsMode = 0 local aileronsCH1 = 0 local aileronsCH2 = 4 -local function init() - for stick = 0, 4, 1 do - local index = channelOrder(stick); - if index == 0 then - elseif index == 1 then - elseif index == 2 then - else - aileronsCH1 = stick - end +-- Common functions + +local lastBlink = 0 +local function blinkChanged() + local time = getTime() % 128 + local blink = (time - time % 64) / 64 + if blink ~= lastBlink then + lastBlink = blink + return true + else + return false end end -local function choiceSurround(index) - lcd.drawRectangle(12+47*index, 13, 48, 48) - lcd.drawPixmap(17+47*index, 8, "/TEMPLATES/mark.bmp") -end - -local function drawModelChoiceMenu() - lcd.clear() - lcd.drawScreenTitle("", 0, 0) - -- lcd.drawText(58, 13, "Select model type", 0) - lcd.drawPixmap( 16, 17, "/TEMPLATES/plane.bmp") - lcd.drawPixmap( 63, 17, "/TEMPLATES/heli.bmp") - lcd.drawPixmap(110, 17, "/TEMPLATES/delta.bmp") - lcd.drawPixmap(157, 17, "/TEMPLATES/quadri.bmp") - choiceSurround(choice) -end - local function keyIncDec(event, value, max, isvalue) if isvalue then if event == EVT_PLUS_BREAK then @@ -73,16 +62,26 @@ local function keyIncDec(event, value, max, isvalue) return value end -local function modelTypeMenu(event) - if dirty == true then - drawModelChoiceMenu() - dirty = false - end +local function navigate(event, fieldMax, prevPage, nextPage) if event == EVT_ENTER_BREAK then - page = PLANE_MENU+(10*choice) + edit = not edit dirty = true + end + if edit then + if not dirty then + dirty = blinkChanged() + end else - choice = keyIncDec(event, choice, 3) + if event == EVT_PAGE_BREAK then + page = nextPage + dirty = true + elseif event == EVT_PAGE_LONG then + page = prevPage + killEvents(event); + dirty = true + else + field = keyIncDec(event, field, fieldMax) + end end end @@ -97,19 +96,96 @@ local function getFieldFlags(position) return flags end -local lastBlink = 0 -local function blinkChanged() - local time = getTime() % 128 - local blink = (time - time % 64) / 64 - if blink ~= lastBlink then - lastBlink = blink - return true - else - return false +-- Init function + +local function init() + for stick = 0, 4, 1 do + local index = channelOrder(stick); + if index == 0 then + elseif index == 1 then + elseif index == 2 then + engineCH1 = stick + else + aileronsCH1 = stick + end end end -local aileronsModeItems = {"Yes...", "No...", "Yes, 2 channels..."} +-- Model Type Menu + +local function choiceSurround(index) + lcd.drawRectangle(12+47*index, 13, 48, 48) + lcd.drawPixmap(17+47*index, 8, "/TEMPLATES/mark.bmp") +end + +local function drawModelChoiceMenu() + lcd.clear() + lcd.drawScreenTitle("", 0, 0) + -- lcd.drawText(58, 13, "Select model type", 0) + lcd.drawPixmap( 16, 17, "/TEMPLATES/plane.bmp") + lcd.drawPixmap( 63, 17, "/TEMPLATES/heli.bmp") + lcd.drawPixmap(110, 17, "/TEMPLATES/delta.bmp") + lcd.drawPixmap(157, 17, "/TEMPLATES/quadri.bmp") + choiceSurround(choice) +end + +local function modelTypeMenu(event) + if dirty == true then + drawModelChoiceMenu() + dirty = false + end + if event == EVT_ENTER_BREAK then + page = PLANE_MENU+(10*choice) + dirty = true + else + choice = keyIncDec(event, choice, 3) + end +end + +-- Engine Menu + +local engineModeItems = {"Yes...", "No"} + +local function drawEngineMenu() + lcd.clear() + lcd.drawText(1, 0, "Has your model got an engine?", 0) + lcd.drawRect(0, 0, LCD_W, 8, GREY_DEFAULT+FILL_WHITE) + lcd.drawCombobox(0, 8, LCD_W/2, engineModeItems, engineMode, getFieldFlags(0)) + lcd.drawLine(LCD_W/2-1, 18, LCD_W/2-1, LCD_H, DOTTED, 0) + if engineMode == 1 then + -- No engine + lcd.drawPixmap(132, 8, "/TEMPLATES/engine-0.bmp") + fieldsMax = 0 + else + -- 1 channel + lcd.drawPixmap(132, 8, "/TEMPLATES/engine-1.bmp") + lcd.drawText(25, LCD_H-16, "Assign channel", 0); + lcd.drawText(LCD_W/2-19, LCD_H-8, ">>>", 0); + lcd.drawSource(151, LCD_H-8, SOURCE_FIRST_CH+engineCH1, getFieldFlags(1)) + fieldsMax = 1 + end +end + +local function engineMenu(event) + if dirty then + dirty = false + drawEngineMenu() + end + + navigate(event, fieldsMax, MODELTYPE_MENU, page+1) + + if edit then + if field==0 then + engineMode = keyIncDec(event, engineMode, 1) + elseif field==1 then + engineCH1 = keyIncDec(event, engineCH1, 7, true) + end + end +end + +-- Ailerons Menu + +local aileronsModeItems = {"Yes...", "No", "Yes, 2 channels..."} local function drawAileronsMenu() lcd.clear() @@ -140,28 +216,26 @@ local function drawAileronsMenu() end local function aileronsMenu(event) - if not dirty then - dirty = blinkChanged() - end if dirty then dirty = false drawAileronsMenu() end - if event == EVT_ENTER_BREAK then - edit = not edit - dirty = true - end - if edit == false then - field = keyIncDec(event, field, fieldsMax) - elseif field == 0 then - aileronsMode = keyIncDec(event, aileronsMode, 2) - elseif field == 1 then - aileronsCH1 = keyIncDec(event, aileronsCH1, 7, true) - elseif field == 2 then - aileronsCH2 = keyIncDec(event, aileronsCH2, 7, true) + + navigate(event, fieldsMax, page-1, page+1) + + if edit then + if field==0 then + aileronsMode = keyIncDec(event, aileronsMode, 2) + elseif field==1 then + aileronsCH1 = keyIncDec(event, aileronsCH1, 7, true) + elseif field==2 then + aileronsCH2 = keyIncDec(event, aileronsCH2, 7, true) + end end end +-- Main + local function run(event) if event == EVT_EXIT_BREAK then return 2 @@ -169,6 +243,8 @@ local function run(event) lcd.lock() if page == MODELTYPE_MENU then modelTypeMenu(event) + elseif page == ENGINE_MENU then + engineMenu(event) elseif page == AILERONS_MENU then aileronsMenu(event) end