Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Model Locator: support additional sources (RSSI/1RSS/2RSS/VFR) #84

Merged
merged 12 commits into from
Oct 19, 2022
229 changes: 142 additions & 87 deletions sdcard/c480x272/SCRIPTS/TOOLS/Model Locator (by RSSI).lua
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@

-- Model Locator by RSSI
-- Offer Shmuely (based on code from Scott Bauer 6/21/2015)
-- Date: 2021
-- ver: 0.1
-- Date: 2022
-- ver: 0.3

-- This widget help to find a lost/crashed model based on the RSSI (if still available)
-- The widget produce audio representation (variometer style) of the RSSI from the lost model
Expand All @@ -43,107 +43,162 @@ local img = Bitmap.open("/SCRIPTS/TOOLS/Model Locator (by RSSI).png")

--------------------------------------------------------------
local function log(s)
--return;
print("locator: " .. s)
-- print("locator: " .. s)
end
--------------------------------------------------------------


-- init_func is called once when model is loaded
local function init()
return 0
end

-- bg_func is called periodically when screen is not visible
local function bg()
return 0
return 0
end

-- This function returns green at gvalue, red at rvalue and graduate in between
local function getRangeColor(value, red_value, green_value)
local range = math.abs(green_value - red_value)
if range == 0 then
return lcd.RGB(0, 0xdf, 0)
end
if value == nil then
return lcd.RGB(0, 0xdf, 0)
end

if green_value > red_value then
if value > green_value then
return lcd.RGB(0, 0xdf, 0)
local range = math.abs(green_value - red_value)
if range == 0 then
return lcd.RGB(0, 0xdf, 0)
end
if value == nil then
return lcd.RGB(0, 0xdf, 0)
end

if green_value > red_value then
if value > green_value then
return lcd.RGB(0, 0xdf, 0)
end
if value < red_value then
return lcd.RGB(0xdf, 0, 0)
end
g = math.floor(0xdf * (value - red_value) / range)
r = 0xdf - g
return lcd.RGB(r, g, 0)
else
if value > green_value then
return lcd.RGB(0, 0xdf, 0)
end
if value < red_value then
return lcd.RGB(0xdf, 0, 0)
end
r = math.floor(0xdf * (value - green_value) / range)
g = 0xdf - r
return lcd.RGB(r, g, 0)
end
end

local function getSignalValues()

-- try regular RSSI
local fieldinfo = getFieldInfo("RSSI")
if fieldinfo then
local v = getValue("RSSI")
log("RSSI: " .. v)
lcd.drawText(3, 30, "Signal: RSSI", 0)
return v, 0, 100
end
if value < red_value then
return lcd.RGB(0xdf, 0, 0)

-- try expressLRS
local fieldinfo = getFieldInfo("1RSS")
if fieldinfo then
local v = getValue("1RSS")
lcd.drawText(3, 30, "Signal: 1RSS", 0)
if v == 0 then
v = -115
end
return v, -115, 20
end
g = math.floor(0xdf * (value - red_value) / range)
r = 0xdf - g
return lcd.RGB(r, g, 0)
else
if value > green_value then
return lcd.RGB(0, 0xdf, 0)

-- try expressLRS
local fieldinfo = getFieldInfo("2RSS")
if fieldinfo then
local v = getValue("2RSS")
lcd.drawText(3, 30, "Signal: 2RSS", 0)
if v == 0 then
v = -115
end
return v, -115, 20
end
if value < red_value then
return lcd.RGB(0xdf, 0, 0)

-- try UNI-ACSST firmware VFR
local fieldinfo = getFieldInfo("VFR")
if fieldinfo then
local v = getValue("VFR")
log("RSSI: " .. v)
lcd.drawText(3, 30, "Signal: VFR", 0)
return v, 0, 100
end
r = math.floor(0xdf * (value - green_value) / range)
g = 0xdf - r
return lcd.RGB(r, g, 0)
end

-- try elrs RQLY
local fieldinfo = getFieldInfo("RQLY")
if fieldinfo then
local v = getValue("RQLY")
log("RQLY: " .. v)
lcd.drawText(3, 30, "Signal: RQLY", 0)
return v, 0, 100
end

