From c5224d5a5377a35e88b22705f0563adc9cdb7c69 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Fri, 2 Jan 2026 20:44:45 +0100 Subject: [PATCH] implement rt+ --- examples/test.lua | 98 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/examples/test.lua b/examples/test.lua index 3a17a8a..2298e7a 100644 --- a/examples/test.lua +++ b/examples/test.lua @@ -458,21 +458,11 @@ local pi_ecc_to_country = { } local pi_coverage = { - "Local", - "International", - "National", - "Supra-regional", - "Regional 4", - "Regional 5", - "Regional 5", - "Regional 7", - "Regional 8", - "Regional 9", - "Regional A", - "Regional B", - "Regional C", - "Regional D", - "Regional E", + "Local", "International", "National", + "Supra-regional", "Regional 4", "Regional 5", + "Regional 5", "Regional 7", "Regional 8", + "Regional 9", "Regional A", "Regional B", + "Regional C", "Regional D", "Regional E", "Regional F", } @@ -480,21 +470,54 @@ local time_display_utc = "-" local time_display_local = "-" local time_display_offset = 0 +local rtp_len1 = 0 +local rtp_len2 = 0 +local rtp_type1 = 0 +local rtp_type2 = 0 +local rtp_start1 = 0 +local rtp_start2 = 0 +local rtp_toggle = false +local rtp_running = false + +local rtp_types = { + "DUMMY_CLASS", + "ITEM.TITLE", "ITEM.ALBUM", "ITEM.TRACKNUMBER", + "ITEM.ARTIST", "ITEM.COMPOSITION", "ITEM.MOVEMENT", + "ITEM.CONDUCTOR", "ITEM.COMPOSER", "ITEM.BAND", + "ITEM.COMMENT", "ITEM.GENRE", "INFO.NEWS", + "INFO.NEWS.LOCAL", "INFO.STOCKMARKET", "INFO.SPORT", + "INFO.LOTTERY", "INFO.HOROSCOPE", "INFO.DAILY_DIVERSION", + "INFO.HEALTH", "INFO.EVENT", "INFO.SCENE", + "INFO.CINEMA", "INFO.TV", "INFO.DATE_TIME", + "INFO.WEATHER", "INFO.TRAFFIC", "INFO.ALARM", + "INFO.ADVERTISEMENT", "INFO.URL", "INFO.OTHER", + "STATIONNAME.SHORT", "STATIONNAME.LONG", "PROGRAMME.NOW", + "PROGRAMME.NEXT", "PROGRAMME.PART", "PROGRAMME.HOST", + "PROGRAMME.EDITORIAL_STAFF", "PROGRAMME.FREQUENCY", "PROGRAMME.HOMEPAGE", + "PROGRAMME.SUBCHANNEL", "PHONE.HOTLINE", "PHONE.STUDIO", + "PHONE.OTHER", "SMS.STUDIO", "SMS.OTHER", + "EMAIL.HOTLINE", "EMAIL.STUDIO", "EMAIL.OTHER", + "MMS.OTHER", "CHAT", "CHAT.CENTRE", + "VOTE.QUESTION", "VOTE.CENTRE", "RFU_1", + "RFU_2", "PRIVATE_1", "PRIVATE_2", + "PRIVATE_3", "PLACE", "APPOINTMENT", + "IDENTIFIER", "PURCHASE", "GET_DATA" +} + local last_render_hash = 0 local function crc(data) - local crc = 0xFF + local sum = 0xFF for i = 1, #data do - crc = crc ~ data:byte(i) - + sum = sum ~ data:byte(i) for _ = 1, 8 do - if (crc & 0x80) ~= 0 then crc = (crc << 1) ~ 0x7 - else crc = crc << 1 end - crc = crc & 0xFF + if (sum & 0x80) ~= 0 then sum = (sum << 1) ~ 0x7 + else sum = sum << 1 end + sum = sum & 0xFF end end - return crc + return sum end local function render_menu() @@ -504,12 +527,21 @@ local function render_menu() set_font_size(72) -- largest as i can do, this is directly from the public's wants (https://pira.cz/forum/index.php?topic=1124.0) out = out .. string.format("PI: %X (SPI: %X)\r\n", last_pi, last_super_pi) out = out .. string.format("PS: %s", db.read_value("PS") or "--------") - elseif current_menu == 2 then + elseif current_menu == 2 and not menu_extended then out = out .. string.format("PTY: %d (%s / %s)\r\n", pty, pty_rds[pty+1], pty_rbds[pty+1]) out = out .. string.format("TP %s | TA %s | DPTY %s\r\n", tp and "+" or "-", ta and "+" or "-", dpty and "+" or "-") out = out .. string.format("PTYN: %s\r\n\r\n", ptyn) out = out .. string.format("RT[A]: %s%s\r\n", last_rt and ">" or " ", rta_display) out = out .. string.format("RT[B]: %s%s\r\n\r\n", (not last_rt) and ">" or " ", rtb_display) + elseif current_menu == 2 and menu_extended then + local current_rt = rta_display + if not last_rt then current_rt = rtb_display end + out = out .. string.format("RTP\r\n\tRUNNING %s | TOGGLE %s\r\n\t", rtp_running and "+" or "-", rtp_toggle and "+" or "-") + if rtp_running then + out = out .. string.format("%s - %s\r\n\t", rtp_types[rtp_type1+1], current_rt:sub(rtp_start1, rtp_start1+rtp_len1+1)) + out = out .. string.format("%s - %s\r\n\t", rtp_types[rtp_type2+1], current_rt:sub(rtp_start2, rtp_start2+rtp_len2+1)) + else out = out .. "-\r\n-\t\r\n" end + out = out .. string.format("RAW %d,%d,%d,%d,%d,%d\r\n", rtp_type1, rtp_start1, rtp_len1, rtp_type2, rtp_start2, rtp_len2) elseif current_menu == 3 then local country_id = (last_pi & 0xF000) >> 12 local coverage_id = (last_pi & 0xF00) >> 8 @@ -593,6 +625,14 @@ function command(cmd, param) time_display_utc = "-" time_display_local = "-" time_display_offset = 0 + rtp_running = false + rtp_running = false + rtp_type1 = 0 + rtp_start1 = 0 + rtp_len1 = 0 + rtp_type2 = 0 + rtp_start2 = 0 + rtp_len2 = 0 elseif cmd:lower() == "superpi" then if #param <= 4 then last_super_pi = tonumber(param, 16) end end @@ -707,8 +747,10 @@ function group(stream, b_corr, a, b, c, d, time) if odas[target_group] == nil then odas[target_group] = { aid = d, version = (b & 1) } end else local ert_grp, ert_ver = findODAByAID(odas, 0x6552) + local rtp_grp, rtp_ver = findODAByAID(odas, 0x4BD7) if ert_grp and group_type == ert_grp and group_version == ert_ver then + if d < 0 or c < 0 then return end local ert_state = b & 0x1f local new_chars = string.char((c >> 8) & 0xff) .. string.char(c & 0xff) .. string.char((d >> 8) & 0xff) .. string.char(d & 0xff) local start_pos = (ert_state * 4) + 1 @@ -717,6 +759,16 @@ function group(stream, b_corr, a, b, c, d, time) local carriage = ert_string:find("\r", 1, true) if carriage then ert_display = ert_string:sub(1, carriage - 1) else ert_display = ert_string:gsub("%s+$", "") end + elseif rtp_grp and group_type == rtp_grp and group_version == rtp_ver then + if d < 0 or c < 0 then return end + rtp_toggle = ((b & 0x10) >> 4) ~= 0 + rtp_running = ((b & 8) >> 3) ~= 0 + rtp_type1 = (b & 7) << 3 | (c & 0xe000) >> 13 + rtp_start1 = (c & 0x1f80) >> 7 + rtp_len1 = (c >> 1) & 63 + rtp_type2 = ((c & 1) << 6) | (d >> 11) & 63 + rtp_start2 = (d >> 5) & 63 + rtp_len2 = d & 0x1f else if group_type == 0 then ta = ((b & 0x10) >> 4) ~= 0