Make both work on EdgeTx and OpenTX

This commit is contained in:
Frankie Arzu 2022-11-17 01:46:47 -06:00
parent 68eab7796a
commit 46591b8cc8
6 changed files with 208 additions and 96 deletions

View File

@ -1,4 +1,4 @@
local toolName = "TNS|DSM Forward Prog v0.5 (OTX B&W) |TNE" local toolName = "TNS|DSM Forward Prog v0.5 (Text B&W) |TNE"
---- ######################################################################### ---- #########################################################################
---- # # ---- # #
@ -36,16 +36,27 @@ local DISP_ATTR = dsmLib.DISP_ATTR
local DSM_Context = dsmLib.DSM_Context local DSM_Context = dsmLib.DSM_Context
local LCD_W_USABLE = LCD_W-10
-- X for Menu Lines
local LCD_X_LINE_MENU = 10 local LCD_X_LINE_MENU = 10
-- X offsets for (Title: [Value] debugInfo) lines
local LCD_X_LINE_TITLE = 10 local LCD_X_LINE_TITLE = 10
local LCD_X_LINE_VALUE = 230 local LCD_X_LINE_VALUE = 230
local LCD_X_LINE_DEBUG = 390 local LCD_X_LINE_DEBUG = 390
local LCD_Y_MENU_TITLE = 20 -- Line Height: make it smaller debugging info tp LCD (some space buttom)
local LCD_Y_LINE_START = LCD_Y_MENU_TITLE + 30
local LCD_Y_LINE_HEIGHT = (DEBUG_ON_LCD and 23) or 27 -- if DEBUG 23 else 27 local LCD_Y_LINE_HEIGHT = (DEBUG_ON_LCD and 23) or 27 -- if DEBUG 23 else 27
-- Y offsets
local LCD_Y_MENU_TITLE = 20
-- Y offet
local LCD_Y_LINE_FIRST = LCD_Y_MENU_TITLE + 30
local LCD_Y_LOWER_BUTTONS = LCD_Y_LINE_FIRST + 7 * LCD_Y_LINE_HEIGHT
local LCD_Y_LOWER_BUTTONS = LCD_Y_LINE_START + 7 * LCD_Y_LINE_HEIGHT local LCD_W_BUTTONS = 47
local LCD_H_BUTTONS = 25
local LCD_X_RIGHT_BUTTONS = LCD_W - LCD_W_BUTTONS - 5
local TEXT_SIZE = 0 -- NORMAL
local lastRefresh=0 -- Last time the screen was refreshed local lastRefresh=0 -- Last time the screen was refreshed
local REFRESH_GUI_MS = 500/10 -- 500ms.. Screen Refresh Rate.. to not use unneded CPU time (in 10ms units to be compatible with getTime()) local REFRESH_GUI_MS = 500/10 -- 500ms.. Screen Refresh Rate.. to not use unneded CPU time (in 10ms units to be compatible with getTime())
@ -71,47 +82,55 @@ end
local function GUI_Diplay_Button(x,y,w,h,text,selected) local function GUI_Diplay_Button(x,y,w,h,text,selected)
local attr = (selected) and INVERS or 0 -- INVERS if line Selected local attr = (selected) and INVERS or 0 -- INVERS if line Selected
lcd.drawText(x+5,y+2, text, attr) lcd.drawText(x+5,y+2, text, attr + TEXT_SIZE)
lcd.drawRectangle(x, y, w, h, LIGHTGREY) lcd.drawRectangle(x, y, w, h, LINE_COLOR)
end end
local function GUI_Display_Menu(menu) local function GUI_Display_Menu(menu)
local ctx = DSM_Context local ctx = DSM_Context
local w= LCD_W-100 -- usable Width for the Menu/Lines local w= LCD_W_USABLE - LCD_W_BUTTONS - 10 -- usable Width for the Menu/Lines
-- Center Header -- Center Header
local tw = openTx_lcd_sizeText(menu.Text) local tw = openTx_lcd_sizeText(menu.Text)
local x = w/2 - tw/2 -- Center of Screen - Center of Text local x = w/2 - tw/2 -- Center of Screen - Center of Text
lcd.drawText(x,LCD_Y_MENU_TITLE,menu.Text,BOLD) -- orig MIDSIZE
local bold = 0
if (TEXT_SIZE~=SMLSIZE) then -- Ignore Bold on small size screens
bold = BOLD
end
lcd.drawText(x,LCD_Y_MENU_TITLE,menu.Text,bold + TEXT_SIZE)
-- Back -- Back
if menu.BackId ~= 0 then if menu.BackId ~= 0 then
GUI_Diplay_Button(437-5,LCD_Y_MENU_TITLE,47,25,"Back",ctx.SelLine == dsmLib.BACK_BUTTON) GUI_Diplay_Button(LCD_X_RIGHT_BUTTONS,LCD_Y_MENU_TITLE,LCD_W_BUTTONS,LCD_H_BUTTONS,"Back",ctx.SelLine == dsmLib.BACK_BUTTON)
end end
-- Next ? -- Next ?
if menu.NextId ~= 0 then if menu.NextId ~= 0 then
GUI_Diplay_Button(437-5,LCD_Y_LOWER_BUTTONS,47,25,"Next",ctx.SelLine == dsmLib.NEXT_BUTTON) GUI_Diplay_Button(LCD_X_RIGHT_BUTTONS,LCD_Y_LOWER_BUTTONS,LCD_W_BUTTONS,LCD_H_BUTTONS,"Next",ctx.SelLine == dsmLib.NEXT_BUTTON)
end end
-- Prev? -- Prev?
if menu.PrevId ~= 0 then if menu.PrevId ~= 0 then
GUI_Diplay_Button(0,LCD_Y_LOWER_BUTTONS,47,25,"Prev",ctx.SelLine == dsmLib.PREV_BUTTON) GUI_Diplay_Button(0,LCD_Y_LOWER_BUTTONS,LCD_W_BUTTONS,LCD_H_BUTTONS,"Prev",ctx.SelLine == dsmLib.PREV_BUTTON)
end end
-- Debug into LCD -- Debug into LCD
if (DEBUG_ON_LCD) then lcd.drawText(0,LCD_Y_MENU_TITLE,dsmLib.phase2String(ctx.Phase),SMLSIZE + BLUE) end -- Phase we are in if (DEBUG_ON_LCD) then lcd.drawText(0,LCD_Y_MENU_TITLE,dsmLib.phase2String(ctx.Phase),TEXT_SIZE + WARNING_COLOR) end -- Phase we are in
if (DEBUG_ON_LCD) then lcd.drawText(LCD_X_LINE_MENU,240,dsmLib.menu2String(menu),SMLSIZE + BLUE) end -- Menu Info if (DEBUG_ON_LCD) then lcd.drawText(LCD_X_LINE_MENU,240,dsmLib.menu2String(menu),TEXT_SIZE + WARNING_COLOR) end -- Menu Info
end end
local function GUI_Display_Line_Menu(x,y,w,h,line,selected) local function GUI_Display_Line_Menu(x,y,w,h,line,selected)
local attr = (selected) and INVERS or 0 -- INVERS if line Selected local attr = (selected and INVERS) or 0 -- INVERS if line Selected
local bold = 0 local bold = 0
local text = line.Text local text = line.Text
if dsmLib.isSelectableLine(line) then if dsmLib.isSelectableLine(line) then
-- Menu Line -- Menu Line
text = text .. " -->" --OPENTX text = text .. " |>" --OPENTX
else -- SubHeaders and plain text lines else -- SubHeaders and plain text lines
bold = (dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.BOLD) and BOLD) or 0 if (TEXT_SIZE~=SMLSIZE) then -- ignore bold on small size screens
bold = (dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.BOLD) and BOLD) or 0
end
if dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.RIGHT) then -- Right Align??? if dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.RIGHT) then -- Right Align???
local tw = openTx_lcd_sizeText(line.Text)+4 local tw = openTx_lcd_sizeText(line.Text)+4
x = LCD_X_LINE_VALUE - tw -- Right x = LCD_X_LINE_VALUE - tw -- Right
@ -121,14 +140,14 @@ local function GUI_Display_Line_Menu(x,y,w,h,line,selected)
end end
end end
lcd.drawText(x,y, text, attr + bold) lcd.drawText(x,y, text, attr + bold + TEXT_SIZE)
end end
------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------
local function GUI_Display_Line_Value(lineNum, line, value, selected, editing) local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
local bold = 0 local bold = 0
local y = LCD_Y_LINE_START+(LCD_Y_LINE_HEIGHT*lineNum) local y = LCD_Y_LINE_FIRST+(LCD_Y_LINE_HEIGHT*lineNum)
local x = LCD_X_LINE_TITLE local x = LCD_X_LINE_TITLE
---------- NAME Part ---------- NAME Part
@ -139,7 +158,9 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
header = header .. " " .. value header = header .. " " .. value
-- Flight mode display attributes -- Flight mode display attributes
bold = (dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.BOLD) and BOLD) or 0 if (TEXT_SIZE~=SMLSIZE) then -- ignore bold on small size screens
bold = (dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.BOLD) and BOLD) or 0
end
if dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.RIGHT) then -- Right Align if dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.RIGHT) then -- Right Align
local tw = openTx_lcd_sizeText(header)+4 local tw = openTx_lcd_sizeText(header)+4
@ -153,7 +174,7 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
header = header .. ":" header = header .. ":"
end end
lcd.drawText(x, y, header, bold) -- display Line Header lcd.drawText(x, y, header, bold + TEXT_SIZE) -- display Line Header
--------- VALUE PART, Skip for Flight Mode since already show the value --------- VALUE PART, Skip for Flight Mode since already show the value
if not dsmLib.isFlightModeText(line.TextId) then if not dsmLib.isFlightModeText(line.TextId) then
@ -168,28 +189,29 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
end end
end end
lcd.drawText(LCD_X_LINE_VALUE,y, value, attrib) -- display value lcd.drawText(LCD_X_LINE_VALUE,y, value, attrib + TEXT_SIZE) -- display value
end end
if (DEBUG_ON_LCD) then lcd.drawText(LCD_X_LINE_DEBUG,y, line.MinMaxDebug or "", SMLSIZE) end -- display debug if (DEBUG_ON_LCD) then lcd.drawText(LCD_X_LINE_DEBUG,y, line.MinMaxDebug or "", TEXT_SIZE + WARNING_COLOR) end -- display debug
end end
------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------
local function GUI_Display() local function GUI_Display()
local ctx = DSM_Context local ctx = DSM_Context
lcd.clear() lcd.clear()
if LCD_W == 480 then
local header = "DSM Fwrd Programming " local header = "DSM Fwrd Programming "
if ctx.Phase ~= PHASE.RX_VERSION then if ctx.Phase ~= PHASE.RX_VERSION then
header = header .. "RX "..ctx.RX.Name.." v"..ctx.RX.Version header = header .. "RX "..ctx.RX.Name.." v"..ctx.RX.Version
end end
--Draw title --Draw title
lcd.drawFilledRectangle(0, 0, LCD_W, 20, TITLE_BGCOLOR) if (TEXT_SIZE~=SMLSIZE) then -- ignore tool title small size screens
lcd.drawText(5, 0, header, MENU_TITLE_COLOR) lcd.drawFilledRectangle(0, 0, LCD_W, 20, TITLE_BGCOLOR)
lcd.drawText(5, 0, header, MENU_TITLE_COLOR + TEXT_SIZE)
end
--Draw RX Menu --Draw RX Menu
if ctx.Phase == PHASE.RX_VERSION then if ctx.Phase == PHASE.RX_VERSION then
lcd.drawText(LCD_X_LINE_TITLE,100,"No compatible DSM RX...", BLINK) lcd.drawText(LCD_X_LINE_TITLE,50,"No compatible DSM RX...", BLINK + TEXT_SIZE)
else else
local menu = ctx.Menu local menu = ctx.Menu
if menu.Text ~= nil then if menu.Text ~= nil then
@ -201,13 +223,13 @@ local function GUI_Display()
if i == ctx.SelLine then if i == ctx.SelLine then
-- DEBUG: Display Selected Line info for ON SCREEN Debugging -- DEBUG: Display Selected Line info for ON SCREEN Debugging
if (DEBUG_ON_LCD) then lcd.drawText(LCD_X_LINE_TITLE,255,dsmLib.menuLine2String(line),SMLSIZE+BLUE) end if (DEBUG_ON_LCD) then lcd.drawText(LCD_X_LINE_TITLE,255,dsmLib.menuLine2String(line),TEXT_SIZE + WARNING_COLOR) end
end end
if line ~= nil and line.Type ~= 0 then if line ~= nil and line.Type ~= 0 then
if line.Type == LINE_TYPE.MENU then if line.Type == LINE_TYPE.MENU then
-- Menu Line -- Menu Line
GUI_Display_Line_Menu(LCD_X_LINE_MENU,LCD_Y_LINE_START+(LCD_Y_LINE_HEIGHT*i), 350, LCD_Y_LINE_HEIGHT, line, i == ctx.SelLine) GUI_Display_Line_Menu(LCD_X_LINE_MENU,LCD_Y_LINE_FIRST+(LCD_Y_LINE_HEIGHT*i), 350, LCD_Y_LINE_HEIGHT, line, i == ctx.SelLine)
else else
-- list/value line -- list/value line
local value = line.Val local value = line.Val
@ -219,7 +241,7 @@ local function GUI_Display()
if (imgValue) then -- Optional Image for a Value if (imgValue) then -- Optional Image for a Value
--TODO: Pending feature.. create images and put bitmap instead of a message --TODO: Pending feature.. create images and put bitmap instead of a message
--Display the image/Alternate Text --Display the image/Alternate Text
lcd.drawText(LCD_X_LINE_TITLE, LCD_Y_LINE_START+LCD_Y_LINE_HEIGHT, "Img:"..imgValue) lcd.drawText(LCD_X_LINE_TITLE, LCD_Y_LINE_FIRST+LCD_Y_LINE_HEIGHT, "Img:"..imgValue)
end end
end end
@ -230,9 +252,7 @@ local function GUI_Display()
end -- for end -- for
end end
end end
else
-- Different Resolution
end
end end
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
@ -342,9 +362,35 @@ local function GUI_HandleEvent(event, touchState)
end end
end end
local function init_screen_pos()
if LCD_W == 480 then -- TX16
-- use defaults in the script header
elseif LCD_W == 128 then --TX12 (128x64) -- Still needs some work on the vertical
DEBUG_ON_LCD = false -- no space for this
TEXT_SIZE = SMLSIZE
LCD_W_USABLE = 128
LCD_W_BUTTONS = 30
LCD_H_BUTTONS = 17
LCD_X_RIGHT_BUTTONS = 128 - LCD_W_BUTTONS - 5
LCD_X_LINE_MENU = 0
-- X offsets for (Title: [Value] debugInfo) lines
LCD_X_LINE_TITLE = 0
LCD_X_LINE_VALUE = 90
LCD_X_LINE_DEBUG = 110
LCD_Y_LINE_HEIGHT = 17
LCD_Y_MENU_TITLE = 0
LCD_Y_LINE_FIRST = LCD_Y_MENU_TITLE + 17
LCD_Y_LOWER_BUTTONS = LCD_Y_LINE_FIRST + 7 * LCD_Y_LINE_HEIGHT
end
end
------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------
-- Init -- Init
local function DSM_Init() local function DSM_Init()
init_screen_pos()
dsmLib.Init(toolName) -- Initialize Library dsmLib.Init(toolName) -- Initialize Library
return dsmLib.StartConnection() return dsmLib.StartConnection()
end end

