Skip to content

Commit

Permalink
RSSI Model Locator: Add for B&W Radios
Browse files Browse the repository at this point in the history
Adds the RSSI Model Locator for black and white radios.

Been tested only on simulator, a real-world test should probably be performed.
  • Loading branch information
AegisCrusader committed Dec 24, 2024
1 parent 7f4d96a commit 18d84b7
Show file tree
Hide file tree
Showing 2 changed files with 156 additions and 0 deletions.
Binary file not shown.
156 changes: 156 additions & 0 deletions sdcard/bw128x64/SCRIPTS/TOOLS/RSSI Model Locator.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
---- #########################################################################
---- # #
---- # 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/Model Locator (by RSSI).wav")
if useHaptic then
playHaptic(7, 0, 1)
end
nextPlayTime = getTime() + delayMillis - signalPercent
end

return 0
end

return {init = init, run = run}

0 comments on commit 18d84b7

Please sign in to comment.