From 13ec6855f8bc8fd0f5621cad9fbf133e36c0e519 Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Sat, 26 Mar 2022 00:03:14 -0400 Subject: [PATCH] DMR 12 Rate Updates DMR 12 Rate Updates Other Tweaks to P25 Printing More experimenting with 34 Rate Trellis Code (busted) --- include/dsd.h | 1 + src/dmr_data.c | 5 +- src/dmr_encryption.c | 2 + src/dmr_sync.c | 47 +++++----- src/dmr_voice.c | 10 +- src/dsd_file.c | 4 +- src/dsd_frame.c | 8 +- src/dsd_main.c | 28 +++--- src/p25p1_hdu.c | 4 +- src/p25p1_ldu1.c | 2 +- src/p25p1_ldu2.c | 2 +- src/trellis.cpp | 218 +++++++++++++++++++++++++++++++------------ 12 files changed, 216 insertions(+), 115 deletions(-) diff --git a/include/dsd.h b/include/dsd.h index 3fa3544..8609d06 100644 --- a/include/dsd.h +++ b/include/dsd.h @@ -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); diff --git a/src/dmr_data.c b/src/dmr_data.c index a41b50c..44ef3ed 100644 --- a/src/dmr_data.c +++ b/src/dmr_data.c @@ -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); diff --git a/src/dmr_encryption.c b/src/dmr_encryption.c index 44bffd1..a7fb7c1 100644 --- a/src/dmr_encryption.c +++ b/src/dmr_encryption.c @@ -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 diff --git a/src/dmr_sync.c b/src/dmr_sync.c index 8a4494c..479b140 100644 --- a/src/dmr_sync.c +++ b/src/dmr_sync.c @@ -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] ); } } diff --git a/src/dmr_voice.c b/src/dmr_voice.c index 5d4fe41..f08df02 100644 --- a/src/dmr_voice.c +++ b/src/dmr_voice.c @@ -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); } diff --git a/src/dsd_file.c b/src/dsd_file.c index a05e960..6bfe428 100644 --- a/src/dsd_file.c +++ b/src/dsd_file.c @@ -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 diff --git a/src/dsd_frame.c b/src/dsd_frame.c index da7b8a2..fe0b37c 100644 --- a/src/dsd_frame.c +++ b/src/dsd_frame.c @@ -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, " "); diff --git a/src/dsd_main.c b/src/dsd_main.c index a539116..e95ca9f 100644 --- a/src/dsd_main.c +++ b/src/dsd_main.c @@ -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 Frame rate for datascope\n"); fprintf (stderr,"\n"); fprintf (stderr,"Input/Output options:\n"); - fprintf (stderr," -i Audio input device (default is pulse audio, - for piped stdin, rtl for rtl device)\n"); + fprintf (stderr," -i Audio input device (default is pulse audio, \n - for piped stdin, rtl for rtl device)\n"); fprintf (stderr," -o Audio output device (default is pulse audio)\n"); fprintf (stderr," -d Create mbe data files, use this directory\n"); fprintf (stderr," -r Read/Play saved mbe data from file(s)\n"); @@ -386,8 +386,8 @@ usage () fprintf (stderr," -P RTL-SDR PPM Error (default = 0)\n"); fprintf (stderr," -D RTL-SDR Device Index Number\n"); fprintf (stderr," -G RTL-SDR Device Gain (0-49) (default = 0 Auto Gain)\n"); - fprintf (stderr," -L RTL-SDR Squelch Level (0 - Open, 25 - Little, 50 - Higher)(Just have to guess really...)\n"); - fprintf (stderr," -V RTL-SDR Sample Gain Multiplier (default = 1)(1-3 recommended, still testing) \n"); + fprintf (stderr," -L RTL-SDR Squelch Level (0 - Open, 25 - Little, 50 - Higher)\n (Just have to guess really...)\n"); + fprintf (stderr," -V RTL-SDR Sample Gain Multiplier (default = 1)\n"); fprintf (stderr," -Y RTL-SDR VFO Bandwidth kHz (default = 48)(6, 8, 12, 16, 24, 48) \n"); fprintf (stderr," -U RTL-SDR UDP Remote Port (default = 6020)\n"); fprintf (stderr,"\n"); diff --git a/src/p25p1_hdu.c b/src/p25p1_hdu.c index 5476f2c..5aa1d2f 100644 --- a/src/p25p1_hdu.c +++ b/src/p25p1_hdu.c @@ -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) diff --git a/src/p25p1_ldu1.c b/src/p25p1_ldu1.c index a0f6a5b..fc0519a 100644 --- a/src/p25p1_ldu1.c +++ b/src/p25p1_ldu1.c @@ -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); diff --git a/src/p25p1_ldu2.c b/src/p25p1_ldu2.c index 1636407..0432f6a 100644 --- a/src/p25p1_ldu2.c +++ b/src/p25p1_ldu2.c @@ -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); diff --git a/src/trellis.cpp b/src/trellis.cpp index e5ea556..3379f30 100644 --- a/src/trellis.cpp +++ b/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);