mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-02-04 20:58:10 +00:00
62aa58d32d
1. NEW Black&White Radios new model setup. Now it can setup completely a plane from zero 2. Color version; simplified code for Tail mixes, and fix Taileron setup
467 lines
24 KiB
Lua
467 lines
24 KiB
Lua
---- #########################################################################
|
|
---- # #
|
|
---- # 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. #
|
|
---- # #
|
|
---- #########################################################################
|
|
|
|
------------------------------------------------------------------------------
|
|
-- This scrip does the airplane Setup similar to how a a Spektrum radio does
|
|
-- it. You can select the plane type, the Wing type, etc.
|
|
-- This settings are needed for ForwardProgramming to send the TX aircraft
|
|
-- configuration to the RX when in Initial Setup
|
|
-- Author: Francisco Arzu
|
|
------------------------------------------------------------------------------
|
|
|
|
local Log, menuLib, modelLib, DEBUG_ON, SIMULATION_ON = ... -- Get DebugON from parameters
|
|
local SETUP_LIB_VERSION = "0.56"
|
|
|
|
local DATA_PATH = modelLib.DATA_PATH
|
|
|
|
local PHASE = menuLib.PHASE
|
|
local LINE_TYPE = menuLib.LINE_TYPE
|
|
|
|
local MODEL = modelLib.MODEL
|
|
|
|
local AIRCRAFT_TYPE = modelLib.AIRCRAFT_TYPE
|
|
local WING_TYPE = modelLib.WING_TYPE
|
|
local TAIL_TYPE = modelLib.TAIL_TYPE
|
|
local CH_MODE_TYPE = modelLib.CH_MODE_TYPE
|
|
local PORT = modelLib.PORT
|
|
local MEMU_VAR = modelLib.MEMU_VAR
|
|
local MENU_DATA = modelLib.MENU_DATA
|
|
|
|
local SetupLib = {}
|
|
|
|
local lastGoodMenu=0
|
|
|
|
------------------- Model Setup Helper functions ----------------------
|
|
local currAircraftType = -1 -- Current AircraftType selected, and to detect change
|
|
local currTailType = -1 -- Current WingType selected, and to detect change
|
|
local currWingType = -1 -- Current TailType selected, and to detect change
|
|
|
|
local menuDataChanged = false -- Flag to notify if any data has changed
|
|
|
|
|
|
local function tailTypeCompatible(a,b)
|
|
|
|
local function normalize(tt)
|
|
if (tt==TAIL_TYPE.TRAILERON_A or tt==TAIL_TYPE.TRAILERON_B) then
|
|
return TAIL_TYPE.TRAILERON_A
|
|
elseif (tt==TAIL_TYPE.TRAILERON_A_R2 or tt==TAIL_TYPE.TRAILERON_B_R2) then
|
|
return TAIL_TYPE.TRAILERON_A_R2
|
|
elseif (tt==TAIL_TYPE.VTAIL_A or tt==TAIL_TYPE.VTAIL_B) then
|
|
return TAIL_TYPE.VTAIL_A
|
|
else
|
|
return tt
|
|
end
|
|
end
|
|
|
|
return (normalize(a)==normalize(b))
|
|
end
|
|
|
|
|
|
-- Creates the menus to Render with the GUI
|
|
local function ST_LoadMenu(menuId)
|
|
local ctx = menuLib.DSM_Context
|
|
|
|
local function portUse(p)
|
|
local out = ""
|
|
if p==MENU_DATA[MEMU_VAR.CH_THR] then out = "Thr"
|
|
elseif p == MENU_DATA[MEMU_VAR.CH_L_AIL] then
|
|
out=(MENU_DATA[MEMU_VAR.CH_R_AIL] and "Ail_L") or "Ail"
|
|
elseif p == MENU_DATA[MEMU_VAR.CH_R_AIL] then out="Ail_R"
|
|
elseif p == MENU_DATA[MEMU_VAR.CH_L_ELE] then
|
|
out=(MENU_DATA[MEMU_VAR.CH_R_ELE] and "Ele_L") or "Ele"
|
|
elseif p == MENU_DATA[MEMU_VAR.CH_R_ELE] then out="Ele_R"
|
|
elseif p == MENU_DATA[MEMU_VAR.CH_L_RUD] then
|
|
out=(MENU_DATA[MEMU_VAR.CH_R_RUD] and "Rud_L") or "Rud"
|
|
elseif p == MENU_DATA[MEMU_VAR.CH_R_RUD] then out="Rud_R"
|
|
elseif p == MENU_DATA[MEMU_VAR.CH_L_FLP] then
|
|
out=(MENU_DATA[MEMU_VAR.CH_R_FLP] and "Flp_L") or "Flp"
|
|
elseif p == MENU_DATA[MEMU_VAR.CH_R_FLP] then out="Flp_R"
|
|
end
|
|
return out
|
|
end
|
|
|
|
local function formatTXRevert(port)
|
|
local out = " " .. modelLib.channelType2String(MODEL.DSM_ChannelInfo[port][0], MODEL.DSM_ChannelInfo[port][1]);
|
|
return out
|
|
end
|
|
|
|
local function Header(p)
|
|
return MODEL.PORT_TEXT[p].." "..portUse(p)
|
|
end
|
|
|
|
menuLib.clearMenuLines()
|
|
|
|
|
|
if (menuId==0x1000) then -- MAIN MENU
|
|
ctx.Menu = { MenuId = 0x1000, Text = "Save-Exit ("..MODEL.modelName..")", PrevId = 0, NextId = 0, BackId = 0, TextId=0 }
|
|
|
|
if (true) then
|
|
ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, Text="Save Changes", TextId = 0, ValId = 0x1005 }
|
|
ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, Text="Discard Changes", TextId = 0, ValId = 0x1006 }
|
|
ctx.SelLine = 4
|
|
end
|
|
lastGoodMenu = menuId
|
|
elseif (menuId==0x1001) then -- MODEL SETUP
|
|
local backId = 0xFFF9 -- No changes, just exit
|
|
local title = "Model Setup ("..MODEL.modelName..")"
|
|
if (menuDataChanged) then
|
|
backId = 0x1000 -- Go to Save menu
|
|
title = title.." *"
|
|
end
|
|
ctx.Menu = { MenuId = 0x1001, Text = title, PrevId = 0, NextId = 0, BackId = backId, TextId=0 }
|
|
ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, Text = "Aircraft Type Setup", ValId = 0x1010,TextId=0 }
|
|
ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, Text = "Wing & Tail Channels ", ValId = 0x1020, TextId=0 }
|
|
ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, Text = "Gyro Channel Reverse", ValId = 0x1030, TextId=0 }
|
|
ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, Text = "WARNING: Changing of Aircraft or Wing will", ValId = 0x1001, TextId=0 }
|
|
ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, Text = "delete previous Channel/Port assigments.", ValId = 0x1001, TextId=0 }
|
|
|
|
ctx.SelLine = 0
|
|
lastGoodMenu = menuId
|
|
elseif (menuId==0x1005) then
|
|
modelLib.printChannelSummary()
|
|
modelLib.ST_SaveFileData()
|
|
menuDataChanged = false
|
|
|
|
|
|
local msg1 = "Data saved to: "
|
|
local msg2 = " "..DATA_PATH.."/"..modelLib.hashName(MODEL.modelName)..".txt"
|
|
|
|
ctx.Menu = { MenuId = 0x1005, Text = "Config Saved", PrevId = 0, NextId = 0, BackId = 0, TextId=0 }
|
|
ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, Text=msg1, TextId = 0, ValId = 0x1005 }
|
|
ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, Text=msg2, TextId = 0, ValId = 0x1005 }
|
|
ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, Text="Complete", TextId = 0, ValId = 0xFFF9 }
|
|
ctx.SelLine = 6
|
|
lastGoodMenu = menuId
|
|
elseif (menuId==0x1006) then
|
|
modelLib.ST_LoadFileData()
|
|
menuDataChanged = false
|
|
currAircraftType = MENU_DATA[MEMU_VAR.AIRCRAFT_TYPE]
|
|
currWingType = MENU_DATA[MEMU_VAR.WING_TYPE]
|
|
currTailType = MENU_DATA[MEMU_VAR.TAIL_TYPE]
|
|
|
|
local msg1 = "Data restored from: "
|
|
local msg2 = " "..DATA_PATH.."/"..modelLib.hashName(MODEL.modelName)..".txt"
|
|
|
|
ctx.Menu = { MenuId = 0x1006, Text = "Discart Changes", PrevId = 0, NextId = 0, BackId = 0, TextId=0 }
|
|
ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, Text=msg1, TextId = 0, ValId = 0x1006 }
|
|
ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, Text=msg2, TextId = 0, ValId = 0x1006 }
|
|
ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, Text="Complete", TextId = 0, ValId = 0xFFF9 }
|
|
ctx.SelLine = 6
|
|
lastGoodMenu = menuId
|
|
elseif (menuId==0x1010) then
|
|
modelLib.printChannelSummary()
|
|
ctx.Menu = { MenuId = 0x1010, Text = "Aircraft Type", PrevId = 0, NextId = 0x1011, BackId = 0x1001, TextId=0 }
|
|
ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU_NC, Text="Aircraft Type", TextId = 0, ValId = MEMU_VAR.AIRCRAFT_TYPE, Min=50, Max=53, Def=50, Val=MENU_DATA[MEMU_VAR.AIRCRAFT_TYPE] }
|
|
ctx.SelLine = 5
|
|
lastGoodMenu = menuId
|
|
elseif (menuId==0x1011) then
|
|
ctx.Menu = { MenuId = 0x1011, Text = "Model Type:"..modelLib.aircraft_type_text[currAircraftType], PrevId = 0, NextId = 0x1020, BackId = 0x1010, TextId=0 }
|
|
ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU_NC, Text="Wing Type", TextId = 0, ValId = MEMU_VAR.WING_TYPE, Min=100, Max=107, Def=100, Val=MENU_DATA[MEMU_VAR.WING_TYPE] }
|
|
ctx.MenuLines[6] = { Type = LINE_TYPE.LIST_MENU_NC, Text="Tail Type", TextId = 0, ValId = MEMU_VAR.TAIL_TYPE, Min=200, Max=210, Def=200, Val=MENU_DATA[MEMU_VAR.TAIL_TYPE] }
|
|
ctx.SelLine = 5
|
|
lastGoodMenu = menuId
|
|
elseif (menuId==0x1020) then
|
|
------ WING SETUP -------
|
|
local thr = MENU_DATA[MEMU_VAR.CH_THR]
|
|
local leftAil = MENU_DATA[MEMU_VAR.CH_L_AIL]
|
|
local rightAil = MENU_DATA[MEMU_VAR.CH_R_AIL]
|
|
local leftFlap = MENU_DATA[MEMU_VAR.CH_L_FLP]
|
|
local rightFlap = MENU_DATA[MEMU_VAR.CH_R_FLP]
|
|
|
|
local thrText = "Thr"
|
|
local leftAilText = "Left Aileron"
|
|
local rightAilText = "Right Aileron"
|
|
local leftFlapText = "Left Flap"
|
|
local rightFlapText = "Right Flap"
|
|
|
|
if (rightAil==nil) then leftAilText = "Aileron" end
|
|
if (rightFlap==nil) then leftFlapText = "Flap" end
|
|
|
|
local title = modelLib.aircraft_type_text[currAircraftType].." Wing:"..modelLib.wing_type_text[currWingType]
|
|
|
|
ctx.Menu = { MenuId = 0x1020, Text = title, PrevId = 0, NextId = 0x1021, BackId = 0x1011, TextId=0 }
|
|
|
|
ctx.MenuLines[0] = { Type = LINE_TYPE.LIST_MENU_NC, Text=thrText, TextId = 0, ValId = MEMU_VAR.CH_THR, Min=0, Max=10, Def=0, Val= thr }
|
|
|
|
ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU_NC, Text=leftAilText, TextId = 0, ValId = MEMU_VAR.CH_L_AIL, Min=0, Max=9, Def=0, Val= leftAil }
|
|
|
|
if (rightAil~=nil) then
|
|
ctx.MenuLines[3] = { Type = LINE_TYPE.LIST_MENU_NC, Text=rightAilText, TextId = 0, ValId = MEMU_VAR.CH_R_AIL, Min=0, Max=9, Def=0, Val= rightAil }
|
|
end
|
|
|
|
if (leftFlap~=nil) then
|
|
ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU_NC, Text=leftFlapText, TextId = 0, ValId = MEMU_VAR.CH_L_FLP, Min=0, Max=9, Def=0, Val= leftFlap }
|
|
end
|
|
if (rightFlap~=nil) then
|
|
ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU_NC, Text=rightFlapText, TextId = 0, ValId = MEMU_VAR.CH_R_FLP, Min=0, Max=9, Def=0, Val= rightFlap }
|
|
end
|
|
|
|
ctx.SelLine = 0
|
|
lastGoodMenu = menuId
|
|
|
|
elseif (menuId==0x1021) then
|
|
------ TAIL SETUP -------
|
|
local leftRud = MENU_DATA[MEMU_VAR.CH_L_RUD]
|
|
local rightRud = MENU_DATA[MEMU_VAR.CH_R_RUD]
|
|
local leftEle = MENU_DATA[MEMU_VAR.CH_L_ELE]
|
|
local rightEle = MENU_DATA[MEMU_VAR.CH_R_ELE]
|
|
|
|
local leftRudText = "Left Rudder"
|
|
local rightRudText = "Right Rudder"
|
|
|
|
local leftElvText = "Left Elevator"
|
|
local rightElvText = "Right Elevator"
|
|
|
|
if (rightRud==nil) then leftRudText = "Rudder" end
|
|
if (rightEle==nil) then leftElvText = "Elevator" end
|
|
|
|
local title = modelLib.aircraft_type_text[currAircraftType].." Tail:"..modelLib.tail_type_text[currTailType]
|
|
|
|
ctx.Menu = { MenuId = 0x1021, Text = title, PrevId = 0, NextId = 0x1001, BackId = 0x1020, TextId=0 }
|
|
if (leftRud~=nil) then
|
|
ctx.MenuLines[1] = { Type = LINE_TYPE.LIST_MENU_NC, Text=leftRudText, TextId = 0, ValId = MEMU_VAR.CH_L_RUD, Min=0, Max=9, Def=0, Val= leftRud}
|
|
end
|
|
|
|
if (rightRud~=nil) then
|
|
ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU_NC, Text=rightRudText, TextId = 0, ValId = MEMU_VAR.CH_R_RUD, Min=0, Max=9, Def=0, Val=rightRud }
|
|
end
|
|
|
|
if (leftEle~=nil) then
|
|
ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU_NC, Text=leftElvText, TextId = 0, ValId = MEMU_VAR.CH_L_ELE, Min=0, Max=9, Def=0, Val=leftEle }
|
|
end
|
|
|
|
if (rightEle~=nil) then
|
|
ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU_NC, Text=rightElvText, TextId = 0, ValId = MEMU_VAR.CH_R_ELE, Min=0, Max=9, Def=0, Val=rightEle }
|
|
end
|
|
|
|
ctx.SelLine = 1
|
|
lastGoodMenu = menuId
|
|
|
|
elseif (menuId==0x1030) then
|
|
modelLib.CreateDSMPortChannelInfo()
|
|
modelLib.printChannelSummary()
|
|
|
|
ctx.Menu = { MenuId = 0x1030, Text = "Gyro Channel Reverse (Port 1-5)", PrevId = 0, NextId = 0x1031, BackId = 0x1001, TextId=0 }
|
|
ctx.MenuLines[0] = { Type = LINE_TYPE.LIST_MENU_NC, Text=Header(PORT.PORT1), TextId = 0, ValId = MEMU_VAR.PORT1_MODE, Min=300, Max=301, Def=300, Val=MENU_DATA[MEMU_VAR.PORT1_MODE], Format = formatTXRevert(PORT.PORT1) }
|
|
ctx.MenuLines[1] = { Type = LINE_TYPE.LIST_MENU_NC, Text=Header(PORT.PORT2), TextId = 0, ValId = MEMU_VAR.PORT2_MODE, Min=300, Max=301, Def=300, Val=MENU_DATA[MEMU_VAR.PORT2_MODE], Format = formatTXRevert(PORT.PORT2) }
|
|
ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU_NC, Text=Header(PORT.PORT3), TextId = 0, ValId = MEMU_VAR.PORT3_MODE, Min=300, Max=301, Def=300, Val=MENU_DATA[MEMU_VAR.PORT3_MODE], Format = formatTXRevert(PORT.PORT3) }
|
|
ctx.MenuLines[3] = { Type = LINE_TYPE.LIST_MENU_NC, Text=Header(PORT.PORT4), TextId = 0, ValId = MEMU_VAR.PORT4_MODE, Min=300, Max=301, Def=300, Val=MENU_DATA[MEMU_VAR.PORT4_MODE], Format = formatTXRevert(PORT.PORT4) }
|
|
ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU_NC, Text=Header(PORT.PORT5), TextId = 0, ValId = MEMU_VAR.PORT5_MODE, Min=300, Max=301, Def=300, Val=MENU_DATA[MEMU_VAR.PORT5_MODE], Format = formatTXRevert(PORT.PORT5) }
|
|
|
|
ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, Text="Only Thr/Ail/Rud/Ele. This affects AS3X/SAFE reaction dir./b", TextId = 0, ValId = 0x1030 }
|
|
ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, Text="Any changes, use RX 'Relearn Servo Settings'/b", TextId = 0, ValId = 0x1030 }
|
|
|
|
ctx.SelLine = 0
|
|
lastGoodMenu = menuId
|
|
elseif (menuId==0x1031) then
|
|
modelLib.CreateDSMPortChannelInfo()
|
|
modelLib.printChannelSummary()
|
|
ctx.Menu = { MenuId = 0x1031, Text = "Gyro Channel Reverse (Port 6-10)", PrevId = 0x1030, NextId = 0, BackId = 0x1001, TextId=0 }
|
|
ctx.MenuLines[0] = { Type = LINE_TYPE.LIST_MENU_NC, Text=Header(PORT.PORT6), TextId = 0, ValId = MEMU_VAR.PORT6_MODE, Min=300, Max=301, Def=300, Val=MENU_DATA[MEMU_VAR.PORT6_MODE], Format = formatTXRevert(PORT.PORT6) }
|
|
ctx.MenuLines[1] = { Type = LINE_TYPE.LIST_MENU_NC, Text=Header(PORT.PORT7), TextId = 0, ValId = MEMU_VAR.PORT7_MODE, Min=300, Max=301, Def=300, Val=MENU_DATA[MEMU_VAR.PORT7_MODE], Format = formatTXRevert(PORT.PORT7) }
|
|
ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU_NC, Text=Header(PORT.PORT8), TextId = 0, ValId = MEMU_VAR.PORT8_MODE, Min=300, Max=301, Def=300, Val=MENU_DATA[MEMU_VAR.PORT8_MODE], Format = formatTXRevert(PORT.PORT8) }
|
|
ctx.MenuLines[3] = { Type = LINE_TYPE.LIST_MENU_NC, Text=Header(PORT.PORT9), TextId = 0, ValId = MEMU_VAR.PORT9_MODE, Min=300, Max=301, Def=300, Val=MENU_DATA[MEMU_VAR.PORT9_MODE], Format = formatTXRevert(PORT.PORT9) }
|
|
ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU_NC, Text=Header(PORT.PORT10), TextId = 0, ValId = MEMU_VAR.PORT10_MODE, Min=300, Max=301, Def=300, Val=MENU_DATA[MEMU_VAR.PORT10_MODE], Format = formatTXRevert(PORT.PORT10) }
|
|
|
|
ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, Text="Only Thr/Ail/Rud/Ele. This affects AS3X/SAFE reaction dir./b", TextId = 0, ValId = 0x1031 }
|
|
ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, Text="Any changes, use RX 'Relearn Servo Settings'/b", TextId = 0, ValId = 0x1031 }
|
|
|
|
ctx.SelLine = 0
|
|
lastGoodMenu = menuId
|
|
else
|
|
print("NOT IMPLEMENTED")
|
|
ctx.Menu = { MenuId = 0x0002, Text = "NOT IMPLEMENTED", TextId = 0, PrevId = 0, NextId = 0, BackId = lastGoodMenu }
|
|
ctx.SelLine = menuLib.BACK_BUTTON
|
|
end
|
|
|
|
menuLib.PostProcessMenu()
|
|
end
|
|
|
|
-- ST_SendReceive
|
|
-- Main state machine for the Setup menu
|
|
|
|
local function ST_SendReceive()
|
|
local ctx = menuLib.DSM_Context
|
|
--if (DEBUG_ON>1) then Log.LOG_write("%3.3f %s: ", menuLib.getElapsedTime(), menuLib.phase2String(ctx.Phase)) end
|
|
|
|
if ctx.Phase == PHASE.RX_VERSION then -- request RX version
|
|
ctx.RX.Name = "MODEL SETUP"
|
|
ctx.RX.Version = SETUP_LIB_VERSION
|
|
ctx.Phase = PHASE.MENU_TITLE
|
|
ctx.Menu.MenuId = 0x01001
|
|
|
|
ctx.Refresh_Display = true
|
|
|
|
|
|
elseif ctx.Phase == PHASE.WAIT_CMD then
|
|
|
|
elseif ctx.Phase == PHASE.MENU_TITLE then -- request menu title
|
|
ST_LoadMenu(ctx.Menu.MenuId)
|
|
ctx.Phase = PHASE.WAIT_CMD
|
|
ctx.Refresh_Display = true
|
|
|
|
elseif ctx.Phase == PHASE.VALUE_CHANGING then -- send value
|
|
local line = ctx.MenuLines[ctx.SelLine] -- Updated Value of SELECTED line
|
|
|
|
if (MENU_DATA[line.ValId] ~= line.Val ) then
|
|
MENU_DATA[line.ValId] = line.Val
|
|
print(string.format("MENU_DATA[%d/%s]=%d",line.ValId,line.Text, line.Val))
|
|
menuDataChanged=true
|
|
end
|
|
|
|
ctx.Phase = PHASE.VALUE_CHANGING_WAIT
|
|
|
|
elseif ctx.Phase == PHASE.VALUE_CHANGING_WAIT then
|
|
local line = ctx.MenuLines[ctx.SelLine]
|
|
|
|
elseif ctx.Phase == PHASE.VALUE_CHANGE_END then -- send value
|
|
local line = ctx.MenuLines[ctx.SelLine] -- Updated Value of SELECTED line
|
|
|
|
-- Update the menu data from the line
|
|
if (MENU_DATA[line.ValId] ~= line.Val ) then
|
|
MENU_DATA[line.ValId] = line.Val
|
|
print(string.format("MENU_DATA[%d/%s]=%d",line.ValId,line.Text, line.Val))
|
|
menuDataChanged=true
|
|
end
|
|
|
|
-- Did the aircraft type change?
|
|
if (currAircraftType ~= MENU_DATA[MEMU_VAR.AIRCRAFT_TYPE]) then
|
|
currAircraftType = MENU_DATA[MEMU_VAR.AIRCRAFT_TYPE]
|
|
modelLib.ST_AircraftInit(currAircraftType)
|
|
currWingType = MENU_DATA[MEMU_VAR.WING_TYPE]
|
|
currTailType = MENU_DATA[MEMU_VAR.TAIL_TYPE]
|
|
end
|
|
|
|
-- Did the Wing type change?
|
|
if (currWingType ~= MENU_DATA[MEMU_VAR.WING_TYPE]) then
|
|
if (currAircraftType==AIRCRAFT_TYPE.GLIDER) then
|
|
currWingType = MENU_DATA[MEMU_VAR.WING_TYPE]
|
|
modelLib.ST_GliderWingInit(currWingType)
|
|
else
|
|
currWingType = MENU_DATA[MEMU_VAR.WING_TYPE]
|
|
modelLib.ST_PlaneWingInit(currWingType)
|
|
|
|
end
|
|
|
|
-- DELTA has only RUDER
|
|
if ((currWingType==WING_TYPE.ELEVON_A or currWingType==WING_TYPE.ELEVON_B) and TAIL_TYPE~=TAIL_TYPE.RUD_1) then
|
|
MENU_DATA[MEMU_VAR.TAIL_TYPE] = TAIL_TYPE.RUD_1
|
|
end
|
|
end
|
|
|
|
--- Did the tail changed?
|
|
local ntt = MENU_DATA[MEMU_VAR.TAIL_TYPE]
|
|
if (currTailType ~= ntt) then
|
|
if (currAircraftType==AIRCRAFT_TYPE.GLIDER) then
|
|
currTailType = ntt
|
|
modelLib.ST_GliderTailInit(currTailType)
|
|
else
|
|
if (not tailTypeCompatible(currTailType,ntt)) then
|
|
modelLib.ST_PlaneTailInit(ntt)
|
|
end
|
|
currTailType = ntt
|
|
end
|
|
end
|
|
|
|
ctx.Phase = PHASE.WAIT_CMD
|
|
elseif ctx.Phase == PHASE.EXIT then
|
|
ctx.Phase=PHASE.EXIT_DONE
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------
|
|
|
|
-- Inital List and Image Text for this menus
|
|
local function ST_Init_Text(rxId)
|
|
menuLib.clearAllText()
|
|
|
|
local List_Values = menuLib.List_Values
|
|
local List_Text = menuLib.List_Text
|
|
local Text = menuLib.Text
|
|
local List_Text_Img = menuLib.List_Text_Img
|
|
|
|
-- Channel Names use the Port Text Retrived from OTX/ETX
|
|
for i = 0, 9 do List_Text[i] = MODEL.PORT_TEXT[i] end
|
|
List_Text[10]="--"
|
|
|
|
-- Aircraft Type
|
|
List_Text[50+AIRCRAFT_TYPE.PLANE] = "Airplane"; --List_Text_Img[50+AIRCRAFT_TYPE.PLANE] = "at_plane.png|Airplane"
|
|
List_Text[50+AIRCRAFT_TYPE.GLIDER] = "Glider (Partial work)"; --List_Text_Img[50+AIRCRAFT_TYPE.GLIDER] = "at_glider.png|Glider"
|
|
List_Text[50+AIRCRAFT_TYPE.HELI] = "Helicopter (Not done)"; --List_Text_Img[50+AIRCRAFT_TYPE.HELI] = "at_heli.png|Helicopter"
|
|
List_Text[50+AIRCRAFT_TYPE.DRONE] = "Drone (not done)"; --List_Text_Img[50+AIRCRAFT_TYPE.DRONE] = "at_drone.png|Drone"
|
|
|
|
-- Wing Types
|
|
List_Text[100+WING_TYPE.AIL_1] = "Single Ail"; List_Text_Img[100+WING_TYPE.AIL_1] = "wt_1ail.png|Single Aileron"
|
|
List_Text[100+WING_TYPE.AIL_2] = "Dual Ail"; List_Text_Img[100+WING_TYPE.AIL_2] = "wt_2ail.png|Dual Aileron"
|
|
List_Text[100+WING_TYPE.FLAPERON] = "Flaperon"; List_Text_Img[100+WING_TYPE.FLAPERON] = "wt_flaperon.png|Flaperon"
|
|
List_Text[100+WING_TYPE.AIL_1_FLP_1] = "Ail + Flap"; List_Text_Img[100+WING_TYPE.AIL_1_FLP_1] = "wt_1ail_1flp.png|Aileron + Flap"
|
|
List_Text[100+WING_TYPE.AIL_2_FLP_1] = "Dual Ail + Flap"; List_Text_Img[100+WING_TYPE.AIL_2_FLP_1] = "wt_2ail_1flp.png|Dual Aileron + Flap"
|
|
List_Text[100+WING_TYPE.AIL_2_FLP_2] = "Dual Ail + Dual Flap"; List_Text_Img[100+WING_TYPE.AIL_2_FLP_2] = "wt_2ail_2flp.png|Dual Aileron + Dual Flap"
|
|
List_Text[100+WING_TYPE.ELEVON_A] = "Delta/Elevon A"; List_Text_Img[100+WING_TYPE.ELEVON_A] = "wt_elevon.png|Delta/Elevon A"
|
|
List_Text[100+WING_TYPE.ELEVON_B] = "Delta/Elevon B"; List_Text_Img[100+WING_TYPE.ELEVON_B] = "wt_elevon.png|Delta/Elevon B"
|
|
|
|
-- Tail Types
|
|
List_Text[200+TAIL_TYPE.RUD_1] = "Rudder Only"; List_Text_Img[200+TAIL_TYPE.RUD_1] = "tt_1rud.png|Rudder Only"
|
|
List_Text[200+TAIL_TYPE.RUD_1_ELEV_1] = "Rud + Ele"; List_Text_Img[200+TAIL_TYPE.RUD_1_ELEV_1] = "tt_1rud_1ele.png|Tail Normal"
|
|
List_Text[200+TAIL_TYPE.RUD_1_ELEV_2] = "Rud + Dual Ele"; List_Text_Img[200+TAIL_TYPE.RUD_1_ELEV_2] = "tt_1rud_2ele.png|Rud + Dual Elev"
|
|
List_Text[200+TAIL_TYPE.RUD_2_ELEV_1] = "Dual Rud + Ele"; List_Text_Img[200+TAIL_TYPE.RUD_2_ELEV_1] = "tt_2rud_1ele.png|Dual Rud + Elev"
|
|
List_Text[200+TAIL_TYPE.RUD_2_ELEV_2] = "Dual Rud + Dual Ele"; List_Text_Img[200+TAIL_TYPE.RUD_2_ELEV_2] = "tt_2rud_2ele.png|Dual Rud + Dual Elev"
|
|
List_Text[200+TAIL_TYPE.VTAIL_A] = "V-Tail A"; List_Text_Img[200+TAIL_TYPE.VTAIL_A] = "tt_vtail.png|V-Tail A"
|
|
List_Text[200+TAIL_TYPE.VTAIL_B] = "V-Tail B"; List_Text_Img[200+TAIL_TYPE.VTAIL_B] = "tt_vtail.png|V-Tail B"
|
|
List_Text[200+TAIL_TYPE.TRAILERON_A] = "Taileron A"; List_Text_Img[200+TAIL_TYPE.TRAILERON_A] = "tt_taileron.png|Taileron A"
|
|
List_Text[200+TAIL_TYPE.TRAILERON_B] = "Taileron B"; List_Text_Img[200+TAIL_TYPE.TRAILERON_B] = "tt_taileron.png|Taileron B"
|
|
List_Text[200+TAIL_TYPE.TRAILERON_A_R2] = "Taileron A + 2x Rud"; List_Text_Img[200+TAIL_TYPE.TRAILERON_A_R2] = "tt_taileron2.png|Taileron A + Dual Rud"
|
|
List_Text[200+TAIL_TYPE.TRAILERON_B_R2] = "Taileron B + 2x Rud"; List_Text_Img[200+TAIL_TYPE.TRAILERON_B_R2] = "tt_taileron2.png|Taileron B + Dual Rud"
|
|
|
|
|
|
-- Servo Reverse
|
|
if (LCD_W > 128) then
|
|
List_Text[300+CH_MODE_TYPE.NORMAL] = "Normal "
|
|
List_Text[300+CH_MODE_TYPE.REVERSE] = "Reverse"
|
|
else
|
|
List_Text[300+CH_MODE_TYPE.NORMAL] = "Nor"
|
|
List_Text[300+CH_MODE_TYPE.REVERSE] = "Rev"
|
|
end
|
|
end
|
|
|
|
-- Initial Setup
|
|
local function ST_Init()
|
|
-- Initialize text (use RX_ID 0)
|
|
ST_Init_Text(0)
|
|
|
|
-- Setup default Data, and load a file if exist
|
|
--modelLib.ST_Default_Data()
|
|
if (modelLib.ST_LoadFileData()==0) then -- Did not load a file
|
|
modelLib.ST_Default_Data()
|
|
modelLib.ST_SaveFileData() -- Save Defaults
|
|
end
|
|
menuDataChanged = false
|
|
currAircraftType = MENU_DATA[MEMU_VAR.AIRCRAFT_TYPE]
|
|
currWingType = MENU_DATA[MEMU_VAR.WING_TYPE]
|
|
currTailType = MENU_DATA[MEMU_VAR.TAIL_TYPE]
|
|
|
|
local ctx = menuLib.DSM_Context
|
|
ctx.Phase = PHASE.RX_VERSION
|
|
end
|
|
|
|
local function ST_Done()
|
|
local ctx = menuLib.DSM_Context
|
|
ctx.Phase = PHASE.EXIT_DONE
|
|
end
|
|
|
|
|
|
return { init=ST_Init, run=ST_SendReceive, done=ST_Done } |