mirror of
https://github.com/lwvmobile/dsd-fme.git
synced 2026-11-13 17:27:21 -05:00
DMR 12 Rate Updates
DMR 12 Rate Updates Other Tweaks to P25 Printing More experimenting with 34 Rate Trellis Code (busted)
This commit is contained in:
@@ -848,6 +848,7 @@ void rtlsdr_sighandler();
|
||||
//TRELLIS
|
||||
void CDMRTrellisTribitsToBits(const unsigned char* tribits, unsigned char* payload);
|
||||
unsigned int CDMRTrellisCheckCode(const unsigned char* points, unsigned char* tribits);
|
||||
//unsigned int CDMRTrellisCheckCode(const unsigned char* points, unsigned char* state, unsigned char* tribits);
|
||||
bool CDMRTrellisFixCode(unsigned char* points, unsigned int failPos, unsigned char* payload);
|
||||
void CDMRTrellisDeinterleave(const unsigned char* data, signed char* dibits);
|
||||
void CDMRTrellisDibitsToPoints(const signed char* dibits, unsigned char* points);
|
||||
|
||||
@@ -96,7 +96,7 @@ processDMRdata (dsd_opts * opts, dsd_state * state)
|
||||
cachbits[24] = 0;
|
||||
fprintf(stderr, "%s ", cachbits);
|
||||
#endif
|
||||
//here here here here trellis bits
|
||||
//trellis bits
|
||||
unsigned char trellisdibits[98];
|
||||
// Current slot - First half - Data Payload - 1st part
|
||||
for (i = 0; i < 49; i++)
|
||||
@@ -313,8 +313,7 @@ processDMRdata (dsd_opts * opts, dsd_state * state)
|
||||
}
|
||||
|
||||
// Current slot - First half - Data Payload - 1st part
|
||||
//here here find way to grab 98 dibits for trellis
|
||||
|
||||
//trellis
|
||||
for (i = 0; i < 49; i++)
|
||||
{
|
||||
dibit = getDibit(opts, state);
|
||||
|
||||
@@ -52,10 +52,12 @@ void ProcessDMREncryption (dsd_opts * opts, dsd_state * state)
|
||||
for(Frame = 0; Frame < 6; Frame++)
|
||||
{
|
||||
/* 1 DMR frame contains 3 AMBE voice samples */
|
||||
//fprintf (stderr, "\n 1AMBE ");
|
||||
for(i = 0; i < 3; i++)
|
||||
{
|
||||
|
||||
errs = (int*)&(TSVoiceSupFrame->TimeSlotAmbeVoiceFrame[Frame].errs1[i]);
|
||||
//fprintf (stderr, "[%02X] ", TSVoiceSupFrame->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i]);
|
||||
errs2 = (int*)&(TSVoiceSupFrame->TimeSlotAmbeVoiceFrame[Frame].errs2[i]);
|
||||
state->errs = TSVoiceSupFrame->TimeSlotAmbeVoiceFrame[Frame].errs1[i]; //correct placement
|
||||
state->errs2 = TSVoiceSupFrame->TimeSlotAmbeVoiceFrame[Frame].errs2[i]; //correct placement
|
||||
|
||||
@@ -59,13 +59,16 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98]
|
||||
//returns 'payload' which is 144 bit array, so DmrDataBit maybe?
|
||||
//CDMRTrellisDecode(const unsigned char* data, unsigned char* payload)
|
||||
unsigned char tdibits_reverse[98];
|
||||
if (opts->payload == 21)
|
||||
unsigned char tdibits_inverted[98];
|
||||
if (opts->payload == 1)
|
||||
{
|
||||
fprintf (stderr, "\n Raw Trellis Dibits\n ");
|
||||
for (i = 0; i < 98; i++)
|
||||
{
|
||||
fprintf (stderr, "[%X]", tdibits[i]);
|
||||
tdibits_reverse[97-i] = tdibits[i];
|
||||
//tdibits_reverse[97-i] = tdibits[i];
|
||||
tdibits_reverse[97-i] = ((tdibits[i] & 1)<<1) | ((tdibits[i] & 2)>>1);
|
||||
tdibits_inverted[i] = tdibits[i] ^ 2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,10 +76,10 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98]
|
||||
CDMRTrellisDecode(tdibits, TrellisReturn); //figure out how this works!!
|
||||
if (opts->payload == 1)
|
||||
{
|
||||
fprintf (stderr, "\nFull 3/4 Rate Trellis Payload\n ");
|
||||
fprintf (stderr, "\nFull 3/4 Rate Trellis Payload (reversed order)\n ");
|
||||
for (i = 0; i < 18; i++)
|
||||
{
|
||||
fprintf (stderr, "[%02X]", TrellisReturn[i]);
|
||||
fprintf (stderr, "[%02X]", TrellisReturn[17-i]);
|
||||
}
|
||||
}
|
||||
/* Extract the BPTC 196,96 DMR data */
|
||||
@@ -163,13 +166,13 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98]
|
||||
if ( (state->dmr_34_rate_sf[0] & 0x3F) == 0x0C)
|
||||
{
|
||||
fprintf (stderr, "\n Source: ");
|
||||
fprintf (stderr, " %d.%d.%d.%d", (state->dmr_34_rate_sf[0] & 0x3F), state->dmr_34_rate_sf[1], state->dmr_34_rate_sf[2], state->dmr_34_rate_sf[3]); //strip first two bits off 1st byte
|
||||
fprintf (stderr, " [%d]", (state->dmr_34_rate_sf[1] <<16 ) + (state->dmr_34_rate_sf[2] << 8) + state->dmr_34_rate_sf[3] );
|
||||
fprintf (stderr, " - Port %d", (state->dmr_34_rate_sf[8] << 8) + state->dmr_34_rate_sf[9]);
|
||||
fprintf (stderr, " %03d.%03d.%03d.%03d", (state->dmr_34_rate_sf[0] & 0x3F), state->dmr_34_rate_sf[1], state->dmr_34_rate_sf[2], state->dmr_34_rate_sf[3]); //strip first two bits off 1st byte
|
||||
fprintf (stderr, " [%08d]", (state->dmr_34_rate_sf[1] <<16 ) + (state->dmr_34_rate_sf[2] << 8) + state->dmr_34_rate_sf[3] );
|
||||
fprintf (stderr, " - Port %05d", (state->dmr_34_rate_sf[8] << 8) + state->dmr_34_rate_sf[9]);
|
||||
fprintf (stderr, "\n Destination:");
|
||||
fprintf (stderr, " %d.%d.%d.%d", (state->dmr_34_rate_sf[4] & 0x3F), state->dmr_34_rate_sf[5], state->dmr_34_rate_sf[6], state->dmr_34_rate_sf[7]); //strip first two bits off 4th byte??
|
||||
fprintf (stderr, " [%d]", (state->dmr_34_rate_sf[5] <<16 ) + (state->dmr_34_rate_sf[6] << 8) + state->dmr_34_rate_sf[7] );
|
||||
fprintf (stderr, " - Port %d", (state->dmr_34_rate_sf[10] << 8) + state->dmr_34_rate_sf[11]);
|
||||
fprintf (stderr, " %03d.%03d.%03d.%03d", (state->dmr_34_rate_sf[4] & 0x3F), state->dmr_34_rate_sf[5], state->dmr_34_rate_sf[6], state->dmr_34_rate_sf[7]); //strip first two bits off 4th byte??
|
||||
fprintf (stderr, " [%08d]", (state->dmr_34_rate_sf[5] <<16 ) + (state->dmr_34_rate_sf[6] << 8) + state->dmr_34_rate_sf[7] );
|
||||
fprintf (stderr, " - Port %05d", (state->dmr_34_rate_sf[10] << 8) + state->dmr_34_rate_sf[11]);
|
||||
}
|
||||
//LRRP
|
||||
if (state->dmr_34_rate_sf[0] == 0x0 && state->dmr_34_rate_sf[4] == 0x0D) //Start LRRP now
|
||||
@@ -229,7 +232,7 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98]
|
||||
//Full
|
||||
if (opts->payload == 1)
|
||||
{
|
||||
fprintf (stderr, "\nFull 3/4 Rate Payload DmrDataByte\n ");
|
||||
fprintf (stderr, "\nFull 3/4 Rate Payload DmrDataByte (reverse bits)\n ");
|
||||
for (i = 0; i < 18; i++)
|
||||
{
|
||||
fprintf (stderr, "[%02X]", DmrDataByte[i]);
|
||||
@@ -929,21 +932,21 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_
|
||||
}
|
||||
|
||||
//Headers and Addresses
|
||||
if ( (state->dmr_12_rate_sf[0] & 0x3F) == 0x05) //0x3F?? or == 0x05
|
||||
if ( (state->dmr_12_rate_sf[0] & 0x3F) == 0x05) //0x05, or 0x45?
|
||||
{
|
||||
fprintf (stderr, "\n IP4 Header");
|
||||
}
|
||||
|
||||
//ARS?
|
||||
if ( (state->dmr_12_rate_sf[0] & 0x3F) == 0x0C)
|
||||
{
|
||||
fprintf (stderr, "\n Source: ");
|
||||
fprintf (stderr, " %d.%d.%d.%d", (state->dmr_12_rate_sf[0] & 0x3F), state->dmr_12_rate_sf[1], state->dmr_12_rate_sf[2], state->dmr_12_rate_sf[3]); //strip first two bits off 1st byte
|
||||
fprintf (stderr, " [%d]", (state->dmr_12_rate_sf[1] <<16 ) + (state->dmr_12_rate_sf[2] << 8) + state->dmr_12_rate_sf[3] );
|
||||
fprintf (stderr, " - Port %d", (state->dmr_12_rate_sf[8] << 8) + state->dmr_12_rate_sf[9]);
|
||||
fprintf (stderr, " %03d.%03d.%03d.%03d", (state->dmr_12_rate_sf[0] & 0x3F), state->dmr_12_rate_sf[1], state->dmr_12_rate_sf[2], state->dmr_12_rate_sf[3]); //strip first two bits off 1st byte
|
||||
fprintf (stderr, " [%08d]", (state->dmr_12_rate_sf[1] <<16 ) + (state->dmr_12_rate_sf[2] << 8) + state->dmr_12_rate_sf[3] );
|
||||
fprintf (stderr, " - Port %05d", (state->dmr_12_rate_sf[8] << 8) + state->dmr_12_rate_sf[9]);
|
||||
fprintf (stderr, "\n Destination:");
|
||||
fprintf (stderr, " %d.%d.%d.%d", (state->dmr_12_rate_sf[4] & 0x3F), state->dmr_12_rate_sf[5], state->dmr_12_rate_sf[6], state->dmr_12_rate_sf[7]); //strip first two bits off 4th byte??
|
||||
fprintf (stderr, " [%d]", (state->dmr_12_rate_sf[5] <<16 ) + (state->dmr_12_rate_sf[6] << 8) + state->dmr_12_rate_sf[7] );
|
||||
fprintf (stderr, " - Port %d", (state->dmr_12_rate_sf[10] << 8) + state->dmr_12_rate_sf[11]);
|
||||
fprintf (stderr, " %03d.%03d.%03d.%03d", (state->dmr_12_rate_sf[4] & 0x3F), state->dmr_12_rate_sf[5], state->dmr_12_rate_sf[6], state->dmr_12_rate_sf[7]); //strip first two bits off 4th byte??
|
||||
fprintf (stderr, " [%08d]", (state->dmr_12_rate_sf[5] <<16 ) + (state->dmr_12_rate_sf[6] << 8) + state->dmr_12_rate_sf[7] );
|
||||
fprintf (stderr, " - Port %05d", (state->dmr_12_rate_sf[10] << 8) + state->dmr_12_rate_sf[11]);
|
||||
}
|
||||
//LRRP
|
||||
if (state->dmr_12_rate_sf[0] == 0x0 && state->dmr_12_rate_sf[4] == 0x0D) //Start LRRP now
|
||||
@@ -1246,7 +1249,7 @@ void ProcessCSBK(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t
|
||||
{
|
||||
fprintf (stderr, "\n Site ID %d-%d.%d", (DmrDataByte[2] & 0xF0 >> 4), DmrDataByte[2] & 0xF, DmrDataByte[3]);
|
||||
fprintf (stderr, " DCC %d", DmrDataByte[1]);
|
||||
sprintf ( state->dmr_callsign[0], "Site ID %d-%d.%d", (DmrDataByte[2] & 0xF0 >> 4), DmrDataByte[2] & 0xF, DmrDataByte[3]);
|
||||
//sprintf ( state->dmr_callsign[0], "Site ID %d-%d.%d", (DmrDataByte[2] & 0xF0 >> 4), DmrDataByte[2] & 0xF, DmrDataByte[3]);
|
||||
//sprintf(state->dmr_branding, " TIII "); //?? one of these next two seems to be on both types, maybe its a TIII thing?
|
||||
}
|
||||
|
||||
@@ -1383,7 +1386,7 @@ void ProcessDmrPIHeader(dsd_opts * opts, dsd_state * state, uint8_t info[196], u
|
||||
state->payload_algid = DmrDataByte[0];
|
||||
state->payload_keyid = DmrDataByte[2];
|
||||
state->payload_mi = ( ((DmrDataByte[3]) << 24) + ((DmrDataByte[4]) << 16) + ((DmrDataByte[5]) << 8) + (DmrDataByte[6]) );
|
||||
if (opts->payload == 1)
|
||||
if (1 == 1) //have it always print?
|
||||
{
|
||||
fprintf (stderr, "\n DMR PI Header ALG ID: 0x%02X KEY ID: 0x%02X MI: 0x%08X", state->payload_algid, state->payload_keyid, state->payload_mi);
|
||||
}
|
||||
@@ -1987,7 +1990,7 @@ void ProcessVoiceBurstSync(dsd_opts * opts, dsd_state * state)
|
||||
//fprintf (stderr, "]\n");
|
||||
if (opts->use_ncurses_terminal == 1)
|
||||
{
|
||||
fprintf (stderr, " Alias Header and Blocks: [%s%s%s%s%s]\n", state->dmr_callsign[0], state->dmr_callsign[1], state->dmr_callsign[2], state->dmr_callsign[3], state->dmr_callsign[4] );
|
||||
fprintf (stderr, "\n Alias Header and Blocks: [%s%s%s%s%s]", state->dmr_callsign[0], state->dmr_callsign[1], state->dmr_callsign[2], state->dmr_callsign[3], state->dmr_callsign[4] );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ void processDMRvoice (dsd_opts * opts, dsd_state * state)
|
||||
{
|
||||
dibit = *dibit_p;
|
||||
dibit_p++;
|
||||
if(opts->inverted_dmr == 1)
|
||||
if(opts->inverted_dpmr == 1)
|
||||
{
|
||||
dibit = (dibit ^ 2);
|
||||
}
|
||||
@@ -90,7 +90,7 @@ void processDMRvoice (dsd_opts * opts, dsd_state * state)
|
||||
{
|
||||
dibit = *dibit_p;
|
||||
dibit_p++;
|
||||
if(opts->inverted_dmr == 1)
|
||||
if(opts->inverted_dpmr == 1)
|
||||
{
|
||||
dibit = (dibit ^ 2);
|
||||
}
|
||||
@@ -150,7 +150,7 @@ void processDMRvoice (dsd_opts * opts, dsd_state * state)
|
||||
{
|
||||
dibit = *dibit_p;
|
||||
dibit_p++;
|
||||
if(opts->inverted_dmr == 1)
|
||||
if(opts->inverted_dpmr == 1)
|
||||
{
|
||||
dibit = (dibit ^ 2);
|
||||
}
|
||||
@@ -202,7 +202,7 @@ void processDMRvoice (dsd_opts * opts, dsd_state * state)
|
||||
{
|
||||
dibit = *dibit_p;
|
||||
dibit_p++;
|
||||
if(opts->inverted_dmr == 1)
|
||||
if(opts->inverted_dpmr == 1)
|
||||
{
|
||||
dibit = (dibit ^ 2);
|
||||
}
|
||||
@@ -250,7 +250,7 @@ void processDMRvoice (dsd_opts * opts, dsd_state * state)
|
||||
{
|
||||
dibit = *dibit_p;
|
||||
dibit_p++;
|
||||
if(opts->inverted_dmr == 1)
|
||||
if(opts->inverted_dpmr == 1)
|
||||
{
|
||||
dibit = (dibit ^ 2);
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ saveImbe4400Data (dsd_opts * opts, dsd_state * state, char *imbe_d)
|
||||
k = 0;
|
||||
if (opts->payload == 1) //make opt variable later on to toggle this
|
||||
{
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "\n IMBE ");
|
||||
//fprintf(stderr, "ALGID=%X KEYID=%X\n", state->payload_algid, state->payload_keyid);
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ saveAmbe2450Data (dsd_opts * opts, dsd_state * state, char *ambe_d)
|
||||
k = 0;
|
||||
if (opts->payload == 1) //make opt variable later on to toggle this
|
||||
{
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "\n AMBE ");
|
||||
}
|
||||
//for (i = 0; i < 6; i++)
|
||||
for (i = 0; i < 7; i++) //using 7 seems to break older amb files where it was 6, need to test 7 on 7 some more
|
||||
|
||||
@@ -35,14 +35,14 @@ printFrameInfo (dsd_opts * opts, dsd_state * state)
|
||||
}
|
||||
if (state->nac != 0)
|
||||
{
|
||||
fprintf (stderr,"nac: %4X ", state->nac);
|
||||
fprintf (stderr,"nac: [%4X] ", state->nac);
|
||||
}
|
||||
|
||||
if (opts->verbose > 1)
|
||||
{
|
||||
fprintf (stderr,"src: %8i ", state->lastsrc);
|
||||
fprintf (stderr,"src: [%8i] ", state->lastsrc);
|
||||
}
|
||||
fprintf (stderr,"tg: %5i ", state->lasttg);
|
||||
fprintf (stderr,"tg: [%5i] ", state->lasttg);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -421,7 +421,7 @@ processFrame (dsd_opts * opts, dsd_state * state)
|
||||
if (opts->errorbars == 1)
|
||||
{
|
||||
printFrameInfo (opts, state);
|
||||
fprintf (stderr," Ignoring LDU2 not preceeded by LDU1\n");
|
||||
fprintf (stderr,"\n Ignoring LDU2 not preceeded by LDU1\n");
|
||||
}
|
||||
state->lastp25type = 0;
|
||||
sprintf (state->fsubtype, " ");
|
||||
|
||||
@@ -327,17 +327,17 @@ initState (dsd_state * state)
|
||||
state->payload_keyid = 0;
|
||||
|
||||
sprintf (state->dmr_branding, " ");
|
||||
sprintf (state->dmr_callsign[0], " ");
|
||||
sprintf (state->dmr_callsign[1], " ");
|
||||
sprintf (state->dmr_callsign[2], " ");
|
||||
sprintf (state->dmr_callsign[3], " ");
|
||||
sprintf (state->dmr_lrrp[0], " ");
|
||||
sprintf (state->dmr_lrrp[1], " ");
|
||||
sprintf (state->dmr_lrrp[2], " ");
|
||||
sprintf (state->dmr_lrrp[3], " ");
|
||||
sprintf (state->dmr_lrrp[4], " ");
|
||||
sprintf (state->dmr_lrrp[5], " ");
|
||||
|
||||
sprintf (state->dmr_callsign[0], "");
|
||||
sprintf (state->dmr_callsign[1], "");
|
||||
sprintf (state->dmr_callsign[2], "");
|
||||
sprintf (state->dmr_callsign[3], "");
|
||||
sprintf (state->dmr_lrrp[0], "");
|
||||
sprintf (state->dmr_lrrp[1], "");
|
||||
sprintf (state->dmr_lrrp[2], "");
|
||||
sprintf (state->dmr_lrrp[3], "");
|
||||
sprintf (state->dmr_lrrp[4], "");
|
||||
sprintf (state->dmr_lrrp[5], "");
|
||||
|
||||
state->K = 0;
|
||||
|
||||
#ifdef TRACE_DSD
|
||||
@@ -372,7 +372,7 @@ usage ()
|
||||
fprintf (stderr," -z <num> Frame rate for datascope\n");
|
||||
fprintf (stderr,"\n");
|
||||
fprintf (stderr,"Input/Output options:\n");
|
||||
fprintf (stderr," -i <device> Audio input device (default is pulse audio, - for piped stdin, rtl for rtl device)\n");
|
||||
fprintf (stderr," -i <device> Audio input device (default is pulse audio, \n - for piped stdin, rtl for rtl device)\n");
|
||||
fprintf (stderr," -o <device> Audio output device (default is pulse audio)\n");
|
||||
fprintf (stderr," -d <dir> Create mbe data files, use this directory\n");
|
||||
fprintf (stderr," -r <files> Read/Play saved mbe data from file(s)\n");
|
||||
@@ -386,8 +386,8 @@ usage ()
|
||||
fprintf (stderr," -P <num> RTL-SDR PPM Error (default = 0)\n");
|
||||
fprintf (stderr," -D <num> RTL-SDR Device Index Number\n");
|
||||
fprintf (stderr," -G <num> RTL-SDR Device Gain (0-49) (default = 0 Auto Gain)\n");
|
||||
fprintf (stderr," -L <num> RTL-SDR Squelch Level (0 - Open, 25 - Little, 50 - Higher)(Just have to guess really...)\n");
|
||||
fprintf (stderr," -V <num> RTL-SDR Sample Gain Multiplier (default = 1)(1-3 recommended, still testing) \n");
|
||||
fprintf (stderr," -L <num> RTL-SDR Squelch Level (0 - Open, 25 - Little, 50 - Higher)\n (Just have to guess really...)\n");
|
||||
fprintf (stderr," -V <num> RTL-SDR Sample Gain Multiplier (default = 1)\n");
|
||||
fprintf (stderr," -Y <num> RTL-SDR VFO Bandwidth kHz (default = 48)(6, 8, 12, 16, 24, 48) \n");
|
||||
fprintf (stderr," -U <num> RTL-SDR UDP Remote Port (default = 6020)\n");
|
||||
fprintf (stderr,"\n");
|
||||
|
||||
@@ -470,11 +470,11 @@ processHDU(dsd_opts* opts, dsd_state* state)
|
||||
}
|
||||
|
||||
//if (state->errs == 0 && algidhex != 0x80)
|
||||
if (opts->payload == 1)
|
||||
if (1 == 1) //always print hdu alg info
|
||||
//if (opts->payload == 1 && state->errs == 0)
|
||||
{
|
||||
//fprintf (stderr, " HDU ALG ID: 0x%X KEY ID: 0x%X MI: %s \n", algidhex, kidhex, mi);
|
||||
fprintf (stderr, " HDU MFID: 0x%02X ALG ID: 0x%X KEY ID: 0x%X MI: 0x%08llX%08llX%02llX\n", state->payload_mfid, algidhex, kidhex, mihex1, mihex2, mihex3);
|
||||
fprintf (stderr, " HDU ALG ID: 0x%X KEY ID: 0x%X MI: 0x%08llX%08llX%02llX MFID: 0x%02X \n", algidhex, kidhex, mihex1, mihex2, mihex3, state->payload_mfid);
|
||||
}
|
||||
|
||||
if (opts->p25enc == 1 && opts->payload == 0)
|
||||
|
||||
@@ -337,7 +337,7 @@ processLDU1 (dsd_opts* opts, dsd_state* state)
|
||||
|
||||
//state->payload_mfid = ConvertBitIntoBytes(&mfid[0], 7);
|
||||
lcinfohex = ConvertBitIntoBytes(&lcinfo[0], 55);
|
||||
fprintf (stderr, " LDU1 LCINFO %16llX \n", lcinfohex);
|
||||
//fprintf (stderr, " LDU1 LCINFO %16llX \n", lcinfohex);
|
||||
}
|
||||
|
||||
processP25lcw (opts, state, lcformat, mfid, lcinfo);
|
||||
|
||||
@@ -376,7 +376,7 @@ processLDU2 (dsd_opts * opts, dsd_state * state)
|
||||
}
|
||||
|
||||
//if (state->errs == 0 && algidhex != 0x80)
|
||||
if (opts->payload == 1)
|
||||
if (1 == 1) //always print the LDU2 alg info
|
||||
//if (opts->payload == 1 && state->errs == 0)
|
||||
{
|
||||
//fprintf (stderr, " LDU2 ALG ID: 0x%X KEY ID: 0x%X MI: %s \n", algidhex, kidhex, mi);
|
||||
|
||||
218
src/trellis.cpp
218
src/trellis.cpp
@@ -38,7 +38,10 @@ const unsigned char ENCODE_TABLE[] = {
|
||||
const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U};
|
||||
|
||||
#define READ_BIT(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
|
||||
#define WRITE_BIT(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
|
||||
|
||||
//unsigned char state = 0U;
|
||||
//unsigned int superposition = 0;
|
||||
//CDMRTrellis::CDMRTrellis()
|
||||
//{
|
||||
//}
|
||||
@@ -49,64 +52,24 @@ const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U
|
||||
|
||||
//void CDMRTrellis::tribitsToBits(const unsigned char* tribits, unsigned char* payload) const
|
||||
//void CDMRTrellisTribitsToBits(const unsigned char* tribits, unsigned char* payload) const
|
||||
void CDMRTrellisTribitsToBits(const unsigned char* tribits, unsigned char* payload)
|
||||
|
||||
{
|
||||
unsigned char bits[144];
|
||||
|
||||
// convert tribits to bits
|
||||
for (int i = 0; i < 48; i++) {
|
||||
bits[(i * 3) + 0] = (tribits[i] >> 2) & 1;
|
||||
bits[(i * 3) + 1] = (tribits[i] >> 1) & 1;
|
||||
bits[(i * 3) + 2] = tribits[i] & 1;
|
||||
}
|
||||
|
||||
// convert bits to bytes
|
||||
for (int i = 0; i < 144; i++)
|
||||
payload[i/8] = (payload[i/8] << 1) | bits[i];
|
||||
}
|
||||
|
||||
//unsigned int CDMRTrellis::checkCode(const unsigned char* points, unsigned char* tribits) const
|
||||
//unsigned int CDMRTrellisCheckCode(const unsigned char* points, unsigned char* tribits) const
|
||||
unsigned int CDMRTrellisCheckCode(const unsigned char* points, unsigned char* tribits)
|
||||
|
||||
{
|
||||
unsigned char state = 0U;
|
||||
|
||||
for (unsigned int i = 0U; i < 49U; i++) {
|
||||
tribits[i] = 9U;
|
||||
|
||||
for (unsigned int j = 0U; j < 8U; j++) {
|
||||
if (points[i] == ENCODE_TABLE[state * 8U + j]) {
|
||||
tribits[i] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (tribits[i] == 9U) {
|
||||
return i;
|
||||
}
|
||||
|
||||
state = tribits[i];
|
||||
}
|
||||
|
||||
if (tribits[48U] != 0U)
|
||||
return 48U;
|
||||
|
||||
return 999U;
|
||||
}
|
||||
//bool CDMRTrellis::fixCode(unsigned char* points, unsigned int failPos, unsigned char* payload) const
|
||||
//bool CDMRTrellisFixCode(unsigned char* points, unsigned int failPos, unsigned char* payload) const
|
||||
bool CDMRTrellisFixCode(unsigned char* points, unsigned int failPos, unsigned char* payload)
|
||||
|
||||
{
|
||||
//unsigned int bestPos = 0U;
|
||||
//unsigned int bestVal = 0U;
|
||||
|
||||
for (unsigned j = 0U; j < 20U; j++) {
|
||||
unsigned int bestPos = 0U;
|
||||
unsigned int bestVal = 0U;
|
||||
fprintf (stderr, " fail%d-", failPos);
|
||||
|
||||
for (unsigned int i = 0U; i < 16U; i++) {
|
||||
points[failPos] = i;
|
||||
|
||||
fprintf (stderr, "i%d", i);
|
||||
|
||||
unsigned char tribits[49U];
|
||||
unsigned int pos = CDMRTrellisCheckCode(points, tribits);
|
||||
if (pos == 999U) {
|
||||
@@ -126,6 +89,107 @@ bool CDMRTrellisFixCode(unsigned char* points, unsigned int failPos, unsigned ch
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void CDMRTrellisTribitsToBits(const unsigned char* tribits, unsigned char* payload)
|
||||
|
||||
{
|
||||
//g4klx version below
|
||||
/*
|
||||
for (unsigned int i = 0U; i < 48U; i++) {
|
||||
unsigned char tribit = tribits[i];
|
||||
|
||||
bool b1 = (tribit & 0x04U) == 0x04U;
|
||||
bool b2 = (tribit & 0x02U) == 0x02U;
|
||||
bool b3 = (tribit & 0x01U) == 0x01U;
|
||||
|
||||
unsigned int n = 143U - i * 3U;
|
||||
/*
|
||||
WRITE_BIT(payload, n, b1);
|
||||
n--;
|
||||
WRITE_BIT(payload, n, b2);
|
||||
n--;
|
||||
WRITE_BIT(payload, n, b3);
|
||||
}
|
||||
*/
|
||||
|
||||
// boatbod version below...
|
||||
// convert tribits to bits
|
||||
|
||||
unsigned char bits[144];
|
||||
for (int i = 0; i < 48; i++) {
|
||||
bits[(i * 3) + 0] = (tribits[i] >> 2) & 1;
|
||||
bits[(i * 3) + 1] = (tribits[i] >> 1) & 1;
|
||||
bits[(i * 3) + 2] = tribits[i] & 1;
|
||||
}
|
||||
|
||||
|
||||
// convert bits to bytes
|
||||
|
||||
for (int i = 0; i < 144; i++)
|
||||
payload[i/8] = (payload[i/8] << 1) | bits[i];
|
||||
|
||||
}
|
||||
|
||||
//unsigned int CDMRTrellis::checkCode(const unsigned char* points, unsigned char* tribits) const
|
||||
//unsigned int CDMRTrellisCheckCode(const unsigned char* points, unsigned char* tribits) const
|
||||
/*
|
||||
unsigned int CDMRTrellisCheckCode(const unsigned char* points, unsigned char* tribits)
|
||||
|
||||
{
|
||||
//replace i with superposition; revert back if totally borked
|
||||
//unsigned char state = 0U;
|
||||
|
||||
//for (unsigned int i = 0U; i < 49U; i++) {
|
||||
//tribits[i] = 9U;
|
||||
for (superposition; superposition < 49U; superposition++) {
|
||||
tribits[superposition] = 9U;
|
||||
for (unsigned int j = 0U; j < 8U; j++) {
|
||||
if (points[superposition] == ENCODE_TABLE[state * 8U + j]) {
|
||||
tribits[superposition] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (tribits[superposition] == 9) {
|
||||
return superposition;
|
||||
//experiment placing fixcode right in here instead
|
||||
//or we need to find a way to update state outside of this function
|
||||
}
|
||||
state = tribits[superposition];
|
||||
|
||||
}
|
||||
//if (tribits[48U] != 0U)
|
||||
//return 48U;
|
||||
|
||||
return 999U;
|
||||
}
|
||||
*/
|
||||
unsigned int CDMRTrellisCheckCode(const unsigned char* points, unsigned char* tribits)
|
||||
{
|
||||
unsigned char state = 0U;
|
||||
|
||||
for (unsigned int i = 0U; i < 49U; i++) {
|
||||
tribits[i] = 9U;
|
||||
|
||||
for (unsigned int j = 0U; j < 8U; j++) {
|
||||
if (points[i] == ENCODE_TABLE[state * 8U + j]) {
|
||||
tribits[i] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (tribits[i] == 9U)
|
||||
return i;
|
||||
|
||||
state = tribits[i];
|
||||
}
|
||||
|
||||
if (tribits[48U] != 0U)
|
||||
return 48U;
|
||||
|
||||
return 999U;
|
||||
}
|
||||
|
||||
//void CDMRTrellis::deinterleave(const unsigned char* data, signed char* dibits) const
|
||||
//void CDMRTrellisDeinterleave(const unsigned char* data, signed char* dibits) const
|
||||
void CDMRTrellisDeinterleave(const unsigned char* data, signed char* dibits)
|
||||
@@ -288,7 +352,7 @@ void CDMRTrellisBitsToTribits(const unsigned char* payload, unsigned char* tribi
|
||||
tribit |= b2 ? 2U : 0U;
|
||||
tribit |= b3 ? 1U : 0U;
|
||||
|
||||
tribits[i] = tribit;
|
||||
//tribits[i] = tribit;
|
||||
}
|
||||
|
||||
tribits[48U] = 0U;
|
||||
@@ -304,7 +368,7 @@ bool CDMRTrellisDecode(const unsigned char* data, unsigned char* payload)
|
||||
fprintf (stderr, "\n Raw Trellis Dibits inside Decoder\n ");
|
||||
for (short i = 0; i < 98; i++)
|
||||
{
|
||||
fprintf (stderr, "[%X]", data[i]);
|
||||
fprintf (stderr, "[%0d]", data[i]);
|
||||
}
|
||||
}
|
||||
signed char dibits[98U];
|
||||
@@ -321,37 +385,69 @@ bool CDMRTrellisDecode(const unsigned char* data, unsigned char* payload)
|
||||
CDMRTrellisDibitsToPoints(dibits, points);
|
||||
if (1 == 1)
|
||||
{
|
||||
fprintf (stderr, "\n Trellis Points inside Decoder (what the fuck are points?)\n ");
|
||||
fprintf (stderr, "\n Trellis Points inside Decoder (no higher than 15U?)\n ");
|
||||
for (short i = 0; i < 49; i++)
|
||||
{
|
||||
fprintf (stderr, "[%X]", points[i]);
|
||||
fprintf (stderr, "[%02u]", points[i]);
|
||||
}
|
||||
}
|
||||
// Check the original code
|
||||
unsigned char tribits[49U];
|
||||
unsigned int failPos = CDMRTrellisCheckCode(points, tribits);
|
||||
|
||||
|
||||
|
||||
|
||||
if (failPos == 999U) {
|
||||
CDMRTrellisTribitsToBits(tribits, payload);
|
||||
if (1 == 1)
|
||||
{
|
||||
fprintf (stderr, "\nTrellis Payload Tribits to Bits failPos == 999U\n ");
|
||||
for (short i = 0; i < 18; i++)
|
||||
{
|
||||
fprintf (stderr, "[%02u]", payload[i]);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (1 == 1)
|
||||
{
|
||||
fprintf (stderr, "\n Trellis Tribits inside Decoder\n ");
|
||||
for (short i = 0; i < 49; i++)
|
||||
{
|
||||
fprintf (stderr, "[%X]", tribits[i]); //shouldn't have any values greater that 0x7?
|
||||
}
|
||||
}
|
||||
|
||||
unsigned char savePoints[49U];
|
||||
for (unsigned int i = 0U; i < 49U; i++)
|
||||
savePoints[i] = points[i];
|
||||
|
||||
bool ret = CDMRTrellisFixCode(points, failPos, payload);
|
||||
if (ret)
|
||||
return true;
|
||||
if (ret){
|
||||
|
||||
if (1 == 1)
|
||||
{
|
||||
fprintf (stderr, "\n Trellis Tribits inside Decoder\n ");
|
||||
for (short i = 0; i < 49; i++)
|
||||
{
|
||||
fprintf (stderr, "[%0u]", tribits[i]); //shouldn't have any values greater that 0x7?
|
||||
}
|
||||
}
|
||||
|
||||
if (1 == 1)
|
||||
{
|
||||
fprintf (stderr, "\nTrellis Payload Tribits to Bits fix return true\n "); //this one seems to be happening
|
||||
for (short i = 0; i < 18; i++)
|
||||
{
|
||||
fprintf (stderr, "[%02X]", payload[i]);
|
||||
}
|
||||
}
|
||||
return true; }
|
||||
|
||||
if (failPos == 0U)
|
||||
return false;
|
||||
{
|
||||
if (1 == 1)
|
||||
{
|
||||
fprintf (stderr, "\nTrellis Payload Tribits to Bits failPos == 0U\n ");
|
||||
for (short i = 0; i < 18; i++)
|
||||
{
|
||||
fprintf (stderr, "[%02X]", payload[i]);
|
||||
}
|
||||
}
|
||||
return false; }
|
||||
|
||||
// Backtrack one place for a last go
|
||||
return CDMRTrellisFixCode(savePoints, failPos - 1U, payload);
|
||||
|
||||
Reference in New Issue
Block a user