Elrsv2 - Copia - Lua
Elrsv2 - Copia - Lua
---- #########################################################################
---- # #
---- # Copyright (C) OpenTX #
-----# #
---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html #
---- # #
---- # This program is free software; you can redistribute it and/or modify #
---- # it under the terms of the GNU General Public License version 2 as #
---- # published by the Free Software Foundation. #
---- # #
---- # This program is distributed in the hope that it will be useful #
---- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
---- # GNU General Public License for more details. #
---- # #
---- #########################################################################
local deviceId = 0xEE
local handsetId = 0xEF
local deviceName = ""
local lineIndex = 1
local pageOffset = 0
local edit = nil
local charIndex = 1
local fieldPopup
local fieldTimeout = 0
local fieldId = 1
local fieldChunk = 0
local fieldData = {}
local fields = {}
local devices = {}
local goodBadPkt = "?/??? ?"
local elrsFlags = 0
local elrsFlagsInfo = ""
local fields_count = 0
local backButtonId = 2
local devicesRefreshTimeout = 50
local allParamsLoaded = 0
local folderAccess = nil
local statusComplete = 0
local commandRunningIndicator = 1
local expectedChunks = -1
local deviceIsELRS_TX = nil
local linkstatTimeout = 100
local titleShowWarn = nil
local titleShowWarnTimeout = 100
local COL2
local maxLineIndex
local textXoffset
local textYoffset
local textSize
-- UINT8
local function fieldUint8Load(field, data, offset)
fieldUnsignedLoad(field, data, offset, 1)
end
-- INT8
local function fieldInt8Load(field, data, offset)
fieldSignedLoad(field, data, offset, 1)
end
-- UINT16
local function fieldUint16Load(field, data, offset)
fieldUnsignedLoad(field, data, offset, 2)
end
-- INT16
local function fieldInt16Load(field, data, offset)
fieldSignedLoad(field, data, offset, 2)
end
-- FLOAT
local function fieldFloatLoad(field, data, offset)
field.value = fieldGetValue(data, offset, 4)
field.min = fieldGetValue(data, offset+4, 4)
field.max = fieldGetValue(data, offset+8, 4)
--field.default = fieldGetValue(data, offset+12, 4)
fieldUnsignedToSigned(field, 4)
field.prec = data[offset+16]
if field.prec > 3 then
field.prec = 3
end
field.step = fieldGetValue(data, offset+17, 4)
field.unit = fieldGetString(data, offset+21, field.unit)
end
-- TEXT SELECTION
local function fieldTextSelectionLoad(field, data, offset)
field.values, offset = fieldGetSelectOpts(data, offset, field.values)
field.value = data[offset]
-- min max and default (offset+1 to 3) are not used on selections
field.unit = fieldGetString(data, offset+4, field.unit)
end
-- STRING
local function fieldStringLoad(field, data, offset)
field.value, offset = fieldGetString(data, offset)
if #data >= offset then
field.maxlen = data[offset]
end
end
lineIndex = 1
pageOffset = 0
end
backFld.parent = 255
backFld.li = nil
backFld.po = nil
folderAccess = nil
end
local functions = {
{ load=fieldUint8Load, save=fieldUint8Save, display=fieldIntDisplay }, --1
UINT8(0)
{ load=fieldInt8Load, save=fieldInt8Save, display=fieldIntDisplay }, --2 INT8(1)
{ load=fieldUint16Load, save=fieldUint16Save, display=fieldIntDisplay }, --3
UINT16(2)
{ load=fieldInt16Load, save=fieldInt16Save, display=fieldIntDisplay }, --4
INT16(3)
nil,
nil,
nil,
nil,
{ load=fieldFloatLoad, save=fieldFloatSave, display=fieldFloatDisplay }, --9
FLOAT(8)
{ load=fieldTextSelectionLoad, save=fieldTextSelectionSave,
display=fieldTextSelectionDisplay }, --10 SELECT(9)
{ load=fieldStringLoad, save=fieldStringSave, display=fieldStringDisplay }, --11
STRING(10)
{ load=nil, save=fieldFolderOpen, display=fieldFolderDisplay }, --12 FOLDER(11)
{ load=fieldStringLoad, save=fieldStringSave, display=fieldStringDisplay }, --13
INFO(12)
{ load=fieldCommandLoad, save=fieldCommandSave, display=fieldCommandDisplay },
--14 COMMAND(13)
{ load=nil, save=UIbackExec, display=fieldCommandDisplay }, --15 back(14)
{ load=nil, save=fieldDeviceIdSelect, display=fieldCommandDisplay }, --16
device(15)
{ load=nil, save=fieldFolderDeviceOpen, display=fieldFolderDisplay }, --17
deviceFOLDER(16)
}
field.id = fieldId
local parent = (fieldData[1] ~= 0) and fieldData[1] or nil
local type = fieldData[2] % 128
local hidden = (bit32.rshift(fieldData[2], 7) == 1) or nil
local offset
if field.name ~= nil then -- already seen this field before, so we can validate
this packet is correct
if field.parent ~= parent or field.type ~= type or field.hidden ~= hidden
then
fieldData = {}
return -- no data extraction
end
end
field.parent = parent
field.type = type
field.hidden = hidden
field.name, offset = fieldGetString(fieldData, 3, field.name)
if functions[field.type+1].load then
functions[field.type+1].load(field, fieldData, offset)
end
if field.min == 0 then field.min = nil end
if field.max == 0 then field.max = nil end
-- Main
local function runDevicePage(event)
handleDevicePageEvent(event)
lcd_title()
local result
if fieldPopup.status == 0 and fieldPopup.lastStatus ~= 0 then -- stopped
popupCompat(fieldPopup.info, "Stopped!", event)
reloadAllField()
fieldPopup = nil
elseif fieldPopup.status == 3 then -- confirmation required
result = popupCompat(fieldPopup.info, "PRESS [OK] to confirm", event)
fieldPopup.lastStatus = fieldPopup.status
if result == "OK" then
crossfireTelemetryPush(0x2D, { deviceId, handsetId, fieldPopup.id, 4 })
fieldTimeout = getTime() + fieldPopup.timeout -- we are expecting an
immediate response
fieldPopup.status = 4
elseif result == "CANCEL" then
fieldPopup = nil
end
elseif fieldPopup.status == 2 then -- running
if statusComplete then
commandRunningIndicator = (commandRunningIndicator % 4) + 1
end
result = popupCompat(fieldPopup.info .. " [" .. string.sub("|/-\\",
commandRunningIndicator, commandRunningIndicator) .. "]", "Press [RTN] to exit",
event)
fieldPopup.lastStatus = fieldPopup.status
if result == "CANCEL" then
crossfireTelemetryPush(0x2D, { deviceId, handsetId, fieldPopup.id, 5 })
fieldTimeout = getTime() + fieldPopup.timeout -- we are expecting an
immediate response
fieldPopup = nil
end
end
end
-- Init
local function init()
setLCDvar()
setMock()
setLCDvar = nil
setMock = nil
end
-- Main
local function run(event)
if event == nil then
error("Cannot be run as a model script!")
return 2
end
refreshNext()
return 0
end