mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-02-04 16:28:10 +00:00
* #751 DSM Enhancements #751 DSM Forward Programming Enhancements (New GUI, etc) * Make both work on EdgeTx and OpenTX * #751 Turn OFF simulation by default Distribution code with RX simulation OFF Simulation should be only for Development * #751 Update Readme Documentation Updated the Readme.txt documentation and removed compiled luac file that was check in by mistake * #751 Fix problems With Reset RX 1. Fix problem when trying to Factory Reset. Enter Bind Mode. Save backup, Restore Backup 2. Found a way to advance on the Gyro initial Setup menus.. a bit of a hack, but works. 3. Handle RX resets properly. It needed after initial setup * #751 Cosmetic and Show Orientation Images #751 1. Fix problems when text contradictions between Menu/Line Headers and List Values 2. Show Images of RX orientations 3. Able to Hack getting into Initial Setup and other menus who was failing before 4. Custumize the way Flight Mode reports the Value on Screen * #751 add check for required libraries Add check that the required files in DSMLIB exist * #751 Write documentation about the protocol so that we don't forget later what we know, and enable others to understand the logs and maybe help solve problems. * #766 Change the way to detect that the files exist. now works on both ETX and OTX * #766 Strange Flickering in OTX Strange Flickering happening on OTX. Refreshing the screen on every cycle fixed the problem * #766 Change way of dectecting EdgeTX Change way of detecting OTX in multiple versions: OTX 2.3.14 and 2.3.15 * #766 make editable Gain Values Gains and other settings should be editable even when they are VALUE_NOCHANGING. Flight Mode is an exception that is handled properly. Right align numbers. Co-authored-by: pascallanger <pascal_langer@yahoo.fr>
This commit is contained in:
parent
2e7b1dc904
commit
5901bac374
@ -156,7 +156,7 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
|
||||
---------- NAME Part
|
||||
local header = line.Text
|
||||
-- ONLY do this for Flight Mode (Right Align or Centered)
|
||||
if (dsmLib.isFlightModeText(line.TextId)) then
|
||||
if (dsmLib.isFlightModeLine(line)) then
|
||||
-- Display Header + Value together
|
||||
header = dsmLib.GetFlightModeValue(line.TextId,header,value)
|
||||
|
||||
@ -180,9 +180,8 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
|
||||
lcd.drawText(x, y, header, bold + TEXT_SIZE) -- display Line Header
|
||||
|
||||
--------- VALUE PART, Skip for Flight Mode since already show the value
|
||||
if not dsmLib.isFlightModeText(line.TextId) then
|
||||
if not dsmLib.isFlightModeLine(line) then
|
||||
local attrib = 0
|
||||
value = value .. (line.Format or "") -- Append % if needed
|
||||
|
||||
if selected then
|
||||
attrib = INVERS
|
||||
@ -192,6 +191,7 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
|
||||
end
|
||||
end
|
||||
|
||||
value = value .. " " .. (line.Format or "") -- Append % if needed
|
||||
lcd.drawText(LCD_X_LINE_VALUE,y, value, attrib + TEXT_SIZE) -- display value
|
||||
end
|
||||
|
||||
@ -307,10 +307,9 @@ local function GUI_HandleEvent(event, touchState)
|
||||
else
|
||||
if ctx.isEditing() then -- Editing a Line, need to restore original value
|
||||
ctx.MenuLines[ctx.EditLine].Val = originalValue
|
||||
dsmLib.ChangePhase(PHASE.VALUE_CHANGE_END) -- Update+Validate value in RX
|
||||
ctx.EditLine = nil -- Exit Edit Mode (By clearing the line editing)
|
||||
dsmLib.Value_Write_Validate(menuLines[ctx.EditLine])
|
||||
else
|
||||
dsmLib.ChangePhase(PHASE.EXIT)
|
||||
dsmLib.ChangePhase(PHASE.EXIT) -- Exit
|
||||
end
|
||||
end
|
||||
return
|
||||
@ -372,8 +371,7 @@ local function GUI_HandleEvent(event, touchState)
|
||||
-- Editing a Line????
|
||||
if ctx.isEditing() then
|
||||
-- Change the Value and exit edit
|
||||
ctx.EditLine = nil
|
||||
dsmLib.ChangePhase(PHASE.VALUE_CHANGE_END)
|
||||
dsmLib.Value_Write_Validate(menuLines[ctx.SelLine])
|
||||
else
|
||||
-- enter Edit the current line
|
||||
ctx.EditLine = ctx.SelLine
|
||||
|
@ -146,7 +146,7 @@ end
|
||||
|
||||
--------------------------------------------------------------------------------------------------------
|
||||
-- Display Text inside a Rectangle. Inv: true means solid rectangle, false=only perimeter
|
||||
local function GUI_Display_Boxed_Text(lineNum,x,y,w,h,text,inv)
|
||||
local function GUI_Display_Boxed_Text(lineNum,x,y,w,h,text,inv, isNumber)
|
||||
local ctx = DSM_Context
|
||||
local txtColor = GUI_GetTextColor(lineNum)
|
||||
local frameColor = GUI_GetFrameColor(lineNum)
|
||||
@ -159,13 +159,17 @@ local function GUI_Display_Boxed_Text(lineNum,x,y,w,h,text,inv)
|
||||
else
|
||||
lcd.drawRectangle(x-5, y-2, w, h, frameColor)
|
||||
end
|
||||
lcd.drawText(x , y, text, txtColor)
|
||||
|
||||
if (isNumber) then
|
||||
print("DRAW NUMBER")
|
||||
lcd.drawNumber(x+w-10 , y, text, txtColor + RIGHT)
|
||||
else
|
||||
lcd.drawText(x , y, text, txtColor)
|
||||
end
|
||||
end
|
||||
|
||||
------ Display Pre/Next/Back buttons
|
||||
local function GUI_Diplay_Button(x,y,w,h,text,selected)
|
||||
GUI_Display_Boxed_Text(-1,x,y,w,h,text,selected)
|
||||
GUI_Display_Boxed_Text(-1,x,y,w,h,text,selected, false)
|
||||
end
|
||||
|
||||
------ Display MENU type of lines (Navigation, SubHeaders, and plain text comments)
|
||||
@ -178,7 +182,7 @@ local function GUI_Display_Line_Menu(lineNum,line,selected)
|
||||
local x = LCD_X_LINE_MENU
|
||||
|
||||
if dsmLib.isSelectableLine(line) then -- Draw Selectable Menus in Boxes
|
||||
GUI_Display_Boxed_Text(lineNum,x, y, LCD_W_LINE_MENU, LCD_Y_LINE_HEIGHT, line.Text,selected)
|
||||
GUI_Display_Boxed_Text(lineNum,x, y, LCD_W_LINE_MENU, LCD_Y_LINE_HEIGHT, line.Text,selected, false)
|
||||
GUI_addTouchButton(x, y, LCD_W_LINE_MENU, LCD_Y_LINE_HEIGHT,lineNum)
|
||||
else
|
||||
-- Non Selectable Menu Lines, plain text
|
||||
@ -206,14 +210,10 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
|
||||
local y = LCD_Y_LINE_START+(LCD_Y_LINE_HEIGHT*lineNum)
|
||||
local x = LCD_X_LINE_TITLE
|
||||
|
||||
--if (editing) then -- Any Special color/effect when editing??
|
||||
-- value = "["..value .. "]"
|
||||
--end
|
||||
|
||||
---------- NAME Part
|
||||
local header = line.Text
|
||||
-- ONLY do this for Flight Mode (Right Align or Centered)
|
||||
if (dsmLib.isFlightModeText(line.TextId)) then
|
||||
if (dsmLib.isFlightModeLine(line)) then
|
||||
-- Display Header + Value together
|
||||
header = dsmLib.GetFlightModeValue(line.TextId,header,value)
|
||||
|
||||
@ -235,14 +235,17 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
|
||||
lcd.drawText(x, y, header, txtColor + bold) -- display Line Header
|
||||
|
||||
--------- VALUE PART, Skip for Flight Mode since already show the value
|
||||
if not dsmLib.isFlightModeText(line.TextId) then
|
||||
value = value .. (line.Format or "") -- Append % if needed
|
||||
|
||||
if not dsmLib.isFlightModeLine(line) then
|
||||
if dsmLib.isSelectableLine(line) then
|
||||
--if (editing) then -- Any Special color/effect when editing??
|
||||
-- value = "["..value .. "]"
|
||||
--end
|
||||
-- Can select/edit value, Box it
|
||||
local tw = my_lcd_sizeText(value)+10 -- Width of the Text in the lcd
|
||||
GUI_Display_Boxed_Text(lineNum,LCD_X_LINE_VALUE,y,tw,LCD_Y_LINE_HEIGHT,value,selected)
|
||||
local tw = math.max(my_lcd_sizeText(value)+10,45) -- Width of the Text in the lcd
|
||||
GUI_Display_Boxed_Text(lineNum,LCD_X_LINE_VALUE,y,tw,LCD_Y_LINE_HEIGHT,value,selected, not dsmLib.isListLine(line))
|
||||
GUI_addTouchButton(LCD_X_LINE_VALUE,y,tw,LCD_Y_LINE_HEIGHT,lineNum)
|
||||
|
||||
lcd.drawText(LCD_X_LINE_VALUE+tw+5, y, (line.Format or ""), txtColor + bold)
|
||||
else -- Not Editable, Plain Text
|
||||
lcd.drawText(LCD_X_LINE_VALUE, y, value, txtColor)
|
||||
end
|
||||
@ -494,9 +497,9 @@ local function GUI_HandleEvent(event, touchState)
|
||||
dsmLib.ReleaseConnection() -- Just Exit the Script
|
||||
else
|
||||
if ctx.isEditing() then -- Editing a Line, need to restore original value
|
||||
ctx.MenuLines[ctx.EditLine].Val = originalValue
|
||||
dsmLib.ChangePhase(PHASE.VALUE_CHANGE_END) -- Update + Validate value in RX
|
||||
ctx.EditLine = nil -- Exit Edit Mode (By clearing the line editing)
|
||||
local line = ctx.MenuLines[ctx.EditLine]
|
||||
line.Val = originalValue
|
||||
dsmLib.Value_Write_Validate(line)
|
||||
else
|
||||
dsmLib.ChangePhase(PHASE.EXIT)
|
||||
end
|
||||
@ -558,8 +561,7 @@ local function GUI_HandleEvent(event, touchState)
|
||||
end
|
||||
else -- Enter on a Value
|
||||
if ctx.isEditing() then -- already editing a Line????
|
||||
ctx.EditLine = nil -- Exit Edit Mode (By clearing the line editing)
|
||||
dsmLib.ChangePhase(PHASE.VALUE_CHANGE_END) -- Request change the value on RX
|
||||
dsmLib.Value_Write_Validate(menuLines[ctx.SelLine])
|
||||
else -- Edit the current value
|
||||
ctx.EditLine = ctx.SelLine
|
||||
originalValue = menuLines[ctx.SelLine].Val
|
||||
|
@ -81,7 +81,7 @@ local LINE_TYPE = {
|
||||
}
|
||||
|
||||
local DISP_ATTR = {
|
||||
BOLD = 0x01, RIGHT=0x02, CENTER=0x04, PERCENT = 0x10
|
||||
BOLD = 0x01, RIGHT=0x02, CENTER=0x04, PERCENT = 0x10, DEGREES=0x20, FORCED_MENU = 0x40
|
||||
}
|
||||
|
||||
local DSM_Context = {
|
||||
@ -160,18 +160,25 @@ end
|
||||
|
||||
------------- Line Type helper functions ------------------------------------------------------------------
|
||||
|
||||
-- Check if the text are Flight modes, who will be treated different for Display
|
||||
local function isFlightModeLine(line)
|
||||
return (line.TextId >= 0x8000 and line.TextId <= 0x8003)
|
||||
end
|
||||
|
||||
local function isSelectableLine(line) -- is the display line Selectable??
|
||||
-- values who are not selectable
|
||||
if (line.Type == 0 or line.Type == LINE_TYPE.VALUE_NOCHANGING) then return false end -- No Changing Value
|
||||
if (line.Type == LINE_TYPE.MENU and line.ValId == line.MenuId) then return false end -- Menu that navigates to Itself?
|
||||
if (line.Type == 0) then return false end -- Empty Line
|
||||
if (line.Type == LINE_TYPE.MENU and line.ValId == line.MenuId and bit32.band(line.TextAttr, DISP_ATTR.FORCED_MENU)==0) then return false end -- Menu that navigates to Itself?
|
||||
if (line.Min==0 and line.Max==0 and line.Def==0) then return false end -- Values with no Range are only for display
|
||||
if (line.Type == LINE_TYPE.VALUE_NOCHANGING and isFlightModeLine(line)) then return false end -- Flight mode is not Selectable
|
||||
return true
|
||||
end
|
||||
|
||||
local function isEditableLine(line) -- is the display line editable??
|
||||
-- values who are not editable
|
||||
if (line.Type == 0 or line.Type == LINE_TYPE.VALUE_NOCHANGING or line.Type == LINE_TYPE.MENU) then return false end
|
||||
if (line.Type == 0 or line.Type == LINE_TYPE.MENU) then return false end -- Menus are not editable
|
||||
if (line.Min==0 and line.Max==0 and line.Def==0) then return false end -- Values with no Range are only for display
|
||||
if (line.Type == LINE_TYPE.VALUE_NOCHANGING and isFlightModeLine(line)) then return false end -- Flight mode is not Editable
|
||||
-- any other is Editable
|
||||
return true
|
||||
end
|
||||
@ -194,7 +201,12 @@ end
|
||||
|
||||
local function isNumberValueLine(line) -- is it a number ??
|
||||
if (isListLine(line) or line.Type == LINE_TYPE.MENU or line.Type == 0) then return false
|
||||
else return false end
|
||||
else return true end
|
||||
end
|
||||
|
||||
local function isIncrementalValueUpdate(line)
|
||||
if (line.Type == LINE_TYPE.LIST_MENU0 or line.Type == LINE_TYPE.VALUE_NOCHANGING) then return false end
|
||||
return true
|
||||
end
|
||||
|
||||
------------------------------------------------------------------------------------------------------------
|
||||
@ -245,7 +257,7 @@ end
|
||||
|
||||
local function lineType2String(index)
|
||||
local out = LineTypeText[index]
|
||||
return out or ("LT_" .. string.format("%X", index))
|
||||
return out or ("LT_" .. string.format("%X", index or 0xFF))
|
||||
end
|
||||
|
||||
local function lineValue2String(l)
|
||||
@ -369,6 +381,11 @@ local function ExtractDisplayAttr(text1, attr)
|
||||
attr = bit32.bor(attr, DISP_ATTR.BOLD)
|
||||
end
|
||||
|
||||
text, pos = string.gsub(text, "/M", "")
|
||||
if (pos>0) then -- FORCED MENU Button
|
||||
attr = bit32.bor(attr, DISP_ATTR.FORCED_MENU)
|
||||
end
|
||||
|
||||
return text, attr
|
||||
end
|
||||
|
||||
@ -397,10 +414,13 @@ local function DSM_MenuLinePostProcessing(line)
|
||||
line.Max = line.Max - line.Min -- normalize max index
|
||||
line.Min = 0 -- min index
|
||||
else -- default to numerical value
|
||||
if isPercentValueLine(line) then
|
||||
if isPercentValueLine(line) or isPercentValueLineByMinMax(line) then
|
||||
-- either explicit Percent or NO-Change value, but range is %Percent
|
||||
line.Format =" %"
|
||||
line.Format ="%"
|
||||
line.TextAttr = bit32.bor(line.TextAttr,DISP_ATTR.PERCENT)
|
||||
elseif (line.Type == LINE_TYPE.VALUE_DEGREES) then
|
||||
line.Format ="o"
|
||||
line.TextAttr = bit32.bor(line.TextAttr,DISP_ATTR.DEGREES)
|
||||
end
|
||||
end
|
||||
|
||||
@ -502,11 +522,9 @@ local function DSM_Value_Add(line, inc)
|
||||
end
|
||||
end
|
||||
|
||||
if (origVal~=line.Val) then
|
||||
if line.Type ~= LINE_TYPE.LIST_MENU0 then -- Listof channels only change on the Screen until is Done
|
||||
-- Update RX value on every change
|
||||
DSM_ChangePhase(PHASE.VALUE_CHANGING)
|
||||
end
|
||||
if (origVal~=line.Val and isIncrementalValueUpdate(line)) then
|
||||
-- Update RX value on every change
|
||||
DSM_ChangePhase(PHASE.VALUE_CHANGING)
|
||||
end
|
||||
end
|
||||
|
||||
@ -515,14 +533,18 @@ local function DSM_Value_Default(line)
|
||||
if (DEBUG_ON) then LOG_write("%3.3f %s: DSM_Value_Default(%s)\n", getElapsedTime(), phase2String(DSM_Context.Phase), menuLine2String(line)) end
|
||||
|
||||
line.Val = line.Def
|
||||
if (origVal~=line.Val) then
|
||||
if line.Type ~= LINE_TYPE.LIST_MENU0 then -- Listof channels only change on the Screen until is Done
|
||||
-- Update RX value on every change
|
||||
DSM_ChangePhase(PHASE.VALUE_CHANGING)
|
||||
end
|
||||
if (origVal~=line.Val and isIncrementalValueUpdate(line)) then
|
||||
-- Update RX value on every change
|
||||
DSM_ChangePhase(PHASE.VALUE_CHANGING)
|
||||
end
|
||||
end
|
||||
|
||||
local function DSM_Value_Write_Validate(line)
|
||||
if (DEBUG_ON) then LOG_write("%3.3f %s: DSM_Value_Write_Validate(%s)\n", getElapsedTime(), phase2String(DSM_Context.Phase), menuLine2String(line)) end
|
||||
DSM_ChangePhase(PHASE.VALUE_CHANGE_END) -- Update + Validate value in RX
|
||||
DSM_Context.EditLine = nil -- Exit Edit Mode (By clearing the line editing)
|
||||
end
|
||||
|
||||
local function DSM_GotoMenu(menuId, lastSelectedLine)
|
||||
if (DEBUG_ON) then LOG_write("%3.3f %s: DSM_GotoMenu(0x%X,LastSelectedLine=%d)\n", getElapsedTime(), phase2String(DSM_Context.Phase), menuId, lastSelectedLine) end
|
||||
DSM_Context.Menu.MenuId = menuId
|
||||
@ -1063,6 +1085,8 @@ local function DSM_Init_Text(rxId)
|
||||
-- Text allightment: /c = CENTER, /r = RIGHT
|
||||
-- Text effects: /b = BOLD
|
||||
-- Text formatting: /p = PERCENT numbers (forced if not in Line Type=PERCENT)
|
||||
-- Navigaton: /M = Force to be a Menu button, when a menu navigates to itself,
|
||||
-- is usually a message line.. but sometimes, we want to navigate to the same page to refresh values
|
||||
|
||||
-- array List_Values:
|
||||
-- For some Menu LIST VALUES, special Lines of type:LIST_MENU1, the valod options seems not
|
||||
@ -1072,9 +1096,14 @@ 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"
|
||||
-- On/Off List Options (TODO: i think they are reversed?? 0x0001 is OFF )
|
||||
List_Text[0x0001] = "On (might be reversed, check)"
|
||||
List_Text[0x0002] = "Off (might be reversed, check)"
|
||||
|
||||
if (rxId == RX.FC6250HX) then -- For sure in the Blade FC6250HX they are reversed, override
|
||||
List_Text[0x0001] = "Off"
|
||||
List_Text[0x0002] = "On"
|
||||
end
|
||||
|
||||
-- Ihn/Act List Options
|
||||
List_Text[0x0003] = "Inh"
|
||||
@ -1219,7 +1248,7 @@ local function DSM_Init_Text(rxId)
|
||||
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
|
||||
Text[0x00CD] = "Level model and capture attiude/M"; -- Different from List_Text , and force it to be a menu button
|
||||
|
||||
-- RX Orientations for AR631/AR637 (on the Heli Receiver is different, see below)
|
||||
-- Optionally attach an Image to display
|
||||
@ -1249,7 +1278,7 @@ local function DSM_Init_Text(rxId)
|
||||
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"
|
||||
|
||||
Text[0x00D1] = "?? Unknown_D1" -- TODO: Find the Spektrum Value (Orientation Save&Reset final page AR631)
|
||||
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
|
||||
@ -1259,7 +1288,7 @@ local function DSM_Init_Text(rxId)
|
||||
Text[0x00D8] = "Stop"
|
||||
Text[0x00DA] = "SAFE"
|
||||
Text[0x00DB] = "Stability"
|
||||
Text[0x00DC] = "@ per sec"
|
||||
Text[0x00DC] = "Deg. per sec"
|
||||
Text[0x00DD] = "Tail rotor"
|
||||
Text[0x00DE] = "Setup"
|
||||
Text[0x00DF] = "AFR"
|
||||
@ -1291,7 +1320,7 @@ local function DSM_Init_Text(rxId)
|
||||
Text[0x010A] = "" -- empty??
|
||||
Text[0x010B] = "" -- empty??
|
||||
|
||||
Text[0x0190] = "Relearn Servo Settings"
|
||||
Text[0x0190] = "DONT USE! Relearn Servo Settings"
|
||||
Text[0x019C] = "Enter Receiver Bind Mode"
|
||||
Text[0x01D7] = "SAFE Select Channel"
|
||||
Text[0x01DC] = "AS3X/c/b" -- Subtitle, Center+bold
|
||||
@ -1384,10 +1413,10 @@ local function DSM_Init_Text(rxId)
|
||||
|
||||
Text[0x0254] = "Postive = Up, Negative = Down"
|
||||
|
||||
--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\""
|
||||
--Utilities, Copy flight mode (Copy Confirmation, oveerriding FM)
|
||||
Text[0x0251] = "Are you sure you want to ovewrite the \"Target\""
|
||||
Text[0x0252] = "with the \"Source\" ? "
|
||||
Text[0x0253] = "" -- Blank
|
||||
|
||||
-- First time safe setup Page 1 (maybe ask to select Flight Mode cannel)
|
||||
Text[0x0255] = "Before setting up SAFE"
|
||||
@ -1401,8 +1430,8 @@ local function DSM_Init_Text(rxId)
|
||||
Text[0x025D] = "" -- Blank
|
||||
Text[0x025E] = "" -- Blank
|
||||
|
||||
--Utilities, Copy flight mode
|
||||
Text[0x0259] = "Copy" --- TODO: Check Specktrum..Just guessing here..
|
||||
--Utilities, Copy flight mode (Confirm)
|
||||
Text[0x0259] = "YES"
|
||||
Text[0x0260] = "WARNING: \"Target\""
|
||||
Text[0x0261] = "flight mode will be overwritten"
|
||||
Text[0x0262] = "by \"Source\""
|
||||
@ -1420,25 +1449,25 @@ local function DSM_Init_Text(rxId)
|
||||
Text[0x8003] = "Flight Mode 3/c/b"
|
||||
end
|
||||
|
||||
-- Check if the text are Flight modes, who will be treated different for Display
|
||||
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"
|
||||
if (textId == 0x8000) then
|
||||
if (DSM_Context.RX.Id == RX.FC6250HX) then
|
||||
-- Helicopter Flights modes
|
||||
if (value==1) then out = header .. " 1 / Normal"
|
||||
elseif (value==2) then out = header .. " 2 / Stunt 1"
|
||||
elseif (value==3) then out = header .. " 3 / Stunt 2"
|
||||
elseif (value==4) then out = header .. " 4 / Hold"
|
||||
else
|
||||
out = header .. " " .. value
|
||||
end
|
||||
else
|
||||
-- No adjustment needed
|
||||
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
|
||||
elseif (textId == 0x8001) then -- AR632/637
|
||||
-- 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
|
||||
@ -1485,7 +1514,7 @@ Lib.isPercentValueLine = isPercentValueLine
|
||||
Lib.isPercentValueLineByMinMax = isPercentValueLineByMinMax
|
||||
Lib.isNumberValueLine = isNumberValueLine
|
||||
Lib.isDisplayAttr = isDisplayAttr
|
||||
Lib.isFlightModeText = isFlightModeText
|
||||
Lib.isFlightModeLine = isFlightModeLine
|
||||
Lib.GetFlightModeValue = GetFlightModeValue
|
||||
|
||||
Lib.StartConnection = DSM_StartConnection
|
||||
@ -1495,6 +1524,7 @@ Lib.MenuPostProcessing = DSM_MenuPostProcessing
|
||||
Lib.MenuLinePostProcessing = DSM_MenuLinePostProcessing
|
||||
Lib.Value_Add = DSM_Value_Add
|
||||
Lib.Value_Default = DSM_Value_Default
|
||||
Lib.Value_Write_Validate = DSM_Value_Write_Validate
|
||||
Lib.GotoMenu = DSM_GotoMenu
|
||||
Lib.MoveSelectionLine = DSM_MoveSelectionLine
|
||||
Lib.Send_Receive = DSM_Send_Receive
|
||||
|
@ -148,8 +148,8 @@ local function AR631_loadMenu(menuId)
|
||||
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.MenuLines[4] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x41, ValId = 0x1005, Min=0, Max=100, Def=50, Val=50 }
|
||||
ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x42, ValId = 0x1006, Min=0, Max=100, Def=60, Val=60 }
|
||||
|
||||
ctx.SelLine = 3
|
||||
lastGoodMenu = menuId
|
||||
@ -165,8 +165,8 @@ local function AR631_loadMenu(menuId)
|
||||
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.MenuLines[4] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x41, ValId = 0x1005, Min=0, Max=160, Def=100, Val=160 }
|
||||
ctx.MenuLines[5] = { Type = LINE_TYPE.VALUE_NOCHANGING, TextId = 0x42, ValId = 0x1006, Min=0, Max=160, Def=100, Val=160 }
|
||||
|
||||
ctx.SelLine = 3
|
||||
lastGoodMenu = menuId
|
||||
@ -480,7 +480,7 @@ local function AR631_loadMenu(menuId)
|
||||
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[4] = { Type = LINE_TYPE.MENU, TextId = 0xDA, 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 }
|
||||
|
||||
@ -488,7 +488,7 @@ local function AR631_loadMenu(menuId)
|
||||
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[#0 T=M VId=0x1030 Text="Level model and capture attiude/M"[0xCD] MId=0x1030 ] FORCED MENU
|
||||
--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 ]
|
||||
@ -496,14 +496,14 @@ local function AR631_loadMenu(menuId)
|
||||
--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[0] = { Type = LINE_TYPE.MENU, TextId = 0xCD, ValId = 0x1030 } -- FORCED MENU (/M)
|
||||
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[2] = { Type = LINE_TYPE.VALUE_DEGREES, TextId = 0x40, ValId = 0x1002, Min=-45, Max=45, Def=0, Val=-1 }
|
||||
ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_DEGREES, 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
|
||||
ctx.SelLine = 0
|
||||
lastGoodMenu = menuId
|
||||
elseif (menuId==0x1031) then
|
||||
--M[Id=0x1031 P=0x0 N=0x0 B=0x102A Text="Failsafe Angles"[0x1F6]]
|
||||
@ -515,8 +515,8 @@ local function AR631_loadMenu(menuId)
|
||||
|
||||
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[1] = { Type = LINE_TYPE.VALUE_DEGREES, TextId = 0x40, ValId = 0x1001, Min=-90, Max=90, Def=0, Val=0 }
|
||||
ctx.MenuLines[2] = { Type = LINE_TYPE.VALUE_DEGREES, 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 }
|
||||
|
||||
@ -542,7 +542,7 @@ local function AR631_loadMenu(menuId)
|
||||
--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 ]
|
||||
--L[#6 T=M VId=0x1035 Text="Apply"[0x90] MId=0x1034 ]
|
||||
|
||||
|
||||
ctx.Menu = { MenuId = 0x1033, TextId = 0x23D, PrevId = 0, NextId = 0, BackId = 0x1032 }
|
||||
@ -552,19 +552,19 @@ local function AR631_loadMenu(menuId)
|
||||
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.MenuLines[6] = { Type = LINE_TYPE.MENU, TextId = 0x90, 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[#1 T=M VId=0x1033 Text="Are you sure you want to ovewrite the \"Target\""[0x251] MId=0x1033 ]
|
||||
--L[#2 T=M VId=0x1033 Text="with the \"Source\" ? "[0x252] MId=0x1033 ]
|
||||
--L[#3 T=M VId=0x1033 Text=""[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 ]
|
||||
--L[#6 T=M VId=0x1035 Text="YES"[0x259] MId=0x1034 ]
|
||||
|
||||
|
||||
ctx.Menu = { MenuId = 0x1034, TextId = 0x23D, PrevId = 0x1033, NextId = 0, BackId = 0x1033 }
|
||||
@ -639,10 +639,10 @@ local function AR631_loadMenu(menuId)
|
||||
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[3] = { Type = LINE_TYPE.VALUE_DEGREES, 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.MenuLines[6] = { Type = LINE_TYPE.VALUE_DEGREES, TextId = 0x1F4, ValId = 0x1006, Min=-45, Max=45, Def=0, Val=0 }
|
||||
|
||||
ctx.SelLine = 2
|
||||
lastGoodMenu = menuId
|
||||
@ -816,8 +816,8 @@ local function AR631_loadMenu(menuId)
|
||||
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[2] = { Type = LINE_TYPE.VALUE_DEGREES, TextId = 0x40, ValId = 0x1002, Min=-45, Max=45, Def=0, Val=13 }
|
||||
ctx.MenuLines[3] = { Type = LINE_TYPE.VALUE_DEGREES, 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 }
|
||||
|
||||
@ -1271,7 +1271,7 @@ local function FC6250HX_loadMenu(menuId)
|
||||
|
||||
ctx.Menu = { MenuId = 0x140, TextId = 0x8B, PrevId = 0, NextId = 0, BackId = 0x1400 }
|
||||
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.MenuLines[1] = { Type = LINE_TYPE.VALUE_NUM_I8, TextId = 0x42, ValId = 0x142, Min=25, Max=100, Def=50, Val=30 }
|
||||
|
||||
ctx.SelLine = 0
|
||||
lastGoodMenu = menuId
|
||||
@ -1281,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] = { 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.MenuLines[0] = { Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x40, ValId = 0x1421, Min=-850, Max=850, Def=450, Val=274 }
|
||||
ctx.MenuLines[1] = { Type = LINE_TYPE.VALUE_NUM_SI16, TextId = 0x41, ValId = 0x1422, Min=-850, Max=850, Def=0, Val=58 }
|
||||
|
||||
ctx.SelLine = 0
|
||||
lastGoodMenu = menuId
|
||||
@ -1358,7 +1358,7 @@ local function loadMenu(menuId)
|
||||
elseif (menuId==0x1001) then
|
||||
RX_Initialized = false
|
||||
ctx.RX.Id = dsmLib.RX.AR631
|
||||
ctx.RX.Name = "AR631/AR637 -NEW-SIM"
|
||||
ctx.RX.Name = "AR631/AR637-SIM"
|
||||
ctx.RX.Version = "2.38.5"
|
||||
dsmLib.Init_Text(ctx.RX.Id)
|
||||
|
||||
@ -1366,7 +1366,7 @@ local function loadMenu(menuId)
|
||||
RX_loadMenu(0x01000)
|
||||
elseif (menuId==0x1002) then
|
||||
ctx.RX.Id = dsmLib.RX.AR631
|
||||
ctx.RX.Name = "AR631/AR637 -SIM"
|
||||
ctx.RX.Name = "AR631/637-SIM"
|
||||
ctx.RX.Version = "2.38.5"
|
||||
dsmLib.Init_Text(ctx.RX.Id)
|
||||
|
||||
@ -1467,7 +1467,7 @@ SimLib.isListLine = dsmLib.isListLine
|
||||
SimLib.isPercentValueLine = dsmLib.isPercentValueLine
|
||||
SimLib.isNumberValueLine = dsmLib.isNumberValueLine
|
||||
SimLib.isDisplayAttr = dsmLib.isDisplayAttr
|
||||
SimLib.isFlightModeText = dsmLib.isFlightModeText
|
||||
SimLib.isFlightModeLine = dsmLib.isFlightModeLine
|
||||
SimLib.GetFlightModeValue = dsmLib.GetFlightModeValue
|
||||
|
||||
SimLib.StartConnection = SIM_StartConnection -- Override Function
|
||||
@ -1475,6 +1475,7 @@ SimLib.ReleaseConnection = SIM_ReleaseConnection -- Override Function
|
||||
SimLib.ChangePhase = dsmLib.ChangePhase
|
||||
SimLib.Value_Add = dsmLib.Value_Add
|
||||
SimLib.Value_Default = dsmLib.Value_Default
|
||||
SimLib.Value_Write_Validate = dsmLib.Value_Write_Validate
|
||||
SimLib.GotoMenu = dsmLib.GotoMenu
|
||||
SimLib.MoveSelectionLine = dsmLib.MoveSelectionLine
|
||||
SimLib.Send_Receive = SIM_Send_Receive -- Override Function
|
||||
|
Loading…
x
Reference in New Issue
Block a user