From 217e468012ccd2f006966276c98551a1b4573284 Mon Sep 17 00:00:00 2001 From: Offer Shmuely Date: Sat, 2 Sep 2023 08:45:05 +0300 Subject: [PATCH] feat(color): Wing wizard, updated Plane wizard (#107) * new Rotary Gauge widget * Rotary Gauge widget: less ticks on small size * new Rotary Gauge widget * new Rotary Gauge widget * wing wizard support * wing wizard support * Mix values didn't match companion wing wizard * Add touch zone to loader for wing wizard * wing wizard: fix expo values on review page * wing wizard: choose channel based on stick mode * wing wizard: fix creation error * wing wizard: nice base telemetry screen * wing wizard: fix expo * wind wizard: better code style & telemetry screen & low voltage warning * wind wizard: revert Wizard loader * wing wizard: move wing wizard to the new location * wing wizard: reorder wizard elements * wing wizard: reorder wizard elements * wing wizard: move wing wizard to the new location * wizards: directory restructure * plane wizards: add first widget pages add dual rate add expo add landing gear UI improuvments allow page-right/left navigation with touch fix acknowledge screen after create model * plane wizards: no dual-rate on rudder * plane wizards: no dual-rate on rudder * plane wizards: no dual-rate on rudder * plane wizards: no dual-rate on rudder * plane wizards: Hold [RTN] to exit * plane wizards: remove telemetrySensors * plane wizards: verify inputs have trim-on * plane wizards: arm switch checks --------- Co-authored-by: Shmuely Co-authored-by: oshmuely Co-authored-by: Peter Feerick --- .gitignore | 1 + .../c480x272/SCRIPTS/TOOLS/WizardLoader.lua | 109 - .../SCRIPTS/WIZARD/img/icons/glider.png | Bin 6681 -> 0 bytes .../SCRIPTS/WIZARD/img/icons/helicopter.png | Bin 2897 -> 0 bytes .../SCRIPTS/WIZARD/img/icons/multirotor.png | Bin 8087 -> 0 bytes .../SCRIPTS/WIZARD/img/icons/plane.png | Bin 7207 -> 0 bytes sdcard/c480x272/SCRIPTS/WIZARD/plane.lua | 478 ---- .../c480x272/TEMPLATES/1.Wizard/1.Plane.lua | 808 ++++++ .../Plane.txt => 1.Wizard/1.Plane.txt} | 0 .../c480x272/TEMPLATES/1.Wizard/1.Plane.yml | 227 ++ .../1.Wizard/2.Glider.lua} | 976 ++++---- .../Glider.txt => 1.Wizard/2.Glider.txt} | 0 .../Glider.yml => 1.Wizard/2.Glider.yml} | 356 +-- sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.lua | 526 ++++ sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.txt | 1 + sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.yml | 349 +++ .../1.Wizard/4.Helicopter.lua} | 1261 +++++----- .../4.Helicopter.txt} | 0 .../4.Helicopter.yml} | 356 +-- .../1.Wizard/5.Multirotor.lua} | 842 ++++--- .../5.Multirotor.txt} | 0 .../5.Multirotor.yml} | 356 +-- sdcard/c480x272/TEMPLATES/1.Wizard/about.txt | 3 + .../1.Wizard}/img/background.png | Bin .../1.Wizard}/img/glider/brake.png | Bin .../1.Wizard}/img/glider/flap.png | Bin .../1.Wizard}/img/glider/glider.png | Bin .../1.Wizard}/img/glider/lail.png | Bin .../1.Wizard}/img/glider/prop.png | Bin .../1.Wizard}/img/glider/rail.png | Bin .../1.Wizard}/img/glider/tail.png | Bin .../1.Wizard}/img/glider/tail_rud.png | Bin .../1.Wizard}/img/glider/vtail.png | Bin .../1.Wizard}/img/helicopter/aileron.png | Bin .../1.Wizard}/img/helicopter/curve.png | Bin .../1.Wizard}/img/helicopter/elevator.png | Bin .../1.Wizard}/img/helicopter/pitch.png | Bin .../1.Wizard}/img/helicopter/rudder.png | Bin .../1.Wizard}/img/helicopter/style.png | Bin .../1.Wizard}/img/helicopter/switch.png | Bin .../1.Wizard}/img/helicopter/throttle.png | Bin .../1.Wizard}/img/helicopter/type.png | Bin .../1.Wizard}/img/mark_bg.png | Bin .../1.Wizard}/img/multirotor/arm.png | Bin .../1.Wizard}/img/multirotor/beeper.png | Bin .../1.Wizard}/img/multirotor/mode.png | Bin .../1.Wizard}/img/multirotor/pitch.png | Bin .../1.Wizard}/img/multirotor/roll.png | Bin .../1.Wizard}/img/multirotor/throttle.png | Bin .../1.Wizard}/img/multirotor/yaw.png | Bin .../1.Wizard}/img/pagedn.png | Bin .../1.Wizard}/img/pageup.png | Bin .../1.Wizard}/img/plane/_vtail.png | Bin .../1.Wizard}/img/plane/flap.png | Bin .../1.Wizard}/img/plane/lail.png | Bin .../1.Wizard}/img/plane/plane.png | Bin .../1.Wizard}/img/plane/prop.png | Bin .../1.Wizard}/img/plane/rail.png | Bin .../1.Wizard}/img/plane/tail.png | Bin .../1.Wizard}/img/plane/tail_rud.png | Bin .../1.Wizard}/img/summary.png | Bin .../TEMPLATES/1.Wizard/img/wing/lail.png | Bin 0 -> 1742 bytes .../TEMPLATES/1.Wizard/img/wing/plane.png | Bin 0 -> 5811 bytes .../TEMPLATES/1.Wizard/img/wing/prop.png | Bin 0 -> 16601 bytes .../TEMPLATES/1.Wizard/img/wing/rail.png | Bin 0 -> 1663 bytes .../{PERSONAL => 2.Personal}/about.txt | 0 .../{SoarETX => 3.SoarETX}/F3K RE.txt | 0 .../{SoarETX => 3.SoarETX}/F3K RE.yml | 0 .../{SoarETX => 3.SoarETX}/F3K TRAD.txt | 0 .../{SoarETX => 3.SoarETX}/F3K TRAD.yml | 2202 ++++++++--------- .../{SoarETX => 3.SoarETX}/F3K-TRAD.yml | 0 .../TEMPLATES/{SoarETX => 3.SoarETX}/F3K.txt | 2 +- .../TEMPLATES/{SoarETX => 3.SoarETX}/F3K.yml | 0 .../{SoarETX => 3.SoarETX}/about.txt | 4 +- sdcard/c480x272/TEMPLATES/WIZARD/Glider.lua | 23 - .../c480x272/TEMPLATES/WIZARD/Helicopter.lua | 23 - .../c480x272/TEMPLATES/WIZARD/Multirotor.lua | 23 - sdcard/c480x272/TEMPLATES/WIZARD/Plane.lua | 23 - sdcard/c480x272/TEMPLATES/WIZARD/Plane.yml | 178 -- sdcard/c480x272/TEMPLATES/WIZARD/about.txt | 1 - 80 files changed, 5124 insertions(+), 4004 deletions(-) delete mode 100644 sdcard/c480x272/SCRIPTS/TOOLS/WizardLoader.lua delete mode 100644 sdcard/c480x272/SCRIPTS/WIZARD/img/icons/glider.png delete mode 100644 sdcard/c480x272/SCRIPTS/WIZARD/img/icons/helicopter.png delete mode 100644 sdcard/c480x272/SCRIPTS/WIZARD/img/icons/multirotor.png delete mode 100644 sdcard/c480x272/SCRIPTS/WIZARD/img/icons/plane.png delete mode 100644 sdcard/c480x272/SCRIPTS/WIZARD/plane.lua create mode 100644 sdcard/c480x272/TEMPLATES/1.Wizard/1.Plane.lua rename sdcard/c480x272/TEMPLATES/{WIZARD/Plane.txt => 1.Wizard/1.Plane.txt} (100%) create mode 100644 sdcard/c480x272/TEMPLATES/1.Wizard/1.Plane.yml rename sdcard/c480x272/{SCRIPTS/WIZARD/glider.lua => TEMPLATES/1.Wizard/2.Glider.lua} (94%) rename sdcard/c480x272/TEMPLATES/{WIZARD/Glider.txt => 1.Wizard/2.Glider.txt} (100%) rename sdcard/c480x272/TEMPLATES/{WIZARD/Glider.yml => 1.Wizard/2.Glider.yml} (94%) create mode 100644 sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.lua create mode 100644 sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.txt create mode 100644 sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.yml rename sdcard/c480x272/{SCRIPTS/WIZARD/helicopter.lua => TEMPLATES/1.Wizard/4.Helicopter.lua} (90%) rename sdcard/c480x272/TEMPLATES/{WIZARD/Helicopter.txt => 1.Wizard/4.Helicopter.txt} (100%) rename sdcard/c480x272/TEMPLATES/{WIZARD/Helicopter.yml => 1.Wizard/4.Helicopter.yml} (94%) rename sdcard/c480x272/{SCRIPTS/WIZARD/multirotor.lua => TEMPLATES/1.Wizard/5.Multirotor.lua} (92%) rename sdcard/c480x272/TEMPLATES/{WIZARD/Multirotor.txt => 1.Wizard/5.Multirotor.txt} (100%) rename sdcard/c480x272/TEMPLATES/{WIZARD/Multirotor.yml => 1.Wizard/5.Multirotor.yml} (94%) create mode 100644 sdcard/c480x272/TEMPLATES/1.Wizard/about.txt rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/background.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/glider/brake.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/glider/flap.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/glider/glider.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/glider/lail.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/glider/prop.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/glider/rail.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/glider/tail.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/glider/tail_rud.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/glider/vtail.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/helicopter/aileron.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/helicopter/curve.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/helicopter/elevator.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/helicopter/pitch.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/helicopter/rudder.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/helicopter/style.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/helicopter/switch.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/helicopter/throttle.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/helicopter/type.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/mark_bg.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/multirotor/arm.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/multirotor/beeper.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/multirotor/mode.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/multirotor/pitch.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/multirotor/roll.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/multirotor/throttle.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/multirotor/yaw.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/pagedn.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/pageup.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/plane/_vtail.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/plane/flap.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/plane/lail.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/plane/plane.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/plane/prop.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/plane/rail.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/plane/tail.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/plane/tail_rud.png (100%) rename sdcard/c480x272/{SCRIPTS/WIZARD => TEMPLATES/1.Wizard}/img/summary.png (100%) create mode 100644 sdcard/c480x272/TEMPLATES/1.Wizard/img/wing/lail.png create mode 100644 sdcard/c480x272/TEMPLATES/1.Wizard/img/wing/plane.png create mode 100644 sdcard/c480x272/TEMPLATES/1.Wizard/img/wing/prop.png create mode 100644 sdcard/c480x272/TEMPLATES/1.Wizard/img/wing/rail.png rename sdcard/c480x272/TEMPLATES/{PERSONAL => 2.Personal}/about.txt (100%) rename sdcard/c480x272/TEMPLATES/{SoarETX => 3.SoarETX}/F3K RE.txt (100%) rename sdcard/c480x272/TEMPLATES/{SoarETX => 3.SoarETX}/F3K RE.yml (100%) rename sdcard/c480x272/TEMPLATES/{SoarETX => 3.SoarETX}/F3K TRAD.txt (100%) rename sdcard/c480x272/TEMPLATES/{SoarETX => 3.SoarETX}/F3K TRAD.yml (94%) rename sdcard/c480x272/TEMPLATES/{SoarETX => 3.SoarETX}/F3K-TRAD.yml (100%) rename sdcard/c480x272/TEMPLATES/{SoarETX => 3.SoarETX}/F3K.txt (99%) rename sdcard/c480x272/TEMPLATES/{SoarETX => 3.SoarETX}/F3K.yml (100%) rename sdcard/c480x272/TEMPLATES/{SoarETX => 3.SoarETX}/about.txt (98%) delete mode 100644 sdcard/c480x272/TEMPLATES/WIZARD/Glider.lua delete mode 100644 sdcard/c480x272/TEMPLATES/WIZARD/Helicopter.lua delete mode 100644 sdcard/c480x272/TEMPLATES/WIZARD/Multirotor.lua delete mode 100644 sdcard/c480x272/TEMPLATES/WIZARD/Plane.lua delete mode 100644 sdcard/c480x272/TEMPLATES/WIZARD/Plane.yml delete mode 100644 sdcard/c480x272/TEMPLATES/WIZARD/about.txt diff --git a/.gitignore b/.gitignore index 0a934176..dde1d673 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ region log-* exception* **/*.luac +/.idea/ diff --git a/sdcard/c480x272/SCRIPTS/TOOLS/WizardLoader.lua b/sdcard/c480x272/SCRIPTS/TOOLS/WizardLoader.lua deleted file mode 100644 index 5a869805..00000000 --- a/sdcard/c480x272/SCRIPTS/TOOLS/WizardLoader.lua +++ /dev/null @@ -1,109 +0,0 @@ -local toolName = "TNS|Wizard Loader|TNE" - -local BackgroundImg = Bitmap.open("/SCRIPTS/WIZARD/img/background.png") -local planeIcon = Bitmap.open("/SCRIPTS/WIZARD/img/icons/plane.png") -local gliderIcon = Bitmap.open("/SCRIPTS/WIZARD/img/icons/glider.png") -local multirotorIcon = Bitmap.open("/SCRIPTS/WIZARD/img/icons/multirotor.png") -local helicopterIcon = Bitmap.open("/SCRIPTS/WIZARD/img/icons/helicopter.png") - -local w, h -local selWizard = 1 -local numOfWizards = 4 - -local iconWidth = 85 -local iconHeight = 130 -local margin = 40 - -local iconX = {38, 140, 242, 344} -local iconY = {100, 100, 100,100} - -local touchX -local touchY - -local function drawPage() - lcd.clear() - lcd.drawBitmap(BackgroundImg, 0, 0) - - lcd.drawFilledRectangle(70, 20, 350, 40, WHITE, 50) - lcd.drawText(240, 20, "Choose Wizard to run...", CENTER + DBLSIZE + BLACK) - - lcd.drawBitmap(planeIcon, iconX[1], iconY[1]) - lcd.drawBitmap(gliderIcon, iconX[2], iconY[2]) - lcd.drawBitmap(multirotorIcon, iconX[3], iconY[3]) - lcd.drawBitmap(helicopterIcon, iconX[4], iconY[4]) - - lcd.drawRectangle(iconX[selWizard] - 2, iconY[selWizard] - 1, iconWidth + 4, - iconHeight + 4, RED, 2) -end - -local function launchWizard() - -- print(selWizard) - chdir("/SCRIPTS/WIZARD") - if (selWizard == 1) then - return "/SCRIPTS/WIZARD/plane.lua" - elseif (selWizard == 2) then - return "/SCRIPTS/WIZARD/glider.lua" - elseif (selWizard == 3) then - return "/SCRIPTS/WIZARD/multirotor.lua" - elseif (selWizard == 4) then - return "/SCRIPTS/WIZARD/helicopter.lua" - end -end - -local function init() selWizard = 1 end - -local function run(event, touchState) - drawPage() - - if (event == nil) then - error("Cannot be run as a model script!") - return 2 - elseif (event == EVT_VIRTUAL_NEXT) or (event == EVT_VIRTUAL_NEXT_PAGE) then - selWizard = selWizard + 1 - if (selWizard > numOfWizards) then - selWizard = 1 - elseif (selWizard < 1) then - selWizard = numOfWizards - end - elseif (event == EVT_VIRTUAL_PREV) or (event == EVT_VIRTUAL_PREV_PAGE) then - selWizard = selWizard - 1 - if (selWizard > numOfWizards) then - selWizard = 1 - elseif (selWizard < 1) then - selWizard = numOfWizards - end - elseif (event == EVT_VIRTUAL_ENTER) or (event == EVT_VIRTUAL_ENTER_LONG) then - return launchWizard() - elseif (event == EVT_TOUCH_BREAK) or (event == EVT_TOUCH_TAP) then - touchX = touchState.x - touchY = touchState.y - if (touchX > iconX[1]) and (touchX < (iconX[1] + iconWidth)) then - if (touchY > iconY[1]) and (touchY < (iconY[1] + iconHeight)) then - selWizard = 1 - return launchWizard() - end - elseif (touchX > iconX[2]) and (touchX < (iconX[2] + iconWidth)) then - if (touchY > iconY[2]) and (touchY < (iconY[2] + iconHeight)) then - selWizard = 2 - return launchWizard() - end - elseif (touchX > iconX[3]) and (touchX < (iconX[3] + iconWidth)) then - if (touchY > iconY[3]) and (touchY < (iconY[3] + iconHeight)) then - selWizard = 3 - return launchWizard() - end - elseif (touchX > iconX[4]) and (touchX < (iconX[4] + iconWidth)) then - if (touchY > iconY[4]) and (touchY < (iconY[4] + iconHeight)) then - selWizard = 4 - return launchWizard() - end - end - elseif (event == EVT_MENU_LONG) then - -- exit script - return 2 - end - - return 0 -end - -return {init = init, run = run} diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/icons/glider.png b/sdcard/c480x272/SCRIPTS/WIZARD/img/icons/glider.png deleted file mode 100644 index 6869f18e9c373146ef3dbc24d78887e750907148..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6681 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 A`v3p{ diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/icons/multirotor.png b/sdcard/c480x272/SCRIPTS/WIZARD/img/icons/multirotor.png deleted file mode 100644 index b6b7370479181571318473293047fa26ca170d63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8087 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 diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/icons/plane.png b/sdcard/c480x272/SCRIPTS/WIZARD/img/icons/plane.png deleted file mode 100644 index 2deea1d9aa50a66370454a9d0cdc7d890d4424ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7207 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 diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/plane.lua b/sdcard/c480x272/SCRIPTS/WIZARD/plane.lua deleted file mode 100644 index 8c02553a..00000000 --- a/sdcard/c480x272/SCRIPTS/WIZARD/plane.lua +++ /dev/null @@ -1,478 +0,0 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) OpenTX # ------# # ----- # 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. # ----- # # ----- ######################################################################### -local VALUE = 0 -local COMBO = 1 - -local edit = false -local page = 1 -local current = 1 -local pages = {} -local fields = {} - --- load common Bitmaps -local ImgMarkBg = Bitmap.open("img/mark_bg.png") -local BackgroundImg = Bitmap.open("img/background.png") -local ImgPlane = Bitmap.open("img/plane/plane.png") -local ImgPageUp = Bitmap.open("img/pageup.png") -local ImgPageDn = Bitmap.open("img/pagedn.png") - - --- Change display attribute to current field -local function addField(step) - local field = fields[current] - local min, max - if field[3] == VALUE then - min = field[6] - max = field[7] - elseif field[3] == COMBO then - min = 0 - max = #(field[6]) - 1 - end - if (step < 0 and field[5] > min) or (step > 0 and field[5] < max) then - field[5] = field[5] + step - end -end - --- Select the next or previous page -local function selectPage(step) - page = 1 + ((page + step - 1 + #pages) % #pages) - edit = false - current = 1 -end - --- Select the next or previous editable field -local function selectField(step) - repeat - current = 1 + ((current + step - 1 + #fields) % #fields) - until fields[current][4]==1 -end - --- Redraw the current page -local function redrawFieldsPage(event) - - for index = 1, 10, 1 do - local field = fields[index] - if field == nil then - break - end - - local attr = current == (index) and ((edit == true and BLINK or 0) + INVERS) or 0 - attr = attr + COLOR_THEME_PRIMARY1 - - if field[4] == 1 then - if field[3] == VALUE then - lcd.drawNumber(field[1], field[2], field[5], LEFT + attr) - elseif field[3] == COMBO then - if field[5] >= 0 and field[5] < #(field[6]) then - lcd.drawText(field[1],field[2], field[6][1+field[5]], attr) - end - end - end - end -end - -local function updateField(field) - local value = field[5] -end - --- Main -local function runFieldsPage(event) - if event == EVT_VIRTUAL_EXIT then -- exit script - return 2 - elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field - if fields[current][5] ~= nil then - edit = not edit - if edit == false then - updateField(fields[current]) - end - end - elseif edit then - if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then - addField(1) - elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then - addField(-1) - end - else - if event == EVT_VIRTUAL_NEXT then - selectField(1) - elseif event == EVT_VIRTUAL_PREV then - selectField(-1) - end - end - redrawFieldsPage(event) - return 0 -end - --- set visibility flags starting with SECOND field of fields -local function setFieldsVisible(...) - local arg={...} - local cnt = 2 - for i,v in ipairs(arg) do - fields[cnt][4] = v - cnt = cnt + 1 - end -end - --- draws one letter mark -local function drawMark(x, y, name) - lcd.drawBitmap(ImgMarkBg, x, y) - lcd.drawText(x+8, y+3, name, COLOR_THEME_PRIMARY1) -end - - -local MotorFields = { - {50, 50, COMBO, 1, 1, { "No", "Yes"} }, - {50, 127, COMBO, 1, defaultChannel(2), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local ImgEngine - -local function runMotorConfig(event) - lcd.clear() - if ImgEngine == nil then - ImgEngine = Bitmap.open("img/plane/prop.png") - end - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageDn, 455, 95) - lcd.drawBitmap(ImgEngine, 310, 50) - fields = MotorFields - lcd.drawText(40, 20, "Does your model have a motor ?", COLOR_THEME_PRIMARY1) - lcd.drawFilledRectangle(40, 45, 200, 30, TEXT_BGCOLOR) - fields[2][4]=0 - if fields[1][5] == 1 then - lcd.drawText(40, 100, "What channel is it on ?", COLOR_THEME_PRIMARY1) - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - fields[2][4]=1 - end - local result = runFieldsPage(event) - return result -end - --- fields format : {[1]x, [2]y, [3]COMBO, [4]visible, [5]default, [6]{values}} --- fields format : {[1]x, [2]y, [3]VALUE, [4]visible, [5]default, [6]min, [7]max} -local AilFields = { - {50, 50, COMBO, 1, 2, { "None", "One, or two with Y cable", "Two"} }, - {50, 127, COMBO, 1, defaultChannel(3), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -- Ail1 chan - {50, 167, COMBO, 1, 4, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -- Ail2 chan -} - -local ImgAilR -local ImgAilL - -local function runAilConfig(event) - lcd.clear() - if ImgAilR == nil then - ImgAilR = Bitmap.open("img/plane/rail.png") - ImgAilL = Bitmap.open("img/plane/lail.png") - end - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - lcd.drawBitmap(ImgPlane, 252, 100) - fields = AilFields - if fields[1][5] == 1 then - lcd.drawBitmap(ImgAilR, 324, 123) - lcd.drawBitmap(ImgAilL, 275, 210) - drawMark(362, 132, "A") - drawMark(302, 227, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - setFieldsVisible(1, 0) - elseif fields[1][5] == 2 then - lcd.drawBitmap(ImgAilR, 324, 123) - lcd.drawBitmap(ImgAilL, 275, 210) - drawMark(362, 132, "A") - drawMark(302, 227, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) - drawMark(152, 164, "B") - setFieldsVisible(1, 1) - else - setFieldsVisible(0, 0) - end - lcd.drawText(40, 20, "Number of ailerons on your model ?", COLOR_THEME_PRIMARY1) - lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) - local result = runFieldsPage(event) - return result -end - -local FlapsFields = { - {50, 50, COMBO, 1, 0, { "No", "Yes, on one channel", "Yes, on two channels"} }, - {50, 127, COMBO, 1, 6, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, - {50, 167, COMBO, 1, 7, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local ImgFlp - -local function runFlapsConfig(event) - lcd.clear() - if ImgFlp == nil then - ImgFlp = Bitmap.open("img/plane/flap.png") - end - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - lcd.drawBitmap(ImgPlane, 252, 100) - fields = FlapsFields - if fields[1][5] == 1 then - lcd.drawBitmap(ImgFlp, 315, 143) - lcd.drawBitmap(ImgFlp, 285, 191) - drawMark(362, 132, "A") - drawMark(302, 227, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - setFieldsVisible(1, 0) - elseif fields[1][5] == 2 then - lcd.drawBitmap(ImgFlp, 315, 143) - lcd.drawBitmap(ImgFlp, 285, 191) - drawMark(362, 132, "A") - drawMark(302, 227, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) - drawMark(152, 164, "B") - setFieldsVisible(1, 1) - else - setFieldsVisible(0, 0) - end - lcd.drawText(40, 20, "Does your model have flaps ?", COLOR_THEME_PRIMARY1) - lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) - local result = runFieldsPage(event) - return result -end - -local TailFields = { - {50, 50, COMBO, 1, 1, { "1 channel for Elevator, no Rudder", "One channel for Elevator, one for Rudder", "Two channels for Elevator, one for Rudder", "V Tail"} }, - {50, 127, COMBO, 1, defaultChannel(1), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, --ele - {50, 167, COMBO, 1, defaultChannel(0), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, --rud - {50, 207, COMBO, 0, 5, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, --ele2 -} - -local ImgTail -local ImgVTail -local ImgTailRud - -local function runTailConfig(event) - lcd.clear() - if ImgTail == nil then - ImgTail = Bitmap.open("img/plane/tail.png") - ImgVTail = Bitmap.open("img/plane/vtail.png") - ImgTailRud = Bitmap.open("img/plane/tail_rud.png") - end - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = TailFields - if fields[1][5] == 0 then - lcd.drawBitmap(ImgTail, 252, 100) - drawMark(275, 120, "A") - drawMark(390, 155, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - setFieldsVisible(1, 0, 0) - end - if fields[1][5] == 1 then - lcd.drawBitmap(ImgTail, 252, 100) - lcd.drawBitmap(ImgTailRud, 340, 100) - drawMark(275, 120, "A") - drawMark(390, 155, "A") - drawMark(370, 112, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) - drawMark(152, 164, "B") - setFieldsVisible(1, 1, 0) - end - if fields[1][5] == 2 then - lcd.drawBitmap(ImgTail, 252, 100) - lcd.drawBitmap(ImgTailRud, 340, 100) - drawMark(275, 120, "A") - drawMark(390, 155, "C") - drawMark(370, 112, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) - drawMark(152, 164, "B") - lcd.drawFilledRectangle(40, 202, 100, 30, TEXT_BGCOLOR) - drawMark(152, 204, "C") - setFieldsVisible(1, 1, 1) - end - if fields[1][5] == 3 then - lcd.drawBitmap(ImgVTail, 252, 100) - drawMark(315, 110, "A") - drawMark(382, 120, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) - drawMark(152, 164, "B") - setFieldsVisible(1, 1, 0) - end - lcd.drawText(40, 20, "Pick the tail config of your model", COLOR_THEME_PRIMARY1) - lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) - local result = runFieldsPage(event) - return result -end - -local lineIndex -local function drawNextLine(text, text2) - lcd.drawText(40, lineIndex, text, COLOR_THEME_PRIMARY1) - lcd.drawText(242, lineIndex, ": CH" .. text2 + 1, COLOR_THEME_PRIMARY1) - lineIndex = lineIndex + 20 -end - -local ConfigSummaryFields = { - {110, 250, COMBO, 1, 0, { "No, I need to change something", "Yes, all is well, create the plane !"} }, -} - -local ImgSummary - -local function runConfigSummary(event) - lcd.clear() - if ImgSummary == nil then - ImgSummary = Bitmap.open("img/summary.png") - end - fields = ConfigSummaryFields - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgSummary, 300, 60) - lineIndex = 40 - -- motors - if(MotorFields[1][5] == 1) then - drawNextLine("Motor channel", MotorFields[2][5]) - end - -- ail - if(AilFields[1][5] == 1) then - drawNextLine("Aileron channel",AilFields[2][5]) - elseif (AilFields[1][5] == 2) then - drawNextLine("Aileron Right channel",AilFields[2][5]) - drawNextLine("Aileron Left channel",AilFields[3][5]) - end - -- flaps - if(FlapsFields[1][5] == 1) then - drawNextLine("Flaps channel",FlapsFields[2][5]) - elseif (FlapsFields[1][5] == 2) then - drawNextLine("Flaps Right channel",FlapsFields[2][5]) - drawNextLine("Flaps Left channel",FlapsFields[3][5]) - end - -- tail - if(TailFields[1][5] == 0) then - drawNextLine("Elevator channel",TailFields[2][5]) - elseif (TailFields[1][5] == 1) then - drawNextLine("Elevator channel",TailFields[2][5]) - drawNextLine("Rudder channel",TailFields[3][5]) - elseif (TailFields[1][5] == 2) then - drawNextLine("Elevator Right channel",TailFields[2][5]) - drawNextLine("Rudder channel",TailFields[3][5]) - drawNextLine("Elevator Left channel",TailFields[4][5]) - elseif (TailFields[1][5] == 3) then - drawNextLine("V-Tail Right", TailFields[2][5]) - drawNextLine("V-Tail Left", TailFields[3][5]) - end - local result = runFieldsPage(event) - if(fields[1][5] == 1 and edit == false) then - selectPage(1) - end - return result -end - -local function addMix(channel, input, name, weight, index) - local mix = { source=input, name=name } - if weight ~= nil then - mix.weight = weight - end - if index == nil then - index = 0 - end - model.insertMix(channel, index, mix) -end - -local function createModel(event) - lcd.clear() - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgSummary, 300, 60) - model.defaultInputs() - model.deleteMixes() - -- motor - if(MotorFields[1][5] == 1) then - addMix(MotorFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Motor") - end - -- Ailerons - if(AilFields[1][5] == 1) then - addMix(AilFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "Ail") - elseif (AilFields[1][5] == 2) then - addMix(AilFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "AilR") - addMix(AilFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "AilL", -100) - end - -- Flaps - if(FlapsFields[1][5] == 1) then - addMix(FlapsFields[2][5], MIXSRC_SA, "Flaps") - elseif (FlapsFields[1][5] == 2) then - addMix(FlapsFields[2][5], MIXSRC_SA, "FlapsR") - addMix(FlapsFields[3][5], MIXSRC_SA, "FlapsL") - end - -- Tail - if(TailFields[1][5] == 0) then - addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev") - elseif (TailFields[1][5] == 1) then - addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev") - addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "Rudder") - elseif (TailFields[1][5] == 2) then - addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevR") - addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "Rudder") - addMix(TailFields[4][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevL") - elseif (TailFields[1][5] == 3) then - addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "V-EleR", 50) - addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "V-RudR", 50, 1) - addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "V-EleL", 50) - addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "V-RudL", -50, 1) - end - lcd.drawText(70, 90, "Model successfully created !", COLOR_THEME_PRIMARY1) - lcd.drawText(100, 130, "Press RTN to exit", COLOR_THEME_PRIMARY1) - return 2 -end - --- Init -local function init() - current, edit = 1, false - pages = { - runMotorConfig, - runAilConfig, - runFlapsConfig, - runTailConfig, - runConfigSummary, - createModel, - } -end - --- Main -local function run(event) - if event == nil then - error("Cannot be run as a model script!") - return 2 - elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages-1 then - selectPage(1) - elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then - killEvents(event); - selectPage(-1) - end - - local result = pages[page](event) - return result -end - -return { init=init, run=run } diff --git a/sdcard/c480x272/TEMPLATES/1.Wizard/1.Plane.lua b/sdcard/c480x272/TEMPLATES/1.Wizard/1.Plane.lua new file mode 100644 index 00000000..1407936f --- /dev/null +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/1.Plane.lua @@ -0,0 +1,808 @@ +---- ######################################################################### +---- # # +---- # Copyright (C) OpenTX # +---- # # +---- # 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. # +---- # # +---- ######################################################################### + +-- Author: 3djc (2017) +-- Update by: Offer Shmuely (2023) +-- version: 2.0 + +local VALUE = 0 +local COMBO = 1 +local HEADER = 2 + +local is_edit = false +local page = 1 +local current = 1 +local pages = {} + +chdir("/TEMPLATES/1.Wizard") + +-- load common Bitmaps +local ImgMarkBg = Bitmap.open("img/mark_bg.png") +local BackgroundImg = Bitmap.open("img/background.png") +local ImgPlane = Bitmap.open("img/plane/plane.png") +local ImgPageUp = Bitmap.open("img/pageup.png") +local ImgPageDn = Bitmap.open("img/pagedn.png") + +local STICK_NUMBER_AIL = 3 +local STICK_NUMBER_ELE = 1 +local STICK_NUMBER_THR = 2 +local STICK_NUMBER_RUD = 0 + +local defaultChannel_AIL = defaultChannel(STICK_NUMBER_AIL) + 1 +local defaultChannel_ELE = defaultChannel(STICK_NUMBER_ELE) + 1 +local defaultChannel_THR = defaultChannel(STICK_NUMBER_THR) + 1 +local defaultChannel_RUD = defaultChannel(STICK_NUMBER_RUD) + 1 + +local defaultChannel_0_AIL = defaultChannel(STICK_NUMBER_AIL) +local defaultChannel_0_ELE = defaultChannel(STICK_NUMBER_ELE) +local defaultChannel_0_THR = defaultChannel(STICK_NUMBER_THR) +local defaultChannel_0_RUD = defaultChannel(STICK_NUMBER_RUD) + + +-- Change display attribute to current field +local function addField(fields, step) + local field = fields[current] + local min, max + if field.type == VALUE then + min = field.min + max = field.max + elseif field.type == COMBO then + min = 0 + max = #(field.avail_values) - 1 + elseif field.type == HEADER then + min = 0 + max = 0 + end + if (step < 0 and field.value > min) or (step > 0 and field.value < max) then + field.value = field.value + step + end +end + +-- Select the next or previous page +local function selectPage(step) + if page == 1 and step < 0 then + return + end + page = 1 + ((page + step - 1 + #pages) % #pages) + is_edit = false + current = 1 + print(string.format("page: (%s)", page)) + +end + +-- Select the next or previous editable field +local function selectField(fields, step) + print(string.format("selectField-start: current: %s", current)) + repeat + print(string.format("selectField: current: %s (vis: %s)", current, fields[current].is_visible)) + current = 1 + ((current + step - 1 + #fields) % #fields) + if fields[current].type == HEADER then + current = 1 + ((current + step - 1 + #fields) % #fields) + end + + + + until fields[current].is_visible == 1 + print(string.format("selectField-end: current: %s", current)) +end + +-- better font names +local FONT_38 = XXLSIZE -- 38px +local FONT_16 = DBLSIZE -- 16px +local FONT_12 = MIDSIZE -- 12px +local FONT_8 = 0 -- Default 8px +local FONT_6 = SMLSIZE -- 6px + +local function lcdSizeTextFixed(txt, font_size) + local ts_w, ts_h = lcd.sizeText(txt, font_size) + + local v_offset = 0 + if font_size == FONT_38 then + v_offset = -11 + elseif font_size == FONT_16 then + v_offset = -5 + elseif font_size == FONT_12 then + v_offset = -4 + elseif font_size == FONT_8 then + v_offset = -3 + elseif font_size == FONT_6 then + v_offset = 0 + end + return ts_w, ts_h, v_offset +end + +local function drawBadgedText(txt, field, font_size, is_selected, is_edit) + local ts_w, ts_h, v_offset = lcdSizeTextFixed(txt, font_size) + ts_h = 10 + ts_h + v_offset * 2 + local r = ts_h / 2 + + if (field.w > 0) then + ts_w = field.w + else + if (ts_w < 30) then + ts_w = 30 + end + end + local bg_color = WHITE + if (is_selected) then + bg_color = GREEN + end + lcd.drawFilledCircle(field.x, field.y + r, r, bg_color) + lcd.drawFilledCircle(field.x + ts_w, field.y + r, r, bg_color) + lcd.drawFilledRectangle(field.x, field.y, ts_w, ts_h, bg_color) + local attr = 0 + if (is_selected and is_edit) then + attr = attr + BLINK + end + + lcd.drawText(field.x, field.y + v_offset + 5, txt, font_size + BLACK + attr) +end + + +-- Redraw the current page +local function redrawFieldsPage(fields, event) + for index = 1, 10, 1 do + local field = fields[index] + if field == nil then + break + end + + -- print(string.format("redrawFieldsPage [%s] field.x=%s, y=%s, is_visible=%s", field.id, field.x, field.y, field.is_visible)) + local attr = current == (index) and ((is_edit == true and BLINK or 0) + INVERS) or 0 + local is_selected = (current == (index)) + attr = attr + COLOR_THEME_PRIMARY1 + if field.is_visible == 1 then + if field.type == VALUE then + --lcd.drawNumber(field.x, field.y, field.value, LEFT + attr) + drawBadgedText(field.value, field, FONT_8, is_selected, is_edit) + elseif field.type == COMBO then + if field.value >= 0 and field.value < #(field.avail_values) then + --lcd.drawText(field.x, field.y, field.avail_values[1 + field.value], attr) + drawBadgedText(field.avail_values[1 + field.value], field, FONT_8, is_selected, is_edit) + end + elseif field.type == HEADER then + lcd.drawText(field.x, field.y, field.value, FONT_8 + BLACK + attr + BOLD) + end + end + end +end + +local function updateField(field) + local value = field.value +end + +-- Main +local function runFieldsPage(fields, event) + if event == EVT_VIRTUAL_EXIT then + -- exit script + return 2 + elseif event == EVT_VIRTUAL_ENTER then + -- toggle editing/selecting current field + if fields[current].value ~= nil then + is_edit = not is_edit + if is_edit == false then + updateField(fields[current]) + end + end + elseif is_edit then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then + addField(fields, 1) + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then + addField(fields, -1) + end + else + if event == EVT_VIRTUAL_NEXT then + selectField(fields, 1) + elseif event == EVT_VIRTUAL_PREV then + selectField(fields, -1) + end + end + redrawFieldsPage(fields, event) + return 0 +end + +-- set visibility flags starting with SECOND field of fields +local function setFieldsVisible(fields, ...) + local arg = { ... } + local cnt = 2 + for i, v in ipairs(arg) do + fields[cnt].is_visible = v + cnt = cnt + 1 + end +end + + +-- draws one letter mark +local function drawMark(x, y, name) + lcd.drawBitmap(ImgMarkBg, x, y) + lcd.drawText(x + 8, y + 3, name, COLOR_THEME_PRIMARY1) +end + +local function drawTitle(txt) + lcd.drawFilledRectangle(1, 1, 480, 35, LIGHTGREY) + lcd.drawText(150, 8, txt, COLOR_THEME_PRIMARY1) +end + +local MotorFields = { + is_motor = { id='is_motor' , x=170, y=50 , w=0, type=COMBO, is_visible=1, value=1 , avail_values={ "No", "Yes" } }, + motor_ch = { id='motor_ch' , x=170, y=90 , w=0, type=COMBO, is_visible=1, value=defaultChannel_0_THR, avail_values={ "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" } }, + is_arm = { id='is_arm' , x=170, y=130, w=0, type=COMBO, is_visible=1, value=1 , avail_values={ "No", "Yes" } }, + arm_switch = { id='arm_switch', x=230, y=130, w=0, type=COMBO, is_visible=1, value=5 , avail_values={ "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH" } }, + page = {} +} +MotorFields.page = { + MotorFields.is_motor, + MotorFields.motor_ch, + MotorFields.is_arm, + MotorFields.arm_switch +} + +local ImgEngine + +local function runMotorConfig(event) + lcd.clear() + if ImgEngine == nil then + ImgEngine = Bitmap.open("img/plane/prop.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageDn, 455, 95) + lcd.drawBitmap(ImgEngine, 310, 50) + + drawTitle("Motor Settings") + + lcd.drawText(40, MotorFields.is_motor.y, "Have a motor?", COLOR_THEME_PRIMARY1) + print(string.format("111=%s", MotorFields.is_motor.x)) + + MotorFields.motor_ch.is_visible = 0 + MotorFields.is_arm.is_visible = 0 + MotorFields.arm_switch.is_visible = 0 + if MotorFields.is_motor.value == 1 then + lcd.drawText(40, MotorFields.motor_ch.y, "Motor channel", COLOR_THEME_PRIMARY1) + MotorFields.motor_ch.is_visible = 1 + + lcd.drawText(40, MotorFields.is_arm.y, "Safety Switch", COLOR_THEME_PRIMARY1) + MotorFields.is_arm.is_visible = 1 + if MotorFields.is_arm.value == 1 then + MotorFields.arm_switch.is_visible = 1 + else + MotorFields.arm_switch.is_visible = 0 + end + end + + local result = runFieldsPage(MotorFields.page, event) + return result +end + +-- fields format : {[1]x, [2]y, [3]COMBO, [4]visible, [5]default, [6]{values}} +-- fields format : {[1]x, [2]y, [3]VALUE, [4]visible, [5]default, [6]min, [7]max} +local AilFields = { + ail_type = { id = 'ail_type', x = 50 , y = 70 , w = 200, type = COMBO, is_visible = 1, value = 2 , avail_values = { "None", "One (or two with Y cable)", "Two" } }, + ail_ch_a = { id = 'ail_ch_a', x = 100, y = 120, w = 0 , type = COMBO, is_visible = 1, value = defaultChannel_0_AIL, avail_values = { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" } }, -- Ail1 chan + ail_ch_b = { id = 'ail_ch_b', x = 100, y = 160, w = 0 , type = COMBO, is_visible = 1, value = 4 , avail_values = { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" } }, -- Ail2 chan + page = {} +} +AilFields.page = { + AilFields.ail_type, + AilFields.ail_ch_a, + AilFields.ail_ch_b, +} +local ImgAilR +local ImgAilL + +local function runAilConfig(event) + lcd.clear() + if ImgAilR == nil then + ImgAilR = Bitmap.open("img/plane/rail.png") + ImgAilL = Bitmap.open("img/plane/lail.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + lcd.drawBitmap(ImgPlane, 252, 100) + + drawTitle("Aileron Setup") + + if AilFields.ail_type.value == 1 then + lcd.drawBitmap(ImgAilR, 324, 123) + lcd.drawBitmap(ImgAilL, 275, 210) + drawMark(362, 132, "A") + drawMark(302, 227, "A") + drawMark(40, 120, "A") + setFieldsVisible(AilFields.page, 1, 0) + elseif AilFields.ail_type.value == 2 then + lcd.drawBitmap(ImgAilR, 324, 123) + lcd.drawBitmap(ImgAilL, 275, 210) + drawMark(362, 132, "A") + drawMark(302, 227, "B") + drawMark(40, 120, "A") + drawMark(40, 160, "B") + setFieldsVisible(AilFields.page, 1, 1) + else + setFieldsVisible(AilFields.page, 0, 0) + end + lcd.drawText(40, 40, "Number of ailerons on your model ?", COLOR_THEME_PRIMARY1) + local result = runFieldsPage(AilFields.page, event) + return result +end + +local FlapsFields = { + flap_type = { id = 'flap_type', x = 50 , y = 70 , w = 200, type = COMBO, is_visible = 1, value = 0 , avail_values = { "No", "Yes, on one channel", "Yes, on two channels" } }, + flap_ch_a = { id = 'flap_ch_a', x = 100, y = 120, w = 0 , type = COMBO, is_visible = 1, value = 8-1, avail_values = { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" } }, + flap_ch_b = { id = 'flap_ch_b', x = 100, y = 160, w = 0 , type = COMBO, is_visible = 1, value = 9-1, avail_values = { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" } }, +} +FlapsFields.page = { + FlapsFields.flap_type, + FlapsFields.flap_ch_a, + FlapsFields.flap_ch_b, +} + +local ImgFlp + +local function runFlapsConfig(event) + lcd.clear() + if ImgFlp == nil then + ImgFlp = Bitmap.open("img/plane/flap.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + lcd.drawBitmap(ImgPlane, 252, 100) + + drawTitle("Flaps") + + if FlapsFields.flap_type.value == 1 then + lcd.drawBitmap(ImgFlp, 315, 143) + lcd.drawBitmap(ImgFlp, 285, 191) + drawMark(362, 132, "A") + drawMark(302, 227, "A") + drawMark(40, FlapsFields.flap_ch_a.y, "A") + setFieldsVisible(FlapsFields.page, 1, 0) + elseif FlapsFields.flap_type.value == 2 then + lcd.drawBitmap(ImgFlp, 315, 143) + lcd.drawBitmap(ImgFlp, 285, 191) + drawMark(362, 132, "A") + drawMark(302, 227, "B") + drawMark(40, FlapsFields.flap_ch_a.y, "A") + drawMark(40, FlapsFields.flap_ch_b.y, "B") + setFieldsVisible(FlapsFields.page, 1, 1) + else + setFieldsVisible(FlapsFields.page, 0, 0) + end + lcd.drawText(40, 40, "Does your model have flaps ?", COLOR_THEME_PRIMARY1) + local result = runFieldsPage(FlapsFields.page, event) + return result +end + +local TailFields = { + tail_type = { id = 'tail_type', x = 60 , y = 65 , w = 0, type = COMBO, is_visible = 1, value = 1 , avail_values = { "1 channel for Elevator, no Rudder", "One channel for Elevator, one for Rudder", "Two channels for Elevator, one for Rudder", "V Tail" } }, + ch_a = { id = 'ch_a' , x = 100, y = 120, w = 0, type = COMBO, is_visible = 1, value = defaultChannel_0_ELE, avail_values = { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" } }, --ele + ch_b = { id = 'ch_b' , x = 100, y = 160, w = 0, type = COMBO, is_visible = 1, value = defaultChannel_0_RUD, avail_values = { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" } }, --rud + ch_c = { id = 'ch_c' , x = 100, y = 200, w = 0, type = COMBO, is_visible = 0, value = 6-1 , avail_values = { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" } }, --ele2 + page = {} +} +TailFields.page = { + TailFields.tail_type, + TailFields.ch_a, + TailFields.ch_b, + TailFields.ch_c, +} +local ImgTail +local ImgVTail +local ImgTailRud + +local function runTailConfig(event) + lcd.clear() + if ImgTail == nil then + ImgTail = Bitmap.open("img/plane/tail.png") + ImgVTail = Bitmap.open("img/plane/vtail.png") + ImgTailRud = Bitmap.open("img/plane/tail_rud.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + + drawTitle("Tail Configuration") + + if TailFields.tail_type.value == 0 then + lcd.drawBitmap(ImgTail, 252, 100) + drawMark(275, 120, "A") + drawMark(390, 155, "A") + drawMark(152, TailFields.ch_a.y, "A") + setFieldsVisible(TailFields.page, 1, 0, 0) + end + if TailFields.tail_type.value == 1 then + lcd.drawBitmap(ImgTail, 252, 100) + lcd.drawBitmap(ImgTailRud, 340, 100) + drawMark(275, 120, "A") + drawMark(390, 155, "A") + drawMark(370, 112, "B") + drawMark(40, TailFields.ch_a.y, "A") + drawMark(40, TailFields.ch_b.y, "B") + setFieldsVisible(TailFields.page, 1, 1, 0) + end + if TailFields.tail_type.value == 2 then + lcd.drawBitmap(ImgTail, 252, 100) + lcd.drawBitmap(ImgTailRud, 340, 100) + drawMark(275, 120, "A") + drawMark(390, 155, "C") + drawMark(370, 112, "B") + drawMark(40, TailFields.ch_a.y, "A") + drawMark(40, TailFields.ch_b.y, "B") + drawMark(40, TailFields.ch_c.y, "C") + setFieldsVisible(TailFields.page, 1, 1, 1) + end + if TailFields.tail_type.value == 3 then + lcd.drawBitmap(ImgVTail, 252, 100) + drawMark(315, 110, "A") + drawMark(382, 120, "B") + drawMark(40, TailFields.ch_a.y, "A") + drawMark(40, TailFields.ch_b.y, "B") + setFieldsVisible(TailFields.page, 1, 1, 0) + end + lcd.drawText(40, 40, "Pick the tail configuration", COLOR_THEME_PRIMARY1) + + local result = runFieldsPage(TailFields.page, event) + return result +end + +local GearFields = { + is_gear = { id = 'is_gear', x = 170, y = 100, w = 0, type = COMBO, is_visible = 1, value = 0 , avail_values = { "No", "Yes" } }, + switch = { id = 'switch' , x = 170, y = 140, w = 0, type = COMBO, is_visible = 1, value = 3 , avail_values = { "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH" } }, + channel = { id = 'channel', x = 170, y = 180, w = 0, type = COMBO, is_visible = 1, value = 7-1, avail_values = { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" } }, --ele + page = {} +} +GearFields.page = { + GearFields.is_gear, + GearFields.switch, + GearFields.channel, +} + +local ImgFlp + +local function runGearConfig(event) + lcd.clear() + if ImgFlp == nil then + ImgFlp = Bitmap.open("img/plane/flap.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + lcd.drawBitmap(ImgPlane, 252, 100) + + drawTitle("Landing Gear") + + lcd.drawText(40, 50, "Does your model have retract Landing gears?", COLOR_THEME_PRIMARY1) + + lcd.drawText(40, GearFields.is_gear.y, "Retracts Gear?", COLOR_THEME_PRIMARY1) + if GearFields.is_gear.value == 1 then + lcd.drawText(40, GearFields.switch.y, "Retracts Switch", COLOR_THEME_PRIMARY1) + GearFields.switch.is_visible = 1 + GearFields.channel.is_visible = 1 + else + GearFields.switch.is_visible = 0 + GearFields.channel.is_visible = 0 + end + + local result = runFieldsPage(GearFields.page, event) + return result +end + +local AdditionalSettingsFields = { + --{ 170, 52, VALUE, 1, 30, 0, 100 }, -- model name + expo = { id = 'expo' , x = 140, y = 60 , w = 0, type = VALUE, is_visible = 1, value = 30, min = 0, max = 100 }, -- expo + is_dual_rate = { id = 'is_dual_rate', x = 140, y = 100, w = 0, type = COMBO, is_visible = 1, value = 1 , avail_values = { "No", "Yes" } }, + dr_switch = { id = 'dr_switch' , x = 270, y = 100, w = 0, type = COMBO, is_visible = 1, value = 2, avail_values = { "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH" } }, + page = {} +} +AdditionalSettingsFields.page = { + AdditionalSettingsFields.expo, + AdditionalSettingsFields.is_dual_rate, + AdditionalSettingsFields.dr_switch, +} +local function runAdditionalSettings(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + + drawTitle("Additional Settings") + + lcd.drawText(40, AdditionalSettingsFields.expo.y, "Expo", COLOR_THEME_PRIMARY1) + + lcd.drawText(40, AdditionalSettingsFields.is_dual_rate.y, "Dual-Rate?", COLOR_THEME_PRIMARY1) + if AdditionalSettingsFields.is_dual_rate.value == 1 then + lcd.drawText(205, AdditionalSettingsFields.is_dual_rate.y, "Switch", COLOR_THEME_PRIMARY1) + AdditionalSettingsFields.dr_switch.is_visible = 1 + else + AdditionalSettingsFields.dr_switch.is_visible = 0 + end + + local result = runFieldsPage(AdditionalSettingsFields.page, event) + return result +end + +local lineIndex +local function drawNextLine(text, chNum, text2) + lcd.drawText(40, lineIndex, text, COLOR_THEME_PRIMARY1) + if chNum ~= nil then + lcd.drawText(242, lineIndex, ": CH" .. chNum + 1, COLOR_THEME_PRIMARY1) + else + lcd.drawText(242, lineIndex, ": " .. text2, COLOR_THEME_PRIMARY1) + end + lineIndex = lineIndex + 20 +end + +local ConfigSummaryFields = { + ack = { id = 'ack', x = 110, y = 250, w = 0, type = COMBO, is_visible = 1, value = 0, avail_values = { "No, I need to change something", "Yes, all is well, create the plane !" } }, +} +ConfigSummaryFields.page = { + ConfigSummaryFields.ack +} + +local ImgSummary + +local function runConfigSummary(event) + lcd.clear() + if ImgSummary == nil then + ImgSummary = Bitmap.open("img/summary.png") + end + + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgSummary, 300, 60) + + drawTitle("Config Summary") + + lineIndex = 40 + + -- motors + if (MotorFields.is_motor.value == 1) then + drawNextLine("Motor channel", MotorFields.motor_ch.value) + end + -- ail + if (AilFields.ail_type.value == 1) then + drawNextLine("Aileron channel", AilFields.ail_ch_a.value) + elseif (AilFields.ail_type.value == 2) then + drawNextLine("Aileron Right channel", AilFields.ail_ch_a.value) + drawNextLine("Aileron Left channel", AilFields.ail_ch_b.value) + end + -- flaps + if (FlapsFields.flap_type.value == 1) then + drawNextLine("Flaps channel", FlapsFields.flap_ch_a.value) + elseif (FlapsFields.flap_type.value == 2) then + drawNextLine("Flaps Right channel", FlapsFields.flap_ch_a.value) + drawNextLine("Flaps Left channel", FlapsFields.flap_ch_b.value) + end + -- tail + if (TailFields.tail_type.value == 0) then + drawNextLine("Elevator channel", TailFields.ch_a.value) + elseif (TailFields.tail_type.value == 1) then + drawNextLine("Elevator channel", TailFields.ch_a.value) + drawNextLine("Rudder channel", TailFields.ch_b.value) + elseif (TailFields.tail_type.value == 2) then + drawNextLine("Elevator Right channel", TailFields.ch_a.value) + drawNextLine("Rudder channel", TailFields.ch_b.value) + drawNextLine("Elevator Left channel", TailFields.ch_c.value) + elseif (TailFields.tail_type.value == 3) then + drawNextLine("V-Tail Right", TailFields.ch_a.value) + drawNextLine("V-Tail Left", TailFields.ch_b.value) + end + + -- retracts + if (GearFields.is_gear.value == 1) then + local switchName = GearFields.switch.avail_values[1 + GearFields.switch.value] + drawNextLine("Gear Switch", nil, switchName) + drawNextLine("Gear Channel", GearFields.channel.value) + + else + drawNextLine("Gear Switch", nil, "None") + drawNextLine("Gear Channel", nil, "None") + end + + -- expo + drawNextLine("Dual Rate", nil, AdditionalSettingsFields.is_dual_rate.avail_values[1 + AdditionalSettingsFields.is_dual_rate.value]) + drawNextLine("Expo", nil, AdditionalSettingsFields.expo.value) + + -- arm switch + if (MotorFields.is_arm.value == 1) then + local switchName = MotorFields.arm_switch.avail_values[1 + MotorFields.arm_switch.value] + drawNextLine("Arm switch", nil, switchName) + end + + local result = runFieldsPage(ConfigSummaryFields.page, event) + + if (ConfigSummaryFields.ack.value == 1 and is_edit == false) then + selectPage(1) + end + return result +end + +local function addMix(channel, input, name, weight, index) + local mix = { + source = input, + name = name, + --carryTrim= 0 -- 0=on + --trimSource= 0 -- 0=on + } + if weight ~= nil then + mix.weight = weight + end + if index == nil then + index = 0 + end + model.insertMix(channel, index, mix) +end + +local function updateInputLine(channel, lineNo, expoWeight, weight, switch_name_position) + local inInfo = model.getInput(channel, 0) + + -- expo + inInfo.curveType = 1 + inInfo.curveValue = expoWeight + inInfo.weight = weight + inInfo.trimSource = 0 -- 0=on + if (switch_name_position ~= nil) then + local switchIndex = getSwitchIndex(switch_name_position) + inInfo.switch = switchIndex + end + + -- delete the old line + model.deleteInput(channel, lineNo) + model.insertInput(channel, lineNo, inInfo) +end + +local function createModel(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgSummary, 300, 60) + model.defaultInputs() + model.deleteMixes() + + -- input lines + local expoVal = AdditionalSettingsFields.expo.value + local is_dual_rate = (AdditionalSettingsFields.is_dual_rate.value == 1) + if (is_dual_rate) then + updateInputLine(defaultChannel_0_AIL, 0, expoVal, 100, "SC" .. CHAR_UP) + updateInputLine(defaultChannel_0_AIL, 1, expoVal, 75 , "SC-") + updateInputLine(defaultChannel_0_AIL, 2, expoVal, 50 , "SC" .. CHAR_DOWN) + + updateInputLine(defaultChannel_0_ELE, 0, expoVal, 100, "SC" .. CHAR_UP) + updateInputLine(defaultChannel_0_ELE, 1, expoVal, 75 , "SC-") + updateInputLine(defaultChannel_0_ELE, 2, expoVal, 50 , "SC" .. CHAR_DOWN) + + updateInputLine(defaultChannel_0_RUD, 0, expoVal, 100, nil) + else + updateInputLine(defaultChannel_0_AIL, 0, expoVal, 100, nil) + updateInputLine(defaultChannel_0_ELE, 0, expoVal, 100, nil) + updateInputLine(defaultChannel_0_RUD, 0, expoVal, 100, nil) + end + + + + -- motor + if (MotorFields.is_motor.value == 1) then + addMix(MotorFields.motor_ch.value, MIXSRC_FIRST_INPUT + defaultChannel_0_THR, "Motor") + end + + -- Ailerons + if (AilFields.ail_type.value == 1) then + addMix(AilFields.ail_ch_a.value, MIXSRC_FIRST_INPUT + defaultChannel_0_AIL, "Ail") + elseif (AilFields.ail_type.value == 2) then + addMix(AilFields.ail_ch_a.value, MIXSRC_FIRST_INPUT + defaultChannel_0_AIL, "Ail-R") + addMix(AilFields.ail_ch_b.value, MIXSRC_FIRST_INPUT + defaultChannel_0_AIL, "Ail-L", -100) + end + -- Flaps + if (FlapsFields.flap_type.value == 1) then + addMix(FlapsFields.flap_ch_a.value, MIXSRC_SA, "Flaps") + elseif (FlapsFields.flap_type.value == 2) then + addMix(FlapsFields.flap_ch_a.value, MIXSRC_SA, "FlapsR") + addMix(FlapsFields.flap_ch_b.value, MIXSRC_SA, "FlapsL") + end + -- Tail + if (TailFields.tail_type.value == 0) then + addMix(TailFields.ch_a.value, MIXSRC_FIRST_INPUT + defaultChannel(1), "Elev") + elseif (TailFields.tail_type.value == 1) then + addMix(TailFields.ch_a.value, MIXSRC_FIRST_INPUT + defaultChannel(1), "Elev") + addMix(TailFields.ch_b.value, MIXSRC_FIRST_INPUT + defaultChannel(0), "Rudder") + elseif (TailFields.tail_type.value == 2) then + addMix(TailFields.ch_a.value, MIXSRC_FIRST_INPUT + defaultChannel(1), "Elev-R") + addMix(TailFields.ch_b.value, MIXSRC_FIRST_INPUT + defaultChannel(0), "Rudder") + addMix(TailFields.ch_c.value, MIXSRC_FIRST_INPUT + defaultChannel(1), "Elev-L") + elseif (TailFields.tail_type.value == 3) then + addMix(TailFields.ch_a.value, MIXSRC_FIRST_INPUT + defaultChannel(1), "V-EleR", 50) + addMix(TailFields.ch_a.value, MIXSRC_FIRST_INPUT + defaultChannel(0), "V-RudR", 50, 1) + addMix(TailFields.ch_b.value, MIXSRC_FIRST_INPUT + defaultChannel(1), "V-EleL", 50) + addMix(TailFields.ch_b.value, MIXSRC_FIRST_INPUT + defaultChannel(0), "V-RudL", -50, 1) + end + + -- retracts + if (GearFields.is_gear.value == 1) then + local switchIndex = MIXSRC_SA + GearFields.switch.value + addMix(GearFields.channel.value, switchIndex, "Gear", 100, 0) + end + + -- special function for arm switch + local switchName = MotorFields.arm_switch.avail_values[1 + MotorFields.arm_switch.value] + local switchIndex = getSwitchIndex(switchName .. CHAR_DOWN) + local channelIndex = MotorFields.motor_ch.value + + model.setCustomFunction(FUNC_OVERRIDE_CHANNEL, { + switch = switchIndex, + func = 0, + value = -100, + mode = 0, + param = channelIndex, --"CH3" + active = 1 + }) + + selectPage(1) + return 0 +end + +local function onEnd(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgSummary, 300, 60) + + lcd.drawText(70, 90, "Model successfully created !", COLOR_THEME_PRIMARY1) + lcd.drawText(100, 130, "Hold [RTN] to exit.", COLOR_THEME_PRIMARY1) + return 0 +end + +-- Init +local function init() + current = 1 + is_edit = false + pages = { + runMotorConfig, + runAilConfig, + runFlapsConfig, + runTailConfig, + runGearConfig, + runAdditionalSettings, + runConfigSummary, + createModel, + onEnd + } +end + + +-- Main +local function run(event, touchState) + if event == nil then + error("Cannot be run as a model script!") + return 2 + elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then + killEvents(event); + selectPage(-1) + elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages - 2 then + selectPage(1) + elseif event == EVT_TOUCH_FIRST and (touchState.x <= 40 and touchState.y >= 100 and touchState.y <= 160) then + print(string.format("(%s) %s - %s", page, touchState.x, touchState.y)) + selectPage(-1) + elseif event == EVT_TOUCH_FIRST and (touchState.x >= LCD_W - 40 and touchState.y >= 100 and touchState.y <= 160) then + print(string.format("(%s) %s - %s", page, touchState.x, touchState.y)) + if page ~= (#pages - 2) then + selectPage(1) + end + end + + local result = pages[page](event) + return result +end + +return { init = init, run = run } diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Plane.txt b/sdcard/c480x272/TEMPLATES/1.Wizard/1.Plane.txt similarity index 100% rename from sdcard/c480x272/TEMPLATES/WIZARD/Plane.txt rename to sdcard/c480x272/TEMPLATES/1.Wizard/1.Plane.txt diff --git a/sdcard/c480x272/TEMPLATES/1.Wizard/1.Plane.yml b/sdcard/c480x272/TEMPLATES/1.Wizard/1.Plane.yml new file mode 100644 index 00000000..5821d4ef --- /dev/null +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/1.Plane.yml @@ -0,0 +1,227 @@ +semver: 2.9.0 +header: + name: "Plane" + bitmap: "plane.jpg" + labels: "" +timers: + 0: + start: 360 + swtch: "NONE" + value: 0 + mode: THR + countdownBeep: 0 + minuteBeep: 1 + persistent: 0 + countdownStart: 0 + showElapsed: 0 + extraHaptic: 0 + name: "" +telemetryProtocol: 0 +thrTrim: 0 +noGlobalFunctions: 0 +displayTrims: 0 +ignoreSensorIds: 0 +trimInc: 0 +disableThrottleWarning: 0 +displayChecklist: 0 +extendedLimits: 0 +extendedTrims: 0 +throttleReversed: 0 +enableCustomThrottleWarning: 0 +disableTelemetryWarning: 0 +showInstanceIds: 0 +customThrottleWarningPosition: 0 +beepANACenter: 0 +logicalSw: + 0: + func: FUNC_VNEG + def: "tele(0),365" + andsw: "NONE" + delay: 0 + duration: 0 +customFn: + 0: + swtch: "SF2" + func: OVERRIDE_CHANNEL + def: "2,-100,1" + 1: + swtch: "L1" + func: PLAY_VALUE + def: "tele(0),7" +thrTraceSrc: Thr +switchWarningState: C-FdHu +rssiSource: none +rfAlarms: + warning: 45 + critical: 42 +thrTrimSw: 0 +potsWarnMode: WARN_OFF +jitterFilter: GLOBAL +potsWarnEnabled: 0 +screenData: + 0: + LayoutId: "Layout2P1" + layoutData: + zones: + 0: + widgetName: "ModelBmp" + widgetData: + options: + 0: + type: Color + value: + color: 0x000000 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Color + value: + color: 0x000000 + 4: + type: Bool + value: + boolValue: 1 + 1: + widgetName: "Timer2" + widgetData: + options: + 0: + type: Color + value: + color: 0xF8FC00 + 1: + type: Signed + value: + signedValue: 2 + 2: + type: Bool + value: + boolValue: 0 + 2: + widgetName: "BattAnalog" + widgetData: + options: + 0: + type: Source + value: + source: NONE + 1: + type: Color + value: + color: 0xF8FC00 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Bool + value: + boolValue: 0 + options: + 0: + type: Bool + value: + boolValue: 1 + 1: + type: Bool + value: + boolValue: 0 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Bool + value: + boolValue: 1 + 4: + type: Bool + value: + boolValue: 0 + 1: + LayoutId: "Layout1x1" + layoutData: + zones: + 0: + widgetName: "Outputs" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: Bool + value: + boolValue: 0 + 2: + type: Color + value: + color: 0x000000 + 3: + type: Color + value: + color: 0x000000 + 4: + type: Color + value: + color: 0x000000 + options: + 0: + type: Unsigned + value: + unsignedValue: 1 + 3: + type: Unsigned + value: + unsignedValue: 1 +topbarData: + zones: + 2: + widgetName: "Flights" + widgetData: + options: + 0: + type: Source + value: + source: SF + 1: + type: Source + value: + source: ch(2) + 2: + type: Signed + value: + signedValue: 30 + 3: + type: Color + value: + color: 0xF8E440 + 4: + type: Bool + value: + boolValue: 0 + 3: + widgetName: "BattAnalog" + widgetData: + options: + 0: + type: Source + value: + source: TX_VOLTAGE + 1: + type: Color + value: + color: 0xF8FC00 + 2: + type: Bool + value: + boolValue: 1 + 3: + type: Bool + value: + boolValue: 1 +view: 0 + diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/glider.lua b/sdcard/c480x272/TEMPLATES/1.Wizard/2.Glider.lua similarity index 94% rename from sdcard/c480x272/SCRIPTS/WIZARD/glider.lua rename to sdcard/c480x272/TEMPLATES/1.Wizard/2.Glider.lua index ce4722d6..31294f56 100644 --- a/sdcard/c480x272/SCRIPTS/WIZARD/glider.lua +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/2.Glider.lua @@ -1,478 +1,498 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) OpenTX # ------# # ----- # 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. # ----- # # ----- ######################################################################### -local VALUE = 0 -local COMBO = 1 - -local edit = false -local page = 1 -local current = 1 -local pages = {} -local fields = {} - --- load common Bitmaps -local ImgMarkBg = Bitmap.open("img/mark_bg.png") -local BackgroundImg = Bitmap.open("img/background.png") -local ImgPlane = Bitmap.open("img/glider/glider.png") -local ImgPageUp = Bitmap.open("img/pageup.png") -local ImgPageDn = Bitmap.open("img/pagedn.png") - - --- Change display attribute to current field -local function addField(step) - local field = fields[current] - local min, max - if field[3] == VALUE then - min = field[6] - max = field[7] - elseif field[3] == COMBO then - min = 0 - max = #(field[6]) - 1 - end - if (step < 0 and field[5] > min) or (step > 0 and field[5] < max) then - field[5] = field[5] + step - end -end - --- Select the next or previous page -local function selectPage(step) - page = 1 + ((page + step - 1 + #pages) % #pages) - edit = false - current = 1 -end - --- Select the next or previous editable field -local function selectField(step) - repeat - current = 1 + ((current + step - 1 + #fields) % #fields) - until fields[current][4]==1 -end - --- Redraw the current page -local function redrawFieldsPage(event) - - for index = 1, 10, 1 do - local field = fields[index] - if field == nil then - break - end - - local attr = current == (index) and ((edit == true and BLINK or 0) + INVERS) or 0 - attr = attr + COLOR_THEME_PRIMARY1 - - if field[4] == 1 then - if field[3] == VALUE then - lcd.drawNumber(field[1], field[2], field[5], LEFT + attr) - elseif field[3] == COMBO then - if field[5] >= 0 and field[5] < #(field[6]) then - lcd.drawText(field[1],field[2], field[6][1+field[5]], attr) - end - end - end - end -end - -local function updateField(field) - local value = field[5] -end - --- Main -local function runFieldsPage(event) - if event == EVT_VIRTUAL_EXIT then -- exit script - return 2 - elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field - if fields[current][5] ~= nil then - edit = not edit - if edit == false then - updateField(fields[current]) - end - end - elseif edit then - if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then - addField(1) - elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then - addField(-1) - end - else - if event == EVT_VIRTUAL_NEXT then - selectField(1) - elseif event == EVT_VIRTUAL_PREV then - selectField(-1) - end - end - redrawFieldsPage(event) - return 0 -end - --- set visibility flags starting with SECOND field of fields -local function setFieldsVisible(...) - local arg={...} - local cnt = 2 - for i,v in ipairs(arg) do - fields[cnt][4] = v - cnt = cnt + 1 - end -end - --- draws one letter mark -local function drawMark(x, y, name) - lcd.drawBitmap(ImgMarkBg, x, y) - lcd.drawText(x+8, y+3, name, COLOR_THEME_PRIMARY1) -end - - -local MotorFields = { - {50, 50, COMBO, 1, 1, { "No", "Yes"} }, - {50, 127, COMBO, 1, defaultChannel(2), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local ImgEngine - -local function runMotorConfig(event) - lcd.clear() - if ImgEngine == nil then - ImgEngine = Bitmap.open("img/glider/prop.png") - end - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageDn, 455, 95) - lcd.drawBitmap(ImgEngine, 310, 50) - fields = MotorFields - lcd.drawText(40, 20, "Does your model have a motor ?", COLOR_THEME_PRIMARY1) - lcd.drawFilledRectangle(40, 45, 200, 30, TEXT_BGCOLOR) - fields[2][4]=0 - if fields[1][5] == 1 then - lcd.drawText(40, 100, "What channel is it on ?", COLOR_THEME_PRIMARY1) - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - fields[2][4]=1 - end - local result = runFieldsPage(event) - return result -end - --- fields format : {[1]x, [2]y, [3]COMBO, [4]visible, [5]default, [6]{values}} --- fields format : {[1]x, [2]y, [3]VALUE, [4]visible, [5]default, [6]min, [7]max} -local AilFields = { - {50, 50, COMBO, 1, 2, { "None", "One, or two with Y cable", "Two"} }, - {50, 127, COMBO, 1, defaultChannel(3), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -- Ail1 chan - {50, 167, COMBO, 1, 4, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -- Ail2 chan -} - -local ImgAilR -local ImgAilL - -local function runAilConfig(event) - lcd.clear() - if ImgAilR == nil then - ImgAilR = Bitmap.open("img/glider/rail.png") - ImgAilL = Bitmap.open("img/glider/lail.png") - end - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - lcd.drawBitmap(ImgPlane, 252, 100) - fields = AilFields - if fields[1][5] == 1 then - lcd.drawBitmap(ImgAilR, 274, 123) - lcd.drawBitmap(ImgAilL, 395, 235) - drawMark(308, 115, "A") - drawMark(422, 220, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - setFieldsVisible(1, 0) - elseif fields[1][5] == 2 then - lcd.drawBitmap(ImgAilR, 274, 123) - lcd.drawBitmap(ImgAilL, 395, 235) - drawMark(308, 115, "A") - drawMark(422, 220, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) - drawMark(152, 164, "B") - setFieldsVisible(1, 1) - else - setFieldsVisible(0, 0) - end - lcd.drawText(40, 20, "Number of ailerons on your model ?", COLOR_THEME_PRIMARY1) - lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) - local result = runFieldsPage(event) - return result -end - -local FlapsFields = { - {50, 50, COMBO, 1, 0, { "No", "Yes, on one channel", "Yes, on two channels"} }, - {50, 127, COMBO, 1, 6, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, - {50, 167, COMBO, 1, 7, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local ImgFlp - -local function runFlapsConfig(event) - lcd.clear() - if ImgFlp == nil then - ImgFlp = Bitmap.open("img/glider/flap.png") - end - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - lcd.drawBitmap(ImgPlane, 252, 100) - fields = FlapsFields - if fields[1][5] == 1 then - lcd.drawBitmap(ImgFlp, 315, 160) - lcd.drawBitmap(ImgFlp, 358, 202) - drawMark(332, 132, "A") - drawMark(412, 215, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - setFieldsVisible(1, 0) - elseif fields[1][5] == 2 then - lcd.drawBitmap(ImgFlp, 315, 160) - lcd.drawBitmap(ImgFlp, 358, 202) - drawMark(332, 132, "A") - drawMark(412, 215, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) - drawMark(152, 164, "B") - setFieldsVisible(1, 1) - else - setFieldsVisible(0, 0) - end - lcd.drawText(40, 20, "Does your model have flaps ?", COLOR_THEME_PRIMARY1) - lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) - local result = runFieldsPage(event) - return result -end - -local TailFields = { - {50, 50, COMBO, 1, 1, { "1 channel for Elevator, no Rudder", "One channel for Elevator, one for Rudder", "Two channels for Elevator, one for Rudder", "V Tail"} }, - {50, 127, COMBO, 1, defaultChannel(1), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, --ele - {50, 167, COMBO, 1, defaultChannel(0), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, --rud - {50, 207, COMBO, 0, 5, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, --ele2 -} - -local ImgTail -local ImgVTail -local ImgTailRud - -local function runTailConfig(event) - lcd.clear() - if ImgTail == nil then - ImgTail = Bitmap.open("img/glider/tail.png") - ImgVTail = Bitmap.open("img/glider/vtail.png") - ImgTailRud = Bitmap.open("img/glider/tail_rud.png") - end - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = TailFields - if fields[1][5] == 0 then - lcd.drawBitmap(ImgTail, 252, 100) - drawMark(360, 125, "A") - drawMark(390, 155, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - setFieldsVisible(1, 0, 0) - end - if fields[1][5] == 1 then - lcd.drawBitmap(ImgTail, 252, 100) - lcd.drawBitmap(ImgTailRud, 390, 180) - drawMark(415, 150, "A") - drawMark(380, 120, "A") - drawMark(390, 185, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) - drawMark(152, 164, "B") - setFieldsVisible(1, 1, 0) - end - if fields[1][5] == 2 then - lcd.drawBitmap(ImgTail, 252, 100) - lcd.drawBitmap(ImgTailRud, 390, 180) - drawMark(415, 150, "C") - drawMark(380, 120, "A") - drawMark(390, 185, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) - drawMark(152, 164, "B") - lcd.drawFilledRectangle(40, 202, 100, 30, TEXT_BGCOLOR) - drawMark(152, 204, "C") - setFieldsVisible(1, 1, 1) - end - if fields[1][5] == 3 then - lcd.drawBitmap(ImgVTail, 252, 100) - drawMark(315, 110, "A") - drawMark(382, 120, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) - drawMark(152, 164, "B") - setFieldsVisible(1, 1, 0) - end - lcd.drawText(40, 20, "Pick the tail config of your model", COLOR_THEME_PRIMARY1) - lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) - local result = runFieldsPage(event) - return result -end - -local lineIndex -local function drawNextLine(text, text2) - lcd.drawText(40, lineIndex, text, COLOR_THEME_PRIMARY1) - lcd.drawText(242, lineIndex, ": CH" .. text2 + 1, COLOR_THEME_PRIMARY1) - lineIndex = lineIndex + 20 -end - -local ConfigSummaryFields = { - {110, 250, COMBO, 1, 0, { "No, I need to change something", "Yes, all is well, create the plane !"} }, -} - -local ImgSummary - -local function runConfigSummary(event) - lcd.clear() - if ImgSummary == nil then - ImgSummary = Bitmap.open("img/summary.png") - end - fields = ConfigSummaryFields - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgSummary, 300, 60) - lineIndex = 40 - -- motors - if(MotorFields[1][5] == 1) then - drawNextLine("Motor channel", MotorFields[2][5]) - end - -- ail - if(AilFields[1][5] == 1) then - drawNextLine("Aileron channel",AilFields[2][5]) - elseif (AilFields[1][5] == 2) then - drawNextLine("Aileron Right channel",AilFields[2][5]) - drawNextLine("Aileron Left channel",AilFields[3][5]) - end - -- flaps - if(FlapsFields[1][5] == 1) then - drawNextLine("Flaps channel",FlapsFields[2][5]) - elseif (FlapsFields[1][5] == 2) then - drawNextLine("Flaps Right channel",FlapsFields[2][5]) - drawNextLine("Flaps Left channel",FlapsFields[3][5]) - end - -- tail - if(TailFields[1][5] == 0) then - drawNextLine("Elevator channel",TailFields[2][5]) - elseif (TailFields[1][5] == 1) then - drawNextLine("Elevator channel",TailFields[2][5]) - drawNextLine("Rudder channel",TailFields[3][5]) - elseif (TailFields[1][5] == 2) then - drawNextLine("Elevator Right channel",TailFields[2][5]) - drawNextLine("Rudder channel",TailFields[3][5]) - drawNextLine("Elevator Left channel",TailFields[4][5]) - elseif (TailFields[1][5] == 3) then - drawNextLine("V-Tail Right", TailFields[2][5]) - drawNextLine("V-Tail Left", TailFields[3][5]) - end - local result = runFieldsPage(event) - if(fields[1][5] == 1 and edit == false) then - selectPage(1) - end - return result -end - -local function addMix(channel, input, name, weight, index) - local mix = { source=input, name=name } - if weight ~= nil then - mix.weight = weight - end - if index == nil then - index = 0 - end - model.insertMix(channel, index, mix) -end - -local function createModel(event) - lcd.clear() - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgSummary, 300, 60) - model.defaultInputs() - model.deleteMixes() - -- motor - if(MotorFields[1][5] == 1) then - addMix(MotorFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Motor") - end - -- Ailerons - if(AilFields[1][5] == 1) then - addMix(AilFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "Ail") - elseif (AilFields[1][5] == 2) then - addMix(AilFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "AilR") - addMix(AilFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "AilL", -100) - end - -- Flaps - if(FlapsFields[1][5] == 1) then - addMix(FlapsFields[2][5], MIXSRC_SA, "Flaps") - elseif (FlapsFields[1][5] == 2) then - addMix(FlapsFields[2][5], MIXSRC_SA, "FlapsR") - addMix(FlapsFields[3][5], MIXSRC_SA, "FlapsL") - end - -- Tail - if(TailFields[1][5] == 0) then - addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev") - elseif (TailFields[1][5] == 1) then - addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev") - addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "Rudder") - elseif (TailFields[1][5] == 2) then - addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevR") - addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "Rudder") - addMix(TailFields[4][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevL") - elseif (TailFields[1][5] == 3) then - addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "V-EleR", 50) - addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "V-RudR", 50, 1) - addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "V-EleL", 50) - addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "V-RudL", -50, 1) - end - lcd.drawText(70, 90, "Model successfully created !", COLOR_THEME_PRIMARY1) - lcd.drawText(100, 130, "Press RTN to exit", COLOR_THEME_PRIMARY1) - return 2 -end - --- Init -local function init() - current, edit = 1, false - pages = { - runMotorConfig, - runAilConfig, - runFlapsConfig, - runTailConfig, - runConfigSummary, - createModel, - } -end - --- Main -local function run(event) - if event == nil then - error("Cannot be run as a model script!") - return 2 - elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages-1 then - selectPage(1) - elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then - killEvents(event); - selectPage(-1) - end - - local result = pages[page](event) - return result -end - -return { init=init, run=run } +---- ######################################################################### +---- # # +---- # Copyright (C) OpenTX # +-----# # +---- # 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. # +---- # # +---- ######################################################################### +local VALUE = 0 +local COMBO = 1 + +local edit = false +local page = 1 +local current = 1 +local pages = {} +local fields = {} + +chdir("/TEMPLATES/1.Wizard") + +-- load common Bitmaps +local ImgMarkBg = Bitmap.open("img/mark_bg.png") +local BackgroundImg = Bitmap.open("img/background.png") +local ImgPlane = Bitmap.open("img/glider/glider.png") +local ImgPageUp = Bitmap.open("img/pageup.png") +local ImgPageDn = Bitmap.open("img/pagedn.png") + + +-- Change display attribute to current field +local function addField(step) + local field = fields[current] + local min, max + if field[3] == VALUE then + min = field[6] + max = field[7] + elseif field[3] == COMBO then + min = 0 + max = #(field[6]) - 1 + end + if (step < 0 and field[5] > min) or (step > 0 and field[5] < max) then + field[5] = field[5] + step + end +end + +-- Select the next or previous page +local function selectPage(step) + page = 1 + ((page + step - 1 + #pages) % #pages) + edit = false + current = 1 +end + +-- Select the next or previous editable field +local function selectField(step) + repeat + current = 1 + ((current + step - 1 + #fields) % #fields) + until fields[current][4]==1 +end + +-- Redraw the current page +local function redrawFieldsPage(event) + + for index = 1, 10, 1 do + local field = fields[index] + if field == nil then + break + end + + local attr = current == (index) and ((edit == true and BLINK or 0) + INVERS) or 0 + attr = attr + COLOR_THEME_PRIMARY1 + + if field[4] == 1 then + if field[3] == VALUE then + lcd.drawNumber(field[1], field[2], field[5], LEFT + attr) + elseif field[3] == COMBO then + if field[5] >= 0 and field[5] < #(field[6]) then + lcd.drawText(field[1],field[2], field[6][1+field[5]], attr) + end + end + end + end +end + +local function updateField(field) + local value = field[5] +end + +-- Main +local function runFieldsPage(event) + if event == EVT_VIRTUAL_EXIT then -- exit script + return 2 + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field + if fields[current][5] ~= nil then + edit = not edit + if edit == false then + updateField(fields[current]) + end + end + elseif edit then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then + addField(1) + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then + addField(-1) + end + else + if event == EVT_VIRTUAL_NEXT then + selectField(1) + elseif event == EVT_VIRTUAL_PREV then + selectField(-1) + end + end + redrawFieldsPage(event) + return 0 +end + +-- set visibility flags starting with SECOND field of fields +local function setFieldsVisible(...) + local arg={...} + local cnt = 2 + for i,v in ipairs(arg) do + fields[cnt][4] = v + cnt = cnt + 1 + end +end + +-- draws one letter mark +local function drawMark(x, y, name) + lcd.drawBitmap(ImgMarkBg, x, y) + lcd.drawText(x+8, y+3, name, COLOR_THEME_PRIMARY1) +end + + +local MotorFields = { + {50, 50, COMBO, 1, 1, { "No", "Yes"} }, + {50, 127, COMBO, 1, defaultChannel(2), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, +} + +local ImgEngine + +local function runMotorConfig(event) + lcd.clear() + if ImgEngine == nil then + ImgEngine = Bitmap.open("img/glider/prop.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageDn, 455, 95) + lcd.drawBitmap(ImgEngine, 310, 50) + fields = MotorFields + lcd.drawText(40, 20, "Does your model have a motor ?", COLOR_THEME_PRIMARY1) + lcd.drawFilledRectangle(40, 45, 200, 30, TEXT_BGCOLOR) + fields[2][4]=0 + if fields[1][5] == 1 then + lcd.drawText(40, 100, "What channel is it on ?", COLOR_THEME_PRIMARY1) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) + fields[2][4]=1 + end + local result = runFieldsPage(event) + return result +end + +-- fields format : {[1]x, [2]y, [3]COMBO, [4]visible, [5]default, [6]{values}} +-- fields format : {[1]x, [2]y, [3]VALUE, [4]visible, [5]default, [6]min, [7]max} +local AilFields = { + {50, 50, COMBO, 1, 2, { "None", "One, or two with Y cable", "Two"} }, + {50, 127, COMBO, 1, defaultChannel(3), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -- Ail1 chan + {50, 167, COMBO, 1, 4, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -- Ail2 chan +} + +local ImgAilR +local ImgAilL + +local function runAilConfig(event) + lcd.clear() + if ImgAilR == nil then + ImgAilR = Bitmap.open("img/glider/rail.png") + ImgAilL = Bitmap.open("img/glider/lail.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + lcd.drawBitmap(ImgPlane, 252, 100) + fields = AilFields + if fields[1][5] == 1 then + lcd.drawBitmap(ImgAilR, 274, 123) + lcd.drawBitmap(ImgAilL, 395, 235) + drawMark(308, 115, "A") + drawMark(422, 220, "A") + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) + drawMark(152, 124, "A") + setFieldsVisible(1, 0) + elseif fields[1][5] == 2 then + lcd.drawBitmap(ImgAilR, 274, 123) + lcd.drawBitmap(ImgAilL, 395, 235) + drawMark(308, 115, "A") + drawMark(422, 220, "B") + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) + drawMark(152, 124, "A") + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) + drawMark(152, 164, "B") + setFieldsVisible(1, 1) + else + setFieldsVisible(0, 0) + end + lcd.drawText(40, 20, "Number of ailerons on your model ?", COLOR_THEME_PRIMARY1) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) + local result = runFieldsPage(event) + return result +end + +local FlapsFields = { + {50, 50, COMBO, 1, 0, { "No", "Yes, on one channel", "Yes, on two channels"} }, + {50, 127, COMBO, 1, 6, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, + {50, 167, COMBO, 1, 7, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, +} + +local ImgFlp + +local function runFlapsConfig(event) + lcd.clear() + if ImgFlp == nil then + ImgFlp = Bitmap.open("img/glider/flap.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + lcd.drawBitmap(ImgPlane, 252, 100) + fields = FlapsFields + if fields[1][5] == 1 then + lcd.drawBitmap(ImgFlp, 315, 160) + lcd.drawBitmap(ImgFlp, 358, 202) + drawMark(332, 132, "A") + drawMark(412, 215, "A") + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) + drawMark(152, 124, "A") + setFieldsVisible(1, 0) + elseif fields[1][5] == 2 then + lcd.drawBitmap(ImgFlp, 315, 160) + lcd.drawBitmap(ImgFlp, 358, 202) + drawMark(332, 132, "A") + drawMark(412, 215, "B") + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) + drawMark(152, 124, "A") + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) + drawMark(152, 164, "B") + setFieldsVisible(1, 1) + else + setFieldsVisible(0, 0) + end + lcd.drawText(40, 20, "Does your model have flaps ?", COLOR_THEME_PRIMARY1) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) + local result = runFieldsPage(event) + return result +end + +local TailFields = { + {50, 50, COMBO, 1, 1, { "1 channel for Elevator, no Rudder", "One channel for Elevator, one for Rudder", "Two channels for Elevator, one for Rudder", "V Tail"} }, + {50, 127, COMBO, 1, defaultChannel(1), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, --ele + {50, 167, COMBO, 1, defaultChannel(0), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, --rud + {50, 207, COMBO, 0, 5, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, --ele2 +} + +local ImgTail +local ImgVTail +local ImgTailRud + +local function runTailConfig(event) + lcd.clear() + if ImgTail == nil then + ImgTail = Bitmap.open("img/glider/tail.png") + ImgVTail = Bitmap.open("img/glider/vtail.png") + ImgTailRud = Bitmap.open("img/glider/tail_rud.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = TailFields + if fields[1][5] == 0 then + lcd.drawBitmap(ImgTail, 252, 100) + drawMark(360, 125, "A") + drawMark(390, 155, "A") + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) + drawMark(152, 124, "A") + setFieldsVisible(1, 0, 0) + end + if fields[1][5] == 1 then + lcd.drawBitmap(ImgTail, 252, 100) + lcd.drawBitmap(ImgTailRud, 390, 180) + drawMark(415, 150, "A") + drawMark(380, 120, "A") + drawMark(390, 185, "B") + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) + drawMark(152, 124, "A") + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) + drawMark(152, 164, "B") + setFieldsVisible(1, 1, 0) + end + if fields[1][5] == 2 then + lcd.drawBitmap(ImgTail, 252, 100) + lcd.drawBitmap(ImgTailRud, 390, 180) + drawMark(415, 150, "C") + drawMark(380, 120, "A") + drawMark(390, 185, "B") + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) + drawMark(152, 124, "A") + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) + drawMark(152, 164, "B") + lcd.drawFilledRectangle(40, 202, 100, 30, TEXT_BGCOLOR) + drawMark(152, 204, "C") + setFieldsVisible(1, 1, 1) + end + if fields[1][5] == 3 then + lcd.drawBitmap(ImgVTail, 252, 100) + drawMark(315, 110, "A") + drawMark(382, 120, "B") + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) + drawMark(152, 124, "A") + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) + drawMark(152, 164, "B") + setFieldsVisible(1, 1, 0) + end + lcd.drawText(40, 20, "Pick the tail config of your model", COLOR_THEME_PRIMARY1) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) + local result = runFieldsPage(event) + return result +end + +local lineIndex +local function drawNextLine(text, text2) + lcd.drawText(40, lineIndex, text, COLOR_THEME_PRIMARY1) + lcd.drawText(242, lineIndex, ": CH" .. text2 + 1, COLOR_THEME_PRIMARY1) + lineIndex = lineIndex + 20 +end + +local ConfigSummaryFields = { + {110, 250, COMBO, 1, 0, { "No, I need to change something", "Yes, all is well, create the plane !"} }, +} + +local ImgSummary + +local function runConfigSummary(event) + lcd.clear() + if ImgSummary == nil then + ImgSummary = Bitmap.open("img/summary.png") + end + fields = ConfigSummaryFields + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgSummary, 300, 60) + lineIndex = 40 + -- motors + if(MotorFields[1][5] == 1) then + drawNextLine("Motor channel", MotorFields[2][5]) + end + -- ail + if(AilFields[1][5] == 1) then + drawNextLine("Aileron channel",AilFields[2][5]) + elseif (AilFields[1][5] == 2) then + drawNextLine("Aileron Right channel",AilFields[2][5]) + drawNextLine("Aileron Left channel",AilFields[3][5]) + end + -- flaps + if(FlapsFields[1][5] == 1) then + drawNextLine("Flaps channel",FlapsFields[2][5]) + elseif (FlapsFields[1][5] == 2) then + drawNextLine("Flaps Right channel",FlapsFields[2][5]) + drawNextLine("Flaps Left channel",FlapsFields[3][5]) + end + -- tail + if(TailFields[1][5] == 0) then + drawNextLine("Elevator channel",TailFields[2][5]) + elseif (TailFields[1][5] == 1) then + drawNextLine("Elevator channel",TailFields[2][5]) + drawNextLine("Rudder channel",TailFields[3][5]) + elseif (TailFields[1][5] == 2) then + drawNextLine("Elevator Right channel",TailFields[2][5]) + drawNextLine("Rudder channel",TailFields[3][5]) + drawNextLine("Elevator Left channel",TailFields[4][5]) + elseif (TailFields[1][5] == 3) then + drawNextLine("V-Tail Right", TailFields[2][5]) + drawNextLine("V-Tail Left", TailFields[3][5]) + end + local result = runFieldsPage(event) + if(fields[1][5] == 1 and edit == false) then + selectPage(1) + end + return result +end + +local function addMix(channel, input, name, weight, index) + local mix = { source=input, name=name } + if weight ~= nil then + mix.weight = weight + end + if index == nil then + index = 0 + end + model.insertMix(channel, index, mix) +end + +local function createModel(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgSummary, 300, 60) + model.defaultInputs() + model.deleteMixes() + -- motor + if(MotorFields[1][5] == 1) then + addMix(MotorFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Motor") + end + -- Ailerons + if(AilFields[1][5] == 1) then + addMix(AilFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "Ail") + elseif (AilFields[1][5] == 2) then + addMix(AilFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "AilR") + addMix(AilFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "AilL", -100) + end + -- Flaps + if(FlapsFields[1][5] == 1) then + addMix(FlapsFields[2][5], MIXSRC_SA, "Flaps") + elseif (FlapsFields[1][5] == 2) then + addMix(FlapsFields[2][5], MIXSRC_SA, "FlapsR") + addMix(FlapsFields[3][5], MIXSRC_SA, "FlapsL") + end + -- Tail + if(TailFields[1][5] == 0) then + addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev") + elseif (TailFields[1][5] == 1) then + addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Elev") + addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "Rudder") + elseif (TailFields[1][5] == 2) then + addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevR") + addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "Rudder") + addMix(TailFields[4][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "ElevL") + elseif (TailFields[1][5] == 3) then + addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "V-EleR", 50) + addMix(TailFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "V-RudR", 50, 1) + addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "V-EleL", 50) + addMix(TailFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "V-RudL", -50, 1) + end + selectPage(1) + return 0 +end + +local function onEnd(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgSummary, 300, 60) + + lcd.drawText(70, 90, "Model successfully created !", COLOR_THEME_PRIMARY1) + lcd.drawText(100, 130, "Hold [RTN] to exit.", COLOR_THEME_PRIMARY1) + return 0 +end + +-- Init +local function init() + current, edit = 1, false + pages = { + runMotorConfig, + runAilConfig, + runFlapsConfig, + runTailConfig, + runConfigSummary, + createModel, + onEnd + } +end + +-- Main +local function run(event, touchState) + if event == nil then + error("Cannot be run as a model script!") + return 2 + elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then + killEvents(event); + selectPage(-1) + elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages - 2 then + selectPage(1) + elseif event == EVT_TOUCH_FIRST and (touchState.x <= 40 and touchState.y >= 100 and touchState.y <= 160) then + print(string.format("(%s) %s - %s", page, touchState.x, touchState.y)) + selectPage(-1) + elseif event == EVT_TOUCH_FIRST and (touchState.x >= LCD_W - 40 and touchState.y >= 100 and touchState.y <= 160) then + print(string.format("(%s) %s - %s", page, touchState.x, touchState.y)) + if page ~= (#pages - 2) then + selectPage(1) + end + end + + local result = pages[page](event) + return result +end + +return { init=init, run=run } diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Glider.txt b/sdcard/c480x272/TEMPLATES/1.Wizard/2.Glider.txt similarity index 100% rename from sdcard/c480x272/TEMPLATES/WIZARD/Glider.txt rename to sdcard/c480x272/TEMPLATES/1.Wizard/2.Glider.txt diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Glider.yml b/sdcard/c480x272/TEMPLATES/1.Wizard/2.Glider.yml similarity index 94% rename from sdcard/c480x272/TEMPLATES/WIZARD/Glider.yml rename to sdcard/c480x272/TEMPLATES/1.Wizard/2.Glider.yml index 06f73c3c..374d90d5 100644 --- a/sdcard/c480x272/TEMPLATES/WIZARD/Glider.yml +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/2.Glider.yml @@ -1,178 +1,178 @@ -header: - name: "Glider" - bitmap: "" -telemetryProtocol: 0 -thrTrim: 0 -noGlobalFunctions: 0 -displayTrims: 0 -ignoreSensorIds: 0 -trimInc: 0 -disableThrottleWarning: 0 -displayChecklist: 0 -extendedLimits: 0 -extendedTrims: 0 -throttleReversed: 0 -enableCustomThrottleWarning: 0 -customThrottleWarningPosition: 0 -beepANACenter: 0 -mixData: - - - weight: 100 - destCh: 0 - srcRaw: I0 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 1 - srcRaw: I1 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 2 - srcRaw: I2 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 3 - srcRaw: I3 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" -expoData: - - - mode: 3 - scale: 0 - srcRaw: Rud - carryTrim: 0 - chn: 0 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Ele - carryTrim: 0 - chn: 1 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Thr - carryTrim: 0 - chn: 2 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Ail - carryTrim: 0 - chn: 3 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 -thrTraceSrc: Thr -switchWarningState: AuBuCuDuEuFuGuHu -rssiSource: none -thrTrimSw: 0 -potsWarnMode: WARN_OFF -jitterFilter: GLOBAL -inputNames: - 0: - val: "Rud" - 1: - val: "Ele" - 2: - val: "Thr" - 3: - val: "Ail" -potsWarnEnabled: 0 -screenData: - 0: - LayoutId: "Layout2P1" - layoutData: - options: - 0: - type: Bool - value: - boolValue: 1 - 1: - type: Bool - value: - boolValue: 1 - 2: - type: Bool - value: - boolValue: 1 - 3: - type: Bool - value: - boolValue: 1 - 4: - type: Bool - value: - boolValue: 0 -view: 0 -modelRegistrationID: "" +header: + name: "Glider" + bitmap: "" +telemetryProtocol: 0 +thrTrim: 0 +noGlobalFunctions: 0 +displayTrims: 0 +ignoreSensorIds: 0 +trimInc: 0 +disableThrottleWarning: 0 +displayChecklist: 0 +extendedLimits: 0 +extendedTrims: 0 +throttleReversed: 0 +enableCustomThrottleWarning: 0 +customThrottleWarningPosition: 0 +beepANACenter: 0 +mixData: + - + weight: 100 + destCh: 0 + srcRaw: I0 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 1 + srcRaw: I1 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 2 + srcRaw: I2 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 3 + srcRaw: I3 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" +expoData: + - + mode: 3 + scale: 0 + srcRaw: Rud + carryTrim: 0 + chn: 0 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 + - + mode: 3 + scale: 0 + srcRaw: Ele + carryTrim: 0 + chn: 1 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 + - + mode: 3 + scale: 0 + srcRaw: Thr + carryTrim: 0 + chn: 2 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 + - + mode: 3 + scale: 0 + srcRaw: Ail + carryTrim: 0 + chn: 3 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 +thrTraceSrc: Thr +switchWarningState: AuBuCuDuEuFuGuHu +rssiSource: none +thrTrimSw: 0 +potsWarnMode: WARN_OFF +jitterFilter: GLOBAL +inputNames: + 0: + val: "Rud" + 1: + val: "Ele" + 2: + val: "Thr" + 3: + val: "Ail" +potsWarnEnabled: 0 +screenData: + 0: + LayoutId: "Layout2P1" + layoutData: + options: + 0: + type: Bool + value: + boolValue: 1 + 1: + type: Bool + value: + boolValue: 1 + 2: + type: Bool + value: + boolValue: 1 + 3: + type: Bool + value: + boolValue: 1 + 4: + type: Bool + value: + boolValue: 0 +view: 0 +modelRegistrationID: "" diff --git a/sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.lua b/sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.lua new file mode 100644 index 00000000..9e01528e --- /dev/null +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.lua @@ -0,0 +1,526 @@ +---- ######################################################################### +---- # # +---- # Copyright (C) EdgeTX # +-----# # +---- # 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. # +---- # # +---- ######################################################################### + +-- Author: Offer Shmuely +-- Date: 2023 +-- version: 1.0 + +local VALUE = 0 +local COMBO = 1 + +local is_edit = false +local page = 1 +local current = 1 +local pages = {} + +chdir("/TEMPLATES/1.Wizard") + +-- load common Bitmaps +local ImgMarkBg = Bitmap.open("img/mark_bg.png") +local BackgroundImg = Bitmap.open("img/background.png") +local ImgPlane = Bitmap.open("img/wing/plane.png") +local ImgPageUp = Bitmap.open("img/pageup.png") +local ImgPageDn = Bitmap.open("img/pagedn.png") + +local STICK_NUMBER_AIL = 3 +local STICK_NUMBER_ELE = 1 +local STICK_NUMBER_THR = 2 +local STICK_NUMBER_RUD = 0 + +local defaultChannel_AIL = defaultChannel(STICK_NUMBER_AIL)+1 +local defaultChannel_ELE = defaultChannel(STICK_NUMBER_ELE)+1 +local defaultChannel_THR = defaultChannel(STICK_NUMBER_THR)+1 +local defaultChannel_RUD = defaultChannel(STICK_NUMBER_RUD)+1 + +local defaultChannel_0_AIL = defaultChannel(STICK_NUMBER_AIL) +local defaultChannel_0_ELE = defaultChannel(STICK_NUMBER_ELE) +local defaultChannel_0_THR = defaultChannel(STICK_NUMBER_THR) +local defaultChannel_0_RUD = defaultChannel(STICK_NUMBER_RUD) + + +-- Change display attribute to current field +local function addField(fields, step) + local field = fields[current] + local min, max + if field.type == VALUE then + min = field.min + max = field.max + elseif field.type == COMBO then + min = 0 + max = #(field.avail_values) - 1 + end + if (step < 0 and field.value > min) or (step > 0 and field.value < max) then + field.value = field.value + step + end +end + +-- Select the next or previous page +local function selectPage(step) + if page == 1 and step < 0 then + return + end + page = 1 + ((page + step - 1 + #pages) % #pages) + is_edit = false + current = 1 + print(string.format("page: (%s)", page)) + +end + +-- Select the next or previous editable field +local function selectField(fields, step) + print(string.format("selectField-start: current: %s", current)) + repeat + print(string.format("selectField: current: %s (vis: %s)", current, fields[current].is_visible)) + current = 1 + ((current + step - 1 + #fields) % #fields) + until fields[current].is_visible == 1 + print(string.format("selectField-end: current: %s", current)) +end + +-- better font names +local FONT_38 = XXLSIZE -- 38px +local FONT_16 = DBLSIZE -- 16px +local FONT_12 = MIDSIZE -- 12px +local FONT_8 = 0 -- Default 8px +local FONT_6 = SMLSIZE -- 6px + +local function lcdSizeTextFixed(txt, font_size) + local ts_w, ts_h = lcd.sizeText(txt, font_size) + + local v_offset = 0 + if font_size == FONT_38 then + v_offset = -11 + elseif font_size == FONT_16 then + v_offset = -5 + elseif font_size == FONT_12 then + v_offset = -4 + elseif font_size == FONT_8 then + v_offset = -3 + elseif font_size == FONT_6 then + v_offset = 0 + end + return ts_w, ts_h, v_offset +end + + +local function drawBadgedText(txt, field, font_size, is_selected, is_edit) + local ts_w, ts_h, v_offset = lcdSizeTextFixed(txt, font_size) + ts_h = 10 + ts_h + v_offset * 2 + local r = ts_h / 2 + + if (field.w > 0) then + ts_w = field.w + else + if (ts_w < 30) then + ts_w = 30 + end + end + local bg_color = WHITE + if (is_selected) then + bg_color = GREEN + end + lcd.drawFilledCircle(field.x , field.y + r, r, bg_color) + lcd.drawFilledCircle(field.x + ts_w , field.y + r, r, bg_color) + lcd.drawFilledRectangle(field.x, field.y , ts_w, ts_h, bg_color) + local attr = 0 + if (is_selected and is_edit) then + attr = attr + BLINK + end + + lcd.drawText(field.x, field.y + v_offset + 5, txt, font_size + BLACK + attr) +end + + +-- Redraw the current page +local function redrawFieldsPage(fields, event) + for index = 1, 10, 1 do + local field = fields[index] + if field == nil then + break + end + + -- print(string.format("redrawFieldsPage [%s] field.x=%s, y=%s, is_visible=%s", field.id, field.x, field.y, field.is_visible)) + local attr = current == (index) and ((is_edit == true and BLINK or 0) + INVERS) or 0 + local is_selected = (current == (index)) + attr = attr + COLOR_THEME_PRIMARY1 + if field.is_visible == 1 then + if field.type == VALUE then + --lcd.drawNumber(field.x, field.y, field.value, LEFT + attr) + drawBadgedText(field.value, field, FONT_8, is_selected, is_edit) + elseif field.type == COMBO then + if field.value >= 0 and field.value < #(field.avail_values) then + --lcd.drawText(field.x, field.y, field.avail_values[1 + field.value], attr) + drawBadgedText(field.avail_values[1 + field.value], field, FONT_8, is_selected, is_edit) + end + end + end + end +end + +local function updateField(field) + local value = field.value +end + +-- Main +local function runFieldsPage(fields, event) + if event == EVT_VIRTUAL_EXIT then + -- exit script + return 2 + elseif event == EVT_VIRTUAL_ENTER then + -- toggle editing/selecting current field + if fields[current].value ~= nil then + is_edit = not is_edit + if is_edit == false then + updateField(fields[current]) + end + end + elseif is_edit then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then + addField(fields, 1) + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then + addField(fields, -1) + end + else + if event == EVT_VIRTUAL_NEXT then + selectField(fields, 1) + elseif event == EVT_VIRTUAL_PREV then + selectField(fields, -1) + end + end + redrawFieldsPage(fields, event) + return 0 +end + +-- set visibility flags starting with SECOND field of fields +local function setFieldsVisible(fields, ...) + local arg = { ... } + local cnt = 2 + for i, v in ipairs(arg) do + fields[cnt].is_visible = v + cnt = cnt + 1 + end +end + + +-- draws one letter mark +local function drawMark(x, y, name) + lcd.drawBitmap(ImgMarkBg, x, y) + lcd.drawText(x + 8, y + 3, name, COLOR_THEME_PRIMARY1) +end + +local function drawTitle(txt) + lcd.drawFilledRectangle(1, 1, 480, 35, LIGHTGREY) + lcd.drawText(150, 8, txt, COLOR_THEME_PRIMARY1) +end + + +local MotorFields = { + is_motor = { id='is_motor' , x=170, y=50 , w=0, type=COMBO, is_visible=1, value=1 , avail_values={ "No", "Yes" } }, + motor_ch = { id='motor_ch' , x=170, y=90 , w=0, type=COMBO, is_visible=1, value=defaultChannel_0_THR, avail_values={ "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, + is_arm = { id='is_arm' , x=170, y=130, w=0, type=COMBO, is_visible=1, value=1 , avail_values={ "No", "Yes" } }, + arm_switch = { id='arm_switch', x=230, y=130, w=0, type=COMBO, is_visible=1, value=5 , avail_values={ "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH" } }, + page = {} +} +MotorFields.page = { + MotorFields.is_motor, + MotorFields.motor_ch, + MotorFields.is_arm, + MotorFields.arm_switch +} + +local ImgEngine + +local function runMotorConfig(event) + lcd.clear() + if ImgEngine == nil then + ImgEngine = Bitmap.open("img/wing/prop.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageDn, 455, 95) + lcd.drawBitmap(ImgEngine, 310, 50) + + drawTitle("Motor Settings") + + lcd.drawText(40, MotorFields.is_motor.y, "Have a motor?", COLOR_THEME_PRIMARY1) + print(string.format("111=%s", MotorFields.is_motor.x)) + + MotorFields.motor_ch.is_visible = 0 + MotorFields.is_arm.is_visible = 0 + MotorFields.arm_switch.is_visible = 0 + if MotorFields.is_motor.value == 1 then + lcd.drawText(40, MotorFields.motor_ch.y, "Motor channel", COLOR_THEME_PRIMARY1) + MotorFields.motor_ch.is_visible = 1 + + lcd.drawText(40, MotorFields.is_arm.y, "Safety Switch", COLOR_THEME_PRIMARY1) + MotorFields.is_arm.is_visible = 1 + if MotorFields.is_arm.value == 1 then + MotorFields.arm_switch.is_visible = 1 + else + MotorFields.arm_switch.is_visible = 0 + end + end + + local result = runFieldsPage(MotorFields.page, event) + return result +end + +-- fields format : {[1]x, [2]y, [3]COMBO, [4]visible, [5]default, [6]{values}} +-- fields format : {[1]x, [2]y, [3]VALUE, [4]visible, [5]default, [6]min, [7]max} +local ElevronFields = { + ail_ch_r = {id='ail_ch_r' , x=180, y=80 , w=0, type=COMBO, is_visible=1, value=defaultChannel_0_AIL , avail_values={ "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -- Ail1 chan + ail_ch_l = {id='ail_ch_l' , x=180, y=110, w=0, type=COMBO, is_visible=1, value=defaultChannel_0_AIL+1, avail_values={ "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -- Ail2 chan + expo = {id='expo' , x=180, y=150, w=0, type=VALUE, is_visible=1, value=30, min=0, max=100 } , -- expo + is_dual_rate = {id='is_dual_rate', x=180, y=180, w=0, type=COMBO, is_visible=1, value=1 , avail_values={ "No", "Yes" } }, + dr_switch = {id='dr_switch' , x=180, y=210, w=0, type=COMBO, is_visible=1, value=2 , avail_values={ "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH" } }, + page={} +} +ElevronFields.page = { + ElevronFields.ail_ch_r, + ElevronFields.ail_ch_l, + ElevronFields.expo, + ElevronFields.is_dual_rate, + ElevronFields.dr_switch, +} +local ImgAilR +local ImgAilL + +local function runElevronConfig(event) + lcd.clear() + if ImgAilR == nil then + ImgAilR = Bitmap.open("img/wing/rail.png") + ImgAilL = Bitmap.open("img/wing/lail.png") + end + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + lcd.drawBitmap(ImgPlane, 230, 150) + + drawTitle("Elevron Setup") + + lcd.drawText(40, 50, "Ailerons channels", COLOR_THEME_PRIMARY1) + + lcd.drawText(40, 80, "Right Channel", COLOR_THEME_PRIMARY1) + lcd.drawText(40, 110, "Left Channel", COLOR_THEME_PRIMARY1) + + lcd.drawText(40, 150, "Expo", COLOR_THEME_PRIMARY1) + + lcd.drawText(40, ElevronFields.is_dual_rate.y, "Dual-Rate?", COLOR_THEME_PRIMARY1) + if ElevronFields.is_dual_rate.value == 1 then + lcd.drawText(40, ElevronFields.is_dual_rate.y, "Dual-Rate?", COLOR_THEME_PRIMARY1) + lcd.drawText(40, ElevronFields.dr_switch.y, "Dual-Rate switch", COLOR_THEME_PRIMARY1) + ElevronFields.dr_switch.is_visible = 1 + else + ElevronFields.dr_switch.is_visible = 0 + end + + local result = runFieldsPage(ElevronFields.page, event) + return result +end + +local lineIndex +local function drawNextLine(text, chNum, text2) + lcd.drawText(40, lineIndex, text, COLOR_THEME_PRIMARY1) + if chNum ~= nil then + lcd.drawText(242, lineIndex, ": CH" .. chNum + 1, COLOR_THEME_PRIMARY1) + else + lcd.drawText(242, lineIndex, ": " .. text2, COLOR_THEME_PRIMARY1) + end + lineIndex = lineIndex + 20 +end + +local ConfigSummaryFields = { + ack= {id='ack', x=110, y=250, w=0, type=COMBO, is_visible=1, value=0, avail_values={ "No, I need to change something", "Yes, all is well, create the plane !" } }, +} +ConfigSummaryFields.page = { + ConfigSummaryFields.ack +} + +local ImgSummary + +local function runConfigSummary(event) + lcd.clear() + if ImgSummary == nil then + ImgSummary = Bitmap.open("img/summary.png") + end + + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgSummary, 300, 60) + + drawTitle("Config Summary") + + lineIndex = 40 + + -- ail + drawNextLine("Ail/Ele Right channel", ElevronFields.ail_ch_r.value) + drawNextLine("Ail/Ele Left channel", ElevronFields.ail_ch_l.value) + drawNextLine("Expo", nil, ElevronFields.expo.value) + + -- motors + if (MotorFields.is_motor.value == 1) then + drawNextLine("Motor channel", MotorFields.motor_ch.value) + end + + -- arm switch + if (MotorFields.is_arm.value == 1) then + local switchName = MotorFields.arm_switch.avail_values[1 + MotorFields.arm_switch.value] + drawNextLine("Arm switch", nil, switchName) + end + + drawNextLine("Dual Rate", nil, ElevronFields.is_dual_rate.avail_values[1 + ElevronFields.is_dual_rate.value]) + + local result = runFieldsPage(ConfigSummaryFields.page, event) + + if (ConfigSummaryFields.ack.value == 1 and is_edit == false) then + selectPage(1) + end + return result +end + +local function addMix(channel, input, name, weight, index) + local mix = { + source = input, + name = name + } + if weight ~= nil then + mix.weight = weight + end + if index == nil then + index = 0 + end + model.insertMix(channel, index, mix) +end + +local function updateInputLine(channel, lineNo, expoWeight, weight, switch_name_position) + local inInfo = model.getInput(channel, 0) + + -- expo + inInfo.curveType = 1 + inInfo.curveValue = expoWeight + inInfo.weight = weight + if (switch_name_position ~= nil) then + local switchIndex = getSwitchIndex(switch_name_position) + inInfo.switch = switchIndex + end + + -- delete the old line + model.deleteInput(channel, lineNo) + model.insertInput(channel, lineNo, inInfo) +end + +local function createModel(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgSummary, 300, 60) + model.defaultInputs() + model.deleteInput(3, 0) -- delete rudder + model.deleteMixes() + + -- expo + local expoVal = ElevronFields.expo.value + local is_dual_rate = (ElevronFields.is_dual_rate.value == 1) + if (is_dual_rate) then + updateInputLine(defaultChannel_0_AIL, 0, expoVal, 100,"SC" .. CHAR_UP) + updateInputLine(defaultChannel_0_AIL, 1, expoVal, 75, "SC-") + updateInputLine(defaultChannel_0_AIL, 2, expoVal, 50, "SC" .. CHAR_DOWN) + + updateInputLine(defaultChannel_0_ELE, 0, expoVal, 100,"SC" .. CHAR_UP) + updateInputLine(defaultChannel_0_ELE, 1, expoVal, 75, "SC-") + updateInputLine(defaultChannel_0_ELE, 2, expoVal, 50, "SC" .. CHAR_DOWN) + else + updateInputLine(defaultChannel_0_AIL, 0, expoVal, 100, nil) + updateInputLine(defaultChannel_0_ELE, 0, expoVal, 100, nil) + end + + + -- motor + if (MotorFields.is_motor.value == 1) then + addMix(MotorFields.motor_ch.value, MIXSRC_FIRST_INPUT + defaultChannel_0_THR, "Motor") + end + + -- Ailerons + addMix(ElevronFields.ail_ch_r.value, MIXSRC_FIRST_INPUT + defaultChannel(STICK_NUMBER_ELE), "ele-R", 50) + addMix(ElevronFields.ail_ch_r.value, MIXSRC_FIRST_INPUT + defaultChannel(STICK_NUMBER_AIL), "ail-R", -50) + addMix(ElevronFields.ail_ch_l.value, MIXSRC_FIRST_INPUT + defaultChannel(STICK_NUMBER_ELE), "ele-L", 50) + addMix(ElevronFields.ail_ch_l.value, MIXSRC_FIRST_INPUT + defaultChannel(STICK_NUMBER_AIL), "ail-L", 50) + + -- special function for arm switch + local switchName = MotorFields.arm_switch.avail_values[1 + MotorFields.arm_switch.value] + local switchIndex = getSwitchIndex(switchName .. CHAR_DOWN) + local channelIndex = MotorFields.motor_ch.value + + model.setCustomFunction(FUNC_OVERRIDE_CHANNEL, { + switch = switchIndex, + func = 0, + value = -100, + mode = 0, + param = channelIndex, --"CH3" + active = 1 + }) + + selectPage(1) + return 0 +end + +local function onEnd(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgSummary, 300, 60) + + lcd.drawText(70, 90, "Model successfully created !", COLOR_THEME_PRIMARY1) + lcd.drawText(100, 130, "Hold [RTN] to exit.", COLOR_THEME_PRIMARY1) + return 0 +end + +-- Init +local function init() + current = 1 + is_edit = false + pages = { + runMotorConfig, + runElevronConfig, + runConfigSummary, + createModel, + onEnd + } +end + + +-- Main +local function run(event, touchState) + if event == nil then + error("Cannot be run as a model script!") + return 2 + elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then + killEvents(event); + selectPage(-1) + elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages - 2 then + selectPage(1) + elseif event == EVT_TOUCH_FIRST and (touchState.x <= 40 and touchState.y >= 100 and touchState.y <= 160) then + print(string.format("(%s) %s - %s", page, touchState.x, touchState.y)) + selectPage(-1) + elseif event == EVT_TOUCH_FIRST and (touchState.x >= LCD_W - 40 and touchState.y >= 100 and touchState.y <= 160) then + print(string.format("(%s) %s - %s", page, touchState.x, touchState.y)) + if page ~= (#pages - 2) then + selectPage(1) + end + end + + local result = pages[page](event) + return result +end + +return { init = init, run = run } diff --git a/sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.txt b/sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.txt new file mode 100644 index 00000000..2adea267 --- /dev/null +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.txt @@ -0,0 +1 @@ +Create a simple wing using the Lua Wizard to guide you. \ No newline at end of file diff --git a/sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.yml b/sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.yml new file mode 100644 index 00000000..2a959b08 --- /dev/null +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/3.Wing.yml @@ -0,0 +1,349 @@ +semver: 2.9.0 +header: + name: "Wing" + bitmap: "wing.jpg" + labels: "" +timers: + 0: + start: 360 + swtch: "NONE" + value: 0 + mode: THR + countdownBeep: 0 + minuteBeep: 1 + persistent: 0 + countdownStart: 0 + showElapsed: 0 + extraHaptic: 0 + name: "" +telemetryProtocol: 0 +thrTrim: 0 +noGlobalFunctions: 0 +displayTrims: 0 +ignoreSensorIds: 0 +trimInc: 0 +disableThrottleWarning: 0 +displayChecklist: 0 +extendedLimits: 0 +extendedTrims: 0 +throttleReversed: 0 +enableCustomThrottleWarning: 0 +disableTelemetryWarning: 0 +showInstanceIds: 0 +customThrottleWarningPosition: 0 +beepANACenter: 0 +logicalSw: + 0: + func: FUNC_VNEG + def: "tele(0),365" + andsw: "NONE" + delay: 0 + duration: 0 +customFn: + 0: + swtch: "SF2" + func: OVERRIDE_CHANNEL + def: "2,-100,1" + 1: + swtch: "L1" + func: PLAY_VALUE + def: "tele(0),7" +thrTraceSrc: Thr +switchWarningState: AuBuCuDuEuFuGuHu +rssiSource: none +rfAlarms: + warning: 45 + critical: 42 +thrTrimSw: 0 +potsWarnMode: WARN_OFF +jitterFilter: GLOBAL +potsWarnEnabled: 0 +telemetrySensors: + 0: + id1: + id: 0 + id2: + formula: FORMULA_CELL + label: "cell" + subId: 0 + type: TYPE_CALCULATED + unit: 1 + prec: 2 + autoOffset: 0 + filter: 0 + logs: 0 + persistent: 0 + onlyPositive: 0 + cfg: + cell: + source: 6 + index: 0 + 5: + id1: + id: 768 + id2: + instance: 1 + label: "Cels" + subId: 0 + type: TYPE_CUSTOM + unit: 38 + prec: 2 + autoOffset: 0 + filter: 0 + logs: 1 + persistent: 0 + onlyPositive: 0 + cfg: + param: 0 +screenData: + 0: + LayoutId: "Layout2P1" + layoutData: + zones: + 0: + widgetName: "ModelBmp" + widgetData: + options: + 0: + type: Color + value: + color: 0x000000 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Color + value: + color: 0x000000 + 4: + type: Bool + value: + boolValue: 1 + 1: + widgetName: "Timer2" + widgetData: + options: + 0: + type: Color + value: + color: 0xF8FC00 + 1: + type: Signed + value: + signedValue: 1 + 2: + type: Bool + value: + boolValue: 0 + 2: + widgetName: "BattCheck" + widgetData: + options: + 0: + type: Source + value: + source: NONE + 1: + type: Color + value: + color: 0xF8FC00 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Bool + value: + boolValue: 1 + 4: + type: Bool + value: + boolValue: 0 + options: + 0: + type: Bool + value: + boolValue: 1 + 1: + type: Bool + value: + boolValue: 0 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Bool + value: + boolValue: 1 + 4: + type: Bool + value: + boolValue: 0 + 1: + LayoutId: "Layout2P1" + layoutData: + zones: + 0: + widgetName: "ModelBmp" + widgetData: + options: + 0: + type: Color + value: + color: 0x000000 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Color + value: + color: 0x000000 + 4: + type: Bool + value: + boolValue: 1 + 1: + widgetName: "Timer2" + widgetData: + options: + 0: + type: Color + value: + color: 0xF8FC00 + 1: + type: Signed + value: + signedValue: 2 + 2: + type: Bool + value: + boolValue: 0 + 2: + widgetName: "BattAnalog" + widgetData: + options: + 0: + type: Source + value: + source: NONE + 1: + type: Color + value: + color: 0xF8FC00 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Bool + value: + boolValue: 0 + options: + 0: + type: Bool + value: + boolValue: 1 + 1: + type: Bool + value: + boolValue: 0 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Bool + value: + boolValue: 1 + 4: + type: Bool + value: + boolValue: 0 + 2: + LayoutId: "Layout1x1" + layoutData: + zones: + 0: + widgetName: "Outputs" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: Bool + value: + boolValue: 0 + 2: + type: Color + value: + color: 0x000000 + 3: + type: Color + value: + color: 0x000000 + 4: + type: Color + value: + color: 0x000000 + options: + 0: + type: Unsigned + value: + unsignedValue: 1 + 3: + type: Unsigned + value: + unsignedValue: 1 +topbarData: + zones: + 2: + widgetName: "Flights" + widgetData: + options: + 0: + type: Source + value: + source: SF + 1: + type: Source + value: + source: ch(2) + 2: + type: Signed + value: + signedValue: 30 + 3: + type: Color + value: + color: 0xF8E440 + 4: + type: Bool + value: + boolValue: 0 + 3: + widgetName: "BattAnalog" + widgetData: + options: + 0: + type: Source + value: + source: TX_VOLTAGE + 1: + type: Color + value: + color: 0xF8FC00 + 2: + type: Bool + value: + boolValue: 1 + 3: + type: Bool + value: + boolValue: 1 +view: 0 + diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/helicopter.lua b/sdcard/c480x272/TEMPLATES/1.Wizard/4.Helicopter.lua similarity index 90% rename from sdcard/c480x272/SCRIPTS/WIZARD/helicopter.lua rename to sdcard/c480x272/TEMPLATES/1.Wizard/4.Helicopter.lua index 4c7c1d9a..6182c2a5 100644 --- a/sdcard/c480x272/SCRIPTS/WIZARD/helicopter.lua +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/4.Helicopter.lua @@ -1,619 +1,642 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) EdgeTX # ------# # ------# Credits: graphics by https://github.com/jrwieland # ------# # ----- # 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. # ----- # # ----- ######################################################################### - -local VALUE = 0 -local COMBO = 1 -local edit = false -local page = 1 -local current = 1 -local pages = {} -local fields = {} -local switches = {"SA", "SB", "SC", "SD", "SE", "SF", "SG"} -local switchValues = {[0]=2, 5, 8, 11, 14, 17, 19} -local Text_Color= lcd.setColor(CUSTOM_COLOR, BLACK) --- load common Bitmaps -local BackgroundImg = Bitmap.open("img/background.png") -local ImgPageUp = Bitmap.open("img/pageup.png") -local ImgPageDn = Bitmap.open("img/pagedn.png") - --- Change display attribute to current field -local function addField(step) - local field = fields[current] - local min, max - if field[3] == VALUE then - min = field[6] - max = field[7] - elseif field[3] == COMBO then - min = 0 - max = #(field[6]) - 1 - end - if (step < 0 and field[5] > min) or (step > 0 and field[5] < max) then - field[5] = field[5] + step - end -end - --- Select the next or previous page -local function selectPage(step) -lcd.drawBitmap(BackgroundImg,0,0) - page = 1 + ((page + step - 1 + #pages) % #pages) - edit = false - current = 1 -end - --- Select the next or previous editable field -local function selectField(step) - repeat - current = 1 + ((current + step - 1 + #fields) % #fields) - until fields[current][4]==1 -end - --- Redraw the current page -local function redrawFieldsPage(event) - - for index = 1, 10, 1 do - local field = fields[index] - if field == nil then - break - end - - local attr = current == (index) and ((edit == true and BLINK or 0) + INVERS) or 0 - attr = attr - - if field[4] == 1 then - if field[3] == VALUE then - lcd.drawNumber(field[1], field[2], field[5], LEFT + attr) - elseif field[3] == COMBO then - if field[5] >= 0 and field[5] < #(field[6]) then - lcd.drawText(field[1],field[2], field[6][1+field[5]], attr) - end - end - end - end -end - -local function updateField(field) - local value = field[5] -end - --- Main -local function runFieldsPage(event) - if event == EVT_VIRTUAL_EXIT then -- exit script - return 2 - elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field - if fields[current][5] ~= nil then - edit = not edit - if edit == false then - lcd.clear() - updateField(fields[current]) - end - end - elseif edit then - if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then - addField(1) - elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then - addField(-1) - end - else - if event == EVT_VIRTUAL_NEXT then - selectField(1) - elseif event == EVT_VIRTUAL_PREV then - selectField(-1) - end - end - redrawFieldsPage(event) - return 0 -end - --- set visibility flags starting with SECOND field of fields -local function setFieldsVisible(...) - local arg={...} - local cnt = 2 - for i,v in ipairs(arg) do - fields[cnt][4] = v - cnt = cnt + 1 - end -end - -local TypeFields = { - {50, 50, COMBO, 1, 0, {"FBL", "FB" } }, - {43, 126, COMBO, 1, 0, {"120", "120X", "140", "90" } }, -} - -local TypeBackground - -local function runTypeConfig(event) - lcd.clear() - lcd.drawBitmap(BackgroundImg,0,0) - if TypeBackground == nil then - TypeBackground = Bitmap.open("img/helicopter/type.png") - end - fields = TypeFields - lcd.drawBitmap(BackgroundImg,0,0) - lcd.drawBitmap(TypeBackground, 230, 0) - lcd.drawBitmap(ImgPageDn, 455, 95) - lcd.drawText(40, 20, "What Type of Helicopter ?") - lcd.drawFilledRectangle(40, 45, 200, 30, TEXT_BGCOLOR) - fields[2][4] = 0 - if fields[1][5] == 1 then - lcd.drawText(30, 100, "Specify your Swash Type") - lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) - fields[2][4] = 1 - end - local result = runFieldsPage(event) - return result -end - -local StyleFields = { - {50, 50, COMBO, 1, 0, { "Sport", "Light 3D","Full 3D" } }, -} - -local StyleBackground - -local function runStyleConfig(event) - lcd.clear() - - if StyleBackground == nil then - StyleBackground = Bitmap.open("img/helicopter/style.png") - end - lcd.drawBitmap(BackgroundImg,0,0) - lcd.drawBitmap(StyleBackground, 215, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = StyleFields - lcd.drawText(40, 20, "Your Flying Style") - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local SwitchFields = { - {50, 50, COMBO, 1, 1, { "SA", "SB", "SC", "SD", "SE", "SF" } }, - {50, 110, COMBO, 1, 5, { "SA", "SB", "SC", "SD", "SE", "SF","SG" } }, - {50, 190, COMBO, 1, 0, { "SA", "SB", "SC", "SD", "SE", "SF","SG" } }, -} - -local SwitchBackground - -local function runSwitchConfig(event) - lcd.clear() - if SwitchBackground == nil then - SwitchBackground = Bitmap.open("img/helicopter/switch.png") - end - lcd.drawBitmap(BackgroundImg,0,0) - lcd.drawBitmap(SwitchBackground, 270, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = SwitchFields - lcd.drawText(40, 20, "FM (Idle Up)") - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - lcd.drawText(40, 85, "Throttle Hold") - lcd.drawFilledRectangle(40, 105, 100, 30, TEXT_BGCOLOR) - fields[2][4]=1 - fields[3][4]=0 - if TypeFields[1][5]==1 then - lcd.drawText(40, 160, "Tail Gain") - lcd.drawFilledRectangle(40, 185, 100, 30, TEXT_BGCOLOR) - fields[3][4]=1 - end - local result = runFieldsPage(event) - return result -end - -local ThrFields = { - {50, 50, COMBO, 1, 2, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local ThrBackground - -local function runThrConfig(event) - lcd.clear() - if ThrBackground == nil then - ThrBackground = Bitmap.open("img/helicopter/throttle.png") - end - lcd.drawBitmap(BackgroundImg,0,0) - lcd.drawBitmap(ThrBackground, 215, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = ThrFields - lcd.drawText(40, 20, "Throttle Channel") - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local CurveFields = { - {50, 50, COMBO, 1, 0, { "Thr Up", "V Curve","Flat" } }, - {50, 120, COMBO, 1, 0, { "V Curve","Flat" } }, - {50, 190, COMBO, 1, 1, { "V Curve","Flat" } }, -} - -local CurveBackground - -local function runCurveConfig(event) - lcd.clear() - if CurveBackground == nil then - CurveBackground = Bitmap.open("img/helicopter/curve.png") - end - lcd.drawBitmap(BackgroundImg,0,0) - lcd.drawBitmap(CurveBackground, 200, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = CurveFields - lcd.drawText(40, 20, "Throttle Curve FM0") - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - lcd.drawText(40, 90, "Throttle Curve FM1") - lcd.drawFilledRectangle(40, 115, 100, 30, TEXT_BGCOLOR) - fields[2][4]=1 - lcd.drawText(40, 160, "Throttle Curve FM2") - lcd.drawFilledRectangle(40, 185, 100, 30, TEXT_BGCOLOR) - fields[3][4]=1 - local result = runFieldsPage(event) - return result -end - -local AilerFields = { - {50, 50, COMBO, 1, 0, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local AilerBackground - -local function runAilerConfig(event) - lcd.clear() - if AilerBackground == nil then - AilerBackground = Bitmap.open("img/helicopter/aileron.png") - end - lcd.drawBitmap(BackgroundImg,0,0) - lcd.drawBitmap(AilerBackground, 220, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = AilerFields - lcd.drawText(40, 20, "Aileron Channel") - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local EleFields = { - {50, 50, COMBO, 1, 1, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local EleBackground - -local function runEleConfig(event) - lcd.clear() - if EleBackground == nil then - EleBackground = Bitmap.open("img/helicopter/elevator.png") - end - lcd.drawBitmap(BackgroundImg,0,0) - lcd.drawBitmap(EleBackground, 220, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = EleFields - lcd.drawText(40, 20, "Elevator Channel") - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local RudFields = { - {50, 50, COMBO, 1, 3, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local RudBackground - -local function runRudConfig(event) - lcd.clear() - if RudBackground == nil then - RudBackground = Bitmap.open("img/helicopter/rudder.png") - end - lcd.drawBitmap(BackgroundImg,0,0) - lcd.drawBitmap(RudBackground, 220, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = RudFields - lcd.drawText(40, 20, "Rudder (Tail) Channel") - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local lineIndex - -local function drawNextChanelLine(text, text2) - lcd.drawText(40, lineIndex, text) - lcd.drawText(242, lineIndex, ": CH" .. text2 + 1) - lineIndex = lineIndex + 20 -end - -local function drawNextSwitchLine(text, text2) - lcd.drawText(40, lineIndex, text) - lcd.drawText(242, lineIndex, ": " ..switches[text2 + 1]) - lineIndex = lineIndex + 20 -end - -local function drawNextTextLine(text, text2) - lcd.drawText(40, lineIndex, text) - lcd.drawText(242, lineIndex, ": " ..text2) - lineIndex = lineIndex + 20 -end - -local function switchLine(text) - text=SwitchFields[2][5] - getFieldInfo(text) - swnum=text.id -end - -local ConfigSummaryFields = { - {110, 250, COMBO, 1, 0, { "No, I need to change something", "Yes, all is well, create the model !"} }, -} - -local function runConfigSummary(event) - lcd.clear() - fields = ConfigSummaryFields - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lineIndex = 10 - - -- Type - if TypeFields[1][5]==0 then - drawNextTextLine("Type","FBL") - else - drawNextTextLine("Type","FB") - if TypeFields[2][5]==0 then - lcd.drawText(290,10,"Swash 120") - elseif TypeFields[2][5]==1 then - lcd.drawText(290,10,"Swash 120X") - elseif TypeFields[2][5]==2 then - lcd.drawText(290,10,"Swash 140") - else - lcd.drawText(290,10,"Swash 90") - end - end - - -- Style - if StyleFields[1][5]==0 then - drawNextTextLine("Primary Style","Sport") - elseif StyleFields[1][5]==1 then - drawNextTextLine("Primary Style","Light 3D") - else - drawNextTextLine("Primary Style","Full 3D") - end - - -- Switch - drawNextSwitchLine("FM Switch",SwitchFields[1][5]) - drawNextSwitchLine("Th Hold Switch",SwitchFields[2][5]) - if TypeFields[1][5]==1 then - drawNextSwitchLine("Gyro Rate Switch",SwitchFields[3][5]) - end - - -- thr - drawNextChanelLine("Throttle Channel",ThrFields[1][5]) - - -- FM0 Curve - if CurveFields[1][5]==0 then - drawNextTextLine("FM0 Curve","Throttle Up") - elseif CurveFields[1][5]==1 then - drawNextTextLine("FM0 Curve","V Style") - else - drawNextTextLine("FM0 Curve","Flat Style") - end - - -- FM1 Curve - if CurveFields[2][5]==0 then - drawNextTextLine("FM1 Curve","V Style") - else - drawNextTextLine("FM1 Curve","Flat Style") - end - - -- FM3 Curve - if CurveFields[3][5]==0 then - drawNextTextLine("FM2 Curve","V Style") - else - drawNextTextLine("FM2 Curve","Flat Style") - end - - -- Ail - drawNextChanelLine("Aileron Channel",AilerFields[1][5]) - - -- Elev - drawNextChanelLine("Elevator Channel",EleFields[1][5]) - - -- Rudder - drawNextChanelLine("Rudder Channel",RudFields[1][5]) - - local result = runFieldsPage(event) - if(fields[1][5] == 1 and edit == false) then - selectPage(1) - end - return result -end - -local function createModel(event) - lcd.clear() - local b = SwitchFields[1][5] - local tUp = switchValues[b] - local i = SwitchFields[2][5] - local hold = switchValues[i] - local f = SwitchFields[3][5] - local gyRate = switchValues[f] - model.defaultInputs() - model.deleteMixes() - - -- Curve Fm0 - if StyleFields[1][5]==0 and CurveFields[1][5]==0 then - model.setCurve(0,{name="TC0",y={-100, 0, 20, 40, 40}}) - elseif StyleFields[1][5]==1 and CurveFields[1][5]==0 then - model.setCurve(0,{name="TC0",y={-100, 0, 35, 50, 50}}) - elseif StyleFields[1][5]==2 and CurveFields[1][5]==0 then - model.setCurve(0,{name="TC0",y={-100, 0, 40, 80, 80}}) - elseif StyleFields[1][5]==0 and CurveFields[1][5]==1 then - model.setCurve(0,{name="TC0",y={50, 40, 50}}) - elseif StyleFields[1][5]==1 and CurveFields[1][5]==1 then - model.setCurve(0,{name="TC0",y={65, 55, 65}}) - elseif StyleFields[1][5]==2 and CurveFields[1][5]==1 then - model.setCurve(0,{name="TC0",y={70, 60, 70}}) - elseif StyleFields[1][5]==0 and CurveFields[1][5]==2 then - model.setCurve(0,{name="TC0",y={60,60,60}}) - elseif StyleFields[1][5]==1 and CurveFields[1][5]==2 then - model.setCurve(0,{name="TC0",y={65,65,65}}) - else - model.setCurve(0,{name="TC0",y={70,70,70}}) - end - - --Curve FM1 - if StyleFields[1][5]==0 and CurveFields[2][5]==0 then - model.setCurve(1,{name="TC1",y={60, 50, 60}}) - elseif StyleFields[1][5]==1 and CurveFields[2][5]==0 then - model.setCurve(1,{name="TC1",y={70, 60, 70}}) - elseif StyleFields[1][5]==2 and CurveFields[2][5]==0 then - model.setCurve(1,{name="TC1",y={85, 75, 85}}) - elseif StyleFields[1][5]==0 and CurveFields[2][5]==1 then - model.setCurve(1,{name="TC1",y={65,65,65}}) - elseif StyleFields[1][5]==1 and CurveFields[2][5]==1 then - model.setCurve(1,{name="TC1",y={70,70,70}}) - else - model.setCurve(1,{name="TC1",y={85 ,85,85}}) - end - - --Curve FM2 - if StyleFields[1][5]>=0 and CurveFields[3][5]==0 then - model.setCurve(2,{name="Tc2",y={70, 60, 70}}) - elseif StyleFields[1][5]==1 and CurveFields[3][5]==0 then - model.setCurve(2,{name="TC2",y={85, 70, 85}}) - elseif StyleFields[1][5]==2 and CurveFields[3][5]==0 then - model.setCurve(2,{name="TC2",y={100, 90, 100}}) - elseif StyleFields[1][5]==0 and CurveFields[3][5]==1 then - model.setCurve(2,{name="TC2",y={75 ,75,75}}) - elseif StyleFields[1][5]==1 and CurveFields[3][5]==1 then - model.setCurve(2,{name="TC2",y={85 ,85, 85}}) - else - model.setCurve(2,{name="TC2",y={95 ,95, 95}}) - end - - --Curve TH Hold - model.setCurve(3,{name="THD",y={-100,-100,-100}}) - - -- Throttle - model.insertMix(ThrFields[1][5], 0,{name="Th0",weight=100,curveType=3,curveValue=1}) - model.insertMix(ThrFields[1][5], 1,{name="Th1",weight=100,switch=tUp,multiplex=2,curveType=3,curveValue=2}) - model.insertMix(ThrFields[1][5], 2,{name="Th2",weight=100,switch=tUp-1,multiplex=2,curveType=3,curveValue=3}) - model.insertMix(ThrFields[1][5], 3,{name="Hld",weight=100,offset=-15,switch=hold+1,multiplex=2,curveType=3,curveValue=4}) - model.setOutput(ThrFields[1][5],{name="Throt"}) - - -- Ail - if TypeFields[1][5] == 0 then - model.insertMix(AilerFields[1][5], 0,{name="Ail",weight=100}) - model.setOutput(AilerFields[1][5],{name="Ailer"}) - else - col2=getFieldInfo('cyc2').id - model.insertMix(AilerFields[1][5], 0,{source=col2,name="Ail",weight=100}) - model.setOutput(AilerFields[1][5],{name="Ailer"}) - end - - -- Elev - if TypeFields[1][5] == 0 then - model.insertMix(EleFields[1][5], 0,{name="Ele",weight=100}) - model.setOutput(EleFields[1][5],{name="Elev"}) - else - col1=getFieldInfo('cyc1').id - model.insertMix(EleFields[1][5], 0,{source=col1,name="Ele",weight=100}) - model.setOutput(EleFields[1][5],{name="Elev"}) - end - - -- Rudder - model.insertMix(RudFields[1][5], 0,{name="Rud",weight=100}) - model.setOutput(RudFields[1][5],{name="Rud"}) - - -- Gyro - - if TypeFields[1][5] == 0 then - model.insertMix(4, 0,{source=110,name="T.Gain",weight=25}) - model.setOutput(4,{name="T.Gain"}) - else - model.insertMix( 4, 0,{source=110,name="HHold",weight=25}) - model.insertMix( 4, 1,{source=110,name="Rate",weight=-25,switch=gyRate+1,multiplex=2}) - model.setOutput(4,{name="T.Gain"}) - end - - -- Pitch - if TypeFields[1][5] == 0 then - model.insertMix(5, 0,{source=89,name="Pch",weight=100}) - model.setOutput(5,{name="Pitch"}) - else - col3=getFieldInfo('cyc3').id - model.insertMix(5, 0,{source=col3,name="Pch",weight=100}) - model.setOutput(5,{name="Pitch"}) - end - - --Set Swash Parameters - if TypeFields[1][5]==1 and TypeFields[2][5]==0 then - model.setSwashRing({type=1,collectiveSource=89,aileronSource=90,elevatorSource=88,collectiveWeight=60,aileronWeight=60,elevatorWeight=60}) - elseif TypeFields[2][5]==1 then - model.setSwashRing({type=2,collectiveSource=89,aileronSource=90,elevatorSource=88,collectiveWeight=60,aileronWeight=60,elevatorWeight=60}) - elseif TypeFields[2][5]==2 then - model.setSwashRing({type=3,collectiveSource=89,aileronSource=90,elevatorSource=88,collectiveWeight=40,aileronWeight=40,elevatorWeight=60}) - elseif TypeFields[2][5]==3 then - model.setSwashRing({type=4,collectiveSource=89,aileronSource=90,elevatorSource=88,collectiveWeight=35,aileronWeight=35,elevatorWeight=60}) - end - lcd.drawText(70, 90, "Model successfully created !") - lcd.drawText(100, 130, "Press RTN to exit", Text_Color) - return 2 - end - --- Init -local function init() - current, edit = 1, false - pages = { - runTypeConfig, - runStyleConfig, - runSwitchConfig, - runThrConfig, - runCurveConfig, - runAilerConfig, - runEleConfig, - runRudConfig, - runConfigSummary, - createModel, - } -end - --- Main -local function run(event) - if event == nil then - error("Cannot be run as a model script!") - return 2 - elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages-1 then - selectPage(1) - elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then - killEvents(event); - selectPage(-1) - end - - local result = pages[page](event) - return result -end - -return { init=init, run=run } +---- ######################################################################### +---- # # +---- # Copyright (C) EdgeTX # +-----# # +-----# Credits: graphics by https://github.com/jrwieland # +-----# # +---- # 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. # +---- # # +---- ######################################################################### + +local VALUE = 0 +local COMBO = 1 +local edit = false +local page = 1 +local current = 1 +local pages = {} +local fields = {} +local switches = {"SA", "SB", "SC", "SD", "SE", "SF", "SG"} +local switchValues = {[0]=2, 5, 8, 11, 14, 17, 19} +local Text_Color= lcd.setColor(CUSTOM_COLOR, BLACK) + +chdir("/TEMPLATES/1.Wizard") + +-- load common Bitmaps +local BackgroundImg = Bitmap.open("img/background.png") +local ImgPageUp = Bitmap.open("img/pageup.png") +local ImgPageDn = Bitmap.open("img/pagedn.png") +local ImgSummary = Bitmap.open("img/summary.png") + +-- Change display attribute to current field +local function addField(step) + local field = fields[current] + local min, max + if field[3] == VALUE then + min = field[6] + max = field[7] + elseif field[3] == COMBO then + min = 0 + max = #(field[6]) - 1 + end + if (step < 0 and field[5] > min) or (step > 0 and field[5] < max) then + field[5] = field[5] + step + end +end + +-- Select the next or previous page +local function selectPage(step) + lcd.drawBitmap(BackgroundImg,0,0) + page = 1 + ((page + step - 1 + #pages) % #pages) + edit = false + current = 1 +end + +-- Select the next or previous editable field +local function selectField(step) + repeat + current = 1 + ((current + step - 1 + #fields) % #fields) + until fields[current][4]==1 +end + +-- Redraw the current page +local function redrawFieldsPage(event) + + for index = 1, 10, 1 do + local field = fields[index] + if field == nil then + break + end + + local attr = current == (index) and ((edit == true and BLINK or 0) + INVERS) or 0 + attr = attr + + if field[4] == 1 then + if field[3] == VALUE then + lcd.drawNumber(field[1], field[2], field[5], LEFT + attr) + elseif field[3] == COMBO then + if field[5] >= 0 and field[5] < #(field[6]) then + lcd.drawText(field[1],field[2], field[6][1+field[5]], attr) + end + end + end + end +end + +local function updateField(field) + local value = field[5] +end + +-- Main +local function runFieldsPage(event) + if event == EVT_VIRTUAL_EXIT then -- exit script + return 2 + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field + if fields[current][5] ~= nil then + edit = not edit + if edit == false then + lcd.clear() + updateField(fields[current]) + end + end + elseif edit then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then + addField(1) + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then + addField(-1) + end + else + if event == EVT_VIRTUAL_NEXT then + selectField(1) + elseif event == EVT_VIRTUAL_PREV then + selectField(-1) + end + end + redrawFieldsPage(event) + return 0 +end + +-- set visibility flags starting with SECOND field of fields +local function setFieldsVisible(...) + local arg={...} + local cnt = 2 + for i,v in ipairs(arg) do + fields[cnt][4] = v + cnt = cnt + 1 + end +end + +local TypeFields = { + {50, 50, COMBO, 1, 0, {"FBL", "FB" } }, + {43, 126, COMBO, 1, 0, {"120", "120X", "140", "90" } }, +} + +local TypeBackground + +local function runTypeConfig(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg,0,0) + if TypeBackground == nil then + TypeBackground = Bitmap.open("img/helicopter/type.png") + end + fields = TypeFields + lcd.drawBitmap(BackgroundImg,0,0) + lcd.drawBitmap(TypeBackground, 230, 0) + lcd.drawBitmap(ImgPageDn, 455, 95) + lcd.drawText(40, 20, "What Type of Helicopter ?") + lcd.drawFilledRectangle(40, 45, 200, 30, TEXT_BGCOLOR) + fields[2][4] = 0 + if fields[1][5] == 1 then + lcd.drawText(30, 100, "Specify your Swash Type") + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) + fields[2][4] = 1 + end + local result = runFieldsPage(event) + return result +end + +local StyleFields = { + {50, 50, COMBO, 1, 0, { "Sport", "Light 3D","Full 3D" } }, +} + +local StyleBackground + +local function runStyleConfig(event) + lcd.clear() + + if StyleBackground == nil then + StyleBackground = Bitmap.open("img/helicopter/style.png") + end + lcd.drawBitmap(BackgroundImg,0,0) + lcd.drawBitmap(StyleBackground, 215, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = StyleFields + lcd.drawText(40, 20, "Your Flying Style") + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local SwitchFields = { + {50, 50, COMBO, 1, 1, { "SA", "SB", "SC", "SD", "SE", "SF" } }, + {50, 110, COMBO, 1, 5, { "SA", "SB", "SC", "SD", "SE", "SF","SG" } }, + {50, 190, COMBO, 1, 0, { "SA", "SB", "SC", "SD", "SE", "SF","SG" } }, +} + +local SwitchBackground + +local function runSwitchConfig(event) + lcd.clear() + if SwitchBackground == nil then + SwitchBackground = Bitmap.open("img/helicopter/switch.png") + end + lcd.drawBitmap(BackgroundImg,0,0) + lcd.drawBitmap(SwitchBackground, 270, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = SwitchFields + lcd.drawText(40, 20, "FM (Idle Up)") + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + lcd.drawText(40, 85, "Throttle Hold") + lcd.drawFilledRectangle(40, 105, 100, 30, TEXT_BGCOLOR) + fields[2][4]=1 + fields[3][4]=0 + if TypeFields[1][5]==1 then + lcd.drawText(40, 160, "Tail Gain") + lcd.drawFilledRectangle(40, 185, 100, 30, TEXT_BGCOLOR) + fields[3][4]=1 + end + local result = runFieldsPage(event) + return result +end + +local ThrFields = { + {50, 50, COMBO, 1, 2, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, +} + +local ThrBackground + +local function runThrConfig(event) + lcd.clear() + if ThrBackground == nil then + ThrBackground = Bitmap.open("img/helicopter/throttle.png") + end + lcd.drawBitmap(BackgroundImg,0,0) + lcd.drawBitmap(ThrBackground, 215, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = ThrFields + lcd.drawText(40, 20, "Throttle Channel") + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local CurveFields = { + {50, 50, COMBO, 1, 0, { "Thr Up", "V Curve","Flat" } }, + {50, 120, COMBO, 1, 0, { "V Curve","Flat" } }, + {50, 190, COMBO, 1, 1, { "V Curve","Flat" } }, +} + +local CurveBackground + +local function runCurveConfig(event) + lcd.clear() + if CurveBackground == nil then + CurveBackground = Bitmap.open("img/helicopter/curve.png") + end + lcd.drawBitmap(BackgroundImg,0,0) + lcd.drawBitmap(CurveBackground, 200, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = CurveFields + lcd.drawText(40, 20, "Throttle Curve FM0") + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + lcd.drawText(40, 90, "Throttle Curve FM1") + lcd.drawFilledRectangle(40, 115, 100, 30, TEXT_BGCOLOR) + fields[2][4]=1 + lcd.drawText(40, 160, "Throttle Curve FM2") + lcd.drawFilledRectangle(40, 185, 100, 30, TEXT_BGCOLOR) + fields[3][4]=1 + local result = runFieldsPage(event) + return result +end + +local AilerFields = { + {50, 50, COMBO, 1, 0, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, +} + +local AilerBackground + +local function runAilerConfig(event) + lcd.clear() + if AilerBackground == nil then + AilerBackground = Bitmap.open("img/helicopter/aileron.png") + end + lcd.drawBitmap(BackgroundImg,0,0) + lcd.drawBitmap(AilerBackground, 220, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = AilerFields + lcd.drawText(40, 20, "Aileron Channel") + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local EleFields = { + {50, 50, COMBO, 1, 1, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, +} + +local EleBackground + +local function runEleConfig(event) + lcd.clear() + if EleBackground == nil then + EleBackground = Bitmap.open("img/helicopter/elevator.png") + end + lcd.drawBitmap(BackgroundImg,0,0) + lcd.drawBitmap(EleBackground, 220, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = EleFields + lcd.drawText(40, 20, "Elevator Channel") + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local RudFields = { + {50, 50, COMBO, 1, 3, { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, +} + +local RudBackground + +local function runRudConfig(event) + lcd.clear() + if RudBackground == nil then + RudBackground = Bitmap.open("img/helicopter/rudder.png") + end + lcd.drawBitmap(BackgroundImg,0,0) + lcd.drawBitmap(RudBackground, 220, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = RudFields + lcd.drawText(40, 20, "Rudder (Tail) Channel") + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local lineIndex + +local function drawNextChanelLine(text, text2) + lcd.drawText(40, lineIndex, text) + lcd.drawText(242, lineIndex, ": CH" .. text2 + 1) + lineIndex = lineIndex + 20 +end + +local function drawNextSwitchLine(text, text2) + lcd.drawText(40, lineIndex, text) + lcd.drawText(242, lineIndex, ": " ..switches[text2 + 1]) + lineIndex = lineIndex + 20 +end + +local function drawNextTextLine(text, text2) + lcd.drawText(40, lineIndex, text) + lcd.drawText(242, lineIndex, ": " ..text2) + lineIndex = lineIndex + 20 +end + +local function switchLine(text) + text=SwitchFields[2][5] + getFieldInfo(text) + swnum=text.id +end + +local ConfigSummaryFields = { + {110, 250, COMBO, 1, 0, { "No, I need to change something", "Yes, all is well, create the model !"} }, +} + +local function runConfigSummary(event) + lcd.clear() + fields = ConfigSummaryFields + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lineIndex = 10 + + -- Type + if TypeFields[1][5]==0 then + drawNextTextLine("Type","FBL") + else + drawNextTextLine("Type","FB") + if TypeFields[2][5]==0 then + lcd.drawText(290,10,"Swash 120") + elseif TypeFields[2][5]==1 then + lcd.drawText(290,10,"Swash 120X") + elseif TypeFields[2][5]==2 then + lcd.drawText(290,10,"Swash 140") + else + lcd.drawText(290,10,"Swash 90") + end + end + + -- Style + if StyleFields[1][5]==0 then + drawNextTextLine("Primary Style","Sport") + elseif StyleFields[1][5]==1 then + drawNextTextLine("Primary Style","Light 3D") + else + drawNextTextLine("Primary Style","Full 3D") + end + + -- Switch + drawNextSwitchLine("FM Switch",SwitchFields[1][5]) + drawNextSwitchLine("Th Hold Switch",SwitchFields[2][5]) + if TypeFields[1][5]==1 then + drawNextSwitchLine("Gyro Rate Switch",SwitchFields[3][5]) + end + + -- thr + drawNextChanelLine("Throttle Channel",ThrFields[1][5]) + + -- FM0 Curve + if CurveFields[1][5]==0 then + drawNextTextLine("FM0 Curve","Throttle Up") + elseif CurveFields[1][5]==1 then + drawNextTextLine("FM0 Curve","V Style") + else + drawNextTextLine("FM0 Curve","Flat Style") + end + + -- FM1 Curve + if CurveFields[2][5]==0 then + drawNextTextLine("FM1 Curve","V Style") + else + drawNextTextLine("FM1 Curve","Flat Style") + end + + -- FM3 Curve + if CurveFields[3][5]==0 then + drawNextTextLine("FM2 Curve","V Style") + else + drawNextTextLine("FM2 Curve","Flat Style") + end + + -- Ail + drawNextChanelLine("Aileron Channel",AilerFields[1][5]) + + -- Elev + drawNextChanelLine("Elevator Channel",EleFields[1][5]) + + -- Rudder + drawNextChanelLine("Rudder Channel",RudFields[1][5]) + + local result = runFieldsPage(event) + if(fields[1][5] == 1 and edit == false) then + selectPage(1) + end + return result +end + +local function createModel(event) + lcd.clear() + local b = SwitchFields[1][5] + local tUp = switchValues[b] + local i = SwitchFields[2][5] + local hold = switchValues[i] + local f = SwitchFields[3][5] + local gyRate = switchValues[f] + model.defaultInputs() + model.deleteMixes() + + -- Curve Fm0 + if StyleFields[1][5]==0 and CurveFields[1][5]==0 then + model.setCurve(0,{name="TC0",y={-100, 0, 20, 40, 40}}) + elseif StyleFields[1][5]==1 and CurveFields[1][5]==0 then + model.setCurve(0,{name="TC0",y={-100, 0, 35, 50, 50}}) + elseif StyleFields[1][5]==2 and CurveFields[1][5]==0 then + model.setCurve(0,{name="TC0",y={-100, 0, 40, 80, 80}}) + elseif StyleFields[1][5]==0 and CurveFields[1][5]==1 then + model.setCurve(0,{name="TC0",y={50, 40, 50}}) + elseif StyleFields[1][5]==1 and CurveFields[1][5]==1 then + model.setCurve(0,{name="TC0",y={65, 55, 65}}) + elseif StyleFields[1][5]==2 and CurveFields[1][5]==1 then + model.setCurve(0,{name="TC0",y={70, 60, 70}}) + elseif StyleFields[1][5]==0 and CurveFields[1][5]==2 then + model.setCurve(0,{name="TC0",y={60,60,60}}) + elseif StyleFields[1][5]==1 and CurveFields[1][5]==2 then + model.setCurve(0,{name="TC0",y={65,65,65}}) + else + model.setCurve(0,{name="TC0",y={70,70,70}}) + end + + --Curve FM1 + if StyleFields[1][5]==0 and CurveFields[2][5]==0 then + model.setCurve(1,{name="TC1",y={60, 50, 60}}) + elseif StyleFields[1][5]==1 and CurveFields[2][5]==0 then + model.setCurve(1,{name="TC1",y={70, 60, 70}}) + elseif StyleFields[1][5]==2 and CurveFields[2][5]==0 then + model.setCurve(1,{name="TC1",y={85, 75, 85}}) + elseif StyleFields[1][5]==0 and CurveFields[2][5]==1 then + model.setCurve(1,{name="TC1",y={65,65,65}}) + elseif StyleFields[1][5]==1 and CurveFields[2][5]==1 then + model.setCurve(1,{name="TC1",y={70,70,70}}) + else + model.setCurve(1,{name="TC1",y={85 ,85,85}}) + end + + --Curve FM2 + if StyleFields[1][5]>=0 and CurveFields[3][5]==0 then + model.setCurve(2,{name="Tc2",y={70, 60, 70}}) + elseif StyleFields[1][5]==1 and CurveFields[3][5]==0 then + model.setCurve(2,{name="TC2",y={85, 70, 85}}) + elseif StyleFields[1][5]==2 and CurveFields[3][5]==0 then + model.setCurve(2,{name="TC2",y={100, 90, 100}}) + elseif StyleFields[1][5]==0 and CurveFields[3][5]==1 then + model.setCurve(2,{name="TC2",y={75 ,75,75}}) + elseif StyleFields[1][5]==1 and CurveFields[3][5]==1 then + model.setCurve(2,{name="TC2",y={85 ,85, 85}}) + else + model.setCurve(2,{name="TC2",y={95 ,95, 95}}) + end + + --Curve TH Hold + model.setCurve(3,{name="THD",y={-100,-100,-100}}) + + -- Throttle + model.insertMix(ThrFields[1][5], 0,{name="Th0",weight=100,curveType=3,curveValue=1}) + model.insertMix(ThrFields[1][5], 1,{name="Th1",weight=100,switch=tUp,multiplex=2,curveType=3,curveValue=2}) + model.insertMix(ThrFields[1][5], 2,{name="Th2",weight=100,switch=tUp-1,multiplex=2,curveType=3,curveValue=3}) + model.insertMix(ThrFields[1][5], 3,{name="Hld",weight=100,offset=-15,switch=hold+1,multiplex=2,curveType=3,curveValue=4}) + model.setOutput(ThrFields[1][5],{name="Throt"}) + + -- Ail + if TypeFields[1][5] == 0 then + model.insertMix(AilerFields[1][5], 0,{name="Ail",weight=100}) + model.setOutput(AilerFields[1][5],{name="Ailer"}) + else + col2=getFieldInfo('cyc2').id + model.insertMix(AilerFields[1][5], 0,{source=col2,name="Ail",weight=100}) + model.setOutput(AilerFields[1][5],{name="Ailer"}) + end + + -- Elev + if TypeFields[1][5] == 0 then + model.insertMix(EleFields[1][5], 0,{name="Ele",weight=100}) + model.setOutput(EleFields[1][5],{name="Elev"}) + else + col1=getFieldInfo('cyc1').id + model.insertMix(EleFields[1][5], 0,{source=col1,name="Ele",weight=100}) + model.setOutput(EleFields[1][5],{name="Elev"}) + end + + -- Rudder + model.insertMix(RudFields[1][5], 0,{name="Rud",weight=100}) + model.setOutput(RudFields[1][5],{name="Rud"}) + + -- Gyro + + if TypeFields[1][5] == 0 then + model.insertMix(4, 0,{source=110,name="T.Gain",weight=25}) + model.setOutput(4,{name="T.Gain"}) + else + model.insertMix( 4, 0,{source=110,name="HHold",weight=25}) + model.insertMix( 4, 1,{source=110,name="Rate",weight=-25,switch=gyRate+1,multiplex=2}) + model.setOutput(4,{name="T.Gain"}) + end + + -- Pitch + if TypeFields[1][5] == 0 then + model.insertMix(5, 0,{source=89,name="Pch",weight=100}) + model.setOutput(5,{name="Pitch"}) + else + col3=getFieldInfo('cyc3').id + model.insertMix(5, 0,{source=col3,name="Pch",weight=100}) + model.setOutput(5,{name="Pitch"}) + end + + --Set Swash Parameters + if TypeFields[1][5]==1 and TypeFields[2][5]==0 then + model.setSwashRing({type=1,collectiveSource=89,aileronSource=90,elevatorSource=88,collectiveWeight=60,aileronWeight=60,elevatorWeight=60}) + elseif TypeFields[2][5]==1 then + model.setSwashRing({type=2,collectiveSource=89,aileronSource=90,elevatorSource=88,collectiveWeight=60,aileronWeight=60,elevatorWeight=60}) + elseif TypeFields[2][5]==2 then + model.setSwashRing({type=3,collectiveSource=89,aileronSource=90,elevatorSource=88,collectiveWeight=40,aileronWeight=40,elevatorWeight=60}) + elseif TypeFields[2][5]==3 then + model.setSwashRing({type=4,collectiveSource=89,aileronSource=90,elevatorSource=88,collectiveWeight=35,aileronWeight=35,elevatorWeight=60}) + end + selectPage(1) + return 0 +end + +local function onEnd(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgSummary, 300, 60) + + lcd.drawText(70, 90, "Model successfully created !") + lcd.drawText(100, 130, "Hold [RTN] to exit.", Text_Color) + return 0 +end + +-- Init +local function init() + current, edit = 1, false + pages = { + runTypeConfig, + runStyleConfig, + runSwitchConfig, + runThrConfig, + runCurveConfig, + runAilerConfig, + runEleConfig, + runRudConfig, + runConfigSummary, + createModel, + onEnd + } +end + + +-- Main +local function run(event, touchState) + if event == nil then + error("Cannot be run as a model script!") + return 2 + elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then + killEvents(event); + selectPage(-1) + elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages - 2 then + selectPage(1) + elseif event == EVT_TOUCH_FIRST and (touchState.x <= 40 and touchState.y >= 100 and touchState.y <= 160) then + print(string.format("(%s) %s - %s", page, touchState.x, touchState.y)) + selectPage(-1) + elseif event == EVT_TOUCH_FIRST and (touchState.x >= LCD_W - 40 and touchState.y >= 100 and touchState.y <= 160) then + print(string.format("(%s) %s - %s", page, touchState.x, touchState.y)) + if page ~= (#pages - 2) then + selectPage(1) + end + end + + local result = pages[page](event) + return result +end + +return { init=init, run=run } diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Helicopter.txt b/sdcard/c480x272/TEMPLATES/1.Wizard/4.Helicopter.txt similarity index 100% rename from sdcard/c480x272/TEMPLATES/WIZARD/Helicopter.txt rename to sdcard/c480x272/TEMPLATES/1.Wizard/4.Helicopter.txt diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Helicopter.yml b/sdcard/c480x272/TEMPLATES/1.Wizard/4.Helicopter.yml similarity index 94% rename from sdcard/c480x272/TEMPLATES/WIZARD/Helicopter.yml rename to sdcard/c480x272/TEMPLATES/1.Wizard/4.Helicopter.yml index c8767f6f..8966ad2b 100644 --- a/sdcard/c480x272/TEMPLATES/WIZARD/Helicopter.yml +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/4.Helicopter.yml @@ -1,178 +1,178 @@ -header: - name: "Helicopter" - bitmap: "" -telemetryProtocol: 0 -thrTrim: 0 -noGlobalFunctions: 0 -displayTrims: 0 -ignoreSensorIds: 0 -trimInc: 0 -disableThrottleWarning: 0 -displayChecklist: 0 -extendedLimits: 0 -extendedTrims: 0 -throttleReversed: 0 -enableCustomThrottleWarning: 0 -customThrottleWarningPosition: 0 -beepANACenter: 0 -mixData: - - - weight: 100 - destCh: 0 - srcRaw: I0 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 1 - srcRaw: I1 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 2 - srcRaw: I2 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 3 - srcRaw: I3 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" -expoData: - - - mode: 3 - scale: 0 - srcRaw: Rud - carryTrim: 0 - chn: 0 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Ele - carryTrim: 0 - chn: 1 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Thr - carryTrim: 0 - chn: 2 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Ail - carryTrim: 0 - chn: 3 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 -thrTraceSrc: Thr -switchWarningState: AuBuCuDuEuFuGuHu -rssiSource: none -thrTrimSw: 0 -potsWarnMode: WARN_OFF -jitterFilter: GLOBAL -inputNames: - 0: - val: "Rud" - 1: - val: "Ele" - 2: - val: "Thr" - 3: - val: "Ail" -potsWarnEnabled: 0 -screenData: - 0: - LayoutId: "Layout2P1" - layoutData: - options: - 0: - type: Bool - value: - boolValue: 1 - 1: - type: Bool - value: - boolValue: 1 - 2: - type: Bool - value: - boolValue: 1 - 3: - type: Bool - value: - boolValue: 1 - 4: - type: Bool - value: - boolValue: 0 -view: 0 -modelRegistrationID: "" +header: + name: "Helicopter" + bitmap: "" +telemetryProtocol: 0 +thrTrim: 0 +noGlobalFunctions: 0 +displayTrims: 0 +ignoreSensorIds: 0 +trimInc: 0 +disableThrottleWarning: 0 +displayChecklist: 0 +extendedLimits: 0 +extendedTrims: 0 +throttleReversed: 0 +enableCustomThrottleWarning: 0 +customThrottleWarningPosition: 0 +beepANACenter: 0 +mixData: + - + weight: 100 + destCh: 0 + srcRaw: I0 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 1 + srcRaw: I1 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 2 + srcRaw: I2 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 3 + srcRaw: I3 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" +expoData: + - + mode: 3 + scale: 0 + srcRaw: Rud + carryTrim: 0 + chn: 0 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 + - + mode: 3 + scale: 0 + srcRaw: Ele + carryTrim: 0 + chn: 1 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 + - + mode: 3 + scale: 0 + srcRaw: Thr + carryTrim: 0 + chn: 2 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 + - + mode: 3 + scale: 0 + srcRaw: Ail + carryTrim: 0 + chn: 3 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 +thrTraceSrc: Thr +switchWarningState: AuBuCuDuEuFuGuHu +rssiSource: none +thrTrimSw: 0 +potsWarnMode: WARN_OFF +jitterFilter: GLOBAL +inputNames: + 0: + val: "Rud" + 1: + val: "Ele" + 2: + val: "Thr" + 3: + val: "Ail" +potsWarnEnabled: 0 +screenData: + 0: + LayoutId: "Layout2P1" + layoutData: + options: + 0: + type: Bool + value: + boolValue: 1 + 1: + type: Bool + value: + boolValue: 1 + 2: + type: Bool + value: + boolValue: 1 + 3: + type: Bool + value: + boolValue: 1 + 4: + type: Bool + value: + boolValue: 0 +view: 0 +modelRegistrationID: "" diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/multirotor.lua b/sdcard/c480x272/TEMPLATES/1.Wizard/5.Multirotor.lua similarity index 92% rename from sdcard/c480x272/SCRIPTS/WIZARD/multirotor.lua rename to sdcard/c480x272/TEMPLATES/1.Wizard/5.Multirotor.lua index db6db2ae..a43acb3b 100644 --- a/sdcard/c480x272/SCRIPTS/WIZARD/multirotor.lua +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/5.Multirotor.lua @@ -1,411 +1,431 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) OpenTX # ------# # ------# Credits: graphics by Radiomaster # ------# # ----- # 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. # ----- # # ----- ######################################################################### - -local VALUE = 0 -local COMBO = 1 - -local edit = false -local page = 1 -local current = 1 -local pages = {} -local fields = {} -local switches = {"SA", "SB", "SC", "SD", "SE", "SF", "SG"} - --- load common Bitmaps -local ImgMarkBg = Bitmap.open("img/mark_bg.png") -local BackgroundImg = Bitmap.open("img/background.png") -local ImgPageUp = Bitmap.open("img/pageup.png") -local ImgPageDn = Bitmap.open("img/pagedn.png") - - --- Change display attribute to current field -local function addField(step) - local field = fields[current] - local min, max - if field[3] == VALUE then - min = field[6] - max = field[7] - elseif field[3] == COMBO then - min = 0 - max = #(field[6]) - 1 - end - if (step < 0 and field[5] > min) or (step > 0 and field[5] < max) then - field[5] = field[5] + step - end -end - --- Select the next or previous page -local function selectPage(step) - page = 1 + ((page + step - 1 + #pages) % #pages) - edit = false - current = 1 -end - --- Select the next or previous editable field -local function selectField(step) - repeat - current = 1 + ((current + step - 1 + #fields) % #fields) - until fields[current][4]==1 -end - --- Redraw the current page -local function redrawFieldsPage(event) - - for index = 1, 10, 1 do - local field = fields[index] - if field == nil then - break - end - - local attr = current == (index) and ((edit == true and BLINK or 0) + INVERS) or 0 - attr = attr + TEXT_COLOR - - if field[4] == 1 then - if field[3] == VALUE then - lcd.drawNumber(field[1], field[2], field[5], LEFT + attr) - elseif field[3] == COMBO then - if field[5] >= 0 and field[5] < #(field[6]) then - lcd.drawText(field[1],field[2], field[6][1+field[5]], attr) - end - end - end - end -end - -local function updateField(field) - local value = field[5] -end - --- Main -local function runFieldsPage(event) - if event == EVT_VIRTUAL_EXIT then -- exit script - return 2 - elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field - if fields[current][5] ~= nil then - edit = not edit - if edit == false then - updateField(fields[current]) - end - end - elseif edit then - if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then - addField(1) - elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then - addField(-1) - end - else - if event == EVT_VIRTUAL_NEXT then - selectField(1) - elseif event == EVT_VIRTUAL_PREV then - selectField(-1) - end - end - redrawFieldsPage(event) - return 0 -end - --- set visibility flags starting with SECOND field of fields -local function setFieldsVisible(...) - local arg={...} - local cnt = 2 - for i,v in ipairs(arg) do - fields[cnt][4] = v - cnt = cnt + 1 - end -end - --- draws one letter mark -local function drawMark(x, y, name) - lcd.drawBitmap(ImgMarkBg, x, y) - lcd.drawText(x+8, y+3, name, TEXT_COLOR) -end - - -local ThrottleFields = { - {50, 50, COMBO, 1, defaultChannel(2), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local ThrottleBackground - -local function runThrottleConfig(event) - lcd.clear() - if ThrottleBackground == nil then - ThrottleBackground = Bitmap.open("img/multirotor/throttle.png") - end - lcd.drawBitmap(ThrottleBackground, 0, 0) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = ThrottleFields - lcd.drawText(40, 20, "Assign Throttle channel", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local RollFields = { - {50, 50, COMBO, 1, defaultChannel(3), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local RollBackground - -local function runRollConfig(event) - lcd.clear() - if RollBackground == nil then - RollBackground = Bitmap.open("img/multirotor/roll.png") - end - lcd.drawBitmap(RollBackground, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = RollFields - lcd.drawText(40, 20, "Assign Roll channel", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local PitchFields = { - {50, 50, COMBO, 1, defaultChannel(1), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local PitchBackground - -local function runPitchConfig(event) - lcd.clear() - if PitchBackground == nil then - PitchBackground = Bitmap.open("img/multirotor/pitch.png") - end - lcd.drawBitmap(PitchBackground, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = PitchFields - lcd.drawText(40, 20, "Assign Pitch channel", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local YawFields = { - {50, 50, COMBO, 1, defaultChannel(0), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, -} - -local YawBackground - -local function runYawConfig(event) - lcd.clear() - if YawBackground == nil then - YawBackground = Bitmap.open("img/multirotor/yaw.png") - end - lcd.drawBitmap(YawBackground, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = YawFields - lcd.drawText(40, 20, "Assign Yaw channel", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local ArmFields = { - {50, 50, COMBO, 1, 5, { "SA", "SB", "SC", "SD", "SE", "SF"} }, -} - -local ArmBackground - -local function runArmConfig(event) - lcd.clear() - if ArmBackground == nil then - ArmBackground = Bitmap.open("img/multirotor/arm.png") - end - lcd.drawBitmap(ArmBackground, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = ArmFields - lcd.drawText(40, 20, "Assign Arm switch", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local BeeperFields = { - {50, 50, COMBO, 1, 3, { "SA", "SB", "SC", "SD", "SE", "SF"} }, -} - -local BeeperBackground - -local function runBeeperConfig(event) - lcd.clear() - if BeeperBackground == nil then - BeeperBackground = Bitmap.open("img/multirotor/beeper.png") - end - lcd.drawBitmap(BeeperBackground, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = BeeperFields - lcd.drawText(40, 20, "Assign Beeper switch", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local ModeFields = { - {50, 50, COMBO, 1, 0, { "SA", "SB", "SC", "SD", "SE", "SF"} }, -} - -local ModeBackground - -local function runModeConfig(event) - lcd.clear() - if ModeBackground == nil then - ModeBackground = Bitmap.open("img/multirotor/mode.png") - end - lcd.drawBitmap(ModeBackground, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgPageDn, 455, 95) - fields = ModeFields - lcd.drawText(40, 20, "Assign Mode switch", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) - fields[1][4]=1 - local result = runFieldsPage(event) - return result -end - -local lineIndex -local function drawNextChanelLine(text, text2) - lcd.drawText(40, lineIndex, text, TEXT_COLOR) - lcd.drawText(242, lineIndex, ": CH" .. text2 + 1, TEXT_COLOR) - lineIndex = lineIndex + 20 -end - -local function drawNextSwitchLine(text, text2) - lcd.drawText(40, lineIndex, text, TEXT_COLOR) - lcd.drawText(242, lineIndex, ": " ..switches[text2 + 1], TEXT_COLOR) - lineIndex = lineIndex + 20 -end - - -local ConfigSummaryFields = { - {110, 250, COMBO, 1, 0, { "No, I need to change something", "Yes, all is well, create the model !"} }, -} - -local ImgSummary - -local function runConfigSummary(event) - lcd.clear() - if ImgSummary == nil then - ImgSummary = Bitmap.open("img/summary.png") - end - fields = ConfigSummaryFields - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgPageUp, 0, 95) - lcd.drawBitmap(ImgSummary, 300, 60) - lineIndex = 40 - -- throttle - drawNextChanelLine("Throttle channel", ThrottleFields[1][5]) - -- roll - drawNextChanelLine("Roll channel",RollFields[1][5]) - -- pitch - drawNextChanelLine("Pitch channel",PitchFields[1][5]) - -- yaw - drawNextChanelLine("Yaw channel",YawFields[1][5]) - -- arm - drawNextSwitchLine("Arm switch",ArmFields[1][5]) - -- beeper - drawNextSwitchLine("Beeper switch",BeeperFields[1][5]) - -- mode - drawNextSwitchLine("Mode switch",ModeFields[1][5]) - - local result = runFieldsPage(event) - if(fields[1][5] == 1 and edit == false) then - selectPage(1) - end - return result -end - -local function addMix(channel, input, name, weight, index) - local mix = { source=input, name=name } - if weight ~= nil then - mix.weight = weight - end - if index == nil then - index = 0 - end - model.insertMix(channel, index, mix) -end - -local function createModel(event) - lcd.clear() - lcd.drawBitmap(BackgroundImg, 0, 0) - lcd.drawBitmap(ImgSummary, 300, 60) - model.defaultInputs() - model.deleteMixes() - -- throttle - addMix(ThrottleFields[1][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Thr") - -- roll - addMix(RollFields[1][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "Roll") - -- pitch - addMix(PitchFields[1][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Pitch") - -- yaw - addMix(YawFields[1][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "Yaw") - addMix(4, MIXSRC_SA + ArmFields[1][5], "Arm") - addMix(5, MIXSRC_SA + BeeperFields[1][5], "Beeper") - addMix(6, MIXSRC_SA + ModeFields[1][5], "Mode") - - lcd.drawText(70, 90, "Model successfully created !", TEXT_COLOR) - lcd.drawText(100, 130, "Press RTN to exit", TEXT_COLOR) - return 2 -end - --- Init -local function init() - current, edit = 1, false - pages = { - runThrottleConfig, - runRollConfig, - runPitchConfig, - runYawConfig, - runArmConfig, - runBeeperConfig, - runModeConfig, - runConfigSummary, - createModel, - } -end - --- Main -local function run(event) - if event == nil then - error("Cannot be run as a model script!") - return 2 - elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages-1 then - selectPage(1) - elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then - killEvents(event); - selectPage(-1) - end - - local result = pages[page](event) - return result -end - -return { init=init, run=run } +---- ######################################################################### +---- # # +---- # Copyright (C) OpenTX # +-----# # +-----# Credits: graphics by Radiomaster # +-----# # +---- # 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. # +---- # # +---- ######################################################################### + +local VALUE = 0 +local COMBO = 1 + +local edit = false +local page = 1 +local current = 1 +local pages = {} +local fields = {} +local switches = {"SA", "SB", "SC", "SD", "SE", "SF", "SG"} + +chdir("/TEMPLATES/1.Wizard") +-- load common Bitmaps +local ImgMarkBg = Bitmap.open("img/mark_bg.png") +local BackgroundImg = Bitmap.open("img/background.png") +local ImgPageUp = Bitmap.open("img/pageup.png") +local ImgPageDn = Bitmap.open("img/pagedn.png") + + +-- Change display attribute to current field +local function addField(step) + local field = fields[current] + local min, max + if field[3] == VALUE then + min = field[6] + max = field[7] + elseif field[3] == COMBO then + min = 0 + max = #(field[6]) - 1 + end + if (step < 0 and field[5] > min) or (step > 0 and field[5] < max) then + field[5] = field[5] + step + end +end + +-- Select the next or previous page +local function selectPage(step) + page = 1 + ((page + step - 1 + #pages) % #pages) + edit = false + current = 1 +end + +-- Select the next or previous editable field +local function selectField(step) + repeat + current = 1 + ((current + step - 1 + #fields) % #fields) + until fields[current][4]==1 +end + +-- Redraw the current page +local function redrawFieldsPage(event) + + for index = 1, 10, 1 do + local field = fields[index] + if field == nil then + break + end + + local attr = current == (index) and ((edit == true and BLINK or 0) + INVERS) or 0 + attr = attr + TEXT_COLOR + + if field[4] == 1 then + if field[3] == VALUE then + lcd.drawNumber(field[1], field[2], field[5], LEFT + attr) + elseif field[3] == COMBO then + if field[5] >= 0 and field[5] < #(field[6]) then + lcd.drawText(field[1],field[2], field[6][1+field[5]], attr) + end + end + end + end +end + +local function updateField(field) + local value = field[5] +end + +-- Main +local function runFieldsPage(event) + if event == EVT_VIRTUAL_EXIT then -- exit script + return 2 + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field + if fields[current][5] ~= nil then + edit = not edit + if edit == false then + updateField(fields[current]) + end + end + elseif edit then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then + addField(1) + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then + addField(-1) + end + else + if event == EVT_VIRTUAL_NEXT then + selectField(1) + elseif event == EVT_VIRTUAL_PREV then + selectField(-1) + end + end + redrawFieldsPage(event) + return 0 +end + +-- set visibility flags starting with SECOND field of fields +local function setFieldsVisible(...) + local arg={...} + local cnt = 2 + for i,v in ipairs(arg) do + fields[cnt][4] = v + cnt = cnt + 1 + end +end + +-- draws one letter mark +local function drawMark(x, y, name) + lcd.drawBitmap(ImgMarkBg, x, y) + lcd.drawText(x+8, y+3, name, TEXT_COLOR) +end + + +local ThrottleFields = { + {50, 50, COMBO, 1, defaultChannel(2), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, +} + +local ThrottleBackground + +local function runThrottleConfig(event) + lcd.clear() + if ThrottleBackground == nil then + ThrottleBackground = Bitmap.open("img/multirotor/throttle.png") + end + lcd.drawBitmap(ThrottleBackground, 0, 0) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = ThrottleFields + lcd.drawText(40, 20, "Assign Throttle channel", TEXT_COLOR) + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local RollFields = { + {50, 50, COMBO, 1, defaultChannel(3), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, +} + +local RollBackground + +local function runRollConfig(event) + lcd.clear() + if RollBackground == nil then + RollBackground = Bitmap.open("img/multirotor/roll.png") + end + lcd.drawBitmap(RollBackground, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = RollFields + lcd.drawText(40, 20, "Assign Roll channel", TEXT_COLOR) + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local PitchFields = { + {50, 50, COMBO, 1, defaultChannel(1), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, +} + +local PitchBackground + +local function runPitchConfig(event) + lcd.clear() + if PitchBackground == nil then + PitchBackground = Bitmap.open("img/multirotor/pitch.png") + end + lcd.drawBitmap(PitchBackground, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = PitchFields + lcd.drawText(40, 20, "Assign Pitch channel", TEXT_COLOR) + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local YawFields = { + {50, 50, COMBO, 1, defaultChannel(0), { "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8" } }, +} + +local YawBackground + +local function runYawConfig(event) + lcd.clear() + if YawBackground == nil then + YawBackground = Bitmap.open("img/multirotor/yaw.png") + end + lcd.drawBitmap(YawBackground, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = YawFields + lcd.drawText(40, 20, "Assign Yaw channel", TEXT_COLOR) + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local ArmFields = { + {50, 50, COMBO, 1, 5, { "SA", "SB", "SC", "SD", "SE", "SF"} }, +} + +local ArmBackground + +local function runArmConfig(event) + lcd.clear() + if ArmBackground == nil then + ArmBackground = Bitmap.open("img/multirotor/arm.png") + end + lcd.drawBitmap(ArmBackground, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = ArmFields + lcd.drawText(40, 20, "Assign Arm switch", TEXT_COLOR) + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local BeeperFields = { + {50, 50, COMBO, 1, 3, { "SA", "SB", "SC", "SD", "SE", "SF"} }, +} + +local BeeperBackground + +local function runBeeperConfig(event) + lcd.clear() + if BeeperBackground == nil then + BeeperBackground = Bitmap.open("img/multirotor/beeper.png") + end + lcd.drawBitmap(BeeperBackground, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = BeeperFields + lcd.drawText(40, 20, "Assign Beeper switch", TEXT_COLOR) + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local ModeFields = { + {50, 50, COMBO, 1, 0, { "SA", "SB", "SC", "SD", "SE", "SF"} }, +} + +local ModeBackground + +local function runModeConfig(event) + lcd.clear() + if ModeBackground == nil then + ModeBackground = Bitmap.open("img/multirotor/mode.png") + end + lcd.drawBitmap(ModeBackground, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgPageDn, 455, 95) + fields = ModeFields + lcd.drawText(40, 20, "Assign Mode switch", TEXT_COLOR) + lcd.drawFilledRectangle(40, 45, 100, 30, TEXT_BGCOLOR) + fields[1][4]=1 + local result = runFieldsPage(event) + return result +end + +local lineIndex +local function drawNextChanelLine(text, text2) + lcd.drawText(40, lineIndex, text, TEXT_COLOR) + lcd.drawText(242, lineIndex, ": CH" .. text2 + 1, TEXT_COLOR) + lineIndex = lineIndex + 20 +end + +local function drawNextSwitchLine(text, text2) + lcd.drawText(40, lineIndex, text, TEXT_COLOR) + lcd.drawText(242, lineIndex, ": " ..switches[text2 + 1], TEXT_COLOR) + lineIndex = lineIndex + 20 +end + + +local ConfigSummaryFields = { + {110, 250, COMBO, 1, 0, { "No, I need to change something", "Yes, all is well, create the model !"} }, +} + +local ImgSummary + +local function runConfigSummary(event) + lcd.clear() + if ImgSummary == nil then + ImgSummary = Bitmap.open("img/summary.png") + end + fields = ConfigSummaryFields + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgPageUp, 0, 95) + lcd.drawBitmap(ImgSummary, 300, 60) + lineIndex = 40 + -- throttle + drawNextChanelLine("Throttle channel", ThrottleFields[1][5]) + -- roll + drawNextChanelLine("Roll channel",RollFields[1][5]) + -- pitch + drawNextChanelLine("Pitch channel",PitchFields[1][5]) + -- yaw + drawNextChanelLine("Yaw channel",YawFields[1][5]) + -- arm + drawNextSwitchLine("Arm switch",ArmFields[1][5]) + -- beeper + drawNextSwitchLine("Beeper switch",BeeperFields[1][5]) + -- mode + drawNextSwitchLine("Mode switch",ModeFields[1][5]) + + local result = runFieldsPage(event) + if(fields[1][5] == 1 and edit == false) then + selectPage(1) + end + return result +end + +local function addMix(channel, input, name, weight, index) + local mix = { source=input, name=name } + if weight ~= nil then + mix.weight = weight + end + if index == nil then + index = 0 + end + model.insertMix(channel, index, mix) +end + +local function createModel(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgSummary, 300, 60) + model.defaultInputs() + model.deleteMixes() + -- throttle + addMix(ThrottleFields[1][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Thr") + -- roll + addMix(RollFields[1][5], MIXSRC_FIRST_INPUT+defaultChannel(0), "Roll") + -- pitch + addMix(PitchFields[1][5], MIXSRC_FIRST_INPUT+defaultChannel(1), "Pitch") + -- yaw + addMix(YawFields[1][5], MIXSRC_FIRST_INPUT+defaultChannel(3), "Yaw") + addMix(4, MIXSRC_SA + ArmFields[1][5], "Arm") + addMix(5, MIXSRC_SA + BeeperFields[1][5], "Beeper") + addMix(6, MIXSRC_SA + ModeFields[1][5], "Mode") + + selectPage(1) + return 0 +end + +local function onEnd(event) + lcd.clear() + lcd.drawBitmap(BackgroundImg, 0, 0) + lcd.drawBitmap(ImgSummary, 300, 60) + + lcd.drawText(70, 90, "Model successfully created !", COLOR_THEME_PRIMARY1) + lcd.drawText(100, 130, "Hold [RTN] to exit.", COLOR_THEME_PRIMARY1) + return 0 +end + +-- Init +local function init() + current, edit = 1, false + pages = { + runThrottleConfig, + runRollConfig, + runPitchConfig, + runYawConfig, + runArmConfig, + runBeeperConfig, + runModeConfig, + runConfigSummary, + createModel, + onEnd + } +end + + +-- Main +local function run(event, touchState) + if event == nil then + error("Cannot be run as a model script!") + return 2 + elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then + killEvents(event); + selectPage(-1) + elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages - 2 then + selectPage(1) + elseif event == EVT_TOUCH_FIRST and (touchState.x <= 40 and touchState.y >= 100 and touchState.y <= 160) then + print(string.format("(%s) %s - %s", page, touchState.x, touchState.y)) + selectPage(-1) + elseif event == EVT_TOUCH_FIRST and (touchState.x >= LCD_W - 40 and touchState.y >= 100 and touchState.y <= 160) then + print(string.format("(%s) %s - %s", page, touchState.x, touchState.y)) + if page ~= (#pages - 2) then + selectPage(1) + end + end + + local result = pages[page](event) + return result +end + +return { init=init, run=run } diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Multirotor.txt b/sdcard/c480x272/TEMPLATES/1.Wizard/5.Multirotor.txt similarity index 100% rename from sdcard/c480x272/TEMPLATES/WIZARD/Multirotor.txt rename to sdcard/c480x272/TEMPLATES/1.Wizard/5.Multirotor.txt diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Multirotor.yml b/sdcard/c480x272/TEMPLATES/1.Wizard/5.Multirotor.yml similarity index 94% rename from sdcard/c480x272/TEMPLATES/WIZARD/Multirotor.yml rename to sdcard/c480x272/TEMPLATES/1.Wizard/5.Multirotor.yml index 630b00be..8bb6c8d2 100644 --- a/sdcard/c480x272/TEMPLATES/WIZARD/Multirotor.yml +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/5.Multirotor.yml @@ -1,178 +1,178 @@ -header: - name: "Multirotor" - bitmap: "" -telemetryProtocol: 0 -thrTrim: 0 -noGlobalFunctions: 0 -displayTrims: 0 -ignoreSensorIds: 0 -trimInc: 0 -disableThrottleWarning: 0 -displayChecklist: 0 -extendedLimits: 0 -extendedTrims: 0 -throttleReversed: 0 -enableCustomThrottleWarning: 0 -customThrottleWarningPosition: 0 -beepANACenter: 0 -mixData: - - - weight: 100 - destCh: 0 - srcRaw: I0 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 1 - srcRaw: I1 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 2 - srcRaw: I2 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 3 - srcRaw: I3 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" -expoData: - - - mode: 3 - scale: 0 - srcRaw: Rud - carryTrim: 0 - chn: 0 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Ele - carryTrim: 0 - chn: 1 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Thr - carryTrim: 0 - chn: 2 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Ail - carryTrim: 0 - chn: 3 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 -thrTraceSrc: Thr -switchWarningState: AuBuCuDuEuFuGuHu -rssiSource: none -thrTrimSw: 0 -potsWarnMode: WARN_OFF -jitterFilter: GLOBAL -inputNames: - 0: - val: "Rud" - 1: - val: "Ele" - 2: - val: "Thr" - 3: - val: "Ail" -potsWarnEnabled: 0 -screenData: - 0: - LayoutId: "Layout2P1" - layoutData: - options: - 0: - type: Bool - value: - boolValue: 1 - 1: - type: Bool - value: - boolValue: 1 - 2: - type: Bool - value: - boolValue: 1 - 3: - type: Bool - value: - boolValue: 1 - 4: - type: Bool - value: - boolValue: 0 -view: 0 -modelRegistrationID: "" +header: + name: "Multirotor" + bitmap: "" +telemetryProtocol: 0 +thrTrim: 0 +noGlobalFunctions: 0 +displayTrims: 0 +ignoreSensorIds: 0 +trimInc: 0 +disableThrottleWarning: 0 +displayChecklist: 0 +extendedLimits: 0 +extendedTrims: 0 +throttleReversed: 0 +enableCustomThrottleWarning: 0 +customThrottleWarningPosition: 0 +beepANACenter: 0 +mixData: + - + weight: 100 + destCh: 0 + srcRaw: I0 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 1 + srcRaw: I1 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 2 + srcRaw: I2 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 3 + srcRaw: I3 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" +expoData: + - + mode: 3 + scale: 0 + srcRaw: Rud + carryTrim: 0 + chn: 0 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 + - + mode: 3 + scale: 0 + srcRaw: Ele + carryTrim: 0 + chn: 1 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 + - + mode: 3 + scale: 0 + srcRaw: Thr + carryTrim: 0 + chn: 2 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 + - + mode: 3 + scale: 0 + srcRaw: Ail + carryTrim: 0 + chn: 3 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "" + offset: 0 + curve: + type: 1 + value: 0 +thrTraceSrc: Thr +switchWarningState: AuBuCuDuEuFuGuHu +rssiSource: none +thrTrimSw: 0 +potsWarnMode: WARN_OFF +jitterFilter: GLOBAL +inputNames: + 0: + val: "Rud" + 1: + val: "Ele" + 2: + val: "Thr" + 3: + val: "Ail" +potsWarnEnabled: 0 +screenData: + 0: + LayoutId: "Layout2P1" + layoutData: + options: + 0: + type: Bool + value: + boolValue: 1 + 1: + type: Bool + value: + boolValue: 1 + 2: + type: Bool + value: + boolValue: 1 + 3: + type: Bool + value: + boolValue: 1 + 4: + type: Bool + value: + boolValue: 0 +view: 0 +modelRegistrationID: "" diff --git a/sdcard/c480x272/TEMPLATES/1.Wizard/about.txt b/sdcard/c480x272/TEMPLATES/1.Wizard/about.txt new file mode 100644 index 00000000..4bb8b9c7 --- /dev/null +++ b/sdcard/c480x272/TEMPLATES/1.Wizard/about.txt @@ -0,0 +1,3 @@ +Model wizard's (Official) + +creating new model using lua scripts & templates \ No newline at end of file diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/background.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/background.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/background.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/background.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/glider/brake.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/brake.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/glider/brake.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/brake.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/glider/flap.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/flap.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/glider/flap.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/flap.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/glider/glider.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/glider.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/glider/glider.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/glider.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/glider/lail.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/lail.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/glider/lail.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/lail.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/glider/prop.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/prop.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/glider/prop.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/prop.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/glider/rail.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/rail.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/glider/rail.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/rail.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/glider/tail.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/tail.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/glider/tail.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/tail.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/glider/tail_rud.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/tail_rud.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/glider/tail_rud.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/tail_rud.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/glider/vtail.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/vtail.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/glider/vtail.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/glider/vtail.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/aileron.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/aileron.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/aileron.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/aileron.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/curve.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/curve.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/curve.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/curve.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/elevator.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/elevator.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/elevator.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/elevator.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/pitch.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/pitch.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/pitch.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/pitch.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/rudder.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/rudder.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/rudder.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/rudder.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/style.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/style.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/style.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/style.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/switch.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/switch.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/switch.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/switch.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/throttle.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/throttle.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/throttle.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/throttle.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/type.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/type.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/helicopter/type.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/helicopter/type.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/mark_bg.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/mark_bg.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/mark_bg.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/mark_bg.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/arm.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/arm.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/arm.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/arm.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/beeper.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/beeper.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/beeper.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/beeper.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/mode.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/mode.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/mode.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/mode.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/pitch.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/pitch.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/pitch.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/pitch.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/roll.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/roll.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/roll.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/roll.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/throttle.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/throttle.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/throttle.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/throttle.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/yaw.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/yaw.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/multirotor/yaw.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/multirotor/yaw.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/pagedn.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/pagedn.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/pagedn.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/pagedn.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/pageup.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/pageup.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/pageup.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/pageup.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/plane/_vtail.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/_vtail.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/plane/_vtail.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/_vtail.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/plane/flap.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/flap.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/plane/flap.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/flap.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/plane/lail.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/lail.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/plane/lail.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/lail.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/plane/plane.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/plane.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/plane/plane.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/plane.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/plane/prop.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/prop.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/plane/prop.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/prop.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/plane/rail.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/rail.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/plane/rail.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/rail.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/plane/tail.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/tail.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/plane/tail.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/tail.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/plane/tail_rud.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/tail_rud.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/plane/tail_rud.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/plane/tail_rud.png diff --git a/sdcard/c480x272/SCRIPTS/WIZARD/img/summary.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/summary.png similarity index 100% rename from sdcard/c480x272/SCRIPTS/WIZARD/img/summary.png rename to sdcard/c480x272/TEMPLATES/1.Wizard/img/summary.png diff --git a/sdcard/c480x272/TEMPLATES/1.Wizard/img/wing/lail.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/wing/lail.png new file mode 100644 index 0000000000000000000000000000000000000000..00cff0cf68732bafe8929eaca5966a85842c1155 GIT binary patch literal 1742 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 B;XeQX literal 0 HcmV?d00001 diff --git a/sdcard/c480x272/TEMPLATES/1.Wizard/img/wing/prop.png b/sdcard/c480x272/TEMPLATES/1.Wizard/img/wing/prop.png new file mode 100644 index 0000000000000000000000000000000000000000..9c353400ff157f4a8e28c11c67e0264cd74c681a GIT binary patch literal 16601 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 JPDHLkV1gcvBwqjk literal 0 HcmV?d00001 diff --git a/sdcard/c480x272/TEMPLATES/PERSONAL/about.txt b/sdcard/c480x272/TEMPLATES/2.Personal/about.txt similarity index 100% rename from sdcard/c480x272/TEMPLATES/PERSONAL/about.txt rename to sdcard/c480x272/TEMPLATES/2.Personal/about.txt diff --git a/sdcard/c480x272/TEMPLATES/SoarETX/F3K RE.txt b/sdcard/c480x272/TEMPLATES/3.SoarETX/F3K RE.txt similarity index 100% rename from sdcard/c480x272/TEMPLATES/SoarETX/F3K RE.txt rename to sdcard/c480x272/TEMPLATES/3.SoarETX/F3K RE.txt diff --git a/sdcard/c480x272/TEMPLATES/SoarETX/F3K RE.yml b/sdcard/c480x272/TEMPLATES/3.SoarETX/F3K RE.yml similarity index 100% rename from sdcard/c480x272/TEMPLATES/SoarETX/F3K RE.yml rename to sdcard/c480x272/TEMPLATES/3.SoarETX/F3K RE.yml diff --git a/sdcard/c480x272/TEMPLATES/SoarETX/F3K TRAD.txt b/sdcard/c480x272/TEMPLATES/3.SoarETX/F3K TRAD.txt similarity index 100% rename from sdcard/c480x272/TEMPLATES/SoarETX/F3K TRAD.txt rename to sdcard/c480x272/TEMPLATES/3.SoarETX/F3K TRAD.txt diff --git a/sdcard/c480x272/TEMPLATES/SoarETX/F3K TRAD.yml b/sdcard/c480x272/TEMPLATES/3.SoarETX/F3K TRAD.yml similarity index 94% rename from sdcard/c480x272/TEMPLATES/SoarETX/F3K TRAD.yml rename to sdcard/c480x272/TEMPLATES/3.SoarETX/F3K TRAD.yml index 7f4a1ea2..51b912e4 100644 --- a/sdcard/c480x272/TEMPLATES/SoarETX/F3K TRAD.yml +++ b/sdcard/c480x272/TEMPLATES/3.SoarETX/F3K TRAD.yml @@ -1,1101 +1,1101 @@ -header: - name: "F3K-TRAD" - bitmap: "" -timers: - 0: - start: 0 - swtch: "L16" - value: 0 - mode: ON - countdownBeep: 0 - minuteBeep: 0 - persistent: 0 - countdownStart: -1 - name: "Flight" - 1: - start: 0 - swtch: "L15" - value: 0 - mode: ON - countdownBeep: 0 - minuteBeep: 0 - persistent: 0 - countdownStart: -1 - name: "Window" -telemetryProtocol: 0 -thrTrim: 0 -noGlobalFunctions: 0 -displayTrims: 2 -ignoreSensorIds: 0 -trimInc: 0 -disableThrottleWarning: 1 -displayChecklist: 0 -extendedLimits: 1 -extendedTrims: 0 -throttleReversed: 0 -beepANACenter: 0 -mixData: - - - weight: 100 - destCh: 0 - srcRaw: I0 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: GV3 - destCh: 0 - srcRaw: I2 - carryTrim: 1 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "AilRud" - - - weight: 100 - destCh: 1 - srcRaw: I1 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: -GV5 - destCh: 1 - srcRaw: ch(29) - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: GV5 - swtch: "NONE" - flightModes: 000000000 - curve: - type: 3 - value: 3 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "BrkEle" - - - weight: GV1 - destCh: 2 - srcRaw: I2 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "!L13" - flightModes: 000000000 - curve: - type: 0 - value: -GV4 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: -100 - destCh: 2 - srcRaw: ch(31) - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: GV1 - destCh: 3 - srcRaw: I2 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "!L13" - flightModes: 000000000 - curve: - type: 0 - value: GV4 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 3 - srcRaw: ch(31) - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 29 - srcRaw: I3 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - curve: - type: 3 - value: 6 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 29 - srcRaw: MAX - carryTrim: 0 - mixWarn: 0 - mltpx: REPL - offset: 0 - swtch: "L25" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "BrkOff" - - - weight: 10 - destCh: 30 - srcRaw: I5 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: -10 - swtch: "NONE" - flightModes: 011001111 - curve: - type: 3 - value: 6 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "Slider" - - - weight: 100 - destCh: 30 - srcRaw: I4 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: GV6 - destCh: 30 - srcRaw: I1 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - curve: - type: 3 - value: 4 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "SnpFlp" - - - weight: GV2 - destCh: 31 - srcRaw: ch(29) - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "Brake" - - - weight: GV2 - destCh: 31 - srcRaw: MAX - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: -100 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "Offset" - - - weight: 100 - destCh: 31 - srcRaw: ch(30) - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "!L13" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "Camber" - - - weight: 100 - destCh: 31 - srcRaw: I6 - carryTrim: 0 - mixWarn: 0 - mltpx: REPL - offset: 0 - swtch: "L11" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "Align" -limitData: - 0: - min: 0 - max: 0 - ppmCenter: 0 - offset: 0 - symetrical: 0 - revert: 0 - curve: 0 - name: "Rudd" - 1: - min: 0 - max: 0 - ppmCenter: 0 - offset: 0 - symetrical: 0 - revert: 0 - curve: 0 - name: "Elev" - 2: - min: 0 - max: 0 - ppmCenter: 0 - offset: 0 - symetrical: 0 - revert: 0 - curve: 1 - name: "Left" - 3: - min: 0 - max: 0 - ppmCenter: 0 - offset: 0 - symetrical: 0 - revert: 0 - curve: 2 - name: "Right" -expoData: - - - mode: 3 - scale: 0 - srcRaw: Rud - carryTrim: 0 - chn: 0 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "Rudder" - offset: 0 - - - mode: 3 - scale: 0 - srcRaw: Ele - carryTrim: 0 - chn: 1 - swtch: "NONE" - flightModes: 000000000 - weight: GV7 - name: "Elevat" - offset: 0 - curve: - type: 1 - value: GV9 - - - mode: 3 - scale: 0 - srcRaw: Ail - carryTrim: 0 - chn: 2 - swtch: "NONE" - flightModes: 000000000 - weight: GV8 - name: "Ailero" - offset: 0 - curve: - type: 1 - value: GV9 - - - mode: 3 - scale: 0 - srcRaw: Thr - carryTrim: 1 - chn: 3 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "Brake" - offset: 0 - - - mode: 3 - scale: 0 - srcRaw: TrimThr - carryTrim: 1 - chn: 4 - swtch: "NONE" - flightModes: 000000000 - weight: 50 - name: "CambPs" - offset: 0 - curve: - type: 0 - value: -100 - - - mode: 3 - scale: 0 - srcRaw: MAX - carryTrim: 1 - chn: 5 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "Camber" - offset: 0 - - - mode: 3 - scale: 0 - srcRaw: Thr - carryTrim: 1 - chn: 6 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "Align" - offset: 0 - curve: - type: 3 - value: 7 - - - mode: 3 - scale: 0 - srcRaw: S1 - carryTrim: 1 - chn: 7 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "Dial" - offset: 0 -curves: - 0: - type: 0 - smooth: 1 - points: 0 - name: "Lft" - 1: - type: 0 - smooth: 1 - points: 0 - name: "Rgt" - 2: - type: 0 - smooth: 0 - points: -2 - name: "BrF" - 3: - type: 1 - smooth: 0 - points: -1 - name: "Snp" - 4: - type: 0 - smooth: 0 - points: -2 - name: "Abs" - 5: - type: 1 - smooth: 0 - points: -2 - name: "DB" - 6: - type: 1 - smooth: 0 - points: 5 - name: "Aln" - 31: - type: 0 - smooth: 0 - points: 0 - name: "Mem" -points: - 0: - val: -100 - 1: - val: -50 - 3: - val: 50 - 4: - val: 100 - 5: - val: -100 - 6: - val: -50 - 8: - val: 50 - 9: - val: 100 - 10: - val: -100 - 11: - val: 50 - 12: - val: 100 - 13: - val: -100 - 14: - val: -100 - 17: - val: -50 - 19: - val: 100 - 21: - val: 100 - 22: - val: -100 - 23: - val: 100 - 24: - val: 100 - 25: - val: 90 - 26: - val: -100 - 27: - val: -100 - 28: - val: -50 - 29: - val: -50 - 32: - val: 50 - 33: - val: 50 - 34: - val: 100 - 35: - val: 100 - 36: - val: -75 - 37: - val: -75 - 38: - val: -25 - 39: - val: -25 - 40: - val: 25 - 41: - val: 25 - 42: - val: 75 - 43: - val: 75 -logicalSw: - 0: - func: FUNC_AND - def: "!SA1,NONE" - andsw: "L16" - delay: 0 - duration: 0 - 1: - func: FUNC_AND - def: "SA2,NONE" - andsw: "NONE" - delay: 0 - duration: 0 - 2: - func: FUNC_AND - def: "SB0,NONE" - andsw: "NONE" - delay: 0 - duration: 0 - 3: - func: FUNC_AND - def: "SB2,NONE" - andsw: "NONE" - delay: 0 - duration: 0 - 4: - func: FUNC_AND - def: "SD0,NONE" - andsw: "NONE" - delay: 0 - duration: 0 - 5: - func: FUNC_AND - def: "SD2,NONE" - andsw: "L1" - delay: 0 - duration: 0 - 6: - func: FUNC_OR - def: "SF2,L9" - andsw: "NONE" - delay: 0 - duration: 0 - 7: - func: FUNC_AND - def: "SH2,NONE" - andsw: "NONE" - delay: 0 - duration: 0 - 8: - func: FUNC_AND - def: "L7,NONE" - andsw: "NONE" - delay: 0 - duration: 3 - 10: - func: FUNC_STICKY - def: "L11,NONE" - andsw: "NONE" - delay: 0 - duration: 0 - 11: - func: FUNC_STICKY - def: "L12,NONE" - andsw: "NONE" - delay: 0 - duration: 0 - 12: - func: FUNC_OR - def: "L11,L12" - andsw: "NONE" - delay: 0 - duration: 0 - 14: - func: FUNC_STICKY - def: "L15,NONE" - andsw: "NONE" - delay: 0 - duration: 0 - 15: - func: FUNC_STICKY - def: "L16,NONE" - andsw: "NONE" - delay: 0 - duration: 0 - 17: - func: FUNC_ADIFFEGREATER - def: "Ail,6" - andsw: "NONE" - delay: 0 - duration: 0 - 18: - func: FUNC_ADIFFEGREATER - def: "Ele,6" - andsw: "NONE" - delay: 0 - duration: 0 - 19: - func: FUNC_OR - def: "L18,L19" - andsw: "NONE" - delay: 0 - duration: 0 - 20: - func: FUNC_STICKY - def: "FM1,L20" - andsw: "NONE" - delay: 0 - duration: 0 - 22: - func: FUNC_VPOS - def: "I3,90" - andsw: "!FM1" - delay: 0 - duration: 0 - 23: - func: FUNC_STICKY - def: "FM1,L23" - andsw: "NONE" - delay: 0 - duration: 0 - 24: - func: FUNC_OR - def: "L24,L13" - andsw: "NONE" - delay: 0 - duration: 0 - 25: - func: FUNC_AND - def: "!FM1,L24" - andsw: "!L23" - delay: 30 - duration: 0 - 27: - func: FUNC_AND - def: "FM2,L16" - andsw: "NONE" - delay: 0 - duration: 0 - 28: - func: FUNC_OR - def: "FM1,L28" - andsw: "L8" - delay: 0 - duration: 0 - 29: - func: FUNC_AND - def: "!L29,L16" - andsw: "L8" - delay: 0 - duration: 0 -customFn: - 0: - swtch: "L2" - func: VARIO - def: "" - 1: - swtch: "L5" - func: PLAY_VALUE - def: "TIMER2,10" - 2: - swtch: "L26" - func: PLAY_TRACK - def: "flapup,5" - 3: - swtch: "L29" - func: LOGS - def: "10" - 4: - swtch: "L30" - func: LOGS - def: "100" -flightModeData: - 0: - trim: - 2: - value: -20 - mode: 0 - name: "Cruise" - swtch: "NONE" - fadeIn: 0 - fadeOut: 0 - gvars: - 0: - val: 66 - 1: - val: 67 - 2: - val: 10 - 3: - val: 0 - 4: - val: 12 - 5: - val: 25 - 6: - val: 100 - 7: - val: 100 - 8: - val: 50 - 1: - trim: - 0: - value: 0 - mode: 1 - 1: - value: -60 - mode: 2 - 2: - value: 0 - mode: 2 - 3: - value: 0 - mode: 1 - name: "Launch" - swtch: "L7" - fadeIn: 0 - fadeOut: 0 - 2: - trim: - 0: - value: 0 - mode: 1 - 1: - value: 0 - mode: 1 - 2: - value: 0 - mode: 31 - 3: - value: 0 - mode: 1 - name: "Zoom" - swtch: "L21" - fadeIn: 0 - fadeOut: 0 - 3: - trim: - 1: - value: 0 - mode: 1 - 2: - value: 0 - mode: 31 - name: "Speed" - swtch: "L3" - fadeIn: 0 - fadeOut: 0 - gvars: - 6: - val: 100 - 7: - val: 100 - 8: - val: 50 - 4: - trim: - 1: - value: 0 - mode: 1 - 2: - value: -40 - mode: 8 - name: "Float" - swtch: "L4" - fadeIn: 0 - fadeOut: 0 - gvars: - 6: - val: 100 - 7: - val: 100 - 8: - val: 50 -thrTraceSrc: Thr -switchWarningState: -gvars: - 0: - name: "Ail" - min: 0 - max: 0 - popup: 0 - prec: 0 - unit: 0 - 1: - name: "Brk" - min: 0 - max: 0 - popup: 0 - prec: 0 - unit: 0 - 2: - name: "AiR" - min: 0 - max: 0 - popup: 0 - prec: 0 - unit: 0 - 3: - name: "Dif" - min: 0 - max: 0 - popup: 0 - prec: 0 - unit: 0 - 4: - name: "BkE" - min: 0 - max: 0 - popup: 0 - prec: 0 - unit: 0 - 5: - name: "Snp" - min: 0 - max: 0 - popup: 0 - prec: 0 - unit: 0 - 6: - name: "Ele" - min: 0 - max: 0 - popup: 0 - prec: 0 - unit: 0 - 7: - name: "Ail" - min: 0 - max: 0 - popup: 0 - prec: 0 - unit: 0 - 8: - name: "Exp" - min: 0 - max: 0 - popup: 0 - prec: 0 - unit: 0 -varioData: - source: 6 - centerSilent: 0 - centerMax: 0 - centerMin: 0 - min: 0 - max: 0 -rssiSource: none -thrTrimSw: 0 -potsWarnMode: WARN_OFF -failsafeChannels: - 4: - val: 1024 - 5: - val: -1024 - 6: - val: -1024 -inputNames: - 0: - val: "Rudd" - 1: - val: "Elev" - 2: - val: "Aile" - 3: - val: "Brk" - 4: - val: "CbPS" - 5: - val: "Cmb" - 6: - val: "Aln" - 7: - val: "Pokr" -potsWarnEnabled: 0 -screenData: - 0: - LayoutId: "Layout1x1" - layoutData: - zones: - 0: - widgetName: "SoarETX" - widgetData: - options: - 0: - type: Signed - value: - signedValue: 1 - 1: - type: String - value: - stringValue: "f3k" - options: - 0: - type: Bool - value: - boolValue: 1 - 1: - type: Bool - value: - boolValue: 1 - 2: - type: Bool - value: - boolValue: 0 - 3: - type: Bool - value: - boolValue: 1 - 4: - type: Bool - value: - boolValue: 0 - 1: - LayoutId: "Layout2x3" - layoutData: - zones: - 0: - widgetName: "SoarETX" - widgetData: - options: - 0: - type: Signed - value: - signedValue: 1 - 1: - type: String - value: - stringValue: "outputs" - 1: - widgetName: "SoarETX" - widgetData: - options: - 0: - type: Signed - value: - signedValue: 1 - 1: - type: String - value: - stringValue: "wing2" - 2: - widgetName: "SoarETX" - widgetData: - options: - 0: - type: Signed - value: - signedValue: 1 - 1: - type: String - value: - stringValue: "f3k_mix" - 3: - widgetName: "SoarETX" - widgetData: - options: - 0: - type: Signed - value: - signedValue: 1 - 1: - type: String - value: - stringValue: "f3k_ctr" - 4: - widgetName: "SoarETX" - widgetData: - options: - 0: - type: Signed - value: - signedValue: 1 - 1: - type: String - value: - stringValue: "graph" - 5: - widgetName: "SoarETX" - widgetData: - options: - 0: - type: Signed - value: - signedValue: 1 - 1: - type: String - value: - stringValue: "f3k_sw" - options: - 0: - type: Bool - value: - boolValue: 1 - 1: - type: Bool - value: - boolValue: 1 - 2: - type: Bool - value: - boolValue: 0 - 3: - type: Bool - value: - boolValue: 1 - 4: - type: Bool - value: - boolValue: 0 -topbarData: - zones: - 0: - widgetName: "SoarETX" - widgetData: - options: - 0: - type: Signed - value: - signedValue: 1 - 1: - type: String - value: - stringValue: "name" - 3: - widgetName: "SoarETX" - widgetData: - options: - 0: - type: Signed - value: - signedValue: 1 - 1: - type: String - value: - stringValue: "battery" -view: 1 -modelRegistrationID: "" +header: + name: "F3K-TRAD" + bitmap: "" +timers: + 0: + start: 0 + swtch: "L16" + value: 0 + mode: ON + countdownBeep: 0 + minuteBeep: 0 + persistent: 0 + countdownStart: -1 + name: "Flight" + 1: + start: 0 + swtch: "L15" + value: 0 + mode: ON + countdownBeep: 0 + minuteBeep: 0 + persistent: 0 + countdownStart: -1 + name: "Window" +telemetryProtocol: 0 +thrTrim: 0 +noGlobalFunctions: 0 +displayTrims: 2 +ignoreSensorIds: 0 +trimInc: 0 +disableThrottleWarning: 1 +displayChecklist: 0 +extendedLimits: 1 +extendedTrims: 0 +throttleReversed: 0 +beepANACenter: 0 +mixData: + - + weight: 100 + destCh: 0 + srcRaw: I0 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: GV3 + destCh: 0 + srcRaw: I2 + carryTrim: 1 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "AilRud" + - + weight: 100 + destCh: 1 + srcRaw: I1 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: -GV5 + destCh: 1 + srcRaw: ch(29) + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: GV5 + swtch: "NONE" + flightModes: 000000000 + curve: + type: 3 + value: 3 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "BrkEle" + - + weight: GV1 + destCh: 2 + srcRaw: I2 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "!L13" + flightModes: 000000000 + curve: + type: 0 + value: -GV4 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: -100 + destCh: 2 + srcRaw: ch(31) + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: GV1 + destCh: 3 + srcRaw: I2 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "!L13" + flightModes: 000000000 + curve: + type: 0 + value: GV4 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 3 + srcRaw: ch(31) + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 29 + srcRaw: I3 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + curve: + type: 3 + value: 6 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: 100 + destCh: 29 + srcRaw: MAX + carryTrim: 0 + mixWarn: 0 + mltpx: REPL + offset: 0 + swtch: "L25" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "BrkOff" + - + weight: 10 + destCh: 30 + srcRaw: I5 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: -10 + swtch: "NONE" + flightModes: 011001111 + curve: + type: 3 + value: 6 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "Slider" + - + weight: 100 + destCh: 30 + srcRaw: I4 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "" + - + weight: GV6 + destCh: 30 + srcRaw: I1 + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + curve: + type: 3 + value: 4 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "SnpFlp" + - + weight: GV2 + destCh: 31 + srcRaw: ch(29) + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "Brake" + - + weight: GV2 + destCh: 31 + srcRaw: MAX + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: -100 + swtch: "NONE" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "Offset" + - + weight: 100 + destCh: 31 + srcRaw: ch(30) + carryTrim: 0 + mixWarn: 0 + mltpx: ADD + offset: 0 + swtch: "!L13" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "Camber" + - + weight: 100 + destCh: 31 + srcRaw: I6 + carryTrim: 0 + mixWarn: 0 + mltpx: REPL + offset: 0 + swtch: "L11" + flightModes: 000000000 + delayUp: 0 + delayDown: 0 + speedUp: 0 + speedDown: 0 + name: "Align" +limitData: + 0: + min: 0 + max: 0 + ppmCenter: 0 + offset: 0 + symetrical: 0 + revert: 0 + curve: 0 + name: "Rudd" + 1: + min: 0 + max: 0 + ppmCenter: 0 + offset: 0 + symetrical: 0 + revert: 0 + curve: 0 + name: "Elev" + 2: + min: 0 + max: 0 + ppmCenter: 0 + offset: 0 + symetrical: 0 + revert: 0 + curve: 1 + name: "Left" + 3: + min: 0 + max: 0 + ppmCenter: 0 + offset: 0 + symetrical: 0 + revert: 0 + curve: 2 + name: "Right" +expoData: + - + mode: 3 + scale: 0 + srcRaw: Rud + carryTrim: 0 + chn: 0 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "Rudder" + offset: 0 + - + mode: 3 + scale: 0 + srcRaw: Ele + carryTrim: 0 + chn: 1 + swtch: "NONE" + flightModes: 000000000 + weight: GV7 + name: "Elevat" + offset: 0 + curve: + type: 1 + value: GV9 + - + mode: 3 + scale: 0 + srcRaw: Ail + carryTrim: 0 + chn: 2 + swtch: "NONE" + flightModes: 000000000 + weight: GV8 + name: "Ailero" + offset: 0 + curve: + type: 1 + value: GV9 + - + mode: 3 + scale: 0 + srcRaw: Thr + carryTrim: 1 + chn: 3 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "Brake" + offset: 0 + - + mode: 3 + scale: 0 + srcRaw: TrimThr + carryTrim: 1 + chn: 4 + swtch: "NONE" + flightModes: 000000000 + weight: 50 + name: "CambPs" + offset: 0 + curve: + type: 0 + value: -100 + - + mode: 3 + scale: 0 + srcRaw: MAX + carryTrim: 1 + chn: 5 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "Camber" + offset: 0 + - + mode: 3 + scale: 0 + srcRaw: Thr + carryTrim: 1 + chn: 6 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "Align" + offset: 0 + curve: + type: 3 + value: 7 + - + mode: 3 + scale: 0 + srcRaw: S1 + carryTrim: 1 + chn: 7 + swtch: "NONE" + flightModes: 000000000 + weight: 100 + name: "Dial" + offset: 0 +curves: + 0: + type: 0 + smooth: 1 + points: 0 + name: "Lft" + 1: + type: 0 + smooth: 1 + points: 0 + name: "Rgt" + 2: + type: 0 + smooth: 0 + points: -2 + name: "BrF" + 3: + type: 1 + smooth: 0 + points: -1 + name: "Snp" + 4: + type: 0 + smooth: 0 + points: -2 + name: "Abs" + 5: + type: 1 + smooth: 0 + points: -2 + name: "DB" + 6: + type: 1 + smooth: 0 + points: 5 + name: "Aln" + 31: + type: 0 + smooth: 0 + points: 0 + name: "Mem" +points: + 0: + val: -100 + 1: + val: -50 + 3: + val: 50 + 4: + val: 100 + 5: + val: -100 + 6: + val: -50 + 8: + val: 50 + 9: + val: 100 + 10: + val: -100 + 11: + val: 50 + 12: + val: 100 + 13: + val: -100 + 14: + val: -100 + 17: + val: -50 + 19: + val: 100 + 21: + val: 100 + 22: + val: -100 + 23: + val: 100 + 24: + val: 100 + 25: + val: 90 + 26: + val: -100 + 27: + val: -100 + 28: + val: -50 + 29: + val: -50 + 32: + val: 50 + 33: + val: 50 + 34: + val: 100 + 35: + val: 100 + 36: + val: -75 + 37: + val: -75 + 38: + val: -25 + 39: + val: -25 + 40: + val: 25 + 41: + val: 25 + 42: + val: 75 + 43: + val: 75 +logicalSw: + 0: + func: FUNC_AND + def: "!SA1,NONE" + andsw: "L16" + delay: 0 + duration: 0 + 1: + func: FUNC_AND + def: "SA2,NONE" + andsw: "NONE" + delay: 0 + duration: 0 + 2: + func: FUNC_AND + def: "SB0,NONE" + andsw: "NONE" + delay: 0 + duration: 0 + 3: + func: FUNC_AND + def: "SB2,NONE" + andsw: "NONE" + delay: 0 + duration: 0 + 4: + func: FUNC_AND + def: "SD0,NONE" + andsw: "NONE" + delay: 0 + duration: 0 + 5: + func: FUNC_AND + def: "SD2,NONE" + andsw: "L1" + delay: 0 + duration: 0 + 6: + func: FUNC_OR + def: "SF2,L9" + andsw: "NONE" + delay: 0 + duration: 0 + 7: + func: FUNC_AND + def: "SH2,NONE" + andsw: "NONE" + delay: 0 + duration: 0 + 8: + func: FUNC_AND + def: "L7,NONE" + andsw: "NONE" + delay: 0 + duration: 3 + 10: + func: FUNC_STICKY + def: "L11,NONE" + andsw: "NONE" + delay: 0 + duration: 0 + 11: + func: FUNC_STICKY + def: "L12,NONE" + andsw: "NONE" + delay: 0 + duration: 0 + 12: + func: FUNC_OR + def: "L11,L12" + andsw: "NONE" + delay: 0 + duration: 0 + 14: + func: FUNC_STICKY + def: "L15,NONE" + andsw: "NONE" + delay: 0 + duration: 0 + 15: + func: FUNC_STICKY + def: "L16,NONE" + andsw: "NONE" + delay: 0 + duration: 0 + 17: + func: FUNC_ADIFFEGREATER + def: "Ail,6" + andsw: "NONE" + delay: 0 + duration: 0 + 18: + func: FUNC_ADIFFEGREATER + def: "Ele,6" + andsw: "NONE" + delay: 0 + duration: 0 + 19: + func: FUNC_OR + def: "L18,L19" + andsw: "NONE" + delay: 0 + duration: 0 + 20: + func: FUNC_STICKY + def: "FM1,L20" + andsw: "NONE" + delay: 0 + duration: 0 + 22: + func: FUNC_VPOS + def: "I3,90" + andsw: "!FM1" + delay: 0 + duration: 0 + 23: + func: FUNC_STICKY + def: "FM1,L23" + andsw: "NONE" + delay: 0 + duration: 0 + 24: + func: FUNC_OR + def: "L24,L13" + andsw: "NONE" + delay: 0 + duration: 0 + 25: + func: FUNC_AND + def: "!FM1,L24" + andsw: "!L23" + delay: 30 + duration: 0 + 27: + func: FUNC_AND + def: "FM2,L16" + andsw: "NONE" + delay: 0 + duration: 0 + 28: + func: FUNC_OR + def: "FM1,L28" + andsw: "L8" + delay: 0 + duration: 0 + 29: + func: FUNC_AND + def: "!L29,L16" + andsw: "L8" + delay: 0 + duration: 0 +customFn: + 0: + swtch: "L2" + func: VARIO + def: "" + 1: + swtch: "L5" + func: PLAY_VALUE + def: "TIMER2,10" + 2: + swtch: "L26" + func: PLAY_TRACK + def: "flapup,5" + 3: + swtch: "L29" + func: LOGS + def: "10" + 4: + swtch: "L30" + func: LOGS + def: "100" +flightModeData: + 0: + trim: + 2: + value: -20 + mode: 0 + name: "Cruise" + swtch: "NONE" + fadeIn: 0 + fadeOut: 0 + gvars: + 0: + val: 66 + 1: + val: 67 + 2: + val: 10 + 3: + val: 0 + 4: + val: 12 + 5: + val: 25 + 6: + val: 100 + 7: + val: 100 + 8: + val: 50 + 1: + trim: + 0: + value: 0 + mode: 1 + 1: + value: -60 + mode: 2 + 2: + value: 0 + mode: 2 + 3: + value: 0 + mode: 1 + name: "Launch" + swtch: "L7" + fadeIn: 0 + fadeOut: 0 + 2: + trim: + 0: + value: 0 + mode: 1 + 1: + value: 0 + mode: 1 + 2: + value: 0 + mode: 31 + 3: + value: 0 + mode: 1 + name: "Zoom" + swtch: "L21" + fadeIn: 0 + fadeOut: 0 + 3: + trim: + 1: + value: 0 + mode: 1 + 2: + value: 0 + mode: 31 + name: "Speed" + swtch: "L3" + fadeIn: 0 + fadeOut: 0 + gvars: + 6: + val: 100 + 7: + val: 100 + 8: + val: 50 + 4: + trim: + 1: + value: 0 + mode: 1 + 2: + value: -40 + mode: 8 + name: "Float" + swtch: "L4" + fadeIn: 0 + fadeOut: 0 + gvars: + 6: + val: 100 + 7: + val: 100 + 8: + val: 50 +thrTraceSrc: Thr +switchWarningState: +gvars: + 0: + name: "Ail" + min: 0 + max: 0 + popup: 0 + prec: 0 + unit: 0 + 1: + name: "Brk" + min: 0 + max: 0 + popup: 0 + prec: 0 + unit: 0 + 2: + name: "AiR" + min: 0 + max: 0 + popup: 0 + prec: 0 + unit: 0 + 3: + name: "Dif" + min: 0 + max: 0 + popup: 0 + prec: 0 + unit: 0 + 4: + name: "BkE" + min: 0 + max: 0 + popup: 0 + prec: 0 + unit: 0 + 5: + name: "Snp" + min: 0 + max: 0 + popup: 0 + prec: 0 + unit: 0 + 6: + name: "Ele" + min: 0 + max: 0 + popup: 0 + prec: 0 + unit: 0 + 7: + name: "Ail" + min: 0 + max: 0 + popup: 0 + prec: 0 + unit: 0 + 8: + name: "Exp" + min: 0 + max: 0 + popup: 0 + prec: 0 + unit: 0 +varioData: + source: 6 + centerSilent: 0 + centerMax: 0 + centerMin: 0 + min: 0 + max: 0 +rssiSource: none +thrTrimSw: 0 +potsWarnMode: WARN_OFF +failsafeChannels: + 4: + val: 1024 + 5: + val: -1024 + 6: + val: -1024 +inputNames: + 0: + val: "Rudd" + 1: + val: "Elev" + 2: + val: "Aile" + 3: + val: "Brk" + 4: + val: "CbPS" + 5: + val: "Cmb" + 6: + val: "Aln" + 7: + val: "Pokr" +potsWarnEnabled: 0 +screenData: + 0: + LayoutId: "Layout1x1" + layoutData: + zones: + 0: + widgetName: "SoarETX" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: String + value: + stringValue: "f3k" + options: + 0: + type: Bool + value: + boolValue: 1 + 1: + type: Bool + value: + boolValue: 1 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Bool + value: + boolValue: 1 + 4: + type: Bool + value: + boolValue: 0 + 1: + LayoutId: "Layout2x3" + layoutData: + zones: + 0: + widgetName: "SoarETX" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: String + value: + stringValue: "outputs" + 1: + widgetName: "SoarETX" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: String + value: + stringValue: "wing2" + 2: + widgetName: "SoarETX" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: String + value: + stringValue: "f3k_mix" + 3: + widgetName: "SoarETX" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: String + value: + stringValue: "f3k_ctr" + 4: + widgetName: "SoarETX" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: String + value: + stringValue: "graph" + 5: + widgetName: "SoarETX" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: String + value: + stringValue: "f3k_sw" + options: + 0: + type: Bool + value: + boolValue: 1 + 1: + type: Bool + value: + boolValue: 1 + 2: + type: Bool + value: + boolValue: 0 + 3: + type: Bool + value: + boolValue: 1 + 4: + type: Bool + value: + boolValue: 0 +topbarData: + zones: + 0: + widgetName: "SoarETX" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: String + value: + stringValue: "name" + 3: + widgetName: "SoarETX" + widgetData: + options: + 0: + type: Signed + value: + signedValue: 1 + 1: + type: String + value: + stringValue: "battery" +view: 1 +modelRegistrationID: "" diff --git a/sdcard/c480x272/TEMPLATES/SoarETX/F3K-TRAD.yml b/sdcard/c480x272/TEMPLATES/3.SoarETX/F3K-TRAD.yml similarity index 100% rename from sdcard/c480x272/TEMPLATES/SoarETX/F3K-TRAD.yml rename to sdcard/c480x272/TEMPLATES/3.SoarETX/F3K-TRAD.yml diff --git a/sdcard/c480x272/TEMPLATES/SoarETX/F3K.txt b/sdcard/c480x272/TEMPLATES/3.SoarETX/F3K.txt similarity index 99% rename from sdcard/c480x272/TEMPLATES/SoarETX/F3K.txt rename to sdcard/c480x272/TEMPLATES/3.SoarETX/F3K.txt index ffd5d4ab..bbf15a78 100644 --- a/sdcard/c480x272/TEMPLATES/SoarETX/F3K.txt +++ b/sdcard/c480x272/TEMPLATES/3.SoarETX/F3K.txt @@ -1,2 +1,2 @@ -DLG model with advanced mixes. +DLG model with advanced mixes. Always full aileron control, as flaps are automatically retracted, if needed. Snap-flaps are compensated for camber preset, to avoid excessive movement. \ No newline at end of file diff --git a/sdcard/c480x272/TEMPLATES/SoarETX/F3K.yml b/sdcard/c480x272/TEMPLATES/3.SoarETX/F3K.yml similarity index 100% rename from sdcard/c480x272/TEMPLATES/SoarETX/F3K.yml rename to sdcard/c480x272/TEMPLATES/3.SoarETX/F3K.yml diff --git a/sdcard/c480x272/TEMPLATES/SoarETX/about.txt b/sdcard/c480x272/TEMPLATES/3.SoarETX/about.txt similarity index 98% rename from sdcard/c480x272/TEMPLATES/SoarETX/about.txt rename to sdcard/c480x272/TEMPLATES/3.SoarETX/about.txt index bf01a6a7..dbd74d63 100644 --- a/sdcard/c480x272/TEMPLATES/SoarETX/about.txt +++ b/sdcard/c480x272/TEMPLATES/3.SoarETX/about.txt @@ -1,3 +1,3 @@ -A collection of sailplane templates with Lua widgets for timing, score keeping, graphing of log data, and model configuration. - +A collection of sailplane templates with Lua widgets for timing, score keeping, graphing of log data, and model configuration. + Author: Jesper Frickmann \ No newline at end of file diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Glider.lua b/sdcard/c480x272/TEMPLATES/WIZARD/Glider.lua deleted file mode 100644 index 23b0d4a1..00000000 --- a/sdcard/c480x272/TEMPLATES/WIZARD/Glider.lua +++ /dev/null @@ -1,23 +0,0 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) EdgeTX # ------# # ----- # 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. # ----- # # ----- ######################################################################### - -local function run(event) - chdir("/SCRIPTS/WIZARD") - return "glider.lua" -end - -return { run = run } diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Helicopter.lua b/sdcard/c480x272/TEMPLATES/WIZARD/Helicopter.lua deleted file mode 100644 index cde50579..00000000 --- a/sdcard/c480x272/TEMPLATES/WIZARD/Helicopter.lua +++ /dev/null @@ -1,23 +0,0 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) EdgeTX # ------# # ----- # 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. # ----- # # ----- ######################################################################### - -local function run(event) - chdir("/SCRIPTS/WIZARD") - return "helicopter.lua" -end - -return { run = run } diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Multirotor.lua b/sdcard/c480x272/TEMPLATES/WIZARD/Multirotor.lua deleted file mode 100644 index aec15d77..00000000 --- a/sdcard/c480x272/TEMPLATES/WIZARD/Multirotor.lua +++ /dev/null @@ -1,23 +0,0 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) EdgeTX # ------# # ----- # 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. # ----- # # ----- ######################################################################### - -local function run(event) - chdir("/SCRIPTS/WIZARD") - return "multirotor.lua" -end - -return { run = run } diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Plane.lua b/sdcard/c480x272/TEMPLATES/WIZARD/Plane.lua deleted file mode 100644 index 0f0f081d..00000000 --- a/sdcard/c480x272/TEMPLATES/WIZARD/Plane.lua +++ /dev/null @@ -1,23 +0,0 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) EdgeTX # ------# # ----- # 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. # ----- # # ----- ######################################################################### - -local function run(event) - chdir("/SCRIPTS/WIZARD") - return "plane.lua" -end - -return { run = run } diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/Plane.yml b/sdcard/c480x272/TEMPLATES/WIZARD/Plane.yml deleted file mode 100644 index a9d73fb4..00000000 --- a/sdcard/c480x272/TEMPLATES/WIZARD/Plane.yml +++ /dev/null @@ -1,178 +0,0 @@ -header: - name: "Plane" - bitmap: "" -telemetryProtocol: 0 -thrTrim: 0 -noGlobalFunctions: 0 -displayTrims: 0 -ignoreSensorIds: 0 -trimInc: 0 -disableThrottleWarning: 0 -displayChecklist: 0 -extendedLimits: 0 -extendedTrims: 0 -throttleReversed: 0 -enableCustomThrottleWarning: 0 -customThrottleWarningPosition: 0 -beepANACenter: 0 -mixData: - - - weight: 100 - destCh: 0 - srcRaw: I0 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 1 - srcRaw: I1 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 2 - srcRaw: I2 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" - - - weight: 100 - destCh: 3 - srcRaw: I3 - carryTrim: 0 - mixWarn: 0 - mltpx: ADD - offset: 0 - swtch: "NONE" - flightModes: 000000000 - delayUp: 0 - delayDown: 0 - speedUp: 0 - speedDown: 0 - name: "" -expoData: - - - mode: 3 - scale: 0 - srcRaw: Rud - carryTrim: 0 - chn: 0 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Ele - carryTrim: 0 - chn: 1 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Thr - carryTrim: 0 - chn: 2 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 - - - mode: 3 - scale: 0 - srcRaw: Ail - carryTrim: 0 - chn: 3 - swtch: "NONE" - flightModes: 000000000 - weight: 100 - name: "" - offset: 0 - curve: - type: 1 - value: 0 -thrTraceSrc: Thr -switchWarningState: AuBuCuDuEuFuGuHu -rssiSource: none -thrTrimSw: 0 -potsWarnMode: WARN_OFF -jitterFilter: GLOBAL -inputNames: - 0: - val: "Rud" - 1: - val: "Ele" - 2: - val: "Thr" - 3: - val: "Ail" -potsWarnEnabled: 0 -screenData: - 0: - LayoutId: "Layout2P1" - layoutData: - options: - 0: - type: Bool - value: - boolValue: 1 - 1: - type: Bool - value: - boolValue: 1 - 2: - type: Bool - value: - boolValue: 1 - 3: - type: Bool - value: - boolValue: 1 - 4: - type: Bool - value: - boolValue: 0 -view: 0 -modelRegistrationID: "" diff --git a/sdcard/c480x272/TEMPLATES/WIZARD/about.txt b/sdcard/c480x272/TEMPLATES/WIZARD/about.txt deleted file mode 100644 index 5977e98d..00000000 --- a/sdcard/c480x272/TEMPLATES/WIZARD/about.txt +++ /dev/null @@ -1 +0,0 @@ -Simple model templates that use the Lua Wizard scripts to configure the models. \ No newline at end of file