From 1c6dc01959ea0564abacc604812c0bba44fdf622 Mon Sep 17 00:00:00 2001 From: Frankie Arzu <32604366+frankiearzu@users.noreply.github.com> Date: Fri, 18 Nov 2022 03:41:59 -0600 Subject: [PATCH] Frankie dsm fwrd prg enhancements (#757) * #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 Co-authored-by: pascallanger --- Lua_scripts/DSM FwdPrg_05_BW.lua | 8 +-- Lua_scripts/DSM FwdPrg_05_Color.lua | 8 +-- Lua_scripts/DSMLIB/DsmFwPrgLib.lua | 84 +++++++++++++++++++------ Lua_scripts/DSMLIB/DsmFwPrgLib.luac | Bin 29271 -> 0 bytes Lua_scripts/DSMLIB/DsmFwPrgSIMLib.luac | Bin 20481 -> 0 bytes Lua_scripts/DSMLIB/readme.txt | 10 +-- 6 files changed, 76 insertions(+), 34 deletions(-) delete mode 100644 Lua_scripts/DSMLIB/DsmFwPrgLib.luac delete mode 100644 Lua_scripts/DSMLIB/DsmFwPrgSIMLib.luac diff --git a/Lua_scripts/DSM FwdPrg_05_BW.lua b/Lua_scripts/DSM FwdPrg_05_BW.lua index 3bbfb9b..2420b0a 100644 --- a/Lua_scripts/DSM FwdPrg_05_BW.lua +++ b/Lua_scripts/DSM FwdPrg_05_BW.lua @@ -332,11 +332,11 @@ local function GUI_HandleEvent(event, touchState) ctx.Refresh_Display=true if (DEBUG_ON) then dsmLib.LOG_write("%s: EVT_VIRTUAL_ENTER\n",dsmLib.phase2String(ctx.Phase)) end if ctx.SelLine == dsmLib.BACK_BUTTON then -- Back - dsmLib.GotoMenu(menu.BackId) + dsmLib.GotoMenu(menu.BackId,0) elseif ctx.SelLine == dsmLib.NEXT_BUTTON then -- Next - dsmLib.GotoMenu(menu.NextId) + dsmLib.GotoMenu(menu.NextId,0) elseif ctx.SelLine == dsmLib.PREV_BUTTON then -- Prev - dsmLib.GotoMenu(menu.PrevId) + dsmLib.GotoMenu(menu.PrevId,0) elseif menuLines[ctx.SelLine].ValId ~= 0 then if menuLines[ctx.SelLine].Type == LINE_TYPE.MENU then -- Next menu exist if (SIMULATION_ON and menuLines[ctx.SelLine].ValId==0xFFFF) then @@ -344,7 +344,7 @@ local function GUI_HandleEvent(event, touchState) -- comunicate with Real RX GUI_SwitchSimulationOFF() else - dsmLib.GotoMenu(menuLines[ctx.SelLine].ValId) -- ValId is the MenuId to navigate to + dsmLib.GotoMenu(menuLines[ctx.SelLine].ValId,ctx.SelLine) -- ValId is the MenuId to navigate to end else -- Editing a Line???? diff --git a/Lua_scripts/DSM FwdPrg_05_Color.lua b/Lua_scripts/DSM FwdPrg_05_Color.lua index f94ff3b..d747eaf 100644 --- a/Lua_scripts/DSM FwdPrg_05_Color.lua +++ b/Lua_scripts/DSM FwdPrg_05_Color.lua @@ -524,11 +524,11 @@ local function GUI_HandleEvent(event, touchState) ctx.Refresh_Display=true if (DEBUG_ON) then dsmLib.LOG_write("%s: EVT_VIRTUAL_ENTER, SelLine=%d\n",dsmLib.phase2String(ctx.Phase), ctx.SelLine) end if ctx.SelLine == dsmLib.BACK_BUTTON then -- Back - dsmLib.GotoMenu(menu.BackId) + dsmLib.GotoMenu(menu.BackId,0) elseif ctx.SelLine == dsmLib.NEXT_BUTTON then -- Next - dsmLib.GotoMenu(menu.NextId) + dsmLib.GotoMenu(menu.NextId,0) elseif ctx.SelLine == dsmLib.PREV_BUTTON then -- Prev - dsmLib.GotoMenu(menu.PrevId) + dsmLib.GotoMenu(menu.PrevId,0) elseif menuLines[ctx.SelLine].ValId ~= 0 then -- Menu or Value if menuLines[ctx.SelLine].Type == LINE_TYPE.MENU then -- Navigate to Menu @@ -536,7 +536,7 @@ local function GUI_HandleEvent(event, touchState) -- SPECIAL Simulation menu to Exit Simulation GUI_SwitchSimulationOFF() else - dsmLib.GotoMenu(menuLines[ctx.SelLine].ValId) -- ValId is the MenuId to navigate to + dsmLib.GotoMenu(menuLines[ctx.SelLine].ValId, ctx.SelLine) -- ValId is the MenuId to navigate to end else -- Enter on a Value if ctx.isEditing() then -- already editing a Line???? diff --git a/Lua_scripts/DSMLIB/DsmFwPrgLib.lua b/Lua_scripts/DSMLIB/DsmFwPrgLib.lua index 7b50a73..997f0bc 100644 --- a/Lua_scripts/DSMLIB/DsmFwPrgLib.lua +++ b/Lua_scripts/DSMLIB/DsmFwPrgLib.lua @@ -507,10 +507,10 @@ local function DSM_Value_Default(line) end end -local function DSM_GotoMenu(menuId) - if (DEBUG_ON) then LOG_write("%3.3f %s: DSM_GotoMenu(0x%X)\n", getElapsedTime(), phase2String(DSM_Context.Phase), menuId) 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 - DSM_Context.SelLine = 0 + DSM_Context.SelLine = lastSelectedLine -- Request to load the menu Again DSM_ChangePhase(PHASE.MENU_TITLE) end @@ -584,9 +584,9 @@ local function DSM_getMainMenu() DSM_send(0x12, 0x06, 0x00, 0x14, 0x00, 0x00) -- first menu only end -local function DSM_getMenu(menuId, startLine) - if (DEBUG_ON) then LOG_write("SEND DSM_getMenu(MenuId=0x%X StartLine=%s)\n", menuId, startLine) end - DSM_send(0x16, 0x06, int16_MSB(menuId), int16_LSB(menuId), 0x00, startLine) +local function DSM_getMenu(menuId, latSelLine) + if (DEBUG_ON) then LOG_write("SEND DSM_getMenu(MenuId=0x%X LastSelectedLine=%s)\n", menuId, latSelLine) end + DSM_send(0x16, 0x06, int16_MSB(menuId), int16_LSB(menuId), 0x00, latSelLine) end local function DSM_getFirstMenuLine(menuId) @@ -640,9 +640,22 @@ local function DSM_sendRequest() if ctx.Menu.MenuId == 0 then -- First time loading a menu ? DSM_getMainMenu() else - -- Start with Line 0 always, otherwise it will be returning weird 0x05 lines if we start in (Menu.SelLine=-1) - -- for internal menu navigation - DSM_getMenu(ctx.Menu.MenuId, 0) + -- 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_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.Phase = PHASE.RX_VERSION + end end elseif ctx.Phase == PHASE.MENU_UNKNOWN_LINES then -- Still trying to figure out what are this menu lines are for @@ -815,7 +828,8 @@ local function DSM_Add_Error_Menu_Line(i, text) line.MinMaxOrig = "" line.Val = nil - line.Format = "" + + DSM_MenuLinePostProcessing(line) end ------------------------------------------------------------------------------------------------------------ @@ -841,7 +855,15 @@ local function DSM_processResponse() ctx.SelLine = BACK_BUTTON -- highlight Back end - ctx.Phase = PHASE.MENU_LINES + if (ctx.Menu.MenuId == 0x0001) then -- Still in RESETTING MENU??? + -- Star from Start + if (DEBUG_ON) then LOG_write("RX Reset: Still not done, restart again!!!\n") end + ctx.Menu.MenuId = 0 + ctx.Phase = PHASE.RX_VERSION + else + ctx.Phase = PHASE.MENU_LINES + end + elseif cmd == 0x03 then -- menu lines local line = DSM_parseMenuLine() @@ -866,15 +888,14 @@ local function DSM_processResponse() if (curLine==ctx.CurLine) then -- WEIRD BEHAVIOR - -- We got the same line we already got.. Stop requesting the same again and again - -- otherwise we end up in a deadlock loop, and RX will reset the connection + -- We got the same line we already got. thi will continue + -- on a loop and disconnect RX DSM_Add_Error_Menu_Line(0,"\bError: Cannot Load Menu Lines from RX") - ctx.Phase = PHASE.WAIT_CMD - if (DEBUG_ON) then LOG_write("ERROR: Received Same menu line, exiting the loop to prevent disconnect\n") end - else -- Got the next line.. keep requesting more - ctx.CurLine = curLine - ctx.Phase = PHASE.MENU_UNKNOWN_LINES - end + if (DEBUG_ON) then LOG_write("ERROR: Received Same menu line\n") end + end -- Got the next line.. keep requesting more + + ctx.CurLine = curLine + ctx.Phase = PHASE.MENU_UNKNOWN_LINES elseif cmd == 0xA7 then -- answer to EXIT command if (DEBUG_ON) then LOG_write("RESPONSE Exit Confirm\n") end @@ -941,6 +962,8 @@ local function DSM_Send_Receive() -- Refresh screen again context.Refresh_Display = true end + + end end end @@ -974,6 +997,7 @@ local function DSM_Init(toolName) PhaseText[PHASE.EXIT] = "EXIT" PhaseText[PHASE.EXIT_DONE] = "EXIT_DONE" + -- Line Types LineTypeText[LINE_TYPE.MENU] = "M" LineTypeText[LINE_TYPE.LIST_MENU0] = "L_m0" @@ -1178,6 +1202,7 @@ local function DSM_Init_Text(rxId) 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 -- But for FC6250HX, Override this previous values if (rxId == RX.FC6250HX) then @@ -1253,6 +1278,14 @@ 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] = "" + Text[0x021A] = "Set the model level," Text[0x021B] = "and press Continue." Text[0x021C] = "" -- empty?? @@ -1302,6 +1335,19 @@ local function DSM_Init_Text(rxId) Text[0x0250] = "from Adjustable to Fixed" 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] = "" + + --TODO: First time safe setup Page 2 (something related for flight mode) + --Text[0x025A] = "" + --Text[0x025B] = "" + --Text[0x025C] = "" + --Text[0x025D] = "" + --Text[0x025E] = "" + Text[0x0263] = "Fixed/Adjustable Gains /c/b" Text[0x0266] = "Heading Gain/c/b" Text[0x0267] = "Positive = Nose Up/Roll Right" diff --git a/Lua_scripts/DSMLIB/DsmFwPrgLib.luac b/Lua_scripts/DSMLIB/DsmFwPrgLib.luac deleted file mode 100644 index fb0950a313a49368885a71a4c5da8f409fae4a89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29271 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

mY*cT0tF(9$l8e(zT zJ8d0@5#lYAX1(WW{6OpqDd4e!?&qVCWq*iODCses02&_%dB`IXw1ki)Y<6m>cv05=E9+J5o33`D=v#; z>U7plE$#fzaJd~jn{s77+&EYNLq&RaDCbJfW&4s;q%GzAz02iatMgHaGPuMm#IK69 zU~69Sdp$lg6poJn0R2vQ9F+b7}5U$ D#Q7Jz diff --git a/Lua_scripts/DSMLIB/DsmFwPrgSIMLib.luac b/Lua_scripts/DSMLIB/DsmFwPrgSIMLib.luac deleted file mode 100644 index b1908516521868765e2a1f4621020e759740fab5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20481 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