View File

@ -1,4 +1,4 @@
local toolName = "TNS|DSM Forward Prog v0.5 (EdgeTx) |TNE" local toolName = "TNS|DSM Forward Prog v0.5 (Color+Touch) |TNE"
local VERSION = "v0.5" local VERSION = "v0.5"
---- ######################################################################### ---- #########################################################################
@ -18,12 +18,10 @@ local VERSION = "v0.5"
---- # # ---- # #
---- ######################################################################### ---- #########################################################################
-- Code is based on the code/work by: Pascal Langer (Author of the Multi-Module) local SIMULATION_ON = true -- FALSE: use real communication to DSM RX (DEFAULT), TRUE: use a simulated version of RX
-- Rewrite/Enhancements By: Francisco Arzu
local SIMULATION_ON = false -- FALSE: use real communication to DSM RX (DEFAULT), TRUE: use a simulated version of RX
local DEBUG_ON = 1 -- 0=NO DEBUG, 1=HIGH LEVEL 2=LOW LEVEL (Debug logged into the /LOGS/dsm.log) local DEBUG_ON = 1 -- 0=NO DEBUG, 1=HIGH LEVEL 2=LOW LEVEL (Debug logged into the /LOGS/dsm.log)
local DEBUG_ON_LCD = false -- Interactive Information on LCD of Menu data from RX local DEBUG_ON_LCD = false -- Interactive Information on LCD of Menu data from RX
local USE_SPECKTRUM_COLORS = true -- true: Use spectrum colors, false: use theme colors (default on OpenTX)
local dsmLib local dsmLib
if (SIMULATION_ON) then if (SIMULATION_ON) then
@ -39,17 +37,6 @@ local DISP_ATTR = dsmLib.DISP_ATTR
local DSM_Context = dsmLib.DSM_Context local DSM_Context = dsmLib.DSM_Context
local LCD_X_LINE_MENU = 30
local LCD_X_LINE_TITLE = 30
local LCD_X_LINE_VALUE = 230
local LCD_X_LINE_DEBUG = 390
local LCD_Y_MENU_TITLE = 20
local LCD_Y_LINE_START = LCD_Y_MENU_TITLE + 30
local LCD_Y_LINE_HEIGHT = (DEBUG_ON_LCD and 23) or 27 -- if DEBUG 23 else 27
local LCD_Y_LOWER_BUTTONS = LCD_Y_LINE_START + 3 + (7 * LCD_Y_LINE_HEIGHT)
local lastRefresh=0 -- Last time the screen was refreshed local lastRefresh=0 -- Last time the screen was refreshed
local REFRESH_GUI_MS = 300/10 -- 300ms.. Screen Refresh Rate.. to not waste CPU time (in 10ms units to be compatible with getTime()) local REFRESH_GUI_MS = 300/10 -- 300ms.. Screen Refresh Rate.. to not waste CPU time (in 10ms units to be compatible with getTime())
local originalValue = nil local originalValue = nil
@ -57,6 +44,52 @@ local originalValue = nil
local touchButtonArea = {} local touchButtonArea = {}
local EDIT_BUTTON = { DEFAULT=1001, DEC_10=1002, DEC_1=1003, INC_1=1004, INC_10=5, OK=1006, ESC=1007 } local EDIT_BUTTON = { DEFAULT=1001, DEC_10=1002, DEC_1=1003, INC_1=1004, INC_10=5, OK=1006, ESC=1007 }
local IS_EDGETX = false -- DEFAULT until Init changed it
local LCD_Y_MENU_TITLE = 20
local LCD_W_MENU_TITLE = LCD_W-100
local LCD_X_LINE_MENU = 30
local LCD_W_LINE_MENU = 350
local LCD_X_LINE_TITLE = 30
local LCD_X_LINE_VALUE = 230
local LCD_X_LINE_DEBUG = 390
local LCD_Y_LINE_START = LCD_Y_MENU_TITLE + 30
local LCD_Y_LINE_HEIGHT = (DEBUG_ON_LCD and 23) or 27 -- if DEBUG 23 else 27
local LCD_Y_LOWER_BUTTONS = LCD_Y_LINE_START + 3 + (7 * LCD_Y_LINE_HEIGHT)
-- TOOL HEADER
local LCD_TOOL_HDR_COLOR = MENU_TITLE_COLOR
local LCD_TOOL_HDR_BGCOLOR = TITLE_BGCOLOR
-- MENU HEADER
local LCD_MENU_COLOR = MENU_TITLE_COLOR
local LCD_MENU_BGCOLOR = MENU_TITLE_BGCOLOR
-- LINE SELECTED
local LCD_SELECTED_COLOR = TEXT_INVERTED_COLOR
local LCD_SELECTED_BGCOLOR = TEXT_INVERTED_BGCOLOR
local LCD_EDIT_BGCOLOR = WARNING_COLOR
-- NORMAL TEXT
local LCD_NORMAL_COLOR = TEXT_COLOR
local LCD_DISABLE_COLOR = TEXT_DISABLE_COLOR
local LCD_DEBUG_COLOR = LINE_COLOR
-- NORMAL BOX FRAME COLOR
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
local function GUI_SwitchSimulationOFF() local function GUI_SwitchSimulationOFF()
dsmLib.ReleaseConnection() dsmLib.ReleaseConnection()
@ -96,29 +129,32 @@ end
---------- Return Color to display Menu Lines ---------------------------------------------------------------- ---------- Return Color to display Menu Lines ----------------------------------------------------------------
local function GUI_GetTextColor(lineNum) local function GUI_GetTextColor(lineNum)
local ctx = DSM_Context local ctx = DSM_Context
local txtColor = BLACK local txtColor = LCD_NORMAL_COLOR
-- Gray Out any other line except the one been edited -- Gray Out any other line except the one been edited
if (ctx.isEditing() and ctx.EditLine~=lineNum) then txtColor=LIGHTGREY end if (ctx.isEditing() and ctx.EditLine~=lineNum) then txtColor=LCD_DISABLE_COLOR end
return txtColor return txtColor
end end
local function GUI_GetFrameColor(lineNum) -- Frame Color for Value/Menu Boxes local function GUI_GetFrameColor(lineNum) -- Frame Color for Value/Menu Boxes
local ctx = DSM_Context local ctx = DSM_Context
local txtColor = LIGHTGREY --ORANGE local txtColor = LCD_BOX_COLOR
-- Gray Out any other line except the one been edited -- Gray Out any other line except the one been edited
if (ctx.isEditing() and ctx.EditLine~=lineNum) then txtColor=LIGHTGREY end if (ctx.EditLine~=lineNum) then txtColor=LCD_DISABLE_COLOR end
return txtColor return txtColor
end end
-------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------
-- Display Text inside a Rectangle. Inv: true means solid rectangle, false=only perimeter -- 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)
local ctx = DSM_Context
local txtColor = GUI_GetTextColor(lineNum) local txtColor = GUI_GetTextColor(lineNum)
local frameColor = GUI_GetFrameColor(lineNum) local frameColor = GUI_GetFrameColor(lineNum)
-- If editing this lineNum, chose EDIT Color, else SELECTED Color
local selectedBGColor = (ctx.EditLine==lineNum and LCD_EDIT_BGCOLOR) or LCD_SELECTED_BGCOLOR
if (inv) then if (inv) then
txtColor = WHITE txtColor = LCD_SELECTED_COLOR
lcd.drawFilledRectangle(x-5, y-2, w, h, ORANGE) lcd.drawFilledRectangle(x-5, y-2, w, h, selectedBGColor)
else else
lcd.drawRectangle(x-5, y-2, w, h, frameColor) lcd.drawRectangle(x-5, y-2, w, h, frameColor)
end end
@ -141,8 +177,8 @@ local function GUI_Display_Line_Menu(lineNum,line,selected)
local x = LCD_X_LINE_MENU local x = LCD_X_LINE_MENU
if dsmLib.isSelectableLine(line) then -- Draw Selectable Menus in Boxes if dsmLib.isSelectableLine(line) then -- Draw Selectable Menus in Boxes
GUI_Display_Boxed_Text(lineNum,x, y, 350, 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)
GUI_addTouchButton(x, y, 350, LCD_Y_LINE_HEIGHT,lineNum) GUI_addTouchButton(x, y, LCD_W_LINE_MENU, LCD_Y_LINE_HEIGHT,lineNum)
else else
-- Non Selectable Menu Lines, plain text -- Non Selectable Menu Lines, plain text
-- Can be use for sub headers or just regular text lines (like warnings) -- Can be use for sub headers or just regular text lines (like warnings)
@ -150,10 +186,10 @@ local function GUI_Display_Line_Menu(lineNum,line,selected)
local bold = (dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.BOLD) and BOLD) or 0 local bold = (dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.BOLD) and BOLD) or 0
if dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.RIGHT) then -- Right Align??? if dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.RIGHT) then -- Right Align???
local tw = lcd.sizeText(line.Text)+4 local tw = my_lcd_sizeText(line.Text)+4
x = LCD_X_LINE_VALUE - tw -- Right x = LCD_X_LINE_VALUE - tw -- Right
elseif dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.CENTER) then -- Center?? elseif dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.CENTER) then -- Center??
local tw = lcd.sizeText(line.Text) local tw = my_lcd_sizeText(line.Text)
x = x + (LCD_X_LINE_VALUE - LCD_X_LINE_MENU)/2 - tw/2 -- Center - 1/2 Text x = x + (LCD_X_LINE_VALUE - LCD_X_LINE_MENU)/2 - tw/2 -- Center - 1/2 Text
end end
@ -184,10 +220,10 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
bold = (dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.BOLD) and BOLD) or 0 bold = (dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.BOLD) and BOLD) or 0
if dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.RIGHT) then -- Right Align if dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.RIGHT) then -- Right Align
local tw = lcd.sizeText(header)+4 local tw = my_lcd_sizeText(header)+4
x = LCD_X_LINE_VALUE - tw -- Right x = LCD_X_LINE_VALUE - tw -- Right
elseif dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.CENTER) then -- Centered elseif dsmLib.isDisplayAttr(line.TextAttr,DISP_ATTR.CENTER) then -- Centered
local tw = (lcd.sizeText(header)) local tw = my_lcd_sizeText(header)
x = x + (LCD_X_LINE_VALUE - LCD_X_LINE_TITLE)/2 - tw/2 -- Center - 1/2 Text x = x + (LCD_X_LINE_VALUE - LCD_X_LINE_TITLE)/2 - tw/2 -- Center - 1/2 Text
end end
else else
@ -203,7 +239,7 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
if dsmLib.isSelectableLine(line) then if dsmLib.isSelectableLine(line) then
-- Can select/edit value, Box it -- Can select/edit value, Box it
local tw = lcd.sizeText(value)+10 -- Width of the Text in the lcd 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) GUI_Display_Boxed_Text(lineNum,LCD_X_LINE_VALUE,y,tw,LCD_Y_LINE_HEIGHT,value,selected)
GUI_addTouchButton(LCD_X_LINE_VALUE,y,tw,LCD_Y_LINE_HEIGHT,lineNum) GUI_addTouchButton(LCD_X_LINE_VALUE,y,tw,LCD_Y_LINE_HEIGHT,lineNum)
else -- Not Editable, Plain Text else -- Not Editable, Plain Text
@ -212,18 +248,19 @@ local function GUI_Display_Line_Value(lineNum, line, value, selected, editing)
end end
-- Debug info for line Value RANGE when Debug on LCD -- Debug info for line Value RANGE when Debug on LCD
if (DEBUG_ON_LCD) then lcd.drawText(LCD_X_LINE_DEBUG, y, line.MinMaxDebug or "", SMLSIZE + BLUE) end -- display debug Min/Max if (DEBUG_ON_LCD) then lcd.drawText(LCD_X_LINE_DEBUG, y, line.MinMaxDebug or "", SMLSIZE + LCD_DEBUG_COLOR) end -- display debug Min/Max
end end
local function GUI_Display_Menu(menu) local function GUI_Display_Menu(menu)
local ctx = DSM_Context local ctx = DSM_Context
local w= LCD_W-100 -- usable Width for the Menu/Lines local w= LCD_W_MENU_TITLE
-- Center Header -- Center Header
local tw = lcd.sizeText(menu.Text) local tw = my_lcd_sizeText(menu.Text)
local x = w/2 - tw/2 -- Center of Screen - Center of Text local x = w/2 - tw/2 -- Center of Screen - Center of Text
lcd.drawFilledRectangle(0, LCD_Y_MENU_TITLE-2, w, LCD_Y_LINE_HEIGHT-2, DARKGREY)
lcd.drawText(x,LCD_Y_MENU_TITLE,menu.Text, WHITE + BOLD) -- orig MIDSIZE lcd.drawFilledRectangle(0, LCD_Y_MENU_TITLE-2, w, LCD_Y_LINE_HEIGHT-2, LCD_MENU_BGCOLOR)
lcd.drawText(x,LCD_Y_MENU_TITLE,menu.Text, LCD_MENU_COLOR + BOLD)
-- Back Button -- Back Button
if menu.BackId ~= 0 then if menu.BackId ~= 0 then
@ -242,8 +279,8 @@ local function GUI_Display_Menu(menu)
end end
-- Debug on LCD, Show the menu Indo and Phase we are on -- Debug on LCD, Show the menu Indo and Phase we are on
if (DEBUG_ON_LCD) then lcd.drawText(0,LCD_Y_MENU_TITLE,dsmLib.phase2String(ctx.Phase),SMLSIZE+BLUE) end -- Phase we are in if (DEBUG_ON_LCD) then lcd.drawText(0,LCD_Y_MENU_TITLE,dsmLib.phase2String(ctx.Phase),SMLSIZE+LCD_DEBUG_COLOR) end -- Phase we are in
if (DEBUG_ON_LCD) then lcd.drawText(0,240,dsmLib.menu2String(menu),SMLSIZE+BLUE) end -- Menu Info if (DEBUG_ON_LCD) then lcd.drawText(0,240,dsmLib.menu2String(menu),SMLSIZE+LCD_DEBUG_COLOR) end -- Menu Info
end end
------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------
@ -303,14 +340,15 @@ local function GUI_Display()
end end
--Draw title --Draw title
lcd.drawFilledRectangle(0, 0, LCD_W, 17, TITLE_BGCOLOR) lcd.drawFilledRectangle(0, 0, LCD_W, 17, LCD_TOOL_HDR_BGCOLOR)
lcd.drawText(5, 0, header, MENU_TITLE_COLOR + SMLSIZE) lcd.drawText(5, 0, header, LCD_TOOL_HDR_COLOR + SMLSIZE)
--Draw RX Menu --Draw RX Menu
if ctx.Phase == PHASE.RX_VERSION then if ctx.Phase == PHASE.RX_VERSION then
lcd.drawText(LCD_X_LINE_TITLE,100,"No compatible DSM RX...", BLINK) lcd.drawText(LCD_X_LINE_TITLE,100,"No compatible DSM RX...", BLINK)
else else
local menu = ctx.Menu local menu = ctx.Menu
if menu.Text ~= nil then if menu.Text ~= nil then
GUI_Display_Menu(menu) GUI_Display_Menu(menu)
@ -319,7 +357,7 @@ local function GUI_Display()
if i == ctx.SelLine then if i == ctx.SelLine then
-- DEBUG: Display Selected Line info for ON SCREEN Debugging -- DEBUG: Display Selected Line info for ON SCREEN Debugging
if (DEBUG_ON_LCD) then lcd.drawText(0,255,dsmLib.menuLine2String(line),SMLSIZE+BLUE) end if (DEBUG_ON_LCD) then lcd.drawText(0,255,dsmLib.menuLine2String(line),SMLSIZE + LCD_DEBUG_COLOR) end
end end
if line ~= nil and line.Type ~= 0 then if line ~= nil and line.Type ~= 0 then
@ -347,7 +385,7 @@ local function GUI_Display()
end -- if Line[i]~=nil end -- if Line[i]~=nil
end -- for end -- for
if ctx.isEditing() then if IS_EDGETX and ctx.isEditing() then
GUI_Display_Edit_Buttons(ctx.MenuLines[ctx.EditLine]) GUI_Display_Edit_Buttons(ctx.MenuLines[ctx.EditLine])
end end
end end
@ -409,24 +447,26 @@ local function GUI_HandleEvent(event, touchState)
local menuLines = ctx.MenuLines local menuLines = ctx.MenuLines
local editInc = nil local editInc = nil
if (event == EVT_TOUCH_TAP and ctx.isEditing()) then -- Touch and Editing if (IS_EDGETX) then
local button = GUI_getTouchButton(touchState.x, touchState.y) if (event == EVT_TOUCH_TAP and ctx.isEditing()) then -- Touch and Editing
if (button) then
event, editInc = GUI_Translate_Edit_Buttons(button)
end
end
if (event == EVT_TOUCH_TAP or event == EVT_TOUCH_FIRST) and not ctx.isEditing() then -- Touch and NOT editing
if (DEBUG_ON) then dsmLib.LOG_write("%s: EVT_TOUCH_TAP %d,%d\n",dsmLib.phase2String(ctx.Phase),touchState.x, touchState.y) end
local button = GUI_getTouchButton(touchState.x, touchState.y) local button = GUI_getTouchButton(touchState.x, touchState.y)
if button then if (button) then
-- Found a valid line event, editInc = GUI_Translate_Edit_Buttons(button)
ctx.SelLine = button
ctx.Refresh_Display=true
if event == EVT_TOUCH_TAP then -- EVT_TOUCH_FIRST only move focus
event = EVT_VIRTUAL_ENTER
end
end end
end
if (event == EVT_TOUCH_TAP or event == EVT_TOUCH_FIRST) and not ctx.isEditing() then -- Touch and NOT editing
if (DEBUG_ON) then dsmLib.LOG_write("%s: EVT_TOUCH_TAP %d,%d\n",dsmLib.phase2String(ctx.Phase),touchState.x, touchState.y) end
local button = GUI_getTouchButton(touchState.x, touchState.y)
if button then
-- Found a valid line
ctx.SelLine = button
ctx.Refresh_Display=true
if event == EVT_TOUCH_TAP then -- EVT_TOUCH_FIRST only move focus
event = EVT_VIRTUAL_ENTER
end
end
end
end end
if event == EVT_VIRTUAL_EXIT then if event == EVT_VIRTUAL_EXIT then
@ -511,9 +551,36 @@ local function GUI_HandleEvent(event, touchState)
end end
end end
local function init_colors()
-- osName in OpenTX is nil, otherwise is EDGETX
local ver, radio, maj, minor, rev, osname = getVersion()
IS_EDGETX = osname~=nil
if (IS_EDGETX and USE_SPECKTRUM_COLORS) then
-- SPECKTRUM COLORS (only works on EDGETX)
-- TOOL HEADER
LCD_TOOL_HDR_COLOR = MENU_TITLE_COLOR
LCD_TOOL_HDR_BGCOLOR = TITLE_BGCOLOR
-- MENU HEADER
LCD_MENU_COLOR = WHITE
LCD_MENU_BGCOLOR = DARKGREY
-- LINE SELECTED
LCD_SELECTED_COLOR = WHITE
LCD_SELECTED_BGCOLOR = ORANGE
LCD_EDIT_BGCOLOR = WARNING_COLOR
-- NORMAL TEXT
LCD_NORMAL_COLOR = BLACK
LCD_DISABLE_COLOR = LIGHTGREY
LCD_DEBUG_COLOR = BLUE
-- NORMAL BOX FRAME COLOR
LCD_BOX_COLOR = LIGHTGREY
end
end
------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------
-- Init -- Init
local function DSM_Init() local function DSM_Init()
init_colors()
dsmLib.Init(toolName) -- Initialize Library dsmLib.Init(toolName) -- Initialize Library
return dsmLib.StartConnection() return dsmLib.StartConnection()
end end