lcd.drawText(30, 3, "Signal: not found in RSSI/1RSS/2RSS/VFR", 0)
return nil, 0, 0
end

local function main(event)

lcd.clear()
local rssi = getValue("RSSI")
-- log(rssi)

-- background
--lcd.drawBitmap(img, 0, 20, 30)
lcd.drawBitmap(img, 250, 50, 40)

-- Title
lcd.drawText(3, 3, "RSSI Model Locator", 0)

--if (rssi > 42) then
-- lcd.setColor(CUSTOM_COLOR, YELLOW) -- RED / YELLOW
--else
-- lcd.setColor(CUSTOM_COLOR, RED) -- RED / YELLOW
--end
myColor = getRangeColor(rssi, 0, 100)
lcd.setColor(CUSTOM_COLOR, myColor)

-- draw current value
lcd.drawNumber(180, 30, rssi, XXLSIZE + CUSTOM_COLOR)
lcd.drawText(260, 70, "db", 0 + CUSTOM_COLOR)

-- draw main bar
lcd.setColor(CUSTOM_COLOR, YELLOW) -- RED / YELLOW
local xMin = 0
local yMin = 270
local xMax = 480
local yMax = 200
local h = 0
local rssiAsX = (rssi * xMax) / 100
-- log("rssi:"..rssi)
for xx = xMin, rssiAsX, 20 do
lcd.setColor(CUSTOM_COLOR, getRangeColor(xx, xMin, xMax - 40))
h = h + 10
lcd.drawFilledRectangle(xx, yMin - h, 15, h, CUSTOM_COLOR)
end

-- draw rectangle
--lcd.drawFilledRectangle(0, 250, rssi * 4.8, 20, GREY_DEFAULT)

-- beep
if getTime() >= nextPlayTime then
playFile("/SCRIPTS/TOOLS/Model Locator (by RSSI).wav")
nextPlayTime = getTime() + delayMillis - rssi
end


return 0

local function main(event, touchState)
lcd.clear()

local signalValue, signalMin, signalMax = getSignalValues()
-- log(signalValue)
if signalValue == nil then
return
end
log("signalValue:" .. signalValue .. ", signalMin: " .. signalMin .. ", signalMax: " .. signalMax)

-- background
--lcd.drawBitmap(img, 0, 20, 30)
lcd.drawBitmap(img, 250, 50, 40)

-- Title
lcd.drawText(3, 3, "RSSI Model Locator", 0)

--if (rssi > 42) then
-- lcd.setColor(CUSTOM_COLOR, YELLOW) -- RED / YELLOW
--else
-- lcd.setColor(CUSTOM_COLOR, RED) -- RED / YELLOW
--end
local signalPercent = 100 * ((signalValue - signalMin) / (signalMax - signalMin))
--myColor = getRangeColor(signalPercent, 0, 100)
--lcd.setColor(CUSTOM_COLOR, myColor)
lcd.setColor(CUSTOM_COLOR, getRangeColor(signalPercent, 0, 100))

-- draw current value
lcd.drawNumber(180, 30, signalValue, XXLSIZE + CUSTOM_COLOR)
lcd.drawText(260, 70, "db", 0 + CUSTOM_COLOR)

-- draw main bar
--lcd.setColor(CUSTOM_COLOR, YELLOW) -- RED / YELLOW
local xMin = 0
local yMin = 270
local xMax = 480
local yMax = 200
local h = 0
local rssiAsX = (signalPercent * xMax) / 100
log("signalPercent:" .. signalPercent .. ", signalValue: " .. signalValue .. ", rssiAsX: " .. rssiAsX)
for xx = xMin, rssiAsX, 20 do
lcd.setColor(CUSTOM_COLOR, getRangeColor(xx, xMin, xMax - 40))
h = h + 10
lcd.drawFilledRectangle(xx, yMin - h, 15, h, CUSTOM_COLOR)
end

-- draw rectangle
--lcd.drawFilledRectangle(0, 250, signalPercent * 4.8, 20, GREY_DEFAULT)

-- beep
if getTime() >= nextPlayTime then
playFile("/SCRIPTS/TOOLS/Model Locator (by RSSI).wav")
nextPlayTime = getTime() + delayMillis - signalPercent
end

return 0
end

return {init = init,run = main,background = bg}
return { init = init, run = main }