diff --git a/plugin.lua b/plugin.lua index 1bbfc0d..7e05918 100644 --- a/plugin.lua +++ b/plugin.lua @@ -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 diff --git a/scripts/1-af.lua b/scripts/1-af.lua new file mode 100644 index 0000000..93d3a9f --- /dev/null +++ b/scripts/1-af.lua @@ -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 \ No newline at end of file