View File

@ -1133,7 +1133,7 @@ local function DSM_Init_Text(rxId)
Text[0x00AD] = "Gain Channel Select" Text[0x00AD] = "Gain Channel Select"
-- Safe mode options, Ihnibit + thi values -- Safe mode options, Ihnibit + thi values
local safeMode = {0x0003,0x00B0,0x00B1} -- inh (gap), "Self-Level/Angle Dem, Envelope local safeModeOptions = {0x0003,0x00B0,0x00B1} -- inh (gap), "Self-Level/Angle Dem, Envelope
Text[0x00B0] = "Self-Level/Angle Dem" Text[0x00B0] = "Self-Level/Angle Dem"
Text[0x00B1] = "Envelope" Text[0x00B1] = "Envelope"

Binary file not shown.

View File

@ -9,8 +9,8 @@ Rewrite/Enhancements By: Francisco Arzu
Deployment: Deployment:
/SCRIPTS/TOOLS/Dsm FwdPrg_OTX_05.lua -- OpenTX version, no touch (black/white radios) /SCRIPTS/TOOLS/DsmFwdPrg_05_BaW.lua -- OpenTX/EdgeTx version, no touch (black/white radios)
/SCRIPTS/TOOLS/Dsm FwdPrg_ETX_05.lua -- EdgeTX version, touch /SCRIPTS/TOOLS/DsmFwdPrg_05_Color.lua -- EdgeTX/OpenTx Color version, +touch
/SCRIPTS/TOOLS/DSMLIB/ -- Libraries (ALL CAPITALS) to hide them from the Tools menu /SCRIPTS/TOOLS/DSMLIB/ -- Libraries (ALL CAPITALS) to hide them from the Tools menu
/SCRIPTS/TOOLS/DSMLIB/DsmFwPrgLib.lub -- DSM Protocol Message and Menu engine /SCRIPTS/TOOLS/DSMLIB/DsmFwPrgLib.lub -- DSM Protocol Message and Menu engine
/SCRIPTS/TOOLS/DSMLIB/DsmFwPrgSIMLib.lub -- Simulation of AR631 for GUI Development in Companion /SCRIPTS/TOOLS/DSMLIB/DsmFwPrgSIMLib.lub -- Simulation of AR631 for GUI Development in Companion
@ -18,7 +18,7 @@ Deployment:
/LOGS/dsm_log.txt -- Readable log of the last RX session, usefull for debuging new RX /LOGS/dsm_log.txt -- Readable log of the last RX session, usefull for debuging new RX
Version 0.05 Version 0.5
- Make the code more readable and understadable - Make the code more readable and understadable
- Separate the DSM Forwards Programing logic from the GUI - Separate the DSM Forwards Programing logic from the GUI
- Log the comunnication with the RX on a /LOGS/dsm_log.txt to allow to debug it easier - Log the comunnication with the RX on a /LOGS/dsm_log.txt to allow to debug it easier
@ -33,13 +33,12 @@ Known Problems:
special Save/Restart type of menu.. but it does not reset the RX. maybe another meesage needs to be send special Save/Restart type of menu.. but it does not reset the RX. maybe another meesage needs to be send
3. Some Menu List line types (LINE_TYPE.LIST_MENU1), the range (min/max) seems to be incorrect, but cannot see in the data how to fix it 3. Some Menu List line types (LINE_TYPE.LIST_MENU1), the range (min/max) seems to be incorrect, but cannot see in the data how to fix it
Some of the valid values are not even sequential, very spread apart. There has to be a list of valid options somewhere (in RX or config for each field). Some of the valid values are not even sequential, very spread apart. There has to be a list of valid options somewhere (in RX or config for each field).
Currenly adding valid values inside the scrip to override the RX
4. The RX return unknow lines when requesting the Lines for a menu. Realy don't understand what they are for. 4. The RX return unknow lines when requesting the Lines for a menu. Realy don't understand what they are for.
in some menus, seems to stay stuck in the same return line or no response to the request, making the RX reset/close the connection. in some menus, seems to stay stuck in the same return line or no response to the request, making the RX reset/close the connection.
Did a fix to stop requesting the same menu line if the response is the same. This gives an empty menu, but does not reset the connection. Did a fix to stop requesting the same menu line if the response is the same. This gives an empty menu, but does not reset the connection.
Version 0.02 Version 0.2
Original Version from Pascal Langer Original Version from Pascal Langer