1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-23 00:05:17 +03:00
opentx/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/crossfire.lua
3djc d9a035db11 Differentiate between inc/dec and prev/next because of x9d(+) (#6890)
* Review virtual event to differentiate between prev/next and inc/dec

* Review scripts

* Replace VIRTUAL_PREVIOUS by VIRTUAL_PREV
2019-10-04 08:39:31 +02:00

121 lines
3.5 KiB
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 devices = { }
local lineIndex = 1
local pageOffset = 0
local function createDevice(id, name)
local device = {
id = id,
name = name,
timeout = 0
}
return device
end
local function getDevice(name)
for i=1, #devices do
if devices[i].name == name then
return devices[i]
end
end
return nil
end
local function parseDeviceInfoMessage(data)
local id = data[2]
local name = ""
local i = 3
while data[i] ~= 0 do
name = name .. string.char(data[i])
i = i + 1
end
local device = getDevice(name)
if device == nil then
device = createDevice(id, name)
devices[#devices + 1] = device
end
local time = getTime()
device.timeout = time + 3000 -- 30s
if lineIndex == 0 then
lineIndex = 1
end
end
local devicesRefreshTimeout = 0
local function refreshNext()
local command, data = crossfireTelemetryPop()
if command == nil then
local time = getTime()
if time > devicesRefreshTimeout then
devicesRefreshTimeout = time + 100 -- 1s
crossfireTelemetryPush(0x28, { 0x00, 0xEA })
end
elseif command == 0x29 then
parseDeviceInfoMessage(data)
end
end
local function selectDevice(step)
lineIndex = 1 + ((lineIndex + step - 1 + #devices) % #devices)
end
-- Init
local function init()
lineIndex = 0
pageOffset = 0
end
NoCross = { 110, LCD_H - 28, "Waiting for Crossfire devices...", TEXT_COLOR + INVERS + BLINK }
-- Main
local function run(event)
if event == nil then
error("Cannot be run as a model script!")
return 2
elseif event == EVT_VIRTUAL_EXIT then
return 2
elseif event == EVT_VIRTUAL_NEXT then
selectDevice(1)
elseif event == EVT_VIRTUAL_PREV then
selectDevice(-1)
end
lcd.clear()
lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR)
lcd.drawText(1, 5,"CROSSFIRE SETUP", MENU_TITLE_COLOR)
if #devices == 0 then
lcd.drawText(NoCross[1],NoCross[2],NoCross[3],NoCross[4])
else
for i=1, #devices do
local attr = (lineIndex == i and INVERS or 0)
if event == EVT_VIRTUAL_ENTER and attr == INVERS then
crossfireTelemetryPush(0x28, { devices[i].id, 0xEA })
return "device.lua"
end
lcd.drawText(5, i*22+10, devices[i].name, attr)
end
end
refreshNext()
return 0
end
return { init=init, run=run }