From 40b393ac4a922a3239be3e4f16dc79b3bbd70d8a Mon Sep 17 00:00:00 2001 From: Frankie Arzu <32604366+frankiearzu@users.noreply.github.com> Date: Sun, 20 Nov 2022 11:01:16 -0600 Subject: [PATCH] Frankie DSM fwrd Prog (more improvements) (#760) * #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 Co-authored-by: pascallanger --- Lua_scripts/DSM FwdPrg_05_BW.lua | 39 +- Lua_scripts/DSM FwdPrg_05_Color.lua | 44 +- Lua_scripts/DSMLIB/DsmFwPrgLib.lua | 390 +++++++----- Lua_scripts/DSMLIB/DsmFwPrgSIMLib.lua | 871 +++++++++++++++++++------- Lua_scripts/DSMLIB/img/rx_pos_1.png | Bin 0 -> 2725 bytes Lua_scripts/DSMLIB/img/rx_pos_10.png | Bin 0 -> 2805 bytes Lua_scripts/DSMLIB/img/rx_pos_11.png | Bin 0 -> 3042 bytes Lua_scripts/DSMLIB/img/rx_pos_12.png | Bin 0 -> 2781 bytes Lua_scripts/DSMLIB/img/rx_pos_13.png | Bin 0 -> 2677 bytes Lua_scripts/DSMLIB/img/rx_pos_14.png | Bin 0 -> 2811 bytes Lua_scripts/DSMLIB/img/rx_pos_15.png | Bin 0 -> 2999 bytes Lua_scripts/DSMLIB/img/rx_pos_16.png | Bin 0 -> 2776 bytes Lua_scripts/DSMLIB/img/rx_pos_17.png | Bin 0 -> 2629 bytes Lua_scripts/DSMLIB/img/rx_pos_18.png | Bin 0 -> 2619 bytes Lua_scripts/DSMLIB/img/rx_pos_19.png | Bin 0 -> 2622 bytes Lua_scripts/DSMLIB/img/rx_pos_2.png | Bin 0 -> 2536 bytes Lua_scripts/DSMLIB/img/rx_pos_20.png | Bin 0 -> 2674 bytes Lua_scripts/DSMLIB/img/rx_pos_21.png | Bin 0 -> 2735 bytes Lua_scripts/DSMLIB/img/rx_pos_22.png | Bin 0 -> 2698 bytes Lua_scripts/DSMLIB/img/rx_pos_23.png | Bin 0 -> 2743 bytes Lua_scripts/DSMLIB/img/rx_pos_24.png | Bin 0 -> 2721 bytes Lua_scripts/DSMLIB/img/rx_pos_25.png | Bin 0 -> 2696 bytes Lua_scripts/DSMLIB/img/rx_pos_3.png | Bin 0 -> 2992 bytes Lua_scripts/DSMLIB/img/rx_pos_4.png | Bin 0 -> 2540 bytes Lua_scripts/DSMLIB/img/rx_pos_5.png | Bin 0 -> 2575 bytes Lua_scripts/DSMLIB/img/rx_pos_6.png | Bin 0 -> 2548 bytes Lua_scripts/DSMLIB/img/rx_pos_7.png | Bin 0 -> 2995 bytes Lua_scripts/DSMLIB/img/rx_pos_8.png | Bin 0 -> 2547 bytes Lua_scripts/DSMLIB/img/rx_pos_9.png | Bin 0 -> 2834 bytes Lua_scripts/DSMLIB/readme.txt | 6 +- 30 files changed, 940 insertions(+), 410 deletions(-) create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_1.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_10.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_11.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_12.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_13.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_14.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_15.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_16.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_17.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_18.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_19.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_2.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_20.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_21.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_22.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_23.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_24.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_25.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_3.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_4.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_5.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_6.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_7.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_8.png create mode 100644 Lua_scripts/DSMLIB/img/rx_pos_9.png diff --git a/Lua_scripts/DSM FwdPrg_05_BW.lua b/Lua_scripts/DSM FwdPrg_05_BW.lua index 2420b0a..539d68a 100644 --- a/Lua_scripts/DSM FwdPrg_05_BW.lua +++ b/Lua_scripts/DSM FwdPrg_05_BW.lua @@ -125,7 +125,7 @@ local function GUI_Display_Line_Menu(x,y,w,h,line,selected) if dsmLib.isSelectableLine(line) then -- Menu Line - text = text .. " |>" --OPENTX + text = text .. " >" else -- SubHeaders and plain text lines if (TEXT_SIZE~=SMLSIZE) then -- ignore bold on small size screens bold = (dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.BOLD) and BOLD) or 0 @@ -154,8 +154,8 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing) local header = line.Text -- ONLY do this for Flight Mode (Right Align or Centered) if (dsmLib.isFlightModeText(line.TextId)) then - -- Display Header + Value together - header = header .. " " .. value + -- Display Header + Value together + header = dsmLib.GetFlightModeValue(line.TextId,header,value) -- Flight mode display attributes if (TEXT_SIZE~=SMLSIZE) then -- ignore bold on small size screens @@ -194,6 +194,23 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing) if (DEBUG_ON_LCD) then lcd.drawText(LCD_X_LINE_DEBUG,y, line.MinMaxDebug or "", TEXT_SIZE + WARNING_COLOR) end -- display debug end + +------------------------------------------------------------------------------------------------------------ +local function GUI_ShowBitmap(x,y,imgData) + -- imgData format "bitmap.png|alt message" + local f = string.gmatch(imgData, '([^%|]+)') -- Iterator over values split by '|' + local imgName, imgMsg = f(), f() + + lcd.drawText(x, y, imgMsg or "") -- Alternate Image MSG + + -- NO IMAGES in Text B&W + --local imgPath = IMAGE_PATH .. (imgName or "") + --local bitmap = Bitmap.open(imgPath) + --if (bitmap~=nil) then + -- lcd.drawBitmap(bitmap, x,y+20) + --end +end + ------------------------------------------------------------------------------------------------------------ local function GUI_Display() local ctx = DSM_Context @@ -211,7 +228,11 @@ local function GUI_Display() end --Draw RX Menu if ctx.Phase == PHASE.RX_VERSION then - lcd.drawText(LCD_X_LINE_TITLE,50,"No compatible DSM RX...", BLINK + TEXT_SIZE) + if (ctx.isReset) then + lcd.drawText(LCD_X_LINE_TITLE,50,"Waiting for RX to Restart", BLINK + TEXT_SIZE) + else + lcd.drawText(LCD_X_LINE_TITLE,50,"No compatible DSM RX...", BLINK + TEXT_SIZE) + end else local menu = ctx.Menu if menu.Text ~= nil then @@ -235,13 +256,11 @@ local function GUI_Display() local value = line.Val if line.Val ~= nil then if dsmLib.isListLine(line) then -- for Lists of Strings, get the text - value = dsmLib.Get_Text(line.Val + line.TextStart) -- TextStart is the initial offset for text - local imgValue = dsmLib.Get_Text_Img(line.Val + line.TextStart) -- Complentary IMAGE for this value to Display?? + value = dsmLib.Get_List_Text(line.Val + line.TextStart) -- TextStart is the initial offset for text + local imgData = dsmLib.Get_List_Text_Img(line.Val + line.TextStart) -- Complentary IMAGE for this value to Display?? - if (imgValue) then -- Optional Image for a Value - --TODO: Pending feature.. create images and put bitmap instead of a message - --Display the image/Alternate Text - lcd.drawText(LCD_X_LINE_TITLE, LCD_Y_LINE_FIRST+LCD_Y_LINE_HEIGHT, "Img:"..imgValue) + if (imgData) then -- Optional Image and Msg for value + GUI_ShowBitmap(LCD_X_LINE_TITLE,LCD_Y_LINE_FIRST+LCD_Y_LINE_HEIGHT, imgData) end end diff --git a/Lua_scripts/DSM FwdPrg_05_Color.lua b/Lua_scripts/DSM FwdPrg_05_Color.lua index d747eaf..908bf84 100644 --- a/Lua_scripts/DSM FwdPrg_05_Color.lua +++ b/Lua_scripts/DSM FwdPrg_05_Color.lua @@ -31,6 +31,8 @@ else dsmLib = loadScript("/SCRIPTS/TOOLS/DSMLIB/DsmFwPrgLib.lua")(DEBUG_ON) end +local IMAGE_PATH = "/SCRIPTS/TOOLS/DSMLIB/img/" + local PHASE = dsmLib.PHASE local LINE_TYPE = dsmLib.LINE_TYPE local DISP_ATTR = dsmLib.DISP_ATTR @@ -85,7 +87,6 @@ local LCD_BOX_COLOR = TEXT_DISABLE_COLOR --------------------- lcd.sizeText replacement ------------------------------------------------- -- EdgeTx dont have lcd.sizeText, so we do an equivalent one using the string length and 5px per character local function my_lcd_sizeText(s) - print(string.format("EdgeTX=%s",IS_EDGETX)) -- return: If IS_EDGETX then lcd.sizeText() else string.len() return (IS_EDGETX and lcd.sizeText(s)) or (string.len(s)*10) end @@ -214,7 +215,7 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing) -- ONLY do this for Flight Mode (Right Align or Centered) if (dsmLib.isFlightModeText(line.TextId)) then -- Display Header + Value together - header = header .. " " .. value + header = dsmLib.GetFlightModeValue(line.TextId,header,value) -- Bold Text??? bold = (dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.BOLD) and BOLD) or 0 @@ -327,6 +328,20 @@ local function GUI_Display_Edit_Buttons(line) end +local function GUI_ShowBitmap(x,y,imgData) + -- imgData format "bitmap.png|alt message" + local f = string.gmatch(imgData, '([^%|]+)') -- Iterator over values split by '|' + local imgName, imgMsg = f(), f() + + lcd.drawText(x, y, imgMsg or "") -- Alternate Image MSG + + local imgPath = IMAGE_PATH .. (imgName or "") + local bitmap = Bitmap.open(imgPath) + if (bitmap~=nil) then + lcd.drawBitmap(bitmap, x,y+20) + end +end + ------------------------------------------------------------------------------------------------------------ local function GUI_Display() local ctx = DSM_Context @@ -344,7 +359,11 @@ local function GUI_Display() lcd.drawText(5, 0, header, LCD_TOOL_HDR_COLOR + SMLSIZE) --Draw RX Menu if ctx.Phase == PHASE.RX_VERSION then - lcd.drawText(LCD_X_LINE_TITLE,100,"No compatible DSM RX...", BLINK) + if (ctx.isReset) then + lcd.drawText(LCD_X_LINE_TITLE,100,"Waiting for RX to Restart", BLINK) + else + lcd.drawText(LCD_X_LINE_TITLE,100,"No compatible DSM RX...", BLINK) + end else local menu = ctx.Menu @@ -364,18 +383,15 @@ local function GUI_Display() if line.Type == LINE_TYPE.MENU then GUI_Display_Line_Menu(i, line, i == ctx.SelLine) else - -- list/value line - local value, imgValue = line.Val, nil - if line.Val ~= nil then + local value = line.Val + if dsmLib.isListLine(line) then -- for Lists of Strings, get the text - value = dsmLib.Get_Text(line.Val + line.TextStart) -- TextStart is the initial offset for text - imgValue = dsmLib.Get_Text_Img(line.Val + line.TextStart) -- Complentary IMAGE for this value to Display?? + value = dsmLib.Get_List_Text(line.Val + line.TextStart) -- TextStart is the initial offset for text + local imgData = dsmLib.Get_List_Text_Img(line.Val + line.TextStart) -- Complentary IMAGE for this value to Display?? - if (imgValue) then -- Optional Image for a Value - --TODO: Pending feature.. create images and put bitmap instead of a message - --Display the image/Alternate Text - lcd.drawText(LCD_X_LINE_TITLE, LCD_Y_LINE_START+LCD_Y_LINE_HEIGHT, "Img:"..imgValue) + if (imgData) then -- Optional Image and Msg for value + GUI_ShowBitmap(LCD_X_LINE_TITLE,LCD_Y_LINE_START, imgData) end end @@ -386,6 +402,7 @@ local function GUI_Display() end -- for if IS_EDGETX and ctx.isEditing() then + -- Display Touch button for Editing values GUI_Display_Edit_Buttons(ctx.MenuLines[ctx.EditLine]) end end @@ -393,6 +410,7 @@ local function GUI_Display() else -- Different Resolution.. Maybe just adjusting some of the constants will work, adjust it in DSM_Init?? -- LCD_X_LINE_TITLE, LCD_Y_LINE_START, etc + lcd.drawText(LCD_X_LINE_TITLE,100,"Only supported in Color Radios of 480 resolution", BLINK) end end @@ -467,7 +485,7 @@ local function GUI_HandleEvent(event, touchState) end end end - end + end -- IS_EDGETX if event == EVT_VIRTUAL_EXIT then ctx.Refresh_Display=true diff --git a/Lua_scripts/DSMLIB/DsmFwPrgLib.lua b/Lua_scripts/DSMLIB/DsmFwPrgLib.lua index 997f0bc..eb2f53b 100644 --- a/Lua_scripts/DSMLIB/DsmFwPrgLib.lua +++ b/Lua_scripts/DSMLIB/DsmFwPrgLib.lua @@ -73,6 +73,7 @@ local LINE_TYPE = { LIST_MENU2 = 0x4C, -- List: Seems like a bolean menu, just 2 values 0->1 (off/on, ihn/Act) VALUE_NOCHANGING = 0x60, -- value not change in GUI, change internally at the receiver VALUE_PERCENT = 0xC0, -- 8 bit number, percent + VALUE_DEGREES = 0xE0, -- Degress?? VALUE_NUM_I8 = 0x40, -- 8 bit number VALUE_NUM_I16 = 0x41, -- 16 Bit number VALUE_NUM_SI16 = 0xC1, -- Signed 16 bit number @@ -90,9 +91,10 @@ local DSM_Context = { RX = { Id=0, Name = "", Version = "" }, Refresh_Display = true, - SelLine = 0, -- Current Selected Line - EditLine = nil, -- Current Editing Line - CurLine = -1 -- Current Line Requested/Parsed via h message protocol + SelLine = 0, -- Current Selected Line + EditLine = nil, -- Current Editing Line + CurLine = -1, -- Current Line Requested/Parsed via h message protocol + isReset = false -- false when starting from scracts, true when starting from Reset } local MAX_MENU_LINES = 6 @@ -110,11 +112,12 @@ local Value_Change_Step = 0 -- 2 Steps to update. 0=Send update value, 1=Send V -- Text Arrays for Display Text and Debuging local PhaseText = {} local LineTypeText = {} -local Text = {} -- Text for Menu and Menu Lines local RxName = {} -local Text_Img = {} -- If the Text has Attached Images -local Menu_List_Values = {} -- Additiona Menu_List valid values when non contiguos +local Text = {} -- Text for Menu and Menu Lines (Headers only) +local List_Text = {} -- Messages for List Options (values only) +local List_Text_Img = {} -- If the Text has Attached Images +local List_Values = {} -- Additiona restrictions on List Values when non contiguos (L_M1 lines has this problem) local LOG_FILE = "/LOGS/dsm_log.txt" local logFile = nil @@ -196,21 +199,34 @@ end ------------------------------------------------------------------------------------------------------------ local function Get_Text(index) - local out = 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 -local function Get_Text_Img(index) - local out = Text_Img[index] - +local function 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 -local function Get_Menu_List_Values(index) - local out = Menu_List_Values[index] +local function Get_List_Text_Img(index) + local out = List_Text_Img[index] + return out +end + +local function Get_List_Values(index) + local out = List_Values[index] return out end @@ -239,7 +255,7 @@ local function lineValue2String(l) if (l ~= nil and l.Val ~= nil) then local value = l.Val if isListLine(l) then - value = value .. "|\"" .. Get_Text(l.Val + l.TextStart) .. "\"" + value = value .. "|\"" .. Get_List_Text(l.Val + l.TextStart) .. "\"" else value = value..(l.Format or "") end @@ -455,7 +471,7 @@ local function DSM_Value_Add(line, inc) -- Use local validation for LIST_MENU1 when the range is wide open -- Also use if for some LIST_MENU0 that the Range seems incorrect if (isListLine(line)) then -- and line.Type==LINE_TYPE.LIST_MENU1 and line.Min==0 and line.Max==244) then - values = Get_Menu_List_Values(line.TextId) + values = Get_List_Values(line.TextId) end @@ -624,6 +640,29 @@ end ----------------------------------------------------------------------------------------------------------- +local function DSM_SelLine_HACK() + -- This hack was to be able to access some menus, that with using the default ctx.SelLine as it was, + -- the menu start returning weird 0x05 Unknow lines, by overriding the ctx.SelLine to Zero or other value + -- they started to work. + -- Tested to work on the RX: AR631, AR637T, AR637TA + + local ctx = DSM_Context + if (ctx.RX.Id == RX.AR637T or ctx.RX.Id == RX.AR637TA or ctx.RX.Id == RX.AR631) then + -- AR631/AR637 Hack for "First time Setup" or "First Time AS3X Setup", use 0 instead of the ctx.SelLine + if (ctx.Menu.MenuId == 0x104F or ctx.Menu.MenuId==0x1055) then + if (DEBUG_ON) then LOG_write("First time Setup Menu HACK: Overrideing LastSelectedLine to ZERO\n") end + if (DEBUG_ON) then LOG_write("%3.3f %s: ", getElapsedTime(), phase2String(ctx.Phase)) end + ctx.SelLine = 0 + end + -- AR631/AR637 Hack for "Relearn Servo Settings", use 1 instead of the ctx.SelLine=0 + if (ctx.Menu.MenuId == 0x1023) then + if (DEBUG_ON) then LOG_write("Relearn Servo Settings HACK: Overrideing LastSelectedLine to 1\n") end + if (DEBUG_ON) then LOG_write("%3.3f %s: ", getElapsedTime(), phase2String(ctx.Phase)) end + ctx.SelLine = 1 + end + end +end + local function DSM_sendRequest() -- Send the proper Request message depending on the Phase @@ -640,20 +679,14 @@ local function DSM_sendRequest() if ctx.Menu.MenuId == 0 then -- First time loading a menu ? DSM_getMainMenu() else - -- AR631/AR637 Hack for "First time Setup" or "First Time AS3X Setup", use 0 instead of the ctx.SelLine - -- otherwise it will get into a werid loop of Unknown_0x05 lines!! - if (ctx.Menu.MenuId == 0x104F or ctx.Menu.MenuId==0x1055) then - if (DEBUG_ON) then LOG_write("First time Setup Menu HACK: Overrideing LastSelectedLine to ZERO\n") end - if (DEBUG_ON) then LOG_write("%3.3f %s: ", getElapsedTime(), phase2String(ctx.Phase)) end - ctx.SelLine = 0 - end - + DSM_SelLine_HACK() DSM_getMenu(ctx.Menu.MenuId, ctx.SelLine) if (ctx.Menu.MenuId == 0x0001) then -- Executed the Reset Menu?? if (DEBUG_ON) then LOG_write("RX Reset!!!\n") end -- Start again retriving RX info - ctx.Menu.MenuId = 0 + ctx.Menu.MenuId = 0 + ctx.isReset = true ctx.Phase = PHASE.RX_VERSION end end @@ -843,6 +876,7 @@ local function DSM_processResponse() if cmd == 0x01 then -- read version DSM_parseRxVersion() Lib.Init_Text(DSM_Context.RX.Id) + ctx.isReset = false -- no longer resetting ctx.Phase = PHASE.MENU_TITLE elseif cmd == 0x02 then -- read menu title @@ -1005,6 +1039,7 @@ local function DSM_Init(toolName) LineTypeText[LINE_TYPE.LIST_MENU2] = "L_m2" LineTypeText[LINE_TYPE.VALUE_NOCHANGING] = "V_NC" LineTypeText[LINE_TYPE.VALUE_PERCENT] = "V_%" + LineTypeText[LINE_TYPE.VALUE_DEGREES] = "V_de" LineTypeText[LINE_TYPE.VALUE_NUM_I8] = "V_i8" LineTypeText[LINE_TYPE.VALUE_NUM_I16] = "V_i16" LineTypeText[LINE_TYPE.VALUE_NUM_SI16] = "V_s16" @@ -1022,13 +1057,14 @@ end local function DSM_Init_Text(rxId) --Text to be displayed - -- For menu lines (no name: value ) who are not navigation to other menus + -- For menu lines who are not navigation to other menus (SubHeders or Plain text) -- you can use some formatting options: + -- Text allightment: /c = CENTER, /r = RIGHT -- Text effects: /b = BOLD - -- Text formatting: /p = PERCENT numbers + -- Text formatting: /p = PERCENT numbers (forced if not in Line Type=PERCENT) - -- array Menu_List_Values: + -- array List_Values: -- For some Menu LIST VALUES, special Lines of type:LIST_MENU1, the valod options seems not -- to be contiguos, the array "Menu_List_Values" can help narrow down the -- valid menu options. I think this should come from the RX, but cant find where. @@ -1036,60 +1072,65 @@ local function DSM_Init_Text(rxId) -- usually is Ihnibit + range of contiguos values, but cant seems to find in the RX data receive the values -- to do it automatically + -- Om/Off List Options + List_Text[0x0001] = "On" + List_Text[0x0002] = "Off" - Text[0x0001] = "On" - Text[0x0002] = "Off" - - Text[0x0003] = "Inh" - Text[0x0004] = "Act" + -- Ihn/Act List Options + List_Text[0x0003] = "Inh" + List_Text[0x0004] = "Act" -- Channel selection for SAFE MODE and GAINS on FC6250HX - Text[0x000C] = "Inhibit?" --? - Text[0x000D] = "Gear" - for i = 1, 7 do Text[0x000D + i] = "Aux" .. i end -- Aux channels + List_Text[0x000C] = "Inhibit?" --? + List_Text[0x000D] = "Gear" + for i = 1, 7 do List_Text[0x000D + i] = "Aux" .. i end -- Aux channels -- Servo Output values.. - local servoOutputValues = {0x0003,0x002D,0x002E,0x002F} --Inh (GAP), 5.5ms, 11ms, 22ms - Text[0x002D] = "5.5ms" - Text[0x002E] = "11ms" - Text[0x002F] = "22ms" + local servoOutputValues = {0x0003,0x002D,0x002E,0x002F} --Inh (GAP), 5.5ms, 11ms, 22ms. Fixing L_m1 with 0..244 range! + List_Text[0x002D] = "5.5ms" + List_Text[0x002E] = "11ms" + List_Text[0x002F] = "22ms" -- Gain Values - local gainValues = {0x0032,0x0033,0x0034} -- 1X, 2X, 4X - Text[0x0032] = "1 X" - Text[0x0033] = "2 X" - Text[0x0034] = "4 X" + local gainValues = {0x0032,0x0033,0x0034} -- 1X, 2X, 4X -- Fixing L_m1 with 0..244 range! + List_Text[0x0032] = "1 X" + List_Text[0x0033] = "2 X" + List_Text[0x0034] = "4 X" - -- List of Channels for most RX, except FC6250HX - local channelValues = {0x0035,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F} -- Inhibit? (GAP), Gear,Aux1..Aux5 - local outputValues = {0x0036,0x0037,0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F} -- Thr,Ail,Elv,Rud,Gear,Aux1..Aux5 - Text[0x0035] = "Inhibit?" --? - Text[0x0036] = "Throttle" - Text[0x0037] = "Aileron" - Text[0x0038] = "Elevator" - Text[0x0039] = "Rudder" - Text[0x003A] = "Gear" - for i = 1, 7 do Text[0x003A + i] = "Aux" .. i end -- Aux channels on AR637T + -- List of Channels for Safe, Gains, Panic, except FC6250HX that uses other range (0x00C..0x015) + -- the valid range Starts with GEAR if enabled (Thr,Ail,Ele,Rud are not valid, the RX reject them ) + -- Valid Values: Inhibit? (GAP), Gear,Aux1..Aux7,X-Plus-1..XPlus-8 + local channelValues = {0x0035,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049} + + List_Text[0x0035] = "Inhibit?" --? + List_Text[0x0036] = "Throttle" + List_Text[0x0037] = "Aileron" + List_Text[0x0038] = "Elevator" + List_Text[0x0039] = "Rudder" + List_Text[0x003A] = "Gear" + for i = 1, 7 do List_Text[0x003A + i] = "Aux" .. i end -- Aux channels on AR637T for i = 1, 8 do -- 41..49 on AR637T -- This don't seem OK - Text[0x0041 + i] = "XPlus-" .. i + List_Text[0x0041 + i] = "XPlus-" .. i end - --But FOTO-PETE reports that it should be (works with AR631,AR637,FC6250HX) + -- ****No longer overrides of previous XPlus values, since using different array + -- for List_Text values + Text[0x0040] = "Roll" Text[0x0041] = "Pitch" Text[0x0042] = "Yaw" Text[0x0043] = "Gain /c/b" -- FC6250HX, AR631 Text[0x0045] = "Differential" Text[0x0046] = "Priority" - Text[0x0049] = "Output Setup" -- FC6250HX + Text[0x0049] = "Output Setup" -- FC6250HX, AR631 --****** Text[0x004A] = "Failsafe" Text[0x004B] = "Main Menu" Text[0x004E] = "Position" - Text[0x0050] = "Outputs"; Menu_List_Values[0x0050]=outputValues + Text[0x0050] = "Outputs"; Text[0x0051] = "Output Channel 1" Text[0x0052] = "Output Channel 2" @@ -1099,18 +1140,18 @@ local function DSM_Init_Text(rxId) Text[0x0056] = "Output Channel 6" if (rxId ~= RX.FC6250HX) then -- Restrictions for non FC6250HX - Menu_List_Values[0x0051]=servoOutputValues - Menu_List_Values[0x0052]=servoOutputValues - Menu_List_Values[0x0053]=servoOutputValues - Menu_List_Values[0x0054]=servoOutputValues - Menu_List_Values[0x0055]=servoOutputValues - Menu_List_Values[0x0056]=servoOutputValues + List_Values[0x0051]=servoOutputValues + List_Values[0x0052]=servoOutputValues + List_Values[0x0053]=servoOutputValues + List_Values[0x0054]=servoOutputValues + List_Values[0x0055]=servoOutputValues + List_Values[0x0056]=servoOutputValues end -- FailSafe Options --Text[0x005E]="Inhibit" - Text[0x005F] = "Hold Last" - Text[0x0060] = "Preset" + List_Text[0x005F] = "Hold Last" + List_Text[0x0060] = "Preset" --Text[0x0061]="Custom" --FC6250HX @@ -1120,7 +1161,7 @@ local function DSM_Init_Text(rxId) -- Flight mode channel selection Text[0x0078] = "FM Channel" - if (rxId ~= RX.FC6250HX) then Menu_List_Values[0x0078]=channelValues end --FC6250HX uses other range + if (rxId ~= RX.FC6250HX) then List_Values[0x0078]=channelValues end --FC6250HX uses other range Text[0x0080] = "Orientation" Text[0x0082] = "Heading" @@ -1131,9 +1172,9 @@ local function DSM_Init_Text(rxId) -- Gain channel selection Text[0x0089] = "Gain Channel" - if (rxId ~= RX.FC6250HX) then Menu_List_Values[0x0089]=channelValues end --FC6250HX uses other range + if (rxId ~= RX.FC6250HX) then List_Values[0x0089]=channelValues end --FC6250HX uses other range -- Gain Sensitivity - Text[0x008A] = "Gain Sensitivity/r"; Menu_List_Values[0x008A]=gainValues -- (L_M1 was wide open) + Text[0x008A] = "Gain Sensitivity/r"; List_Values[0x008A]=gainValues -- Right Alight, (L_M1 was wide open range 0->244) Text[0x008B] = "Panic" Text[0x008E] = "Panic Delay" @@ -1150,7 +1191,7 @@ local function DSM_Init_Text(rxId) Text[0x009A] = "Capture Failsafe Positions" Text[0x009C] = "Custom Failsafe" - Text[0x009F] = "Save Settings & Reset RX (NOT WORKING YET)" -- FAKE: Menu 0x0001 -- Looks like special Save & Reset Menu + Text[0x009F] = "Save & Reset RX" -- TODO: Find the Proper Spektrum Value ?? Text[0x00A5] = "First Time Setup" Text[0x00AA] = "Capture Gyro Gains" @@ -1158,75 +1199,80 @@ local function DSM_Init_Text(rxId) -- Safe mode options, Ihnibit + thi values local safeModeOptions = {0x0003,0x00B0,0x00B1} -- inh (gap), "Self-Level/Angle Dem, Envelope - Text[0x00B0] = "Self-Level/Angle Dem" - Text[0x00B1] = "Envelope" + List_Text[0x00B0] = "Self-Level/Angle Dem" + List_Text[0x00B1] = "Envelope" - Text[0x00B5] = "Inhibit" - Text[0x00B6] = "FM1" - Text[0x00B7] = "FM2" - Text[0x00B8] = "FM3" - Text[0x00B9] = "FM4" - Text[0x00BA] = "FM5" - Text[0x00BB] = "FM6" - Text[0x00BC] = "FM7" - Text[0x00BD] = "FM8" - Text[0x00BE] = "FM9" - Text[0x00BF] = "FM10" + List_Text[0x00B5] = "Inhibit" + List_Text[0x00B6] = "FM1" + List_Text[0x00B7] = "FM2" + List_Text[0x00B8] = "FM3" + List_Text[0x00B9] = "FM4" + List_Text[0x00BA] = "FM5" + List_Text[0x00BB] = "FM6" + List_Text[0x00BC] = "FM7" + List_Text[0x00BD] = "FM8" + List_Text[0x00BE] = "FM9" + List_Text[0x00BF] = "FM10" + + Text[0x00BE] = "Unknown_BE" -- Used in Reset menu (0x0001) while the RX is rebooting Text[0x00C7] = "Calibrate Sensor" + Text[0x00C8] = "Complete" -- FC6250HX calibration complete Text[0x00CA] = "SAFE/Panic Mode Setup" + Text[0x00CD] = "Level model and capture attiude/c"; -- Different from List_Text -- RX Orientations for AR631/AR637 (on the Heli Receiver is different, see below) - -- Optionally attach an Image to display (TODO, not done yet) - Text[0x00CB] = "RX Pos 1"; Text_Img[0x00CB] = "Pilot View: RX Label Up, Pins Back" - Text[0x00CC] = "RX Pos 2"; Text_Img[0x00CC] = "Pilot View: RX Label Left, Pins Back" - Text[0x00CD] = "RX Pos 3"; Text_Img[0x00CD] = "Pilot View: RX Label Down, Pins Back" - Text[0x00CE] = "RX Pos 4"; Text_Img[0x00CE] = "Pilot View: RX Label Right, Pins Back" - Text[0x00CF] = "RX Pos 5"; Text_Img[0x00CF] = "Pilot View: RX Label UP, Pins to Front" - Text[0x00D0] = "RX Pos 6"; Text_Img[0x00D0] = "Pilot View: RX Label Left, Pins Front" - Text[0x00D1] = "RX Pos 7"; Text_Img[0x00D1] = "Pilot View: RX Label Down, Pins Front" - Text[0x00D2] = "RX Pos 8"; Text_Img[0x00D2] = "Pilot View: RX Label Right, Pins Front" - Text[0x00D3] = "RX Pos 9"; Text_Img[0x00D3] = "Pilot View: RX Label Up, Pins Left" - Text[0x00D4] = "RX Pos 10"; Text_Img[0x00D4] = "Pilot View: RX Label Back, Pins Left" - Text[0x00D5] = "RX Pos 11"; Text_Img[0x00D5] = "Pilot View: RX Label Down, Pins Left" - Text[0x00D6] = "RX Pos 12"; Text_Img[0x00D6] = "Pilot View: RX Label Front, Pins Left" - Text[0x00D7] = "RX Pos 13"; Text_Img[0x00D7] = "Pilot View: RX Label Up, Pins Right" - Text[0x00D8] = "RX Pos 14"; Text_Img[0x00D8] = "Pilot View: RX Label Back, Pins Right" - Text[0x00D9] = "RX Pos 15"; Text_Img[0x00D9] = "Pilot View: RX Label Down, Pins Right" - Text[0x00DA] = "RX Pos 16"; Text_Img[0x00DA] = "Pilot View: RX Label Front, Pins Right" - Text[0x00DB] = "RX Pos 17"; Text_Img[0x00DB] = "Pilot View: RX Label Back, Pins Down" - Text[0x00DC] = "RX Pos 18"; Text_Img[0x00DC] = "Pilot View: RX Label Left, Pins Down" - Text[0x00DD] = "RX Pos 19"; Text_Img[0x00DD] = "Pilot View: RX Label Front, Pins Down" - Text[0x00DE] = "RX Pos 20"; Text_Img[0x00DE] = "Pilot View: RX Label Right, Pins Down" - Text[0x00DF] = "RX Pos 21"; Text_Img[0x00DF] = "Pilot View: RX Label Back, Pins Up" - Text[0x00E0] = "RX Pos 22"; Text_Img[0x00E0] = "Pilot View: RX Label Left, Pins Up" - Text[0x00E1] = "RX Pos 23"; Text_Img[0x00E1] = "Pilot View: RX Label Front, Pins Up" - Text[0x00E2] = "RX Pos 24"; Text_Img[0x00E2] = "Pilot View: RX Label Right, Pins Up" - Text[0x00E3] = "RX Pos Invalid"; -- Just Guesing, check on real RX + -- Optionally attach an Image to display + List_Text[0x00CB] = "RX Pos 1"; List_Text_Img[0x00CB] = "rx_pos_1.png|Pilot View: RX Label Up, Pins Back" + List_Text[0x00CC] = "RX Pos 2"; List_Text_Img[0x00CC] = "rx_pos_2.png|Pilot View: RX Label Left, Pins Back" + List_Text[0x00CD] = "RX Pos 3"; List_Text_Img[0x00CD] = "rx_pos_3.png|Pilot View: RX Label Down, Pins Back" + List_Text[0x00CE] = "RX Pos 4"; List_Text_Img[0x00CE] = "rx_pos_4.png|Pilot View: RX Label Right, Pins Back" + List_Text[0x00CF] = "RX Pos 5"; List_Text_Img[0x00CF] = "rx_pos_5.png|Pilot View: RX Label UP, Pins to Front" + List_Text[0x00D0] = "RX Pos 6"; List_Text_Img[0x00D0] = "rx_pos_6.png|Pilot View: RX Label Left, Pins Front" + List_Text[0x00D1] = "RX Pos 7"; List_Text_Img[0x00D1] = "rx_pos_7.png|Pilot View: RX Label Down, Pins Front" + List_Text[0x00D2] = "RX Pos 8"; List_Text_Img[0x00D2] = "rx_pos_8.png|Pilot View: RX Label Right, Pins Front" + List_Text[0x00D3] = "RX Pos 9"; List_Text_Img[0x00D3] = "rx_pos_9.png|Pilot View: RX Label Up, Pins Left" + List_Text[0x00D4] = "RX Pos 10"; List_Text_Img[0x00D4] = "rx_pos_10.png|Pilot View: RX Label Back, Pins Left" + List_Text[0x00D5] = "RX Pos 11"; List_Text_Img[0x00D5] = "rx_pos_11.png|Pilot View: RX Label Down, Pins Left" + List_Text[0x00D6] = "RX Pos 12"; List_Text_Img[0x00D6] = "rx_pos_12.png|Pilot View: RX Label Front, Pins Left" + List_Text[0x00D7] = "RX Pos 13"; List_Text_Img[0x00D7] = "rx_pos_13.png|Pilot View: RX Label Up, Pins Right" + List_Text[0x00D8] = "RX Pos 14"; List_Text_Img[0x00D8] = "rx_pos_14.png|Pilot View: RX Label Back, Pins Right" + List_Text[0x00D9] = "RX Pos 15"; List_Text_Img[0x00D9] = "rx_pos_15.png|Pilot View: RX Label Down, Pins Right" + List_Text[0x00DA] = "RX Pos 16"; List_Text_Img[0x00DA] = "rx_pos_16.png|Pilot View: RX Label Front, Pins Right" + List_Text[0x00DB] = "RX Pos 17"; List_Text_Img[0x00DB] = "rx_pos_17.png|Pilot View: RX Label Back, Pins Down" + List_Text[0x00DC] = "RX Pos 18"; List_Text_Img[0x00DC] = "rx_pos_18.png|Pilot View: RX Label Left, Pins Down" + List_Text[0x00DD] = "RX Pos 19"; List_Text_Img[0x00DD] = "rx_pos_19.png|Pilot View: RX Label Front, Pins Down" + List_Text[0x00DE] = "RX Pos 20"; List_Text_Img[0x00DE] = "rx_pos_20.png|Pilot View: RX Label Right, Pins Down" + List_Text[0x00DF] = "RX Pos 21"; List_Text_Img[0x00DF] = "rx_pos_21.png|Pilot View: RX Label Back, Pins Up" + List_Text[0x00E0] = "RX Pos 22"; List_Text_Img[0x00E0] = "rx_pos_22.png|Pilot View: RX Label Left, Pins Up" + List_Text[0x00E1] = "RX Pos 23"; List_Text_Img[0x00E1] = "rx_pos_23.png|Pilot View: RX Label Front, Pins Up" + List_Text[0x00E2] = "RX Pos 24"; List_Text_Img[0x00E2] = "rx_pos_24.png|Pilot View: RX Label Right, Pins Up" + List_Text[0x00E3] = "RX Pos Invalid"; List_Text_Img[0x00E3] = "rx_pos_25.png|Cannot detect orientation of RX" - -- But for FC6250HX, Override this previous values - if (rxId == RX.FC6250HX) then - Text[0x00D2] = "Panic Channel" - Text[0x00D3] = "Swashplate" - Text[0x00D5] = "Agility" - Text[0x00D8] = "Stop" - Text[0x00DA] = "SAFE" - Text[0x00DB] = "Stability" - Text[0x00DC] = "@ per sec" - Text[0x00DD] = "Tail rotor" - Text[0x00DE] = "Setup" - Text[0x00DF] = "AFR" - Text[0x00E0] = "Collective" - Text[0x00E1] = "Subtrim" - Text[0x00E2] = "Phasing" - Text[0x00E4] = "E-Ring" - end + Text[0x00D1] = "?? Unknown_D1" -- TODO: Find the Spektrum Value (Orientation Save&Reset final page AR631) + --FC6250HX + Text[0x00D2] = "Panic Channel" + if (rxId ~= RX.FC6250HX) then List_Values[0x00D2]=channelValues end --FC6250HX uses other range + Text[0x00D3] = "Swashplate" + Text[0x00D5] = "Agility" + Text[0x00D8] = "Stop" + Text[0x00DA] = "SAFE" + Text[0x00DB] = "Stability" + Text[0x00DC] = "@ per sec" + Text[0x00DD] = "Tail rotor" + Text[0x00DE] = "Setup" + Text[0x00DF] = "AFR" + Text[0x00E0] = "Collective" + Text[0x00E1] = "Subtrim" + Text[0x00E2] = "Phasing" + Text[0x00E4] = "E-Ring" + Text[0x00E7] = "Left" Text[0x00E8] = "Right" - Text[0x00F2] = "Fixed" - Text[0x00F3] = "Adjustable" + List_Text[0x00F2] = "Fixed" + List_Text[0x00F3] = "Adjustable" Text[0x00F9] = "Gyro settings" Text[0x00FE] = "Stick Priority/c/b " --SubTitle @@ -1248,27 +1294,27 @@ local function DSM_Init_Text(rxId) Text[0x0190] = "Relearn Servo Settings" Text[0x019C] = "Enter Receiver Bind Mode" Text[0x01D7] = "SAFE Select Channel" - Text[0x01DC] = "AS3X" + Text[0x01DC] = "AS3X/c/b" -- Subtitle, Center+bold Text[0x01DD] = "AS3X Settings" Text[0x01DE] = "AS3X Gains" - Text[0x01E0] = "Rate Gains/c/b" -- SubTitle + Text[0x01E0] = "Rate Gains/c/b" -- SubTitle, Center+bold Text[0x01E2] = "SAFE Settings" Text[0x01E3] = "SAFE Gains" - Text[0x01E6] = "Attitude Trim" + Text[0x01E6] = "Attitude Trim/c/b" -- SubTitle, Center+bold Text[0x01E7] = "Envelope" Text[0x01E9] = "Roll Right" Text[0x01EA] = "Roll Left" Text[0x01EB] = "Pitch Down" Text[0x01EC] = "Pitch Up" Text[0x01EE] = "Throttle to Pitch" - Text[0x01EF] = "Low Thr to Pitch" - Text[0x01F0] = "High Thr to Pitch" + Text[0x01EF] = "Low Thr to Pitch/c/b" -- SubTitle, Center+bold + Text[0x01F0] = "High Thr to Pitch/c/b" -- SubTitle, Center+bold Text[0x01F3] = "Threshold" Text[0x01F4] = "Angle" - Text[0x01F6] = "Failsafe Angles" + Text[0x01F6] = "Failsafe Angles/c/b" -- SubTitle, Center+bold --Inh, Self-Level/Angle Dem, Envelope -- (L_M1 was wide open) - Text[0x01F8] = "Safe Mode"; Menu_List_Values[0x01F8]=safeModeOptions + Text[0x01F8] = "Safe Mode"; List_Values[0x01F8]=safeModeOptions Text[0x01F9] = "SAFE Select/c/b " -- SubTitle Text[0x01FC] = "Panic Flight Mode" @@ -1278,13 +1324,13 @@ local function DSM_Init_Text(rxId) Text[0x020A] = "Restore from Backup" Text[0x020D] = "First Time SAFE Setup" - -- TODO: First time safe setup Page 3 : - --Text[0x020E] = "" - --Text[0x020F] = "" - --Text[0x0210] = "" - --Text[0x0211] = "" - --Text[0x0212] = "" - --Text[0x0213] = "" + -- First time safe setup Page 3 : + Text[0x020E] = "AS3X gains must be tuned" + Text[0x020F] = "and active in SAFE Flight Modes" + Text[0x0210] = "to help reduce wobble." + Text[0x0211] = "" -- empty + Text[0x0212] = "" -- empty + Text[0x0213] = "" -- empty Text[0x021A] = "Set the model level," Text[0x021B] = "and press Continue." @@ -1325,6 +1371,8 @@ local function DSM_Init_Text(rxId) Text[0x023A] = "" -- blank line Text[0x023D] = "Copy Flight Mode Settings" + Text[0x023E] = "Source Flight Mode" + Text[0x023F] = "Target Flight Mode" Text[0x0240] = "Utilities" Text[0x024C] = "Gains will be captured on" @@ -1336,17 +1384,28 @@ local function DSM_Init_Text(rxId) Text[0x0254] = "Postive = Up, Negative = Down" - -- TODO: First time safe setup Page 1 (maybe ask to select Flight Mode cannel) - --Text[0x0255] = "" - --Text[0x0256] = "" - --Text[0x0257] = "" + --Utilities, Copy flight mode (Copy Confirmation, oveerriding FM) TODO:Check with real Spektrum radio. + Text[0x0251] = "WARNING: \"Target\" IN USE" + Text[0x0252] = "flight mode will be overwritten" + Text[0x0253] = "by \"Source\"" - --TODO: First time safe setup Page 2 (something related for flight mode) - --Text[0x025A] = "" - --Text[0x025B] = "" - --Text[0x025C] = "" - --Text[0x025D] = "" - --Text[0x025E] = "" + -- First time safe setup Page 1 (maybe ask to select Flight Mode cannel) + Text[0x0255] = "Before setting up SAFE" + Text[0x0256] = "a Flight Mode channel" + Text[0x0257] = "most be configured." + + --First time safe setup Page 2 (something related for flight mode) + Text[0x025A] = "Select the desired flight mode" + Text[0x025B] = "switch position to adjust settings" + Text[0x025C] = "for each flight mode" + Text[0x025D] = "" -- Blank + Text[0x025E] = "" -- Blank + + --Utilities, Copy flight mode + Text[0x0259] = "Copy" --- TODO: Check Specktrum..Just guessing here.. + Text[0x0260] = "WARNING: \"Target\"" + Text[0x0261] = "flight mode will be overwritten" + Text[0x0262] = "by \"Source\"" Text[0x0263] = "Fixed/Adjustable Gains /c/b" Text[0x0266] = "Heading Gain/c/b" @@ -1355,8 +1414,8 @@ local function DSM_Init_Text(rxId) Text[0x0269] = "SAFE - Throttle to Pitch" Text[0x026A] = "Use CAUTION for Yaw gain!/b" -- SubTitle - Text[0x8000] = "FLIGHT MODE/c/b" --FC6250HX - Text[0x8001] = "Flight Mode/c/b" -- WAS "Flight Mode 1" Center and Bold + Text[0x8000] = "Flight Mode/c/b" --FC6250HX: 1=NORMAL 2= Stunt-1, 3=Stunt-2, 4=Hold + Text[0x8001] = "Flight Mode/c/b" -- WAS "Flight Mode 1".. This usually is a Flight Mode w value relative to 0 (AR631/AR637) Text[0x8002] = "Flight Mode 2/c/b" Text[0x8003] = "Flight Mode 3/c/b" end @@ -1366,6 +1425,29 @@ local function isFlightModeText(textId) return (textId >= 0x8000 and textId <= 0x8003) end +-- Adjust the displayed value for Flight mode as needed +local function GetFlightModeValue(textId, header, value) + local out = value + + if (DSM_Context.RX.Id == RX.FC6250HX) then + -- Helicopter Flights modes + if (value==1) then out = header .. " Normal" + elseif (value==2) then out = header .. " Stunt 1" + elseif (value==3) then out = header .. " Stunt 2" + elseif (value==4) then out = header .. " Hold" + else + out = header .. " " .. value + end + elseif (DSM_Context.RX.Id == RX.AR631 or DSM_Context.RX.Id == RX.AR637T or DSM_Context.RX.Id == RX.AR637TA) then + -- Seems that we really have to add +1 to the value, so Flight Mode 0 is Really Flight Mode 1 + out = header .. " " .. (value + 1) + else + -- Default, return the value as we Have it + out = header .. " " .. value + end + return out +end + ------------------------------------------------------------------------------------------------------------ -- Lib EXPORTS @@ -1388,7 +1470,8 @@ Lib.LOG_write = LOG_write Lib.LOG_close = LOG_close Lib.getElapsedTime = getElapsedTime Lib.Get_Text = Get_Text -Lib.Get_Text_Img = Get_Text_Img +Lib.Get_List_Text = Get_List_Text +Lib.Get_List_Text_Img = Get_List_Text_Img Lib.phase2String = phase2String Lib.lineValue2String = lineValue2String @@ -1403,6 +1486,7 @@ Lib.isPercentValueLineByMinMax = isPercentValueLineByMinMax Lib.isNumberValueLine = isNumberValueLine Lib.isDisplayAttr = isDisplayAttr Lib.isFlightModeText = isFlightModeText +Lib.GetFlightModeValue = GetFlightModeValue Lib.StartConnection = DSM_StartConnection Lib.ReleaseConnection = DSM_ReleaseConnection diff --git a/Lua_scripts/DSMLIB/DsmFwPrgSIMLib.lua b/Lua_scripts/DSMLIB/DsmFwPrgSIMLib.lua index c96cbb1..adb465c 100644 --- a/Lua_scripts/DSMLIB/DsmFwPrgSIMLib.lua +++ b/Lua_scripts/DSMLIB/DsmFwPrgSIMLib.lua @@ -67,6 +67,8 @@ local function PostProcessMenu() 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 @@ -84,8 +86,8 @@ local function AR631_loadMenu(menuId) --L[#1 T=M VId=0x105E Text="Other settings" MId=0x1000 ] ctx.Menu = { MenuId = 0x1000, TextId = 0x004B, PrevId = 0, NextId = 0, BackId = 0 } - ctx.MenuLines[0] = { MenuId = 0x1000, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x00F9, ValId = 0x1010 } - ctx.MenuLines[1] = { MenuId = 0x1000, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x0227, ValId = 0x105E } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x00F9, ValId = 0x1010 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x0227, ValId = 0x105E } ctx.SelLine = 0 lastGoodMenu = menuId elseif (menuId==0x1010) then @@ -93,6 +95,7 @@ local function AR631_loadMenu(menuId) -- NEW -- L[#5 T=M VId=0x104F val=nil [0->0,3] Text="First Time Setup" MId=0x1010 ] -- NEW ONLY + -- L[#6 T=M VId=0x1055 Text="First Time SAFE Setup"[0x20D] MId=0x1010 ] -- Initialize AR637T -- L[#0 T=M VId=0x1011 Text="AS3X Settings"[0x1DD] MId=0x1010 ] @@ -103,13 +106,14 @@ local function AR631_loadMenu(menuId) ctx.Menu = { MenuId = 0x1010, TextId = 0x00F9, PrevId = 0, NextId = 0, BackId = 0x1000 } if not RX_Initialized then - ctx.MenuLines[5] = { MenuId = 0x1010, lineNum = 5, Type = LINE_TYPE.MENU, TextId = 0x00A5, ValId = 0x104F} + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x00A5, ValId = 0x104F} + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x020D, ValId = 0x1055} ctx.SelLine = 5 else - ctx.MenuLines[0] = { MenuId = 0x1010, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x1DD, ValId = 0x1011 } - ctx.MenuLines[1] = { MenuId = 0x1010, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x1E2, ValId = 0x1019 } - ctx.MenuLines[2] = { MenuId = 0x1010, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x87, ValId = 0x1021 } - ctx.MenuLines[3] = { MenuId = 0x1010, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x86, ValId = 0x1022 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x01DD, ValId = 0x1011 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x01E2, ValId = 0x1019 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x0087, ValId = 0x1021 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x0086, ValId = 0x1022 } ctx.SelLine = 0 end lastGoodMenu = menuId @@ -124,12 +128,12 @@ local function AR631_loadMenu(menuId) -- L[#6 T=M VId=0x1017 Text="Capture Gyro Gains"[0xAA] MId=0x1011 ] ctx.Menu = { MenuId = 0x1011, TextId = 0x1DD, PrevId = 0, NextId = 0, BackId = 0x1010 } - ctx.MenuLines[0] = { MenuId = 0x1011, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x1DE, ValId = 0x1012} - ctx.MenuLines[1] = { MenuId = 0x1011, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x46, ValId = 0x1013} - ctx.MenuLines[2] = { MenuId = 0x1011, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x82, ValId = 0x1015} - ctx.MenuLines[4] = { MenuId = 0x1011, lineNum = 4, Type = LINE_TYPE.LIST_MENU1, TextId = 0x8A, ValId = 0x1004, Min=0, Max=244, Def=50, Val=50 } - ctx.MenuLines[5] = { MenuId = 0x1011, lineNum = 5, Type = LINE_TYPE.MENU, TextId = 0x263, ValId = 0x1016} - ctx.MenuLines[6] = { MenuId = 0x1011, lineNum = 6, Type = LINE_TYPE.MENU, TextId = 0xAA, ValId = 0x1017 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x1DE, ValId = 0x1012} + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x46, ValId = 0x1013} + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x82, ValId = 0x1015} + ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x8A, ValId = 0x1004, Min=0, Max=244, Def=50, Val=50 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x263, ValId = 0x1016} + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0xAA, ValId = 0x1017 } ctx.SelLine = 0 lastGoodMenu = menuId elseif (menuId==0x1012) then @@ -141,11 +145,11 @@ local function AR631_loadMenu(menuId) --L[#5 T=V_NC VId=0x1006 Text="Yaw"[0x42] val=48 [0->100,60] MId=0x1012 ] ctx.Menu = { MenuId = 0x1012, TextId = 0x1DE, PrevId = 0, NextId = 0, BackId = 0x1011 } - ctx.MenuLines[0] = { MenuId = 0x1012, lineNum = 0, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[2] = { MenuId = 0x1012, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x1E0, ValId = 0x1012 } - ctx.MenuLines[3] = { MenuId = 0x1012, lineNum = 3, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x40, ValId = 0x1004, Min=0, Max=100, Def=40, Val=40 } - ctx.MenuLines[4] = { MenuId = 0x1012, lineNum = 4, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x41, ValId = 0x1005, Min=0, Max=100, Def=50, Val=50 } - ctx.MenuLines[5] = { MenuId = 0x1012, lineNum = 5, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x42, ValId = 0x1006, Min=0, Max=100, Def=60, Val=60 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x1E0, ValId = 0x1012 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x40, ValId = 0x1004, Min=0, Max=100, Def=40, Val=40 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x41, ValId = 0x1005, Min=0, Max=100, Def=50, Val=50 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x42, ValId = 0x1006, Min=0, Max=100, Def=60, Val=60 } ctx.SelLine = 3 lastGoodMenu = menuId @@ -158,11 +162,11 @@ local function AR631_loadMenu(menuId) --L[#5 T=V_NC VId=0x1006 Text="Yaw"[0x42] val=48 [0->160,160] MId=0x1012 ] ctx.Menu = { MenuId = 0x1013, TextId = 0x46, PrevId = 0, NextId = 0, BackId = 0x1011 } - ctx.MenuLines[0] = { MenuId = 0x1013, lineNum = 0, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[2] = { MenuId = 0x1013, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0xFE, ValId = 0x1013 } - ctx.MenuLines[3] = { MenuId = 0x1013, lineNum = 3, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x40, ValId = 0x1004, Min=0, Max=160, Def=100, Val=160 } - ctx.MenuLines[4] = { MenuId = 0x1013, lineNum = 4, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x41, ValId = 0x1005, Min=0, Max=160, Def=100, Val=160 } - ctx.MenuLines[5] = { MenuId = 0x1013, lineNum = 5, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x42, ValId = 0x1006, Min=0, Max=160, Def=100, Val=160 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0xFE, ValId = 0x1013 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x40, ValId = 0x1004, Min=0, Max=160, Def=100, Val=160 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x41, ValId = 0x1005, Min=0, Max=160, Def=100, Val=160 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x42, ValId = 0x1006, Min=0, Max=160, Def=100, Val=160 } ctx.SelLine = 3 lastGoodMenu = menuId @@ -176,12 +180,12 @@ local function AR631_loadMenu(menuId) -- L[#6 T=V_NC VId=0x1006 Text="Yaw"[0x42] val=0 [0->100,0] MId=0x1015 ] ctx.Menu = { MenuId = 0x1015, TextId = 0x266, PrevId = 0, NextId = 0, BackId = 0x1011 } - ctx.MenuLines[0] = { MenuId = 0x1015, lineNum = 0, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[1] = { MenuId = 0x1015, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x1F9, ValId = 0x1015 } - ctx.MenuLines[2] = { MenuId = 0x1015, lineNum = 2, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x40, ValId = 0x1004, Min=0, Max=100, Def=0, Val=0 } - ctx.MenuLines[3] = { MenuId = 0x1015, lineNum = 3, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x41, ValId = 0x1005, Min=0, Max=100, Def=0, Val=0 } - ctx.MenuLines[5] = { MenuId = 0x1015, lineNum = 5, Type = LINE_TYPE.MENU, TextId = 0x26A, ValId = 0x1015 } - ctx.MenuLines[6] = { MenuId = 0x1015, lineNum = 6, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x42, ValId = 0x1006, Min=0, Max=100, Def=0, Val=0 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x1F9, ValId = 0x1015 } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x40, ValId = 0x1004, Min=0, Max=100, Def=0, Val=0 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x41, ValId = 0x1005, Min=0, Max=100, Def=0, Val=0 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x26A, ValId = 0x1015 } + ctx.MenuLines[6] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x42, ValId = 0x1006, Min=0, Max=100, Def=0, Val=0 } ctx.SelLine = 0 lastGoodMenu = menuId elseif (menuId==0x1016) then @@ -193,11 +197,11 @@ local function AR631_loadMenu(menuId) -- L[#4 T=L_m0 VId=0x1004 Text="Yaw"[0x42] MId=0x1016 val=1 NL=(0->1,1,S=242) [242->243,243] ] ctx.Menu = { MenuId = 0x1016, TextId = 0x263, PrevId = 0, NextId = 0, BackId = 0x1011 } - ctx.MenuLines[0] = { MenuId = 0x1016, lineNum = 0, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[1] = { MenuId = 0x1016, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x1F9, ValId = 0x1016 } - ctx.MenuLines[2] = { MenuId = 0x1016, lineNum = 2, Type = LINE_TYPE.LIST_MENU0, TextId = 0x40, ValId = 0x1002, Min=242, Max=243, Def=243, Val=1 } - ctx.MenuLines[3] = { MenuId = 0x1016, lineNum = 3, Type = LINE_TYPE.LIST_MENU0, TextId = 0x41, ValId = 0x1003, Min=242, Max=243, Def=243, Val=1 } - ctx.MenuLines[4] = { MenuId = 0x1016, lineNum = 4, Type = LINE_TYPE.LIST_MENU0, TextId = 0x42, ValId = 0x1004, Min=242, Max=243, Def=243, Val=1 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x1F9, ValId = 0x1016 } + ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x40, ValId = 0x1002, Min=242, Max=243, Def=243, Val=1 } + ctx.MenuLines[3] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x41, ValId = 0x1003, Min=242, Max=243, Def=243, Val=1 } + ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x42, ValId = 0x1004, Min=242, Max=243, Def=243, Val=1 } ctx.SelLine = 0 lastGoodMenu = menuId elseif (menuId==0x1017) then @@ -211,13 +215,13 @@ local function AR631_loadMenu(menuId) --L[#6 T=M VId=0x1018 Text="Capture Gyro Gains"[0xAA] MId=0x1017 ] ctx.Menu = { MenuId = 0x1017, TextId = 0xAA, PrevId = 0, NextId = 0, BackId = 0x1011 } - ctx.MenuLines[0] = { MenuId = 0x1017, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x24C, ValId = 0x1017 } - ctx.MenuLines[1] = { MenuId = 0x1017, lineNum = 1, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[2] = { MenuId = 0x1017, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x24D, ValId = 0x1017 } - ctx.MenuLines[3] = { MenuId = 0x1017, lineNum = 3, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x40, ValId = 0x1004, Min=0, Max=0, Def=0, Val=40 } - ctx.MenuLines[4] = { MenuId = 0x1017, lineNum = 4, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x41, ValId = 0x1005, Min=0, Max=0, Def=0, Val=50 } - ctx.MenuLines[5] = { MenuId = 0x1017, lineNum = 5, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x42, ValId = 0x1006, Min=0, Max=0, Def=0, Val=60 } - ctx.MenuLines[6] = { MenuId = 0x1017, lineNum = 6, Type = LINE_TYPE.MENU, TextId = 0xAA, ValId = 0x1018 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x24C, ValId = 0x1017 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x24D, ValId = 0x1017 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x40, ValId = 0x1004, Min=0, Max=0, Def=0, Val=40 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x41, ValId = 0x1005, Min=0, Max=0, Def=0, Val=50 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x42, ValId = 0x1006, Min=0, Max=0, Def=0, Val=60 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0xAA, ValId = 0x1018 } ctx.SelLine = 6 lastGoodMenu = menuId @@ -232,13 +236,13 @@ local function AR631_loadMenu(menuId) --L[#6 T=V_i8 VId=0x1006 Text="Yaw"[0x42] Val=60 [0->0,0] MId=0x1018 ] ctx.Menu = { MenuId = 0x1018, TextId = 0xAA, PrevId = 0, NextId = 0, BackId = 0x1011 } - ctx.MenuLines[0] = { MenuId = 0x1018, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x24E, ValId = 0x1018 } - ctx.MenuLines[1] = { MenuId = 0x1018, lineNum = 1, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[2] = { MenuId = 0x1018, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x24F, ValId = 0x1018 } - ctx.MenuLines[3] = { MenuId = 0x1018, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x250, ValId = 0x1018 } - ctx.MenuLines[4] = { MenuId = 0x1018, lineNum = 4, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x40, ValId = 0x1004, Min=0, Max=0, Def=0, Val=40 } - ctx.MenuLines[5] = { MenuId = 0x1018, lineNum = 5, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x41, ValId = 0x1005, Min=0, Max=0, Def=0, Val=50 } - ctx.MenuLines[6] = { MenuId = 0x1018, lineNum = 6, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x42, ValId = 0x1006, Min=0, Max=0, Def=0, Val=60 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x24E, ValId = 0x1018 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x24F, ValId = 0x1018 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x250, ValId = 0x1018 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x40, ValId = 0x1004, Min=0, Max=0, Def=0, Val=40 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x41, ValId = 0x1005, Min=0, Max=0, Def=0, Val=50 } + ctx.MenuLines[6] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x42, ValId = 0x1006, Min=0, Max=0, Def=0, Val=60 } ctx.SelLine = -1 lastGoodMenu = menuId @@ -250,10 +254,10 @@ local function AR631_loadMenu(menuId) --L[#6 T=M VId=0x101F Text="Capture Gyro Gains"[0xAA] MId=0x1019 ] ctx.Menu = { MenuId = 0x1019, TextId = 0x1E2, PrevId = 0, NextId = 0, BackId = 0x1010 } - ctx.MenuLines[0] = { MenuId = 0x1019, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x1E3, ValId = 0x101A } - ctx.MenuLines[1] = { MenuId = 0x1019, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x226, ValId = 0x101B } - ctx.MenuLines[5] = { MenuId = 0x1019, lineNum = 5, Type = LINE_TYPE.MENU, TextId = 0x263, ValId = 0x101E } - ctx.MenuLines[6] = { MenuId = 0x1019, lineNum = 6, Type = LINE_TYPE.MENU, TextId = 0xAA, ValId = 0x101F } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x1E3, ValId = 0x101A } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x226, ValId = 0x101B } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x263, ValId = 0x101E } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0xAA, ValId = 0x101F } ctx.SelLine = 0 lastGoodMenu = menuId elseif (menuId==0x101A) then @@ -264,10 +268,10 @@ local function AR631_loadMenu(menuId) --L[#3 T=V_NC VId=0x1003 Text="Pitch"[0x41] Val=35 [5->100,35] MId=0x101A ] ctx.Menu = { MenuId = 0x101A, TextId = 0x1E3, PrevId = 0, NextId = 0, BackId = 0x1019 } - ctx.MenuLines[0] = { MenuId = 0x101A, lineNum = 0, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[1] = { MenuId = 0x101A, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x43, ValId = 0x101A } - ctx.MenuLines[2] = { MenuId = 0x101A, lineNum = 2, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x40, ValId = 0x1002, Min=5, Max=100, Def=35, Val=35 } - ctx.MenuLines[3] = { MenuId = 0x101A, lineNum = 3, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x41, ValId = 0x1003, Min=5, Max=100, Def=60, Val=35 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x43, ValId = 0x101A } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x40, ValId = 0x1002, Min=5, Max=100, Def=35, Val=35 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x41, ValId = 0x1003, Min=5, Max=100, Def=60, Val=35 } ctx.SelLine = -1 lastGoodMenu = menuId @@ -281,12 +285,12 @@ local function AR631_loadMenu(menuId) --L[#5 T=V_NC VId=0x1005 Text="Pitch Up"[0x1EC] Val=50 [10->75,50] MId=0x101B ] ctx.Menu = { MenuId = 0x101B, TextId = 0x226, PrevId = 0, NextId = 0, BackId = 0x1019 } - ctx.MenuLines[0] = { MenuId = 0x101B, lineNum = 0, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[1] = { MenuId = 0x101B, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x226, ValId = 0x101B } - ctx.MenuLines[2] = { MenuId = 0x101B, lineNum = 2, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1E9, ValId = 0x1002, Min=10, Max=90, Def=60, Val=60 } - ctx.MenuLines[3] = { MenuId = 0x101B, lineNum = 3, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EA, ValId = 0x1003, Min=10, Max=90, Def=60, Val=60 } - ctx.MenuLines[4] = { MenuId = 0x101B, lineNum = 4, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EB, ValId = 0x1004, Min=10, Max=90, Def=40, Val=40 } - ctx.MenuLines[5] = { MenuId = 0x101B, lineNum = 5, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EC, ValId = 0x1005, Min=10, Max=90, Def=50, Val=50 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x226, ValId = 0x101B } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1E9, ValId = 0x1002, Min=10, Max=90, Def=60, Val=60 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EA, ValId = 0x1003, Min=10, Max=90, Def=60, Val=60 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EB, ValId = 0x1004, Min=10, Max=90, Def=40, Val=40 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EC, ValId = 0x1005, Min=10, Max=90, Def=50, Val=50 } ctx.SelLine = -1 lastGoodMenu = menuId @@ -299,10 +303,10 @@ local function AR631_loadMenu(menuId) --L[#3 T=L_m0 VId=0x1003 Text="Pitch"[0x41] Val=0 N=(0->1,1,S=242) [242->243,243] MId=0x101E ] ctx.Menu = { MenuId = 0x101E, TextId = 0x263, PrevId = 0, NextId = 0, BackId = 0x1019 } - ctx.MenuLines[0] = { MenuId = 0x101E, lineNum = 0, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[1] = { MenuId = 0x101E, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x263, ValId = 0x101E } - ctx.MenuLines[2] = { MenuId = 0x101E, lineNum = 2, Type = LINE_TYPE.LIST_MENU0, TextId = 0x40, ValId = 0x1002, Min=242, Max=243, Def=243, Val=0 } - ctx.MenuLines[3] = { MenuId = 0x101E, lineNum = 3, Type = LINE_TYPE.LIST_MENU0, TextId = 0x41, ValId = 0x1003, Min=242, Max=243, Def=243, Val=0 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x263, ValId = 0x101E } + ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x40, ValId = 0x1002, Min=242, Max=243, Def=243, Val=0 } + ctx.MenuLines[3] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x41, ValId = 0x1003, Min=242, Max=243, Def=243, Val=0 } ctx.SelLine = -1 lastGoodMenu = menuId @@ -316,12 +320,12 @@ local function AR631_loadMenu(menuId) --L[#6 T=M VId=0x1020 Text="Capture Gyro Gains"[0xAA] MId=0x101F ] ctx.Menu = { MenuId = 0x101F, TextId = 0xAA, PrevId = 0, NextId = 0, BackId = 0x1019 } - ctx.MenuLines[0] = { MenuId = 0x101F, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x24C, ValId = 0x101F } - ctx.MenuLines[1] = { MenuId = 0x101F, lineNum = 1, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[2] = { MenuId = 0x101F, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x24D, ValId = 0x101F } - ctx.MenuLines[3] = { MenuId = 0x101F, lineNum = 3, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x40, ValId = 0x1004, Min=0, Max=0, Def=0, Val=35 } - ctx.MenuLines[4] = { MenuId = 0x101F, lineNum = 4, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x41, ValId = 0x1005, Min=0, Max=0, Def=0, Val=35 } - ctx.MenuLines[6] = { MenuId = 0x101F, lineNum = 6, Type = LINE_TYPE.MENU, TextId = 0xAA, ValId = 0x1020 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x24C, ValId = 0x101F } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x24D, ValId = 0x101F } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x40, ValId = 0x1004, Min=0, Max=0, Def=0, Val=35 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x41, ValId = 0x1005, Min=0, Max=0, Def=0, Val=35 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0xAA, ValId = 0x1020 } ctx.SelLine = 6 lastGoodMenu = menuId @@ -335,12 +339,12 @@ local function AR631_loadMenu(menuId) --L[#5 T=V_i8 VId=0x1005 Text="Pitch"[0x41] Val=50 [0->0,0] MId=0x1020 ] ctx.Menu = { MenuId = 0x1020, TextId = 0xAA, PrevId = 0, NextId = 0, BackId = 0x1019 } - ctx.MenuLines[0] = { MenuId = 0x1020, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x24E, ValId = 0x1020 } - ctx.MenuLines[1] = { MenuId = 0x1020, lineNum = 1, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[2] = { MenuId = 0x1020, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x24F, ValId = 0x1020 } - ctx.MenuLines[3] = { MenuId = 0x1020, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x250, ValId = 0x1020 } - ctx.MenuLines[4] = { MenuId = 0x1020, lineNum = 4, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x40, ValId = 0x1004, Min=0, Max=0, Def=0, Val=35 } - ctx.MenuLines[5] = { MenuId = 0x1020, lineNum = 5, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x41, ValId = 0x1005, Min=0, Max=0, Def=0, Val=35 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x24E, ValId = 0x1020 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x24F, ValId = 0x1020 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x250, ValId = 0x1020 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x40, ValId = 0x1004, Min=0, Max=0, Def=0, Val=35 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x41, ValId = 0x1005, Min=0, Max=0, Def=0, Val=35 } ctx.SelLine = -1 lastGoodMenu = menuId @@ -359,31 +363,306 @@ local function AR631_loadMenu(menuId) --L[#6 T=L_m1 VId=0x1006 Text="Low Thr to Pitch"[0x1EF] val=0 NL=(0->1,3,S=3) [3->4,3] MId=0x1021 ] ctx.Menu = { MenuId = 0x1021, TextId = 0x87, PrevId = 0, NextId = 0, BackId = 0x1010 } - ctx.MenuLines[0] = { MenuId = 0x1021, lineNum = 0, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[1] = { MenuId = 0x1021, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x78, ValId = 0x7CA6 } - ctx.MenuLines[2] = { MenuId = 0x1021, lineNum = 2, Type = LINE_TYPE.LIST_MENU1, TextId = 0x1DC, ValId = 0x1002, Min=3, Max=4, Def=3, Val=1 } - ctx.MenuLines[3] = { MenuId = 0x1021, lineNum = 3, Type = LINE_TYPE.LIST_MENU1, TextId = 0x1F8, ValId = 0x1003, Min=0, Max=244, Def=3, Val=176 } - ctx.MenuLines[4] = { MenuId = 0x1021, lineNum = 4, Type = LINE_TYPE.LIST_MENU1, TextId = 0x8B, ValId = 0x1004, Min=3, Max=4, Def=3, Val=0 } - ctx.MenuLines[5] = { MenuId = 0x1021, lineNum = 5, Type = LINE_TYPE.LIST_MENU1, TextId = 0x1F0, ValId = 0x1005, Min=3, Max=4, Def=3, Val=0 } - ctx.MenuLines[6] = { MenuId = 0x1021, lineNum = 6, Type = LINE_TYPE.LIST_MENU1, TextId = 0x1EF, ValId = 0x1006, Min=3, Max=4, Def=3, Val=0 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x78, ValId = 0x7CA6 } + ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x1DC, ValId = 0x1002, Min=3, Max=4, Def=3, Val=1 } + ctx.MenuLines[3] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x1F8, ValId = 0x1003, Min=0, Max=244, Def=3, Val=176 } + ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x8B, ValId = 0x1004, Min=3, Max=4, Def=3, Val=0 } + ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x1F0, ValId = 0x1005, Min=3, Max=4, Def=3, Val=0 } + ctx.MenuLines[6] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x1EF, ValId = 0x1006, Min=3, Max=4, Def=3, Val=0 } ctx.SelLine = 1 lastGoodMenu = menuId elseif (menuId==0x1022) then --M[Id=0x1022 P=0x0 N=0x0 B=0x1010 Text="System Setup"[0x86]] --L[#0 T=M VId=0x1023 Text="Relearn Servo Settings"[0x190] MId=0x1022 ] --L[#1 T=M VId=0x1025 Text="Orientation"[0x80] MId=0x1022 ] - --L[#2 T=M VId=0x1029 [0->0,2] Text="Gain Channel Select"[0xAD] MId=0x1022 ] - --L[#3 T=M VId=0x102A [0->0,2] Text="SAFE/Panic Mode Setup"[0xCA] MId=0x1022 ] - --L[#4 T=M VId=0x1032 [0->0,2] Text="Utilities"[0x240] MId=0x1022 ] + --L[#2 T=M VId=0x1029 Text="Gain Channel Select"[0xAD] MId=0x1022 ] + --L[#3 T=M VId=0x102A Text="SAFE/Panic Mode Setup"[0xCA] MId=0x1022 ] + --L[#4 T=M VId=0x1032 Text="Utilities"[0x240] MId=0x1022 ] ctx.Menu = { MenuId = 0x1022, TextId = 0x86, PrevId = 0, NextId = 0, BackId = 0x1010 } - ctx.MenuLines[0] = { MenuId = 0x1022, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x190, ValId = 0x1023 } - ctx.MenuLines[1] = { MenuId = 0x1022, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x80, ValId = 0x1025 } - ctx.MenuLines[2] = { MenuId = 0x1022, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0xAD, ValId = 0x1029 } - ctx.MenuLines[3] = { MenuId = 0x1022, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0xCA, ValId = 0x102A } - ctx.MenuLines[4] = { MenuId = 0x1022, lineNum = 4, Type = LINE_TYPE.MENU, TextId = 0x240, ValId = 0x1032 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x190, ValId = 0x1023 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x80, ValId = 0x1025 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0xAD, ValId = 0x1029 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0xCA, ValId = 0x102A } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x240, ValId = 0x1032 } ctx.SelLine = 0 lastGoodMenu = menuId + elseif (menuId==0x1023) then + --M[Id=0x1023 P=0x0 N=0x0 B=0x1022 Text="Relearn Servo Settings"[0x190]] + --L[#3 T=M VId=0x1024 Text="Apply"[0x90] MId=0x1023 ] + + ctx.Menu = { MenuId = 0x1023, TextId = 0x190, PrevId = 0, NextId = 0, BackId = 0x1022 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x1024 } + + ctx.SelLine = 3 + lastGoodMenu = menuId + elseif (menuId==0x1024) then + --M[Id=0x1024 P=0x0 N=0x0 B=0x0 Text="Relearn Servo Settings"[0x190]] + --L[#3 T=M VId=0x1000 Text="Complete"[0x93] MId=0x1024 ] + + ctx.Menu = { MenuId = 0x1024, TextId = 0x190, PrevId = 0, NextId = 0, BackId = 0 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x93, ValId = 0x1000 } + + ctx.SelLine = 3 + lastGoodMenu = menuId + + elseif (menuId==0x1025) then + --M[Id=0x1025 P=0x0 N=0x0 B=0x1022 Text="Orientation"[0x80]] + --L[#0 T=M VId=0x1025 Text="Set the model level,"[0x21A] MId=0x1025 ] + --L[#1 T=M VId=0x1025 Text="and press Continue."[0x21B] MId=0x1025 ] + --L[#2 T=M VId=0x1025 Text=""[0x21C] MId=0x1025 ] + --L[#3 T=M VId=0x1025 Text=""[0x21D] MId=0x1025 ] + --L[#5 T=M VId=0x1026 Text="Continue"[0x224] MId=0x1025 ] + --LL[#6 T=M VId=0x1027 Text="Set Orientation Manually"[0x229] MId=0x1025 ] + + ctx.Menu = { MenuId = 0x1025, TextId = 0x80, PrevId = 0, NextId = 0, BackId = 0x1022 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x21A, ValId = 0x1025 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x21B, ValId = 0x1025 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x21C, ValId = 0x1025 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x21D, ValId = 0x1025 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x224, ValId = 0x1026 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x229, ValId = 0x1027 } + ctx.SelLine = 5 + lastGoodMenu = menuId + elseif (menuId==0x1026) then + --M[Id=0x1026 P=0x1025 N=0x0 B=0x1025 Text="Orientation"[0x80]] + --L[#0 T=M VId=0x1026 Text="Set the model on its nose,"[0x21F] MId=0x1026 ] + --L[#1 T=M VId=0x1026 Text="and press Continue. If the"[0x220] MId=0x1026 ] + --L[#2 T=M VId=0x1026 Text="orientation on the next"[0x221] MId=0x1026 ] + --L[#3 T=M VId=0x1026 Text="screen is wrong go back"[0x222] MId=0x1026 ] + --L[#4 T=M VId=0x1026 Text="and try again."[0x223] MId=0x1026 ] + --L[#6 T=M VId=0x1027 Text="Continue"[0x224] MId=0x1026 ] + + ctx.Menu = { MenuId = 0x1026, TextId = 0x80, PrevId = 0x1025, NextId = 0, BackId = 0x1025 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x21F, ValId = 0x1026 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x220, ValId = 0x1026 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x221, ValId = 0x1026 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x222, ValId = 0x1026 } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x223, ValId = 0x1026 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x224, ValId = 0x1027 } + + ctx.SelLine = 6 + lastGoodMenu = menuId + elseif (menuId==0x1027) then + --M[Id=0x1028 P=0x0 N=0x0 B=0x1028 Text="Orientation"[0x80]] + --L[#5 T=L_m0 VId=0x1000 Text="Orientation"[0x80] Val=4|"RX Pos 5" NL=(0->23,0,S=203) [203->226,203] MId=0x1027 ] + --L[#6 T=M VId=0x1028 Text="Continue"[0x224] MId=0x1027 ] + + ctx.Menu = { MenuId = 0x1027, TextId = 0x80, PrevId = 0x1025, NextId = 0, BackId = 0x1025 } + ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x80, ValId = 0x1000, Min=203, Max=226, Def=203, Val=5 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x224, ValId = 0x1028 } + ctx.SelLine = 5 + lastGoodMenu = menuId + elseif (menuId==0x1028) then + --M[Id=0x1027 P=0x1025 N=0x0 B=0x1025 Text="Orientation"[0x80]] + --L[#2 T=M VId=0x1 Text="Resetting RX... "[0x9F] MId=0x1028 ] + --L[#3 T=M VId=0x1028 Text="RX Pos 7"[0xD1] MId=0x1028 ] + + ctx.Menu = { MenuId = 0x1028, TextId = 0x80, PrevId = 0x1025, NextId = 0, BackId = 0x1025 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x9F, ValId = 0x1 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0xD1, ValId = 0x1028 } + ctx.SelLine = 2 + lastGoodMenu = menuId + + elseif (menuId==0x1029) then + --M[Id=0x1029 P=0x0 N=0x0 B=0x1022 Text="Gain Channel Select"[0xAD]] + --L[#0 T=M VId=0x1029 Text="AS3X"[0x1DC] MId=0x1029 ] + --L[#1 T=L_m1 VId=0x1000 Text="Roll"[0x40] Val=0|"Inhibit?" NL=(0->32,0,S=53) [53->85,53] MId=0x1029 ] + --L[#2 T=L_m1 VId=0x1001 Text="Pitch"[0x41] Val=0|"Inhibit?" NL=(0->32,0,S=53) [53->85,53] MId=0x1029 ] + --L[#3 T=L_m1 VId=0x1002 Text="Yaw"[0x42] Val=0|"Inhibit?" NL=(0->32,0,S=53) [53->85,53] MId=0x1029 ] + --L[#4 T=M VId=0x1029 Text="SAFE"[0xDA] MId=0x1029 ] + --L[#5 T=L_m1 VId=0x1004 Text="Roll"[0x40] Val=0|"Inhibit?" NL=(0->32,0,S=53) [53->85,53] MId=0x1029 ] + --L[#6 T=L_m1 VId=0x1005 Text="Pitch"[0x41] Val=0|"Inhibit?" NL=(0->32,0,S=53) [53->85,53] MId=0x1029 ] + + ctx.Menu = { MenuId = 0x1029, TextId = 0xAD, PrevId = 0, NextId = 0, BackId = 0x1022 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x1DC, ValId = 0x1029 } + ctx.MenuLines[1] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x40, ValId = 0x1000, Min=53, Max=85, Def=53, Val=0 } + ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x41, ValId = 0x1001, Min=53, Max=85, Def=53, Val=0 } + ctx.MenuLines[3] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x42, ValId = 0x1002, Min=53, Max=85, Def=53, Val=0 } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x267, ValId = 0x1029 } + ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x40, ValId = 0x1004, Min=53, Max=85, Def=53, Val=0 } + ctx.MenuLines[6] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x41, ValId = 0x1005, Min=53, Max=85, Def=53, Val=0 } + + ctx.SelLine = 2 + lastGoodMenu = menuId + elseif (menuId==0x1030) then + --M[Id=0x1030 P=0x0 N=0x0 B=0x102A Text="Attitude Trim"[0x1E6]] + --L[#0 T=M VId=0x1030 Text="Level model and capture attiude"[0xCD] MId=0x1030 ] + --L[#1 T=M VId=0x1030 Text="Attitude Trim"[0x1E6] MId=0x1030 ] + --L[#2 T=V_de VId=0x1002 Text="Roll"[0x40] Val=-1 [-45->45,0] MId=0x1030 ] + --L[#3 T=V_de VId=0x1003 Text="Pitch"[0x41] Val=7 [-45->45,0] MId=0x1030 ] + --L[#5 T=M VId=0x1030 Text="Positive = Nose Up/Roll Right"[0x267] MId=0x1030 ] + --L[#6 T=M VId=0x1030 Text="Negative = Nose Down/Roll Left"[0x268] MId=0x1030 ] + + ctx.Menu = { MenuId = 0x1030, TextId = 0x1E6, PrevId = 0, NextId = 0, BackId = 0x102A } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0xCD, ValId = 0x1030 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x1E6, ValId = 0x1030 } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_DEGRES, TextId = 0x40, ValId = 0x1002, Min=-45, Max=45, Def=0, Val=-1 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_DEGRES, TextId = 0x41, ValId = 0x1003, Min=-45, Max=45, Def=0, Val=7 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x267, ValId = 0x1030 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x268, ValId = 0x1030 } + + ctx.SelLine = 2 + lastGoodMenu = menuId + elseif (menuId==0x1031) then + --M[Id=0x1031 P=0x0 N=0x0 B=0x102A Text="Failsafe Angles"[0x1F6]] + --L[#0 T=M VId=0x1031 Text="Failsafe Angles"[0x1F6] MId=0x1031 ] + --L[#1 T=V_de VId=0x1001 Text="Roll"[0x40] Val=0 [-90->90,0] MId=0x1031 ] + --L[#2 T=V_de VId=0x1002 Text="Pitch"[0x41] Val=0 [-90->90,0] MId=0x1031 ] + --L[#5 T=M VId=0x1031 Text="Positive = Nose Up/Roll Right"[0x267] MId=0x1031 ] + --L[#6 T=M VId=0x1031 Text="Negative = Nose Down/Roll Left"[0x268] MId=0x1031 ] + + ctx.Menu = { MenuId = 0x1031, TextId = 0x1F6, PrevId = 0, NextId = 0, BackId = 0x102A } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x1F6, ValId = 0x1031 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_DEGRES, TextId = 0x40, ValId = 0x1001, Min=-90, Max=90, Def=0, Val=0 } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_DEGRES, TextId = 0x41, ValId = 0x1002, Min=-90, Max=90, Def=0, Val=0 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x267, ValId = 0x1031 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x268, ValId = 0x1031 } + + ctx.SelLine = 1 + lastGoodMenu = menuId + elseif (menuId==0x1032) then + --M[Id=0x1032 P=0x0 N=0x0 B=0x1022 Text="Utilities"[0x240]] + --L[#0 T=M VId=0x1033 Text="Copy Flight Mode Settings"[0x23D] MId=0x1032 ] + --L[#1 T=L_m0 VId=0x1001 Text="Enabled F-Modes"[0x88] Val=2 NL=(0->9,2,S=182) [182->191,184] MId=0x1032 ] + + ctx.Menu = { MenuId = 0x1032, TextId = 0x240, PrevId = 0, NextId = 0, BackId = 0x1022 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x23D, ValId = 0x1033 } + ctx.MenuLines[1] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x88, ValId = 0x1001, Min=182, Max=191, Def=184, Val=2 } + + ctx.SelLine = 0 + lastGoodMenu = menuId + + elseif (menuId==0x1033) then + --M[Id=0x1033 P=0x0 N=0x0 B=0x1032 Text="Copy Flight Mode Settings"[0x23D]] + --L[#0 T=V_NC VId=0x1000 Text="Flight Mode"[0x8001] Val=0 [0->10,0] MId=0x1033 ] + --L[#1 T=M VId=0x1033 Text="WARNING: "Target""[0x260] MId=0x1033 ] + --L[#2 T=M VId=0x1033 Text="flight mode will be overwritten"[0x261] MId=0x1033 ] + --L[#3 T=M VId=0x1033 Text="by "Source""[0x262] MId=0x1033 ] + --L[#4 T=L_m0 VId=0x1004 Text="Source Flight Mode"[0x23E] Val=0|"FM1" NL=(0->9,0,S=182) [182->191,182] MId=0x1033 ] + --L[#5 T=L_m0 VId=0x1005 Text="Target Flight Mode"[0x23F] Val=0|"FM1" NL=(0->9,0,S=182) [182->191,182] MId=0x1033 ] + --L[#6 T=M VId=0x1035 Text="Copy"[0x259] MId=0x1034 ] + + + ctx.Menu = { MenuId = 0x1033, TextId = 0x23D, PrevId = 0, NextId = 0, BackId = 0x1032 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x260, ValId = 0x1033 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x261, ValId = 0x1033 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x262, ValId = 0x1033 } + ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x23E, ValId = 0x1004, Min=182, Max=191, Def=182, Val=0 } + ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x23F, ValId = 0x1005, Min=182, Max=191, Def=182, Val=0 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x259, ValId = 0x1034 } + + ctx.SelLine = 4 + lastGoodMenu = menuId + elseif (menuId==0x1034) then + --M[Id=0x1033 P=0x0 N=0x0 B=0x1032 Text="Copy Flight Mode Settings"[0x23D]] + + --L[#1 T=M VId=0x1033 Text="WARNING: "Target" IN USE"[0x251] MId=0x1033 ] + --L[#2 T=M VId=0x1033 Text="flight mode will be overwritten"[0x252] MId=0x1033 ] + --L[#3 T=M VId=0x1033 Text="by "Source""[0x253] MId=0x1033 ] + --L[#4 T=L_m0 VId=0x1004 Text="Source Flight Mode"[0x23E] Val=0|"FM1" NL=(0->0,0,S=182) [182->182,182] MId=0x1033 ] + --L[#5 T=L_m0 VId=0x1005 Text="Target Flight Mode"[0x23F] Val=1|"FM2" NL=(0->0,0,S=182) [182->182,182] MId=0x1033 ] + --L[#6 T=M VId=0x1035 Text="Copy"[0x259] MId=0x1034 ] + + + ctx.Menu = { MenuId = 0x1034, TextId = 0x23D, PrevId = 0x1033, NextId = 0, BackId = 0x1033 } + + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x251, ValId = 0x1034 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x252, ValId = 0x1034 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x253, ValId = 0x1034 } + ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x23E, ValId = 0x1004, Min=182, Max=182, Def=182, Val=0 } + ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x23F, ValId = 0x1005, Min=182, Max=182, Def=182, Val=1 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x259, ValId = 0x1035 } + + ctx.SelLine = 6 + lastGoodMenu = menuId + elseif (menuId==0x1035) then + --M[Id=0x1035 P=0x0 N=0x0 B=0x1032 Text="Copy Flight Mode Settings"[0x23D]] + --L[#3 T=M VId=0x1032 Text="Complete"[0x93] MId=0x1035 ] + + ctx.Menu = { MenuId = 0x1035, TextId = 0x23D, PrevId = 0, NextId = 0, BackId = 0x1032 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x93, ValId = 0x1032 } + + ctx.SelLine = 3 + lastGoodMenu = menuId + elseif (menuId==0x102A) then + --M[Id=0x102A P=0x0 N=0x0 B=0x1022 Text="SAFE/Panic Mode Setup"[0xCA]] + --L[#2 T=M VId=0x102B Text="Panic"[0x8B] MId=0x102A ] + --L[#3 T=M VId=0x102D Text="Throttle to Pitch"[0x1EE] MId=0x102A ] + --L[#4 T=M VId=0x1030 Text="Attitude Trim"[0x1E6] MId=0x102A ] + --L[#5 T=L_m0 VId=0x1006 Text="SAFE Failsafe FMode"[0x1FD] Val=0|"FM1" NL=(0->10,0,S=181) [181->191,181] MId=0x102A ] + --L[#6 T=M VId=0x1031 Text="Failsafe Angles"[0x1F6] MId=0x102A ] + + ctx.Menu = { MenuId = 0x102A, TextId = 0xCA, PrevId = 0, NextId = 0, BackId = 0x1022 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x8B, ValId = 0x102B } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x1EE, ValId = 0x102D } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x1E6, ValId = 0x1030 } + ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x1FD, ValId = 0x1006, Min=182, Max=191, Def=182, Val=0 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x1F6, ValId = 0x1031 } + + ctx.SelLine = 5 + lastGoodMenu = menuId + elseif (menuId==0x102B) then + --M[Id=0x102B P=0x0 N=0x0 B=0x102A Text="Panic"[0x8B]] + --L[#0 T=L_m1 VId=0x1000 Text="Panic Channel"[0xD2] Val=0|"Inhibit?" NL=(0->32,0,S=53) [53->85,53] MId=0x102B ] + --L[#1 T=L_m1 VId=0x1001 Text="Panic Delay"[0x8E] Val=0|"Inh" NL=(0->1,0,S=3) [3->4,3] MId=0x102B ] + --L[#2 T=L_m1 VId=0x1002 Text="Panic Flight Mode"[0x1FC] Val=0|"FM1" NL=(0->10,0,S=181) [181->191,181] MId=0x102B ] + --L[#3 T=V_NC VId=0x1003 Text="Roll Right"[0x1E9] Val=30 [0->90,30] MId=0x102B ] + --L[#4 T=V_NC VId=0x1004 Text="Roll Left"[0x1EA] Val=30 [0->90,30] MId=0x102B ] + --L[#5 T=V_NC VId=0x1005 Text="Pitch Down"[0x1EB] Val=30 [0->75,30] MId=0x102B ] + --L[#6 T=V_NC VId=0x1006 Text="Pitch Up"[0x1EC] Val=30 [0->75,30] MId=0x102B ] + + ctx.Menu = { MenuId = 0x102B, TextId = 0x8B, PrevId = 0, NextId = 0, BackId = 0x102A } + ctx.MenuLines[0] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0xD2, ValId = 0x1000, Min=53, Max=85, Def=53, Val=0 } + ctx.MenuLines[1] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x8E, ValId = 0x1001, Min=3, Max=4, Def=3, Val=0 } + ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x1FC, ValId = 0x1002, Min=181, Max=191, Def=181, Val=0 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1E9, ValId = 0x1003, Min=0, Max=90, Def=30, Val=30 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EA, ValId = 0x1004, Min=0, Max=90, Def=30, Val=30 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1E9, ValId = 0x1005, Min=0, Max=75, Def=30, Val=30 } + ctx.MenuLines[6] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EC, ValId = 0x1006, Min=0, Max=75, Def=30, Val=30 } + + ctx.SelLine = 0 + lastGoodMenu = menuId + elseif (menuId==0x102D) then + --M[Id=0x102D P=0x0 N=0x0 B=0x102A Text="SAFE - Throttle to Pitch"[0x269]] + --L[#0 T=M VId=0x102D Text="Postive = Up, Negative = Down"[0x254] MId=0x102D ] + --L[#1 T=M VId=0x102D Text="Low Thr to Pitch"[0x1EF] MId=0x102D ] + --L[#2 T=V_NC VId=0x1001 Text="Threshold"[0x1F3] Val=30 [0->50,30] MId=0x102D ] + --L[#3 T=V_de VId=0x1002 Text="Angle"[0x1F4] Val=0 [-45->45,0] MId=0x102D ] + --L[#4 T=M VId=0x102D Text="High Thr to Pitch"[0x1F0] MId=0x102D ] + --L[#5 T=V_NC VId=0x1005 Text="Threshold"[0x1F3] Val=70 [51->100,70] MId=0x102D ] + --L[#6 T=V_de VId=0x1006 Text="Angle"[0x1F4] Val=0 [-45->45,0] MId=0x102D ] + + ctx.Menu = { MenuId = 0x102D, TextId = 0x269, PrevId = 0, NextId = 0, BackId = 0x102A } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x254, ValId = 0x102D } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x1EF, ValId = 0x102D } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1F3, ValId = 0x1001, Min=0, Max=50, Def=30, Val=30 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_DEGRES, TextId = 0x1F4, ValId = 0x1002, Min=-45, Max=45, Def=0, Val=0 } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x1F0, ValId = 0x102D } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1F3, ValId = 0x1005, Min=51, Max=100, Def=70, Val=70 } + ctx.MenuLines[6] = { Type = LINE_TYPE.VALUE_DEGRES, TextId = 0x1F4, ValId = 0x1006, Min=-45, Max=45, Def=0, Val=0 } + + ctx.SelLine = 2 + lastGoodMenu = menuId + elseif (menuId==0x1051) then + --M[Id=0x1051 P=0x0 N=0x0 B=0x1010 Text="First Time Setup"] + --L[#0 T=M VId=0x1051 Text="Set the model level," MId=0x1051 ] + --L[#1 T=M VId=0x1051 Text="and press Continue." MId=0x1051 ] + --L[#2 T=M VId=0x1051 Text="" MId=0x1051 ] + --L[#5 T=M VId=0x1052 Text="Continue" MId=0x1051 ] + --L[#6 T=M VId=0x1053 Text="Set Orientation Manually" MId=0x1051 ] + + ctx.Menu = { MenuId = 0x1051, TextId = 0x00F9, PrevId = 0, NextId = 0, BackId = 0x1010 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x021A, ValId = 0x1051 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x021B, ValId = 0x1051 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x021C, ValId = 0x1051 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x0224, ValId = 0x1052 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x0229, ValId = 0x1053 } + + ctx.SelLine = 5 + lastGoodMenu = menuId elseif (menuId==0x104F) then --M[Id=0x104F P=0x0 N=0x1050 B=0x1010 Text="First Time Setup"] --L[#0 T=M VId=0x104F Text="Make sure the model has been" MId=0x104F ] @@ -394,10 +673,10 @@ local function AR631_loadMenu(menuId) --L[#5 T=M VId=0x104F [0->0,2] Text="" MId=0x104F ] ctx.Menu = { MenuId = 0x104F, TextId = 0x00F9, PrevId = 0, NextId = 0x1050, BackId = 0x1010 } - ctx.MenuLines[0] = { MenuId = 0x104F, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x0100, ValId = 0x104F } - ctx.MenuLines[1] = { MenuId = 0x104F, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x0101, ValId = 0x104F } - ctx.MenuLines[2] = { MenuId = 0x104F, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x0102, ValId = 0x104F } - ctx.MenuLines[3] = { MenuId = 0x104F, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x0103, ValId = 0x104F } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x0100, ValId = 0x104F } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x0101, ValId = 0x104F } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x0102, ValId = 0x104F } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x0103, ValId = 0x104F } ctx.SelLine = dsmLib.NEXT_BUTTON lastGoodMenu = menuId elseif (menuId==0x1050) then @@ -409,10 +688,10 @@ local function AR631_loadMenu(menuId) --L[#3 T=M VId=0x1050 Text="setup again." MId=0x1050 ] ctx.Menu = { MenuId = 0x1050, TextId = 0x00F9, PrevId = 0x104F, NextId = 0x1051, BackId = 0x1010 } - ctx.MenuLines[0] = { MenuId = 0x1050, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x0106, ValId = 0x1050 } - ctx.MenuLines[1] = { MenuId = 0x1050, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x0107, ValId = 0x1050 } - ctx.MenuLines[2] = { MenuId = 0x1050, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x0108, ValId = 0x1050 } - ctx.MenuLines[3] = { MenuId = 0x1050, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x0109, ValId = 0x1050 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x0106, ValId = 0x1050 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x0107, ValId = 0x1050 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x0108, ValId = 0x1050 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x0109, ValId = 0x1050 } ctx.SelLine = dsmLib.NEXT_BUTTON lastGoodMenu = menuId elseif (menuId==0x1051) then @@ -424,11 +703,11 @@ local function AR631_loadMenu(menuId) --L[#6 T=M VId=0x1053 Text="Set Orientation Manually" MId=0x1051 ] ctx.Menu = { MenuId = 0x1051, TextId = 0x00F9, PrevId = 0, NextId = 0, BackId = 0x1010 } - ctx.MenuLines[0] = { MenuId = 0x1051, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x021A, ValId = 0x1051 } - ctx.MenuLines[1] = { MenuId = 0x1051, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x021B, ValId = 0x1051 } - ctx.MenuLines[2] = { MenuId = 0x1051, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x021C, ValId = 0x1051 } - ctx.MenuLines[5] = { MenuId = 0x1051, lineNum = 5, Type = LINE_TYPE.MENU, TextId = 0x0224, ValId = 0x1052 } - ctx.MenuLines[6] = { MenuId = 0x1051, lineNum = 6, Type = LINE_TYPE.MENU, TextId = 0x0229, ValId = 0x1053 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x021A, ValId = 0x1051 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x021B, ValId = 0x1051 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x021C, ValId = 0x1051 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x0224, ValId = 0x1052 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x0229, ValId = 0x1053 } ctx.SelLine = 5 lastGoodMenu = menuId @@ -442,12 +721,12 @@ local function AR631_loadMenu(menuId) --L[#6 T=M VId=0x1053 Text="Continue"[0x224] MId=0x1052 ] ctx.Menu = { MenuId = 0x1052, TextId = 0x00A5, PrevId = 0x1051, NextId = 0, BackId = 0x1010 } - ctx.MenuLines[0] = { MenuId = 0x1052, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x21F, ValId = 0x1052 } - ctx.MenuLines[1] = { MenuId = 0x1052, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x220, ValId = 0x1052 } - ctx.MenuLines[2] = { MenuId = 0x1052, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x221, ValId = 0x1052 } - ctx.MenuLines[3] = { MenuId = 0x1052, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x222, ValId = 0x1052 } - ctx.MenuLines[4] = { MenuId = 0x1052, lineNum = 4, Type = LINE_TYPE.MENU, TextId = 0x223, ValId = 0x1052 } - ctx.MenuLines[6] = { MenuId = 0x1052, lineNum = 6, Type = LINE_TYPE.MENU, TextId = 0x224, ValId = 0x1053 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x21F, ValId = 0x1052 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x220, ValId = 0x1052 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x221, ValId = 0x1052 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x222, ValId = 0x1052 } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x223, ValId = 0x1052 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x224, ValId = 0x1053 } ctx.SelLine = 6 lastGoodMenu = menuId elseif (menuId==0x1053) then @@ -456,8 +735,8 @@ local function AR631_loadMenu(menuId) --L[#6 T=M VId=0x1054 Text="Continue"[0x224] MId=0x1053 ] ctx.Menu = { MenuId = 0x1053, TextId = 0x00A5, PrevId = 0x1051, NextId = 0, BackId = 0x1010 } - ctx.MenuLines[5] = { MenuId = 0x1053, lineNum = 0, Type = LINE_TYPE.LIST_MENU0, TextId = 0x80, ValId = 0x1000, Min=203, Max=226, Def=203, Val=0 } - ctx.MenuLines[6] = { MenuId = 0x1053, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x224, ValId = 0x1054 } + ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x80, ValId = 0x1000, Min=203, Max=226, Def=203, Val=0 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x224, ValId = 0x1054 } ctx.SelLine = 5 lastGoodMenu = menuId elseif (menuId==0x1054) then @@ -466,10 +745,114 @@ local function AR631_loadMenu(menuId) --L[#6 T=M VId=0x1 Text="Apply"[0x90] MId=0x1054 ] ctx.Menu = { MenuId = 0x1054, TextId = 0x00A5, PrevId = 0x1053, NextId = 0, BackId = 0x1010 } - ctx.MenuLines[5] = { MenuId = 0x1054, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0xAD, ValId = 0x7CA5 } - ctx.MenuLines[6] = { MenuId = 0x1054, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x01 } -- Special save&reboot?? + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0xAD, ValId = 0x7CA5 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x01 } -- Special save&reboot?? + ctx.SelLine = 1 + lastGoodMenu = menuId + elseif (menuId==0x1055) then + --M[Id=0x1055 P=0x0 N=0x0 B=0x1010 Text="First Time SAFE Setup"[0x20D]] + --L[#0 T=M VId=0x1055 Text="Before setting up SAFE"[0x255] MId=0x1055 ] + --L[#1 T=M VId=0x1055 Text="a Fligt Mode channel"[0x256] MId=0x1055 ] + --L[#2 T=M VId=0x1055 Text="most be configured."[0x257] MId=0x1055 ] + --L[#5 T=M VId=0x7CA7 Text="FM Channel"[0x78] MId=0x1055 ] + --L[#6 T=M VId=0x1056 Text="Continue"[0x224] MId=0x1055 ] + + ctx.Menu = { MenuId = 0x1055, TextId = 0x20D, PrevId = 0x1053, NextId = 0, BackId = 0x1010 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x255, ValId = 0x1055 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x256, ValId = 0x1055 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x257, ValId = 0x1055 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x78, ValId = 0x7CA7 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x224, ValId = 0x1056 } ctx.SelLine = 5 lastGoodMenu = menuId + elseif (menuId==0x1056) then + --M[Id=0x1056 P=0x1055 N=0x1057 B=0x1010 Text="First Time SAFE Setup"[0x20D]] + --L[#0 T=V_NC VId=0x1000 Text="Flight Mode"[0x8001] Val=1 [0->10,0] MId=0x1056 ] + --L[#1 T=M VId=0x1056 Text="Select the desired flight mode"[0x25A] MId=0x1056 ] + --L[#2 T=M VId=0x1056 Text="switch position to adjust settings"[0x25B] MId=0x1056 ] + --L[#3 T=M VId=0x1056 Text="for each flight mode"[0x25C] MId=0x1056 ] + --L[#4 T=M VId=0x1056 Text=""[0x25D] MId=0x1056 ] + --L[#5 T=M VId=0x1056 Text=""[0x25E] MId=0x1056 ] + + ctx.Menu = { MenuId = 0x1056, TextId = 0x20D, PrevId = 0x1053, NextId = 0x1057, BackId = 0x1010 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x25A, ValId = 0x1056 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x25B, ValId = 0x1056 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x25C, ValId = 0x1056 } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x25D, ValId = 0x1056 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x25E, ValId = 0x1056 } + + ctx.SelLine = 7 + lastGoodMenu = menuId + elseif (menuId==0x1057) then + --M[Id=0x1057 P=0x1056 N=0x1059 B=0x1010 Text="First Time SAFE Setup"[0x20D]] + --L[#0 T=M VId=0x1057 Text="AS3X gains must be tuned"[0x20E] MId=0x1057 ] + --L[#1 T=M VId=0x1057 Text="and active i SAFE Flight Modes"[0x20F] MId=0x1057 ] + --L[#2 T=M VId=0x1057 Text="to help reduce wobble."[0x210] MId=0x1057 ] + --L[#3 T=M VId=0x1057 Text=""[0x211] MId=0x1057 ] + --L[#4 T=M VId=0x1057 Text=""[0x212] MId=0x1057 ] + --L[#5 T=M VId=0x1057 Text=""[0x213] MId=0x1057 ] + + ctx.Menu = { MenuId = 0x1057, TextId = 0x20D, PrevId = 0x1056, NextId = 0x1059, BackId = 0x1010 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x20E, ValId = 0x1057 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x20F, ValId = 0x1057 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x210, ValId = 0x1057 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x211, ValId = 0x1057 } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x212, ValId = 0x1057 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x213, ValId = 0x1057 } + + ctx.SelLine = 7 + lastGoodMenu = menuId + + elseif (menuId==0x1059) then + --M[Id=0x1059 P=0x1057 N=0x105A B=0x1010 Text="First Time SAFE Setup"[0x20D]] + --L[#0 T=M VId=0x1059 Text="Leven model and capture attiude"[0xCD] MId=0x1059 ] + --L[#1 T=M VId=0x1059 Text="Attitude Trim"[0x1E6] MId=0x1059 ] + --L[#2 T=V_de VId=0x1002 Text="Roll"[0x40] Val=13 [-45->45,0] MId=0x1059 ] + --L[#3 T=V_de VId=0x1003 Text="Pitch"[0x41] Val=5 [-45->45,0] MId=0x1059 ] + --L[#5 T=M VId=0x1059 Text="Positive = Nose Up/Roll Right"[0x267] MId=0x1059 ] + --L[#6 T=M VId=0x1059 Text="Negative = Nose Down/Roll Left"[0x268] MId=0x1059 ] + + ctx.Menu = { MenuId = 0x1059, TextId = 0x20D, PrevId = 0x1057, NextId = 0x105A, BackId = 0x1010 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0xCD, ValId = 0x1059 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x1E6, ValId = 0x1059 } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_DEGRES, TextId = 0x40, ValId = 0x1002, Min=-45, Max=45, Def=0, Val=13 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_DEGRES, TextId = 0x41, ValId = 0x1003, Min=-45, Max=45, Def=0, Val=5 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x267, ValId = 0x1059 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x268, ValId = 0x1059 } + + ctx.SelLine = 7 + lastGoodMenu = menuId + elseif (menuId==0x105A) then + --M[Id=0x105A P=0x1059 N=0x105B B=0x1010 Text="First Time SAFE Setup"[0x20D]] + --L[#0 T=V_NC VId=0x1000 Text="Flight Mode"[0x8001] Val=0 [0->10,0] MId=0x105A ] + --L[#1 T=L_m1 VId=0x1001 Text="Safe Mode"[0x1F8] Val=3|"Inh" NL=(0->244,3,S=0) [0->244,3] MId=0x105A ] + --L[#2 T=M VId=0x105A Text="Angle Limits "[0x226] MId=0x105A ] + --L[#3 T=V_NC VId=0x1003 Text="Roll Right"[0x1E9] Val=60 [10->90,60] MId=0x105A ] + --L[#4 T=V_NC VId=0x1004 Text="Roll Left"[0x1EA] Val=60 [10->90,60] MId=0x105A ] + --L[#5 T=V_NC VId=0x1005 Text="Pitch Down"[0x1EB] Val=40 [10->75,40] MId=0x105A ] + --L[#6 T=V_NC VId=0x1006 Text="Pitch Up"[0x1EC] Val=50 [10->75,50] MId=0x105A ] + + ctx.Menu = { MenuId = 0x105A, TextId = 0x1DE, PrevId = 0x1059, NextId = 0x105B, BackId = 0x1010 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[1] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x1F8, ValId = 0x1001, Min=0, Max=244, Def=3, Val=3 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x226, ValId = 0x105A } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1E9, ValId = 0x1003, Min=10, Max=90, Def=60, Val=60 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EA, ValId = 0x1004, Min=10, Max=90, Def=60, Val=60 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EB, ValId = 0x1004, Min=10, Max=75, Def=40, Val=40 } + ctx.MenuLines[6] = { lineNum = 7, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x1EC, ValId = 0x1004, Min=10, Max=75, Def=50, Val=50 } + + ctx.SelLine = 1 + lastGoodMenu = menuId + elseif (menuId==0x105B) then + --M[Id=0x105B P=0x105A N=0x0 B=0x1000 Text="First Time SAFE Setup"[0x20D]] + --L[#3 T=M VId=0x1 Text="Apply"[0x90] MId=0x1064 ] + + ctx.Menu = { MenuId = 0x105B, TextId = 0x20D, PrevId = 0x105A, NextId = 0, BackId = 0x1000 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x1 } -- reset RX + + ctx.SelLine = 3 + lastGoodMenu = menuId elseif (menuId==0x105C) then -- M[Id=0x105C P=0x0 N=0x0 B=0x1010 Text="SAFE Select"[0x1F9]] --L[#0 T=V_NC VId=0x1000 Text="Flight Mode 1"[0x8001] val=1 [0->10,0] MId=0x105C ] @@ -479,11 +862,11 @@ local function AR631_loadMenu(menuId) --L[#6 T=L_m1 VId=0x1006 Text="SAFE Select"[0x1F9] val=0 NL=(0->1,1,S=1) [1->2,1] MId=0x105C ] ctx.Menu = { MenuId = 0x105C, TextId = 0x1DE, PrevId = 0, NextId = 0, BackId = 0x1010 } - ctx.MenuLines[0] = { MenuId = 0x105C, lineNum = 0, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } - ctx.MenuLines[1] = { MenuId = 0x105C, lineNum = 1, Type = LINE_TYPE.LIST_MENU1, TextId = 0x1D7, ValId = 0x1001, Min=53, Max=85, Def=53, Val=5 } - ctx.MenuLines[2] = { MenuId = 0x105C, lineNum = 2, Type = LINE_TYPE.LIST_MENU1, TextId = 0x1DC, ValId = 0x1002, Min=1, Max=2, Def=1, Val=1 } - ctx.MenuLines[3] = { MenuId = 0x105C, lineNum = 3, Type = LINE_TYPE.LIST_MENU1, TextId = 0xDA, ValId = 0x1003, Min=1, Max=1, Def=1, Val=0 } - ctx.MenuLines[6] = { MenuId = 0x105C, lineNum = 6, Type = LINE_TYPE.LIST_MENU1, TextId = 0x1F9, ValId = 0x1004, Min=1, Max=2, Def=1, Val=0 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8001, ValId = 0x1000, Min=0, Max=10, Def=0, Val=1 } + ctx.MenuLines[1] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x1D7, ValId = 0x1001, Min=53, Max=85, Def=53, Val=5 } + ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x1DC, ValId = 0x1002, Min=1, Max=2, Def=1, Val=1 } + ctx.MenuLines[3] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0xDA, ValId = 0x1003, Min=1, Max=1, Def=1, Val=0 } + ctx.MenuLines[6] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x1F9, ValId = 0x1004, Min=1, Max=2, Def=1, Val=0 } ctx.SelLine = 1 lastGoodMenu = menuId @@ -497,12 +880,12 @@ local function AR631_loadMenu(menuId) -- L[#6 T=M VId=0x106A Text="Save to Backup" MId=0x105E ] ctx.Menu = { MenuId = 0x105E, TextId = 0x0227, PrevId = 0, NextId = 0, BackId = 0x1010 } - ctx.MenuLines[1] = { MenuId = 0x105E, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x004A, ValId = 0x1060 } - ctx.MenuLines[2] = { MenuId = 0x105E, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x019C, ValId = 0x1064 } - ctx.MenuLines[3] = { MenuId = 0x105E, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x0085, ValId = 0x1065 } - ctx.MenuLines[4] = { MenuId = 0x105E, lineNum = 4, Type = LINE_TYPE.MENU, TextId = 0x0097, ValId = 0x1067 } - ctx.MenuLines[5] = { MenuId = 0x105E, lineNum = 5, Type = LINE_TYPE.MENU, TextId = 0x020A, ValId = 0x1069 } - ctx.MenuLines[6] = { MenuId = 0x105E, lineNum = 6, Type = LINE_TYPE.MENU, TextId = 0x0209, ValId = 0x106A } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x004A, ValId = 0x1060 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x019C, ValId = 0x1064 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x0085, ValId = 0x1065 } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x0097, ValId = 0x1067 } + ctx.MenuLines[5] = { Type = LINE_TYPE.MENU, TextId = 0x020A, ValId = 0x1069 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x0209, ValId = 0x106A } ctx.SelLine = 1 lastGoodMenu = menuId @@ -512,8 +895,8 @@ local function AR631_loadMenu(menuId) --L[#1 T=M VId=0x1062 Text="Capture Failsafe Positions" MId=0x1060 ] ctx.Menu = { MenuId = 0x1060, TextId = 0x004A, PrevId = 0, NextId = 0, BackId = 0x105E } - ctx.MenuLines[0] = { MenuId = 0x1060, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x004A, ValId = 0x1061 } - ctx.MenuLines[1] = { MenuId = 0x1060, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x009A, ValId = 0x1062 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x004A, ValId = 0x1061 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x009A, ValId = 0x1062 } ctx.SelLine = 0 lastGoodMenu = menuId elseif (menuId==0x1061) then @@ -523,9 +906,9 @@ local function AR631_loadMenu(menuId) --L[#3 T=V_% VId=0x1003 Text="Position:" val=-100 [-150->150,0] MId=0x1061 ] ctx.Menu = { MenuId = 0x1061, TextId = 0x004A, PrevId = 0, NextId = 0, BackId = 0x1060 } - ctx.MenuLines[0] = { MenuId = 0x1061, lineNum = 0, Type = LINE_TYPE.LIST_MENU0, TextId = 0x0050, ValId = 0x1000, Min=54, Max=73, Def=54, Val=0 } - ctx.MenuLines[1] = { MenuId = 0x1061, lineNum = 1, Type = LINE_TYPE.LIST_MENU2, TextId = 0x009C, ValId = 0x1002, Min=95, Max=96, Def=95, Val=0 } - ctx.MenuLines[2] = { MenuId = 0x1061, lineNum = 2, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x004E, ValId = 0x1002, Min=-150, Max=150, Def=0, Val=-100 } + ctx.MenuLines[0] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x0050, ValId = 0x1000, Min=54, Max=73, Def=54, Val=0 } + ctx.MenuLines[1] = { Type = LINE_TYPE.LIST_MENU2, TextId = 0x009C, ValId = 0x1002, Min=95, Max=96, Def=95, Val=0 } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x004E, ValId = 0x1002, Min=-150, Max=150, Def=0, Val=-100 } ctx.SelLine = 0 lastGoodMenu = menuId elseif (menuId==0x1064) then @@ -533,7 +916,7 @@ local function AR631_loadMenu(menuId) --L[#3 T=M VId=0x1 Text="Apply"[0x90] MId=0x1064 ] ctx.Menu = { MenuId = 0x1064, TextId = 0x19C, PrevId = 0, NextId = 0, BackId = 0x105E } - ctx.MenuLines[3] = { MenuId = 0x1064, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x1 } -- reset RX + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x1 } -- reset RX ctx.SelLine = 3 lastGoodMenu = menuId @@ -547,12 +930,12 @@ local function AR631_loadMenu(menuId) --L[#5 T=L_m1 VId=0x1005 Text="Output Channel 6:" val=46 NL=(0->244,46|S=0) [0->244,0] MId=0x1065 ] ctx.Menu = { MenuId = 0x1065, TextId = 0x0085, PrevId = 0, NextId = 0, BackId = 0x105E } - ctx.MenuLines[0] = { MenuId = 0x1065, lineNum = 0, Type = LINE_TYPE.LIST_MENU1, TextId = 0x0051, ValId = 0x1000, Min=0, Max=244, Def=46, Val=46 } - ctx.MenuLines[1] = { MenuId = 0x1065, lineNum = 1, Type = LINE_TYPE.LIST_MENU1, TextId = 0x0052, ValId = 0x1001, Min=0, Max=244, Def=46, Val=47 } - ctx.MenuLines[2] = { MenuId = 0x1065, lineNum = 2, Type = LINE_TYPE.LIST_MENU1, TextId = 0x0053, ValId = 0x1002, Min=0, Max=244, Def=46, Val=46 } - ctx.MenuLines[3] = { MenuId = 0x1065, lineNum = 3, Type = LINE_TYPE.LIST_MENU1, TextId = 0x0054, ValId = 0x1002, Min=0, Max=244, Def=46, Val=46 } - ctx.MenuLines[4] = { MenuId = 0x1065, lineNum = 4, Type = LINE_TYPE.LIST_MENU1, TextId = 0x0055, ValId = 0x1002, Min=0, Max=244, Def=46, Val=46 } - ctx.MenuLines[5] = { MenuId = 0x1065, lineNum = 5, Type = LINE_TYPE.LIST_MENU1, TextId = 0x0056, ValId = 0x1002, Min=0, Max=244, Def=46, Val=46 } + ctx.MenuLines[0] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x0051, ValId = 0x1000, Min=0, Max=244, Def=46, Val=46 } + ctx.MenuLines[1] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x0052, ValId = 0x1001, Min=0, Max=244, Def=46, Val=47 } + ctx.MenuLines[2] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x0053, ValId = 0x1002, Min=0, Max=244, Def=46, Val=46 } + ctx.MenuLines[3] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x0054, ValId = 0x1002, Min=0, Max=244, Def=46, Val=46 } + ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x0055, ValId = 0x1002, Min=0, Max=244, Def=46, Val=46 } + ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x0056, ValId = 0x1002, Min=0, Max=244, Def=46, Val=46 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -566,12 +949,12 @@ local function AR631_loadMenu(menuId) --L[#6 T=M VId=0x1068 Text="Apply"[0x90] MId=0x1067 ] ctx.Menu = { MenuId = 0x1067, TextId = 0x22B, PrevId = 0, NextId = 0, BackId = 0x105E } - ctx.MenuLines[0] = { MenuId = 0x1067, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x22C, ValId = 0x1067 } - ctx.MenuLines[1] = { MenuId = 0x1067, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x22D, ValId = 0x1067 } - ctx.MenuLines[2] = { MenuId = 0x1067, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x22E, ValId = 0x1067 } - ctx.MenuLines[3] = { MenuId = 0x1067, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x22F, ValId = 0x1067 } - ctx.MenuLines[4] = { MenuId = 0x1067, lineNum = 4, Type = LINE_TYPE.MENU, TextId = 0x230, ValId = 0x1067 } - ctx.MenuLines[6] = { MenuId = 0x1067, lineNum = 6, Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x1068 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x22C, ValId = 0x1067 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x22D, ValId = 0x1067 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x22E, ValId = 0x1067 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x22F, ValId = 0x1067 } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x230, ValId = 0x1067 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x1068 } ctx.SelLine = 6 lastGoodMenu = menuId @@ -580,7 +963,7 @@ local function AR631_loadMenu(menuId) --L[#3 T=M VId=0x1000 Text="Complete"[0x93] MId=0x1068 ] ctx.Menu = { MenuId = 0x1068, TextId = 0x94, PrevId = 0, NextId = 0, BackId = 0x1000 } - ctx.MenuLines[3] = { MenuId = 0x1068, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x93, ValId = 0x1000 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x93, ValId = 0x1000 } ctx.SelLine = 3 lastGoodMenu = menuId @@ -594,12 +977,12 @@ local function AR631_loadMenu(menuId) --L[#6 T=M VId=0x1068 Text="Apply"[0x90] MId=0x1069 ] ctx.Menu = { MenuId = 0x1069, TextId = 0x22B, PrevId = 0, NextId = 0, BackId = 0x105E } - ctx.MenuLines[0] = { MenuId = 0x1069, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x236, ValId = 0x1069 } - ctx.MenuLines[1] = { MenuId = 0x1069, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x237, ValId = 0x1069 } - ctx.MenuLines[2] = { MenuId = 0x1069, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x238, ValId = 0x1069 } - ctx.MenuLines[3] = { MenuId = 0x1069, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x239, ValId = 0x1069 } - ctx.MenuLines[4] = { MenuId = 0x1069, lineNum = 4, Type = LINE_TYPE.MENU, TextId = 0x23A, ValId = 0x1069 } - ctx.MenuLines[6] = { MenuId = 0x1069, lineNum = 6, Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x1068 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x236, ValId = 0x1069 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x237, ValId = 0x1069 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x238, ValId = 0x1069 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x239, ValId = 0x1069 } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x23A, ValId = 0x1069 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x1068 } ctx.SelLine = 6 lastGoodMenu = menuId @@ -613,12 +996,12 @@ local function AR631_loadMenu(menuId) --L[#6 T=M VId=0x1068 Text="Apply"[0x90] MId=0x106A ] ctx.Menu = { MenuId = 0x106A, TextId = 0x22B, PrevId = 0, NextId = 0, BackId = 0x105E } - ctx.MenuLines[0] = { MenuId = 0x106A, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x231, ValId = 0x106A } - ctx.MenuLines[1] = { MenuId = 0x106A, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x232, ValId = 0x106A } - ctx.MenuLines[2] = { MenuId = 0x106A, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x233, ValId = 0x106A } - ctx.MenuLines[3] = { MenuId = 0x106A, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x234, ValId = 0x106A } - ctx.MenuLines[4] = { MenuId = 0x106A, lineNum = 4, Type = LINE_TYPE.MENU, TextId = 0x235, ValId = 0x106A } - ctx.MenuLines[6] = { MenuId = 0x106A, lineNum = 6, Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x1068 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x231, ValId = 0x106A } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x232, ValId = 0x106A } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x233, ValId = 0x106A } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x234, ValId = 0x106A } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0x235, ValId = 0x106A } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x1068 } ctx.SelLine = 6 lastGoodMenu = menuId @@ -627,7 +1010,7 @@ local function AR631_loadMenu(menuId) --L[#0 T=L_m1 VId=0x1000 Text="Gain Channel"[0x89] val=7 N=(0->32,53,S=53) [53->85,53] MId=0x7CA5 ] ctx.Menu = { MenuId = 0x7CA5, TextId = 0xAD, PrevId = 0, NextId = 0x1054, BackId = 0x1054 } - ctx.MenuLines[0] = { MenuId = 0x7CA5, lineNum = 0, Type = LINE_TYPE.LIST_MENU1, TextId = 0x89, ValId = 0x1000, Min=53, Max=85, Def=53, Val=7 } + ctx.MenuLines[0] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x89, ValId = 0x1000, Min=53, Max=85, Def=53, Val=7 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -636,18 +1019,27 @@ local function AR631_loadMenu(menuId) --L[#0 T=L_m1 VId=0x1000 Text="FM Channel"[0x78] val=7 N=(0->32,53,S=53) [53->85,53] MId=0x7CA6 ] ctx.Menu = { MenuId = 0x7CA6, TextId = 0x78, PrevId = 0, NextId = 0x1021, BackId = 0x1021 } - ctx.MenuLines[0] = { MenuId = 0x7CA6, lineNum = 0, Type = LINE_TYPE.LIST_MENU1, TextId = 0x78, ValId = 0x1000, Min=53, Max=85, Def=53, Val=7 } + ctx.MenuLines[0] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x78, ValId = 0x1000, Min=53, Max=85, Def=53, Val=7 } ctx.SelLine = 0 lastGoodMenu = menuId - elseif (menuId==0x1) then + elseif (menuId==0x7CA7) then + --M[Id=0x7CA7 P=0x0 N=0x1055 B=0x1055 Text="FM Channel"[0x78]] + --L[#0 T=L_m1 VId=0x1000 Text="FM Channel"[0x78] val=7 N=(0->32,53,S=53) [53->85,53] MId=0x7CA6 ] + + ctx.Menu = { MenuId = 0x7CA7, TextId = 0x78, PrevId = 0, NextId = 0x1055, BackId = 0x1055 } + ctx.MenuLines[0] = { Type = LINE_TYPE.LIST_MENU1, TextId = 0x78, ValId = 0x1000, Min=53, Max=85, Def=53, Val=0 } + + ctx.SelLine = 0 + lastGoodMenu = menuId + elseif (menuId==0x0001) then -- Save Settings and Reboot ctx.Menu = { MenuId = 0x0001, TextId = 0x009F, PrevId = 0, NextId = 0, BackId = 0x1000 } ctx.SelLine = dsmLib.BACK_BUTTON else print("NOT IMPLEMENTED") - ctx.Menu = { MenuId = 0x0001, Text = "NOT IMPLEMENTED", TextId = 0, PrevId = 0, NextId = 0, BackId = lastGoodMenu } + ctx.Menu = { MenuId = 0x0002, Text = "NOT IMPLEMENTED", TextId = 0, PrevId = 0, NextId = 0, BackId = lastGoodMenu } ctx.SelLine = dsmLib.BACK_BUTTON end @@ -667,11 +1059,11 @@ local function FC6250HX_loadMenu(menuId) --L[#6 T=M VId=0x1700 [0->0,2] Text="System Setup"[0x86] MId=0x1000 ] ctx.Menu = { MenuId = 0x1000, TextId = 0x004B, PrevId = 0, NextId = 0, BackId = 0 } - ctx.MenuLines[0] = { MenuId = 0x1000, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0xD3, ValId = 0x1100 } - ctx.MenuLines[1] = { MenuId = 0x1000, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0xDD, ValId = 0x1200 } - ctx.MenuLines[2] = { MenuId = 0x1000, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0xDA, ValId = 0x1400 } - ctx.MenuLines[4] = { MenuId = 0x1000, lineNum = 4, Type = LINE_TYPE.MENU, TextId = 0xDE, ValId = 0x1300 } - ctx.MenuLines[6] = { MenuId = 0x1000, lineNum = 5, Type = LINE_TYPE.MENU, TextId = 0x86, ValId = 0x1700 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0xD3, ValId = 0x1100 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0xDD, ValId = 0x1200 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0xDA, ValId = 0x1400 } + ctx.MenuLines[4] = { Type = LINE_TYPE.MENU, TextId = 0xDE, ValId = 0x1300 } + ctx.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x86, ValId = 0x1700 } ctx.SelLine = 0 lastGoodMenu = menuId elseif (menuId==0x1100) then @@ -681,9 +1073,9 @@ local function FC6250HX_loadMenu(menuId) --L[#2 T=V_i8 VId=0x1103 Text="Agility"[0xD5] val=100 [0->200,100] MId=0x1100 ] ctx.Menu = { MenuId = 0x1100, TextId = 0xD3, PrevId = 0, NextId = 0, BackId = 0x1000 } - ctx.MenuLines[0] = { MenuId = 0x1100, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x40, ValId = 0x1110, Min=0, Max=0, Def=3, Val=nil } - ctx.MenuLines[1] = { MenuId = 0x1100, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x41, ValId = 0x1120, Min=0, Max=0, Def=2, Val=nil } - ctx.MenuLines[2] = { MenuId = 0x1100, lineNum = 2, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0xD5, ValId = 0x1103, Min=0, Max=200, Def=100, Val=100 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x40, ValId = 0x1110, Min=0, Max=0, Def=3, Val=nil } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x41, ValId = 0x1120, Min=0, Max=0, Def=2, Val=nil } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0xD5, ValId = 0x1103, Min=0, Max=200, Def=100, Val=100 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -696,11 +1088,11 @@ local function FC6250HX_loadMenu(menuId) --L[#4 T=V_i8 VId=0x1115 Text="Derivate"[0x73] val=7 [0->255,7] MId=0x1110 ] ctx.Menu = { MenuId = 0x1110, TextId = 0x40, PrevId = 0, NextId = 0, BackId = 0x1100 } - ctx.MenuLines[0] = { MenuId = 0x1110, lineNum = 0, Type = LINE_TYPE.VALUE_NUM_I16, TextId = 0xDC, ValId = 0x1111, Min=0, Max=900, Def=270, Val=270 } - ctx.MenuLines[1] = { MenuId = 0x1110, lineNum = 1, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8000, ValId = 0x1112, Min=0, Max=5, Def=0, Val=1 } - ctx.MenuLines[2] = { MenuId = 0x1110, lineNum = 2, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x71, ValId = 0x1113, Min=0, Max=255, Def=100, Val=100 } - ctx.MenuLines[3] = { MenuId = 0x1110, lineNum = 3, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x72, ValId = 0x1114, Min=0, Max=255, Def=100, Val=100 } - ctx.MenuLines[4] = { MenuId = 0x1110, lineNum = 4, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x73, ValId = 0x1115, Min=0, Max=255, Def=7, Val=7 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NUM_I16, TextId = 0xDC, ValId = 0x1111, Min=0, Max=900, Def=270, Val=270 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8000, ValId = 0x1112, Min=0, Max=5, Def=0, Val=1 } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x71, ValId = 0x1113, Min=0, Max=255, Def=100, Val=100 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x72, ValId = 0x1114, Min=0, Max=255, Def=100, Val=100 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x73, ValId = 0x1115, Min=0, Max=255, Def=7, Val=7 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -715,15 +1107,15 @@ local function FC6250HX_loadMenu(menuId) --L[#6 T=V_i8 VId=0x1125 Text="Derivate"[0x73] Val=14 [0->255,14] MId=0x1120 ] ctx.Menu = { MenuId = 0x1120, TextId = 0x41, PrevId = 0, NextId = 0, BackId = 0x1100 } - ctx.MenuLines[0] = { MenuId = 0x1120, lineNum = 0, Type = LINE_TYPE.VALUE_NUM_I16, TextId = 0xDC, ValId = 0x1121, Min=0, Max=900, Def=270, Val=270 } - ctx.MenuLines[1] = { MenuId = 0x1120, lineNum = 1, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x92, ValId = 0x1123, Min=5, Max=200, Def=25, Val=25 } - ctx.MenuLines[2] = { MenuId = 0x1120, lineNum = 2, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0xD8, ValId = 0x1123, Min=5, Max=200, Def=26, Val=100 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NUM_I16, TextId = 0xDC, ValId = 0x1121, Min=0, Max=900, Def=270, Val=270 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x92, ValId = 0x1123, Min=5, Max=200, Def=25, Val=25 } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0xD8, ValId = 0x1123, Min=5, Max=200, Def=26, Val=100 } - ctx.MenuLines[3] = { MenuId = 0x1120, lineNum = 3, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8000, ValId = 0x1122, Min=0, Max=5, Def=0, Val=1 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8000, ValId = 0x1122, Min=0, Max=5, Def=0, Val=1 } - ctx.MenuLines[4] = { MenuId = 0x1120, lineNum = 4, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x71, ValId = 0x1123, Min=0, Max=255, Def=100, Val=100 } - ctx.MenuLines[5] = { MenuId = 0x1120, lineNum = 5, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x72, ValId = 0x1124, Min=0, Max=255, Def=95, Val=95 } - ctx.MenuLines[6] = { MenuId = 0x1120, lineNum = 6, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x73, ValId = 0x1125, Min=0, Max=255, Def=45, Val=45 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x71, ValId = 0x1123, Min=0, Max=255, Def=100, Val=100 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x72, ValId = 0x1124, Min=0, Max=255, Def=95, Val=95 } + ctx.MenuLines[6] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x73, ValId = 0x1125, Min=0, Max=255, Def=45, Val=45 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -738,15 +1130,15 @@ local function FC6250HX_loadMenu(menuId) --L[#6 T=V_i8 VId=0x1217 Text="Derivate"[0x73] Val=45 [0->255,45] MId=0x1200 ] ctx.Menu = { MenuId = 0x1200, TextId = 0xDD, PrevId = 0, NextId = 0, BackId = 0x1000 } - ctx.MenuLines[0] = { MenuId = 0x1200, lineNum = 0, Type = LINE_TYPE.VALUE_NUM_I16, TextId = 0xDC, ValId = 0x1211, Min=0, Max=1280, Def=550, Val=550 } - ctx.MenuLines[1] = { MenuId = 0x1200, lineNum = 1, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x92, ValId = 0x1212, Min=5, Max=200, Def=25, Val=25 } - ctx.MenuLines[2] = { MenuId = 0x1200, lineNum = 2, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0xD8, ValId = 0x1213, Min=5, Max=200, Def=26, Val=100 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NUM_I16, TextId = 0xDC, ValId = 0x1211, Min=0, Max=1280, Def=550, Val=550 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x92, ValId = 0x1212, Min=5, Max=200, Def=25, Val=25 } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0xD8, ValId = 0x1213, Min=5, Max=200, Def=26, Val=100 } - ctx.MenuLines[3] = { MenuId = 0x1200, lineNum = 3, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8000, ValId = 0x1214, Min=0, Max=5, Def=0, Val=1 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8000, ValId = 0x1214, Min=0, Max=5, Def=0, Val=1 } - ctx.MenuLines[4] = { MenuId = 0x1200, lineNum = 4, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x71, ValId = 0x1215, Min=0, Max=255, Def=100, Val=100 } - ctx.MenuLines[5] = { MenuId = 0x1200, lineNum = 5, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x72, ValId = 0x1216, Min=0, Max=255, Def=95, Val=95 } - ctx.MenuLines[6] = { MenuId = 0x1200, lineNum = 6, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x73, ValId = 0x1217, Min=0, Max=255, Def=45, Val=45 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x71, ValId = 0x1215, Min=0, Max=255, Def=100, Val=100 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x72, ValId = 0x1216, Min=0, Max=255, Def=95, Val=95 } + ctx.MenuLines[6] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x73, ValId = 0x1217, Min=0, Max=255, Def=45, Val=45 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -759,11 +1151,11 @@ local function FC6250HX_loadMenu(menuId) --L[#6 T=L_m0 VId=0x1703 Text="Output Channel 6"[0x56] val=1 NL=(0->12,0,S=53) [53->65,53] MId=0x1300 ] ctx.Menu = { MenuId = 0x1300, TextId = 0xDE, PrevId = 0, NextId = 0, BackId = 0x1000 } - ctx.MenuLines[0] = { MenuId = 0x1300, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0xD3, ValId = 0x1310 } - ctx.MenuLines[1] = { MenuId = 0x1300, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0xDD, ValId = 0x1360 } - ctx.MenuLines[4] = { MenuId = 0x1300, lineNum = 4, Type = LINE_TYPE.LIST_MENU0, TextId = 0x78, ValId = 0x1701, Min=12, Max=20, Def=13, Val=1 } - ctx.MenuLines[5] = { MenuId = 0x1300, lineNum = 5, Type = LINE_TYPE.LIST_MENU0, TextId = 0x89, ValId = 0x1702, Min=12, Max=20, Def=13, Val=0 } - ctx.MenuLines[6] = { MenuId = 0x1300, lineNum = 6, Type = LINE_TYPE.LIST_MENU0, TextId = 0x56, ValId = 0x1702, Min=53, Max=65, Def=53, Val=1 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0xD3, ValId = 0x1310 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0xDD, ValId = 0x1360 } + ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x78, ValId = 0x1701, Min=12, Max=20, Def=13, Val=1 } + ctx.MenuLines[5] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x89, ValId = 0x1702, Min=12, Max=20, Def=13, Val=0 } + ctx.MenuLines[6] = { Type = LINE_TYPE.LIST_MENU0, TextId = 0x56, ValId = 0x1702, Min=53, Max=65, Def=53, Val=1 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -776,11 +1168,11 @@ local function FC6250HX_loadMenu(menuId) --L[#4 T=V_% VId=0x1313 Text="Decay"[0x208] Val=50 [0->100,50] MId=0x1310 ] ctx.Menu = { MenuId = 0x1310, TextId = 0xD3, PrevId = 0, NextId = 0, BackId = 0x1300 } - ctx.MenuLines[0] = { MenuId = 0x1310, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x49, ValId = 0x1330 } - ctx.MenuLines[1] = { MenuId = 0x1310, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0xDF, ValId = 0x1320 } - ctx.MenuLines[4] = { MenuId = 0x1310, lineNum = 4, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0xE4, ValId = 0x1311, Min=50, Max=150, Def=100, Val=100 } - ctx.MenuLines[5] = { MenuId = 0x1310, lineNum = 5, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0xE2, ValId = 0x1312, Min=-45, Max=45, Def=0, Val=0 } - ctx.MenuLines[6] = { MenuId = 0x1310, lineNum = 6, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x208, ValId = 0x1313, Min=0, Max=100, Def=50, Val=50 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x49, ValId = 0x1330 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0xDF, ValId = 0x1320 } + ctx.MenuLines[4] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0xE4, ValId = 0x1311, Min=50, Max=150, Def=100, Val=100 } + ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0xE2, ValId = 0x1312, Min=-45, Max=45, Def=0, Val=0 } + ctx.MenuLines[6] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x208, ValId = 0x1313, Min=0, Max=100, Def=50, Val=50 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -792,10 +1184,10 @@ local function FC6250HX_loadMenu(menuId) --L[#3 T=V_% VId=0x1324 Text="Differential"[0x45] Val=0 % [-25->25,0] MId=0x1320 ] ctx.Menu = { MenuId = 0x1320, TextId = 0xDF, PrevId = 0, NextId = 0, BackId = 0x1310 } - ctx.MenuLines[0] = { MenuId = 0x1320, lineNum = 0, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x40, ValId = 0x1321, Min=-127, Max=127, Def=-75, Val=-75 } - ctx.MenuLines[1] = { MenuId = 0x1320, lineNum = 1, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x41, ValId = 0x1322, Min=-127, Max=127, Def=-75, Val=-75 } - ctx.MenuLines[2] = { MenuId = 0x1320, lineNum = 2, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0xE0, ValId = 0x1323, Min=5, Max=127, Def=45, Val=45 } - ctx.MenuLines[3] = { MenuId = 0x1320, lineNum = 3, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x45, ValId = 0x1324, Min=-25, Max=25, Def=0, Val=0 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x40, ValId = 0x1321, Min=-127, Max=127, Def=-75, Val=-75 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x41, ValId = 0x1322, Min=-127, Max=127, Def=-75, Val=-75 } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0xE0, ValId = 0x1323, Min=5, Max=127, Def=45, Val=45 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0x45, ValId = 0x1324, Min=-25, Max=25, Def=0, Val=0 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -804,7 +1196,7 @@ local function FC6250HX_loadMenu(menuId) --L[#0 T=M VId=0x1331 Text="Subtrim"[0xE1] MId=0x1330 ] ctx.Menu = { MenuId = 0x1330, TextId = 0x49, PrevId = 0, NextId = 0, BackId = 0x1310 } - ctx.MenuLines[0] = { MenuId = 0x1330, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0xE1, ValId = 0x1331 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0xE1, ValId = 0x1331 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -815,9 +1207,9 @@ local function FC6250HX_loadMenu(menuId) --L[#2 T=V_s16 VId=0x1334 Text="Output Channel 3"[0x53] Val=-53 [-82->82,0] MId=0x1331 ] ctx.Menu = { MenuId = 0x1331, TextId = 0xE1, PrevId = 0, NextId = 0, BackId = 0x1330 } - ctx.MenuLines[0] = { MenuId = 0x1331, lineNum = 0, Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x51, ValId = 0x1332, Min=-82, Max=82, Def=0, Val=57 } - ctx.MenuLines[1] = { MenuId = 0x1331, lineNum = 1, Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x52, ValId = 0x1333, Min=-82, Max=82, Def=0, Val=-17 } - ctx.MenuLines[2] = { MenuId = 0x1331, lineNum = 2, Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x53, ValId = 0x1334, Min=-82, Max=82, Def=0, Val=-53 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x51, ValId = 0x1332, Min=-82, Max=82, Def=0, Val=57 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x52, ValId = 0x1333, Min=-82, Max=82, Def=0, Val=-17 } + ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x53, ValId = 0x1334, Min=-82, Max=82, Def=0, Val=-53 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -826,7 +1218,7 @@ local function FC6250HX_loadMenu(menuId) --L[#0 T=M VId=0x1390 Text="Advanced Setup"[0x99] MId=0x1360 ] ctx.Menu = { MenuId = 0x1360, TextId = 0xDD, PrevId = 0, NextId = 0, BackId = 0x1000 } - ctx.MenuLines[0] = { MenuId = 0x1360, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0x99, ValId = 0x1390 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0x99, ValId = 0x1390 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -836,8 +1228,8 @@ local function FC6250HX_loadMenu(menuId) --L[#1 T=V_% VId=0x1312 Text="Right"[0xE8] Val=0 % [-45->45,0] MId=0x1390 ] ctx.Menu = { MenuId = 0x1390, TextId = 0xE2, PrevId = 0, NextId = 0, BackId = 0x1360 } - ctx.MenuLines[0] = { MenuId = 0x1390, lineNum = 0, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0xE2, ValId = 0x1311, Min=-45, Max=45, Def=0, Val=0 } - ctx.MenuLines[1] = { MenuId = 0x1390, lineNum = 1, Type = LINE_TYPE.VALUE_PERCENT, TextId = 0xE8, ValId = 0x1312,Min=-45, Max=45, Def=0, Val=0 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0xE2, ValId = 0x1311, Min=-45, Max=45, Def=0, Val=0 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_PERCENT, TextId = 0xE8, ValId = 0x1312,Min=-45, Max=45, Def=0, Val=0 } ctx.SelLine = 0 @@ -850,9 +1242,9 @@ local function FC6250HX_loadMenu(menuId) --L[#2 T=M VId=0x1420 Text="Attitude Trim"[0x1E6] MId=0x1400 ] ctx.Menu = { MenuId = 0x1400, TextId = 0xDA, PrevId = 0, NextId = 0, BackId = 0x1000 } - ctx.MenuLines[0] = { MenuId = 0x1400, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0xDB, ValId = 0x1410 } - ctx.MenuLines[1] = { MenuId = 0x1400, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x8B, ValId = 0x140 } - ctx.MenuLines[2] = { MenuId = 0x1400, lineNum = 2, Type = LINE_TYPE.MENU, TextId = 0x1E6, ValId = 0x1420 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0xDB, ValId = 0x1410 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x8B, ValId = 0x140 } + ctx.MenuLines[2] = { Type = LINE_TYPE.MENU, TextId = 0x1E6, ValId = 0x1420 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -864,10 +1256,10 @@ local function FC6250HX_loadMenu(menuId) --L[#4 T=L_m2 VId=0x1414 Text="Stability"[0xDB] val=1 NL=(0->1,1,S=1) [1->2,1] MId=0x1410 ] ctx.Menu = { MenuId = 0x1410, TextId = 0xDB, PrevId = 0, NextId = 0, BackId = 0x1400 } - ctx.MenuLines[0] = { MenuId = 0x1410, lineNum = 0, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x43, ValId = 0x1411, Min=0, Max=200, Def=50, Val=50 } - ctx.MenuLines[1] = { MenuId = 0x1410, lineNum = 1, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x1E7, ValId = 0x1412, Min=0, Max=90, Def=45, Val=45 } - ctx.MenuLines[3] = { MenuId = 0x1410, lineNum = 3, Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8000, ValId = 0x1413, Min=0, Max=5, Def=0, Val=1 } - ctx.MenuLines[4] = { MenuId = 0x1410, lineNum = 4, Type = LINE_TYPE.LIST_MENU2, TextId = 0xDB, ValId = 0x1414, Min=1, Max=2, Def=1, Val=1 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x43, ValId = 0x1411, Min=0, Max=200, Def=50, Val=50 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x1E7, ValId = 0x1412, Min=0, Max=90, Def=45, Val=45 } + ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x8000, ValId = 0x1413, Min=0, Max=5, Def=0, Val=1 } + ctx.MenuLines[4] = { Type = LINE_TYPE.LIST_MENU2, TextId = 0xDB, ValId = 0x1414, Min=1, Max=2, Def=1, Val=1 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -878,8 +1270,8 @@ local function FC6250HX_loadMenu(menuId) --L[#1 T=V_i8 VId=0x142 Text="Yaw"[0x42] val=30 [25->100,50] MId=0x140 ] ctx.Menu = { MenuId = 0x140, TextId = 0x8B, PrevId = 0, NextId = 0, BackId = 0x1400 } - ctx.MenuLines[0] = { MenuId = 0x140, lineNum = 0, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x1E7, ValId = 0x141, Min=5, Max=90, Def=45, Val=30 } - ctx.MenuLines[1] = { MenuId = 0x140, lineNum = 1, Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x1E7, ValId = 0x42, Min=25, Max=100, Def=50, Val=30 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x1E7, ValId = 0x141, Min=5, Max=90, Def=45, Val=30 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x1E7, ValId = 0x42, Min=25, Max=100, Def=50, Val=30 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -889,8 +1281,8 @@ local function FC6250HX_loadMenu(menuId) --L[#1 T=V_s16 VId=0x1422 Text="Pitch"[0x41] val=58 [-850->850,0] MId=0x1420 ] ctx.Menu = { MenuId = 0x1420, TextId = 0x1E6, PrevId = 0, NextId = 0, BackId = 0x1400 } - ctx.MenuLines[0] = { MenuId = 0x1420, lineNum = 0, Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x1E7, ValId = 0x40, Min=-850, Max=850, Def=450, Val=274 } - ctx.MenuLines[1] = { MenuId = 0x1420, lineNum = 1, Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x1E7, ValId = 0x41, Min=-850, Max=850, Def=0, Val=58 } + ctx.MenuLines[0] = { Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x1E7, ValId = 0x40, Min=-850, Max=850, Def=450, Val=274 } + ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x1E7, ValId = 0x41, Min=-850, Max=850, Def=0, Val=58 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -900,8 +1292,8 @@ local function FC6250HX_loadMenu(menuId) --L[#1 T=M VId=0x17E0 Text="Factory Reset"[0x97] MId=0x1700 ] ctx.Menu = { MenuId = 0x1700, TextId = 0x86, PrevId = 0, NextId = 0, BackId = 0x1000 } - ctx.MenuLines[0] = { MenuId = 0x1700, lineNum = 0, Type = LINE_TYPE.MENU, TextId = 0xC7, ValId = 0x17F0 } - ctx.MenuLines[1] = { MenuId = 0x1700, lineNum = 1, Type = LINE_TYPE.MENU, TextId = 0x97, ValId = 0x17E0 } + ctx.MenuLines[0] = { Type = LINE_TYPE.MENU, TextId = 0xC7, ValId = 0x17F0 } + ctx.MenuLines[1] = { Type = LINE_TYPE.MENU, TextId = 0x97, ValId = 0x17E0 } ctx.SelLine = 0 lastGoodMenu = menuId @@ -910,7 +1302,7 @@ local function FC6250HX_loadMenu(menuId) --[#3 T=M VId=0x17E1 Text="Apply"[0x90] MId=0x17E0 ] ctx.Menu = { MenuId = 0x17E0, TextId = 0x98, PrevId = 0, NextId = 0, BackId = 0x1700 } - ctx.MenuLines[3] = { MenuId = 0x17E0, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x17E1 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x90, ValId = 0x17E1 } ctx.SelLine = 3 lastGoodMenu = menuId @@ -919,12 +1311,25 @@ local function FC6250HX_loadMenu(menuId) --L[#3 T=M VId=0x17F1 Text="Begin"[0x91] MId=0x17F0 ] ctx.Menu = { MenuId = 0x17F0, TextId = 0xC7, PrevId = 0, NextId = 0, BackId = 0x1700 } - ctx.MenuLines[3] = { MenuId = 0x17F0, lineNum = 3, Type = LINE_TYPE.MENU, TextId = 0x91, ValId = 0x17F1 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0x91, ValId = 0x17F1 } ctx.SelLine = 3 lastGoodMenu = menuId + elseif (menuId==0x17F1) then + --M[Id=0x17F1 P=0x0 N=0x0 B=0x1700 Text="Calibrate Sensor"[0xC7]] + --L[#3 T=M VId=0x17F1 Text="Complete"[0xC8] MId=0x17F0 ] + + ctx.Menu = { MenuId = 0x17F1, TextId = 0xC7, PrevId = 0, NextId = 0, BackId = 0x1700 } + ctx.MenuLines[3] = { Type = LINE_TYPE.MENU, TextId = 0xC8, ValId = 0x1700 } + + ctx.SelLine = 3 + lastGoodMenu = menuId + elseif (menuId==0x0001) then + -- Save Settings and Reboot + ctx.Menu = { MenuId = 0x0001, TextId = 0x009F, PrevId = 0, NextId = 0, BackId = 0x1000 } + ctx.SelLine = dsmLib.BACK_BUTTON else - ctx.Menu = { MenuId = 0x0001, Text = "NOT IMPLEMENTED", TextId = 0, PrevId = 0, NextId = 0, BackId = lastGoodMenu } + ctx.Menu = { MenuId = 0x0002, Text = "NOT IMPLEMENTED", TextId = 0, PrevId = 0, NextId = 0, BackId = lastGoodMenu } ctx.SelLine = dsmLib.BACK_BUTTON end @@ -943,10 +1348,10 @@ local function loadMenu(menuId) --L[#1 T=M VId=0x105E val=nil [0->0,2] Text="Other settings" MId=0x1000 ] ctx.Menu = { MenuId = 0x1000, Text = "RX SIMULATION", PrevId = 0, NextId = 0, BackId = 0, TextId=0 } - ctx.MenuLines[0] = { MenuId = 0x1000, lineNum = 0, Type = LINE_TYPE.MENU, Text = "AR631/AR637 (NEW)", ValId = 0x1001,TextId=0 } - ctx.MenuLines[1] = { MenuId = 0x1000, lineNum = 1, Type = LINE_TYPE.MENU, Text = "AR631/AR637 (INITIALIZED)", ValId = 0x1002, TextId=0 } - ctx.MenuLines[4] = { MenuId = 0x1000, lineNum = 4, Type = LINE_TYPE.MENU, Text = "FC6250HX", ValId = 0x1005, TextId=0 } - ctx.MenuLines[6] = { MenuId = 0x1000, lineNum = 6, Type = LINE_TYPE.MENU, Text = "EXIT Sim to Real RX", ValId = 0xFFFF, TextId=0 } -- Menu 0xFFFF to Exit Simulator + ctx.MenuLines[0] = { MenuId = 0x1000, Type = LINE_TYPE.MENU, Text = "AR631/AR637 (NEW)", ValId = 0x1001,TextId=0 } + ctx.MenuLines[1] = { MenuId = 0x1000, Type = LINE_TYPE.MENU, Text = "AR631/AR637 (INITIALIZED)", ValId = 0x1002, TextId=0 } + ctx.MenuLines[4] = { MenuId = 0x1000, Type = LINE_TYPE.MENU, Text = "FC6250HX", ValId = 0x1005, TextId=0 } + ctx.MenuLines[6] = { MenuId = 0x1000, Type = LINE_TYPE.MENU, Text = "EXIT Sim to Real RX", ValId = 0xFFFF, TextId=0 } -- Menu 0xFFFF to Exit Simulator ctx.SelLine = 0 lastGoodMenu = menuId @@ -1047,8 +1452,11 @@ SimLib.DSM_Context = dsmLib.DSM_Context SimLib.LOG_write = dsmLib.LOG_write SimLib.LOG_close = dsmLib.LOG_close SimLib.getElapsedTime = dsmLib.getElapsedTime + SimLib.Get_Text = dsmLib.Get_Text -SimLib.Get_Text_Img = dsmLib.Get_Text_Img +SimLib.Get_List_Text = dsmLib.Get_List_Text +SimLib.Get_List_Text_Img = dsmLib.Get_List_Text_Img + SimLib.phase2String = dsmLib.phase2String SimLib.menu2String = dsmLib.menu2String SimLib.menuLine2String = dsmLib.menuLine2String @@ -1060,6 +1468,7 @@ SimLib.isPercentValueLine = dsmLib.isPercentValueLine SimLib.isNumberValueLine = dsmLib.isNumberValueLine SimLib.isDisplayAttr = dsmLib.isDisplayAttr SimLib.isFlightModeText = dsmLib.isFlightModeText +SimLib.GetFlightModeValue = dsmLib.GetFlightModeValue SimLib.StartConnection = SIM_StartConnection -- Override Function SimLib.ReleaseConnection = SIM_ReleaseConnection -- Override Function diff --git a/Lua_scripts/DSMLIB/img/rx_pos_1.png b/Lua_scripts/DSMLIB/img/rx_pos_1.png new file mode 100644 index 0000000000000000000000000000000000000000..032d602d6271d183b0ae9d5885b272f8586cc651 GIT binary patch literal 2725 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 literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_10.png b/Lua_scripts/DSMLIB/img/rx_pos_10.png new file mode 100644 index 0000000000000000000000000000000000000000..e755828df5ed8487957fc2cc639cacc1df46d1fe GIT binary patch literal 2805 zcma)8dpwhUAD%HYWp<9q+^-{*6GzxRD#zw2{dSI!YP2N_9KNe~Dm<9OK4 z6Ih=Ebs7Q&uB=Rw6tIX8JsoU8HT~*Sz(za->xu<|==oA>ge|}x8gcjp5d?yDZkEUm z1DF~JB$?}IhxLm0n<)=^;B^YowaAE#GkAaoD}(iw10=v`FjxhxADcw?_44YI1?#72 z#TqE*B07N?O_sFeFZ1{=EhHunl@0NTOQ&HiZOMzdj(lVP=X2MPJ$V}Gt3Rg1_MUkS@_T$5O4*;BxH8XS%>%^| z5d*g$%#=TB|g-@F+ya2@~_<# z&4Xaf2ahznZK&*gy7Sw9+vXHqTiscM!?k`bM_Q9tGao1YjN0m)_hpLUQ$?j%B`DlG zH&}x%R8Mh~l~2BojQl;>IhbDS?Om|pa+lH=mVOCg1OG%Li1o2sE-Yu3|CnKK+fU?5 zH=i3cZankmc7!3b*0n=OzV*pn{I<9}Q*2B(n;7~&Ps4KjsUU4n1CtF(Vx ziU!xE%cW#jhaUECppjht?DEN!xI_HGT0}1^OV;DQdu3k03qscnCLoYXwMzT}x#!z( z9{pzG`BiOn;TdnLOhC~0FE7wL{hAL{ov7Q9i*nGJ(iBQN$!S_;GxlT)^xwX{=ghIc zsN4bkUFIJyC8AkQcMe^~x1OrGrlgnD@}Gyt(uur&8Q)SBTnXLjhJHjo+Bb>Hnh zhritcIFo);sk46{Y1e50+M#1`gFrfj_|2rlV9K5L9dZQ2WvEP=Ovu3*mbw6qBat@PR(F+_ll*ID(TyMy_MDF zITJRFb05~GD_Bw6d%hh&Cd2tUT7>ufs#v{wjWka%A9-f!G!b!SS5R*|?qX3-Q;Xkz z7^%|wLM+C&KGeiPKJM#lk=Xm}&KyNf7`wh>b!jGDYMZgNLz>_zL;l;k9dZ*7NGTE+ zPqqkW{z6Jud`yUSDl*pS(}|o&Qib!ti2V7p@-yJdto(ty_+61>`S|%rO3qg+HQvi2 z+2DeGoJ(DOC1xxa${D${yU2+)^4SW2df^m1Kh&A$A#7kph9?w)=gew5zYJ6&+;$h+ z;Ti@@vJo~ZGj>URzf4P*PZ8QOgL1R4;sBAg7xDJHpNIli0%q@M2t9tGD@o^9# z#fO(9)5feTV%kxu{Zx=h0?SQ0g=mzrDPjjN7}~Ay#{k!S_+MPnYdJ1x3qS?lN3(V^!uhLs~)ZDv!SS0_{EJRTg; zEY?=QxRVVI6z=qg=lwO$5lOwhRs)HhcF>Cg)O>S-VB9pYyPdE5(6415uGY^wp2N(D&>@#1 z&)X#?Y2Ex&$aNsAgvPQkdO#Q6&s=ix+leaAd-z$2$HA{uF()I;mjNqczAQ9KxAub(m~URiF9-&$Y9m#>GmS^+ zjNRbXFpRR{xewI&vc2Ks&PB!@IDZ4wKNMau#zJ_yd({?!U;*LVA_Xh&l&TnbktNAri|Tcai=``&bi z9+hi#6%s54GS>BQ+vx{VMQMof3pufA7!sTxYXvBh$dH81&n%mvnfUHy==UE}M~m0B zaqH!lRwxvz!>y5R*b^N&wg~u6M+)*OU`K$dh|+Rdy@BFQ8UrhPuq%&$W=*IvHx1L` zSz%yJwgB^Kga5H^K1Wd(zr(|jwS48R%`Nsqf29P_fX3Q^mO9*p9NAdQiiKpgPK(^Q z;U~YDTfL{69uVtdm26l=jv;#pX<`O#mJWkf#-GthXG`;Ysjm4y^{<5WcdXk rFhFD#YGkzR0A2iF5{y8(mTrh{3@wz#z$BD`s0wnlceAUp#i#ujJfS<= literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_11.png b/Lua_scripts/DSMLIB/img/rx_pos_11.png new file mode 100644 index 0000000000000000000000000000000000000000..66d1c2bc2e6e7bb91e787c9edd05a3ec56a24622 GIT binary patch literal 3042 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 literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_12.png b/Lua_scripts/DSMLIB/img/rx_pos_12.png new file mode 100644 index 0000000000000000000000000000000000000000..1829cf22508d20e38168c58940f785dfd3f32917 GIT binary patch literal 2781 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 RctA@Eay#mdu0Z*d{|hYUQCR>0 literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_13.png b/Lua_scripts/DSMLIB/img/rx_pos_13.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0bdfd13aef3d045f56a3ce27392f36d0ce993b GIT binary patch literal 2677 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 literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_14.png b/Lua_scripts/DSMLIB/img/rx_pos_14.png new file mode 100644 index 0000000000000000000000000000000000000000..7cc9f4c6d9559400b4bfefb0bace0c3f851af6d0 GIT binary patch literal 2811 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 D%YU)k literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_16.png b/Lua_scripts/DSMLIB/img/rx_pos_16.png new file mode 100644 index 0000000000000000000000000000000000000000..37129718f4f45e8ac2968b23ad080a068b6c0f74 GIT binary patch literal 2776 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 L$J{YBXdLN31g%H| literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_17.png b/Lua_scripts/DSMLIB/img/rx_pos_17.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b82cbee3ee03fdc2e93b5c765c34bd11ea893b GIT binary patch literal 2629 zcma)8dpwi-A73Z5Sz|cpxWot*b2$hRxrJP#<8lxqR-uiZliN&oamytNtC&+cN#v3f za|zqT30e3dMca}&C7Vk!x%7MHyk5V*e}8WBJg$clT0-Gv=6QjaI3Giq!r)IQBOk3%lsyHq%5t?OAl?v-NcJ z)`G^*U}+2?k50F=bT2hnD$;i0nnd>XIA+OEA|oQg zdB~fZ4uRlJiR6tHo#`q!1!`IWu*aBs5=CT(gS3xzL(e;tVsQolfQVH%KXCKNQeVC*YRB&Qag}2~ znO%V61=ChZ>w+0G&rdMK&CKz)gJ zB9$wxc(ms<9CM%34p#~((~M5I?*I5#hBwV7qxJHPv?;^`xJjxtc1pfJs9Co&`lSlh zGVKHpwu@*x)S&*$>`d)cGnzHik(gD%&1IJ82Qc5Z#F6gbyBChYAGRkqa^Fbs%8w40 ze0p_vZ)ehS#OoU2((S9gNY7nYqie{jAh=0VUaD@zZ$i5}+Vd{n;Vf32TEMx?1`1k8o9TFx&Eo4}iT6Dyh ze@6DwY}1Z^Hi~6zBn0W{2a2{Q9{mC}^!Woc6L)j+l8@6MNA|pY8kwqs~E=5)i0%<9_581-a3PVsS5yJzzXbStF97damwSx@C$E z|B6&Gy8v1>ocg;+n}-Z;>G3G{xhvtOx+`hAEc20uve7y6R03i1D=eCWcvYH>JizY$ zeL-n!Zcv#XJM{$nt}~g}5Z2A~LLy!k#R~TNHbpp7pC%=DjjhMD)FrQc$N-!M!^s2y z&O$X~dVAk=rCE2Te<#qLa^$fO!H4$X`;Tu=Z&`8N58H?1Jiwpvq^C{F7jX38aH$@SKV*EPx3}hb0+H>K)S7*T7?#CmSB3u^&ndjgU8Uw+ zX!(l*RnELsr5n;j)pn7wJlmY9)ha?}gAq z+7gUiXx52>{kRj9$#D6mPaU_iHEi)$lh^atTKMcr+138bw0Wa+Gy8}eXpc?L*p<8m z>`BObUs3dW*~voX7hA=eA$m=hXO2_NV}fd4Rr&sT+W5QwdH?SVPfXo4%WC zy63eXOz(&oX4zo(T^vtOQDX1{FDQXtn z-i=ga&#rH7ZQ!U?Uu^i3dPe6uuVOe|Fd$*7pL=>qF_vk*RPNq)3$pc%zgk^-Qobj# zF1dUSpHBjEc~&HmiuE_B&2Bus4?UCcfr`X5V!t9?9$8(RxTw?sv17|&2w_$@K6xYA zE^H?q%Li2o0e>w0r^XM3%eRi%S81E3VvFU1hPK~0I{y#1P{Iw;@|mFvX3q=$3h^H4 zN=v0aP4v4xJ~)r!T*duCU)L0lHZ?p~GSeBF>^}idZY^9mk*jPZgWDo4I9b{P0a3I( zTXm6Gbw%ya{%=~R;Rpk=f&FMML_xP_+9cPlM-ji{TkWMzMW#MHdejy#f=7@4SZ~hh zOg0@-Z?Gf|w};gA95@O@z$Q<=_xTn*!be|vEc3TYP4dDKdV^H}f1^Y7aZuP`ovpk< ze0=;8Q4-3{QP5+m={*YVI5u=~9;hD~e(smveYx0m@K9c#UADMz)dS&YVJ+T{{^`!@ zjQJp(F`ej}BWT7<)>9lMYum!Q3F-xfg;{M6>`YAL`1I_yukXTkF6?T@eI%D@M~aar ze}3C4d(b38VrV%pYOs_+HoAt?zGV_AHS{5TJW+6V?l)TZbVs5rpAMTR&JC163ESVy z@pA);)U~HXo$C@lL{Z@`6n8lDcSW`M`OB@-E@Y!Yj~|BnqBO|qDcHHHvE(BtTH?AO zl=^$GXam2o!uX}upW^7O3E^5#*ce`4eMa7Wg(rOUaj*q7=7rT;YML~&>_utuLWm`e zIgssqO^Gri6&BEV*q(4o?7vApS6^TGp=CM$^!YALIXSsTNaCHjazjCfEqYij5Ue2% z5&f9GC~g&lnOM#(D9E(xn3(pQuqo^ZBzuq#HoxJTq`I5nIr~h|%fsbX3Vhd%hiC3{ zsni3n$uCBl(caX}a@@01r<=**;xDdcm6~2yXTXA=Xl@oi?3`C9Sa)(HO0r(keO_y*eY$Bs)$-fgHAi5f|)5b zQzcq!hFT(;jwXg0TPY%g){?}iC1}k}XMW$`-yi3m``)v>?|IJqKF`fL?dztjctBA` zMn>7g-8BH{UjpqCcrWnmzMTdII@zQEHy4@OKHc|#0g6WZpk-v9=0kU|@_-G&yN4vn z$iUdrCVL+NI|zL1_i#m@C4?`RrsD2Q8F2iGqCnHHD7nU`VwOfrDErYo)o-C``;{*$ zsNHkUGgJ>C=8pZf?vi>hSW!OSz_8L zR+l!f*SMFXoVXaT$+m0!LK8O@ru{~`wu)xGDzeNfR>fkmyDQrp zBED_>WM@uJP90v`Q`N|<e#;dE_llms6NlGda~MrvRfw zMn+=!7E~I?(s*N6CbK=(OKnNO16sbQ-Y@c1X5$U zyo9@tH(lXZRG8Ws8Oc)f@+c5dz{)ldgi8KFTbP#66+j}hz^4GBakw*fq&8D>&D&cE z_nLum-sBcriPx9M`C>6XxJBbowyG8xh2}E-L!09=-R>Naw~d?FPtDKIk_Zy}hDse$ zr=xfex_BkFS@V6R&{*O9)&a}~Fce*47^Q9shj*te4rhA(U$NPWwb($3yPRZyNb~jU9ec=lt}}n6A_H594mTtTBaOjT$+SXU$`&pU>X{T1lRrSM2yY3)ThI zGP@Pp5F=ZXZ{<9%TiunR&^`FbC!;lGaqo67VDV+;_I9>a+r&>gwxBci;){=6ju@Wx zgmS04@^{{&vX>h{a?*qZg^_8gg<6*3N>)dYrwWz)${clkzi1<`axRyeVfc$R=NrGI zTVhbO99D1MeMHc0;)i##oSvSpZ_?G-X-CkMx@l|l=H+n6C(X83-H5n52dpEgp%t3p zzbhyo0Qo)m3L<>dh*&~ACvMyZ_J-8QtLf<}uUd@t|MWFq`JhdwH@)EmWX4%~K=%{_ zN}zLJxwFb@uSBvMO(SLf8Ge*d$rms%9k8^WO*M5Uwxsbg+kWawK2fpu-7{ ztk#na@J&ZY)c54y*(B$-E&(kkCR`1;5U`bpPs_!lp-nh(In7$vJ!tvFb@Pr4byG^h zBt5NF-a%iZB8U+#2AE^|b){Fg?zOm)T0QQXW?Y5``>|-QguguAj1;v$ogAjyCq;aE zGdSbJj{FjR!%bSa^*Be(Tu5K-kb0}tJhY4P+- zF3FQC(oWA&cLhWBIcPiMzK<+snqBqPzy2sUn7i-*DDBR+#4SZp?uz0owPY2`4fv*A z`y|}2tdl*Sz@3Ntm7_A_Ct75K9-oDTH{o<}ENd~{>qRldvtas!l)D*8Pr=bW&vL=l z$@pP&H|n+7wS9f!fe8*?X>O@q0`IO z-;v{7vC}qlqw0#k)3%)UDzfN$!dMGBO(vX_ z=IxJOs;rcKx(V}f%@c0yGwOI7i)}-*>o1-|(`?aP&fDKopiz29Z#n_&fbYrO$G_zQ z`CH>NHC-VWQ1u*GfO;aM57zskxd_J*X5DKego&0#*#4`BCe^#-bFlvg3wKXUJjPv7 zJC`=!ZU~5P9VE46mTnlHKjOqFk@eE_xnD$}n@r zHB~aC85SJE)!?vlvzdzo^We<*}_hWEjp#bsUu-1mk6bkmm{=5lEZ^&3s&3Wsy zHaEo6vfn}+9?s1j-t?8f`|e%LpN-c)Zl(N|oeloeVEE>d|9p!wXvv~Uy}7NzmoMFE zN%eM#H&^F;X!Ys#ZeA@=sZfO#8MZkLwUdanz*BZ3xgIV_1}e3VnnD+8>5Z6XGwKs1 z1S_m-%tIh4$ctNsE){#F>yiPbM8mUH^*xG&yFX9|>I%d8IO~`uC*=^>NqZ8wpk{Txn?fu_tiP)|KA_a_xV2G=k_|zH2PQDy&E5t?;~=Jig;W^Y84Uu}WXW#^L4Y+B=iq|} zffPEo2RO$-K@IrUkFiC25d1$C#-=-QHM(nl78gos8LFa*AKqF(U5P3>q=8ZEVa*H6 z-n|-UU{IguxgRDJ-#U_VJ_N6*a>c8hjwQzUC2`)n!UgQy*wlR|tMC{xn=?DMgjy|F zI=S!b>fU`MSb6qzDH&G&2yQDYZ;mEa|35GMJb0(+q*Fh~_JS)>Hi%hQ7dQ3#p-fxc zk~HVRw7u^=<4bnbD95eMH9^g#9u}`HiL$nYtbH5cBP(Czc((~Z#j5bCO38z{y1IT{ zEInJyUlsE@hG>4tN`29HCdHzn5z{PtToVRwdrM3O=|{%SaXPureve5t$r6h(n7 zoR|m{9C@H=aG?KI? z9v=1{4tetkJr6j}=eERlJUNp?B%6K)blbzyxeEwN$+3#JO$z>7v|j2M;f>FjK`k$i)=9?CL1 zUtlos_>>G`VWO+rohK0XWZ?j$_{h_@+nqGE5>Eq2K!$W)WT=_)GY?p>atypuVn2;Q z;H6SNHNg-zd9mRtdd6?BIF+HmFpBa26j~_#x8_rf#Guc&S60v`*!s~mKxAd;>K*eTwX)NzIbh5NjRdxo#OnJOE zRG!@l4SS$@2Bx&brO-U*EThe}5MSHIZC%Wz!`EsIo4CbswN&P@zc!w~G z+YCusTZA0-Z7?h_jq;bw3{_RHS;iyswcm}&lmvI(HVR)@B$V=ou0fXGzuY;+DO3|7 zXf(eT7M7QqR-dpDL-@M&1(&9*!^d^&gX3417|V%#HIr+SrHXmGZMNH>wO9IesWZCj zCx4cz3k@^4Z-&QGF~Qjv3__B#>fa&09zIBonyOC>ov_SSC`WothSa&<$B}dS7mtb!5 z4WsbETDQj-AR7a>0t#nNjLB_y&bE~7&HNirIn0p?EG9+Wd;`rMw4z|{CcxCrz_gGB zJY|wLXZ9uzqHds?U!B9>A2qiyhn~ zS>Nib_Dmuq$p6XO=Gt-gugAR!=hL6T?BDE+$RHq+cvF4F9i2QOwePHdD*?=7B&gB+ zpPRQ{9XLEp3g?^UrXPn(Hbp`T+y%;SvA)}u+`kZMv&~eGl(C@F+fykhM}gBk`NG(D zJP`O>rUzd2S-+t_Jh51NeDiskBq2^*h{!o}+k2YP#gc)#Eu(N{IA z{;H|!8sun*W`ydgts^}v>RosCQp~oPH;@R8aqG_Nd-Qa{Uh|MMh2}Q`8)hFrEtAX(PEpUh(+A_1M6ZovTPI}AXQFF%2sO0d zSYc$>HK)I{w*-x}Y>P=yu_kFopI&9=C4w}oJ@X0Zt+Y}$ghHY7M2I{exKS*`p{IT= zCTvgq%WNGS>USwuVk!*wvO>=9z9xbqh-`S`n41zep!cRCtTLnb%a4OJKY5CrCmyI4 z<^@!$EZ#XOI{FylXxoU;yZ<4C%-Un&mR-_(tD3 zZB}lmE;vkBtH|OYyOerqW0m)`nYIlpLdUF+N7wQiqI4GT8#EDCczj5Z{&Va%P z#A_@EM3r-MM~*1tB8Yb*xy{Urj+}Shv+gj4)0TkFAq({@)4l(^?CQO_9mEPH)_2nIxQDsrS3AQtAYh*L&*bJeo zyPH+u7e1#OuHI8@owQ}ijyvsy6hv%iAud6qv!KfYFLI)4PyTL~LEJ9La9#VpqLV>$ zc+SfHEiClTi+>896}o_bw81HLx0*@&SXD=fUrUTpMLEKf0K=;65jcM<;=@vLD<4(Z z3re2f3sTKyB9wHcD@N-$DzPKV|CMAID}np&P+D5rt^3*8f$%v{*X?vffYLwPWs)|@ z+6`M~prKFg!AM3<0^=2u@hT-t!`kjh5U;Gs$MTVPO>o&y6BXerb6g7#=Y;`{!9=}( zZHtqs%hUZbqV;rl~&Q=9|Tx?5b2qwXXHom7~rWv*tc`M?v$z0~t|sG-{! z8@z@h&2rE9w`}Y?=ull39oL#?gslD67vK|MT7MC@;ry?uvOg9gv6ksR_TBn>>KM@T OfiS0CY-u)u#Qy%#-l`tQ1XEKHw?!>YC9y;)K|LB8%l+x?Jok@t&U5zjo%j9T@5}aZbC8i#krWXTk#Tag z_X64hpoD_Ofx0&%Sqf+l;k+E|L?}$PMW6%1qFvDu6{bgg{Z2Vg-Y7ngn zcXn0pQkLAqyI`Hy{U40l1+4ie0_xBt?q%mM{5I@v@jt^Ps}@G5u%TmkTG&0ZznOpC zE-SE@3zyPLN>RyzDvjC_o9>Hi6UEG-TF2^Az`v859PC?Qdkt!8t9FY&wSGmy+J%kqQo`As{i!6K1W+`+HHn88Y0~ zR!htCf4Ho1do#J7)n{pG5^@>8goFffjeZB71{Q+i_I9jTb)GsTLIE&G_xUR{#iS{F#js)60fmN2Dh zdx$nMy~*{q)14zU)sqpowh7m-pNKdf)FZORC_}7K{5v@Edd@xcdtXie0y0}TyE5@q zR09zv&1&#LSR#=cypefweMjsn-N^R^(f9dPF_Vi;B5zrSk<}P~uoT4=ihvXs7jwjA zRC*pcm!!(6p8{E%1=B%z;pde#{`(GY%={~wGxXc?b5MkpW3G}B$DvSz=KCTdr3`e$ zz0xM-o<*cArZGT0pfldwh0J%yi|PRo`Xwvo8t&pZufA>Yi5jQ)2kW;!jOx!(TzmV( zms?k7a1ji52Ec7SiMFiG!9ALK9xh>WsTq88$(owHuW{{74aBd`LyH8_?JN9hU^}So z=86idi;&P7(x0=&tgsHA`CW7Hu1V%3#;4_)IzutzM|FYeY9^$=Xgfi`r}5hF0A!%? z_H+MZ2YjX2xE>fI-j%eg!UJ16Ftg96jy~~KHuktL!tm*!g)C1zU8_8u5ES6rk+^+4 zares&lA+?Wupvna(Z<5Dn!kO04&bAS|-X`&zo*B@>b zIVLb0uN_$K1r)OiCAY!Yo*z^u!SlVQ%Hxzc>lW8ow@`#Hpu5KYDgYW5JKG!B2`YSA zcBm+VFY48m7)N@JkE4#vnh(3R#muMTcnkqtm(i8ECA*(zV~tGO`JTtlzjLh3J$qZIeZuoV ztfJM3Ix{R2GC|6FWuOX$V$`32qmqbmJn6#$inBkI>U@xu6X@gB;Hx9G?!m>Z6_UUm zpu9Mn8mBP>vZQ?$KPWa6-r)c`_ zl|;cRTMpNKlPf(^(&!n(t`$F!fUOG6e`tt=`w;qUo3+vS`R3o=DTS@Pp9|akbaTRj zqh`QAJy3srIehz_vS}4uU^_R4qzDWyH5)M2diB)xvKE5EuD?5ErQE`>sE%(d-G+rJ#)ePYkVARl9e`D{U!^}E4ZTl>R zPY}D-%2Z)F?s8>!$LsR>G{%xnioCM2#Bdb~u7OIjVMISHHxH+8ejLwKHVKffg>+kM zJVa(eXB_+ z7;dF=OKuZQ1V;lqLszFe*P4QRg9@<6{M!#7;rV2^R3X*FVw#q$V;{$yVg~YAZK60< z296dpH*lysaa+FY`l3AJ%cUzh-2{2y7$|C{9i-)lp}}JLHwOv!RW`rL=Kj=|Wia+zt@kOtGT4g3>jm18(Du(fAvW&)2${*5^f06z>puNDaR@ z18VxgXH+`fw#CkW!Xtw1@zp?1kh<^%&>7Hy1pb=<=`6n4m1)#`Xf7P-<^b85h|?K2 Kdx~99>VE;wW36xi literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_20.png b/Lua_scripts/DSMLIB/img/rx_pos_20.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab286e7008e79bd1070977175565fce887a94c5 GIT binary patch literal 2674 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 egI)5rtPc@*#f literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_21.png b/Lua_scripts/DSMLIB/img/rx_pos_21.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef1d29c99e80641c043695393cb0ce17ec1a7ff GIT binary patch literal 2735 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 Vda~hzD?pM7I_&J}RPGo=|1WvG42}Q* literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_22.png b/Lua_scripts/DSMLIB/img/rx_pos_22.png new file mode 100644 index 0000000000000000000000000000000000000000..4037dfe14d8870d469acda68f23c81845df8dde7 GIT binary patch literal 2698 zcmZ`*X*iqN7mqcu$3FJdRuxOsSc1|RYNyLos@9-PDWa| zSlW@&X~!B{xNY+{vYmpp8LG#o_p>&zw;CHoUaR-}$FI6t=lhL7-DPoF3N~V@=Wtpm z^}scsa@)-Zh0+*}7w6h-HcWwFkhPo4=J)os?pd==h<3mIl~~rX4A*PLNVoI@jvgZEue|FWoJ%wHb6z$ zdZ?h`Qjt2Z7KtEhLR#8xnN=bi)S0v`<7#i8lGb^Wb5VrE$IpK~#P09y()mT?yPWRo zq&5b=;#M)c0#P;!k+O(g@-x-cb4r@kDUJuh zl7Vj@IV^3hEnvd!?CdDUJp95b!==ZBSW_*MdL9kxIy*NcfVfy&q82+&(VjFZf@=zV4YIo zRG2QNYykoL@35Db$YHcO@7Al`bUK|R(fdQ)32KhCUtzqa+uc^~E;flsFXAbW5n8W&;RfT?1Pk?jMI$B}__DLI z2x$l{AjhykNkY<-arBcg8hNQFO^ALxI%9)1OSz?Bk}f2xCv2EXu+Nt0zG3@rO4F6huXd@Q#OrvHg@e2=FejT3c0W~;rztokO({Ht-~0!k(WC7EUiaN}O?uzt6jD%1Cj+-NDkx zkqK?>Oe4G=irae=*~5ByM{TLxHgnFs=6v@$ZrynMoQRT{RH;D#|I|Y}G1D4F%fz3Q zfBp?hZ4D8U(MeG-3gIn;qeU5QUSCpoi}EBtZ$qAi6R?eHb{Yo*PL(iBYQrQ z@_CgZEXVCubd>MgOuKoB`_?*BsLU){Flbs;TU(If-9V>gP>PMi@I|IyxRQ&@cJtR~ zr^sQaTRUkhY4VQH+X13~e*{<4$hT-8m|=ByzM4UTcblCB*g*{#$fSqW#fFWDNe15~l zh!yPYR)7DL)pj{IhBedOw%xx;X1p#2uY^9|*p|kBc~ZkGj><%ua`0)T4jFKG>e0y0 zC}}FGdQ)kgCWzRt8CsTqAh_WEv~@@OQq{cR*+qdavsWzp96x}C@cdB-e$Qn=s}fku zw<(mt4L?VqDo$}@CgILUPL=aI{t?h0O3d9U6FG9kxN^ErDhfR;^$yo#EcMI%T^sBJ zfNWD$zQPo%1|nrjQb`VZno9tPF{8(NP1r_9rIoF4!Yc^@`hm4){H=U=4<8izxM+_| zWUcJb8U-0@m&(oOH&e06URI;RgU{2w4SX;Yc;z|f9%$pkcGA}B5$CDW0bJ7e#R)?; z@N8^>_SrdUxO1WD!7UVzO|EqvT$T!(e3pvbsP(M#u@qb2U*zd) z0>>3*N7v+!@+}Sz7(wHn-~MpyrZk+t(T;oI2A2P&V}W*evXqAX6AoD)f1&Y`m# z78z;<$;6$xDWiMSfAW^I!9qh+*j4eJf6Ohw2uy_6Yx1vErx7gqiq&s&^ZlRVVE`?p zzY`i_;MTsLHPzD-We{>?uXT4P64#gpUP6;g(G`@60xtn&>P86MvG{>h2`{nH>~eryZgtbrGkq#Ohp zAX&l(?eX_RBjGLC_V?BOBD_XXUq`CJQOq7+7idB!(6uNfc3H{8#U}b*EtfBt{&5P= zd4Vd>8m@eslH)Yw2^uk4(BGGi97;1(x*XK2YJ0QG`lozgEP#F&$j#5^ZA>CGc1C&U zkVuH}^y=3QZn9(EWk#VgIs_Ca(}#*-SMTAYAez@R^CuWGkx2Ny5MF`y;?d2%4Q~f`BI#IV*$l#~zCwis~yM|EEE~ zddG}9sH&;a+3eWybolYe6DP=ZkmQ3rkj9fY_hw7+-7gF3s4qL@jY9l_C>dfZ{(6{q zAw$csUg~iPY3a1Mnwhq^yh9ciiYsEF$D|IfkuIAcR%A*{`Oq&~oo*qBAClg=YB%#;=5w0``|gI#164DK=s;xh-~>8QR2 lxg*aB`oFW7c#g2#o{$_v7@}|L00HJlkb|wOO|7*b{(pce1D^l@ literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_23.png b/Lua_scripts/DSMLIB/img/rx_pos_23.png new file mode 100644 index 0000000000000000000000000000000000000000..d767b2fd479318f0832bc3a16857ebd53d4de8a4 GIT binary patch literal 2743 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 Yi|O%B_aDr|0nbX1tBV)D);W~^Z+62lH~;_u literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_25.png b/Lua_scripts/DSMLIB/img/rx_pos_25.png new file mode 100644 index 0000000000000000000000000000000000000000..ba84f610d3b0603682b0d27a84b6a92321977ad3 GIT binary patch literal 2696 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 literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_3.png b/Lua_scripts/DSMLIB/img/rx_pos_3.png new file mode 100644 index 0000000000000000000000000000000000000000..8510177dac2c9c1ba378d58f6bb144b0b3a98622 GIT binary patch literal 2992 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 literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_5.png b/Lua_scripts/DSMLIB/img/rx_pos_5.png new file mode 100644 index 0000000000000000000000000000000000000000..5af94fe1992db7381c8e6343c58f4423d7fe241e GIT binary patch literal 2575 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 I=pIG>7ZyR*sQ>@~ literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_6.png b/Lua_scripts/DSMLIB/img/rx_pos_6.png new file mode 100644 index 0000000000000000000000000000000000000000..3668db1b1ffc7b4c26a44b634acbeafbe8d84e82 GIT binary patch literal 2548 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 literal 0 HcmV?d00001 diff --git a/Lua_scripts/DSMLIB/img/rx_pos_9.png b/Lua_scripts/DSMLIB/img/rx_pos_9.png new file mode 100644 index 0000000000000000000000000000000000000000..948f858b757d08708633944311f157c0c6bff86b GIT binary patch literal 2834 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