From a53be1d81adce689fa07afbe8d3289ace948582c Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Fri, 2 Jan 2026 13:20:20 +0100 Subject: [PATCH] lps and also complete the ecc table --- examples/test.lua | 452 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 447 insertions(+), 5 deletions(-) diff --git a/examples/test.lua b/examples/test.lua index b3d8ce1..8f6a503 100644 --- a/examples/test.lua +++ b/examples/test.lua @@ -6,6 +6,7 @@ local last_super_pi = 0 local ert_string = string.rep("_", 128) local rt_a = string.rep("_", 64) local rt_b = string.rep("_", 64) +local lps = string.rep("_", 32) local ptyn_toggle = false local ptyn = string.rep(" ", 8) @@ -16,6 +17,8 @@ local ert_display = "" local last_rt = false local rta_display = "" local rtb_display = "" +local lps_display = "" + local current_menu = 1 @@ -51,6 +54,409 @@ local tp = false local ta = false local dpty = false +local ecc = 0 +local pi_code_to_country = { + "Encoder fault", + "CM DE GR KW MA MD ME NA SL AI BO GT PR US VI AUS-CT KI LA", + "CF CZ DZ EE IE LR QA ZW AG CO HN PR US VI AUS-NSW BT TH", + "PL AD DJ EH GH KG MK MZ SM TR AW BR JM PR US VI AUS-V BD KH TO", + "Cabinda CH IL MG MR UG VA FK MQ PR US VI AUS-Q PK WS", + "IT JO ML RW SK ST SZ TJ BB MS PR US VI AUS-SA FJ IN", + "AO BE CV FI KE LS OM SY UA BZ PR TT US VI AUS-WA MO", + "GQ Kosovo LU RU SN SO TN KY NI PR US VI AUS-T NR VN", + "BG GA GM NE NL PS PT SC CR PR SR US VI AUS-NT CH IR PH", + "AL BI DK GN LI LV SA SI TD CU PA PR US UY VI CH JP NZ PG", + "AM AT GI GW IS LB MU SH SS ZA AR DM PR KN US VI AF SG SB", + "AZ BF BW CD HU IQ MC UZ YE BR CA DO MX PR LC US VI BN MV MH MM", + "CG CI GB GE HR KM LT MT SD BM BR CA CL SN PR VC US VI CH ID LK", + "AE DE KZ LY RS TG TZ BR CA GD HT MX AN PR US VI KP TW", -- kp is the best here man, also tw? wtf + "Bahrein BJ ES ET RO SE TM ZM CA GP MX TB PR US VE VI KR FM NP", + "BA BY EG ER FR MN MW NG NO BS GL GY MX PM VG HK MY VU", +} + +local pi_ecc_to_country = { + e0 = { + "Encoder fault", -- 0 + "Federal Republic of Germany", -- 1 + "People's Democratic Republic of Algeria", -- 2 + "Principality of Andorra", -- 3 + "State of Israel", -- 4 + "Italian Republic", -- 5 + "Kingdom of Belgium", -- 6 + "Russian Federation", -- 7 + "State of Palestine", -- 8 + "Republic of Albania", -- 9 + "Federal Republic of Austria", -- 10 A + "Hungary", -- 11 B + "Republic of Malta", -- 12 C + "Federal Republic of Germany", -- 13 D + "Unknown", -- 14 E + "Arab Republic of Egypt", -- 15 F + }, + e1 = { + "Encoder fault", -- 0 + "Hellenic Republic (Greece)", -- 1 + "Libya", -- 2 + "Republic of San Marino", -- 3 + "Swiss Confederation", -- 4 + "Hashemite Kingdom of Jordan", -- 5 + "Republic of Finland", -- 6 + "Grand Duchy of Luxembourg", -- 7 + "Republic of Bulgaria", -- 8 + "Kingdom of Denmark", -- 9 + "United Kingdom of Great Britain and Northern Ireland (Gibraltar)", -- 10 A + "Republic of Iraq", -- 11 B + "United Kingdom of Great Britain and Northern Ireland", -- 12 C + "Unknown", -- 13 D + "Romania", -- 14 E + "Republic of France", -- 15 F wish i could nuke this + }, + e2 = { + "Encoder fault", -- 0 + "Kingdom of Morocco", -- 1 + "Czech Republic", -- 2 + "Republic of Poland", -- 3 + "Vatican City State", -- 4 : not an UN member, had to google them and not just copy from the pdf + "Slovak Republic", -- 5 + "Syrian Arab Republic", -- 6 + "Republic of Tunisia", -- 7 + "Unknown", -- 8 + "Principality of Liechtenstein", -- 9 + "Republic of Iceland", -- 10 A + "Principality of Monaco", -- 11 B + "Republic of Lithuania", -- 12 C + "Republic of Serbia", -- 13 D + "Kingdom of Spain", -- 14 E + "Kingdom of Norway", -- 15 F + }, + e3 = { + "Encoder fault", -- 0 + "Montenegro", -- 1 + "Ireland", -- 2 + "Republic of Turkey", -- 3 + "Unknown", -- 4 + "Republic of Tajikistan", -- 5 + "Unknown", -- 6 + "Unknown", -- 7 + "Kingdom of the Netherlands", -- 8 + "Republic of Latvia", -- 9 + "Republic of Lebanon", -- 10 A + "Republic of Azerbaijan", -- 11 B + "Republic of Croatia", -- 12 C + "Republic of Kazakhstan", -- 13 D + "Kingdom of Sweden", -- 14 E + "Republic of Belarus", -- 15 F + }, + e4 = { + "Encoder fault", -- 0 + "Republic of Moldova", -- 1 + "Republic of Estonia", -- 2 + "The former Yugoslav Republic of Macedonia", -- 3 + "Unknown", -- 4 + "Unknown", -- 5 + "Ukraine", -- 6 + "Republic of Kosovo", -- 7 : had to google this one too, no un + "Republic of Portugal", -- 8 + "Republic of Slovenia", -- 9 + "Republic of Armenia", -- 10 A + "Republic of Uzbekistan", -- 11 B + "Georgia", -- 12 C + "Unknown", -- 13 D + "Turkmenistan", -- 14 E + "Bosnia and Herzegovina", -- 15 F + }, + e5 = { + "Encoder fault", -- 0 + "Unknown", -- 1 + "Unknown", -- 2 + "Kyrgyz Republic (Kyrgyzstan)", -- 3 + "Unknown", -- 4 + "Unknown", -- 5 + "Unknown", -- 6 + "Unknown", -- 7 + "Unknown", -- 8 + "Unknown", -- 9 + "Unknown", -- 10 A + "Unknown", -- 11 B + "Unknown", -- 12 C + "Unknown", -- 13 D + "Unknown", -- 14 E + "Unknown", -- 15 F + }, + a0 = { + "Encoder fault", -- 0 + "United States of America", -- 1 + "United States of America", -- 2 + "United States of America", -- 3 + "United States of America", -- 4 + "United States of America", -- 5 + "United States of America", -- 6 + "United States of America", -- 7 + "United States of America", -- 8 + "United States of America", -- 9 + "United States of America", -- 10 A + "United States of America", -- 11 B + "United States of America", -- 12 C + "United States of America", -- 13 D + "United States of America", -- 14 E + -- fucking great + "Unknown", -- 15 F + }, + a1 = { + "Encoder fault", -- 0 + "Unknown", -- 1 + "Unknown", -- 2 + "Unknown", -- 3 + "Unknown", -- 4 + "Unknown", -- 5 + "Unknown", -- 6 + "Unknown", -- 7 + "Unknown", -- 8 + "Unknown", -- 9 + "Unknown", -- 10 A + "Canada", -- 11 B + "Canada", -- 12 C + "Canada", -- 13 D + "Cananda", -- 14 E + "Greenland", -- 15 F + }, + a2 = { + "Encoder fault", -- 0 + "United Kingdom of Great Britain and Northern Ireland (Anguilla)", -- 1 + "Antigua and Barbuda", -- 2 + "Federative Republic of Brazil / Republic of Ecuador", -- 3 : R22_039_1 has a fucking error, its not "Ecuador", but fucking "Equator"? THE FUCKING STANDARD HAS A WRONG COUNTRY NAME + "United Kingdom of Great Britain and Northern Ireland (Falkland Islands)", -- 4 + "Barbados", -- 5 + "Belize", -- 6 + "United Kingdom of Great Britain and Northern Ireland (Cayman Islands)", -- 7 + "Republic of Costa Rica", -- 8 + "Republic of Cuba", -- 9 + "Republic of Argentina", -- 10 A + "Federative Republic of Brazil", -- 11 B + "United Kingdom of Great Britain and Northern Ireland (Bermuda) / Federative Republic of Brazil", -- 12 C + "Netherlands Antilles (governemnt does not exist) / Federative Republic of Brazil", -- 13 D : Yes, it ceased to exist in 2010 but its not like they care + "Republic of France (Guadeloupe)", -- 14 E + "Commonwealth of the Bahamas", -- 15 F + }, + a3 = { + "Encoder fault", -- 0 + "Plurinational State of Bolivia", -- 1 + "Republic of Colombia", -- 2 + "Jamaica", -- 3 + "Republic of France (Martinique)", -- 4 + "Unknown", -- 5 + "Republic of Paraguay", -- 6 + "Republic of Nicaragua", -- 7 + "Unknown", -- 8 + "Republic of Panama", -- 9 + "Commonwealth of Dominica", -- 10 A + "Dominican Republic", -- 11 B + "Republic of Chile", -- 12 C + "Grenada", -- 13 D + "United Kingdom of Great Britain and Northern Ireland (Turks and Caicos Islands)", -- 14 E + "Republic of Guyana", -- 15 F + }, + a4 = { + "Encoder fault", -- 0 + "Republic of Guatemala", -- 1 + "Republic of Honduras", -- 2 + "Kingdom of the Netherlands (Aruba)", -- 3 + "Unknown", -- 4 + "United Kingdom of Great Britain and Northern Ireland (Montserrat)", -- 5 + "Republic of Trinidad and Tobago", -- 6 + "Republic of Peru", -- 7 + "Republic of Suriname", -- 8 + "Oriental Republic of Uruguay", -- 9 + "Saint Kitts and Nevis", -- 10 A + "Saint Lucia", -- 11 B + "Republic of El Salvador", -- 12 C + "Republic of Haiti", -- 13 D + "Bolivarian Republic of Venezuela", -- 14 E + "United Kingdom of Great Britain and Northern Ireland (Virgin Islands)", -- 15 F + }, + a5 = { + "Encoder fault", -- 0 + "Unknown", -- 1 + "Unknown", -- 2 + "Unknown", -- 3 + "Unknown", -- 4 + "Unknown", -- 5 + "Unknown", -- 6 + "Unknown", -- 7 + "Unknown", -- 8 + "Unknown", -- 9 + "Unknown", -- 10 A + "United Mexican States", -- 11 B + "Saint Vincent and the Grenadines", -- 12 C + "United Mexican States", -- 13 D + "United Mexican States", -- 14 E + "United Mexican States", -- 15 F + }, + d0 = { + "Encoder fault", -- 0 + "Republic of Cameroon", -- 1 + "Central African Republic", -- 2 + "Republic of Djibouti", -- 3 + "Republic of Madagascar", -- 4 + "Republic of Mali", -- 5 + "Republic of Angola", -- 6 + "Republic of Equatorial Guinea", -- 7 + "Gabonese Republic", -- 8 + "Republic of Guinea", -- 9 + "Republic of South Africa", -- 10 A + "Burkina Faso", -- 11 B + "Republic of the Congo", -- 12 C + "Republic of Togo", -- 13 D + "Republic of Benin", -- 14 E + "Republic of Malawi", -- 15 F + }, + d1 = { + "Encoder fault", -- 0 + "Republic of Namibia", -- 1 + "Republic of Liberia", -- 2 + "Republic of Ghana", -- 3 + "Islamic Republic of Mauritania", -- 4 + "Democratic Republic of Sao Tome and Principe", -- 5 + "Republic of Cabo Verde (Capo Verde)", -- 6 + "Republic of Senegal", -- 7 + "Islamic Republic of the Gambia", -- 8 + "Republic of Burundi", -- 9 + "United Kingdom of Great Britain and Northern Ireland (Ascension Island)", -- 10 A + "Republic of Botswana", -- 11 B + "Union of the Comoros", -- 12 C + "United Republic of Tanzania", -- 13 D + "Federal Democratic Republic of Ethiopia", -- 14 E + "Federal Republic of Nigeria", -- 15 F : nigeria haha + }, + d2 = { + "Encoder fault", -- 0 + "Republic of Sierra Leone", -- 1 + "Republic of Zimbabwe", -- 2 + "Republic of Mozambique", -- 3 + "Republic of Uganda", -- 4 + "Kingdom of Swaziland", -- 5 + "Republic of Kenya", -- 6 + "Federal Republic of Somalia", -- 7 + "Republic of the Niger", -- 8 : niger haha + "Republic of Chad", -- 9 + "Republic of Guinea-Bissau", -- 10 A + "Democratic Republic of the Congo", -- 11 B + "Republic of Côte d'Ivoire (Ivory Coast)", -- 12 C + "Unknown", -- 13 D + "Republic of Zambia", -- 14 E + "State of Eritrea", -- 15 F + }, + d3 = { + "Encoder fault", -- 0 + "Unknown", -- 1 + "Unknown", -- 2 + "Polisario Front / Kingdom of Morocco (Western Sahara)", -- 3 + "Republic of Cabinda / Republic of Angola", -- 4 : intresting + "Republic of Rwanda", -- 5 + "Kingdom of Lesotho", -- 6 + "Unknown", -- 7 + "Republic of Seychelles", -- 8 + "Unknown", -- 9 + "Republic of Mauritius", -- 10 A + "Unknown", -- 11 B + "Republic of the Sudan", -- 12 C + "Unknown", -- 13 D + "Unknown", -- 14 E + "Unknown", -- 15 F + }, + d4 = { + "Encoder fault", -- 0 + "Unknown", -- 1 + "Unknown", -- 2 + "Unknown", -- 3 + "Unknown", -- 4 + "Unknown", -- 5 + "Unknown", -- 6 + "Unknown", -- 7 + "Unknown", -- 8 + "Unknown", -- 9 + "Republic of South Sudan", -- 10 A + "Unknown", -- 11 B + "Unknown", -- 12 C + "Unknown", -- 13 D + "Unknown", -- 14 E + "Unknown", -- 15 F + -- Just one? + }, + f0 = { + "Encoder fault", -- 0 + "Commonwealth of Australia - Capital Territory", -- 1 + "Commonwealth of Australia - New South Wales", -- 2 + "Commonwealth of Australia - Victoria", -- 3 + "Commonwealth of Australia - Queensland", -- 4 + "Commonwealth of Australia - South Australia", -- 5 + "Commonwealth of Australia - Western Australia", -- 6 + "Commonwealth of Australia - Tasmania", -- 7 + "Commonwealth of Australia - Northern Territory", -- 8 : why tf is australia the only one like this, was the ecc code designers from there? + "Kingdom of Saudi Arabia", -- 9 + "Islamic Republic of Afghanistan", -- 10 A + "Republic of the Union of Myanmar (Burma)", -- 11 B + "People's Republic of China", -- 12 C + "Democratic People's Republic of Korea (North Korea)", -- 13 D : what if i start transmitting with ECC f0 and pi D000, AND PLAY SOUTH KOREAN MUSIC + "Kingdom of Bahrain", -- 14 E : docs refer to it as Bahrein with no iso code + "Malaysia", -- 15 F + }, + f1 = { + "Encoder fault", -- 0 + "Republic of Kiribati", -- 1 + "Kingdom of Bhutan", -- 2 + "People's Republic of Bangladesh", -- 3 + "Islamic Republic of Pakistan", -- 4 + "Republic of Fiji", -- 5 + "Sultanate of Oman", -- 6 + "Republic of Nauru", -- 7 + "Islamic Republic of Iran", -- 8 + "New Zealand", -- 9 + "Solomon Islands", -- 10 A + "Negara Brunei Darussalam", -- 11 B + "Democratic Socialist Republic of Sri Lanka", -- 12 C + "Republic of China (Taiwan)", -- 13 D + "Republic of Korea (South Korea)", -- 14 E + "People's Republic of China (Hong Kong)", -- 15 F + }, + f2 = { + "Encoder fault", -- 0 + "State of Kuwait", -- 1 + "State of Qatar", -- 2 + "Kingdom of Cambodia", -- 3 + "Independent State of Samoa", -- 4 + "Republic of India", -- 5 + "People's Republic of China (Macao)", -- 6 + "Socialist Republic of Viet Nam", -- 7 + "Republic of the Philippines", -- 8 + "Japan", -- 9 + "Republic of Singapore", -- 10 A + "Republic of Maldives", -- 11 B + "Republic of Indonesia", -- 12 C + "United Arab Emirates", -- 13 D + "Federal Democratic Republic of Nepal", -- 14 E : discord election ahh + "Republic of Vanuatu", -- 15 F : apparantly this is un but i don't have it on the pdf? + }, + f3 = { + "Encoder fault", -- 0 + "Lao People's Democratic Republic", -- 1 + "Kingdom of Thailand", -- 2 + "Kingdom of Tonga", -- 3 + "Unknown", -- 4 + "Unknown", -- 5 + "Unknown", -- 6 + "Unknown", -- 7 + "People's Republic of China", -- 8 + "Independent State of Papua New Guinea", -- 9 + "Unknown", -- 10 A + "Republic of Yemen", -- 11 B + "Unknown", -- 12 C + "Unknown", -- 13 D + "Federated States of Micronesia", -- 14 E + "Mongolia", -- 15 F + }, +} + local last_render_hash = 0 local function crc(data) local crc = 0xFF @@ -81,9 +487,20 @@ function render_menu() 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) - out = out .. string.format("ERT: %s\r\n", ert_display) elseif current_menu == 3 then set_font_size(24) + out = out .. string.format("LPS: %s\r\n\r\n", lps_display) + + local country_name = "Unknown" + local country_id = (last_pi & 0xF000) >> 12 + local ecc_key = string.format("%x", ecc) + + if ecc ~= 0 and pi_ecc_to_country[ecc_key] and pi_ecc_to_country[ecc_key][country_id + 1] then country_name = pi_ecc_to_country[ecc_key][country_id + 1] + elseif ecc == 0 then country_name = pi_code_to_country[country_id+1] end + out = out .. string.format("Country: %s (%X)\r\n\r\n", country_name, ecc) + + out = out .. string.format("ERT: %s\r\n\r\n", ert_display) + local oda_string = "" for grp, data in pairs(odas) do local ver_char = (data.version == 0) and "A" or "B" @@ -103,13 +520,24 @@ function event(event) current_menu = event end +local function ternary(cond, a, b) + if cond then return a else return b end +end + function command(cmd, param) if cmd:lower() == "request" and param:lower() == "decoderdata" then db.add_value("RT.A", rta_display) db.add_value("RT.B", rtb_display) - db.add_value("RT.Type", "0" and last_rt or "1") + db.add_value("RT.Type", ternary(last_rt, "0", "1")) db.add_value("PTYN", ptyn) db.add_value("ERT", ert_display) + db.add_value("TP", "1" and tp or "0") + db.add_value("TA", "1" and ta or "0") + db.add_value("DI", "8" and dpty or "0") + db.add_value("PTY.Code", tostring(pty)) + db.add_value("PTY.Name", string.format("%s / %s", pty_rds[pty+1], pty_rbds[pty+1])) + db.add_value("ECC", string.format("%X", ecc)) + db.add_value("LPS", lps_display) elseif cmd:lower() == "resetdata" then ert_string = string.rep("_", 128) rt_a = string.rep("_", 64) @@ -123,6 +551,8 @@ function command(cmd, param) dpty = false ptyn = string.rep(" ", 8) ptyn_toggle = false + ecc = 0 + lps = string.rep("_", 32) elseif cmd:lower() == "superpi" then last_super_pi = tonumber(param, 16) end @@ -172,6 +602,9 @@ function group(stream, b_corr, a, b, c, d) local segment = b & 0x3 if di_bit and segment == 0 then dpty = true elseif segment == 0 then dpty = false end + elseif group_type == 1 and group_version == 0 then + local variant = (c & 0x7000) >> 12 + if variant == 0 then ecc = c & 0xfff end elseif group_type == 10 and group_version == 0 then local toggle = ((b & 0x10) >> 4) ~= 0 if toggle ~= ptyn_toggle then @@ -179,10 +612,9 @@ function group(stream, b_corr, a, b, c, d) ptyn_toggle = toggle end local segment = b & 1 - local new_chars = string.char(db.char_conv((c >> 8) & 0xff)) .. string.char(db.char_conv(c & 0xff)) .. string.char(db.char_conv((d >> 8) & 0xff)) .. string.char(db.char_conv(d & 0xff)) local start_pos = (segment * 4) + 1 - ptyn = rt_a:sub(1, ptyn - 1) .. new_chars .. rt_a:sub(ptyn + 4) - + local new_chars = string.char(db.char_conv((c >> 8) & 0xff)) .. string.char(db.char_conv(c & 0xff)) .. string.char(db.char_conv((d >> 8) & 0xff)) .. string.char(db.char_conv(d & 0xff)) + ptyn = ptyn:sub(1, start_pos - 1) .. new_chars .. ptyn:sub(start_pos + 4) elseif group_type == 2 and group_version == 0 then -- TODO 2B local rt_state = b & 0xF local rt_toggle = (b >> 4) & 1 @@ -204,6 +636,16 @@ function group(stream, b_corr, a, b, c, d) if carriage then rtb_display = rt_b:sub(1, carriage - 1) else rtb_display = rt_b:gsub("%s+$", "") end end + elseif group_type == 15 and group_version == 0 then + local state = b & 7 + local new_chars = string.char(db.char_conv((c >> 8) & 0xff)) .. string.char(db.char_conv(c & 0xff)) .. string.char(db.char_conv((d >> 8) & 0xff)) .. string.char(db.char_conv(d & 0xff)) + local start_pos = (state * 4) + 1 + + lps = lps:sub(1, start_pos - 1) .. new_chars .. lps:sub(start_pos + 4) + + local carriage = lps:find("\r", 1, true) + if carriage then lps_display = lps:sub(1, carriage - 1) + else lps_display = lps:gsub("%s+$", "") end end end end