0
1
mirror of https://github.com/radio95-rnt/rds95.git synced 2026-02-26 20:33:53 +01:00

first version of af oda in lua

This commit is contained in:
2025-12-27 17:47:25 +01:00
parent ab3ee3e925
commit 4022843662
2 changed files with 84 additions and 3 deletions

View File

@@ -292,10 +292,10 @@ function set_rds_udg2(xy, groups) end
---Group 3A will mean that there will be no group handler for this ODA, meaning it can only be interacted with via the 3A AID group, handler set is not possible with such groups
---@param group integer
---@param group_version boolean
---@param id integer
---@param id_data integer
---@param aid integer
---@param data integer
---@return integer oda_id
function register_oda(group, group_version, id, id_data) end
function register_oda(group, group_version, aid, data) end
---This function is defined externally
---Sets the id_data for a existing ODA group
---@param oda_id integer

81
scripts/1-af.lua Normal file
View File

@@ -0,0 +1,81 @@
_Af_Oda_id = nil
_Af_Oda_state = 0
_Af_Oda_len = 0
_Af_Oda_afs = {}
---@param freq number
---@return table
local function encode_af(freq)
local out = {}
if(freq >= 87.6 and freq <= 107.9) then
table.insert(out, math.tointeger((freq * 10) - 875))
elseif freq >= 64.1 and freq <= 88.0 then
table.insert(out, math.tointeger((freq * 10) - 384))
elseif freq >= 153 and freq <= 279 then
table.insert(out, 250) -- LFMF incoming
table.insert(out, (freq - 153) / 9 + 1)
elseif freq >= 531 and freq <= 1602 then
table.insert(out, 250) -- LFMF incoming
table.insert(out, (freq - 531) / 9 + 16)
end
return out
end
local function get_next_af_oda_group()
local af = {0, 0, 0, 0}
local num_entries = #_Af_Oda_afs
local i = 1
if _Af_Oda_state == 0 then
af[1] = 224 + math.min(_Af_Oda_len, 25)
_Af_Oda_state = 1
i = 2
end
while i <= 4 do
if _Af_Oda_state <= num_entries then
af[i] = _Af_Oda_afs[_Af_Oda_state]
_Af_Oda_state = _Af_Oda_state + 1
else af[i] = 205 end
i = i + 1
end
if _Af_Oda_state > num_entries then _Af_Oda_state = 0 end
local b = (7 << 12)
for j = 1, 4 do
local bit8 = (math.tointeger(af[j]) >> 8) & 0x01
b = b | (bit8 << (j - 1))
end
return b, ((math.tointeger(af[1]) & 0xFF) << 8) | (math.tointeger(af[2]) & 0xFF), ((math.tointeger(af[3]) & 0xFF) << 8) | (math.tointeger(af[4]) & 0xFF)
end
local function init_af_oda()
if _Af_Oda_id == nil then
_Af_Oda_id = register_oda(7, false, 0x6365, 0)
set_oda_handler(_Af_Oda_id, function()
local b, c, d = get_next_af_oda_group()
return true, b, c, d
end)
end
end
---Sets the AFs included in the ODA
---@param afs table List of numbers (e.g., {98.1, 102.5})
function set_rds_af_oda(afs)
_Af_Oda_afs = {}
_Af_Oda_len = #afs
for _, f in ipairs(afs) do
local codes = encode_af(f)
for _, code in ipairs(codes) do
table.insert(_Af_Oda_afs, code)
end
end
_Af_Oda_state = 0
if _Af_Oda_id == nil then init_af_oda() end
end
function on_state()
init_af_oda()
end