mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-02-04 19:38:13 +00:00
b2f8f482bb
* #751 DSM Enhancements #751 DSM Forward Programming Enhancements (New GUI, etc) * Make both work on EdgeTx and OpenTX * #751 Turn OFF simulation by default Distribution code with RX simulation OFF Simulation should be only for Development * #751 Update Readme Documentation Updated the Readme.txt documentation and removed compiled luac file that was check in by mistake * #751 Fix problems With Reset RX 1. Fix problem when trying to Factory Reset. Enter Bind Mode. Save backup, Restore Backup 2. Found a way to advance on the Gyro initial Setup menus.. a bit of a hack, but works. 3. Handle RX resets properly. It needed after initial setup * #751 Cosmetic and Show Orientation Images #751 1. Fix problems when text contradictions between Menu/Line Headers and List Values 2. Show Images of RX orientations 3. Able to Hack getting into Initial Setup and other menus who was failing before 4. Custumize the way Flight Mode reports the Value on Screen * #751 add check for required libraries Add check that the required files in DSMLIB exist * #751 Write documentation about the protocol so that we don't forget later what we know, and enable others to understand the logs and maybe help solve problems. * #766 Change the way to detect that the files exist. now works on both ETX and OTX * #766 Strange Flickering in OTX Strange Flickering happening on OTX. Refreshing the screen on every cycle fixed the problem * #766 Change way of dectecting EdgeTX Change way of detecting OTX in multiple versions: OTX 2.3.14 and 2.3.15 * #766 make editable Gain Values Gains and other settings should be editable even when they are VALUE_NOCHANGING. Flight Mode is an exception that is handled properly. Right align numbers. * #766 More enhacements Added AR630 Make numbers right justified Cleanup some log messages and line types. Updated DSM FWD prog documentation * #751 more cosmetic things 1. Added AR10360T, 2. Simplify way to configured the hack for more receivers. 3. Change some texts on menus to march spektrum 4. Background color in Spektrum theme to match * #751 A few final changes 1. Update channel names to include channel number. i.e: Ch5 (Gear) 2, Fix flight mode display for Heli Receiver 3. i think the unknown lines are to request info about the TX settings * #751 1. Added Warning Screen 2. Correct handling of Unknown lines in Gyro Settings->Initial Setup * #751 New v0.51 version. - Added new menus to configure Model/Wing type. Without it, the initial setup will not work properly. * #751 More fixes on mixers and servo reverse -- Fix problem reversing servos when using vtail/delta mix -- Properly detect ch order of multimodule * #751 Updated channel naming and docs Updated readme documentation Consistent naming of Ch across the code. * #751 Fix message displaying data path * #751 More improvements 1. Much easier to select channels > Ch6 for FMode, Gain and Panic channels 2. B&W version for smaller screens (128x64).. Memory footprint still a problem. 3. Fix a lot typos/misspell/grammar in the documentation * Create DSM_AR636_TextGen.lua Script to show Telemetry TextGen screens for AR636 Receiver. Really useful for BLADE helis using the AR636 Could replace dsmPID.lua Still needs to be ported to smaller screens. * #751 Enhancements for Lua Script tools Enhancements * Delete DSM_AR636_TextGen.lua The TextGen functionality is included in DSM_AR636_Tel.lua. No longer needed * Version 0.54 1. Fix problem with "Attitude Trim" Menu 2. New "MINimalistic" version for radios with very low memory 3. Externalized menu messages shared by all versions. the idea is to allow to translate it into other languages. 4. Correction of TextGen tools to work on black&white radios (some Lua functional differences). TextGen will be working on EdgeTx 2,8.3 --------- Co-authored-by: pascallanger <pascal_langer@yahoo.fr>
1108 lines
47 KiB
Lua
1108 lines
47 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 DEBUG_ON, SIMULATION_ON = ... -- Get DebugON from parameters
|
|
local SETUP_LIB_VERSION = "0.54"
|
|
|
|
local DATA_PATH = "/MODELS/DSMDATA" -- Path to store model settings files
|
|
local dsmLib = assert(loadScript("/SCRIPTS/TOOLS/DSMLIB/DsmFwPrgLib.lua"))(DEBUG_ON)
|
|
|
|
local PHASE = dsmLib.PHASE
|
|
local LINE_TYPE = dsmLib.LINE_TYPE
|
|
local CH_TYPE = dsmLib.CH_TYPE
|
|
local MODEL = dsmLib.MODEL
|
|
|
|
local AIRCRAFT_TYPE = {
|
|
PLANE = 0,
|
|
HELI = 1,
|
|
GLIDER = 2,
|
|
DRONE = 3
|
|
}
|
|
local aircraft_type_text = {[0]="Plane","Heli","Glider","Drone"}
|
|
|
|
local WING_TYPE = {
|
|
AIL_1 = 0, --1
|
|
AIL_2 = 1, --2
|
|
FLAPERON = 2, --2
|
|
AIL_1_FLP_1 = 3, --2
|
|
AIL_2_FLP_1 = 4, --3
|
|
AIL_2_FLP_2 = 5, --4
|
|
ELEVON_A = 6, --2
|
|
ELEVON_B = 7 --2
|
|
}
|
|
local wing_type_text = {[0]="Normal","Dual Ail","Flapperon", "Ail + Flp","Dual Ail + Flp","Dual Ail/Flp","Elevon A","Elevon B"}
|
|
|
|
local TAIL_TYPE = {
|
|
RUD_1 = 0, -- 1
|
|
RUD_1_ELEV_1 = 1, -- 2
|
|
RUD_1_ELEV_2 = 2, -- 3
|
|
RUD_2_ELEV_1 = 3, -- 3
|
|
RUD_2_ELEV_2 = 4, -- 4
|
|
VTAIL_A = 5, -- 2
|
|
VTAIL_B = 6, -- 2
|
|
TRAILERON_A = 7, -- 3
|
|
TRAILERON_B = 8, -- 3
|
|
}
|
|
local tail_type_text = {[0]="Rud Only","Normal","Rud + Dual Ele","Dual Rud + Elv","Dual Rud/Ele","VTail A","VTail B","Traileron A","Traileron B"}
|
|
|
|
local CH_MODE_TYPE = {
|
|
NORMAL = 0,
|
|
REVERSE = 1,
|
|
USE_TX = 3
|
|
}
|
|
|
|
local PORT = {
|
|
PORT1 = 0,
|
|
PORT2 = 1,
|
|
PORT3 = 2,
|
|
PORT4 = 3,
|
|
PORT5 = 4,
|
|
PORT6 = 5,
|
|
PORT7 = 6,
|
|
PORT8 = 7,
|
|
PORT9 = 8,
|
|
PORT10 = 9,
|
|
}
|
|
|
|
local MEMU_VAR = {
|
|
AIRCRAFT_TYPE = 1001,
|
|
WING_TYPE = 1002,
|
|
TAIL_TYPE = 1003,
|
|
|
|
CH_BASE = 1010,
|
|
CH_THR = 1010,
|
|
|
|
CH_L_AIL = 1011,
|
|
CH_R_AIL = 1012,
|
|
CH_L_FLP = 1013,
|
|
CH_R_FLP = 1014,
|
|
|
|
CH_L_RUD = 1015,
|
|
CH_R_RUD = 1016,
|
|
CH_L_ELE = 1017,
|
|
CH_R_ELE = 1018,
|
|
|
|
PORT_BASE = 1020,
|
|
PORT1_MODE = 1020,
|
|
PORT2_MODE = 1021,
|
|
PORT3_MODE = 1022,
|
|
PORT4_MODE = 1023,
|
|
PORT5_MODE = 1024,
|
|
PORT6_MODE = 1025,
|
|
PORT7_MODE = 1026,
|
|
PORT8_MODE = 1027,
|
|
PORT9_MODE = 1028,
|
|
PORT10_MODE = 1029,
|
|
|
|
DATA_END = 1040
|
|
}
|
|
|
|
local SetupLib = {}
|
|
|
|
-- MENU DATA Management
|
|
local MENU_DATA = {} -- Store the variables used in the Menus.
|
|
local menuDataChanged = false -- Flag to notify if any data has changed
|
|
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 lastGoodMenu=0
|
|
|
|
------------------- Model Setup Helper functions ----------------------
|
|
|
|
local function printChannelSummary()
|
|
-- Summary
|
|
print("CHANNEL INFORMATION")
|
|
print("Aircraft:".. (aircraft_type_text[currAircraftType] or "--"))
|
|
print("Wing Type:".. (wing_type_text[currWingType] or "--"))
|
|
print("Tail Type:".. (tail_type_text[currTailType] or "--"))
|
|
print("Thr:".. (MODEL.PORT_TEXT[(MENU_DATA[MEMU_VAR.CH_THR] or 30)] or "--")) -- use fake ch30 for non existing channels
|
|
print("LAil:".. (MODEL.PORT_TEXT[(MENU_DATA[MEMU_VAR.CH_L_AIL] or 30)] or "--"))
|
|
print("RAil:".. (MODEL.PORT_TEXT[(MENU_DATA[MEMU_VAR.CH_R_AIL] or 30)] or "--"))
|
|
print("LFlp:".. (MODEL.PORT_TEXT[(MENU_DATA[MEMU_VAR.CH_L_FLP] or 30)] or "--"))
|
|
print("RFlp:".. (MODEL.PORT_TEXT[(MENU_DATA[MEMU_VAR.CH_R_FLP] or 30)] or "--"))
|
|
print("LEle:".. (MODEL.PORT_TEXT[(MENU_DATA[MEMU_VAR.CH_L_ELE] or 30)] or "--"))
|
|
print("REle:".. (MODEL.PORT_TEXT[(MENU_DATA[MEMU_VAR.CH_R_ELE] or 30)] or "--"))
|
|
print("LRud:".. (MODEL.PORT_TEXT[(MENU_DATA[MEMU_VAR.CH_L_RUD] or 30)] or "--"))
|
|
print("RRud:".. (MODEL.PORT_TEXT[(MENU_DATA[MEMU_VAR.CH_R_RUD] or 30)] or "--"))
|
|
end
|
|
|
|
local function printServoReverseInfo()
|
|
print("SERVO Normal/Reverse INFORMATION")
|
|
for i=0,10 do
|
|
local s="--"
|
|
if (MENU_DATA[MEMU_VAR.PORT1_MODE+i] or 0) == 0 then s="NORMAL" else s="REVERSE" end
|
|
print(string.format("Port%d: %s", i+1, s))
|
|
end
|
|
end
|
|
|
|
local function ST_PlaneWingInit(wingType)
|
|
print("Change Plane WingType:"..wing_type_text[wingType])
|
|
|
|
currWingType = wingType
|
|
|
|
MENU_DATA[MEMU_VAR.WING_TYPE] = wingType
|
|
|
|
-- Clear all Wing Data
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = nil
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = nil
|
|
MENU_DATA[MEMU_VAR.CH_L_FLP] = nil
|
|
MENU_DATA[MEMU_VAR.CH_R_FLP] = nil
|
|
|
|
MENU_DATA[MEMU_VAR.CH_THR] = PORT.PORT1
|
|
|
|
-- Default Channel Assisgments for each Wing type
|
|
|
|
if (wingType==WING_TYPE.AIL_1) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT2
|
|
elseif (wingType==WING_TYPE.AIL_2) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT6
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT2
|
|
elseif (wingType==WING_TYPE.FLAPERON) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT6
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT2
|
|
elseif (wingType==WING_TYPE.AIL_1_FLP_1) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT2
|
|
MENU_DATA[MEMU_VAR.CH_L_FLP] = PORT.PORT6
|
|
elseif (wingType==WING_TYPE.AIL_2_FLP_1) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT6
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT2
|
|
MENU_DATA[MEMU_VAR.CH_L_FLP] = PORT.PORT5
|
|
elseif (wingType==WING_TYPE.AIL_2_FLP_2) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT6
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT2
|
|
MENU_DATA[MEMU_VAR.CH_R_FLP] = PORT.PORT5
|
|
MENU_DATA[MEMU_VAR.CH_L_FLP] = PORT.PORT7
|
|
elseif (wingType==WING_TYPE.ELEVON_A) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT2
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT3
|
|
elseif (wingType==WING_TYPE.ELEVON_B) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT3
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT2
|
|
else -- Assume normal
|
|
print("ERROR: Invalid Wing Type")
|
|
end
|
|
|
|
|
|
printChannelSummary()
|
|
end
|
|
|
|
local function ST_PlaneTailInit(tailType)
|
|
if (MENU_DATA[MEMU_VAR.WING_TYPE]==WING_TYPE.ELEVON_A) then
|
|
tailType = TAIL_TYPE.RUD_1 -- Delta only have ruder
|
|
end
|
|
|
|
print("Change Plane Tail Type:"..tail_type_text[tailType])
|
|
|
|
currTailType = tailType
|
|
|
|
-- Clear all data for Tail
|
|
MENU_DATA[MEMU_VAR.TAIL_TYPE] = tailType
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = nil
|
|
MENU_DATA[MEMU_VAR.CH_R_ELE] = nil
|
|
MENU_DATA[MEMU_VAR.CH_L_RUD] = nil
|
|
MENU_DATA[MEMU_VAR.CH_R_RUD] = nil
|
|
|
|
-- Setup Channels for different Tail types
|
|
if (tailType == TAIL_TYPE.RUD_1) then
|
|
MENU_DATA[MEMU_VAR.CH_L_RUD] = PORT.PORT4
|
|
elseif (tailType == TAIL_TYPE.RUD_1_ELEV_1) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT3
|
|
MENU_DATA[MEMU_VAR.CH_L_RUD] = PORT.PORT4
|
|
elseif (tailType == TAIL_TYPE.RUD_1_ELEV_2) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT5
|
|
MENU_DATA[MEMU_VAR.CH_R_ELE] = PORT.PORT3
|
|
MENU_DATA[MEMU_VAR.CH_L_RUD] = PORT.PORT4
|
|
elseif (tailType == TAIL_TYPE.RUD_2_ELEV_1) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT3
|
|
MENU_DATA[MEMU_VAR.CH_L_RUD] = PORT.PORT5
|
|
MENU_DATA[MEMU_VAR.CH_R_RUD] = PORT.PORT4
|
|
elseif (tailType == TAIL_TYPE.RUD_2_ELEV_2) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT5
|
|
MENU_DATA[MEMU_VAR.CH_R_ELE] = PORT.PORT3
|
|
MENU_DATA[MEMU_VAR.CH_L_RUD] = PORT.PORT6
|
|
MENU_DATA[MEMU_VAR.CH_R_RUD] = PORT.PORT4
|
|
elseif (tailType == TAIL_TYPE.VTAIL_A) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT4
|
|
MENU_DATA[MEMU_VAR.CH_R_ELE] = PORT.PORT3
|
|
elseif (tailType == TAIL_TYPE.VTAIL_B) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT3
|
|
MENU_DATA[MEMU_VAR.CH_R_ELE] = PORT.PORT4
|
|
elseif (tailType == TAIL_TYPE.TRAILERON_A) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT5
|
|
MENU_DATA[MEMU_VAR.CH_R_ELE] = PORT.PORT3
|
|
elseif (tailType == TAIL_TYPE.TRAILERON_B) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT5
|
|
MENU_DATA[MEMU_VAR.CH_R_ELE] = PORT.PORT3
|
|
else -- Assume Normal
|
|
print("ERROR:invalid Tail Type")
|
|
end
|
|
|
|
printChannelSummary()
|
|
end
|
|
|
|
local function ST_GliderWingInit(wingType)
|
|
print("Change Glider WingType:"..wing_type_text[wingType])
|
|
|
|
currWingType = wingType
|
|
|
|
MENU_DATA[MEMU_VAR.WING_TYPE] = wingType
|
|
|
|
-- Clear all Wing Data
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = nil
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = nil
|
|
MENU_DATA[MEMU_VAR.CH_L_FLP] = nil
|
|
MENU_DATA[MEMU_VAR.CH_R_FLP] = nil
|
|
MENU_DATA[MEMU_VAR.CH_THR] = PORT.PORT6
|
|
|
|
-- Default Channel Assisgments for each Wing type
|
|
|
|
if (wingType==WING_TYPE.AIL_1) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT1
|
|
elseif (wingType==WING_TYPE.AIL_2) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT1
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT2
|
|
elseif (wingType==WING_TYPE.AIL_2_FLP_1) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT1
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT2
|
|
MENU_DATA[MEMU_VAR.CH_L_FLP] = PORT.PORT5
|
|
elseif (wingType==WING_TYPE.AIL_2_FLP_2) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT1
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT2
|
|
MENU_DATA[MEMU_VAR.CH_L_FLP] = PORT.PORT5
|
|
MENU_DATA[MEMU_VAR.CH_R_FLP] = PORT.PORT6
|
|
MENU_DATA[MEMU_VAR.CH_THR] = PORT.PORT7
|
|
elseif (wingType==WING_TYPE.ELEVON_A) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT1
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT2
|
|
elseif (wingType==WING_TYPE.ELEVON_B) then
|
|
MENU_DATA[MEMU_VAR.CH_L_AIL] = PORT.PORT2
|
|
MENU_DATA[MEMU_VAR.CH_R_AIL] = PORT.PORT1
|
|
else -- Assume normal
|
|
print("ERROR: Invalid Wing Type")
|
|
end
|
|
|
|
printChannelSummary()
|
|
end
|
|
|
|
local function ST_GliderTailInit(tailType)
|
|
if (MENU_DATA[MEMU_VAR.WING_TYPE]==WING_TYPE.ELEVON_A) then
|
|
tailType = TAIL_TYPE.RUD_1 -- Delta only have ruder
|
|
end
|
|
|
|
print("Change Glider Tail Type:"..tail_type_text[tailType])
|
|
|
|
currTailType = tailType
|
|
|
|
-- Clear all data for Tail
|
|
MENU_DATA[MEMU_VAR.TAIL_TYPE] = tailType
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = nil
|
|
MENU_DATA[MEMU_VAR.CH_R_ELE] = nil
|
|
MENU_DATA[MEMU_VAR.CH_L_RUD] = nil
|
|
MENU_DATA[MEMU_VAR.CH_R_RUD] = nil
|
|
|
|
-- Setup Channels for different Tail types
|
|
if (tailType == TAIL_TYPE.RUD_1) then
|
|
MENU_DATA[MEMU_VAR.CH_L_RUD] = PORT.PORT4
|
|
elseif (tailType == TAIL_TYPE.RUD_1_ELEV_1) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT3
|
|
MENU_DATA[MEMU_VAR.CH_L_RUD] = PORT.PORT4
|
|
elseif (tailType == TAIL_TYPE.VTAIL_A) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT4
|
|
MENU_DATA[MEMU_VAR.CH_R_ELE] = PORT.PORT3
|
|
elseif (tailType == TAIL_TYPE.VTAIL_B) then
|
|
MENU_DATA[MEMU_VAR.CH_L_ELE] = PORT.PORT3
|
|
MENU_DATA[MEMU_VAR.CH_R_ELE] = PORT.PORT4
|
|
else -- Assume Normal
|
|
print("ERROR: Invalid Tail Type")
|
|
end
|
|
|
|
printChannelSummary()
|
|
end
|
|
|
|
|
|
local function ST_AircraftInit(aircraftType)
|
|
MENU_DATA[MEMU_VAR.AIRCRAFT_TYPE] = aircraftType
|
|
currAircraftType = aircraftType
|
|
|
|
print("Change Aircraft:".. aircraft_type_text[aircraftType])
|
|
|
|
-- Setup Default Aircraft Wing/Tail
|
|
if (aircraftType==AIRCRAFT_TYPE.PLANE) then
|
|
ST_PlaneWingInit(WING_TYPE.AIL_1)
|
|
ST_PlaneTailInit(TAIL_TYPE.RUD_1_ELEV_1)
|
|
elseif (aircraftType==AIRCRAFT_TYPE.GLIDER) then
|
|
ST_GliderWingInit(WING_TYPE.AIL_1)
|
|
ST_GliderTailInit(TAIL_TYPE.RUD_1_ELEV_1)
|
|
else
|
|
ST_PlaneWingInit(WING_TYPE.AIL_1)
|
|
ST_PlaneTailInit(TAIL_TYPE.RUD_1_ELEV_1)
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
-- Setup Initial Default Data for the Menus
|
|
local function ST_Default_Data()
|
|
print("Initializing Menu DATA")
|
|
ST_AircraftInit(AIRCRAFT_TYPE.PLANE)
|
|
|
|
print("Initializing Servo Reverse from TX output settings")
|
|
|
|
MENU_DATA[MEMU_VAR.PORT1_MODE] = CH_MODE_TYPE.NORMAL + MODEL.modelOutputChannel[PORT.PORT1].revert
|
|
MENU_DATA[MEMU_VAR.PORT2_MODE] = CH_MODE_TYPE.NORMAL + MODEL.modelOutputChannel[PORT.PORT2].revert
|
|
MENU_DATA[MEMU_VAR.PORT3_MODE] = CH_MODE_TYPE.NORMAL + MODEL.modelOutputChannel[PORT.PORT3].revert
|
|
MENU_DATA[MEMU_VAR.PORT4_MODE] = CH_MODE_TYPE.NORMAL + MODEL.modelOutputChannel[PORT.PORT4].revert
|
|
MENU_DATA[MEMU_VAR.PORT5_MODE] = CH_MODE_TYPE.NORMAL + MODEL.modelOutputChannel[PORT.PORT5].revert
|
|
MENU_DATA[MEMU_VAR.PORT6_MODE] = CH_MODE_TYPE.NORMAL + MODEL.modelOutputChannel[PORT.PORT6].revert
|
|
MENU_DATA[MEMU_VAR.PORT7_MODE] = CH_MODE_TYPE.NORMAL + MODEL.modelOutputChannel[PORT.PORT7].revert
|
|
MENU_DATA[MEMU_VAR.PORT8_MODE] = CH_MODE_TYPE.NORMAL + MODEL.modelOutputChannel[PORT.PORT8].revert
|
|
MENU_DATA[MEMU_VAR.PORT9_MODE] = CH_MODE_TYPE.NORMAL + MODEL.modelOutputChannel[PORT.PORT9].revert
|
|
MENU_DATA[MEMU_VAR.PORT10_MODE] = CH_MODE_TYPE.NORMAL + MODEL.modelOutputChannel[PORT.PORT10].revert
|
|
|
|
printServoReverseInfo()
|
|
|
|
end
|
|
|
|
----------------------- FILE MANAGEMENT ---------------------------------------------
|
|
-- Create a fairly unique name for a model..combination of name and a hash
|
|
-- TODO: Check with ETX why we can't get the filename used to store the model info
|
|
-- Improvement request??
|
|
|
|
local function hashName(mName)
|
|
local c=10000;
|
|
|
|
local prefix = string.gsub(mName,"%.","_") -- Change any "." to "_"
|
|
prefix = string.gsub(prefix,"% ","_") -- Change any space to "_"
|
|
prefix = string.sub(prefix,1,5) -- Take the first 5 characters
|
|
|
|
-- Simple Hash of the Model Name adding each character
|
|
for i = 1, #mName do
|
|
local ch = string.byte(mName,i,i)
|
|
c=c+ch
|
|
end
|
|
|
|
return (prefix .. c) -- Return Prefix + Hash
|
|
end
|
|
|
|
-- Load Menu Data from a file
|
|
function ST_LoadFileData()
|
|
local fname = hashName(MODEL.modelName)..".txt"
|
|
|
|
print("Loading File:"..fname)
|
|
|
|
local dataFile = io.open(DATA_PATH .. "/".. fname, "r") -- read File
|
|
-- cannot read file???
|
|
if (dataFile==nil) then return 0 end
|
|
|
|
local line = io.read(dataFile, 5000)
|
|
io.close(dataFile)
|
|
|
|
if #line == 0 then return 0 end -- No data??
|
|
|
|
-- Process the input, each line is "Var_Id : Value" format
|
|
-- Store it into MANU_DATA
|
|
local i=0
|
|
for k, v in string.gmatch(line, "(%d+):(%d+)") do
|
|
--print(string.format("Read MENU_DATA[%d]:[%d]",k, v))
|
|
MENU_DATA[k+0]=v+0 -- do aritmentic to convert string to number
|
|
i=i+1
|
|
end
|
|
|
|
-- Get the basic info
|
|
currAircraftType = MENU_DATA[MEMU_VAR.AIRCRAFT_TYPE]
|
|
currWingType = MENU_DATA[MEMU_VAR.WING_TYPE]
|
|
currTailType = MENU_DATA[MEMU_VAR.TAIL_TYPE]
|
|
|
|
print("Validation")
|
|
print(string.format("AIRCRAFT_TYPE(%d)=%s", MEMU_VAR.AIRCRAFT_TYPE,aircraft_type_text[currAircraftType]))
|
|
print(string.format("WING_TYPE(%d)=%s", MEMU_VAR.WING_TYPE, wing_type_text[currWingType]))
|
|
print(string.format("TAIL_TYPE(%d)=%s", MEMU_VAR.TAIL_TYPE, tail_type_text[currTailType]))
|
|
|
|
printChannelSummary()
|
|
printServoReverseInfo()
|
|
|
|
|
|
-- No need to save right now
|
|
menuDataChanged = false
|
|
|
|
-- Return 0 if no lines processed, 1 otherwise
|
|
if (i > 0) then return 1 else return 0 end
|
|
end
|
|
|
|
-- Saves MENU_DATA to a file
|
|
function ST_SaveFileData()
|
|
local fname = hashName(MODEL.modelName)..".txt"
|
|
|
|
print("Saving File:"..fname)
|
|
local dataFile = assert(io.open(DATA_PATH .. "/" .. fname, "w"),"Please create "..DATA_PATH.." folder") -- write File
|
|
|
|
-- Foreach MENU_DATA with a value write Var_Id:Value into file
|
|
for i = 0, MEMU_VAR.DATA_END do
|
|
if (MENU_DATA[i]~=nil) then
|
|
--print(string.format("Write MENU_DATA[%s] : %s",i,MENU_DATA[i]))
|
|
io.write(dataFile,string.format("%s:%s\n",i,MENU_DATA[i]))
|
|
end
|
|
end
|
|
io.close(dataFile)
|
|
menuDataChanged = false
|
|
end
|
|
|
|
-- This Creates the Servo Settings that will be used to pass to
|
|
-- Forward programming
|
|
local function CreateDSMPortChannelInfo()
|
|
local function ApplyWingMixA(b2)
|
|
-- ELEVON
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE) then return 0x20 end; -- 0x03
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.REVERSE) then return 0x50 end; -- 0x23
|
|
|
|
-- Default normal/reverse behaviour
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE) then return 0x00 end; -- 0x83
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE+CH_TYPE.REVERSE) then return 0x70 end; -- 0xA3
|
|
end
|
|
|
|
local function ApplyWingMixB(b2)
|
|
-- ELEVON
|
|
-- Default normal/reverse behaviour
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE) then return 0x00 end; -- 0x03
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.REVERSE) then return 0x70 end; -- 0x23
|
|
|
|
-- Difference with B
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE) then return 0x20 end; -- 0x83
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE+CH_TYPE.REVERSE) then return 0x50 end; -- 0xA3
|
|
end
|
|
|
|
local function ApplyTailMixA(b2)
|
|
-- VTAIL
|
|
-- Default normal/reverse behaviour
|
|
if (b2==CH_TYPE.RUD+CH_TYPE.ELE) then return 0x00 end; -- 0x06
|
|
if (b2==CH_TYPE.RUD+CH_TYPE.ELE+CH_TYPE.REVERSE) then return 0x70 end; -- 0x26
|
|
|
|
if (b2==CH_TYPE.RUD+CH_TYPE.ELE+CH_TYPE.SLAVE) then return 0x20 end; -- 0x86
|
|
if (b2==CH_TYPE.RUD+CH_TYPE.ELE+CH_TYPE.SLAVE+CH_TYPE.REVERSE) then return 0x50 end; -- 0xA6
|
|
|
|
--TRAILERON
|
|
-- Default normal/reverse behaviour
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE) then return 0x00 end; -- 0x03
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.REVERSE) then return 0x70 end; -- 0x23
|
|
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE) then return 0x10 end; -- 0x83
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE+CH_TYPE.REVERSE) then return 0x60 end; -- 0xA3
|
|
|
|
end
|
|
|
|
local function ApplyTailMixB(b2)
|
|
-- VTAIL
|
|
-- Default normal/reverse behaviour
|
|
if (b2==CH_TYPE.RUD+CH_TYPE.ELE) then return 0x00 end; -- 0x06
|
|
if (b2==CH_TYPE.RUD+CH_TYPE.ELE+CH_TYPE.REVERSE) then return 0x70 end; -- 0x26
|
|
|
|
if (b2==CH_TYPE.RUD+CH_TYPE.ELE+CH_TYPE.SLAVE) then return 0x40 end; -- 0x86
|
|
if (b2==CH_TYPE.RUD+CH_TYPE.ELE+CH_TYPE.SLAVE+CH_TYPE.REVERSE) then return 0x30 end; -- 0xA6
|
|
|
|
--TAILERON
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE) then return 0x10 end; -- 0x03
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.REVERSE) then return 0x60 end; -- 0x23
|
|
|
|
-- Default normal/reverse behaviour
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE) then return 0x00 end; -- 0x83
|
|
if (b2==CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE+CH_TYPE.REVERSE) then return 0x70 end; -- 0xA3
|
|
end
|
|
|
|
|
|
|
|
local DSM_ChannelInfo = {}
|
|
|
|
for i=0, 9 do
|
|
DSM_ChannelInfo[i] = {[0]= 0x00, CH_TYPE.NONE} -- Initialize with no special function
|
|
end
|
|
|
|
local wingType = MENU_DATA[MEMU_VAR.WING_TYPE]
|
|
local tailType = MENU_DATA[MEMU_VAR.TAIL_TYPE]
|
|
|
|
local thrCh = MENU_DATA[MEMU_VAR.CH_THR]
|
|
local lAilCh = MENU_DATA[MEMU_VAR.CH_L_AIL]
|
|
local rAilCh = MENU_DATA[MEMU_VAR.CH_R_AIL]
|
|
local lflapCh = MENU_DATA[MEMU_VAR.CH_L_FLP]
|
|
local rflapCh = MENU_DATA[MEMU_VAR.CH_R_FLP]
|
|
|
|
local lElevCh = MENU_DATA[MEMU_VAR.CH_L_ELE]
|
|
local rElevCh = MENU_DATA[MEMU_VAR.CH_R_ELE]
|
|
|
|
local lRudCh = MENU_DATA[MEMU_VAR.CH_L_RUD]
|
|
local rRudCh = MENU_DATA[MEMU_VAR.CH_R_RUD]
|
|
|
|
-- Channels in menu vars are Zero base, Channel info is 1 based
|
|
|
|
-- THR
|
|
if (thrCh~=nil) then DSM_ChannelInfo[thrCh][1]= CH_TYPE.THR end
|
|
|
|
-- AIL (Left and Right)
|
|
if (lAilCh~=nil) then DSM_ChannelInfo[lAilCh][1] = CH_TYPE.AIL end
|
|
if (rAilCh~=nil) then DSM_ChannelInfo[rAilCh][1] = CH_TYPE.AIL+CH_TYPE.SLAVE end
|
|
-- ELE (Left and Right)
|
|
if (lElevCh~=nil) then DSM_ChannelInfo[lElevCh][1] = CH_TYPE.ELE end
|
|
if (rElevCh~=nil) then DSM_ChannelInfo[rElevCh][1] = CH_TYPE.ELE+CH_TYPE.SLAVE end
|
|
-- RUD (Left and Right)
|
|
if (lRudCh~=nil) then DSM_ChannelInfo[lRudCh][1] = CH_TYPE.RUD end
|
|
if (rRudCh~=nil) then DSM_ChannelInfo[rRudCh][1] = CH_TYPE.RUD+CH_TYPE.SLAVE end
|
|
|
|
-- VTAIL: RUD + ELE
|
|
if (tailType==TAIL_TYPE.VTAIL_A) then
|
|
DSM_ChannelInfo[lElevCh][1] = CH_TYPE.RUD+CH_TYPE.ELE
|
|
DSM_ChannelInfo[rElevCh][1] = CH_TYPE.RUD+CH_TYPE.ELE+CH_TYPE.SLAVE
|
|
elseif (tailType==TAIL_TYPE.VTAIL_B) then
|
|
DSM_ChannelInfo[lElevCh][1] = CH_TYPE.RUD+CH_TYPE.ELE+CH_TYPE.SLAVE
|
|
DSM_ChannelInfo[rElevCh][1] = CH_TYPE.RUD+CH_TYPE.ELE
|
|
end
|
|
|
|
-- TRAILERRON: 2-ELE + AIL
|
|
if (tailType==TAIL_TYPE.TRAILERON_A) then
|
|
DSM_ChannelInfo[lElevCh][1] = CH_TYPE.AIL+CH_TYPE.ELE
|
|
DSM_ChannelInfo[rElevCh][1] = CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE
|
|
elseif (tailType==TAIL_TYPE.TRAILERON_B) then
|
|
DSM_ChannelInfo[lElevCh][1] = CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE
|
|
DSM_ChannelInfo[rElevCh][1] = CH_TYPE.AIL+CH_TYPE.ELE
|
|
end
|
|
|
|
---- ELEVON : AIL + ELE
|
|
if (wingType==WING_TYPE.ELEVON_A) then
|
|
DSM_ChannelInfo[lAilCh][1] = CH_TYPE.AIL+CH_TYPE.ELE
|
|
DSM_ChannelInfo[rAilCh][1] = CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE
|
|
elseif (wingType==WING_TYPE.ELEVON_B) then
|
|
DSM_ChannelInfo[lAilCh][1] = CH_TYPE.AIL+CH_TYPE.ELE
|
|
DSM_ChannelInfo[rAilCh][1] = CH_TYPE.AIL+CH_TYPE.ELE+CH_TYPE.SLAVE
|
|
end
|
|
|
|
-- Apply Gyro Reverse as needed for each channel as long as it is used
|
|
for i=0, 9 do
|
|
if (MENU_DATA[MEMU_VAR.PORT_BASE+i]==CH_MODE_TYPE.REVERSE and DSM_ChannelInfo[i][1]>0) then
|
|
DSM_ChannelInfo[i][0]=DSM_ChannelInfo[i][1]+0x70 -- ALL REVERSE is 0x70 for normal
|
|
DSM_ChannelInfo[i][1]=DSM_ChannelInfo[i][1]+CH_TYPE.REVERSE
|
|
end
|
|
end
|
|
|
|
-- VTAIL: RUD + ELE
|
|
if (tailType==TAIL_TYPE.VTAIL_A) then
|
|
DSM_ChannelInfo[lElevCh][0] = ApplyTailMixA(DSM_ChannelInfo[lElevCh][1])
|
|
DSM_ChannelInfo[rElevCh][0] = ApplyTailMixA(DSM_ChannelInfo[rElevCh][1])
|
|
elseif (tailType==TAIL_TYPE.VTAIL_B) then
|
|
DSM_ChannelInfo[lElevCh][0] = ApplyTailMixB(DSM_ChannelInfo[lElevCh][1])
|
|
DSM_ChannelInfo[rElevCh][0] = ApplyTailMixB(DSM_ChannelInfo[rElevCh][1])
|
|
end
|
|
|
|
-- TRAILERRON: ELE + AIL
|
|
if (tailType==TAIL_TYPE.TRAILERON_A) then
|
|
DSM_ChannelInfo[lElevCh][1] = ApplyTailMixA(DSM_ChannelInfo[lElevCh][1])
|
|
DSM_ChannelInfo[rElevCh][1] = ApplyTailMixA(DSM_ChannelInfo[rElevCh][1])
|
|
elseif (tailType==TAIL_TYPE.TRAILERON_B) then
|
|
DSM_ChannelInfo[lElevCh][1] = ApplyTailMixB(DSM_ChannelInfo[lElevCh][1])
|
|
DSM_ChannelInfo[rElevCh][1] = ApplyTailMixB(DSM_ChannelInfo[rElevCh][1])
|
|
end
|
|
|
|
---- ELEVON : AIL + ELE
|
|
if (wingType==WING_TYPE.ELEVON_A) then
|
|
DSM_ChannelInfo[lAilCh][0] = ApplyWingMixA(DSM_ChannelInfo[lAilCh][1])
|
|
DSM_ChannelInfo[rAilCh][0] = ApplyWingMixA(DSM_ChannelInfo[rAilCh][1])
|
|
elseif (wingType==WING_TYPE.ELEVON_B) then
|
|
DSM_ChannelInfo[lAilCh][0] = ApplyWingMixB(DSM_ChannelInfo[lAilCh][1])
|
|
DSM_ChannelInfo[rAilCh][0] = ApplyWingMixB(DSM_ChannelInfo[rAilCh][1])
|
|
end
|
|
|
|
-- Show how it looks
|
|
for i=0, 9 do
|
|
local b1,b2 = DSM_ChannelInfo[i][0], DSM_ChannelInfo[i][1]
|
|
print(string.format("%s (%02X %02X) %s", MODEL.PORT_TEXT[i],
|
|
b1, b2, dsmLib.channelType2String(b1,b2)))
|
|
end
|
|
|
|
return DSM_ChannelInfo, string.format("Aircraft(%s) Wing(%s) Tail(%s)",aircraft_type_text[currAircraftType],wing_type_text[wingType],tail_type_text[tailType])
|
|
end
|
|
|
|
---- Memu Processing Helpers to Mimic the DSM RX menu behaviour
|
|
|
|
local function ST_StartConnection()
|
|
return 0
|
|
end
|
|
|
|
local function ST_ReleaseConnection()
|
|
end
|
|
|
|
-- Clear each line of the menu
|
|
local function clearMenuLines()
|
|
local ctx = dsmLib.DSM_Context
|
|
for i = 0, dsmLib.MAX_MENU_LINES do -- clear menu
|
|
ctx.MenuLines[i] = { MenuId = 0, lineNum = 0, Type = 0, Text = "", TextId = 0, ValId = 0, Min=0, Max=0, Def=0, TextStart=0, Val=nil }
|
|
end
|
|
end
|
|
|
|
-- Post processing needed for each menu
|
|
local function PostProcessMenu()
|
|
local ctx = dsmLib.DSM_Context
|
|
|
|
if (ctx.Menu.Text==nil) then
|
|
ctx.Menu.Text = dsmLib.Get_Text(ctx.Menu.TextId)
|
|
dsmLib.MenuPostProcessing (ctx.Menu)
|
|
end
|
|
|
|
if (DEBUG_ON) then dsmLib.LOG_write("SIM RESPONSE Menu: %s\n", dsmLib.menu2String(ctx.Menu)) end
|
|
|
|
for i = 0, dsmLib.MAX_MENU_LINES do -- clear menu
|
|
local line = ctx.MenuLines[i]
|
|
if (line.Type~=0) then
|
|
line.MenuId = ctx.Menu.MenuId
|
|
line.lineNum = i
|
|
dsmLib.MenuLinePostProcessing(line) -- Do the same post processing as if they come from the RX
|
|
if (DEBUG_ON) then dsmLib.LOG_write("SIM RESPONSE MenuLine: %s\n", dsmLib.menuLine2String(line)) end
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
-- Creates the menus to Render with the GUI
|
|
local function ST_LoadMenu(menuId)
|
|
local ctx = dsmLib.DSM_Context
|
|
|
|
local function formatTXRevert(port)
|
|
return ((MODEL.modelOutputChannel[port].revert==0 and " (Tx:Normal)") or " (Tx:Reverse)")
|
|
end
|
|
|
|
clearMenuLines()
|
|
|
|
if (menuId==0x1000) then -- MAIN MENU
|
|
ctx.Menu = { MenuId = 0x1000, Text = "Main Menu ("..MODEL.modelName..")", PrevId = 0, NextId = 0, BackId = 0, TextId=0 }
|
|
ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, Text = "Model Setup", ValId = 0x1001,TextId=0 }
|
|
|
|
if (menuDataChanged) 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
|
|
else
|
|
if (SIMULATION_ON) then
|
|
ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, Text = "RX Simulator (GUI dev only)", ValId = 0xFFF1, TextId=0 } -- Menu 0xFFF2 to SIMULATOR
|
|
end
|
|
ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, Text = "Forward Programming RX", ValId = 0xFFF2, TextId=0 } -- Menu 0xFFF2 to Real RX
|
|
ctx.SelLine = 6
|
|
end
|
|
lastGoodMenu = menuId
|
|
elseif (menuId==0x1001) then -- MODEL SETUP
|
|
ctx.Menu = { MenuId = 0x1001, Text = "Model Setup ("..MODEL.modelName..")", PrevId = 0, NextId = 0, BackId = 0x1000, 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
|
|
printChannelSummary()
|
|
ST_SaveFileData()
|
|
|
|
|
|
local msg1 = "Data saved to: "
|
|
local msg2 = " "..DATA_PATH.."/"..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 = 0x1000 }
|
|
ctx.SelLine = 6
|
|
lastGoodMenu = menuId
|
|
elseif (menuId==0x1006) then
|
|
ST_LoadFileData()
|
|
local msg1 = "Data restored from: "
|
|
local msg2 = " "..DATA_PATH.."/"..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 = 0x1000 }
|
|
ctx.SelLine = 6
|
|
lastGoodMenu = menuId
|
|
elseif (menuId==0x1010) then
|
|
ctx.Menu = { MenuId = 0x1010, Text = "Aircraft Type", PrevId = 0x1001, NextId = 0x1011, BackId = 0, 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:"..aircraft_type_text[currAircraftType], PrevId = 0x1010, NextId = 0x1020, BackId = 0, 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=208, 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 = aircraft_type_text[currAircraftType].." Wing:"..wing_type_text[currWingType]
|
|
|
|
ctx.Menu = { MenuId = 0x1020, Text = title, PrevId = 0x1011, NextId = 0x1021, BackId = 0, TextId=0 }
|
|
|
|
ctx.MenuLines[0] = { Type = LINE_TYPE.LIST_MENU_NC, Text=thrText, TextId = 0, ValId = MEMU_VAR.CH_THR, Min=0, Max=9, 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 = 1
|
|
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 = aircraft_type_text[currAircraftType].." Tail:"..tail_type_text[currTailType]
|
|
|
|
ctx.Menu = { MenuId = 0x1021, Text = title, PrevId = 0x1020, NextId = 0x1001, BackId = 0, 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
|
|
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=MODEL.PORT_TEXT[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=MODEL.PORT_TEXT[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=MODEL.PORT_TEXT[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=MODEL.PORT_TEXT[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=MODEL.PORT_TEXT[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
|
|
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=MODEL.PORT_TEXT[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=MODEL.PORT_TEXT[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=MODEL.PORT_TEXT[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=MODEL.PORT_TEXT[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=MODEL.PORT_TEXT[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 = dsmLib.BACK_BUTTON
|
|
end
|
|
|
|
PostProcessMenu()
|
|
end
|
|
|
|
-- ST_SendReceive
|
|
-- Main state machine for the Setup menu
|
|
|
|
local function ST_SendReceive()
|
|
local ctx = dsmLib.DSM_Context
|
|
--if (DEBUG_ON) then dsmLib.LOG_write("%3.3f %s: ", dsmLib.getElapsedTime(), dsmLib.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.Refresh_Display = true
|
|
|
|
|
|
elseif ctx.Phase == PHASE.WAIT_CMD then
|
|
|
|
elseif ctx.Phase == PHASE.MENU_TITLE then -- request menu title
|
|
if ctx.Menu.MenuId == 0 then -- First time loading a menu ?
|
|
ST_LoadMenu(0x01000)
|
|
else
|
|
ST_LoadMenu(ctx.Menu.MenuId)
|
|
end
|
|
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
|
|
ST_AircraftInit(MENU_DATA[MEMU_VAR.AIRCRAFT_TYPE])
|
|
end
|
|
|
|
-- Did the Wing type change?
|
|
if (currWingType ~= MENU_DATA[MEMU_VAR.WING_TYPE]) then
|
|
if (currAircraftType==AIRCRAFT_TYPE.GLIDER) then
|
|
ST_GliderWingInit(MENU_DATA[MEMU_VAR.WING_TYPE])
|
|
else
|
|
ST_PlaneWingInit(MENU_DATA[MEMU_VAR.WING_TYPE])
|
|
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
|
|
currTailType = TAIL_TYPE.RUD_1
|
|
end
|
|
end
|
|
|
|
--- Did the tail changed?
|
|
if (currTailType ~= MENU_DATA[MEMU_VAR.TAIL_TYPE]) then
|
|
if (currAircraftType==AIRCRAFT_TYPE.GLIDER) then
|
|
ST_GliderTailInit(MENU_DATA[MEMU_VAR.TAIL_TYPE])
|
|
else
|
|
ST_PlaneTailInit(MENU_DATA[MEMU_VAR.TAIL_TYPE])
|
|
end
|
|
end
|
|
|
|
ctx.Phase = PHASE.WAIT_CMD
|
|
elseif ctx.Phase == PHASE.EXIT then
|
|
ctx.Phase=PHASE.EXIT_DONE
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------
|
|
-- TEXT Management
|
|
|
|
local List_Text = {}
|
|
local Text = {}
|
|
local List_Text_Img = {}
|
|
local List_Values = {}
|
|
|
|
-- Get the text for this menus
|
|
local function ST_Get_Text(index)
|
|
local out = Text[index] -- Find in regular header first
|
|
if out== nil then
|
|
out = List_Text[index] -- Try list values, don't think is necesary, but just playing Safe
|
|
end
|
|
if out == nil then -- unknown...
|
|
out = "Unknown_" .. string.format("%X", index)
|
|
end
|
|
return out
|
|
end
|
|
|
|
-- Get the List text for this menus
|
|
local function ST_Get_List_Text(index)
|
|
local out = List_Text[index] -- Try to find the message in List_Text
|
|
if out == nil then
|
|
out = Text[index] -- Try list headers, don't think is necesary, but just playing Safe
|
|
end
|
|
if out == nil then -- unknown...
|
|
out = "UnknownLT_" .. string.format("%X", index)
|
|
end
|
|
return out
|
|
end
|
|
|
|
-- Get the List_Text Images
|
|
local function ST_Get_List_Text_Img(index)
|
|
local out = List_Text_Img[index]
|
|
return out
|
|
end
|
|
|
|
local function ST_Get_List_Values(index)
|
|
local out = List_Values[index]
|
|
return out
|
|
end
|
|
|
|
-- Inital List and Image Text for this menus
|
|
local function ST_Init_Text(rxId)
|
|
dsmLib.Init_Text(rxId)
|
|
|
|
-- Channel Names use the Port Text Retrived from OTX/ETX
|
|
for i = 0, 9 do List_Text[i] = MODEL.PORT_TEXT[i] end
|
|
|
|
-- 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] = "Traileron A"; List_Text_Img[200+TAIL_TYPE.TRAILERON_A] = "tt_traileron.png|Traileron A"
|
|
List_Text[200+TAIL_TYPE.TRAILERON_B] = "Traileron B"; List_Text_Img[200+TAIL_TYPE.TRAILERON_B] = "tt_traileron.png|Traileron B"
|
|
|
|
-- Servo Reverse
|
|
List_Text[300+CH_MODE_TYPE.NORMAL] = "Normal "
|
|
List_Text[300+CH_MODE_TYPE.REVERSE] = "Reverse"
|
|
|
|
end
|
|
|
|
-- Initial Setup
|
|
local function ST_Init()
|
|
-- Initialize dsmLib background
|
|
dsmLib.Init()
|
|
-- Initialize text (use RX_ID 0)
|
|
ST_Init_Text(0)
|
|
|
|
-- Setup default Data, and load a file if exist
|
|
ST_Default_Data()
|
|
if (ST_LoadFileData()==0) then -- Did not load a file
|
|
ST_SaveFileData() -- Save Defaults
|
|
end
|
|
end
|
|
|
|
|
|
------------------------------------------------------------------------------------------------------------
|
|
-- Lib EXPORTS
|
|
|
|
-- Export Constants
|
|
SetupLib.PHASE = dsmLib.PHASE
|
|
SetupLib.LINE_TYPE = dsmLib.LINE_TYPE
|
|
SetupLib.RX = dsmLib.RX
|
|
SetupLib.DISP_ATTR = dsmLib.DISP_ATTR
|
|
|
|
SetupLib.BACK_BUTTON = dsmLib.BACK_BUTTON
|
|
SetupLib.NEXT_BUTTON = dsmLib.NEXT_BUTTON
|
|
SetupLib.PREV_BUTTON = dsmLib.PREV_BUTTON
|
|
SetupLib.MAX_MENU_LINES = dsmLib.MAX_MENU_LINES
|
|
|
|
-- Export Shared Context Variables
|
|
SetupLib.DSM_Context = dsmLib.DSM_Context
|
|
|
|
-- Export Functions
|
|
SetupLib.LOG_write = dsmLib.LOG_write
|
|
SetupLib.LOG_close = dsmLib.LOG_close
|
|
SetupLib.getElapsedTime = dsmLib.getElapsedTime
|
|
|
|
SetupLib.Get_Text = ST_Get_Text
|
|
SetupLib.Get_List_Text = ST_Get_List_Text
|
|
SetupLib.Get_List_Text_Img = ST_Get_List_Text_Img
|
|
|
|
SetupLib.phase2String = dsmLib.phase2String
|
|
SetupLib.menu2String = dsmLib.menu2String
|
|
SetupLib.menuLine2String = dsmLib.menuLine2String
|
|
|
|
SetupLib.isSelectableLine = dsmLib.isSelectableLine
|
|
SetupLib.isEditableLine = dsmLib.isEditableLine
|
|
SetupLib.isListLine = dsmLib.isListLine
|
|
SetupLib.isPercentValueLine = dsmLib.isPercentValueLine
|
|
SetupLib.isNumberValueLine = dsmLib.isNumberValueLine
|
|
SetupLib.isDisplayAttr = dsmLib.isDisplayAttr
|
|
SetupLib.isFlightModeLine = dsmLib.isFlightModeLine
|
|
SetupLib.GetFlightModeValue = dsmLib.GetFlightModeValue
|
|
|
|
SetupLib.StartConnection = ST_StartConnection -- Override Function
|
|
SetupLib.ReleaseConnection = ST_ReleaseConnection -- Override Function
|
|
SetupLib.ChangePhase = dsmLib.ChangePhase
|
|
SetupLib.Value_Add = dsmLib.Value_Add
|
|
SetupLib.Value_Default = dsmLib.Value_Default
|
|
SetupLib.Value_Write_Validate = dsmLib.Value_Write_Validate
|
|
SetupLib.GotoMenu = dsmLib.GotoMenu
|
|
SetupLib.MoveSelectionLine = dsmLib.MoveSelectionLine
|
|
SetupLib.Send_Receive = ST_SendReceive -- Override Function
|
|
SetupLib.Init = ST_Init
|
|
SetupLib.Init_Text = ST_Init_Text
|
|
|
|
SetupLib.CreateDSMPortChannelInfo = CreateDSMPortChannelInfo
|
|
|
|
return SetupLib
|