mirror of
https://github.com/opentx/opentx.git
synced 2025-07-23 00:05:17 +03:00
* Review virtual event to differentiate between prev/next and inc/dec * Review scripts * Replace VIRTUAL_PREVIOUS by VIRTUAL_PREV
121 lines
3.5 KiB
Lua
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 }
|