Initial Commit
This commit is contained in:
commit
933eee69e4
216 changed files with 20588 additions and 0 deletions
157
SCRIPTS/TOOLS/ModelLocator.lua
Executable file
157
SCRIPTS/TOOLS/ModelLocator.lua
Executable file
|
|
@ -0,0 +1,157 @@
|
|||
---- TNS|Model Locator|TNE
|
||||
---- #########################################################################
|
||||
---- # #
|
||||
---- # Telemetry Widget script for b&w 128x64 radios #
|
||||
---- # Copyright (C) EdgeTX #
|
||||
-----# #
|
||||
---- # 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. #
|
||||
---- # #
|
||||
---- #########################################################################
|
||||
|
||||
-- Model Locator by RSSI
|
||||
-- AegisCrusader & Offer Shmuely (based on code from Scott Bauer 6/21/2015)
|
||||
-- Date: 2022-2024
|
||||
-- ver: 0.6
|
||||
local app_ver = "0.6"
|
||||
|
||||
-- This widget help to find a lost/crashed model based on the RSSI (if still available)
|
||||
-- The widget produce audio representation (vario-meter style) of the RSSI from the lost model
|
||||
-- The widget also displays the RSSI in a visible bar
|
||||
|
||||
-- There are two way to use it
|
||||
-- 1. The simple way:
|
||||
-- walk toward the quad/plane that crashed,
|
||||
-- as you get closer to your model the beeps will become more frequent with higher pitch (and a visual bar graph as well)
|
||||
-- until you get close enough to find it visually
|
||||
|
||||
-- 2. the more accurate way:
|
||||
-- turn the antenna straight away (i.e. to point from you, straight away)
|
||||
-- try to find the weakest signal! (not the highest), i.e. the lowest RSSI you can find, this is the direction to the model.
|
||||
-- now walk to the side (not toward the model), find again the weakest signal, this is also the direction to your model
|
||||
-- triangulate the two lines, and it will be :-)
|
||||
|
||||
local delayMillis = 100
|
||||
local targetTXPower = 25
|
||||
local nextPlayTime = getTime()
|
||||
local useHaptic = false
|
||||
|
||||
local function getSignalValues()
|
||||
-- try to get transmitter power
|
||||
local txPowerField = getFieldInfo("TPWR")
|
||||
local txPowerValue = nil
|
||||
if txPowerField then
|
||||
txPowerValue = getValue("TPWR")
|
||||
end
|
||||
|
||||
-- try regular Frsky RSSI
|
||||
local fieldinfo = getFieldInfo("RSSI")
|
||||
if fieldinfo then
|
||||
local v = getValue("RSSI")
|
||||
return v, 0, 100, txPowerValue, "Using signal: Frsky RSSI", nil
|
||||
end
|
||||
|
||||
-- try expressLRS antenna 1
|
||||
local fieldinfo = getFieldInfo("1RSS")
|
||||
if fieldinfo then
|
||||
local v = getValue("1RSS")
|
||||
if v == 0 then
|
||||
v = -115
|
||||
end
|
||||
return v, -115, 20, txPowerValue, "Using signal: ELRS 1RSS", "Set TX PWR 25mW No Dyn"
|
||||
end
|
||||
|
||||
-- try expressLRS antenna 2
|
||||
local fieldinfo = getFieldInfo("2RSS")
|
||||
if fieldinfo then
|
||||
local v = getValue("2RSS")
|
||||
if v == 0 then
|
||||
v = -115
|
||||
end
|
||||
return v, -115, 20, txPowerValue, "Using signal: ELRS 2RSS", "Set TX PWR 25mW No Dyn"
|
||||
end
|
||||
|
||||
return nil, 0, 0
|
||||
end
|
||||
|
||||
local function init()
|
||||
lcd.clear()
|
||||
end
|
||||
|
||||
local function run(event)
|
||||
-- exit script
|
||||
if event == EVT_VIRTUAL_EXIT then
|
||||
return 2
|
||||
end
|
||||
|
||||
lcd.clear()
|
||||
|
||||
local signalValue, signalMin, signalMax, txPower, line1, line2 = getSignalValues()
|
||||
|
||||
lcd.drawText(0, 0, "Model Locator by RSSI", BOLD)
|
||||
|
||||
if signalValue == nil then
|
||||
lcd.drawText(0, 24, "No signal, expected:", 0 + BLINK)
|
||||
lcd.drawText(0, 32, "RSSI/1RSS/2RSS", 0 + BLINK)
|
||||
return 0
|
||||
end
|
||||
|
||||
if txPower then
|
||||
lcd.drawText(0, 16, "Current TX PWR: " .. tostring(txPower) .. "mW")
|
||||
|
||||
if txPower ~= targetTXPower then
|
||||
lcd.drawText(0, 8, line2 or "", BLINK)
|
||||
else
|
||||
lcd.drawText(0, 8, "[ENTER] to toggle haptic")
|
||||
end
|
||||
else
|
||||
lcd.drawText(0, 8, "[ENTER] to toggle haptic")
|
||||
end
|
||||
|
||||
local signalPercent = 100 * ((signalValue - signalMin) / (signalMax - signalMin))
|
||||
|
||||
lcd.drawText(0, 24, tostring(signalValue) .. "dB", DBLSIZE)
|
||||
|
||||
-- draw main bar
|
||||
local xMin = 10
|
||||
local yMin = LCD_H - 10
|
||||
local xMax = LCD_W
|
||||
local h = 0
|
||||
local rssiAsX = (signalPercent * xMax) / 100
|
||||
|
||||
for xx = xMin, rssiAsX, 7 do
|
||||
h = h + 2
|
||||
lcd.drawFilledRectangle(xx, yMin - h, 5, h)
|
||||
end
|
||||
|
||||
lcd.drawFilledRectangle(0, LCD_H - 10, LCD_W, 1)
|
||||
|
||||
-- current signal type
|
||||
lcd.drawText(0, LCD_H - 8, line1)
|
||||
|
||||
-- toggle haptic
|
||||
if event == EVT_VIRTUAL_ENTER then
|
||||
useHaptic = not useHaptic
|
||||
end
|
||||
|
||||
-- beep
|
||||
if getTime() >= nextPlayTime then
|
||||
playFile("/SCRIPTS/TOOLS/modloc.wav")
|
||||
if useHaptic then
|
||||
playHaptic(7, 0, 1)
|
||||
end
|
||||
nextPlayTime = getTime() + delayMillis - signalPercent
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
return {init = init, run = run}
|
||||
Loading…
Add table
Add a link
Reference in a new issue