Change P25 Moto Alias Block bn to num_bits value to make it work with multiple bit per block values; Misc Cleanup and Tweaks;

This commit is contained in:
lwvmobile
2025-02-06 00:11:46 -05:00
parent 29ee3a5f3a
commit f0657ee5a8
2 changed files with 33 additions and 28 deletions

View File

@@ -1261,7 +1261,7 @@ void apx_embedded_alias_header_phase1 (dsd_opts * opts, dsd_state * state, uint8
void apx_embedded_alias_header_phase2 (dsd_opts * opts, dsd_state * state, uint8_t slot, uint8_t * lc_bits);
void apx_embedded_alias_blocks_phase1 (dsd_opts * opts, dsd_state * state, uint8_t slot, uint8_t * lc_bits);
void apx_embedded_alias_blocks_phase2 (dsd_opts * opts, dsd_state * state, uint8_t slot, uint8_t * lc_bits);
void apx_embedded_alias_decode (dsd_opts * opts, dsd_state * state, uint8_t slot, int bn, uint8_t * input);
void apx_embedded_alias_decode (dsd_opts * opts, dsd_state * state, uint8_t slot, int16_t num_bits, uint8_t * input);
void dmr_embedded_gps (dsd_opts * opts, dsd_state * state, uint8_t lc_bits[]);
void apx_embedded_gps (dsd_opts * opts, dsd_state * state, uint8_t lc_bits[]);
void lip_protocol_decoder (dsd_opts * opts, dsd_state * state, uint8_t * input);

View File

@@ -138,8 +138,10 @@ void apx_embedded_alias_blocks_phase1 (dsd_opts * opts, dsd_state * state, uint8
if (ta_len == bn) //this is the last block, proceed to decoding
{
int16_t num_bits = bn * 44; //number of relevant data bits total from all blocks (not including header)
//pass to alias decoder
apx_embedded_alias_decode (opts, state, slot, bn, state->dmr_pdu_sf[slot]);
apx_embedded_alias_decode (opts, state, slot, num_bits, state->dmr_pdu_sf[slot]);
//clear out now stale storage
memset (state->dmr_pdu_sf[slot], 0, sizeof (state->dmr_pdu_sf[slot]));
@@ -176,7 +178,7 @@ void apx_embedded_alias_blocks_phase2 (dsd_opts * opts, dsd_state * state, uint8
fprintf (stderr, " BN: %d/??;", bn);
fprintf (stderr, " SN: %X;", sn);
fprintf (stderr, " Partial: ");
for (uint8_t i = 7; i < 18; i++)
for (uint8_t i = 7; i < 18; i++) //Fix this value when samples arrive
fprintf (stderr, "%0X", (uint8_t)ConvertBitIntoBytes(&lc_bits[0+(i*4)], 4));
//clear out now stale storage
@@ -193,13 +195,16 @@ void apx_embedded_alias_blocks_phase2 (dsd_opts * opts, dsd_state * state, uint8
fprintf (stderr, " BN: %d/%d;", bn, ta_len);
//use dmr_pdu_sf for storage, store data relevant portion at ptr of (bn-1) * 44 + 72 offset for header
memcpy(state->dmr_pdu_sf[slot]+(((bn-1)*44)+72), lc_bits+28, 44*sizeof(uint8_t));
memcpy(state->dmr_pdu_sf[slot]+(((bn-1)*44)+72), lc_bits+28, 44*sizeof(uint8_t)); //Fix this value when samples arrive
if (ta_len == bn) //this is the last block, proceed to decoding
{
//Fix this value when samples arrive
int16_t num_bits = bn * 48; //number of relevant data bits total from all blocks (not including header)
//pass to alias decoder
apx_embedded_alias_decode (opts, state, slot, bn, state->dmr_pdu_sf[slot]);
apx_embedded_alias_decode (opts, state, slot, num_bits, state->dmr_pdu_sf[slot]);
//clear out now stale storage
memset (state->dmr_pdu_sf[slot], 0, sizeof (state->dmr_pdu_sf[slot]));
@@ -208,7 +213,7 @@ void apx_embedded_alias_blocks_phase2 (dsd_opts * opts, dsd_state * state, uint8
}
}
void apx_embedded_alias_decode (dsd_opts * opts, dsd_state * state, uint8_t slot, int bn, uint8_t * input)
void apx_embedded_alias_decode (dsd_opts * opts, dsd_state * state, uint8_t slot, int16_t num_bits, uint8_t * input)
{
UNUSED(opts);
@@ -216,42 +221,45 @@ void apx_embedded_alias_decode (dsd_opts * opts, dsd_state * state, uint8_t slot
UNUSED(slot);
//debug, let's look at byte, bit counts and see if we can find this in the completed dump
// fprintf (stderr, " Bits: %X; Bytes: %X; Mod: %d; ", bn*44, (bn*44)/8, (bn*44)%8); //the portion with 0100 is 8 off from 0108 (hex) bits
// fprintf (stderr, " Bits: %X; Bytes: %X; Mod: %d; ", num_bits, num_bits/8, num_bits%8);
//debug, dump completed data set
// fprintf (stderr, "\n Full: ");
// for (uint8_t i = 0; i < ((bn*11)+18); i++) //double check on other bn values
// for (int16_t i = 0; i < (72+num_bits)/4; i++)
// fprintf (stderr, "%X", (uint8_t)ConvertBitIntoBytes(&input[0+(i*4)], 4));
// fprintf (stderr, "\n");
//extract fully qualified SUID
uint32_t wacn = (uint32_t)ConvertBitIntoBytes(&input[72], 20);
uint32_t sys = (uint32_t)ConvertBitIntoBytes(&input[92], 12);
uint32_t rid = (uint32_t)ConvertBitIntoBytes(&input[104], 24);
//print fully qualified SUID
fprintf (stderr, "\n WACN: %05X; SYS: %03X; RID: %d;", wacn, sys, rid);
//extract CRC
uint16_t crc_ext = (uint16_t)ConvertBitIntoBytes(&input[(72+(bn*44)-16)], 16);
uint16_t crc_ext = (uint16_t)ConvertBitIntoBytes(&input[(72+num_bits-16)], 16);
//compute CRC
uint16_t crc_cmp = ComputeCrcCCITT16d(&input[72], (bn*44)-16);
uint16_t crc_cmp = ComputeCrcCCITT16d(&input[72], num_bits-16);
//print comparison
// fprintf (stderr, " CRC EXT: %04X CMP: %04X;", crc_ext, crc_cmp);
if (crc_ext != crc_cmp)
fprintf (stderr, " CRC Error;");
// else fprintf (stderr, " Okay;");
fprintf (stderr, " Alias CRC Error;");
// else fprintf (stderr, " Alias Okay;");
//start decoding the alias
if (crc_ext == crc_cmp)
{
//WIP: Working, needs more samples to verify various len values
//extract fully qualified SUID
uint32_t wacn = (uint32_t)ConvertBitIntoBytes(&input[72], 20);
uint32_t sys = (uint32_t)ConvertBitIntoBytes(&input[92], 12);
uint32_t rid = (uint32_t)ConvertBitIntoBytes(&input[104], 24);
//print fully qualified SUID
fprintf (stderr, "\n FQ-SUID: %05X.%03X.%X (%d);", wacn, sys, rid, rid);
//WIP: Working, needs more samples to verify various num_bits values
uint16_t ptr = 128; //starting point of encoded data from test vectors
uint8_t encoded[200]; memset(encoded, 0, sizeof(encoded));
uint8_t decoded[200]; memset(decoded, 0, sizeof(decoded));
uint16_t num_bytes = ((44*bn) / 8) - 9; //substract 2 CRC and 7 FQSUID
uint16_t num_bytes = (num_bits / 8) - 9; //subtract 2 CRC and 7 FQSUID
//sanity check
if (num_bytes <= 0) num_bytes = 1;
for (int16_t i = 0; i < num_bytes; i++)
{
@@ -292,12 +300,12 @@ void apx_embedded_alias_decode (dsd_opts * opts, dsd_state * state, uint8_t slot
// //debug, dump just the encoded alias portion
// fprintf (stderr, "\n Encoded: ");
// for (int16_t i = 0; i < bytes; i++)
// for (int16_t i = 0; i < num_bytes; i++)
// fprintf (stderr, "%02X", encoded[i]);
// //debug, dump the decoded payload as hex octets
// fprintf (stderr, "\n Decoded: ");
// for (int16_t i = 0; i < bytes; i++)
// for (int16_t i = 0; i < num_bytes; i++)
// fprintf (stderr, "%02X", decoded[i]);
//dump the decoded payload as long chars
@@ -312,9 +320,6 @@ void apx_embedded_alias_decode (dsd_opts * opts, dsd_state * state, uint8_t slot
}
//clear out now stale storage
// memset (input, 0, sizeof (input)); //need to do this in calling function
}
//end Motorola P25 OTA Alias Decoding