diff --git a/DSP_API/SmartSDR_Interface/sched_waveform.c b/DSP_API/SmartSDR_Interface/sched_waveform.c index 4db6868..3675b55 100644 --- a/DSP_API/SmartSDR_Interface/sched_waveform.c +++ b/DSP_API/SmartSDR_Interface/sched_waveform.c @@ -639,7 +639,7 @@ static void * _sched_waveform_thread( void * param ) { dstar_pfcs pfcs; pfcs.crc16 = 0xFFFF; - unsigned char header_bytes[330] = {0}; + unsigned char header_bytes[RADIO_HEADER_LENGTH_BITS] = {0}; dstar_headerToBytes( &( _dstar->outgoing_header ), header_bytes ); dstar_pfcsUpdateBuffer( &pfcs, header_bytes, 312 / 8 ); dstar_pfcsResult( &pfcs, header_bytes + 312 / 8 ); @@ -649,14 +649,14 @@ static void * _sched_waveform_thread( void * param ) { BOOL bits[FEC_SECTION_LENGTH_BITS] = {0}; gmsk_bytesToBits( header_bytes, bits, 328 ); - BOOL encoded[330 * 2] = {0}; - BOOL interleaved[330 * 2] = {0}; - BOOL scrambled[330 * 2] = {0}; + BOOL encoded[RADIO_HEADER_LENGTH_BITS * 2] = {0}; + BOOL interleaved[RADIO_HEADER_LENGTH_BITS * 2] = {0}; + BOOL scrambled[RADIO_HEADER_LENGTH_BITS * 2] = {0}; uint32 outLen = 0; - dstar_FECencode( bits, encoded, 330, &outLen ); + dstar_FECencode( bits, encoded, RADIO_HEADER_LENGTH_BITS, &outLen ); //output("Encode outLen = %d\n", outLen); - outLen = 660; + outLen = FEC_SECTION_LENGTH_BITS; dstar_interleave( encoded, interleaved, outLen ); uint32 count = 0; @@ -709,7 +709,7 @@ static void * _sched_waveform_thread( void * param ) { dstar_pfcs pfcs; pfcs.crc16 = 0xFFFF; - unsigned char header_bytes[330] = {0}; + unsigned char header_bytes[RADIO_HEADER_LENGTH_BITS] = {0}; dstar_headerToBytes( &( _dstar->outgoing_header ), header_bytes ); dstar_pfcsUpdateBuffer( &pfcs, header_bytes, 312 / 8 ); dstar_pfcsResult( &pfcs, header_bytes + 312 / 8 ); diff --git a/DSP_API/ThumbDV/DStarDefines.h b/DSP_API/ThumbDV/DStarDefines.h index 15e4115..b2072ca 100644 --- a/DSP_API/ThumbDV/DStarDefines.h +++ b/DSP_API/ThumbDV/DStarDefines.h @@ -76,7 +76,7 @@ static const BOOL NULL_SLOW_DATA_BITS[] = {FALSE, FALSE, FALSE, TRUE, FALSE, TR #define FEC_SECTION_LENGTH_BITS 660U #define RADIO_HEADER_LENGTH_BITS 330U -#define RADIO_HEADER_LENGTH_BYTES 41U +#define RADIO_HEADER_LENGTH_BYTES 42U #define DATA_BLOCK_SIZE_BITS (21U * DV_FRAME_LENGTH_BITS) #define DATA_BLOCK_SIZE_BYTES (21U * DV_FRAME_LENGTH_BYTES) @@ -97,7 +97,9 @@ static const BOOL NULL_SLOW_DATA_BITS[] = {FALSE, FALSE, FALSE, TRUE, FALSE, TR #define LONG_CALLSIGN_LENGTH 8U #define SHORT_CALLSIGN_LENGTH 4U -#define MESSAGE_LENGTH 20U +#define SLOW_DATA_MESSAGE_LENGTH_BITS 20U +#define SLOW_DATA_PACKET_LEN_BYTES 3 + #define DATA_MASK 0x80U #define REPEATER_MASK 0x40U diff --git a/DSP_API/ThumbDV/dstar.c b/DSP_API/ThumbDV/dstar.c index df71e29..08b0918 100644 --- a/DSP_API/ThumbDV/dstar.c +++ b/DSP_API/ThumbDV/dstar.c @@ -1,6 +1,6 @@ -///*! \file dstar.h +///*! \file dstar.c // * -// * Handles scrambling and descrambling of DSTAR Header +// * Handles all DSTAR states // * // * \date 02-JUN-2015 // * \author Ed Gonzalez KG5FBT modified from original in OpenDV code (C) 2009 Jonathan Naylor, G4KLX @@ -37,6 +37,7 @@ #include "bit_pattern_matcher.h" #include "thumbDV.h" #include "dstar.h" +#include "slow_data.h" #define SCRAMBLER_TABLE_BITS_LENGTH 720U #define SCRAMBLER_TABLE_BYTES_LENGTH 90U @@ -503,6 +504,8 @@ DSTAR_MACHINE dstar_createMachine( void ) { dstar_createTestHeader( &( machine->outgoing_header ) ); + machine->slow_decoder = safe_malloc(sizeof(slow_data_decoder)); + return machine; } @@ -511,6 +514,8 @@ void dstar_destroyMachine( DSTAR_MACHINE machine ) { bitPM_destroy( machine->data_sync_pm ); bitPM_destroy( machine->end_pm ); + safe_free(machine->slow_decoder); + safe_free( machine ); } @@ -633,8 +638,8 @@ BOOL dstar_stateMachine( DSTAR_MACHINE machine, BOOL in_bit, unsigned char * amb BOOL * voice_bits = machine->voice_bits; BOOL * data_bits = machine->data_bits; - static unsigned char data_bytes[3 * 40 * 4] = {0}; - static uint32 long_data_bytes_idx = 0; +// static unsigned char data_bytes[3 * 40 * 4] = {0}; +// static uint32 long_data_bytes_idx = 0; //unsigned char bytes[((24+72) * 50)/8 + 1]; unsigned char bytes[FEC_SECTION_LENGTH_BITS / 8 + 1]; @@ -644,6 +649,9 @@ BOOL dstar_stateMachine( DSTAR_MACHINE machine, BOOL in_bit, unsigned char * amb found_syn_bits = bitPM_addBit( machine->syn_pm, in_bit ); BOOL found_data_sync = bitPM_addBit( machine->data_sync_pm, in_bit ); + machine->slow_decoder->decode_state = FIRST_FRAME; + machine->slow_decoder->header_array_index = 0; + if ( found_syn_bits ) { output( "FOUND SYN BITS\n" ); bitPM_reset( machine->syn_pm ); @@ -683,7 +691,7 @@ BOOL dstar_stateMachine( DSTAR_MACHINE machine, BOOL in_bit, unsigned char * amb dstar_fec fec; memset( &fec, 0, sizeof( dstar_fec ) ); unsigned int outLen = FEC_SECTION_LENGTH_BITS; - BOOL decoded[FEC_SECTION_LENGTH_BITS / 2] = {0}; + BOOL decoded[RADIO_HEADER_LENGTH_BITS] = {0}; dstar_FECdecode( &fec, out, decoded, FEC_SECTION_LENGTH_BITS, &outLen ); // output("outLen = %d\n" ,outLen); gmsk_bitsToBytes( decoded, bytes, outLen ); @@ -777,13 +785,7 @@ BOOL dstar_stateMachine( DSTAR_MACHINE machine, BOOL in_bit, unsigned char * amb //thumbDV_dump("Data Frame:", bytes, DATA_FRAME_LENGTH_BYTES); - memcpy( data_bytes + long_data_bytes_idx, bytes, 3 ); - long_data_bytes_idx += 3; - - if ( long_data_bytes_idx >= 3 * 40 * 4 ) { - //thumbDV_dump("Long Data: ", data_bytes, 3 * 40 * 4); - long_data_bytes_idx = 0; - } + slow_data_addDecodeData(machine, bytes, DATA_FRAME_LENGTH_BYTES); machine->frame_count++; @@ -824,6 +826,9 @@ BOOL dstar_stateMachine( DSTAR_MACHINE machine, BOOL in_bit, unsigned char * amb machine->bit_count = 0; } + machine->slow_decoder->decode_state = FIRST_FRAME; + machine->slow_decoder->header_array_index = 0; + break; } diff --git a/DSP_API/ThumbDV/dstar.h b/DSP_API/ThumbDV/dstar.h index f0ce48b..ae5f0b9 100644 --- a/DSP_API/ThumbDV/dstar.h +++ b/DSP_API/ThumbDV/dstar.h @@ -1,6 +1,6 @@ ///*! \file dstar.h // * -// * Handles scrambling and descrambling of DSTAR Header +// * Handles all DSTAR States // * // * \date 02-JUN-2015 // * \author Ed Gonzalez KG5FBT modified from original in OpenDV code(C) 2009 Jonathan Naylor, G4KLX @@ -30,7 +30,28 @@ #ifndef THUMBDV_DSTAR_H_ #define THUMBDV_DSTAR_H_ +#include "bit_pattern_matcher.h" #include "DStarDefines.h" +#include "dstar.h" + +enum _slow_data_decode_state { + FIRST_FRAME = 0, + HEADER_SECOND_FRAME, + MESSAGE_SECOND_FRAME +}; + +typedef struct _slow_data_decoder { + enum _slow_data_decode_state decode_state; + unsigned char header_bytes[RADIO_HEADER_LENGTH_BYTES]; + uint32 header_array_index; + unsigned char message[4][6]; + uint32 frame_count; +} slow_data_decoder, * SLOW_DATA_DECODER; + +typedef struct _slow_data_machine { + +} slow_data_machine, *SLOW_DATA_MACHINE; + enum DSTAR_STATE { BIT_FRAME_SYNC_WAIT = 0x1, @@ -76,13 +97,15 @@ typedef struct _dstar_machine { BOOL voice_bits[VOICE_FRAME_LENGTH_BITS]; BOOL data_bits[DATA_FRAME_LENGTH_BITS]; + SLOW_DATA_DECODER slow_decoder; + } dstar_machine, * DSTAR_MACHINE; typedef struct _dstar_fec { - BOOL mem0[330]; - BOOL mem1[330]; - BOOL mem2[330]; - BOOL mem3[330]; + BOOL mem0[RADIO_HEADER_LENGTH_BITS]; + BOOL mem1[RADIO_HEADER_LENGTH_BITS]; + BOOL mem2[RADIO_HEADER_LENGTH_BITS]; + BOOL mem3[RADIO_HEADER_LENGTH_BITS]; int metric[4]; } dstar_fec, * DSTAR_FEC; @@ -98,6 +121,7 @@ BOOL dstar_stateMachine( DSTAR_MACHINE machine, BOOL in_bit, unsigned char * amb void dstar_dumpHeader( DSTAR_HEADER header ); +void dstar_processHeader( unsigned char * bytes, DSTAR_HEADER header ); void dstar_pfcsUpdate( DSTAR_PFCS pfcs, BOOL * bits ); BOOL dstar_pfcsCheck( DSTAR_PFCS pfcs, BOOL * bits ); void dstar_pfcsResult( DSTAR_PFCS pfcs, unsigned char * chksum ); @@ -111,4 +135,6 @@ void dstar_interleave( const BOOL * in, BOOL * out, unsigned int length ); void dstar_deinterleave( const BOOL * in, BOOL * out, unsigned int length ); BOOL dstar_FECdecode( DSTAR_FEC fec, const BOOL * in, BOOL * out, unsigned int inLen, unsigned int * outLen ); void dstar_FECencode( const BOOL * in, BOOL * out, unsigned int inLen, unsigned int * outLen ); + #endif /* THUMBDV_DSTAR_H_ */ + diff --git a/DSP_API/ThumbDV/gmsk_modem.c b/DSP_API/ThumbDV/gmsk_modem.c index 0176a28..f28e14d 100644 --- a/DSP_API/ThumbDV/gmsk_modem.c +++ b/DSP_API/ThumbDV/gmsk_modem.c @@ -89,10 +89,10 @@ void gmsk_bytesToBits( unsigned char * bytes, BOOL * bits, uint32 num_bits ) { return; } - uint32 bits_left = num_bits; + int32 bits_left = num_bits; uint32 byte_idx = 0; - while ( bits_left != 0 ) { + while ( bits_left > 0 ) { gmsk_byteToBits( bytes[byte_idx], &bits[byte_idx * 8], bits_left > 8 ? 8 : bits_left ); byte_idx++; bits_left -= 8; diff --git a/DSP_API/ThumbDV/thumbDV.h b/DSP_API/ThumbDV/thumbDV.h index 5e3b69c..aa19dd4 100644 --- a/DSP_API/ThumbDV/thumbDV.h +++ b/DSP_API/ThumbDV/thumbDV.h @@ -33,8 +33,8 @@ * ************************************************************************** */ -#ifndef THUMBDV_THUMBDV_ -#define THUMBDV_THUMBDV_ +#ifndef THUMBDV_THUMBDV_H_ +#define THUMBDV_THUMBDV_H_ void thumbDV_init( int * serial_fd ); int thumbDV_openSerial( const char * tty_name ); diff --git a/DSP_API/common.h b/DSP_API/common.h index 22b6c07..ac77a00 100644 --- a/DSP_API/common.h +++ b/DSP_API/common.h @@ -45,6 +45,7 @@ #define SUCCESS 0 +#define FAIL 1 #define SMARTSDR_API_PORT "4992" #define VITA_49_PORT 5000