diff --git a/include/dsd.h b/include/dsd.h index fb98555..00b9a77 100644 --- a/include/dsd.h +++ b/include/dsd.h @@ -1194,7 +1194,7 @@ void rtl_clean_queue(); int ez_rs28_ess (int payload[96], int parity[168]); //ezpwd bridge for FME int ez_rs28_facch (int payload[156], int parity[114]); //ezpwd bridge for FME int ez_rs28_sacch (int payload[180], int parity[132]); //ezpwd bridge for FME -int isch_lookup (unsigned long long int isch); //isch map lookup +int isch_lookup (uint64_t isch); //isch map lookup int bd_bridge (int payload[196], uint8_t decoded[12]); //bridge to Michael Ossmann Block De-interleaver and 1/2 rate trellis decoder int crc16_lb_bridge (int payload[190], int len); int crc12_xb_bridge (int payload[190], int len); diff --git a/src/ez.cpp b/src/ez.cpp index c66de53..d508459 100644 --- a/src/ez.cpp +++ b/src/ez.cpp @@ -178,146 +178,166 @@ int ez_rs28_sacch (int payload[180], int parity[132]) return (ec); } -//I-ISCH Lookup section, borrowed from OP25 -std::map isch_map; +std::map isch_map; void map_isch() { - isch_map["184229d461"] = 0; - isch_map["18761451f6"] = 1; - isch_map["181ae27e2f"] = 2; - isch_map["182edffbb8"] = 3; - isch_map["18df8a7510"] = 4; - isch_map["18ebb7f087"] = 5; - isch_map["188741df5e"] = 6; - isch_map["18b37c5ac9"] = 7; - isch_map["1146a44f13"] = 8; - isch_map["117299ca84"] = 9; - isch_map["111e6fe55d"] = 10; - isch_map["112a5260ca"] = 11; - isch_map["11db07ee62"] = 12; - isch_map["11ef3a6bf5"] = 13; - isch_map["1183cc442c"] = 14; - isch_map["11b7f1c1bb"] = 15; - isch_map["1a4a2e239e"] = 16; - isch_map["1a7e13a609"] = 17; - isch_map["1a12e589d0"] = 18; - isch_map["1a26d80c47"] = 19; - isch_map["1ad78d82ef"] = 20; - isch_map["1ae3b00778"] = 21; - isch_map["1a8f4628a1"] = 22; - isch_map["1abb7bad36"] = 23; - isch_map["134ea3b8ec"] = 24; - isch_map["137a9e3d7b"] = 25; - isch_map["13166812a2"] = 26; - isch_map["1322559735"] = 27; - isch_map["13d300199d"] = 28; - isch_map["13e73d9c0a"] = 29; - isch_map["138bcbb3d3"] = 30; - isch_map["13bff63644"] = 31; - isch_map["1442f705ef"] = 32; - isch_map["1476ca8078"] = 33; - isch_map["141a3cafa1"] = 34; - isch_map["142e012a36"] = 35; - isch_map["14df54a49e"] = 36; - isch_map["14eb692109"] = 37; - isch_map["14879f0ed0"] = 38; - isch_map["14b3a28b47"] = 39; - isch_map["1d467a9e9d"] = 40; - isch_map["1d72471b0a"] = 41; - isch_map["1d1eb134d3"] = 42; - isch_map["1d2a8cb144"] = 43; - isch_map["1ddbd93fec"] = 44; - isch_map["1defe4ba7b"] = 45; - isch_map["1d831295a2"] = 46; - isch_map["1db72f1035"] = 47; - isch_map["164af0f210"] = 48; - isch_map["167ecd7787"] = 49; - isch_map["16123b585e"] = 50; - isch_map["162606ddc9"] = 51; - isch_map["16d7535361"] = 52; - isch_map["16e36ed6f6"] = 53; - isch_map["168f98f92f"] = 54; - isch_map["16bba57cb8"] = 55; - isch_map["1f4e7d6962"] = 56; - isch_map["1f7a40ecf5"] = 57; - isch_map["1f16b6c32c"] = 58; - isch_map["1f228b46bb"] = 59; - isch_map["1fd3dec813"] = 60; - isch_map["1fe7e34d84"] = 61; - isch_map["1f8b15625d"] = 62; - isch_map["1fbf28e7ca"] = 63; - isch_map["84d62c339"] = 64; - isch_map["8795f46ae"] = 65; - isch_map["815a96977"] = 66; - isch_map["82194ece0"] = 67; - isch_map["8d0c16248"] = 68; - isch_map["8e4fce7df"] = 69; - isch_map["8880ac806"] = 70; - isch_map["8bc374d91"] = 71; - isch_map["149ef584b"] = 72; - isch_map["17dd2dddc"] = 73; - isch_map["11124f205"] = 74; - isch_map["125197792"] = 75; - isch_map["1d44cf93a"] = 76; - isch_map["1e0717cad"] = 77; - isch_map["18c875374"] = 78; - isch_map["1b8bad6e3"] = 79; - isch_map["a456534c6"] = 80; - isch_map["a7158b151"] = 81; - isch_map["a1dae9e88"] = 82; - isch_map["a29931b1f"] = 83; - isch_map["ad8c695b7"] = 84; - isch_map["aecfb1020"] = 85; - isch_map["a800d3ff9"] = 86; - isch_map["ab430ba6e"] = 87; - isch_map["341e8afb4"] = 88; - isch_map["375d52a23"] = 89; - isch_map["3192305fa"] = 90; - isch_map["32d1e806d"] = 91; - isch_map["3dc4b0ec5"] = 92; - isch_map["3e8768b52"] = 93; - isch_map["38480a48b"] = 94; - isch_map["3b0bd211c"] = 95; - isch_map["44dbc12b7"] = 96; - isch_map["479819720"] = 97; - isch_map["41577b8f9"] = 98; - isch_map["4214a3d6e"] = 99; - isch_map["4d01fb3c6"] = 100; - isch_map["4e4223651"] = 101; - isch_map["488d41988"] = 102; - isch_map["4bce99c1f"] = 103; - isch_map["d493189c5"] = 104; - isch_map["d7d0c0c52"] = 105; - isch_map["d11fa238b"] = 106; - isch_map["d25c7a61c"] = 107; - isch_map["dd49228b4"] = 108; - isch_map["de0afad23"] = 109; - isch_map["d8c5982fa"] = 110; - isch_map["db864076d"] = 111; - isch_map["645bbe548"] = 112; - isch_map["6718660df"] = 113; - isch_map["61d704f06"] = 114; - isch_map["6294dca91"] = 115; - isch_map["6d8184439"] = 116; - isch_map["6ec25c1ae"] = 117; - isch_map["680d3ee77"] = 118; - isch_map["6b4ee6be0"] = 119; - isch_map["f41367e3a"] = 120; - isch_map["f750bfbad"] = 121; - isch_map["f19fdd474"] = 122; - isch_map["f2dc051e3"] = 123; - isch_map["fdc95df4b"] = 124; - isch_map["fe8a85adc"] = 125; - isch_map["f845e7505"] = 126; - isch_map["fb063f092"] = 127; + isch_map[0x184229d461ULL] = 0; + isch_map[0x18761451f6ULL] = 1; + isch_map[0x181ae27e2fULL] = 2; + isch_map[0x182edffbb8ULL] = 3; + isch_map[0x18df8a7510ULL] = 4; + isch_map[0x18ebb7f087ULL] = 5; + isch_map[0x188741df5eULL] = 6; + isch_map[0x18b37c5ac9ULL] = 7; + isch_map[0x1146a44f13ULL] = 8; + isch_map[0x117299ca84ULL] = 9; + isch_map[0x111e6fe55dULL] = 10; + isch_map[0x112a5260caULL] = 11; + isch_map[0x11db07ee62ULL] = 12; + isch_map[0x11ef3a6bf5ULL] = 13; + isch_map[0x1183cc442cULL] = 14; + isch_map[0x11b7f1c1bbULL] = 15; + isch_map[0x1a4a2e239eULL] = 16; + isch_map[0x1a7e13a609ULL] = 17; + isch_map[0x1a12e589d0ULL] = 18; + isch_map[0x1a26d80c47ULL] = 19; + isch_map[0x1ad78d82efULL] = 20; + isch_map[0x1ae3b00778ULL] = 21; + isch_map[0x1a8f4628a1ULL] = 22; + isch_map[0x1abb7bad36ULL] = 23; + isch_map[0x134ea3b8ecULL] = 24; + isch_map[0x137a9e3d7bULL] = 25; + isch_map[0x13166812a2ULL] = 26; + isch_map[0x1322559735ULL] = 27; + isch_map[0x13d300199dULL] = 28; + isch_map[0x13e73d9c0aULL] = 29; + isch_map[0x138bcbb3d3ULL] = 30; + isch_map[0x13bff63644ULL] = 31; + isch_map[0x1442f705efULL] = 32; + isch_map[0x1476ca8078ULL] = 33; + isch_map[0x141a3cafa1ULL] = 34; + isch_map[0x142e012a36ULL] = 35; + isch_map[0x14df54a49eULL] = 36; + isch_map[0x14eb692109ULL] = 37; + isch_map[0x14879f0ed0ULL] = 38; + isch_map[0x14b3a28b47ULL] = 39; + isch_map[0x1d467a9e9dULL] = 40; + isch_map[0x1d72471b0aULL] = 41; + isch_map[0x1d1eb134d3ULL] = 42; + isch_map[0x1d2a8cb144ULL] = 43; + isch_map[0x1ddbd93fecULL] = 44; + isch_map[0x1defe4ba7bULL] = 45; + isch_map[0x1d831295a2ULL] = 46; + isch_map[0x1db72f1035ULL] = 47; + isch_map[0x164af0f210ULL] = 48; + isch_map[0x167ecd7787ULL] = 49; + isch_map[0x16123b585eULL] = 50; + isch_map[0x162606ddc9ULL] = 51; + isch_map[0x16d7535361ULL] = 52; + isch_map[0x16e36ed6f6ULL] = 53; + isch_map[0x168f98f92fULL] = 54; + isch_map[0x16bba57cb8ULL] = 55; + isch_map[0x1f4e7d6962ULL] = 56; + isch_map[0x1f7a40ecf5ULL] = 57; + isch_map[0x1f16b6c32cULL] = 58; + isch_map[0x1f228b46bbULL] = 59; + isch_map[0x1fd3dec813ULL] = 60; + isch_map[0x1fe7e34d84ULL] = 61; + isch_map[0x1f8b15625dULL] = 62; + isch_map[0x1fbf28e7caULL] = 63; + isch_map[0x084d62c339ULL] = 64; + isch_map[0x08795f46aeULL] = 65; + isch_map[0x0815a96977ULL] = 66; + isch_map[0x082194ece0ULL] = 67; + isch_map[0x08d0c16248ULL] = 68; + isch_map[0x08e4fce7dfULL] = 69; + isch_map[0x08880ac806ULL] = 70; + isch_map[0x08bc374d91ULL] = 71; + isch_map[0x0149ef584bULL] = 72; + isch_map[0x017dd2dddcULL] = 73; + isch_map[0x011124f205ULL] = 74; + isch_map[0x0125197792ULL] = 75; + isch_map[0x01d44cf93aULL] = 76; + isch_map[0x01e0717cadULL] = 77; + isch_map[0x018c875374ULL] = 78; + isch_map[0x01b8bad6e3ULL] = 79; + isch_map[0x0a456534c6ULL] = 80; + isch_map[0x0a7158b151ULL] = 81; + isch_map[0x0a1dae9e88ULL] = 82; + isch_map[0x0a29931b1fULL] = 83; + isch_map[0x0ad8c695b7ULL] = 84; + isch_map[0x0aecfb1020ULL] = 85; + isch_map[0x0a800d3ff9ULL] = 86; + isch_map[0x0ab430ba6eULL] = 87; + isch_map[0x0341e8afb4ULL] = 88; + isch_map[0x0375d52a23ULL] = 89; + isch_map[0x03192305faULL] = 90; + isch_map[0x032d1e806dULL] = 91; + isch_map[0x03dc4b0ec5ULL] = 92; + isch_map[0x03e8768b52ULL] = 93; + isch_map[0x038480a48bULL] = 94; + isch_map[0x03b0bd211cULL] = 95; + isch_map[0x044dbc12b7ULL] = 96; + isch_map[0x0479819720ULL] = 97; + isch_map[0x041577b8f9ULL] = 98; + isch_map[0x04214a3d6eULL] = 99; + isch_map[0x04d01fb3c6ULL] = 100; + isch_map[0x04e4223651ULL] = 101; + isch_map[0x0488d41988ULL] = 102; + isch_map[0x04bce99c1fULL] = 103; + isch_map[0x0d493189c5ULL] = 104; + isch_map[0x0d7d0c0c52ULL] = 105; + isch_map[0x0d11fa238bULL] = 106; + isch_map[0x0d25c7a61cULL] = 107; + isch_map[0x0dd49228b4ULL] = 108; + isch_map[0x0de0afad23ULL] = 109; + isch_map[0x0d8c5982faULL] = 110; + isch_map[0x0db864076dULL] = 111; + isch_map[0x0645bbe548ULL] = 112; + isch_map[0x06718660dfULL] = 113; + isch_map[0x061d704f06ULL] = 114; + isch_map[0x06294dca91ULL] = 115; + isch_map[0x06d8184439ULL] = 116; + isch_map[0x06ec25c1aeULL] = 117; + isch_map[0x0680d3ee77ULL] = 118; + isch_map[0x06b4ee6be0ULL] = 119; + isch_map[0x0f41367e3aULL] = 120; + isch_map[0x0f750bfbadULL] = 121; + isch_map[0x0f19fdd474ULL] = 122; + isch_map[0x0f2dc051e3ULL] = 123; + isch_map[0x0fdc95df4bULL] = 124; + isch_map[0x0fe8a85adcULL] = 125; + isch_map[0x0f845e7505ULL] = 126; + isch_map[0x0fb063f092ULL] = 127; + isch_map[0x575d57f7ffULL] = -2; // S-ISCH } -int isch_lookup (unsigned long long int isch) +//I-ISCH Lookup, borrowed from OP25 (now w/ error correction) +int isch_lookup (uint64_t isch) { - map_isch(); //initialize the lookup map - char s[64]; - int decoded = -2; //initialize lookup to an invalid number - sprintf(s, "%llx", isch); - decoded = isch_map[s]; - return(decoded); -} + map_isch(); //initialize the lookup map + int decoded = -2; + + // Must contain bit errors if no exact match, so + // look for codeword with smallest hamming distance + if (isch_map.find(isch) == isch_map.end()) + { + int popct, popmin = 40; + for (auto it = isch_map.begin(); it != isch_map.end(); ++it) + { + popct = __builtin_popcountll(isch ^ it->first); + // Encoding is (40, 9, 16) which can correct at most 7 bit-errors + if ((popct <= 7) && (popct < popmin)) + { + decoded = it->second; + popmin = popct; + } + } + return decoded; + } + else // No errors, so simply return the matching value + decoded = isch_map[isch]; + + return decoded; + +} \ No newline at end of file diff --git a/src/p25p2_frame.c b/src/p25p2_frame.c index bf1af3d..c044237 100644 --- a/src/p25p2_frame.c +++ b/src/p25p2_frame.c @@ -75,7 +75,7 @@ int dibit = 0; int vc_counter = 0; int framing_counter = 0; -unsigned long long int isch = 0; +uint64_t isch = 0; int isch_decoded = -1; int p2_duid[8] = {0}; int16_t duid_decoded = 0;