From f45f4fe41367411dc6c1433f863692fc004a3d2c Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Tue, 9 Aug 2022 18:10:13 -0400 Subject: [PATCH 01/10] NCurses Menu --NCurses Menu (no more tedious CLI options) --Save/Read Capture Bin (WIP!) --Read OP25 Capture Bin (WIP!) --Per Call WAV saving on DMR Stereo --Revampled Data Header and 1/2, 3/4 Data LRRP --Dump LRRP Data to text file, import into QGIS --Included QGIS Map File with layers set up --DMR CACH and Burst FEC --No more Port Audio or OSS...ever. --Switch to 8Khz/1Ch for most decode types due to crisper sound ---DMR Stereo remains at 24/2, will look into revampint upsampe for cleaner sound --- cmake/FindLibPortAudio.cmake | 90 +++ dsd-fme.png | Bin 72624 -> 216836 bytes dsd-fme2.png | Bin 181175 -> 157123 bytes include/dsd.h | 164 +++-- include/nxdn_const.h | 2 +- src/dmr_bs.c | 145 ++-- src/dmr_data.c | 114 ++- src/dmr_ms.c | 143 ++-- src/dmr_process_voice.c | 30 +- src/dmr_sync.c | 741 ++++++++++++------- src/dmr_voice.c | 4 +- src/dsd_audio.c | 156 ++-- src/dsd_dibit.c | 31 +- src/dsd_file.c | 179 +++-- src/dsd_frame.c | 24 + src/dsd_frame_sync.c | 66 ++ src/dsd_main.c | 440 ++++++----- src/dsd_mbe.c | 111 ++- src/dsd_ncurses.c | 1338 +++++++++++++++++++++++++++++++--- src/dsd_reset.c | 6 +- src/dsd_symbol.c | 87 ++- src/fec.c | 3 +- src/nxdn_data.c | 5 +- src/nxdn_lib.c | 736 +++++++++++++++++-- src/nxdn_voice.c | 9 +- src/p25_p2.c | 30 + src/p25p1_hdu.c | 16 +- src/p25p1_ldu1.c | 7 +- src/p25p1_ldu2.c | 54 +- src/rtl_sdr_fm.cpp | 24 +- 30 files changed, 3601 insertions(+), 1154 deletions(-) create mode 100644 cmake/FindLibPortAudio.cmake create mode 100644 src/p25_p2.c diff --git a/cmake/FindLibPortAudio.cmake b/cmake/FindLibPortAudio.cmake new file mode 100644 index 0000000..67c43e9 --- /dev/null +++ b/cmake/FindLibPortAudio.cmake @@ -0,0 +1,90 @@ +# - Try to find Portaudio +# Once done this will define +# +# PORTAUDIO_FOUND - system has Portaudio +# PORTAUDIO_INCLUDE_DIRS - the Portaudio include directory +# PORTAUDIO_LIBRARIES - Link these to use Portaudio +# PORTAUDIO_DEFINITIONS - Compiler switches required for using Portaudio +# PORTAUDIO_VERSION - Portaudio version +# +# Copyright (c) 2006 Andreas Schneider +# +# Redistribution and use is allowed according to the terms of the New BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# + + +if (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) + # in cache already + set(PORTAUDIO_FOUND TRUE) +else (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) + if (NOT WIN32) + include(FindPkgConfig) + pkg_check_modules(PORTAUDIO2 portaudio-2.0) + endif (NOT WIN32) + + find_path (PORTAUDIO_INCLUDE_DIRS + NAMES + portaudio.h + PATHS + ${PORTAUDIO2_INCLUDEDIR} + /usr/include + /usr/local/include + /opt/local/include + /sw/include + ) + if (NOT PORTAUDIO_INCLUDE_DIRS) + set (PORTAUDIO_INCLUDE_DIRS + ${PORTAUDIO2_INCLUDE_DIRS} + ) + list (APPEND PORTAUDIO_INCLUDE_DIRS ${PORTAUDIO2_INCLUDEDIR}) + endif (NOT PORTAUDIO_INCLUDE_DIRS) + + find_library (PORTAUDIO_LIBRARIES + NAMES + portaudio + PATHS + ${PORTAUDIO2_LIBDIR} + /usr/lib + /usr/local/lib + /opt/local/lib + /sw/lib + ) + if (NOT PORTAUDIO_LIBRARIES) + if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(PORTAUDIO_LIBRARIES "${PORTAUDIO2_LIBDIR}/lib${PORTAUDIO2_LIBRARIES}.dylib") + else (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(PORTAUDIO_LIBRARIES + ${PORTAUDIO2_LIBRARIES} + ) + endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + endif (NOT PORTAUDIO_LIBRARIES) + + if (PORTAUDIO2_VERSION) + set(PORTAUDIO_VERSION + ${PORTAUDIO2_VERSION} + ) + else (PORTAUDIO2_VERSION) + set(PORTAUDIO_VERSION + 18 + ) + endif (PORTAUDIO2_VERSION) + + if (PORTAUDIO_INCLUDE_DIRS AND PORTAUDIO_LIBRARIES) + set(PORTAUDIO_FOUND TRUE) + endif (PORTAUDIO_INCLUDE_DIRS AND PORTAUDIO_LIBRARIES) + + if (PORTAUDIO_FOUND) + if (NOT Portaudio_FIND_QUIETLY) + message(STATUS "Found Portaudio: ${PORTAUDIO_LIBRARIES}") + endif (NOT Portaudio_FIND_QUIETLY) + else (PORTAUDIO_FOUND) + if (Portaudio_FIND_REQUIRED) + message(FATAL_ERROR "Could not find Portaudio") + endif (Portaudio_FIND_REQUIRED) + endif (PORTAUDIO_FOUND) + + # show the PORTAUDIO_INCLUDE_DIRS and PORTAUDIO_LIBRARIES variables only in the advanced view + mark_as_advanced(PORTAUDIO_INCLUDE_DIRS PORTAUDIO_LIBRARIES) + +endif (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) diff --git a/dsd-fme.png b/dsd-fme.png index d45c8d47a59d5e3358552a94d28be5209a310a10..d76473af9cc8558179ca3d17cd99cffce22dacef 100644 GIT binary patch literal 216836 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

ym*#$>p2sE6f# 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 z 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

#M+#IfIJ8*klqt@4KN|VQc};G;rq5<* z@%FX8odq|xyFuDuN*$9bQhCA}@swwG0kw6Cu+B0suTHH5FUb>z8P`YUN5gwxt7TQa zdDs1hhalK0dn}*1Wy?49+8EiU9u$=eb|@fu9a)>{dA||y+s{2ykb1`)udmS6VKVQK zEHMkwR@kusseYrH_O^YInCpJF@c<)GL(N8**7aYT{&yeJsUsJJBz{31MaMXWGNfKK zA~N}x(Ylx?n?Ga*-b-sDSfrPP4V!e?yE0|FSo{Cyss(BGse)_0a}_SUwy@XQHM)&Q zppX?cjKY6O9X=CqGn@m&Ka>vq3ikhr^+Eif(nJ3@1@$?)$AQb6oyjoC7xj_l5K#X8 zSUyar$4ZIF_V$)GwdNnII5LN4?^@J{gcbk$F?osF$oSEfvz1p0nwXf#!~=oD>$8BI zK*{P2+pft``)|3=3MQ=)8$W>j{nppkEQ%og@cy510Fk-%=iUP75ZGMA5ZJ5#jK93M UJDB|SX<+~YPgg&ebxsLQ009x`xBvhE diff --git a/dsd-fme2.png b/dsd-fme2.png index 6ea3e53d1ca7872817c4af7ca8e055c7a22dd73d..85a88b933c1112495ea80696489946c412b9dbd9 100644 GIT binary patch literal 157123 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 literal 181175 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%0A90^8;plY9S;QPM|)ek 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

M&`xHhpO>`OJyqSbvkN4=!Ty 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 #include #include -#ifdef SOLARIS -#include -#endif -#if defined(BSD) && !defined(__APPLE__) -#include -#endif + #include #include #include @@ -54,29 +49,16 @@ #include //PULSE AUDIO #include //PULSE AUDIO -//#include //PUlSE AUDIO #define SAMPLE_RATE_IN 48000 //48000 #define SAMPLE_RATE_OUT 8000 //8000, -#ifdef USE_PORTAUDIO -#include "portaudio.h" -#define PA_FRAMES_PER_BUFFER 64 -//Buffer needs to be large enough to prevent input buffer overruns while DSD is doing other struff (like outputting voice) -//else you get skipped samples which result in incomplete/erronous decodes and a mountain of error messages. -#define PA_LATENCY_IN 0.500 -//Buffer needs to be large enough to prevent output buffer underruns while DSD is doing other stuff (like decoding input) -//else you get choppy audio and in 'extreme' cases errors. -//Buffer also needs to be as small as possible so we don't have a lot of audio delay. -#define PA_LATENCY_OUT 0.100 -#endif - #ifdef USE_RTLSDR #include #endif -//look into making this not required by doing ifdef, make new c file for methods, and CLI case option for ncurses terminal -#include //move this stuff to dsd.h -#include //move this stuff to dsd.h + +#include +#include static volatile int exitflag; @@ -153,18 +135,6 @@ typedef struct uint8_t NextIVComputed[8]; } NxdnElementsContent_t; - -enum -{ - MODE_UNENCRYPTED, - MODE_BASIC_PRIVACY, - MODE_ENHANCED_PRIVACY_ARC4, - MODE_ENHANCED_PRIVACY_AES256, - MODE_HYTERA_BASIC_40_BIT, - MODE_HYTERA_BASIC_128_BIT, - MODE_HYTERA_BASIC_256_BIT -}; - //Read Solomon (12,9) constant #define RS_12_9_DATASIZE 9 #define RS_12_9_CHECKSUMSIZE 3 @@ -281,9 +251,7 @@ typedef struct int audio_in_fd; SNDFILE *audio_in_file; SF_INFO *audio_in_file_info; -#ifdef USE_PORTAUDIO - PaStream* audio_in_pa_stream; -#endif + uint32_t rtlsdr_center_freq; int rtlsdr_ppm_error; //was int, changed to float int audio_in_type; // 0 for device, 1 for file, 2 for portaudio, 3 for rtlsdr @@ -291,9 +259,7 @@ typedef struct int audio_out_fd; SNDFILE *audio_out_file; SF_INFO *audio_out_file_info; -#ifdef USE_PORTAUDIO - PaStream* audio_out_pa_stream; -#endif + int audio_out_type; // 0 for device, 1 for file, 2 for portaudio int split; int playoffset; @@ -302,11 +268,19 @@ typedef struct char mbe_out_file[1024]; char mbe_out_path[1024]; FILE *mbe_out_f; + FILE *symbol_out_f; float audio_gain; float audio_gainR; int audio_out; + int dmr_stereo_wav; char wav_out_file[1024]; + char wav_out_fileR[1024]; + char wav_out_file_raw[1024]; + char symbol_out_file[1024]; + short int symbol_out; SNDFILE *wav_out_f; + SNDFILE *wav_out_fR; + SNDFILE *wav_out_raw; //int wav_out_fd; int serial_baud; char serial_dev[1024]; @@ -315,6 +289,7 @@ typedef struct int frame_dstar; int frame_x2tdma; int frame_p25p1; + int frame_p25p2; int frame_nxdn48; int frame_nxdn96; int frame_dmr; @@ -338,17 +313,16 @@ typedef struct int rtl_volume_multiplier; int rtl_udp_port; int rtl_bandwidth; + int rtl_started; int monitor_input_audio; int pulse_raw_rate_in; int pulse_raw_rate_out; int pulse_digi_rate_in; int pulse_digi_rate_out; - //int pulse_digi_rate_outR; int pulse_raw_in_channels; int pulse_raw_out_channels; int pulse_digi_in_channels; int pulse_digi_out_channels; - //int pulse_digi_out_channelsR; int pulse_flush; pa_simple *pulse_raw_dev_in; pa_simple *pulse_raw_dev_out; @@ -356,23 +330,26 @@ typedef struct pa_simple *pulse_digi_dev_out; pa_simple *pulse_digi_dev_outR; int use_ncurses_terminal; + int ncurses_compact; + int ncurses_history; int reset_state; int payload; char output_name[1024]; - int EncryptionMode; - unsigned int dPMR_curr_frame_is_encrypted; int dPMR_next_part_of_superframe; int inverted_dpmr; int frame_dpmr; // short int dmr_stereo; + short int lrrp_file_output; // int frame_ysf; - int inverted_ysf; //not sure if ysf comes in inverted or not, but signal could if IQ flipped - short int aggressive_framesync; //set to 1 for more aggressive framesync, 0 for less aggressive + int inverted_ysf; + short int aggressive_framesync; + + FILE *symbolfile; } dsd_opts; @@ -380,8 +357,8 @@ typedef struct { int *dibit_buf; int *dibit_buf_p; - int *dmr_payload_buf; //try loading up a small amount to buffer, 144 or 288? - int *dmr_payload_p; //position for payload buffer + int *dmr_payload_buf; + int *dmr_payload_p; int repeat; short *audio_out_buf; short *audio_out_buf_p; @@ -415,13 +392,15 @@ typedef struct int maxbuf[1024]; int minbuf[1024]; int midx; - char err_str[64]; //actual error errorbars - char err_buf[64]; //make copy of err_str for comparison, only have string print when strcmp is different?? + char err_str[64]; + char err_buf[64]; char err_strR[64]; char err_bufR[64]; char fsubtype[16]; char ftype[16]; int symbolcnt; + int symbolc; + int rf_mod; int numflips; int lastsynctype; @@ -473,12 +452,12 @@ typedef struct int payload_mfid; int payload_mfidR; int payload_mi; - int payload_miR; //check to see if anything tied to this still functions appropriately - uint64_t payload_miP; - int payload_lsfr; - int payload_lsfrR; + int payload_miR; + unsigned long long int payload_miN; + unsigned long long int payload_miP; + int p25vc; unsigned long long int K; - int M; + int menuopen; unsigned int debug_audio_errors; unsigned int debug_audio_errorsR; @@ -506,7 +485,8 @@ typedef struct unsigned int nxdn_key; char nxdn_call_type[1024]; char dmr_callsign[2][6][99]; //plenty of room in case of overflow; - char dmr_lrrp[2][6][9999]; + char dmr_lrrp[2][6][9999]; //memory hog + unsigned long long int dmr_lrrp_source[2]; NxdnSacchRawPart_t NxdnSacchRawPart[4]; NxdnFacch1RawPart_t NxdnFacch1RawPart[2]; @@ -539,16 +519,21 @@ typedef struct TimeSlotVoiceSuperFrame_t TS2SuperFrame; char dmr_branding[25]; - uint8_t dmr_12_rate_sf[2][60]; //going five frames deep by 12 bytes //[slot][value] - uint8_t dmr_34_rate_sf[2][64]; //going four frames deep by 16 bytes //[slot][value] - int dmr_stereo_payload[144]; //load up 144 dibit buffer for every single DMR TDMA frame - //uint8_t dmr_stereo_payload[144]; //load up 144 dibit buffer for every single DMR TDMA frame + uint8_t dmr_12_rate_sf[2][84]; //going seven blocks deep by 12 bytes //[slot][value] + uint8_t dmr_34_rate_sf[2][96]; //going six blocks deep by 16 bytes //[slot][value] + int dmr_stereo_payload[144]; //load up 144 dibit buffer for every single DMR TDMA frame + uint8_t data_header_blocks[2]; //collect number of blocks to follow from data header per slot + uint8_t data_header_padding[2]; //collect number of padding octets in last block per slot + uint8_t data_header_format[2]; //collect format of data header (conf or unconf) per slot + uint8_t data_header_sap[2]; //collect sap info per slot + uint8_t data_block_counter[2]; //counter for number of data blocks collected + uint8_t data_p_head[2]; //flag for dmr proprietary header to follow dPMRVoiceFS2Frame_t dPMRVoiceFS2Frame; //These flags are used to known the DMR frame - //printing format (hex or binary) + //printing format (hex or binary) int printDMRRawVoiceFrameHex; int printDMRRawVoiceFrameBin; int printDMRRawDataFrameHex; @@ -557,7 +542,7 @@ typedef struct int printDMRAmbeVoiceSampleBin; //These flags are used to known the dPMR frame - //orinting format (hex or binary) + //orinting format (hex or binary) int printdPMRRawVoiceFrameHex; int printdPMRRawVoiceFrameBin; int printdPMRRawDataFrameHex; @@ -574,9 +559,8 @@ typedef struct short int dmr_ms_mode; unsigned int dmrburstL; unsigned int dmrburstR; - int dropL; - int dropR; unsigned long long int R; + // int block_count; //dstar header for ncurses unsigned char dstarradioheader[41]; @@ -604,6 +588,21 @@ typedef struct #define INV_P25P1_SYNC "333331331133111131311111" #define P25P1_SYNC "111113113311333313133333" +//preliminary P2 sync + +// static const uint64_t P25P2_FRAME_SYNC_MAGIC = 0x575D57F7FFLL; // 40 bits +// static const uint64_t P25P2_FRAME_SYNC_REV_P = 0x575D57F7FFLL ^ 0xAAAAAAAAAALL; +#define P25P2_SYNC "11131131111333133333" +#define INV_P25P2_SYNC "33313313333111311111" +// static const uint64_t P25P2_FRAME_SYNC_MASK = 0xFFFFFFFFFFLL; //wonder what the mask was for if its all F +// +// static const uint64_t P25P2_FRAME_SYNC_N1200 = 0x0104015155LL; +//#define P25P2_SYNC_N "" +// static const uint64_t P25P2_FRAME_SYNC_X2400 = 0xa8a2a8d800LL; +//#define P25P2_SYNC_X "" +// static const uint64_t P25P2_FRAME_SYNC_P1200 = 0xfefbfeaeaaLL; +//#define P25P2_SYNC_P "" + #define X2TDMA_BS_VOICE_SYNC "113131333331313331113311" #define X2TDMA_BS_DATA_SYNC "331313111113131113331133" #define X2TDMA_MS_DATA_SYNC "313113333111111133333313" @@ -628,9 +627,8 @@ typedef struct #define DMR_MS_DATA_SYNC "311131133313133331131113" #define DMR_MS_VOICE_SYNC "133313311131311113313331" -//inversion testing on MS -//#define DMR_MS_DATA_SYNC "133313311131311113313331" -//#define DMR_MS_VOICE_SYNC "311131133313133331131113" +//Testing NXDN FSW again +#define NXDN_FSW "3131331131" #define DMR_RC_DATA_SYNC "131331111133133133311313" @@ -670,7 +668,10 @@ void processAudio (dsd_opts * opts, dsd_state * state); void processAudioR (dsd_opts * opts, dsd_state * state); void openPulseInput (dsd_opts * opts); //not sure if we need to just pass opts, or opts and state yet void openPulseOutput (dsd_opts * opts); //not sure if we need to just pass opts, or opts and state yet +void closePulseInput (dsd_opts * opts); +void closePulseOutput (dsd_opts * opts); void writeSynthesizedVoice (dsd_opts * opts, dsd_state * state); +void writeSynthesizedVoiceR (dsd_opts * opts, dsd_state * state); void playSynthesizedVoice (dsd_opts * opts, dsd_state * state); void playSynthesizedVoiceR (dsd_opts * opts, dsd_state * state); void openAudioOutDevice (dsd_opts * opts, int speed); @@ -690,7 +691,17 @@ void openMbeInFile (dsd_opts * opts, dsd_state * state); void closeMbeOutFile (dsd_opts * opts, dsd_state * state); void openMbeOutFile (dsd_opts * opts, dsd_state * state); void openWavOutFile (dsd_opts * opts, dsd_state * state); +void openWavOutFileL (dsd_opts * opts, dsd_state * state); +void openWavOutFileR (dsd_opts * opts, dsd_state * state); +void openWavOutFileRaw (dsd_opts * opts, dsd_state * state); +void openSymbolOutFile (dsd_opts * opts, dsd_state * state); +void closeSymbolOutFile (dsd_opts * opts, dsd_state * state); +void writeSymbolOutFile (dsd_opts * opts, dsd_state * state); +void writeRawSample (dsd_opts * opts, dsd_state * state, short sample); void closeWavOutFile (dsd_opts * opts, dsd_state * state); +void closeWavOutFileL (dsd_opts * opts, dsd_state * state); +void closeWavOutFileR (dsd_opts * opts, dsd_state * state); +void closeWavOutFileRaw (dsd_opts * opts, dsd_state * state); void printFrameInfo (dsd_opts * opts, dsd_state * state); void processFrame (dsd_opts * opts, dsd_state * state); void printFrameSync (dsd_opts * opts, dsd_state * state, char *frametype, int offset, char *modulation); @@ -724,22 +735,20 @@ void processX2TDMAdata (dsd_opts * opts, dsd_state * state); void processX2TDMAvoice (dsd_opts * opts, dsd_state * state); void processDSTAR_HD (dsd_opts * opts, dsd_state * state); void processYSF(dsd_opts * opts, dsd_state * state); //YSF +void processP2(dsd_opts * opts, dsd_state * state); //P2 short dmr_filter(short sample); short nxdn_filter(short sample); - int strncmperr(const char *s1, const char *s2, size_t size, int MaxErr); /* Global functions */ //also borrowed uint32_t ConvertBitIntoBytes(uint8_t * BufferIn, uint32_t BitLength); uint32_t ConvertAsciiToByte(uint8_t AsciiMsbByte, uint8_t AsciiLsbByte, uint8_t * OutputByte); void Convert49BitSampleInto7Bytes(char * InputBit, char * OutputByte); void Convert7BytesInto49BitSample(char * InputByte, char * OutputBit); -// -//ifdef ncurses -void ncursesOpen (); + +void ncursesOpen (dsd_opts * opts, dsd_state * state); void ncursesPrinter (dsd_opts * opts, dsd_state * state); void ncursesClose (); -//endif ncurses /* NXDN frame decoding functions */ void ProcessNXDNFrame(dsd_opts * opts, dsd_state * state, uint8_t Inverted); @@ -763,7 +772,7 @@ uint8_t NXDN_decode_LICH(uint8_t InputLich[8], uint8_t * Option, uint8_t * Direction, uint8_t * CompleteLichBinaryFormat, - uint8_t Inverted); + uint8_t Inverted); uint8_t NXDN_SACCH_raw_part_decode(uint8_t * Input, uint8_t * Output); void NXDN_SACCH_Full_decode(dsd_opts * opts, dsd_state * state); uint8_t NXDN_FACCH1_decode(uint8_t * Input, uint8_t * Output); @@ -778,12 +787,11 @@ char * NXDN_Cipher_Type_To_Str(uint8_t CipherType); uint16_t CRC15BitNXDN(uint8_t * BufferIn, uint32_t BitLength); uint16_t CRC12BitNXDN(uint8_t * BufferIn, uint32_t BitLength); uint8_t CRC6BitNXDN(uint8_t * BufferIn, uint32_t BitLength); -void ScrambledNXDNVoiceBit(int * LfsrValue, char * BufferIn, char * BufferOut, int NbOfBitToScramble); - void dPMRVoiceFrameProcess(dsd_opts * opts, dsd_state * state); void printdPMRAmbeVoiceSample(dsd_opts * opts, dsd_state * state); void printdPMRRawVoiceFrame (dsd_opts * opts, dsd_state * state); + //dPMR functions void ScrambledPMRBit(uint32_t * LfsrValue, uint8_t * BufferIn, uint8_t * BufferOut, uint32_t NbOfBitToScramble); void DeInterleave6x12DPmrBit(uint8_t * BufferIn, uint8_t * BufferOut); @@ -827,9 +835,9 @@ void ProcessMBCData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 void ProcessMBChData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]); void ProcessWTFData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]); void ProcessUnifiedData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]); + //LFSR code courtesy of https://github.com/mattames/LFSR/ int LFSR(dsd_state * state); -int LFSRP(dsd_state * state); void Hamming_7_4_init(); void Hamming_7_4_encode(unsigned char *origBits, unsigned char *encodedBits); @@ -876,7 +884,7 @@ extern "C" { #endif void open_rtlsdr_stream(dsd_opts *opts); void cleanup_rtlsdr_stream(); -void get_rtlsdr_sample(int16_t *sample); +void get_rtlsdr_sample(int16_t *sample, dsd_opts * opts, dsd_state * state); void rtlsdr_sighandler(); //TRELLIS @@ -890,8 +898,6 @@ void CDMRTrellisPointsToDibits(const unsigned char* points, signed char* dibits) void CDMRTrellisBitsToTribits(const unsigned char* payload, unsigned char* tribits); bool CDMRTrellisDecode(const unsigned char* data, unsigned char* payload); - - #ifdef __cplusplus } #endif diff --git a/include/nxdn_const.h b/include/nxdn_const.h index 8b34ccf..85a5896 100644 --- a/include/nxdn_const.h +++ b/include/nxdn_const.h @@ -76,7 +76,7 @@ extern const int DSDNXDN_UDCH_m_PunctureList[58]; */ const char nxdnpr[145] = { 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1 }; //const unsigned char nxdnpr2[384] = -const unsigned char nxdnpr2[182] = //is this a problem, should it be 384/2 for dibits? +const unsigned char nxdnpr2[182] = //generated from default in manual with the x^9+x^4+1 poly? { 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, diff --git a/src/dmr_bs.c b/src/dmr_bs.c index 886ac7b..f68d95e 100644 --- a/src/dmr_bs.c +++ b/src/dmr_bs.c @@ -10,13 +10,11 @@ void dmrBS (dsd_opts * opts, dsd_state * state) char ambe_fr[4][24] = {0}; char ambe_fr2[4][24] = {0}; char ambe_fr3[4][24] = {0}; - char t_ambe_fr[4][24] = {9}; - char t_ambe_fr2[4][24] = {9}; - char t_ambe_fr3[4][24] = {9}; + const int *w, *x, *y, *z; char sync[25] = {0}; char syncdata[48] = {0}; - char cachdata[13] = {0}; + //char cachdata[13] = {0}; int mutecurrentslot; int msMode; char cc[4]; @@ -29,6 +27,11 @@ void dmrBS (dsd_opts * opts, dsd_state * state) unsigned short int vc1; unsigned short int vc2; + //cach fec + char cachdata[25] = {0}; //increased from 24 to 25 to see if this fixes ubuntu 32 bug + int cachInterleave[24] = {0, 7, 8, 9, 1, 10, 11, 12, 2, 13, 14, 15, 3, 16, 4, 17, 18, 19, 5, 20, 21, 22, 6, 23}; + + //add time to mirror printFrameSync time_t now; char * getTime(void) //get pretty hh:mm:ss timestamp @@ -67,17 +70,34 @@ void dmrBS (dsd_opts * opts, dsd_state * state) for(i = 0; i < 12; i++) { dibit = getDibit(opts, state); - cachdata[i] = dibit; state->dmr_stereo_payload[i] = dibit; - //fprintf (stderr, "D%X ", dibit); - //fprintf (stderr, "P%X ", state->dmr_stereo_payload[i]); - if(i == 2) - { - state->currentslot = (1 & (dibit >> 1)); - internalslot = (1 & (dibit >> 1)); - } + + cachdata[cachInterleave[(i*2)]] = (1 & (dibit >> 1)); // bit 1 + cachdata[cachInterleave[(i*2)+1]] = (1 & dibit); // bit 0 } + cachdata[25] = 0; //setting to see if this fixes ubuntu 32 bit bug + + //decode and correct cach and compare + int cach_okay = 69; + if ( Hamming_7_4_decode (cachdata) ) //see if we need to de-interleave this...probably do. + { + cach_okay = 1; + } + if (cach_okay == 1) + { + //fprintf (stderr, "CACH Okay "); + } + if (cach_okay != 1) + { + //fprintf (stderr, "CACH FEC Error %d", cach_okay); + } + + state->currentslot = cachdata[1]; + internalslot = cachdata[1]; + + //this cach fec seems to work quite well, really helps on shaky signals + //Setup for first AMBE Frame //Interleave Schedule w = rW; @@ -140,19 +160,24 @@ void dmrBS (dsd_opts * opts, dsd_state * state) //short int l = 0; //do I still use this? // signaling data or sync + long long int late_entry_pi[24] = {0}; + short int m = 0; for(i = 0; i < 24; i++) { dibit = getDibit(opts, state); state->dmr_stereo_payload[i+66] = dibit; syncdata[(2*i)] = (1 & (dibit >> 1)); // bit 1 - syncdata[(2*i)+1] = (1 & dibit); // bit 0 + syncdata[(2*i)+1] = (1 & dibit); // bit 0 sync[i] = (dibit | 1) + 48; - if (i < 4 || i > 19) // + if (i < 4 || i > 19) { - EmbeddedSignalling[2*i] = (1 & (dibit >> 1)); // bit 1 - EmbeddedSignalling[2*i+1] = (1 & dibit); // bit 0 + // fprintf(stderr, "\n EMB = "); + EmbeddedSignalling[(2*i)] = (1 & (dibit >> 1)); // bit 1 + //fprintf (stderr, "%02b", dibit); + EmbeddedSignalling[(2*i)+1] = (1 & dibit); // bit 0 + } //Used for ProcessVoiceBurstSync @@ -168,6 +193,7 @@ void dmrBS (dsd_opts * opts, dsd_state * state) state->TS2SuperFrame.TimeSlotRawVoiceFrame[vc2-1].Sync[i*2] = (1 & (dibit >> 1)); // bit 1 state->TS2SuperFrame.TimeSlotRawVoiceFrame[vc2-1].Sync[i*2+1] = (1 & dibit); // bit 0 } + } sync[24] = 0; @@ -194,9 +220,20 @@ void dmrBS (dsd_opts * opts, dsd_state * state) state->LCSS = (unsigned int)((EmbeddedSignalling[5] << 1) + EmbeddedSignalling[6]); state->LCSS_ok = EmbeddedSignallingOk; - } - else skipcount++; + for (i = 0; i < 8; i++) + { + //fprintf (stderr, " %b", EmbeddedSignalling[i]); + } + } + //else skipcount++; + else + { + for (i = 0; i < 8; i++) + { + //fprintf (stderr, " %b", EmbeddedSignalling[i]); + } + } //Continue Second AMBE Frame, 18 after Sync or EmbeddedSignalling for(i = 0; i < 18; i++) { @@ -248,15 +285,27 @@ void dmrBS (dsd_opts * opts, dsd_state * state) if (internalslot == 0) { vc1 = 1; - state->dropL = 256; } if (internalslot == 1) { vc2 = 1; - state->dropR = 256; } } + // if( strcmp (sync, DMR_DIRECT_MODE_TS1_DATA_SYNC) == 0) + // { + // fprintf (stderr,"%s ", getTime()); + // fprintf (stderr, " Sync: DMR TDMA Direct Mode TS 1 \n"); + // goto SKIP; + // } + // + // if( strcmp (sync, DMR_DIRECT_MODE_TS2_DATA_SYNC) == 0) + // { + // fprintf (stderr,"%s ", getTime()); + // fprintf (stderr, " Sync: DMR TDMA Direct Mode TS 2 \n"); + // goto SKIP; + // } + //check for sync pattern here after collected the rest of the payload, decide what to do with it if ( strcmp (sync, DMR_BS_DATA_SYNC) == 0 ) { @@ -273,7 +322,7 @@ void dmrBS (dsd_opts * opts, dsd_state * state) else fprintf (stderr,"Sync: -DMR "); //constantly reset the vc counter to 1 each data frame in anticipation of new voice frame vc1 = 1; - //state->dropL = 256; + } if (internalslot == 1) { @@ -287,7 +336,7 @@ void dmrBS (dsd_opts * opts, dsd_state * state) else fprintf (stderr,"Sync: -DMR "); //constantly reset the vc counter to 1 each data frame in anticipation of new voice frame vc2 = 1; - //state->dropR = 256; + } processDMRdata (opts, state); skipcount++; //after 2 data frames, drop back to getFrameSync and process subsequent data with processDMRdata @@ -304,6 +353,7 @@ void dmrBS (dsd_opts * opts, dsd_state * state) //only play voice on no data sync if (strcmp (sync, DMR_BS_DATA_SYNC) != 0) { + if (EmbeddedSignallingOk == 0) { //goto END; @@ -314,7 +364,7 @@ void dmrBS (dsd_opts * opts, dsd_state * state) if (internalslot == 0) { state->dmrburstL = 16; //use 16 for Voice? - //fprintf (stderr,"Sync: +DMR [slot1] slot2 | Color Code=%02d | DMRSTEREO | VC%d \n", state->dmr_color_code, vc1); + if (opts->inverted_dmr == 0) { fprintf (stderr,"Sync: +DMR [SLOT1] slot2 | | DMRSTEREO | VC%d ",vc1); @@ -324,11 +374,6 @@ void dmrBS (dsd_opts * opts, dsd_state * state) fprintf(stderr, " BPK %lld", state->K); fprintf (stderr, "%s", KNRM); } - //the condition below should be swapped to vc6 and not on vc1, placement after processMbeFrame - if (vc1 == 1 && state->payload_algid != 0 && opts->payload == 1) - { - //LFSR(state); //placement here causes issues when second slot becomes active as well - } fprintf (stderr, "\n"); } else @@ -340,11 +385,6 @@ void dmrBS (dsd_opts * opts, dsd_state * state) fprintf(stderr, " BPK %lld", state->K); fprintf (stderr, "%s", KNRM); } - //the condition below should be swapped to vc6 and not on vc1, placement after processMbeFrame - if (vc1 == 1 && state->payload_algid != 0 && opts->payload == 1) - { - //LFSR(state); //placement here causes issues when second slot becomes active as well - } fprintf (stderr, "\n"); } } @@ -361,11 +401,6 @@ void dmrBS (dsd_opts * opts, dsd_state * state) fprintf(stderr, " BPK %lld", state->K); fprintf (stderr, "%s", KNRM); } - //the condition below should be swapped to vc6 and not on vc1, placement after processMbeFrame - if (vc2 == 1 && state->payload_algidR != 0 && opts->payload == 1) - { - //LFSR(state); - } fprintf (stderr, "\n"); } else @@ -377,11 +412,6 @@ void dmrBS (dsd_opts * opts, dsd_state * state) fprintf(stderr, " BPK %lld", state->K); fprintf (stderr, "%s", KNRM); } - //the condition below should be swapped to vc6 and not on vc1, placement after processMbeFrame - if (vc2 == 1 && state->payload_algidR != 0 && opts->payload == 1) - { - //LFSR(state); - } fprintf (stderr, "\n"); } } @@ -403,29 +433,31 @@ void dmrBS (dsd_opts * opts, dsd_state * state) processMbeFrame (opts, state, NULL, ambe_fr2, NULL); processMbeFrame (opts, state, NULL, ambe_fr3, NULL); - //We only want to run LFSR after processing VC6 frames and before rolling - //back to VC1, otherwise we will incur an unwanted LFSR if voice becomes active - //in both slots while in this loop if (internalslot == 0 && vc1 == 6) { - state->dropL = 256; - if (state->payload_algid != 0 ) //&& opts->payload == 1 + + if (state->payload_algid >= 0x21) { - LFSR(state); + //running this as state->payload_mi > 0 apparently causes some problem, don't know why + if (state->payload_mi != 0 && state->payload_algid >= 0x21) + { + LFSR(state); + } fprintf (stderr, "\n"); } - } if (internalslot == 1 && vc2 == 6) { - state->dropR = 256; - if (state->payload_algidR != 0 ) //&& opts->payload == 1 + + if (state->payload_algidR >= 0x21) { - LFSR(state); + if (state->payload_miR != 0 && state->payload_algidR == 0x21) + { + LFSR(state); //re-enable this one after testing Late Entry MI + } fprintf (stderr, "\n"); } - } if (internalslot == 0) @@ -436,6 +468,7 @@ void dmrBS (dsd_opts * opts, dsd_state * state) { vc2++; } + } // recalibrate center/umid/lmid, not sure this helps or does anything particularly in this case @@ -677,10 +710,6 @@ void dmrBSBootstrap (dsd_opts * opts, dsd_state * state) fprintf (stderr, "\n"); } - //these ambe_fr values are set correctly now! - //reset drop values since we don't know which slot (because I'm too lazy to write that part) - state->dropL = 256; - state->dropR = 256; processMbeFrame (opts, state, NULL, ambe_fr, NULL); processMbeFrame (opts, state, NULL, ambe_fr2, NULL); processMbeFrame (opts, state, NULL, ambe_fr3, NULL); diff --git a/src/dmr_data.c b/src/dmr_data.c index f8429c1..9e98f27 100644 --- a/src/dmr_data.c +++ b/src/dmr_data.c @@ -25,14 +25,17 @@ processDMRdata (dsd_opts * opts, dsd_state * state) int *dibit_p; char sync[25]; char syncdata[48]; - char cachdata[13] = {0}; + char cachdata[25] = {0}; //increased from 24 to 25 to see if this fixes ubuntu 32 bug char cc[5] = {0}; char ccAscii[5] = {0}; char bursttype[5]; unsigned int burst; char info[196]; - char SlotType[20]; + // char SlotType[20]; //was char, but I don't think FEC brings back good values when usign that + unsigned char SlotType[20]; //was char, but I don't think FEC brings back good values when usign that unsigned int SlotTypeOk; + int cachInterleave[24] = {0, 7, 8, 9, 1, 10, 11, 12, 2, 13, 14, 15, 3, 16, 4, 17, 18, 19, 5, 20, 21, 22, 6, 23}; + /* Remove warning compiler */ //UNUSED_VARIABLE(cachdata[0]); @@ -57,7 +60,7 @@ processDMRdata (dsd_opts * opts, dsd_state * state) dibit_p = state->dmr_payload_p - 90; } - // CACH + // CACH, why aren't we running any FEC on this? for (i = 0; i < 12; i++) { dibit = *dibit_p; @@ -71,31 +74,72 @@ processDMRdata (dsd_opts * opts, dsd_state * state) dibit = (int)state->dmr_stereo_payload[i]; } //fprintf(stderr, "%X", dibit); - cachdata[i] = dibit; + //cachdata[i] = dibit; + + cachdata[cachInterleave[(i*2)]] = (1 & (dibit >> 1)); // bit 1 + cachdata[cachInterleave[(i*2)+1]] = (1 & dibit); // bit 0 + // cachdata[(i*2)] = (1 & (dibit >> 1)); // bit 1 + // cachdata[(i*2)+1] = (1 & dibit); // bit 0 + if (i == 2) { /* Change the current slot only if we are in relayed mode (not in direct mode) */ - if(state->directmode == 0) state->currentslot = (1 & (dibit >> 1)); // bit 1 - - if (state->currentslot == 0 && state->dmr_ms_mode == 0) - { - state->slot1light[0] = '['; - state->slot1light[6] = ']'; - state->slot2light[0] = ' '; - state->slot2light[6] = ' '; - } - //else - if (state->currentslot == 1 && state->dmr_ms_mode == 0) - { - state->slot2light[0] = '['; - state->slot2light[6] = ']'; - state->slot1light[0] = ' '; - state->slot1light[6] = ' '; - } + // if(state->directmode == 0) state->currentslot = (1 & (dibit >> 1)); //move this until after cach fec performed + // + // if (state->currentslot == 0 && state->dmr_ms_mode == 0) + // { + // state->slot1light[0] = '['; + // state->slot1light[6] = ']'; + // state->slot2light[0] = ' '; + // state->slot2light[6] = ' '; + // } + // //else + // if (state->currentslot == 1 && state->dmr_ms_mode == 0) + // { + // state->slot2light[0] = '['; + // state->slot2light[6] = ']'; + // state->slot1light[0] = ' '; + // state->slot1light[6] = ' '; + // } } } - cachdata[12] = 0; + //cachdata[12] = 0; + cachdata[25] = 0; //setting to see if this fixes ubuntu 32 bit bug + //decode and correct cach and compare + int cach_okay = 69; + if ( Hamming_7_4_decode (cachdata) ) //is now de-interleaved appropriately + { + cach_okay = 1; + } + if (cach_okay == 1) + { + //fprintf (stderr, "CACH Okay "); + } + if (cach_okay != 1) + { + //fprintf (stderr, "CACH FEC Error %d", cach_okay); + goto END; + } + + state->currentslot = cachdata[1]; //still bit 2, or somewhere else? is it 8? 1? TC? + + if (state->currentslot == 0 && state->dmr_ms_mode == 0) + { + state->slot1light[0] = '['; + state->slot1light[6] = ']'; + state->slot2light[0] = ' '; + state->slot2light[6] = ' '; + } + //else + if (state->currentslot == 1 && state->dmr_ms_mode == 0) + { + state->slot2light[0] = '['; + state->slot2light[6] = ']'; + state->slot1light[0] = ' '; + state->slot1light[6] = ' '; + } + //end correct cach and set slot #ifdef DMR_DUMP k = 0; @@ -232,7 +276,7 @@ processDMRdata (dsd_opts * opts, dsd_state * state) syncdata[(2*i)+1] = (1 & dibit); // bit 0 sync[i] = (dibit | 1) + 48; } - sync[24] = 0; + sync[24] = 0; //why? #ifdef DMR_DUMP k = 0; @@ -296,8 +340,18 @@ processDMRdata (dsd_opts * opts, dsd_state * state) } /* Check and correct the SlotType (apply Golay(20,8) FEC check) */ - if(Golay_20_8_decode((unsigned char *)SlotType)) SlotTypeOk = 1; - else SlotTypeOk = 0; + //pretty sure this isn't working correcty, does not apply corrected bits, due to cast type mismatching + // if(Golay_20_8_decode((unsigned char *)SlotType)) SlotTypeOk = 1; + if( Golay_20_8_decode(SlotType) ) + { + SlotTypeOk = 1; + //fprintf (stderr, "Slot Okay "); + } + else + { + SlotTypeOk = 0; + goto END; + } /* Slot Type parity checked => Fill the color code */ //state->color_code = (unsigned int)((cc[0] << 3) + (cc[1] << 2) + (cc[2] << 1) + cc[3]); @@ -536,5 +590,13 @@ processDMRdata (dsd_opts * opts, dsd_state * state) { fprintf(stderr, "\n"); } - //JUMP: + END: + if (SlotTypeOk == 0 || cach_okay == 0) + { + fprintf (stderr, "%s", KRED); + fprintf (stderr, " **CACH or Burst Type FEC ERR - SKIPPING** "); + fprintf (stderr, "%s", KNRM); + fprintf (stderr, "\n"); + } + } /* End processDMRdata() */ diff --git a/src/dmr_ms.c b/src/dmr_ms.c index bdb5609..10e93c8 100644 --- a/src/dmr_ms.c +++ b/src/dmr_ms.c @@ -33,6 +33,7 @@ void dmrMS (dsd_opts * opts, dsd_state * state) char redundancyB[36]; unsigned short int vc1; unsigned short int vc2; + //add time to mirror printFrameSync time_t now; char * getTime(void) //get pretty hh:mm:ss timestamp @@ -60,12 +61,15 @@ void dmrMS (dsd_opts * opts, dsd_state * state) short int skipcount = 0; //Hardset variables for MS - state->currentslot = 0; + state->currentslot = 0; //0 internalslot = 0; activeslot = 0; //Run Loop while the getting is good while (loop == 1) { + + short int m = 0; + state->dmrburstL = 16; //Use 16 for Voice? // No CACH in MS Mode? for(i = 0; i < 12; i++) @@ -258,17 +262,9 @@ void dmrMS (dsd_opts * opts, dsd_state * state) y++; z++; - //end early to allow next sync without skipping a voice superframe - //only use if only doing 6 VC and nothing else, otherwise, will lose sync - if (vc1 == 6 && i == 30) - { - //i = 36; - } } - //if ( (strcmp (sync, DMR_MS_VOICE_SYNC) == 0) ) - //fixed to compensate for inverted signal if ( ((strcmp (sync, DMR_MS_VOICE_SYNC) == 0) && opts->inverted_dmr == 0) || ((strcmp (sync, DMR_MS_DATA_SYNC) == 0) && opts->inverted_dmr == 1) ) @@ -276,29 +272,18 @@ void dmrMS (dsd_opts * opts, dsd_state * state) if (internalslot == 0) { vc1 = 1; - state->dropL = 256; fprintf (stderr, "MS Slot 1 Voice Sync \n"); - //activeslot = 0; - } + if (internalslot == 1) { vc2 = 1; - state->dropR = 256; - //fprintf (stderr, "MS Slot 2 Voice Sync \n"); - //activeslot = 1; } + state->dmr_ms_mode = 1; //set to 1 here?? } state->dmr_ms_mode = 1; //set to 1 here? - //testing to see if we need to do something to get MS mode working properly, - //get proper sync, skip frames, etc. - if (state->dmr_ms_mode == 1 ) //&& vc1 < 7 - { - //do something - //fprintf (stderr, "MS MODE "); - } //don't know if we will catch an RC sync in here or not, should be on VC6 if it occurs if ( (strcmp (rcsync, DMR_RC_DATA_SYNC) == 0) || (strcmp (sync, DMR_RC_DATA_SYNC) == 0) ) //should be in same position as sync @@ -370,9 +355,6 @@ void dmrMS (dsd_opts * opts, dsd_state * state) goto END; } - //if( (strcmp (sync, DMR_MS_DATA_SYNC) != 0) && internalslot == activeslot && vc1 < 7) - //only play voice no MS Data Sync and vc1 below 6 (no voice resync) - //fixed to compensate for inverted signal if( ( ( ((strcmp (sync, DMR_MS_DATA_SYNC) != 0) && opts->inverted_dmr == 0) || ((strcmp (sync, DMR_MS_VOICE_SYNC) != 0) && opts->inverted_dmr == 1) ) ) && internalslot == activeslot && vc1 < 7) @@ -390,10 +372,6 @@ void dmrMS (dsd_opts * opts, dsd_state * state) fprintf(stderr, " BPK %lld", state->K); fprintf (stderr, "%s", KNRM); } - if (vc1 == 6 && state->payload_algid != 0 && opts->payload == 1) - { - LFSR(state); - } fprintf (stderr, "\n"); } @@ -406,67 +384,32 @@ void dmrMS (dsd_opts * opts, dsd_state * state) fprintf(stderr, " BPK %lld", state->K); fprintf (stderr, "%s", KNRM); } - if (vc1 == 6 && state->payload_algid != 0 && opts->payload == 1) - { - LFSR(state); - } fprintf (stderr, "\n"); } - if (internalslot == 1 && opts->inverted_dmr == 0) - { - fprintf (stderr,"Sync: +DMR MS MODE | Color Code=%02d | DMRSTEREO | VC%d ", state->color_code, vc2); - if (state->K > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0) - { - fprintf (stderr, "%s", KYEL); - fprintf(stderr, " BPK %lld", state->K); - fprintf (stderr, "%s", KNRM); - } - if (vc2 == 6 && state->payload_algidR != 0 && opts->payload == 1) - { - LFSR(state); - } - fprintf (stderr, "\n"); - } - if (internalslot == 1 && opts->inverted_dmr == 1) - { - fprintf (stderr,"Sync: -DMR MS MODE | Color Code=%02d | DMRSTEREO | VC%d ", state->color_code, vc2); - if (state->K > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0) - { - fprintf (stderr, "%s", KYEL); - fprintf(stderr, " BPK %lld", state->K); - fprintf (stderr, "%s", KNRM); - } - if (vc2 == 6 && state->payload_algidR != 0 && opts->payload == 1) - { - LFSR(state); - } - fprintf (stderr, "\n"); - } + if (internalslot == 0 && vc1 == 6) //presumably when full (and no sync issues) { //process voice burst ProcessVoiceBurstSync(opts, state); fprintf (stderr, "\n"); } - if (internalslot == 1 && vc2 == 6) //presumably when full (and no sync issues) - { - //process voice burst - //ProcessVoiceBurstSync(opts, state); - //fprintf (stderr, "\n"); - } + state->dmr_ms_mode == 1; processMbeFrame (opts, state, NULL, ambe_fr, NULL); processMbeFrame (opts, state, NULL, ambe_fr2, NULL); processMbeFrame (opts, state, NULL, ambe_fr3, NULL); - if (internalslot == 0) + + //need to seperate the algs here so we don't run LFSR on 22 and so on + if (vc1 == 6 && state->payload_algid >= 21) { - //vc1++; - } - if (internalslot == 1) - { - vc2++; - } + //state->currentslot = 0; + if (state->payload_mi != 0 && state->payload_algid >= 0x21) + { + LFSR(state); + } + fprintf (stderr, "\n"); + } } vc1++; //6 seems optimal for MS, allows to quickly exit and resync if wonky or something @@ -692,13 +635,13 @@ void dmrMSBootstrap (dsd_opts * opts, dsd_state * state) } fprintf (stderr, "\n"); } - //reset drop values since we don't know which slot (because I'm too lazy to write that part) - state->dropL = 256; - state->dropR = 256; + state->dmr_ms_mode = 1; + processMbeFrame (opts, state, NULL, ambe_fr, NULL); processMbeFrame (opts, state, NULL, ambe_fr2, NULL); processMbeFrame (opts, state, NULL, ambe_fr3, NULL); + skipDibit (opts, state, 144); //skip to next TDMA slot dmrMS (opts, state); //bootstrap into full TDMA frame @@ -706,11 +649,17 @@ void dmrMSBootstrap (dsd_opts * opts, dsd_state * state) void dmrMSData (dsd_opts * opts, dsd_state * state) { - int i; + int i, b, c; int dibit; int *dibit_p; unsigned int burst; + unsigned char MSCach[24] = {0}; //12 dibits = 24 bits + unsigned char MSSync[48] = {0}; //24 dibits = 48 bits + unsigned char MSSlot[20] = {0}; //10 dibits = 20 bits + unsigned char MSBurst[5] = {0}; + int cachInterleave[24] = {0, 7, 8, 9, 1, 10, 11, 12, 2, 13, 14, 15, 3, 16, 4, 17, 18, 19, 5, 20, 21, 22, 6, 23}; + //int cachInterleave[24] = {0,} //add time to mirror sync time_t now; char * getTime(void) //get pretty hh:mm:ss timestamp @@ -727,7 +676,8 @@ void dmrMSData (dsd_opts * opts, dsd_state * state) return curr; } - + b = 0; + c = 0; //CACH + First Half Payload + Sync = 12 + 54 + 24 //dibit_p = state->dibit_buf_p - 90; dibit_p = state->dmr_payload_p - 90; @@ -740,14 +690,42 @@ void dmrMSData (dsd_opts * opts, dsd_state * state) dibit = (dibit ^ 2); } state->dmr_stereo_payload[i] = dibit; + //load cach + if (i < 12) + { + MSCach[cachInterleave[(i*2)]] = (1 & (dibit >> 1)); // bit 1 + MSCach[cachInterleave[(i*2)+1]] = (1 & dibit); // bit 0 + } + //load slot, first half + if (i > 60 && i < 66) + { + MSSlot[(b*2)] = (1 & (dibit >> 1)); // bit 1 + MSSlot[(b*2)+1] = (1 & dibit); // bit + b++; + } + //load sync + if (i > 66) + { + MSSync[(c*2)] = (1 & (dibit >> 1)); // bit 1 + MSSync[(c*2)+1] = (1 & dibit); // bit 0 + c++; + } } for (i = 0; i < 54; i++) { dibit = getDibit(opts, state); state->dmr_stereo_payload[i+90] = dibit; + //load slot, second half + if (i < 6) + { + MSSlot[(b*2)] = (1 & (dibit >> 1)); // bit 1 + MSSlot[(b*2)+1] = (1 & dibit); // bit + b++; + } } + //hide behind payload due to errs in data in MS mode if (opts->payload == 1) { @@ -775,9 +753,6 @@ void dmrMSData (dsd_opts * opts, dsd_state * state) state->dmr_stereo = 0; state->dmr_ms_mode = 0; - //reset drop values since we don't know which slot (because I'm too lazy to write that part) - state->dropL = 256; - state->dropR = 256; //get potential first half payload dibits and store them in the payload for the next repitition, MS voice or data. skipDibit (opts, state, 144); diff --git a/src/dmr_process_voice.c b/src/dmr_process_voice.c index 909f11d..a6ed0f8 100644 --- a/src/dmr_process_voice.c +++ b/src/dmr_process_voice.c @@ -19,10 +19,6 @@ #include "dmr_const.h" #include "p25p1_check_hdu.h" -// -//A -// - void ProcessDMR (dsd_opts * opts, dsd_state * state) { uint32_t i, j; @@ -40,7 +36,6 @@ void ProcessDMR (dsd_opts * opts, dsd_state * state) TSVoiceSupFrameL = &state->TS1SuperFrame; TSVoiceSupFrameR = &state->TS2SuperFrame; -// int BP[256] = { 0x0000, 0x1F00, 0xE300, 0xFC00, 0x2503, 0x3A03, 0xC603, 0xD903, 0x4A05, 0x5505, 0xA905, 0xB605, 0x6F06, 0x7006, 0x8C06, 0x9306, @@ -75,9 +70,8 @@ int BP[256] = { 0x0BF0, 0x14F0, 0xE8F0, 0xF7F0, 0x2EF3, 0x31F3, 0xCDF3, 0xD2F3, 0x41F5, 0x5EF5, 0xA2F5, 0xBDF5, 0x64F6, 0x7BF6, 0x87F6, 0x98F6 //255 }; -// -//H -// + + if (state->currentslot == 0 && state->K > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0) { fprintf (stderr, "%s", KYEL); @@ -85,12 +79,12 @@ if (state->currentslot == 0 && state->K > 0 && state->dmr_so & 0x40 && state->pa fprintf (stderr, "%s", KNRM); k = BP[state->K]; k = ( ((k & 0xFF0F) << 32 ) + (k << 16) + k ); - + for(Frame = 0; Frame < 6; Frame++) { for(i = 0; i < 3; i++) { - for(j = 0; j < 49; j++) + for(j = 0; j < 48; j++) { x = ( ((k << j) & 0x800000000000) >> 47 ); TSVoiceSupFrameL->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i][j] ^= x; @@ -111,7 +105,7 @@ if (state->currentslot == 1 && state->K > 0 && state->dmr_soR & 0x40 && state->p { for(i = 0; i < 3; i++) { - for(j = 0; j < 49; j++) + for(j = 0; j < 48; j++) { x = ( ((k << j) & 0x800000000000) >> 47 ); TSVoiceSupFrameR->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i][j] ^= x; @@ -119,15 +113,10 @@ if (state->currentslot == 1 && state->K > 0 && state->dmr_soR & 0x40 && state->p } } } -// -//B -// + if (state->currentslot == 0) { - if (opts->payload == 1 && state->R == 0) - { - fprintf(stderr, "\n"); //line break for AMBE printer - } + for(Frame = 0; Frame < 6; Frame++) //6 { /* 1 DMR frame contains 3 AMBE voice samples */ @@ -172,10 +161,7 @@ if (state->currentslot == 0) if (state->currentslot == 1) { - if (opts->payload == 1) - { - fprintf(stderr, "\n"); //line break for AMBE printer - } + for(Frame = 0; Frame < 6; Frame++) { /* 1 DMR frame contains 3 AMBE voice samples */ diff --git a/src/dmr_sync.c b/src/dmr_sync.c index 7a85988..662eb26 100644 --- a/src/dmr_sync.c +++ b/src/dmr_sync.c @@ -17,10 +17,35 @@ #include "dsd.h" -//#define PRINT_PI_HEADER_BYTES -//#define PRINT_VOICE_LC_HEADER_BYTES -//#define PRINT_TERMINAISON_LC_BYTES -//#define PRINT_VOICE_BURST_BYTES + +//time_t now; +char * getTimeL(void) //get pretty hh:mm:ss timestamp +{ + time_t t = time(NULL); + + char * curr; + char * stamp = asctime(localtime( & t)); + + curr = strtok(stamp, " "); + curr = strtok(NULL, " "); + curr = strtok(NULL, " "); + curr = strtok(NULL, " "); + + return curr; +} + +//getDate has a bug that affects writing to file using fopen 32-bit Ubuntu OS, need to look into +char * getDateL(void) { + char datename[99]; //increased to 99 to fix 32-bit Ubuntu when fopen file printing to lrrp.txt + char * curr2; + struct tm * to; + time_t t; + t = time(NULL); + to = localtime( & t); + strftime(datename, sizeof(datename), "%Y/%m/%d", to); + curr2 = strtok(datename, " "); + return curr2; +} //Need to work in a way to seperate data bursts on seperate slots, having data pouring into both slots simultaneously //Need to make seperate superframe arrays for each @@ -88,25 +113,7 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] unsigned char TrellisReturn[18]; //CDMRTrellisDecode(tdibits, TrellisReturn); //figure out how this works!! CDMRTrellisDecode(tdibits_reverse, TrellisReturn); //NEEDS REVERSE DIBITS! - if (opts->payload == 1) - { - fprintf (stderr,"%s", KCYN); - fprintf (stderr, "\nFull 3/4 Rate Trellis Payload\n "); - for (i = 0; i < 18; i++) - { - fprintf (stderr, "[%02X]", TrellisReturn[i]); - } - fprintf (stderr, "\n Hex to Ascii - "); - for (i = 0; i < 18; i++) - { - if (TrellisReturn[i] <= 0x7E && TrellisReturn[i] >=0x20) - { - fprintf (stderr, "%c", TrellisReturn[i]); - } - else fprintf (stderr, "."); - } - fprintf (stderr,"%s", KNRM); //change back to normal - } + /* Extract the BPTC 196,96 DMR data */ //IrrecoverableErrors = BPTC_196x96_Extract_Data(DeInteleavedData, DmrDataBit, R); // @@ -142,12 +149,21 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] } */ /* Convert the 96 bit of voice LC Header data into 12 bytes */ - k = 0; + + //define our block and padding values + uint8_t blocks = state->data_header_blocks[slot] - 1; //subtract 1 for the relevant value in the calc below + uint8_t padding = state->data_header_padding[slot]; + + //shift data in the superframe up a block + k = 0; //is this still used? for(i = 0; i < 16; i++) //16, or 18? seems to have two extra bytes in front currently { - state->dmr_34_rate_sf[slot][i] = state->dmr_34_rate_sf[slot][i+16]; //shift middle to left 12 to load up new round - state->dmr_34_rate_sf[slot][i+16] = state->dmr_34_rate_sf[slot][i+32]; //shift far right middle to left middle 12, going four frames deep; + state->dmr_34_rate_sf[slot][i] = state->dmr_34_rate_sf[slot][i+16]; + state->dmr_34_rate_sf[slot][i+16] = state->dmr_34_rate_sf[slot][i+32]; state->dmr_34_rate_sf[slot][i+32] = state->dmr_34_rate_sf[slot][i+48]; + state->dmr_34_rate_sf[slot][i+48] = state->dmr_34_rate_sf[slot][i+64]; + state->dmr_34_rate_sf[slot][i+64] = state->dmr_34_rate_sf[slot][i+80]; + DmrDataByte[i] = 0; for(j = 0; j < 8; j++) { @@ -156,95 +172,70 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] DmrDataByte[i] = DmrDataByte[i] | (DmrDataBit[k] & 0x01); k++; } - //state->dmr_34_rate_sf[i+36] = ~DmrDataByte[i]; //copy byte to right hand side of shift frame - //state->dmr_34_rate_sf[i+36] = ~TrellisReturn[i]& 0xFF; - state->dmr_34_rate_sf[slot][i+48] = TrellisReturn[i+2]; //plus two to skip the first two bytes - } - if (opts->payload == 2) - { - fprintf (stderr, "%s",KGRN); - fprintf (stderr, "\n Rate 3/4 Superframe - Slot [%d]\n ",slot+1); - for (i = 0; i < (16*4); i++) - { - fprintf (stderr, "[%02X]", state->dmr_34_rate_sf[slot][i]); - if (i == 15 || i == 31 || i == 47) - { - fprintf (stderr, "\n "); //line break and two spaces after each 16 bytes - } - } - fprintf (stderr, "%s ", KNRM); - } - //fprintf (stderr, "%s ", KNRM); - /* Fill the CRC extracted (before Reed-Solomon (12,9) FEC correction) */ - CRCExtracted = 0; - //for(i = 0; i < 24; i++) - for(i = 0; i < 16; i++) - { - //CRCExtracted = CRCExtracted << 1; - //CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 72] & 1); - //CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); //80-96 for PI header + + //state->dmr_34_rate_sf[slot][i+48] = TrellisReturn[i+2]; //plus two to skip the first two bytes + state->dmr_34_rate_sf[slot][i+(blocks*16)] = TrellisReturn[i+2]; //plus two to skip the first two bytes } - //Look into whether or not we need to run these CRC checks for this header information - //and see if its applied the same or differently - /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ - //CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? - //CRCExtracted = CRCExtracted ^ 0x6969; - - /* Check/correct the full link control data and compute the Reed-Solomon (12,9) CRC */ - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x969696); - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x6969); - - // - /* Convert corrected 12 bytes into 96 bits */ - - - //Headers and Addresses - - /* - if ( (state->dmr_34_rate_sf[0] & 0x3F) == 0x05) //0x3F?? or == 0x05 - { - fprintf (stderr, "\n IP4 Header"); - } - - if ( (state->dmr_34_rate_sf[0] & 0x3F) == 0x0C) - { - fprintf (stderr, "\n Source: "); - 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, " %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]); - } - */ - //temp hide behind payload until working better - if (opts->payload == 1) - { + //Start Polling the 3/4 Rate Super Frame for Data when byte 0 contains values //LRRP + int message_legnth = 0; if ( (state->dmr_34_rate_sf[slot][0] & 0x7F) == 0x45) //Start LRRP now { - //sprintf ( state->dmr_lrrp[state->currentslot][0], "LRRP - "); - fprintf (stderr, "%s ", KMAG); - //fprintf (stderr, "\n IP4 Header"); //Not sure this is accurate info IP4 Header? - //fprintf (stderr, "\n Data Blocks [%d]", state->dmr_34_rate_sf[5]); - for (short i = 1; i < 60; i++) //find way to get padding so we only go as deep as we need to! changed from 64 to 60 to skip the CRC Bytes for confirmed data + //test opening a file with fopen and dumping the LRRP data into it. + //just going to use the same code from EDACS-FM + + //find user home directory and append directory and filename. + FILE * pFile; //put this outside of the if statement? + if (opts->lrrp_file_output == 1) { - /* + char * filename = "/lrrp.txt"; + char * home_dir = getenv("HOME"); + char * filepath = malloc(strlen(home_dir) + strlen(filename) + 1); + strncpy (filepath, home_dir, strlen(home_dir) + 1); + strncat (filepath, filename, strlen(filename) + 1); + //end find user home directory and append directory and filename + + pFile = fopen (filepath, "a"); + + //hard code filename override for those wanting to use other software + //pFile = fopen("DSDPlus.LRRP", "a"); + + + fprintf (pFile, "%s\t %s\t", getDateL(), getTimeL()); //current timestamp, may find a way to only add this IF no included timestamp in LRRP data? + fprintf (pFile, "%08lld\t", state->dmr_lrrp_source[state->currentslot]); //source address from data header + } + + + fprintf (stderr, "%s ", KMAG); + + //go to number of octets minus padding and crc, confirmed data may need a second rule to skip Serial Numbers and Block CRCs + //for (short i = 12; i < ( ((blocks+1)*12) - (padding+4) ); i++) + for (short i = 12; i < ( ((blocks+1)*16) - (padding+4) ); i++) + { + if ( state->dmr_34_rate_sf[slot][i] == 0x0C) //Source and Destination info { - fprintf (stderr, "\n Source:"); + fprintf (stderr, "\n Source: "); fprintf (stderr, " %03d.%03d.%03d.%03d", (state->dmr_34_rate_sf[slot][i+0] & 0x3F), state->dmr_34_rate_sf[slot][i+1], state->dmr_34_rate_sf[slot][i+2], state->dmr_34_rate_sf[slot][i+3]); //strip first two bits off 1st byte fprintf (stderr, " [%08d]", (state->dmr_34_rate_sf[slot][i+1] <<16 ) + (state->dmr_34_rate_sf[slot][i+2] << 8) + state->dmr_34_rate_sf[slot][i+3] ); - fprintf (stderr, " - Port %05d", (state->dmr_34_rate_sf[slot][i+8] << 8) + state->dmr_34_rate_sf[slot][i+9]); - fprintf (stderr, "\n Destination:"); + fprintf (stderr, " - Port %05d ", (state->dmr_34_rate_sf[slot][i+8] << 8) + state->dmr_34_rate_sf[slot][i+9]); + fprintf (stderr, "\n Destination: "); fprintf (stderr, " %03d.%03d.%03d.%03d", (state->dmr_34_rate_sf[slot][i+4] & 0x3F), state->dmr_34_rate_sf[slot][i+5], state->dmr_34_rate_sf[slot][6], state->dmr_34_rate_sf[slot][i+7]); //strip first two bits off 4th byte?? fprintf (stderr, " [%08d]", (state->dmr_34_rate_sf[slot][i+5] <<16 ) + (state->dmr_34_rate_sf[slot][i+6] << 8) + state->dmr_34_rate_sf[slot][i+7] ); fprintf (stderr, " - Port %05d", (state->dmr_34_rate_sf[slot][i+10] << 8) + state->dmr_34_rate_sf[slot][i+11]); + + i = i + 12; //skip 12 bytes here so we don't accidentally trip another flag with data in these bytes } - */ - if ( state->dmr_34_rate_sf[slot][i] == 0x34 ) //timestamp + + if (state->dmr_34_rate_sf[slot][i] == 0x0D) //This should lock on to the second 0x0D value hopefully and tell us the message legnth + { + message_legnth = state->dmr_34_rate_sf[slot][i+1]; + fprintf (stderr, "\n Message Legnth: %02d", message_legnth); + i = i + 2; //skip 2 bytes here so we don't accidentally trip another flag with data in these bytes + } + + if ( state->dmr_34_rate_sf[slot][i] == 0x34 && message_legnth > 27 ) //timestamp, seems to need legnth of 28 { fprintf (stderr, "\n LRRP - Timestamp: "); fprintf (stderr, "%4d.", (state->dmr_34_rate_sf[slot][i+1] << 6) + (state->dmr_34_rate_sf[slot][i+2] >> 2) ); //4 digit year @@ -252,15 +243,22 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] fprintf (stderr, "%02d", ( (state->dmr_34_rate_sf[slot][i+3] & 0x30) >> 1) + ((state->dmr_34_rate_sf[slot][i+3] & 0x0E) >> 1) ); //2 digit day fprintf (stderr, " %02d:",( (state->dmr_34_rate_sf[slot][i+3] & 0x01) << 4) + ((state->dmr_34_rate_sf[slot][i+4] & 0xF0) >> 4) ); //2 digit hour fprintf (stderr, "%02d:",( (state->dmr_34_rate_sf[slot][i+4] & 0x0F) << 2) + ((state->dmr_34_rate_sf[slot][i+5] & 0xC0) >> 6) ); //2 digit minute - fprintf (stderr, "%02d", ( (state->dmr_34_rate_sf[slot][i+5] & 0x3F) << 0) ); //2 digit second + fprintf (stderr, "%02d", ( (state->dmr_34_rate_sf[slot][i+5] & 0x3F) << 0) ); //2 digit second + + i = i + 6; //skip 6 bytes here so we don't accidentally trip another flag with data in these bytes } - if ( state->dmr_34_rate_sf[slot][i] == 0x51 ) //lattitude and longitude + + if ( state->dmr_34_rate_sf[slot][i] == 0x51 && message_legnth > 13) //lattitude and longitude, message_lenght > 13? { fprintf (stderr, "\n LRRP -"); fprintf (stderr, " Lat: "); if (state->dmr_34_rate_sf[slot][i+1] & 0x80) //first bit indicates a sign, or hemisphere? { fprintf (stderr, "-"); + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "-"); + } } long int lrrplat; long int lrrplon; @@ -269,63 +267,113 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] lrrplat = ( ( ((state->dmr_34_rate_sf[slot][i+1] & 0x7F ) << 24 ) + (state->dmr_34_rate_sf[slot][i+2] << 16) + (state->dmr_34_rate_sf[slot][i+3] << 8) + state->dmr_34_rate_sf[slot][i+4]) * 1 ); lrrplon = ( ( (state->dmr_34_rate_sf[slot][i+5] << 24 ) + (state->dmr_34_rate_sf[slot][i+6] << 16) + (state->dmr_34_rate_sf[slot][i+7] << 8) + state->dmr_34_rate_sf[slot][i+8]) * 1 ); fprintf (stderr, "%.5lf ", ((double)lrrplat) * lat_unit); + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "%.5lf\t", ((double)lrrplat) * lat_unit); + } fprintf (stderr, " Lon: "); if (state->dmr_34_rate_sf[slot][i+5] & 0x80) //first bit indicates a sign, or hemisphere? { //fprintf (stderr, "-"); } fprintf (stderr, "%.5lf", (lrrplon * lon_unit) ); + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "%.5lf\t", (lrrplon * lon_unit) ); + } if (state->dmr_34_rate_sf[slot][i+1] & 0x80) //first bit indicates a sign, or hemisphere? { sprintf ( state->dmr_lrrp[state->currentslot][3], "Lat: -%.5lf Lon: %.5lf ", ((double)lrrplat) * lat_unit , (lrrplon * lon_unit) ); } - else sprintf ( state->dmr_lrrp[state->currentslot][3], "Lat: %.5lf Lon: %.5lf ", ((double)lrrplat) * lat_unit , (lrrplon * lon_unit) ); - //print for easy copy/paste into browser? + else sprintf ( state->dmr_lrrp[state->currentslot][3], "Lat: %.5lf Lon: %.5lf ", ((double)lrrplat) * lat_unit , (lrrplon * lon_unit) ); //print for easy copy/paste into browser? //fprintf (stderr, " ("); if (state->dmr_34_rate_sf[slot][i+1] & 0x80) //first bit indicates a sign, or hemisphere? { fprintf (stderr, " (-%.5lf, %.5lf)", ((double)lrrplat) * lat_unit , (lrrplon * lon_unit) ); - //fprintf (stderr, " -"); } else fprintf (stderr, " (%.5lf, %.5lf)", ((double)lrrplat) * lat_unit , (lrrplon * lon_unit) ); + + i = i + 9 + 2; //skip 9 bytes here so we don't accidentally trip another flag with data in these bytes } - if ( state->dmr_34_rate_sf[slot][i] == 0x6C ) + if ( state->dmr_34_rate_sf[slot][i] == 0x6C && message_legnth > 13) { - //either Plus is wrong, or I'm wrong on higher velocities exceeding 0xFF. + //either Plus is wrong, or I'm wrong on higher velocities exceeding 0xFF. double check double values? //fprintf (stderr, "\n LRRP - Vi %02X Vf %02X Velocity Units (hex)", state->dmr_34_rate_sf[i+1], state->dmr_34_rate_sf[i+2]); double velocity = ( ((double)( (state->dmr_34_rate_sf[slot][i+1] ) + state->dmr_34_rate_sf[slot][i+2] )) / ( (double)128)); - //fprintf (stderr, "\n LRRP - %.4lf Meters Per Second", velocity); - fprintf (stderr, "\n LRRP - %.4lf m/s %.4lf km/h %.4lf mph", velocity, (3.6 * velocity), (2.2369 * velocity) ); + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "%.3lf\t ", (velocity * 3.6) ); + } + fprintf (stderr, "\n LRRP - Velocity: %.4lf m/s %.4lf km/h %.4lf mph", velocity, (3.6 * velocity), (2.2369 * velocity) ); sprintf ( state->dmr_lrrp[state->currentslot][4], "Vel: %.4lf kph ", (3.6 * velocity)); + + i = i + 3; //skip 3 bytes here so we don't accidentally trip another flag with data in these bytes } - if ( state->dmr_34_rate_sf[slot][i] == 0x56 ) + if ( state->dmr_34_rate_sf[slot][i] == 0x56 && message_legnth > 13) { //check for appropriate terminology here - Heading, bearing, course, or track? - fprintf (stderr, "\n LRRP - Direction %d Degrees", state->dmr_34_rate_sf[slot][i+1] * 2); + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "%d\t", state->dmr_34_rate_sf[slot][i+1] * 2); + } + fprintf (stderr, "\n LRRP - Track: %d Degrees", state->dmr_34_rate_sf[slot][i+1] * 2); sprintf ( state->dmr_lrrp[state->currentslot][5], "Dir: %d Deg ", state->dmr_34_rate_sf[slot][i+1] * 2); + + //i = ((blocks+1)*12); //skip to end of loop here so we don't accidentally trip another flag with data in these bytes + i = 99; + } + //try for a Control ACK at the very end if nothing else pops, flag still unknown + if ( (state->dmr_34_rate_sf[slot][i] == 0x36 || state->dmr_34_rate_sf[slot][i] == 0x37) && message_legnth > 6 ) + { + fprintf (stderr, "\n LRRP - Control ACK "); } } + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "\n"); + fclose (pFile); + } } - }//end payload fprintf (stderr, "%s ", KNRM); + //Full - if (opts->payload == 2) + if (opts->payload == 1) { - fprintf (stderr, "\nFull 3/4 Rate Payload DmrDataByte (reverse)\n "); + fprintf (stderr,"%s", KCYN); + fprintf (stderr, "\n Full 3/4 Rate Trellis Payload - Slot [%d]\n ", slot+1); + for (i = 0; i < 18; i++) //16, or 18? + { + fprintf (stderr, "[%02X]", TrellisReturn[i]); + } + fprintf (stderr, "\n Hex to Ascii - "); for (i = 0; i < 18; i++) { - fprintf (stderr, "[%02X]", DmrDataByte[i]); - } - - fprintf (stderr, "\nFull 3/4 Rate Payload DmrDataByte (reverse inverted)\n "); - for (i = 0; i < 18; i++) - { - fprintf (stderr, "[%02X]", ~DmrDataByte[i] & 0xFF); + if (TrellisReturn[i] <= 0x7E && TrellisReturn[i] >=0x20) + { + fprintf (stderr, "%c", TrellisReturn[i]); + } + else fprintf (stderr, "."); } + fprintf (stderr,"%s", KNRM); //change back to normal } - + //Full Super Frame - Debug Output + if (opts->payload == 1 && state->data_block_counter[state->currentslot] == state->data_header_blocks[state->currentslot]) + { + fprintf (stderr, "%s",KGRN); + fprintf (stderr, "\n Rate 3/4 Superframe - Slot [%d]\n ",slot+1); + for (i = 0; i < (16*4); i++) //16, or 18? + { + fprintf (stderr, "[%02X]", state->dmr_34_rate_sf[slot][i]); + if (i == 15 || i == 31 || i == 47 || i == 63 || i == 79) + { + fprintf (stderr, "\n "); //line break and two spaces after each 16 bytes + } + } + fprintf (stderr, "%s ", KNRM); + } + state->data_block_counter[state->currentslot]++; //increment block counter } //This is Data Header, why did I name it Data Data @@ -334,13 +382,14 @@ void ProcessDataData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint short int slot = 0; slot = (short int)state->currentslot; + //see if we still need this portion if we are going to use the data block info //clear out the 3/4 rate data superframe so we don't repeat old info - for (short int i = 0; i < (16*4); i++) + for (short int i = 0; i < (16*6); i++) { state->dmr_34_rate_sf[slot][i] = 0; } //clear out the 1/2 rate data superframe so we don't repeat old info - for (short int i = 0; i < (12*3); i++) + for (short int i = 0; i < (12*5); i++) //12*5 = 60 { state->dmr_12_rate_sf[slot][i] = 0; } @@ -446,32 +495,172 @@ void ProcessDataData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint } else {}//fprintf (stderr, ("\n(Data CRC Fail, FEC Fail)")); - // + //collect relevant data header info, figure out format, and grab appropriate info from it + if (state->data_p_head[state->currentslot] == 0) + { + fprintf (stderr, "%s ", KGRN); + state->data_block_counter[state->currentslot] = 1; //reset block counter to 1 + state->data_header_format[state->currentslot] = DmrDataByte[0]; //collect the entire byte, we can check group or individual, response requested as well on this + state->data_header_sap[state->currentslot] = (DmrDataByte[1] & 0xF0) >> 4; //SAP is IP(4) or other + + // state->data_header_padding[state->currentslot] = DmrDataByte[1] & 0xF; //number of padding octets on last block + // state->data_header_blocks[state->currentslot] = DmrDataByte[8] & 0x7F; //number of blocks to follow, most useful for when to poll the super array for data + // fprintf (stderr, "\n Unconfirmed Data Header: Format %02X - SAP %02X - Block Count %02X - Padding Octets %02X", + // state->data_header_format[state->currentslot], state->data_header_sap[state->currentslot], + // state->data_header_blocks[state->currentslot], state->data_header_padding[state->currentslot] ); + + if ( (state->data_header_format[state->currentslot] & 0xF) == 0x2) + { + state->data_header_padding[state->currentslot] = DmrDataByte[1] & 0xF; //number of padding octets on last block + state->data_header_blocks[state->currentslot] = DmrDataByte[8] & 0x7F; //number of blocks to follow, most useful for when to poll the super array for data + fprintf (stderr, "\n Unconfirmed Data Header: DPF %01X - SAP %02X - Block Count %02X - Padding Octets %02X", + state->data_header_format[state->currentslot] & 0xF, state->data_header_sap[state->currentslot], + state->data_header_blocks[state->currentslot], state->data_header_padding[state->currentslot] ); + } + + if ( (state->data_header_format[state->currentslot] & 0xF) == 0x3) + { + state->data_header_padding[state->currentslot] = DmrDataByte[1] & 0xF; //number of padding octets on last block + state->data_header_blocks[state->currentslot] = DmrDataByte[8] & 0x7F; //number of blocks to follow, most useful for when to poll the super array for data + fprintf (stderr, "\n Confirmed Data Header: DPF %01X - SAP %02X - Block Count %02X - Padding Octets %02X", + state->data_header_format[state->currentslot] & 0xF, state->data_header_sap[state->currentslot], + state->data_header_blocks[state->currentslot], state->data_header_padding[state->currentslot] ); + } + + if ( (state->data_header_format[state->currentslot] & 0xF) == 0xD) //DD_HEAD + { + state->data_header_padding[state->currentslot] = DmrDataByte[7] & 0xF; + state->data_header_blocks[state->currentslot] = ( (DmrDataByte[0] & 0x30) | ((DmrDataByte[1] & 0xF) >> 0) ); //what a pain MSB | LSB + fprintf (stderr, "\n Short Data - Defined: DPF %01X - SAP %02X - Appended Blocks %02X - Padding Bits %02X", + state->data_header_format[state->currentslot] & 0xF, state->data_header_sap[state->currentslot], + state->data_header_blocks[state->currentslot], state->data_header_padding[state->currentslot] ); + } + + if ( (state->data_header_format[state->currentslot] & 0xF) == 0xE) //SP_HEAD or R_HEAD + { + state->data_header_padding[state->currentslot] = DmrDataByte[7] & 0xF; + state->data_header_blocks[state->currentslot] = ( (DmrDataByte[0] & 0x30) | ((DmrDataByte[1] & 0xF) >> 0) ); //what a pain MSB | LSB + fprintf (stderr, "\n Short Data - Raw or Precoded: DPF %01X - SAP %02X - Appended Blocks %02X - Padding Bits %02X", + state->data_header_format[state->currentslot] & 0xF, state->data_header_sap[state->currentslot], + state->data_header_blocks[state->currentslot], state->data_header_padding[state->currentslot] ); + } + + + } + + //sanity check to prevent random crash in 1/2 rate and 3/4 rate data + //we want to assign extra large block sizes to a max of 7 so we don't overload the 1/2 or 3/4 array + if (state->data_header_blocks[state->currentslot] > 7) + { + state->data_header_blocks[state->currentslot] = 7; //currently 1/2 only supports a max of 7 blocks per slot + } + + + //set source here so we can reference it in our text dump + state->dmr_lrrp_source[state->currentslot] = (DmrDataByte[5] <<16 ) + (DmrDataByte[6] << 8) + DmrDataByte[7]; + fprintf (stderr, "%s ", KNRM); + //end collecting data header info + fprintf (stderr, "%s ", KMAG); - if (DmrDataByte[0] == 0x43) + if (state->data_header_sap[state->currentslot] == 0x4 && state->data_p_head[state->currentslot] == 0) //4 is IP data { - fprintf (stderr, "\n IP4 Source IP:"); - fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[0] & 0x3F), DmrDataByte[1], DmrDataByte[2], DmrDataByte[3]); //not sure if these are right or not - fprintf (stderr, "[%d]", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); - fprintf (stderr, " Destination IP:"); - fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[4] & 0x3F), DmrDataByte[5], DmrDataByte[6], DmrDataByte[7]); //not sure if these are right or not - fprintf (stderr, "[%d]", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); + fprintf (stderr, "\n IP4 Data - Source: "); + //fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[0] & 0x3F), DmrDataByte[1], DmrDataByte[2], DmrDataByte[3]); //not sure if these are right or not + fprintf (stderr, "[%d]", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] << 8) + DmrDataByte[7] ); + fprintf (stderr, " Destination: "); + //fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[4] & 0x3F), DmrDataByte[5], DmrDataByte[6], DmrDataByte[7]); //not sure if these are right or not + fprintf (stderr, "[%d]", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] <<8 ) + DmrDataByte[4] ); + + //part below should probably be inside of above if condition + if (1 == 1) //already setting by current slot, no need for checking first + { + sprintf ( state->dmr_lrrp[state->currentslot][1], "SRC [%d] DST [%d] ", + ( (DmrDataByte[5] <<16 ) + (DmrDataByte[6] << 8) + DmrDataByte[7]), + ( (DmrDataByte[2] <<16 ) + (DmrDataByte[3] <<8 ) + DmrDataByte[4]) ); + } + } - if (1 == 1) //already setting by current slot, no need for checking first + + if (state->data_header_sap[state->currentslot] == 0x5 && state->data_p_head[state->currentslot] == 0) //5 is ARP Address Resolution Protocol { - sprintf ( state->dmr_lrrp[state->currentslot][1], "SRC [%d] TGT [%d] ", - ( (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4]), - ( (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7]) ); + fprintf (stderr, "\n ARP - Address Resolution Protocol "); } - if (DmrDataByte[0] == 0x01) + + if ( (state->data_header_format[state->currentslot] & 0xF ) == 0xD && state->data_p_head[state->currentslot] == 0) //5 is ARP Address Resolution Protocol { - fprintf (stderr, "\n LRRP Control ACK - "); + fprintf (stderr, "\n Short Data - Defined - Source: "); + //fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[0] & 0x3F), DmrDataByte[1], DmrDataByte[2], DmrDataByte[3]); //not sure if these are right or not + fprintf (stderr, "[%d]", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] << 8) + DmrDataByte[7] ); + fprintf (stderr, " Destination: "); + //fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[4] & 0x3F), DmrDataByte[5], DmrDataByte[6], DmrDataByte[7]); //not sure if these are right or not + fprintf (stderr, "[%d]", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] <<8 ) + DmrDataByte[4] ); + } + + if ( (state->data_header_format[state->currentslot] & 0xF) == 0xE && state->data_p_head[state->currentslot] == 0) //5 is ARP Address Resolution Protocol + { + fprintf (stderr, "\n Short Data - Raw or Status/Precoded - Source: "); + //fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[0] & 0x3F), DmrDataByte[1], DmrDataByte[2], DmrDataByte[3]); //not sure if these are right or not + fprintf (stderr, "[%d]", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] << 8) + DmrDataByte[7] ); + fprintf (stderr, " Destination: "); + //fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[4] & 0x3F), DmrDataByte[5], DmrDataByte[6], DmrDataByte[7]); //not sure if these are right or not + fprintf (stderr, "[%d]", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] <<8 ) + DmrDataByte[4] ); + } + + if ( (state->data_header_format[state->currentslot] & 0xF ) == 0x1 && state->data_p_head[state->currentslot] == 0) //5 is ARP Address Resolution Protocol + { + fprintf (stderr, "\n Response Packet - Source: "); + //fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[0] & 0x3F), DmrDataByte[1], DmrDataByte[2], DmrDataByte[3]); //not sure if these are right or not + fprintf (stderr, "[%d]", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] << 8) + DmrDataByte[7] ); + fprintf (stderr, " Destination: "); + //fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[4] & 0x3F), DmrDataByte[5], DmrDataByte[6], DmrDataByte[7]); //not sure if these are right or not + fprintf (stderr, "[%d]", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] <<8 ) + DmrDataByte[4] ); + } + + if ( (state->data_header_format[state->currentslot] & 0xF ) == 0x0 && state->data_p_head[state->currentslot] == 0) //5 is ARP Address Resolution Protocol + { + fprintf (stderr, "\n Unified Data Transport - Source: "); + //fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[0] & 0x3F), DmrDataByte[1], DmrDataByte[2], DmrDataByte[3]); //not sure if these are right or not + fprintf (stderr, "[%d]", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] << 8) + DmrDataByte[7] ); + fprintf (stderr, " Destination: "); + //fprintf (stderr, " %d.%d.%d.%d", (DmrDataByte[4] & 0x3F), DmrDataByte[5], DmrDataByte[6], DmrDataByte[7]); //not sure if these are right or not + fprintf (stderr, "[%d]", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] <<8 ) + DmrDataByte[4] ); + } + + if ( (state->data_header_format[state->currentslot] & 0x40) == 0x40 && state->data_p_head[state->currentslot] == 0) //check response req bit + { + fprintf (stderr, "\n Response Requested - "); fprintf (stderr, " Source:"); - fprintf (stderr, " %d", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); + fprintf (stderr, " [%d]", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); fprintf (stderr, " Destination:"); - fprintf (stderr, " %d", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); + fprintf (stderr, " [%d]", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); + } + + //if proprietary header was flagged by the last data header, then process data differently + //maybe we could add the data header bytes found here into the 12 rate and/or 34 rate superframe + if (state->data_p_head[state->currentslot] == 1) + { + fprintf (stderr, "\n Proprietary Data Header: SAP %01X - Format %01X - MFID %02X", + (DmrDataByte[0] & 0xF0) >> 4, DmrDataByte[0] & 0xF, DmrDataByte[1] ); + + state->data_p_head[state->currentslot] = 0; + state->data_header_sap[state->currentslot] = 0; //reset this to zero so we don't trip the condition below + state->data_block_counter[state->currentslot]++; //increment the counter since this counts against the data blocks + //shim the databytes into the approprate 12 Rate Super Frame + uint8_t blocks = state->data_header_blocks[state->currentslot] - 1; + for(i = 0; i < 12; i++) + { + state->dmr_12_rate_sf[slot][i+(blocks*12)] = DmrDataByte[i]; + } + } + + //only set this flag after everything else is processed + if (state->data_header_sap[state->currentslot] == 0x9 && state->data_p_head[state->currentslot] == 0) //9 is Proprietary Packet data + { + fprintf (stderr, "\n Proprietary Packet Data Incoming "); + state->data_p_head[state->currentslot] = 1; //flag that next data header will be a proprietary data header } fprintf (stderr, "%s ", KNRM); + //Full if (opts->payload == 1) { @@ -484,6 +673,7 @@ void ProcessDataData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint fprintf (stderr, "%s", KNRM); } + } void Process1Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) @@ -1015,14 +1205,19 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ /* Fill the reserved bit (R(0)-R(2) of the BPTC(196,96) block) */ BPTCReservedBits = (R[0] & 0x01) | ((R[1] << 1) & 0x02) | ((R[2] << 2) & 0x08); - /* Convert the 96 bit of voice LC Header data into 12 bytes */ + //define our block and padding values + uint8_t blocks = state->data_header_blocks[slot] - 1; //subtract 1 for the relevant value in the calc below + uint8_t padding = state->data_header_padding[slot]; + //shift data in the superframe up a block k = 0; for(i = 0; i < 12; i++) { - state->dmr_12_rate_sf[slot][i] = state->dmr_12_rate_sf[slot][i+12]; //shift middle 12 to leftmost 12 to load up new round - state->dmr_12_rate_sf[slot][i+12] = state->dmr_12_rate_sf[slot][i+24]; //shift middle right 12 to middle left 12, going four frames deep; - state->dmr_12_rate_sf[slot][i+24] = state->dmr_12_rate_sf[slot][i+36]; //shift far right 12 to middle right 12, going four frames deep; - state->dmr_12_rate_sf[slot][i+36] = state->dmr_12_rate_sf[slot][i+48]; + state->dmr_12_rate_sf[slot][i] = state->dmr_12_rate_sf[slot][i+12]; //shift block 2 to block 1 + state->dmr_12_rate_sf[slot][i+12] = state->dmr_12_rate_sf[slot][i+24]; //shift block 3 to block 2 + state->dmr_12_rate_sf[slot][i+24] = state->dmr_12_rate_sf[slot][i+36]; //shift block 4 to block 3 + state->dmr_12_rate_sf[slot][i+36] = state->dmr_12_rate_sf[slot][i+48]; //shift block 5 to block 4 + state->dmr_12_rate_sf[slot][i+48] = state->dmr_12_rate_sf[slot][i+60]; //shift block 6 to block 5 + state->dmr_12_rate_sf[slot][i+60] = state->dmr_12_rate_sf[slot][i+72]; //shift block 7 to block 6 DmrDataByte[i] = 0; for(j = 0; j < 8; j++) { @@ -1030,22 +1225,9 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ DmrDataByte[i] = DmrDataByte[i] | (DmrDataBit[k] & 0x01); k++; } - state->dmr_12_rate_sf[slot][i+48] = DmrDataByte[i]; //copy byte to right hand side of shift frame - } - - if (opts->payload == 2) - { - fprintf (stderr, "%s",KGRN); - fprintf (stderr, "\n Rate 1/2 Superframe - Slot [%d]\n ",slot+1); - for (i = 0; i < (12*5); i++) - { - fprintf (stderr, "[%02X]", state->dmr_12_rate_sf[slot][i]); - if (i == 11 || i == 23 || i == 35 || i == 47) //line break and two spaces after each 16 bytes - { - fprintf (stderr, "\n "); - } - } - fprintf (stderr, "%s ", KNRM); + //state->dmr_12_rate_sf[slot][i+48] = DmrDataByte[i]; //copy byte to right hand side of shift frame + //start loading new superframe at appropriate block count determined by the data header + state->dmr_12_rate_sf[slot][i+(blocks*12)] = DmrDataByte[i]; //if 3 blocks, then start at position 36; 4 blocks at 48, 5 at } /* Fill the CRC extracted (before Reed-Solomon (12,9) FEC correction) */ @@ -1096,111 +1278,65 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ DmrDataBit[j + 6] = (DmrDataByte[i] >> 1) & 0x01; DmrDataBit[j + 7] = (DmrDataByte[i] >> 0) & 0x01; } - //Headers Source Destination - //Start Source Destination early in case not enough 1/2 data frames - if ( (state->dmr_12_rate_sf[slot][36] & 0x7F) == 0x45 ) - { - fprintf (stderr, "%s ", KMAG); - //fprintf (stderr, "\n IP4 Header"); //Not sure this is accurate info IP4 Header? - //fprintf (stderr, "\n Data Blocks [%d]", state->dmr_34_rate_sf[5]); - for (short i = 36; i < 60; i++) //find way to get padding so we only go as deep as we need to! - { - if ( state->dmr_12_rate_sf[slot][i] == 0x0C) //Source and Destination info - { - fprintf (stderr, "\n Source:"); - fprintf (stderr, " %03d.%03d.%03d.%03d", (state->dmr_12_rate_sf[slot][i+0] & 0x3F), state->dmr_12_rate_sf[slot][i+1], state->dmr_12_rate_sf[slot][i+2], state->dmr_12_rate_sf[slot][i+3]); //strip first two bits off 1st byte - fprintf (stderr, " [%08d]", (state->dmr_12_rate_sf[slot][i+1] <<16 ) + (state->dmr_12_rate_sf[slot][i+2] << 8) + state->dmr_12_rate_sf[slot][i+3] ); - fprintf (stderr, " - Port %05d", (state->dmr_12_rate_sf[slot][i+8] << 8) + state->dmr_12_rate_sf[slot][i+9]); - fprintf (stderr, "\n Destination:"); - fprintf (stderr, " %03d.%03d.%03d.%03d", (state->dmr_12_rate_sf[slot][i+4] & 0x3F), state->dmr_12_rate_sf[slot][i+5], state->dmr_12_rate_sf[slot][6], state->dmr_12_rate_sf[slot][i+7]); //strip first two bits off 4th byte?? - fprintf (stderr, " [%08d]", (state->dmr_12_rate_sf[slot][i+5] <<16 ) + (state->dmr_12_rate_sf[slot][i+6] << 8) + state->dmr_12_rate_sf[slot][i+7] ); - fprintf (stderr, " - Port %05d", (state->dmr_12_rate_sf[slot][i+10] << 8) + state->dmr_12_rate_sf[slot][i+11]); - } - } - fprintf (stderr, "%s ", KNRM); - } - /* - //Jurek lrrp, 0x41 is probably a different header type or something, or I need to look at the data header packet PDU first. - if ( (state->dmr_12_rate_sf[slot][36] & 0x7F) == 0x41) //Start LRRP now - { - sprintf ( state->dmr_lrrp[state->currentslot][0], "LRRP - "); - fprintf (stderr, "%s ", KMAG); - for (short i = 36; i < 60; i++) //find way to get padding so we only go as deep as we need to! - { - if ( state->dmr_12_rate_sf[slot][i] == 0x51 ) //lattitude and longitude - { - fprintf (stderr, "\n LRRP -"); - fprintf (stderr, " Lat: "); - if (state->dmr_12_rate_sf[slot][i+1] & 0x80) //first bit indicates a sign, or hemisphere? - { - fprintf (stderr, "-"); - } - long int lrrplat; - long int lrrplon; - double lat_unit = (double)180/(double)4294967295; - double lon_unit = (double)360/(double)4294967295; - lrrplat = ( ( ((state->dmr_12_rate_sf[slot][i+1] & 0x7F ) << 24 ) + (state->dmr_12_rate_sf[slot][i+2] << 16) + (state->dmr_12_rate_sf[slot][i+3] << 8) + state->dmr_12_rate_sf[slot][i+4]) * 1 ); - lrrplon = ( ( (state->dmr_12_rate_sf[slot][i+5] << 24 ) + (state->dmr_12_rate_sf[slot][i+6] << 16) + (state->dmr_12_rate_sf[slot][i+7] << 8) + state->dmr_12_rate_sf[slot][i+8]) * 1 ); - fprintf (stderr, "%.5lf ", ((double)lrrplat) * lat_unit); - fprintf (stderr, " Lon: "); - if (state->dmr_12_rate_sf[slot][i+5] & 0x80) //first bit indicates a sign, or hemisphere? - { - //fprintf (stderr, "-"); - } - fprintf (stderr, "%.5lf", (lrrplon * lon_unit) ); - sprintf ( state->dmr_lrrp[state->currentslot][3], "Lat: %.5lf Lon: %.5lf ", ((double)lrrplat) * lat_unit , (lrrplon * lon_unit) ); - //print for easy copy/paste into browser? - //fprintf (stderr, " ("); - if (state->dmr_12_rate_sf[slot][i+1] & 0x80) //first bit indicates a sign, or hemisphere? - { - fprintf (stderr, "-"); - } - fprintf (stderr, "%.5lf, %.5lf)", ((double)lrrplat) * lat_unit , (lrrplon * lon_unit) ); - } - - if ( state->dmr_12_rate_sf[slot][i] == 0x6C ) - { - //either Plus is wrong, or I'm wrong on higher velocities exceeding 0xFF. - //fprintf (stderr, "\n LRRP - Vi %02X Vf %02X Velocity Units (hex)", state->dmr_34_rate_sf[i+1], state->dmr_34_rate_sf[i+2]); - double velocity = ( ((double)( (state->dmr_12_rate_sf[slot][i+1] ) + state->dmr_12_rate_sf[slot][i+2] )) / ( (double)128)); - //fprintf (stderr, "\n LRRP - %.4lf Meters Per Second", velocity); - fprintf (stderr, "\n LRRP - %.4lf m/s %.4lf km/h %.4lf mph", velocity, (3.6 * velocity), (2.2369 * velocity) ); - sprintf ( state->dmr_lrrp[state->currentslot][4], "Vel: %.4lf kph ", (3.6 * velocity)); - } - if ( state->dmr_12_rate_sf[slot][i] == 0x56 ) - { - //check for appropriate terminology here - Heading, bearing, course, or track? - fprintf (stderr, "\n LRRP - Direction %d Degrees", state->dmr_12_rate_sf[slot][i+1] * 2); - sprintf ( state->dmr_lrrp[state->currentslot][5], "Dir: %d Deg ", state->dmr_12_rate_sf[slot][i+1] * 2); - } - } - } - //end Jurek lrrp - */ + //Start Polling the 1/2 Rate Super Frame for Data when byte 0 contains values //LRRP + int message_legnth = 0; if ( (state->dmr_12_rate_sf[slot][0] & 0x7F) == 0x45) //Start LRRP now { - //sprintf ( state->dmr_lrrp[state->currentslot][0], "LRRP - "); - fprintf (stderr, "%s ", KMAG); - //fprintf (stderr, "\n IP4 Header"); //Not sure this is accurate info IP4 Header? - //fprintf (stderr, "\n Data Blocks [%d]", state->dmr_34_rate_sf[5]); - for (short i = 1; i < 56; i++) //find way to get padding so we only go as deep as we need to! changed from 60 to 56 to skip the CRC bytes + //test opening a file with fopen and dumping the LRRP data into it. + //just going to use the same code from EDACS-FM + + //find user home directory and append directory and filename. + FILE * pFile; //put this outside of the if statement? + if (opts->lrrp_file_output == 1) { - /* + char * filename = "/lrrp.txt"; + char * home_dir = getenv("HOME"); + char * filepath = malloc(strlen(home_dir) + strlen(filename) + 1); + strncpy (filepath, home_dir, strlen(home_dir) + 1); + strncat (filepath, filename, strlen(filename) + 1); + //end find user home directory and append directory and filename + + pFile = fopen (filepath, "a"); + + //hard code filename override for those wanting to use other software + //pFile = fopen("DSDPlus.LRRP", "a"); + + + fprintf (pFile, "%s\t %s\t", getDateL(), getTimeL()); //current timestamp, may find a way to only add this IF no included timestamp in LRRP data? + fprintf (pFile, "%08lld\t", state->dmr_lrrp_source[state->currentslot]); //source address from data header + } + + + fprintf (stderr, "%s ", KMAG); + + //go to number of octets minus padding and crc, confirmed data may need a second rule to skip Serial Numbers and Block CRCs + for (short i = 12; i < ( ((blocks+1)*12) - (padding+4) ); i++) + { + if ( state->dmr_12_rate_sf[slot][i] == 0x0C) //Source and Destination info { - fprintf (stderr, "\n Source:"); + fprintf (stderr, "\n Source: "); fprintf (stderr, " %03d.%03d.%03d.%03d", (state->dmr_12_rate_sf[slot][i+0] & 0x3F), state->dmr_12_rate_sf[slot][i+1], state->dmr_12_rate_sf[slot][i+2], state->dmr_12_rate_sf[slot][i+3]); //strip first two bits off 1st byte fprintf (stderr, " [%08d]", (state->dmr_12_rate_sf[slot][i+1] <<16 ) + (state->dmr_12_rate_sf[slot][i+2] << 8) + state->dmr_12_rate_sf[slot][i+3] ); - fprintf (stderr, " - Port %05d", (state->dmr_12_rate_sf[slot][i+8] << 8) + state->dmr_12_rate_sf[slot][i+9]); - fprintf (stderr, "\n Destination:"); + fprintf (stderr, " - Port %05d ", (state->dmr_12_rate_sf[slot][i+8] << 8) + state->dmr_12_rate_sf[slot][i+9]); + fprintf (stderr, "\n Destination: "); fprintf (stderr, " %03d.%03d.%03d.%03d", (state->dmr_12_rate_sf[slot][i+4] & 0x3F), state->dmr_12_rate_sf[slot][i+5], state->dmr_12_rate_sf[slot][6], state->dmr_12_rate_sf[slot][i+7]); //strip first two bits off 4th byte?? fprintf (stderr, " [%08d]", (state->dmr_12_rate_sf[slot][i+5] <<16 ) + (state->dmr_12_rate_sf[slot][i+6] << 8) + state->dmr_12_rate_sf[slot][i+7] ); fprintf (stderr, " - Port %05d", (state->dmr_12_rate_sf[slot][i+10] << 8) + state->dmr_12_rate_sf[slot][i+11]); + + i = i + 12; //skip 12 bytes here so we don't accidentally trip another flag with data in these bytes } - */ - if ( state->dmr_12_rate_sf[slot][i] == 0x34 ) //timestamp + + if (state->dmr_12_rate_sf[slot][i] == 0x0D) //This should lock on to the second 0x0D value hopefully and tell us the message legnth + { + message_legnth = state->dmr_12_rate_sf[slot][i+1]; + fprintf (stderr, "\n Message Legnth: %02d", message_legnth); + i = i + 2; //skip 2 bytes here so we don't accidentally trip another flag with data in these bytes + } + + if ( state->dmr_12_rate_sf[slot][i] == 0x34 && message_legnth > 27 ) //timestamp, seems to need legnth of 28 { fprintf (stderr, "\n LRRP - Timestamp: "); fprintf (stderr, "%4d.", (state->dmr_12_rate_sf[slot][i+1] << 6) + (state->dmr_12_rate_sf[slot][i+2] >> 2) ); //4 digit year @@ -1208,15 +1344,22 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ fprintf (stderr, "%02d", ( (state->dmr_12_rate_sf[slot][i+3] & 0x30) >> 1) + ((state->dmr_12_rate_sf[slot][i+3] & 0x0E) >> 1) ); //2 digit day fprintf (stderr, " %02d:",( (state->dmr_12_rate_sf[slot][i+3] & 0x01) << 4) + ((state->dmr_12_rate_sf[slot][i+4] & 0xF0) >> 4) ); //2 digit hour fprintf (stderr, "%02d:",( (state->dmr_12_rate_sf[slot][i+4] & 0x0F) << 2) + ((state->dmr_12_rate_sf[slot][i+5] & 0xC0) >> 6) ); //2 digit minute - fprintf (stderr, "%02d", ( (state->dmr_12_rate_sf[slot][i+5] & 0x3F) << 0) ); //2 digit second + fprintf (stderr, "%02d", ( (state->dmr_12_rate_sf[slot][i+5] & 0x3F) << 0) ); //2 digit second + + i = i + 6; //skip 6 bytes here so we don't accidentally trip another flag with data in these bytes } - if ( state->dmr_12_rate_sf[slot][i] == 0x51 ) //lattitude and longitude + + if ( state->dmr_12_rate_sf[slot][i] == 0x51 && message_legnth > 13) //lattitude and longitude, message_lenght > 13? { fprintf (stderr, "\n LRRP -"); fprintf (stderr, " Lat: "); if (state->dmr_12_rate_sf[slot][i+1] & 0x80) //first bit indicates a sign, or hemisphere? { fprintf (stderr, "-"); + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "-"); + } } long int lrrplat; long int lrrplon; @@ -1225,12 +1368,20 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ lrrplat = ( ( ((state->dmr_12_rate_sf[slot][i+1] & 0x7F ) << 24 ) + (state->dmr_12_rate_sf[slot][i+2] << 16) + (state->dmr_12_rate_sf[slot][i+3] << 8) + state->dmr_12_rate_sf[slot][i+4]) * 1 ); lrrplon = ( ( (state->dmr_12_rate_sf[slot][i+5] << 24 ) + (state->dmr_12_rate_sf[slot][i+6] << 16) + (state->dmr_12_rate_sf[slot][i+7] << 8) + state->dmr_12_rate_sf[slot][i+8]) * 1 ); fprintf (stderr, "%.5lf ", ((double)lrrplat) * lat_unit); + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "%.5lf\t", ((double)lrrplat) * lat_unit); + } fprintf (stderr, " Lon: "); if (state->dmr_12_rate_sf[slot][i+5] & 0x80) //first bit indicates a sign, or hemisphere? { //fprintf (stderr, "-"); } fprintf (stderr, "%.5lf", (lrrplon * lon_unit) ); + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "%.5lf\t", (lrrplon * lon_unit) ); + } if (state->dmr_12_rate_sf[slot][i+1] & 0x80) //first bit indicates a sign, or hemisphere? { sprintf ( state->dmr_lrrp[state->currentslot][3], "Lat: -%.5lf Lon: %.5lf ", ((double)lrrplat) * lat_unit , (lrrplon * lon_unit) ); @@ -1242,24 +1393,47 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ fprintf (stderr, " (-%.5lf, %.5lf)", ((double)lrrplat) * lat_unit , (lrrplon * lon_unit) ); } else fprintf (stderr, " (%.5lf, %.5lf)", ((double)lrrplat) * lat_unit , (lrrplon * lon_unit) ); + + i = i + 9 + 2; //skip 9 bytes here so we don't accidentally trip another flag with data in these bytes } - if ( state->dmr_12_rate_sf[slot][i] == 0x6C ) + if ( state->dmr_12_rate_sf[slot][i] == 0x6C && message_legnth > 13) { - //either Plus is wrong, or I'm wrong on higher velocities exceeding 0xFF. + //either Plus is wrong, or I'm wrong on higher velocities exceeding 0xFF. double check double values? //fprintf (stderr, "\n LRRP - Vi %02X Vf %02X Velocity Units (hex)", state->dmr_34_rate_sf[i+1], state->dmr_34_rate_sf[i+2]); double velocity = ( ((double)( (state->dmr_12_rate_sf[slot][i+1] ) + state->dmr_12_rate_sf[slot][i+2] )) / ( (double)128)); - //fprintf (stderr, "\n LRRP - %.4lf Meters Per Second", velocity); - fprintf (stderr, "\n LRRP - %.4lf m/s %.4lf km/h %.4lf mph", velocity, (3.6 * velocity), (2.2369 * velocity) ); + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "%.3lf\t ", (velocity * 3.6) ); + } + fprintf (stderr, "\n LRRP - Velocity: %.4lf m/s %.4lf km/h %.4lf mph", velocity, (3.6 * velocity), (2.2369 * velocity) ); sprintf ( state->dmr_lrrp[state->currentslot][4], "Vel: %.4lf kph ", (3.6 * velocity)); + + i = i + 3; //skip 3 bytes here so we don't accidentally trip another flag with data in these bytes } - if ( state->dmr_12_rate_sf[slot][i] == 0x56 ) + if ( state->dmr_12_rate_sf[slot][i] == 0x56 && message_legnth > 13) { //check for appropriate terminology here - Heading, bearing, course, or track? - fprintf (stderr, "\n LRRP - Direction %d Degrees", state->dmr_12_rate_sf[slot][i+1] * 2); + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "%d\t", state->dmr_12_rate_sf[slot][i+1] * 2); + } + fprintf (stderr, "\n LRRP - Track: %d Degrees", state->dmr_12_rate_sf[slot][i+1] * 2); sprintf ( state->dmr_lrrp[state->currentslot][5], "Dir: %d Deg ", state->dmr_12_rate_sf[slot][i+1] * 2); + + i = ((blocks+1)*12); //skip to end of loop here so we don't accidentally trip another flag with data in these bytes } + //try for a Control ACK at the very end if nothing else pops, flag still unknown + if ( (state->dmr_12_rate_sf[slot][i] == 0x36 || state->dmr_12_rate_sf[slot][i] == 0x37) && message_legnth > 6 ) + { + fprintf (stderr, "\n LRRP - Control ACK "); + } + } + if (opts->lrrp_file_output == 1) + { + fprintf (pFile, "\n"); + fclose (pFile); } } fprintf (stderr, "%s ", KNRM); @@ -1284,6 +1458,22 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ } fprintf (stderr,"%s", KNRM); } + //Full Super Frame - Debug Output + if (opts->payload == 1 && state->data_block_counter[state->currentslot] == state->data_header_blocks[state->currentslot]) + { + fprintf (stderr, "%s",KGRN); + fprintf (stderr, "\n Rate 1/2 Superframe - Slot [%d]\n ",slot+1); + for (i = 0; i < ((blocks+1)*12); i++) //only print as many as we have blocks + { + fprintf (stderr, "[%02X]", state->dmr_12_rate_sf[slot][i]); + if (i == 11 || i == 23 || i == 35 || i == 47 || i == 59 || i == 71) //line break and two spaces after each 16 bytes + { + fprintf (stderr, "\n "); + } + } + fprintf (stderr, "%s ", KNRM); + } + state->data_block_counter[state->currentslot]++; //increment block counter } @@ -1681,6 +1871,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]) ); + //state->payload_mi = 0; //testing for late entry, remove later if (state->payload_algid < 0x26) //have it always print? only if a good value, was 1 == 1 { fprintf (stderr, "%s ", KYEL); @@ -1701,6 +1892,7 @@ void ProcessDmrPIHeader(dsd_opts * opts, dsd_state * state, uint8_t info[196], u state->payload_algidR = DmrDataByte[0]; state->payload_keyidR = DmrDataByte[2]; state->payload_miR = ( ((DmrDataByte[3]) << 24) + ((DmrDataByte[4]) << 16) + ((DmrDataByte[5]) << 8) + (DmrDataByte[6]) ); + //state->payload_miR = 0; //testing for late entry, remove later if (state->payload_algidR < 0x26) //have it always print? only if a good value, was 1 == 1 { fprintf (stderr, "%s ", KYEL); @@ -1871,8 +2063,9 @@ void ProcessDmrVoiceLcHeader(dsd_opts * opts, dsd_state * state, uint8_t info[19 } } /* Print the destination ID (TG) and the source ID */ - fprintf (stderr, "%s ", KGRN); - fprintf(stderr, "\n TGT=%u SRC=%u ", TSVoiceSupFrame->FullLC.GroupAddress, TSVoiceSupFrame->FullLC.SourceAddress); + fprintf (stderr, "%s \n", KGRN); + fprintf (stderr, " Slot %d ", state->currentslot+1); + fprintf(stderr, " TGT=%u SRC=%u ", TSVoiceSupFrame->FullLC.GroupAddress, TSVoiceSupFrame->FullLC.SourceAddress); //fprintf(stderr, "FID=0x%02X ", TSVoiceSupFrame->FullLC.FeatureSetID); //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; @@ -1884,17 +2077,12 @@ void ProcessDmrVoiceLcHeader(dsd_opts * opts, dsd_state * state, uint8_t info[19 if(TSVoiceSupFrame->FullLC.ServiceOptions & 0x80) fprintf(stderr, "Emergency "); if(TSVoiceSupFrame->FullLC.ServiceOptions & 0x40) { - /* By default select the basic privacy (BP), if the encryption mode is EP ARC4 or AES256 - * a PI Header will be sent with the encryption mode and DSD will upgrade automatically - * the new encryption mode */ - opts->EncryptionMode = MODE_BASIC_PRIVACY; fprintf (stderr, "%s ", KRED); fprintf(stderr, "Encrypted "); //fprintf (stderr, "%s ", KNRM); } else { - opts->EncryptionMode = MODE_UNENCRYPTED; fprintf (stderr, "%s ", KGRN); fprintf(stderr, "Clear/Unencrypted "); //fprintf (stderr, "%s ", KNRM); @@ -2093,21 +2281,20 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19 //fprintf(stderr, "FID=0x%02X ", TSVoiceSupFrame->FullLC.FeatureSetID); //reset alg, keys, mi during a TLC call termination EVENT so we aren't stuck on an old value, PI header will proceed a new call if BP isn't used - //assuming the TLC frame comes on the same slot as the call it was terminating? not sure? if (state->currentslot == 0) { - //state->payload_algid = 0; //try disablign all of these? - //state->payload_keyid = 0; + state->payload_algid = 0; + state->payload_keyid = 0; //state->payload_mfid = 0; - //state->payload_mi = 0; //let's try disabling this for a bit + state->payload_mi = 0; } if (state->currentslot == 1) { - //state->payload_algidR = 0; //try disablign all of these? - //state->payload_keyidR = 0; + state->payload_algidR = 0; + state->payload_keyidR = 0; //state->payload_mfid = 0; - //state->payload_miR = 0; ////let's try disabling this for a bit + state->payload_miR = 0; } @@ -2552,6 +2739,8 @@ void ProcessVoiceBurstSync(dsd_opts * opts, dsd_state * state) { fprintf (stderr, "[%02X]", LC_DataBytes[i]); //amateur DMR hams seem to use this area to send callsigns and names using 04,05,06,07 opcodes } + // fprintf(stderr, "\n"); + // fprintf(stderr, "CRC extracted = 0x%04X - CRC computed = 0x%04X - ", CRCExtracted, CRCComputed); fprintf (stderr, "%s", KNRM); diff --git a/src/dmr_voice.c b/src/dmr_voice.c index 3e5170a..db0fd24 100644 --- a/src/dmr_voice.c +++ b/src/dmr_voice.c @@ -646,8 +646,8 @@ void processDMRvoice (dsd_opts * opts, dsd_state * state) ProcessDMR(opts, state); //LFSR if required, change condition? - if ( (state->currentslot == 0 && state->payload_algid != 0 ) || //&& opts->payload == 1 - (state->currentslot == 1 && state->payload_algidR != 0 ) ) //&& opts->payload == 1 + if ( (state->currentslot == 0 && state->payload_algid == 0x21 ) || //&& opts->payload == 1 + (state->currentslot == 1 && state->payload_algidR == 0x21 ) ) //&& opts->payload == 1 { LFSR(state); } diff --git a/src/dsd_audio.c b/src/dsd_audio.c index fc0c08b..73df689 100644 --- a/src/dsd_audio.c +++ b/src/dsd_audio.c @@ -22,6 +22,20 @@ pa_sample_spec tt; pa_sample_spec zz; pa_sample_spec cc; +void closePulseOutput (dsd_opts * opts) +{ + pa_simple_free (opts->pulse_digi_dev_out); + if (opts->dmr_stereo == 1) + { + pa_simple_free (opts->pulse_digi_dev_outR); + } +} + +void closePulseInput (dsd_opts * opts) +{ + pa_simple_free (opts->pulse_digi_dev_in); +} + void openPulseOutput(dsd_opts * opts) { @@ -35,7 +49,7 @@ void openPulseOutput(dsd_opts * opts) if (opts->monitor_input_audio == 1) { - opts->pulse_raw_dev_out = pa_simple_new(NULL, "DSD-FME", PA_STREAM_PLAYBACK, NULL, "Raw Audio Out", &ss, NULL, NULL, NULL); + opts->pulse_raw_dev_out = pa_simple_new(NULL, "DSD-FME3", PA_STREAM_PLAYBACK, NULL, "Raw Audio Out", &ss, NULL, NULL, NULL); } //tt @@ -47,10 +61,11 @@ void openPulseOutput(dsd_opts * opts) opts->pulse_digi_dev_out = pa_simple_new(NULL, "DSD-FME", PA_STREAM_PLAYBACK, NULL, opts->output_name, &tt, left, NULL, NULL); } + if (opts->dmr_stereo == 1) { - opts->pulse_digi_dev_out = pa_simple_new(NULL, "DSD-FME1", PA_STREAM_PLAYBACK, NULL, "DMR/MOTOTRBO SLOT 1", &tt, left, NULL, NULL); - opts->pulse_digi_dev_outR = pa_simple_new(NULL, "DSD-FME2", PA_STREAM_PLAYBACK, NULL, "DMR/MOTOTRBO SLOT 2", &tt, right, NULL, NULL); + opts->pulse_digi_dev_out = pa_simple_new(NULL, "DSD-FME1", PA_STREAM_PLAYBACK, NULL, "DMR SLOT 1", &tt, left, NULL, NULL); + opts->pulse_digi_dev_outR = pa_simple_new(NULL, "DSD-FME2", PA_STREAM_PLAYBACK, NULL, "DMR SLOT 2", &tt, right, NULL, NULL); } } @@ -348,8 +363,7 @@ processAudioR (dsd_opts * opts, dsd_state * state) } } -void -writeSynthesizedVoice (dsd_opts * opts, dsd_state * state) +void writeSynthesizedVoice (dsd_opts * opts, dsd_state * state) { int n; short aout_buf[160]; @@ -377,6 +391,50 @@ writeSynthesizedVoice (dsd_opts * opts, dsd_state * state) } +void writeSynthesizedVoiceR (dsd_opts * opts, dsd_state * state) +{ + int n; + short aout_buf[160]; + short *aout_buf_p; + + aout_buf_p = aout_buf; + state->audio_out_temp_buf_pR = state->audio_out_temp_bufR; + + for (n = 0; n < 160; n++) + { + if (*state->audio_out_temp_buf_pR > (float) 32767) + { + *state->audio_out_temp_buf_pR = (float) 32767; + } + else if (*state->audio_out_temp_buf_pR < (float) -32768) + { + *state->audio_out_temp_buf_pR = (float) -32768; + } + *aout_buf_p = (short) *state->audio_out_temp_buf_pR; + aout_buf_p++; + state->audio_out_temp_buf_pR++; + } + + sf_write_short(opts->wav_out_fR, aout_buf, 160); + +} + +void writeRawSample (dsd_opts * opts, dsd_state * state, short sample) +{ + int n; + short aout_buf[160]; + short *aout_buf_p; + + //sf_write_short(opts->wav_out_raw, aout_buf, 160); + + //only write if actual audio, truncate silence + if (sample != 0) + { + sf_write_short(opts->wav_out_raw, &sample, 2); //2 to match pulseaudio input sample read + } + +} + void playSynthesizedVoice (dsd_opts * opts, dsd_state * state) { @@ -396,22 +454,6 @@ playSynthesizedVoice (dsd_opts * opts, dsd_state * state) state->audio_out_idx = 0; } - //most likely don't need this seperation anymore with L and R, just push it out without any condional checks - /* - if(state->currentslot == 0 && opts->audio_in_type != 3 && opts->dmr_stereo == 1) - { - pa_simple_write(opts->pulse_digi_dev_out, (state->audio_out_buf_p - state->audio_out_idx), (state->audio_out_idx * 2), NULL); //Yay! It works. - state->audio_out_idx = 0; - } - - //if input type is rtl dongle or no dmr stereo...do I need it this way still? - if (opts->audio_in_type == 3 || opts->dmr_stereo == 0) - { - pa_simple_write(opts->pulse_digi_dev_out, (state->audio_out_buf_p - state->audio_out_idx), (state->audio_out_idx * 2), NULL); //Yay! It works. - state->audio_out_idx = 0; - } - */ - } @@ -443,14 +485,6 @@ playSynthesizedVoiceR (dsd_opts * opts, dsd_state * state) pa_simple_write(opts->pulse_digi_dev_outR, (state->audio_out_buf_pR - state->audio_out_idxR), (state->audio_out_idxR * 2), NULL); //Yay! It works. state->audio_out_idxR = 0; } - /* - //most likely don't need this seperation anymore with L and R, just push it out without any condional checks - if(opts->dmr_stereo == 1) //state->currentslot == 1 && opts->audio_in_type != 3 && opts->dmr_stereo == 1 - { - pa_simple_write(opts->pulse_digi_dev_outR, (state->audio_out_buf_pR - state->audio_out_idxR), (state->audio_out_idxR * 2), NULL); //Yay! It works. - state->audio_out_idxR = 0; - } - */ } @@ -467,17 +501,13 @@ playSynthesizedVoiceR (dsd_opts * opts, dsd_state * state) void openAudioOutDevice (dsd_opts * opts, int speed) { + //converted to handle any calls to use portaudio if(strncmp(opts->audio_out_dev, "pa:", 3) == 0) { - opts->audio_out_type = 2; -#ifdef USE_PORTAUDIO - int err = getPADevice(opts->audio_out_dev, 0, &opts->audio_out_pa_stream); - if(err != 0) - exit(err); -#else - fprintf (stderr,"Error, Portaudio support not compiled.\n"); - exit(1); -#endif + opts->audio_out_type = 0; + fprintf (stderr,"Error, Port Audio is not supported by FME!\n"); + fprintf (stderr,"Using Pulse Audio Output Stream Instead! \n"); + sprintf (opts->audio_out_dev, "pulse"); } if(strncmp(opts->audio_in_dev, "pulse", 5) == 0) { @@ -522,25 +552,13 @@ openAudioInDevice (dsd_opts * opts) exit(1); //had this one disabled, re-enabling it now } } + //converted to handle any calls to use portaudio else if(strncmp(opts->audio_in_dev, "pa:", 2) == 0) { - opts->audio_in_type = 2; -#ifdef USE_PORTAUDIO - int err = getPADevice(opts->audio_in_dev, 1, &opts->audio_in_pa_stream); - if(err != 0) - exit(err); - - if (opts->split == 0) - { - int err = getPADevice(opts->audio_in_dev, 0, &opts->audio_out_pa_stream); - if(err != 0) - exit(err); - } - -#else - fprintf (stderr,"Error, Portaudio support not compiled.\n"); - exit(1); -#endif + opts->audio_in_type = 0; + fprintf (stderr,"Error, Port Audio is not supported by FME!\n"); + fprintf (stderr,"Using Pulse Audio Input Stream Instead! \n"); + sprintf (opts->audio_in_dev, "pulse"); } else if(strncmp(opts->audio_in_dev, "rtl", 3) == 0) { @@ -550,28 +568,32 @@ openAudioInDevice (dsd_opts * opts) { opts->audio_in_type = 0; } + //convert from opening wav files to OP25 symbol capture files since opening wav files is busted else { - struct stat stat_buf; - if (stat(opts->audio_in_dev, &stat_buf) != 0) + struct stat stat_buf; + if (stat(opts->audio_in_dev, &stat_buf) != 0) { fprintf (stderr,"Error, couldn't open %s\n", opts->audio_in_dev); exit(1); } - if (S_ISREG(stat_buf.st_mode)) + if (S_ISREG(stat_buf.st_mode)) { // is this a regular file? then process with libsndfile. //opts->pulse_digi_rate_out = 8000; //this for wav files input? - opts->audio_in_type = 1; - opts->audio_in_file_info = calloc(1, sizeof(SF_INFO)); - opts->audio_in_file_info->channels = 1; - opts->audio_in_file = sf_open(opts->audio_in_dev, SFM_READ, opts->audio_in_file_info); + // opts->audio_in_type = 1; + // opts->audio_in_file_info = calloc(1, sizeof(SF_INFO)); + // opts->audio_in_file_info->channels = 1; + // opts->audio_in_file = sf_open(opts->audio_in_dev, SFM_READ, opts->audio_in_file_info); + // + // if(opts->audio_in_file == NULL) + // { + // fprintf (stderr,"Error, couldn't open file %s\n", opts->audio_in_dev); + // exit(1); + // } - if(opts->audio_in_file == NULL) - { - fprintf (stderr,"Error, couldn't open file %s\n", opts->audio_in_dev); - exit(1); - } + opts->symbolfile = fopen(opts->audio_in_dev, "r"); + opts->audio_in_type = 4; //symbol capture bin files } else { diff --git a/src/dsd_dibit.c b/src/dsd_dibit.c index 1ef3820..bd4b261 100644 --- a/src/dsd_dibit.c +++ b/src/dsd_dibit.c @@ -376,6 +376,7 @@ static int digitize (dsd_opts* opts, dsd_state* state, int symbol) *state->dmr_payload_p = dibit; state->dmr_payload_p++; //dmr buffer end + return dibit; } } @@ -386,6 +387,19 @@ get_dibit_and_analog_signal (dsd_opts* opts, dsd_state* state, int* out_analog_s int symbol; int dibit; + // if (opts->audio_in_type == 4 && opts->frame_provoice == 1) // + // { + // //skip processing symbol as dibit and use it as is + // if (state->symbolc == 0) + // { + // symbol = 1; + // } + // if (state->symbolc == 1) + // { + // symbol = 3; + // } + // } + #ifdef TRACE_DSD unsigned int l, r; #endif @@ -402,7 +416,7 @@ get_dibit_and_analog_signal (dsd_opts* opts, dsd_state* state, int* out_analog_s r = state->debug_sample_index; #endif - // + state->sbuf[state->sidx] = symbol; if (out_analog_signal != NULL) @@ -414,6 +428,21 @@ get_dibit_and_analog_signal (dsd_opts* opts, dsd_state* state, int* out_analog_s dibit = digitize (opts, state, symbol); + //don't think this is quite right still, but should work, don't know why it doesn't + if (opts->audio_in_type == 4 && opts->frame_provoice == 1) // + { + //skip processing symbol as dibit and use it as is + dibit = state->symbolc; + } + + //symbol/dibit file capture/writing + //need this bit here to capture dibits once sync starts + if (opts->symbol_out == 1) + { + //fprintf (stderr, "%d", dibit); + fputc (dibit, opts->symbol_out_f); + } + #ifdef TRACE_DSD { float left, right; diff --git a/src/dsd_file.c b/src/dsd_file.c index 104b033..eb5c691 100644 --- a/src/dsd_file.c +++ b/src/dsd_file.c @@ -146,7 +146,7 @@ PrintAMBEData (dsd_opts * opts, dsd_state * state, char *ambe_d) //For DMR Stere err = (unsigned char) state->errs2; k = 0; - if (opts->dmr_stereo == 0) + if (opts->dmr_stereo == 0) //was 0, switched while working out des { fprintf (stderr, "\n"); } @@ -179,9 +179,9 @@ PrintAMBEData (dsd_opts * opts, dsd_state * state, char *ambe_d) //For DMR Stere } else fprintf(stderr, " err = [%X] [%X] ", state->errsR, state->errs2R); b = ambe_d[48]; - if (opts->dmr_stereo == 1) + if (opts->dmr_stereo == 1) //need to fix the printouts again { - fprintf (stderr, "\n"); + fprintf (stderr, "\n"); //temp disable while I work on DES } } @@ -460,74 +460,113 @@ openWavOutFile (dsd_opts * opts, dsd_state * state) // state->wav_out_bytes = 0; } +void openWavOutFileL (dsd_opts * opts, dsd_state * state) +{ -void -closeWavOutFile (dsd_opts * opts, dsd_state * state) + SF_INFO info; + info.samplerate = 8000; //8000 + info.channels = 1; + info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE; + //opts->wav_out_f = sf_open (opts->wav_out_file, SFM_WRITE, &info); + opts->wav_out_f = sf_open (opts->wav_out_file, SFM_RDWR, &info); //RDWR will append to file instead of overwrite file + + if (opts->wav_out_f == NULL) + { + fprintf (stderr,"Error - could not open wav output file %s\n", opts->wav_out_file); + return; + } + +// state->wav_out_bytes = 0; + +} + +void openWavOutFileR (dsd_opts * opts, dsd_state * state) +{ + + SF_INFO info; + info.samplerate = 8000; //8000 + info.channels = 1; + info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE; + //opts->wav_out_f = sf_open (opts->wav_out_file, SFM_WRITE, &info); + opts->wav_out_fR = sf_open (opts->wav_out_fileR, SFM_RDWR, &info); //RDWR will append to file instead of overwrite file + + if (opts->wav_out_f == NULL) + { + fprintf (stderr,"Error - could not open wav output file %s\n", opts->wav_out_fileR); + return; + } + +// state->wav_out_bytes = 0; + +} + +void openWavOutFileRaw (dsd_opts * opts, dsd_state * state) +{ + + SF_INFO info; + info.samplerate = 48000; //8000 + info.channels = 1; + info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE; + //opts->wav_out_f = sf_open (opts->wav_out_file, SFM_WRITE, &info); + //opts->wav_out_f = sf_open (opts->wav_out_file, SFM_RDWR, &info); //RDWR will append to file instead of overwrite file + opts->wav_out_raw = sf_open (opts->wav_out_file_raw, SFM_RDWR, &info); + if (opts->wav_out_raw == NULL) + { + fprintf (stderr,"Error - could not open raw wav output file %s\n", opts->wav_out_file_raw); + return; + } + +// state->wav_out_bytes = 0; + +} + +void closeWavOutFile (dsd_opts * opts, dsd_state * state) { sf_close(opts->wav_out_f); - -/* - int length; - - if (opts->wav_out_f != NULL) - { - rewind (opts->wav_out_f); - length = state->wav_out_bytes; - - fprintf (stderr,opts->wav_out_f, "RIFF"); - // total length - fputc (((36 + length) & 0xff), opts->≈≈); - fputc ((((36 + length) >> 8) & 0xff), opts->wav_out_f); - fputc ((((36 + length) >> 16) & 0xff), opts->wav_out_f); - fputc ((((36 + length) >> 24) & 0xff), opts->wav_out_f); - - fprintf (stderr,opts->wav_out_f, "WAVE"); - fprintf (stderr,opts->wav_out_f, "fmt "); - - // length of format chunk - fputc (16, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // always 0x1 - fputc (1, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // channels - fputc (1, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // sample rate - fputc (64, opts->wav_out_f); - fputc (31, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // bytes per second - fputc (128, opts->wav_out_f); - fputc (62, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // block align - fputc (2, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // bits/sample - fputc (16, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // data chunk header - fprintf (stderr,opts->wav_out_f, "data"); - - // length of data - fputc ((length & 0xff), opts->wav_out_f); - fputc (((length >> 8) & 0xff), opts->wav_out_f); - fputc (((length >> 16) & 0xff), opts->wav_out_f); - fputc (((length >> 24) & 0xff), opts->wav_out_f); - - fflush (opts->wav_out_f); - } - */ +} + +void closeWavOutFileL (dsd_opts * opts, dsd_state * state) +{ + sf_close(opts->wav_out_f); +} + +void closeWavOutFileR (dsd_opts * opts, dsd_state * state) +{ + sf_close(opts->wav_out_fR); +} + +void closeWavOutFileRaw (dsd_opts * opts, dsd_state * state) +{ + sf_close(opts->wav_out_raw); +} + +void openSymbolOutFile (dsd_opts * opts, dsd_state * state) +{ + //Do something + opts->symbol_out_f = fopen (opts->symbol_out_file, "w"); +} + +void writeSymbolOutFile (dsd_opts * opts, dsd_state * state) +{ + //Do something + +} + +void closeSymbolOutFile (dsd_opts * opts, dsd_state * state) +{ + //Do something + if (opts->symbol_out == 1) + { + if (opts->symbol_out_file != NULL) //check first, or issuing a second fclose will crash the SOFTWARE + { + fclose(opts->symbol_out_f); //free(): double free detected in tcache 2 (this is a new one) happens when closing more than once + //noCarrier(opts, state); //free(): double free detected in tcache 2 (this is a new one) + } + + opts->symbol_out = 0; //set flag to 1 + //sprintf (opts->symbol_out_file, "fme-capture.bin"); //use fme for the symbol bin ext + //openSymbolOutFile (opts, state); + + } + } diff --git a/src/dsd_frame.c b/src/dsd_frame.c index d48dd63..b5c910c 100644 --- a/src/dsd_frame.c +++ b/src/dsd_frame.c @@ -105,6 +105,7 @@ processFrame (dsd_opts * opts, dsd_state * state) } sprintf (state->fsubtype, " VOICE "); processNXDNVoice (opts, state); + //ProcessNXDNFrame (opts, state, 0); return; } else if ((state->synctype == 16) || (state->synctype == 17)) //NXDN Data @@ -128,6 +129,7 @@ processFrame (dsd_opts * opts, dsd_state * state) } sprintf (state->fsubtype, " DATA "); processNXDNData (opts, state); + //ProcessNXDNFrame (opts, state, 0); return; } else if ((state->synctype == 6) || (state->synctype == 7)) @@ -233,6 +235,7 @@ processFrame (dsd_opts * opts, dsd_state * state) if (opts->dmr_stereo == 1) { dmrMSData (opts, state); + } } else @@ -243,6 +246,7 @@ processFrame (dsd_opts * opts, dsd_state * state) state->err_str[0] = 0; sprintf (state->slot1light, " slot1 "); sprintf (state->slot2light, " slot2 "); + state->payload_miP = 0; //zero out when switching back to data sync processDMRdata (opts, state); } //switch dmr_stereo to 0 when handling BS data frame syncs with processDMRdata @@ -251,6 +255,7 @@ processFrame (dsd_opts * opts, dsd_state * state) state->dmr_stereo = 0; //set the state to zero for handling pure data frames sprintf (state->slot1light, " slot1 "); sprintf (state->slot2light, " slot2 "); + state->payload_miP = 0; //zero out when switching back to data sync processDMRdata (opts, state); } } @@ -314,6 +319,19 @@ processFrame (dsd_opts * opts, dsd_state * state) processYSF(opts, state); return; } + //P25 P2 + else if ((state->synctype == 35) || (state->synctype == 36)) + { + //Do stuff + //fprintf(stderr, "YSF Sync! \n"); + if ((opts->mbe_out_dir[0] != 0) && (opts->mbe_out_f == NULL)) + { + //openMbeOutFile (opts, state); + } + //sprintf(state->fsubtype, " VOICE "); + processP2(opts, state); + return; + } //dPMR else if ((state->synctype == 20) || (state->synctype == 24)) { @@ -481,6 +499,12 @@ processFrame (dsd_opts * opts, dsd_state * state) state->lastp25type = 1; sprintf (state->fsubtype, " LDU1 "); state->numtdulc = 0; + if (state->payload_algid == 0x81) + { + fprintf (stderr, "\n"); + //LFSRP (state); //HERE HERE best placement? + } + processLDU1 (opts, state); } else if (strcmp (duid, "22") == 0) diff --git a/src/dsd_frame_sync.c b/src/dsd_frame_sync.c index c8fceb8..1d018dc 100644 --- a/src/dsd_frame_sync.c +++ b/src/dsd_frame_sync.c @@ -144,12 +144,15 @@ getFrameSync (dsd_opts * opts, dsd_state * state) * 32 = DMR MS Voice * 33 = DMR MS Data * 34 = DMR RC Data + * 35 = +P25 P2 + * 36 = -P25 P2 */ int i, j, t, o, dibit, sync, symbol, synctest_pos, lastt; char synctest[25]; char synctest12[13]; //dPMR + char synctest10[11]; char synctest18[19]; char synctest32[33]; char synctest20[21]; //YSF @@ -269,6 +272,22 @@ getFrameSync (dsd_opts * opts, dsd_state * state) dibit = 51; // '3' } + //this is needed to capture dibits and convert them to appropriate format for a symbol bin + if (opts->symbol_out == 1 && symbol != 0) //is 0 a valid symbol from dsd? //&& symbol != 0 + { + int csymbol = 0; + if (dibit == 49) + { + csymbol = 1; //1 + } + if (dibit == 51) + { + csymbol = 3; //3 + } + //fprintf (stderr, "%d", dibit); + fputc (csymbol, opts->symbol_out_f); + } + //digitize test for storing dibits in buffer correctly for dmr recovery if (state->dmr_payload_p > state->dmr_payload_buf + 900000) @@ -597,6 +616,52 @@ getFrameSync (dsd_opts * opts, dsd_state * state) } } //end YSF sync + //P25 P2 sync + strncpy(synctest20, (synctest_p - 19), 20); //double check make sure this is right + if(opts->frame_p25p2 == 1) //(opts->frame_ysf == 1 + { + if (0 == 0) //opts->inverted_ysf == 0 + { + if (strcmp(synctest20, P25P2_SYNC) == 0) + { + state->carrier = 1; + state->offset = synctest_pos; + state->max = ((state->max) + lmax) / 2; + state->min = ((state->min) + lmin) / 2; + fprintf (stderr, "\n+P25-P2 Sync"); + opts->inverted_ysf = 0; //should we set this here? + state->lastsynctype = 30; + if ( opts->monitor_input_audio == 1) + { + + pa_simple_flush(opts->pulse_raw_dev_out, NULL); + } + return (35); + } + } + } + if(opts->frame_p25p2 == 1) //(opts->frame_p25p2 == 1 + { + if (0 == 0) //inverted p25 + { + if (strcmp(synctest20, INV_P25P2_SYNC) == 0) + { + state->carrier = 1; + state->offset = synctest_pos; + state->max = ((state->max) + lmax) / 2; + state->min = ((state->min) + lmin) / 2; + fprintf (stderr, "\n-P25-P2 Sync"); + opts->inverted_ysf = 1; //should we set this here? + state->lastsynctype = 31; + if ( opts->monitor_input_audio == 1) + { + + pa_simple_flush(opts->pulse_raw_dev_out, NULL); + } + return (36); + } + } + } //dPMR sync strncpy(synctest, (synctest_p - 23), 24); strncpy(synctest12, (synctest_p - 11), 12); @@ -1093,6 +1158,7 @@ getFrameSync (dsd_opts * opts, dsd_state * state) } } + if ((opts->frame_nxdn96 == 1) || (opts->frame_nxdn48 == 1)) { strncpy (synctest18, (synctest_p - 17), 18); diff --git a/src/dsd_main.c b/src/dsd_main.c index 0498309..8363c04 100644 --- a/src/dsd_main.c +++ b/src/dsd_main.c @@ -43,20 +43,19 @@ int pretty_colors() #include "p25p1_heuristics.h" #include "pa_devs.h" -short int butt = 1; +short int butt = 0; char * FM_banner[9] = { - " 2022 Dove Award Winner CTRL + C twice to exit", + " ", " ██████╗ ██████╗██████╗    ███████╗███╗ ███╗███████╗", " ██╔══██╗██╔════╝██╔══██╗   ██╔════╝████╗ ████║██╔════╝", " ██║ ██║╚█████╗ ██║ ██║   █████╗ ██╔████╔██║█████╗ ", " ██║ ██║ ╚═══██╗██║ ██║   ██╔══╝ ██║╚██╔╝██║██╔══╝ ", " ██████╔╝██████╔╝██████╔╝   ██║ ██║ ╚═╝ ██║███████╗", " ╚═════╝ ╚═════╝ ╚═════╝    ╚═╝ ╚═╝ ╚═╝╚══════╝", - "https://github.com/lwvmobile/dsd-fme/tree/pulseaudio " + " https://github.com/lwvmobile/dsd-fme/tree/pulseaudio " }; - int comp (const void *a, const void *b) { @@ -74,6 +73,7 @@ struct stat st = {0}; void noCarrier (dsd_opts * opts, dsd_state * state) { + // state->testcounter = 0; state->dibit_buf_p = state->dibit_buf + 200; memset (state->dibit_buf, 0, sizeof (int) * 200); //dmr buffer @@ -133,8 +133,6 @@ noCarrier (dsd_opts * opts, dsd_state * state) mbe_initMbeParms (state->cur_mp2, state->prev_mp2, state->prev_mp_enhanced2); state->dmr_ms_mode = 0; - state->dropL = 256; //drop it like its hot - state->dropR = 256; //drop it like its hot //not sure if desirable here or not just yet, may need to disable a few of these state->payload_mi = 0; @@ -145,12 +143,46 @@ noCarrier (dsd_opts * opts, dsd_state * state) state->payload_algidR = 0; state->payload_keyid = 0; state->payload_keyidR = 0; - //just for a test - if (state->M == 0) + + state->payload_miN = 0; + state->p25vc = 0; + state->payload_miP = 0; + + //initialize dmr data header source + state->dmr_lrrp_source[0] = 0; + state->dmr_lrrp_source[1] = 0; + + //initialize 12 rate superframe + for (short i = 0; i < 84; i++) { - state->K = 0; + state->dmr_12_rate_sf[0][i] = 0; + state->dmr_12_rate_sf[1][i] = 0; } + //initialize 34 rate superframe + for (short i = 0; i < 96; i++) + { + state->dmr_34_rate_sf[0][i] = 0; + state->dmr_34_rate_sf[1][i] = 0; + } + + //initialize data header bits + state->data_header_blocks[0] = 1; //initialize with 1, otherwise we may end up segfaulting when no/bad data header + state->data_header_blocks[1] = 1; //when trying to fill the superframe and 0-1 blocks give us an overflow + state->data_header_padding[0] = 0; + state->data_header_padding[1] = 0; + state->data_header_format[0] = 0; + state->data_header_format[1] = 0; + state->data_header_sap[0] = 0; + state->data_header_sap[1] = 0; + state->data_block_counter[0] = 0; + state->data_block_counter[1] = 0; + state->data_p_head[0] = 0; + state->data_p_head[1] = 0; + + state->dmr_so = 0; + state->dmr_soR = 0; + } void @@ -172,15 +204,15 @@ initOpts (dsd_opts * opts) //sprintf (opts->audio_in_dev, "/dev/audio"); sprintf (opts->audio_in_dev, "pulse"); opts->audio_in_fd = -1; -#ifdef USE_PORTAUDIO - opts->audio_in_pa_stream = NULL; -#endif +// #ifdef USE_PORTAUDIO +// opts->audio_in_pa_stream = NULL; +// #endif //sprintf (opts->audio_out_dev, "/dev/audio"); sprintf (opts->audio_out_dev, "pulse"); opts->audio_out_fd = -1; -#ifdef USE_PORTAUDIO - opts->audio_out_pa_stream = NULL; -#endif +// #ifdef USE_PORTAUDIO +// opts->audio_out_pa_stream = NULL; +// #endif opts->split = 0; opts->playoffset = 0; opts->playoffsetR = 0; @@ -192,7 +224,16 @@ initOpts (dsd_opts * opts) opts->audio_gainR = 0; opts->audio_out = 1; opts->wav_out_file[0] = 0; + opts->wav_out_fileR[0] = 0; + opts->wav_out_file_raw[0] = 0; + opts->symbol_out_file[0] = 0; + opts->symbol_out_f = NULL; + opts->symbol_out = 0; opts->wav_out_f = NULL; + opts->wav_out_fR = NULL; + opts->wav_out_raw = NULL; + + opts->dmr_stereo_wav = 0; //flag for per call dmr stereo wav recordings //opts->wav_out_fd = -1; opts->serial_baud = 115200; sprintf (opts->serial_dev, "/dev/ttyUSB0"); @@ -200,6 +241,7 @@ initOpts (dsd_opts * opts) opts->frame_dstar = 1; opts->frame_x2tdma = 1; opts->frame_p25p1 = 1; + opts->frame_p25p2 = 0; opts->frame_nxdn48 = 0; opts->frame_nxdn96 = 0; opts->frame_dmr = 1; @@ -225,10 +267,11 @@ initOpts (dsd_opts * opts) opts->rtl_udp_port = 6020; //set UDP port for RTL remote opts->rtl_bandwidth = 12; //changed recommended default to 12, 24 for ProVoice opts->rtlsdr_ppm_error = 0; //initialize ppm with 0 value; bug reported by N. + opts->rtl_started = 0; opts->pulse_raw_rate_in = 48000; - opts->pulse_raw_rate_out = 48000; //doing tests with 2 channels at 24000 for 48000 audio default in pulse + opts->pulse_raw_rate_out = 48000; // opts->pulse_digi_rate_in = 48000; - opts->pulse_digi_rate_out = 48000; //need to copy this to rtl type in and change rate out to 8000 + opts->pulse_digi_rate_out = 8000; // reverted to 8/1, crisper sound, dmr stereo will switch to 24/2 opts->pulse_raw_in_channels = 1; opts->pulse_raw_out_channels = 1; opts->pulse_digi_in_channels = 1; //2 @@ -237,9 +280,9 @@ initOpts (dsd_opts * opts) sprintf (opts->output_name, "Auto Detect"); opts->pulse_flush = 1; //set 0 to flush, 1 for flushed opts->use_ncurses_terminal = 0; + opts->ncurses_compact = 0; + opts->ncurses_history = 1; opts->payload = 0; - - opts->EncryptionMode = MODE_UNENCRYPTED; opts->inverted_dpmr = 0; opts->dmr_stereo = 0; opts->aggressive_framesync = 1; //more aggressive to combat wonk wonk voice decoding @@ -247,6 +290,8 @@ initOpts (dsd_opts * opts) opts->audio_in_type = 0; //this was never initialized, causes issues on rPI 64 (bullseye) if not initialized opts->audio_out_type = 0; //this was never initialized, causes issues on rPI 64 (bullseye) if not initialized + opts->lrrp_file_output = 0; + } @@ -255,6 +300,7 @@ initState (dsd_state * state) { int i, j; + // state->testcounter = 0; state->last_dibit = 0; state->dibit_buf = malloc (sizeof (int) * 1000000); state->dibit_buf_p = state->dibit_buf + 200; @@ -313,6 +359,7 @@ initState (dsd_state * state) sprintf (state->fsubtype, " "); sprintf (state->ftype, " "); state->symbolcnt = 0; + state->symbolc = 0; // state->rf_mod = 0; state->numflips = 0; state->lastsynctype = -1; @@ -377,6 +424,7 @@ initState (dsd_state * state) state->nxdn_cipher_type = 0; state->nxdn_key = 0; sprintf (state->nxdn_call_type, " "); + state->payload_miN = 0; state->dpmr_color_code = -1; state->dpmr_caller_id = 0; @@ -419,7 +467,7 @@ initState (dsd_state * state) state->K = 0; state->R = 0; - state->M = 0; + state->dmr_stereo = 0; state->dmrburstL = 17; //initialize at higher value than possible state->dmrburstR = 17; //17 in char array is set for ERR @@ -429,11 +477,46 @@ initState (dsd_state * state) state->dmr_fidR = 0; state->dmr_ms_mode = 0; - state->dropL = 256; //drop it like its hot - state->dropR = 256; //drop it like its hot + state->p25vc = 0; + + state->payload_miP = 0; memset(state->dstarradioheader, 0, 41); + //initialize dmr data header source + state->dmr_lrrp_source[0] = 0; + state->dmr_lrrp_source[1] = 0; + + //initialize 12 rate superframe + for (short i = 0; i < 84; i++) + { + state->dmr_12_rate_sf[0][i] = 0; + state->dmr_12_rate_sf[1][i] = 0; + } + + //initialize 34 rate superframe + for (short i = 0; i < 96; i++) + { + state->dmr_34_rate_sf[0][i] = 0; + state->dmr_34_rate_sf[1][i] = 0; + } + + //initialize data header bits + state->data_header_blocks[0] = 1; //initialize with 1, otherwise we may end up segfaulting when no/bad data header + state->data_header_blocks[1] = 1; //when trying to fill the superframe and 0-1 blocks give us an overflow + state->data_header_padding[0] = 0; + state->data_header_padding[1] = 0; + state->data_header_format[0] = 0; + state->data_header_format[1] = 0; + state->data_header_sap[0] = 0; + state->data_header_sap[1] = 0; + state->data_block_counter[0] = 0; + state->data_block_counter[1] = 0; + state->data_p_head[0] = 0; + state->data_p_head[1] = 0; + + state->menuopen = 0; //is the ncurses menu open, if so, don't process frame sync + #ifdef TRACE_DSD state->debug_sample_index = 0; state->debug_label_file = NULL; @@ -447,14 +530,15 @@ initState (dsd_state * state) void usage () { - //printf ( "Github Build Version: %s \n", GIT_TAG); - //printf ( "2022 Dove Award Recipient"); //Thanks, Scott + printf ("\n"); - printf ("Usage: dsd [options] Live scanner mode\n"); - printf (" or: dsd [options] -r Read/Play saved mbe data from file(s)\n"); - printf (" or: dsd -h Show help\n"); + printf ("Usage: dsd-fme [options] Live scanner mode\n"); + printf (" or: dsd-fme [options] -r Read/Play saved mbe data from file(s)\n"); + printf (" or: dsd-fme -h Show help\n"); printf ("\n"); printf ("Display Options:\n"); + printf (" -N Use NCurses Terminal\n"); + printf (" -use with 2> log.txt at end of command\n"); printf (" -e Show Frame Info and errorbars (default)\n"); printf (" -pe Show P25 encryption sync bits\n"); printf (" -pl Show P25 link control bits\n"); @@ -474,7 +558,7 @@ usage () printf (" -g Audio output gain (default = 0 = auto, disable = -1)\n"); printf (" -w Output synthesized speech to a .wav file\n"); //printf (" -a Display port audio devices\n"); - printf (" -W Monitor Source Audio When No Sync Detected (WIP!)\n"); + //printf (" -W Monitor Source Audio When No Sync Detected (WIP!)\n"); printf ("\n"); printf ("RTL-SDR options:\n"); printf (" -c RTL-SDR Frequency\n"); @@ -495,43 +579,38 @@ usage () printf (" -fa Auto-detect frame type (default)\n"); printf (" -f1 Decode only P25 Phase 1\n"); printf (" -fd Decode only D-STAR\n"); - printf (" -fr Decode only DMR/MOTOTRBO\n"); + printf (" -fr Decode only DMR\n"); printf (" -fx Decode only X2-TDMA\n"); printf (" -fi Decode only NXDN48* (6.25 kHz) / IDAS*\n"); printf (" -fn Decode only NXDN96* (12.5 kHz)\n"); printf (" -fp Decode only ProVoice*\n"); printf (" -fm Decode only dPMR*\n"); - printf (" -l Disable DMR/MOTOTRBO and NXDN input filtering\n"); - printf (" -ma Auto-select modulation optimizations (default)\n"); - printf (" -mc Use only C4FM modulation optimizations\n"); - printf (" -mg Use only GFSK modulation optimizations\n"); - printf (" -mq Use only QPSK modulation optimizations\n"); + printf (" -l Disable DMR and NXDN input filtering\n"); printf (" -pu Unmute Encrypted P25\n"); printf (" -u Unvoiced speech quality (default=3)\n"); printf (" -xx Expect non-inverted X2-TDMA signal\n"); - printf (" -xr Expect inverted DMR/MOTOTRBO signal\n"); + printf (" -xr Expect inverted DMR signal\n"); printf (" -xd Expect inverted ICOM dPMR signal\n"); //still need to do this printf ("\n"); printf (" * denotes frame types that cannot be auto-detected.\n"); printf ("\n"); - printf ("Advanced decoder options:\n"); - printf (" -A QPSK modulation auto detection threshold (default=26)\n"); + printf ("Advanced Decoder options:\n"); + // printf (" -A QPSK modulation auto detection threshold (default=26)\n"); printf (" -S Symbol buffer size for QPSK decision point tracking\n"); printf (" (default=36)\n"); printf (" -M Min/Max buffer size for QPSK decision point tracking\n"); printf (" (default=15)\n"); - printf (" -n Reset P25 Heuristics and initState variables on mixed signal decoding\n"); - printf (" Helps when decoding mixed signal types (P25P1) at same time\n"); - printf (" (WiP! May Cause Slow Memory Leak or System Hang - Experimental)\n"); + // printf (" -n Reset P25 Heuristics and initState variables on mixed signal decoding\n"); + // printf (" Helps when decoding mixed signal types (P25P1) at same time\n"); + // printf (" (WiP! May Cause Slow Memory Leak or System Hang - Experimental)\n"); printf (" -T Enable DMR TDMA Stereo Voice (Two Slot Dual Voices)\n"); printf (" This feature will open two streams for slot 1 voice and slot 2 voice\n"); printf (" May Cause Skipping or sync issues if bad signal/errors\n"); printf (" -F Enable DMR TDMA Stereo Passive Frame Sync\n"); printf (" This feature will attempt to resync less often due to excessive voice errors\n"); printf (" Use if skipping occurs, but may cause wonky audio due to loss of good sync\n"); - printf (" -Z Log MBE Payload to console\n"); + printf (" -Z Log MBE/Frame Payloads to console\n"); printf ("\n"); - printf ("Report bugs to: https://github.com/lwvmobile/dsd-fme/issues \n"); exit (0); } @@ -539,8 +618,6 @@ void liveScanner (dsd_opts * opts, dsd_state * state) { -//still need this section mostly due the the crackling on the rtl dongle when upsampled -//probably need to dig a little deeper, maybe inlvl releated? if (opts->audio_in_type == 1) { opts->pulse_digi_rate_out = 8000; //revert to 8K/1 for STDIN input, sometimes crackles when upsampling @@ -557,19 +634,6 @@ if (opts->audio_in_type == 1) } -#ifdef USE_PORTAUDIO - if(opts->audio_in_type == 2) - { - PaError err = Pa_StartStream( opts->audio_in_pa_stream ); - if( err != paNoError ) - { - //fprintf (stderr, "An error occured while starting the portaudio input stream\n" ); - //fprintf (stderr, "Error number: %d\n", err ); - //fprintf (stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - return; - } - } -#endif #ifdef USE_RTLSDR if(opts->audio_in_type == 3) { @@ -588,28 +652,38 @@ if (opts->audio_in_type == 1) opts->pulse_raw_out_channels = 1; open_rtlsdr_stream(opts); + opts->rtl_started = 1; //set here so ncurses terminal doesn't attempt to open it again } #endif + +if (opts->use_ncurses_terminal == 1) +{ + ncursesOpen(opts, state); +} + if (opts->audio_in_type == 0) { openPulseInput(opts); } + if (opts->audio_out_type == 0) { openPulseOutput(opts); } - while (1) { noCarrier (opts, state); + if (state->menuopen == 0) + { + state->synctype = getFrameSync (opts, state); + // recalibrate center/umid/lmid + state->center = ((state->max) + (state->min)) / 2; + state->umid = (((state->max) - state->center) * 5 / 8) + state->center; + state->lmid = (((state->min) - state->center) * 5 / 8) + state->center; + } - state->synctype = getFrameSync (opts, state); - // recalibrate center/umid/lmid - state->center = ((state->max) + (state->min)) / 2; - state->umid = (((state->max) - state->center) * 5 / 8) + state->center; - state->lmid = (((state->min) - state->center) * 5 / 8) + state->center; while (state->synctype != -1) @@ -620,16 +694,24 @@ if (opts->audio_out_type == 0) state->debug_prefix = 'S'; #endif - state->synctype = getFrameSync (opts, state); + // state->synctype = getFrameSync (opts, state); #ifdef TRACE_DSD state->debug_prefix = '\0'; #endif - // recalibrate center/umid/lmid - state->center = ((state->max) + (state->min)) / 2; - state->umid = (((state->max) - state->center) * 5 / 8) + state->center; - state->lmid = (((state->min) - state->center) * 5 / 8) + state->center; + // // recalibrate center/umid/lmid + // state->center = ((state->max) + (state->min)) / 2; + // state->umid = (((state->max) - state->center) * 5 / 8) + state->center; + // state->lmid = (((state->min) - state->center) * 5 / 8) + state->center; + if (state->menuopen == 0) + { + state->synctype = getFrameSync (opts, state); + // recalibrate center/umid/lmid + state->center = ((state->max) + (state->min)) / 2; + state->umid = (((state->max) - state->center) * 5 / 8) + state->center; + state->lmid = (((state->min) - state->center) * 5 / 8) + state->center; + } } } } @@ -639,59 +721,33 @@ cleanupAndExit (dsd_opts * opts, dsd_state * state) { noCarrier (opts, state); if (opts->wav_out_f != NULL) - { - closeWavOutFile (opts, state); - } - -#ifdef USE_PORTAUDIO - if((opts->audio_in_type == 2) || (opts->audio_out_type == 2)) - { - fprintf (stderr,"Terminating portaudio.\n"); - PaError err = paNoError; - if(opts->audio_in_pa_stream != NULL) - { - err = Pa_CloseStream( opts->audio_in_pa_stream ); - if( err != paNoError ) - { - //fprintf (stderr, "An error occured while closing the portaudio input stream\n" ); - //fprintf (stderr, "Error number: %d\n", err ); - //fprintf (stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - } - } - if(opts->audio_out_pa_stream != NULL) - { - err = Pa_IsStreamActive( opts->audio_out_pa_stream ); - if(err == 1) - err = Pa_StopStream( opts->audio_out_pa_stream ); - if( err != paNoError ) - { - //fprintf (stderr, "An error occured while closing the portaudio output stream\n" ); - //fprintf (stderr, "Error number: %d\n", err ); - //fprintf (stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - } - err = Pa_CloseStream( opts->audio_out_pa_stream ); - if( err != paNoError ) - { - //fprintf (stderr, "An error occured while closing the portaudio output stream\n" ); - //fprintf (stderr, "Error number: %d\n", err ); - //fprintf (stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - } - } - err = Pa_Terminate(); - if( err != paNoError ) - { - //fprintf (stderr, "An error occured while terminating portaudio\n" ); - //fprintf (stderr, "Error number: %d\n", err ); - //fprintf (stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - } - } -#endif + { + closeWavOutFile (opts, state); + } + if (opts->wav_out_raw != NULL) + { + closeWavOutFileRaw (opts, state); + } + if (opts->dmr_stereo_wav == 1) + { + closeWavOutFileL (opts, state); + closeWavOutFileR (opts, state); + } + if (opts->symbol_out == 1) + { + closeSymbolOutFile (opts, state); + } + if (opts->mbe_out_f != NULL) + { + closeMbeOutFile (opts, state); + } #ifdef USE_RTLSDR if(opts->audio_in_type == 3) { // TODO: cleanup demod threads - cleanup_rtlsdr_stream(); + //temp disable to see if this corrects issues with closing + //cleanup_rtlsdr_stream(); } #endif @@ -775,15 +831,15 @@ main (int argc, char **argv) char versionstr[25]; mbe_printVersion (versionstr); - - for (short int i = 0; i < 7; i++) { - fprintf (stderr,"%s%s \n", FM_banner[i], KCYN); //cyan/blue text + fprintf (stderr," Digital Speech Decoder: Florida Man Edition\n"); + for (short int i = 1; i < 7; i++) { + //fprintf (stderr,"%s%s \n", FM_banner[i], KGRN); //cyan/blue text + fprintf (stderr,"%s\n", FM_banner[i]); //cyan/blue tex } - fprintf (stderr,"%s", KNRM); //change back to normal - fprintf (stderr, "%s \n", FM_banner[7]); - fprintf (stderr,"Digital Speech Decoder: Florida Man Edition\n"); + //fprintf (stderr,"%s", KNRM); //change back to normal + fprintf (stderr, "Github Build Version: %s \n", GIT_TAG); - fprintf (stderr,"mbelib version %s\n", versionstr); + fprintf (stderr,"MBElib version %s\n", versionstr); initOpts (&opts); initState (&state); @@ -793,7 +849,7 @@ main (int argc, char **argv) exitflag = 0; signal (SIGINT, sigfun); - while ((c = getopt (argc, argv, "haep:P:qstv:z:i:o:d:c:g:nw:B:C:R:f:m:u:x:A:S:M:G:D:L:V:U:Y:K:NWrlZTF")) != -1) + while ((c = getopt (argc, argv, "haep:P:qstv:z:i:o:d:c:g:nw:B:C:R:f:m:u:x:A:S:M:G:D:L:V:U:Y:K:NQWrlZTF")) != -1) { opterr = 0; switch (c) @@ -802,7 +858,7 @@ main (int argc, char **argv) usage (); exit (0); case 'a': - printPortAudioDevices(); + //printPortAudioDevices(); exit(0); case 'e': opts.errorbars = 1; @@ -832,7 +888,8 @@ main (int argc, char **argv) } break; case 'P': - sscanf (optarg, "%i", &opts.rtlsdr_ppm_error); + //can't handle negative numbers? + //sscanf (optarg, "%d", &opts.rtlsdr_ppm_error); break; case 'q': opts.errorbars = 0; @@ -858,17 +915,12 @@ main (int argc, char **argv) case 'K': sscanf (optarg, "%lld", &state.K); - state.M = 1; if (state.K > 256) { state.K = 256; } break; - case 'R': - sscanf (optarg, "%lld", &state.R); - break; - case 'G': //Set rtl device gain sscanf (optarg, "%d", &opts.rtl_gain_value); //multiple value by ten to make it consitent with the way rtl_fm really works break; @@ -877,11 +929,11 @@ main (int argc, char **argv) sscanf (optarg, "%d", &opts.rtl_squelch_level); //set squelch by user to prevent false positives on NXDN and others break; - case 'V': //Set rtl squelch level + case 'V': //Set rtl voltage level sscanf (optarg, "%d", &opts.rtl_volume_multiplier); //set 'volume' multiplier for rtl-sdr samples break; - case 'U': //Set rtl squelch level + case 'U': //Set rtl udp remote port sscanf (optarg, "%d", &opts.rtl_udp_port); //set udp port number for RTL remote break; @@ -893,23 +945,20 @@ main (int argc, char **argv) sscanf (optarg, "%d", &opts.rtl_bandwidth); break; - case 'W': //monitor_input_audio if no sync - opts.monitor_input_audio = 1; - fprintf (stderr, "%s", KRED); - fprintf (stderr,"Monitoring Source Audio when carrier present and No Sync Detected.\n"); - fprintf (stderr," - May cause Pulse Audio Server to crash on some systems.\n"); - fprintf (stderr, "%s", KNRM); - break; - case 'N': opts.use_ncurses_terminal = 1; fprintf (stderr,"Enabling NCurses Terminal.\n"); - fprintf (stderr," - may need to issue 'reset' command in terminal after use\n"); + //fprintf (stderr," - may need to issue 'reset' command in terminal after use\n"); break; case 'Z': opts.payload = 1; - fprintf (stderr,"Logging MBE Payload to console\n"); + fprintf (stderr,"Logging Frame Payload to console\n"); + break; + + case 'Q': + opts.lrrp_file_output = 1; + fprintf (stderr,"Logging LRRP data to ~/lrrp.txt \n"); break; case 'T': @@ -917,16 +966,18 @@ main (int argc, char **argv) state.dmr_stereo = 1; //this values toggles on and off depending on voice or data handling opts.pulse_digi_rate_out = 24000; opts.pulse_digi_out_channels = 2; - fprintf (stderr, "%s", KRED); + sprintf (opts.output_name, "DMR STEREO"); + fprintf (stderr, "%s", KYEL); fprintf (stderr,"DMR Stereo Sync and Functionality Enabled.\n"); - fprintf (stderr,"DMR Stereo will disable WAV and MBE file saving!\n"); + fprintf (stderr,"DMR Stereo will disable MBE file saving!\n"); + fprintf (stderr,"DMR Stereo per call WAV file can be enabled in the NCurses Terminal!\n"); fprintf (stderr,"Also consider using -F if playback is too choppy!\n"); fprintf (stderr, "%s", KNRM); break; case 'F': opts.aggressive_framesync = 0; - fprintf (stderr, "%s", KRED); + fprintf (stderr, "%s", KYEL); fprintf (stderr,"DMR Stereo Aggressive Resync Disabled!\n"); fprintf (stderr, "%s", KNRM); break; @@ -984,32 +1035,28 @@ main (int argc, char **argv) state.aout_gainR = opts.audio_gain; } break; - case 'n': - opts.reset_state = 1; - fprintf (stderr, "%s", KRED); - fprintf (stderr,"Enabling Automatic Reset of P25 states\n"); - //fprintf (stderr," -Helps with multiple signal type decoding\n"); - //fprintf (stderr," -(WiP! May cause slow memory leak)\n"); - fprintf (stderr," -(Disabled until memory leak issues can be resolved!)\n"); - fprintf (stderr, "%s", KNRM); - break; + case 'w': strncpy(opts.wav_out_file, optarg, 1023); opts.wav_out_file[1023] = '\0'; - fprintf (stderr,"Writing + Appending audio to file %s\n", opts.wav_out_file); + fprintf (stderr,"Writing + Appending decoded audio to file %s\n", opts.wav_out_file); openWavOutFile (&opts, &state); break; + case 'B': sscanf (optarg, "%d", &opts.serial_baud); break; + case 'C': strncpy(opts.serial_dev, optarg, 1023); opts.serial_dev[1023] = '\0'; break; - //case 'R': - // sscanf (optarg, "%d", &opts.resume); - // fprintf (stderr,"Enabling scan resume after %i TDULC frames\n", opts.resume); - // break; + + case 'R': + sscanf (optarg, "%d", &opts.resume); + fprintf (stderr,"Enabling scan resume after %i TDULC frames\n", opts.resume); + break; + case 'f': if (optarg[0] == 'a') { @@ -1017,7 +1064,7 @@ main (int argc, char **argv) opts.frame_x2tdma = 1; opts.frame_p25p1 = 1; opts.frame_nxdn48 = 0; - opts.frame_nxdn96 = 0; //causes false positives, leave on 0 + opts.frame_nxdn96 = 0; opts.frame_dmr = 1; opts.frame_dpmr = 0; opts.frame_provoice = 0; @@ -1033,6 +1080,7 @@ main (int argc, char **argv) opts.frame_dmr = 0; opts.frame_dpmr = 0; opts.frame_provoice = 0; + state.rf_mod = 0; sprintf (opts.output_name, "D-STAR"); fprintf (stderr,"Decoding only D-STAR frames.\n"); } @@ -1104,7 +1152,6 @@ main (int argc, char **argv) opts.mod_gfsk = 0; state.rf_mod = 0; sprintf (opts.output_name, "NXDN48"); - //opts.symboltiming = 2400; //NXDN48 uses 2400 symbol rate fprintf (stderr,"Setting symbol rate to 2400 / second\n"); fprintf (stderr,"Decoding only NXDN 4800 baud frames.\n"); } @@ -1113,23 +1160,44 @@ main (int argc, char **argv) opts.frame_dstar = 0; opts.frame_x2tdma = 0; opts.frame_p25p1 = 0; + opts.frame_p25p2 = 0; opts.frame_nxdn48 = 0; opts.frame_nxdn96 = 0; opts.frame_dmr = 0; opts.frame_dpmr = 0; opts.frame_provoice = 0; opts.frame_ysf = 1; - state.samplesPerSymbol = 10; - //state.symbolCenter = 10; + state.samplesPerSymbol = 20; //10 + state.symbolCenter = 10; opts.mod_c4fm = 1; opts.mod_qpsk = 0; opts.mod_gfsk = 0; state.rf_mod = 0; sprintf (opts.output_name, "YSF"); - //opts.symboltiming = 2400; //NXDN48 uses 2400 symbol rate fprintf (stderr,"Setting symbol rate to 2400 / second\n"); fprintf (stderr,"Decoding only YSF frames.\nNot working yet!\n"); } + else if (optarg[0] == '2') + { + opts.frame_dstar = 0; + opts.frame_x2tdma = 0; + opts.frame_p25p1 = 0; + opts.frame_p25p2 = 1; + opts.frame_nxdn48 = 0; + opts.frame_nxdn96 = 0; + opts.frame_dmr = 0; + opts.frame_dpmr = 0; + opts.frame_provoice = 0; + opts.frame_ysf = 0; + state.samplesPerSymbol = 20; //10 + state.symbolCenter = 10; + opts.mod_c4fm = 0; + opts.mod_qpsk = 1; + opts.mod_gfsk = 0; + state.rf_mod = 0; + sprintf (opts.output_name, "P25-P2"); + fprintf (stderr,"Decoding P25-P2 frames.\nNot working yet!\n"); + } else if (optarg[0] == 'n') { opts.frame_dstar = 0; @@ -1161,9 +1229,9 @@ main (int argc, char **argv) opts.mod_qpsk = 0; opts.mod_gfsk = 0; // state.rf_mod = 0; // - sprintf (opts.output_name, "DMR/MOTOTRBO"); + sprintf (opts.output_name, "DMR LEH"); //fprintf(stderr, "Notice: DMR cannot autodetect polarity. \n Use -xr option if Inverted Signal expected.\n"); - fprintf (stderr,"Decoding only DMR/MOTOTRBO frames.\n"); + fprintf (stderr,"Decoding only DMR frames.\n"); } else if (optarg[0] == 'm') { @@ -1242,7 +1310,7 @@ main (int argc, char **argv) else if (optarg[0] == 'r') { opts.inverted_dmr = 1; - fprintf (stderr,"Expecting inverted DMR/MOTOTRBO signals.\n"); + fprintf (stderr,"Expecting inverted DMR signals.\n"); } else if (optarg[0] == 'd') { @@ -1253,7 +1321,6 @@ main (int argc, char **argv) case 'A': sscanf (optarg, "%i", &opts.mod_threshold); fprintf (stderr,"Setting C4FM/QPSK auto detection threshold to %i\n", opts.mod_threshold); - break; case 'S': sscanf (optarg, "%i", &opts.ssize); if (opts.ssize > 128) @@ -1294,11 +1361,6 @@ main (int argc, char **argv) } } - if (opts.use_ncurses_terminal == 1) - { - ncursesOpen(); - } - if (opts.resume > 0) { openSerial (&opts, &state); @@ -1314,23 +1376,7 @@ main (int argc, char **argv) opts.audio_out_type == 0; } -#ifdef USE_PORTAUDIO - if((strncmp(opts.audio_in_dev, "pa:", 3) == 0) - || (strncmp(opts.audio_out_dev, "pa:", 3) == 0)) - { - fprintf (stderr,"Initializing portaudio.\n"); - PaError err = Pa_Initialize(); - if( err != paNoError ) - { - //fprintf (stderr, "An error occured while initializing portaudio\n" ); - //fprintf (stderr, "Error number: %d\n", err ); - //fprintf (stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - exit(err); - } - } -#endif - - if (opts.playfiles == 1) + if (opts.playfiles == 1) { opts.split = 1; opts.playoffset = 0; @@ -1345,7 +1391,7 @@ main (int argc, char **argv) openAudioOutDevice (&opts, SAMPLE_RATE_OUT); } } - else if (strcmp (opts.audio_in_dev, opts.audio_out_dev) != 0) + else if (strcmp (opts.audio_in_dev, opts.audio_out_dev) != 0) { opts.split = 1; opts.playoffset = 0; @@ -1368,16 +1414,15 @@ main (int argc, char **argv) else { opts.split = 0; - opts.playoffset = 25; // 38 - opts.playoffsetR = 25; // 38 + opts.playoffset = 25; + opts.playoffsetR = 25; opts.delay = 0; - openAudioInDevice (&opts); //disabled all four instances of openAudio devices, in and out for now + openAudioInDevice (&opts); opts.audio_out_fd = opts.audio_in_fd; } if (opts.playfiles == 1) { - //need set to 8000/1 for amb/imb playback, upsampling seems to cause random crackling opts.pulse_digi_rate_out = 8000; opts.pulse_digi_out_channels = 1; openPulseOutput(&opts); //need to open it up for output @@ -1389,9 +1434,6 @@ main (int argc, char **argv) liveScanner (&opts, &state); } - if (opts.use_ncurses_terminal == 1){ - //ncursesClose (); - } cleanupAndExit (&opts, &state); return (0); diff --git a/src/dsd_mbe.c b/src/dsd_mbe.c index 16cc63b..a0eb63f 100644 --- a/src/dsd_mbe.c +++ b/src/dsd_mbe.c @@ -17,10 +17,6 @@ #include "dsd.h" -// -//C -// - void playMbeFiles (dsd_opts * opts, dsd_state * state, int argc, char **argv) { @@ -117,8 +113,7 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a }; // - - int i; + int i; char imbe_d[88]; char ambe_d[49]; char ambe_d_str[50]; @@ -141,20 +136,44 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a { // 0 +P25p1 // 1 -P25p1 + state->errs = mbe_eccImbe7200x4400C0 (imbe_fr); + state->errs2 = state->errs; + mbe_demodulateImbe7200x4400Data (imbe_fr); + state->errs2 += mbe_eccImbe7200x4400Data (imbe_fr, imbe_d); - mbe_processImbe7200x4400Framef (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, imbe_fr, imbe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); + + + mbe_processImbe4400Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, + imbe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); + + //mbe_processImbe7200x4400Framef (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, imbe_fr, imbe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); if (opts->payload == 1) { PrintIMBEData (opts, state, imbe_d); } + + //increment vc counter by one. + state->p25vc++; + if (opts->mbe_out_f != NULL) { saveImbe4400Data (opts, state, imbe_d); } } - else if ((state->synctype == 14) || (state->synctype == 15)) + else if ((state->synctype == 14) || (state->synctype == 15)) //pV Sync { - mbe_processImbe7100x4400Framef (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, imbe7100_fr, imbe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); + + state->errs = mbe_eccImbe7100x4400C0 (imbe7100_fr); + state->errs2 = state->errs; + mbe_demodulateImbe7100x4400Data (imbe7100_fr); + state->errs2 += mbe_eccImbe7100x4400Data (imbe7100_fr, imbe_d); + mbe_convertImbe7100to7200(imbe_d); //needs extra conversion step apparently + + mbe_processImbe4400Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, + imbe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); + + //below line the old way of doing this + // mbe_processImbe7100x4400Framef (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, imbe7100_fr, imbe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); if (opts->payload == 1) { PrintIMBEData (opts, state, imbe_d); @@ -176,6 +195,28 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a saveAmbe2450Data (opts, state, ambe_d); } } + else if ((state->synctype == 8) || (state->synctype == 9)) + { + state->errs = mbe_eccAmbe3600x2450C0 (ambe_fr); + state->errs2 = state->errs; + mbe_demodulateAmbe3600x2450Data (ambe_fr); + state->errs2 += mbe_eccAmbe3600x2450Data (ambe_fr, ambe_d); + + + mbe_processAmbe2450Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, + ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); + + if (opts->payload == 1) + { + PrintAMBEData (opts, state, ambe_d); + } + + if (opts->mbe_out_f != NULL) + { + saveAmbe2450Data (opts, state, ambe_d); + } + + } else { //stereo slots and slot 0 (left slot) @@ -186,28 +227,27 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a state->errs2 = state->errs; mbe_demodulateAmbe3600x2450Data (ambe_fr); state->errs2 += mbe_eccAmbe3600x2450Data (ambe_fr, ambe_d); - // - //F - // + + // if (state->K > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0) // { k = BP[state->K]; k = ( ((k & 0xFF0F) << 32 ) + (k << 16) + k ); - for (short int j = 0; j < 49; j++) + for (short int j = 0; j < 48; j++) //49 { x = ( ((k << j) & 0x800000000000) >> 47 ); ambe_d[j] ^= x; } } - // - //D - // - mbe_processAmbe2450Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, - ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); + if (1 == 1) //still not quite right //state->payload_algid == 0 || state->K != 0 + { + mbe_processAmbe2450Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, + ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); + } //old method for this step below //mbe_processAmbe3600x2450Framef (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, ambe_fr, ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); - if (opts->payload == 1) + if (opts->payload == 1) // && state->R == 0 this is why slot 1 didn't primt abme, probably had it set during testing { PrintAMBEData (opts, state, ambe_d); } @@ -220,24 +260,23 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a state->errs2R = state->errsR; mbe_demodulateAmbe3600x2450Data (ambe_fr); state->errs2R += mbe_eccAmbe3600x2450Data (ambe_fr, ambe_d); - // - //G - // + + //BP Handling, Slot 2 if (state->K > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0) // { k = BP[state->K]; k = ( ((k & 0xFF0F) << 32 ) + (k << 16) + k ); - for (short int j = 0; j < 49; j++) + for (short int j = 0; j < 48; j++) { x = ( ((k << j) & 0x800000000000) >> 47 ); ambe_d[j] ^= x; } } - // - //E - // - mbe_processAmbe2450Dataf (state->audio_out_temp_bufR, &state->errsR, &state->errs2R, state->err_strR, - ambe_d, state->cur_mp2, state->prev_mp2, state->prev_mp_enhanced2, opts->uvquality); + if (1 == 1) //state->payload_algidR == 0 || state->K != 0 + { + mbe_processAmbe2450Dataf (state->audio_out_temp_bufR, &state->errsR, &state->errs2R, state->err_strR, + ambe_d, state->cur_mp2, state->prev_mp2, state->prev_mp_enhanced2, opts->uvquality); + } //old method for this step below //mbe_processAmbe3600x2450Framef (state->audio_out_temp_bufR, &state->errsR, &state->errs2R, state->err_strR, ambe_fr, ambe_d, state->cur_mp2, state->prev_mp2, state->prev_mp_enhanced2, opts->uvquality); @@ -246,7 +285,7 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a PrintAMBEData (opts, state, ambe_d); } } - //if using older DMR method, dPMR, or NXDN + //if using ??? if (opts->dmr_stereo == 0) { mbe_processAmbe3600x2450Framef (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, ambe_fr, ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); @@ -294,4 +333,18 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a writeSynthesizedVoice (opts, state); } + //per call can only be used when ncurses terminal is active since we use its call history matrix for when to record + if (opts->use_ncurses_terminal == 1 && opts->dmr_stereo_wav == 1 && opts->dmr_stereo == 1 && state->currentslot == 0) + { + //write wav to per call on left channel Slot 1 + writeSynthesizedVoice (opts, state); + } + //per call can only be used when ncurses terminal is active since we use its call history matrix for when to record + if (opts->use_ncurses_terminal == 1 && opts->dmr_stereo_wav == 1 && opts->dmr_stereo == 1 && state->currentslot == 1) + { + //write wav to per call on right channel Slot 2 + writeSynthesizedVoiceR (opts, state); + } + + } diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index d8b691a..622200f 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -1,12 +1,12 @@ /*------------------------------------------------------------------------------- * dsd_ncurses.c - * A dsd ncurses terminal printer + * A dsd ncurses terminal printer with menu system * * ASCII art generated by: * https://fsymbols.com/generators/carty/ * * LWVMOBILE - * 2022-02 DSD-FME Florida Man Edition + * 2022-08 DSD-FME Florida Man Edition *-----------------------------------------------------------------------------*/ /* * Copyright (C) 2010 DSD Author @@ -28,8 +28,26 @@ #include "dsd.h" #include "git_ver.h" +//UDP Remote +#include +// #include +#include + +#define BSIZE 999 +#define UDP_BUFLEN 5 //maximum UDP buffer length +#define SRV_IP "127.0.0.1" //IP +#define UDP_PORT 6020 //UDP port + +int handle; //for UDP +unsigned short udp_port = UDP_PORT; +char data[UDP_BUFLEN] = {0}; +struct sockaddr_in address; + +uint32_t temp_freq = -1; +// + int reset = 0; -char c; //getch key + int tg; int tgR; int tgn; @@ -43,19 +61,21 @@ int dcc = -1; int i = 0; char versionstr[25]; unsigned long long int call_matrix[33][6]; - +//current news story for tagline +//https://www.vice.com/en/article/epzzdk/florida-man-arrested-trying-to-warn-space-force-base-of-alien-dragon-war char * FM_bannerN[9] = { - " 2022 Dove Award Winner CTRL + C twice to exit", - " ██████╗ ██████╗██████╗    ███████╗███╗ ███╗███████╗", - " ██╔══██╗██╔════╝██╔══██╗   ██╔════╝████╗ ████║██╔════╝", - " ██║ ██║╚█████╗ ██║ ██║   █████╗ ██╔████╔██║█████╗ ", - " ██║ ██║ ╚═══██╗██║ ██║   ██╔══╝ ██║╚██╔╝██║██╔══╝ ", - " ██████╔╝██████╔╝██████╔╝   ██║ ██║ ╚═╝ ██║███████╗", - " ╚═════╝ ╚═════╝ ╚═════╝    ╚═╝ ╚═╝ ╚═╝╚══════╝", - "https://github.com/lwvmobile/dsd-fme/tree/pulseaudio " + " ESC or Arrow Keys For Menu ", + " ██████╗ ██████╗██████╗    ███████╗███╗ ███╗███████╗ 'Florida Man steals", + " ██╔══██╗██╔════╝██╔══██╗   ██╔════╝████╗ ████║██╔════╝ Truck; Drives to ", + " ██║ ██║╚█████╗ ██║ ██║   █████╗ ██╔████╔██║█████╗ Space Force to warn", + " ██║ ██║ ╚═══██╗██║ ██║   ██╔══╝ ██║╚██╔╝██║██╔══╝ warn of war between", + " ██████╔╝██████╔╝██████╔╝   ██║ ██║ ╚═╝ ██║███████╗ Aliens and Chinese ", + " ╚═════╝ ╚═════╝ ╚═════╝    ╚═╝ ╚═╝ ╚═╝╚══════╝ Dragons' - FM News ", + " ", + " " }; -char * SyncTypes[36] = { +char * SyncTypes[38] = { "+P25P1", "-P25P1", "+X2TDMA DATA", @@ -90,7 +110,9 @@ char * SyncTypes[36] = { "-YSF", "DMR MS VOICE", "DMR MS DATA", - "DMR RC DATA" + "DMR RC DATA", + "+P25-P2", + "-P25-P2" }; char * DMRBusrtTypes[18] = { @@ -115,6 +137,18 @@ char * DMRBusrtTypes[18] = { }; +char * getDateN(void) { + char datename[99]; //bug in 32-bit Ubuntu when using date in filename, date is garbage text + char * curr2; + struct tm * to; + time_t t; + t = time(NULL); + to = localtime( & t); + strftime(datename, sizeof(datename), "%Y-%m-%d", to); + curr2 = strtok(datename, " "); + return curr2; +} + time_t nowN; char * getTimeN(void) //get pretty hh:mm:ss timestamp { @@ -131,8 +165,127 @@ char * getTimeN(void) //get pretty hh:mm:ss timestamp return curr; } -void ncursesOpen () +//testing a few things, going to put this into ncursesMenu +#define WIDTH 36 +#define HEIGHT 23 + +int startx = 0; +int starty = 0; + +char *choicesc[] = { + "Return", + "Save Decoded Audio WAV (NO DMR STEREO!)", + "Save Signal to Symbol Capture Bin", + "Toggle Muting ENC P25 Traffic ", + "Per Call WAV REC (DMR Stereo/MS)", + "Setup and Start RTL Input ", + "Pulse Audio 48kHz Output", + "Pulse Audio 8kHz Output (NO DMR STEREO!)", + "Reset States and Heuristics", + "Toggle NCurses Compact Mode", + "Toggle NCurses Call History", + "Stop All Decoded WAV Saving", + "Read OP25/FME Symbol Capture Bin", + "Replay Last Symbol Capture Bin", + "Stop & Close Symbol Capture Bin Playback", + "Stop & Close Symbol Capture Bin Saving", + "Retune RTL Dongle", + "Resume Decoding" + }; + +char *choices[] = { + "Resume Decoding", + "Decode Auto**", + "Decode ProVoice", + "Decode D-STAR*", + "Decode P25-P1*", + "Decode DMR (STEREO BS/MS)", + "Decode DMR* (LEH)", //better name + "Decode dPMR", + "Decode NXDN48", + "Decode NXDN96", + "Decode X2-TDMA*", + "Toggle Signal Inversion", + " ", //spacer + "Reset Call History", + "Enable Payloads to Console", + "Disable Payloads to Console", + "Input & Output Options", + "Enable LRRP to ~/lrrp.txt", + "Exit DSD-FME", + // "Test" + }; + + +int n_choices = sizeof(choices) / sizeof(char *); +// int n_choicesb = sizeof(choicesb) / sizeof(char *); +int n_choicesc = sizeof(choicesc) / sizeof(char *); + +void print_menu(WINDOW *menu_win, int highlight) { + int x, y, i; + + x = 2; + y = 2; + box(menu_win, 0, 0); + for(i = 0; i < n_choices; ++i) + { if(highlight == i + 1) /* High light the present choice */ + { wattron(menu_win, A_REVERSE); + mvwprintw(menu_win, y, x, "%s", choices[i]); + wattroff(menu_win, A_REVERSE); + } + else + mvwprintw(menu_win, y, x, "%s", choices[i]); + ++y; + } + wrefresh(menu_win); +} + +// void print_menub(WINDOW *menu_win, int highlight) +// { +// int x, y, i; +// +// x = 2; +// y = 2; +// box(menu_win, 0, 0); +// for(i = 0; i < n_choicesb; ++i) +// { if(highlight == i + 1) /* High light the present choice */ +// { wattron(menu_win, A_REVERSE); +// mvwprintw(menu_win, y, x, "%s", choicesb[i]); +// wattroff(menu_win, A_REVERSE); +// } +// else +// mvwprintw(menu_win, y, x, "%s", choicesb[i]); +// ++y; +// } +// wrefresh(menu_win); +// } + +void print_menuc(WINDOW *menu_win, int highlight) +{ + int x, y, i; + + x = 2; + y = 2; + box(menu_win, 0, 0); + for(i = 0; i < n_choicesc; ++i) + { if(highlight == i + 1) /* High light the present choice */ + { wattron(menu_win, A_REVERSE); + mvwprintw(menu_win, y, x, "%s", choicesc[i]); + wattroff(menu_win, A_REVERSE); + } + else + mvwprintw(menu_win, y, x, "%s", choicesc[i]); + ++y; + } + wrefresh(menu_win); +} + +//end Testing + +void ncursesOpen (dsd_opts * opts, dsd_state * state) +{ + // state->menuopen = 1; //flag the menu is open, stop processing getFrameSync mbe_printVersion (versionstr); setlocale(LC_ALL, ""); initscr(); //Initialize NCURSES screen window @@ -142,33 +295,909 @@ void ncursesOpen () init_pair(3, COLOR_GREEN, COLOR_BLACK); //Green for Active Calls init_pair(4, COLOR_CYAN, COLOR_BLACK); //Cyan for Site Extra and Patches init_pair(5, COLOR_MAGENTA, COLOR_BLACK); //Magenta for no frame sync/signal + init_pair(6, COLOR_WHITE, COLOR_BLACK); //White Card Color Scheme noecho(); cbreak(); } +//ncursesMenu +void ncursesMenu (dsd_opts * opts, dsd_state * state) +{ + // state->menuopen = 1; //flag the menu is open, stop processing getFrameSync + closePulseOutput (opts); + + if (opts->audio_in_type == 0) //close pulse input if it is the specified input method + { + closePulseInput(opts); + } + + if (opts->audio_in_type == 3) + { + //function hangs, figure out why I can't release/stop the dongle + //cleanup_rtlsdr_stream(); //close down the rtl dongle + //rtlsdr_sighandler(); + } + + state->payload_keyid = 0; + state->payload_keyidR = 0; + + //zero out to fix call history 'scrolling' bug when changing decoding types + state->nxdn_last_tg = 0; + state->nxdn_last_ran = 0; + state->nxdn_last_rid = 0; + + WINDOW *menu_win; + WINDOW *test_win; + WINDOW *entry_win; + WINDOW *info_win; + int highlight = 1; + int highlightb = 1; + int highlightc = 1; + int choice = 0; + int choiceb = 0; + int choicec = 0; + int c; + int d; + int e; + + startx = 2; + starty = 1; + + menu_win = newwin(HEIGHT, WIDTH, starty, startx); + keypad(menu_win, TRUE); + mvprintw(0, 0, " Use arrow keys to go up and down, Press ENTER to select a choice."); + refresh(); + print_menu(menu_win, highlight); + while(1) + { c = wgetch(menu_win); + switch(c) + { case KEY_UP: + if(highlight == 1) + highlight = n_choices; + else + --highlight; + break; + case KEY_DOWN: + if(highlight == n_choices) + highlight = 1; + else + ++highlight; + break; + case 10: + choice = highlight; + break; + default: + //mvprintw(24, 0, "Character pressed is = %3d Hopefully it can be printed as '%c'", c, c); + refresh(); + break; + } + + print_menu(menu_win, highlight); + + //test print info boxes on side of certain options + if (highlight == 2) + { + info_win = newwin(6, WIDTH+18, starty, startx+20); + box (info_win, 0, 0); + mvwprintw(info_win, 2, 2, " Auto Decoding can only detect the following:."); + mvwprintw(info_win, 3, 2, " P25-P1, D-STAR, DMR LEH, and X2-TDMA"); + wrefresh(info_win); + } + + //Input Output Options + if (choice == 17) + { + //test making a new window while other window is open + test_win = newwin(HEIGHT-1, WIDTH+9, starty+5, startx+5); + keypad(menu_win, FALSE); + keypad(test_win, TRUE); + mvprintw(0, 0, "Input & Output Options "); + refresh(); + print_menuc(test_win, highlightc); + while(1) + { e = wgetch(test_win); + switch(e) + { case KEY_UP: + if(highlightc == 1) + highlightc = n_choicesc; + else + --highlightc; + break; + case KEY_DOWN: + if(highlightc == n_choicesc) + highlightc = 1; + else + ++highlightc; + break; + case 10: + choicec = highlightc; + break; + default: + //mvprintw(24, 0, "Character pressed is = %3d Hopefully it can be printed as '%c'", c, c); + refresh(); + break; + } + print_menuc(test_win, highlightc); + if (choicec == 2) + { + sprintf (opts->wav_out_file, "%s %s DSD-FME-DECODED.wav", getDateN(), getTimeN()); + openWavOutFile (opts, state); + } + if (choicec == 3) + { + //read in filename for symbol capture bin + entry_win = newwin(6, WIDTH+16, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Enter FME Symbol Capture Bin Filename"); + mvwprintw(entry_win, 3, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%s", &opts->symbol_out_file); + noecho(); + + if (opts->symbol_out_file != NULL) + { + opts->symbol_out = 1; //set flag to 1 + openSymbolOutFile (opts, state); + } + + } + if (choicec == 4) + { + //still disabled until a fix is found + if (opts->unmute_encrypted_p25 == 0) + { + opts->unmute_encrypted_p25 = 1; + } + else opts->unmute_encrypted_p25 = 0; + } + if (choicec == 5) + { + opts->dmr_stereo_wav = 1; + //catch all in case of no file name set, won't crash or something + sprintf (opts->wav_out_file, "DSD-FME-SLOT1.wav"); + //sprintf (opts->wav_out_file, "%s %s S1 - CC %d - TG %d - RD %d.wav", getDateN(), getTimeN(), dcc, tg, rd); + sprintf (opts->wav_out_fileR, "DSD-FME-SLOT2.wav"); + //sprintf (opts->wav_out_fileR, "%s %s S2 - CC %d - TG %d - RD %d.wav", getDateN(), getTimeN(), dcc, tg, rd); + openWavOutFileL (opts, state); //testing for now, will want to move to per call later + openWavOutFileR (opts, state); //testing for now, will want to move to per call later + + } + + if (choicec == 6) + { + int confirm = 0; + + #ifdef USE_RTLSDR + + //could also benefit from having some control aside from UDP remote + //BUG: When squelch enabled, all processing halts, no more ncursesprinter until squelch broken + //make another submenu to control these values if tests go well + + entry_win = newwin(6, WIDTH+6, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Enter RTL Device Index Number"); + mvwprintw(entry_win, 3, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%d", &opts->rtl_dev_index); + noecho(); + + //this is NOT scanning (or printing) in the variable for some reason...why? + entry_win = newwin(6, WIDTH+6, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Enter RTL Device PPM Error"); + mvwprintw(entry_win, 3, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%d", &opts->rtlsdr_ppm_error); + noecho(); + //opts->rtlsdr_ppm_error = -1; //hard set override for testing + + //apparently, scanning in an lld nukes later box entries for some reason + entry_win = newwin(6, WIDTH+18, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Enter Frequency in Hz (851.8 MHz is 851800000 Hz) "); + mvwprintw(entry_win, 3, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%d", &opts->rtlsdr_center_freq); //ld, or lld? + noecho(); + + entry_win = newwin(6, WIDTH+18, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Enter VFO Bandwidth (6, 8, 12, 16, 24, 48)"); + mvwprintw(entry_win, 3, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%d", &opts->rtl_bandwidth); + noecho(); + + entry_win = newwin(6, WIDTH+18, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Enter RTL Gain Value (0-49) (0 = Auto Gain)"); + mvwprintw(entry_win, 3, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%d", &opts->rtl_gain_value); + noecho(); + + entry_win = newwin(6, WIDTH+18, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Enter RTL UDP Remote Port (Default = 6020)"); + mvwprintw(entry_win, 3, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%d", &opts->rtl_udp_port); + noecho(); + if (opts->rtl_udp_port == 0) + { + opts->rtl_udp_port = 6020; + } + + entry_win = newwin(8, WIDTH+22, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Enter RTL Device Squelch Level or Enter 0"); + mvwprintw(entry_win, 3, 2, " WARNING! Renders Terminal Unresponsive When No Signal!"); + mvwprintw(entry_win, 4, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%d", &opts->rtl_squelch_level); + noecho(); + + entry_win = newwin(17, WIDTH+20, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Starting RTL Input. Cannot Release/Stop Until Exit."); + mvwprintw(entry_win, 4, 2, " RTL Frequency: %d Hz", opts->rtlsdr_center_freq); + mvwprintw(entry_win, 5, 2, " RTL Device Index Number: %d", opts->rtl_dev_index); + mvwprintw(entry_win, 6, 2, " RTL Device VFO Bandwidth: %d kHz", opts->rtl_bandwidth); + mvwprintw(entry_win, 7, 2, " RTL Device Gain: %d", opts->rtl_gain_value); + mvwprintw(entry_win, 8, 2, " RTL Device UDP Port: %d", opts->rtl_udp_port); + mvwprintw(entry_win, 9, 2, " RTL Device PPM: %d", opts->rtlsdr_ppm_error); + mvwprintw(entry_win, 10, 2, " RTL Device Squelch: %d", opts->rtl_squelch_level); + mvwprintw(entry_win, 12, 2, " Are You Sure?"); + mvwprintw(entry_win, 13, 2, " 1 = Yes, 2 = No "); + mvwprintw(entry_win, 14, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%d", &confirm); + noecho(); + + refresh(); + // opts->rtlsdr_center_freq = 851800000; //test with pV LCN 2 + //opts->rtl_gain_value = 46; + //opts->rtl_dev_index = 1; + // opts->rtl_bandwidth = 24; //12 or 24. + //opts->rtlsdr_ppm_error = -1; + //opts->rtl_udp_port = 6020; + //fprintf (stderr, "Confirm = %d", confirm); + + //works well, but can't release dongle later, so its a one way trip until exit + if (confirm == 1) + { + opts->audio_in_type = 3; //RTL input, only set this on confirm + //open_rtlsdr_stream(opts); //may move to outside of this box so we return to the normal ncurses term first + choicec = 18; //exit to decoder screen only if confirmed, otherwise, just go back + } + + // if (confirm != 1) + // { + // opts->audio_in_type = 0; + // } + + #endif + + } + + if (choicec == 7) + { + if (opts->dmr_stereo == 0) + { + opts->pulse_digi_rate_out = 48000; + //fprintf (stderr, "Rate Out set to 48kHz\n"); + } + if (opts->dmr_stereo == 1) + { + opts->pulse_digi_rate_out = 24000; + //fprintf (stderr, "Rate Out set to 24kHz\n"); + } + + } + + if (choicec == 8) + { + if (opts->dmr_stereo == 0) + { + opts->pulse_digi_rate_out = 8000; + //fprintf (stderr, "Rate Out set to 8kHz\n"); + } + + if (opts->dmr_stereo == 1) + { + opts->pulse_digi_rate_out = 24000; //always force 24kHz with DMR Stereo + //fprintf (stderr, "Rate Out set to 16kHz\n"); + } + } + + if (choicec == 9) + { + resetState (state); //use sparingly, may cause memory leak + } + + if (choicec == 10) + { + if (opts->ncurses_compact == 0) + { + opts->ncurses_compact = 1; + } + else opts->ncurses_compact = 0; + + } + + if (choicec == 11) + { + if (opts->ncurses_history == 0) + { + opts->ncurses_history = 1; + } + else opts->ncurses_history = 0; + } + + if (choicec == 12) + { + //flesh out all closewavs and sprint "" wav filenames + closeWavOutFile (opts, state); + closeWavOutFileL (opts, state); + closeWavOutFileR (opts, state); + //closeWavOutFileRaw (opts, state); + sprintf (opts->wav_out_file, ""); + sprintf (opts->wav_out_fileR, ""); + opts->dmr_stereo_wav = 0; + } + + if (choicec == 13) //lucky number 13 for OP25 Symbol Capture Bin Files + { + //read in filename for symbol capture bin + entry_win = newwin(6, WIDTH+16, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Enter OP25 Symbol Capture Bin Filename"); + mvwprintw(entry_win, 3, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%s", &opts->audio_in_dev); + noecho(); + //do the thing with the thing + struct stat stat_buf; + if (stat(opts->audio_in_dev, &stat_buf) != 0) + { + fprintf (stderr,"Error, couldn't open %s\n", opts->audio_in_dev); + //exit(1); + goto SKIP; + } + if (S_ISREG(stat_buf.st_mode)) + { + //state->symbolfile = fopen("adp_fdma.bin", "r"); + opts->symbolfile = fopen(opts->audio_in_dev, "r"); + opts->audio_in_type = 4; //symbol capture bin files + } + SKIP: + choicec = 18; + } + + if (choicec == 14) //replay last file + { + struct stat stat_buf; + if (stat(opts->audio_in_dev, &stat_buf) != 0) + { + fprintf (stderr,"Error, couldn't open %s\n", opts->audio_in_dev); + //exit(1); + goto SKIPR; + } + if (S_ISREG(stat_buf.st_mode)) + { + opts->symbolfile = fopen(opts->audio_in_dev, "r"); + opts->audio_in_type = 4; //symbol capture bin files + } + SKIPR: + choicec = 18; //exit + } + + if (choicec == 15) //stop/close last file PLAYBACK + { + if (opts->symbolfile != NULL) + { + if (opts->audio_in_type == 4) //check first, or issuing a second fclose will crash the SOFTWARE + { + fclose(opts->symbolfile); //free(): double free detected in tcache 2 (this is a new one) happens when closing more than once + + } + + } + opts->audio_in_type = 0; //set after closing to prevent above crash condition + + choicec = 18; //exit + } + + if (choicec == 16) //stop/close last file RECORDING + { + if (opts->symbol_out == 1) + { + if (opts->symbol_out_file != NULL) //check first, or issuing a second fclose will crash the SOFTWARE + { + fclose(opts->symbol_out_f); //free(): double free detected in tcache 2 (this is a new one) happens when closing more than once + sprintf (opts->audio_in_dev, opts->symbol_out_file); //swap output bin filename to input for quick replay + } + + opts->symbol_out = 0; //set flag to 1 + + } + choicec = 18; //exit + } + + if (choicec == 17) //RTL UDP Retune + { + //read in new rtl frequency + entry_win = newwin(6, WIDTH+18, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " Enter Frequency in Hz (851.8 MHz is 851800000 Hz) "); + mvwprintw(entry_win, 3, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%d", &opts->rtlsdr_center_freq); //ld, or lld? + noecho(); + //do the thing with the thing + data[0] = 0; + data[1] = opts->rtlsdr_center_freq & 0xFF; + data[2] = (opts->rtlsdr_center_freq >> 8) & 0xFF; + data[3] = (opts->rtlsdr_center_freq >> 16) & 0xFF; + data[4] = (opts->rtlsdr_center_freq >> 24) & 0xFF; + + temp_freq = opts->rtlsdr_center_freq; + + choicec = 18; + } + + if (choicec != 0 && choicec != 18 ) //return to last menu + { + //return + choice = 0; + choicec = 0; + //highlightb = 1; + //highlight = 1; + keypad(test_win, FALSE); + keypad(menu_win, TRUE); + delwin(test_win); + print_menu(menu_win, highlight); + //wrefresh(menu_win); + break; + } + if (choicec == 18) //exit both menus + { + //exit + choice = 1; + choicec = 0; + //highlightb = 0; + //highlight = 0; + keypad(test_win, FALSE); + keypad(menu_win, TRUE); + delwin(test_win); + print_menu(menu_win, highlight); + //wrefresh(menu_win); + break; + } + } + clrtoeol(); //clear to end of line? + refresh(); + //endwin(); //causes quick blink in and out of ncursesprinter, not required + } + + //Burger King + if (choice == 13) + { + state->payload_keyid = 0; + state->payload_keyidR = 0; + state->K = 0; + + entry_win = newwin(6, WIDTH+6, starty+10, startx+10); + box (entry_win, 0, 0); + mvwprintw(entry_win, 2, 2, " "); + mvwprintw(entry_win, 3, 3, " "); + echo(); + refresh(); + wscanw(entry_win, "%d", &state->K); + noecho(); + if (state->K > 255) + { + state->K = 255; + } + break; + } + + if (choice == 2) + { + //setup Auto parameters--default ones + resetState (state); //use sparingly, may cause memory leak + state->samplesPerSymbol = 10; + state->symbolCenter = 4; + sprintf (opts->output_name, "Auto Detect"); + opts->dmr_stereo = 0; //this value is the end user option + state->dmr_stereo = 0; //this values toggles on and off depending on voice or data handling + opts->pulse_digi_rate_out = 8000; + opts->pulse_digi_out_channels = 1; + opts->frame_dstar = 1; + opts->frame_x2tdma = 1; + opts->frame_p25p1 = 1; + opts->frame_nxdn48 = 0; + opts->frame_nxdn96 = 0; + opts->frame_dmr = 1; + opts->frame_dpmr = 0; + opts->frame_provoice = 0; + opts->mod_c4fm = 1; + opts->mod_qpsk = 0; + opts->mod_gfsk = 0; + state->rf_mod = 0; + opts->unmute_encrypted_p25 = 0; + break; //break? + + } + if (choice == 3) + { + //ProVoice Specifics + resetState (state); //use sparingly, may cause memory leak + state->samplesPerSymbol = 5; + state->symbolCenter = 2; + sprintf (opts->output_name, "ProVoice"); + opts->dmr_stereo = 0; //this value is the end user option + state->dmr_stereo = 0; //this values toggles on and off depending on voice or data handling + opts->pulse_digi_rate_out = 8000; + opts->pulse_digi_out_channels = 1; + opts->frame_dstar = 0; + opts->frame_x2tdma = 0; + opts->frame_p25p1 = 0; + opts->frame_nxdn48 = 0; + opts->frame_nxdn96 = 0; + opts->frame_dmr = 0; + opts->frame_dpmr = 0; + opts->frame_provoice = 1; + opts->mod_c4fm = 0; + opts->mod_qpsk = 0; + opts->mod_gfsk = 1; + state->rf_mod = 2; + break; + } + if (choice == 4) + { + //DSTAR + resetState (state); //use sparingly, may cause memory leak + state->samplesPerSymbol = 10; + state->symbolCenter = 4; + sprintf (opts->output_name, "D-STAR"); + opts->dmr_stereo = 0; //this value is the end user option + state->dmr_stereo = 0; //this values toggles on and off depending on voice or data handling + opts->pulse_digi_rate_out = 8000; + opts->pulse_digi_out_channels = 1; + opts->frame_dstar = 1; + opts->frame_x2tdma = 0; + opts->frame_p25p1 = 0; + opts->frame_nxdn48 = 0; + opts->frame_nxdn96 = 0; + opts->frame_dmr = 0; + opts->frame_dpmr = 0; + opts->frame_provoice = 0; + opts->mod_c4fm = 1; + opts->mod_qpsk = 0; + opts->mod_gfsk = 0; + state->rf_mod = 0; + // state->rf_mod = 2; + opts->unmute_encrypted_p25 = 0; + break; + } + if (choice == 5) + { + //P25 P1 + resetState (state); //use sparingly, may cause memory leak + opts->frame_p25p1 = 1; + state->samplesPerSymbol = 10; + state->symbolCenter = 4; + state->rf_mod = 0; + sprintf (opts->output_name, "P25P1"); + opts->dmr_stereo = 0; //this value is the end user option + state->dmr_stereo = 0; //this values toggles on and off depending on voice or data handling + opts->pulse_digi_rate_out = 8000; + opts->pulse_digi_out_channels = 1; + opts->frame_dstar = 0; + opts->frame_x2tdma = 0; + //opts->frame_p25p1 = 0; + opts->frame_nxdn48 = 0; + opts->frame_nxdn96 = 0; + opts->frame_dmr = 0; + opts->frame_dpmr = 0; + opts->frame_provoice = 0; + opts->mod_c4fm = 1; + opts->mod_qpsk = 0; + opts->mod_gfsk = 0; + // state->rf_mod = 0; + opts->unmute_encrypted_p25 = 0; + break; + } + + if (choice == 6) + { + //DMR Stereo + resetState (state); //use sparingly, seems to cause issue when switching back to other formats + opts->frame_dmr = 1; + state->samplesPerSymbol = 10; + state->symbolCenter = 4; + state->rf_mod = 0; + sprintf (opts->output_name, "DMR STEREO"); + opts->dmr_stereo = 1; //this value is the end user option + state->dmr_stereo = 1; //this values toggles on and off depending on voice or data handling + opts->pulse_digi_rate_out = 24000; + opts->pulse_digi_out_channels = 2; + opts->frame_dstar = 0; + opts->frame_x2tdma = 0; + opts->frame_p25p1 = 0; + opts->frame_nxdn48 = 0; + opts->frame_nxdn96 = 0; + //opts->frame_dmr = 0; + opts->frame_dpmr = 0; + opts->frame_provoice = 0; + opts->mod_c4fm = 1; + opts->mod_qpsk = 0; + opts->mod_gfsk = 0; + state->rf_mod = 0; + break; + } + if (choice == 7) + { + //set legacy DMR settings + resetState (state); //use sparingly, seems to cause issue when switching back to other formats + opts->frame_dmr = 1; + state->samplesPerSymbol = 10; + state->symbolCenter = 4; + state->rf_mod = 0; + sprintf (opts->output_name, "DMR LEH"); + opts->dmr_stereo = 0; //this value is the end user option + state->dmr_stereo = 0; //this values toggles on and off depending on voice or data handling + opts->pulse_digi_rate_out = 8000; + opts->pulse_digi_out_channels = 1; + opts->frame_dstar = 0; + opts->frame_x2tdma = 0; + opts->frame_p25p1 = 0; + opts->frame_nxdn48 = 0; + opts->frame_nxdn96 = 0; + //opts->frame_dmr = 0; + opts->frame_dpmr = 0; + opts->frame_provoice = 0; + opts->mod_c4fm = 1; + opts->mod_qpsk = 0; + opts->mod_gfsk = 0; + state->rf_mod = 0; + break; + } + if (choice == 8) + { + //dPMR + resetState (state); //use sparingly, may cause memory leak + state->samplesPerSymbol = 20; + state->symbolCenter = 10; + sprintf (opts->output_name, "dPMR"); + opts->dmr_stereo = 0; //this value is the end user option + state->dmr_stereo = 0; //this values toggles on and off depending on voice or data handling + opts->pulse_digi_rate_out = 8000; + opts->pulse_digi_out_channels = 1; + opts->frame_dstar = 0; + opts->frame_x2tdma = 0; + opts->frame_p25p1 = 0; + opts->frame_nxdn48 = 0; + opts->frame_nxdn96 = 0; + opts->frame_dmr = 0; + opts->frame_dpmr = 1; + opts->frame_provoice = 0; + opts->mod_c4fm = 1; + opts->mod_qpsk = 0; + opts->mod_gfsk = 0; + state->rf_mod = 0; + opts->unmute_encrypted_p25 = 0; + break; + } + if (choice == 9) + { + //NXDN48 + resetState (state); //use sparingly, may cause memory leak + opts->frame_nxdn48 = 1; + state->samplesPerSymbol = 20; + state->symbolCenter = 10; + state->rf_mod = 0; + sprintf (opts->output_name, "NXDN48"); + opts->dmr_stereo = 0; //this value is the end user option + state->dmr_stereo = 0; //this values toggles on and off depending on voice or data handling + opts->pulse_digi_rate_out = 8000; + opts->pulse_digi_out_channels = 1; + opts->frame_dstar = 0; + opts->frame_x2tdma = 0; + opts->frame_p25p1 = 0; + opts->frame_nxdn48 = 1; + opts->frame_nxdn96 = 0; + opts->frame_dmr = 0; + opts->frame_dpmr = 0; + opts->frame_provoice = 0; + opts->mod_c4fm = 1; + opts->unmute_encrypted_p25 = 0; + // opts->mod_qpsk = 0; + // opts->mod_gfsk = 0; + // state->rf_mod = 0; + } + if (choice == 10) + { + //NXDN96 + resetState (state); //use sparingly, may cause memory leak + state->samplesPerSymbol = 10; + state->symbolCenter = 4; + sprintf (opts->output_name, "NXDN96"); + opts->dmr_stereo = 0; //this value is the end user option + state->dmr_stereo = 0; //this values toggles on and off depending on voice or data handling + opts->pulse_digi_rate_out = 8000; + opts->pulse_digi_out_channels = 1; + opts->frame_dstar = 0; + opts->frame_x2tdma = 0; + opts->frame_p25p1 = 0; + opts->frame_nxdn48 = 0; + opts->frame_nxdn96 = 1; + opts->frame_dmr = 0; + opts->frame_dpmr = 0; + opts->frame_provoice = 0; + opts->mod_c4fm = 1; + opts->mod_qpsk = 0; + opts->mod_gfsk = 0; + state->rf_mod = 0; + opts->unmute_encrypted_p25 = 0; + } + if (choice == 11) + { + //Decode X2-TDMA + //NXDN96 + resetState (state); //use sparingly, may cause memory leak + state->samplesPerSymbol = 10; + state->symbolCenter = 4; + sprintf (opts->output_name, "X2-TDMA"); + opts->dmr_stereo = 0; //this value is the end user option + state->dmr_stereo = 0; //this values toggles on and off depending on voice or data handling + opts->pulse_digi_rate_out = 8000; + opts->pulse_digi_out_channels = 1; + opts->frame_dstar = 0; + opts->frame_x2tdma = 1; + opts->frame_p25p1 = 0; + opts->frame_nxdn48 = 0; + opts->frame_nxdn96 = 0; + opts->frame_dmr = 0; + opts->frame_dpmr = 0; + opts->frame_provoice = 0; + opts->mod_c4fm = 1; + opts->mod_qpsk = 0; + opts->mod_gfsk = 0; + state->rf_mod = 0; + opts->unmute_encrypted_p25 = 0; + } + if (choice == 12) + { + //Set all signal for inversion or uninversion + if (opts->inverted_dmr == 0) + { + opts->inverted_dmr = 1; + opts->inverted_dpmr = 1; + opts->inverted_x2tdma = 1; + opts->inverted_ysf = 1; + } + else + { + opts->inverted_dmr = 0; + opts->inverted_dpmr = 0; + opts->inverted_x2tdma = 0; + opts->inverted_ysf = 0; + } + + } + if (choice == 14) //reset call history (usually if janky output when switching modes) + { + for (short int k = 0; k < 9; k++) + { + call_matrix[k][0] = 0; + call_matrix[k][1] = 0; + call_matrix[k][2] = 0; + call_matrix[k][3] = 0; + call_matrix[k][4] = 0; + call_matrix[k][5] = 0; + } + } + + if (choice == 15) //turn on payload printing + { + opts->payload = 1; + fprintf(stderr, "Payload on\n"); + } + if (choice == 16) //turn off payload printing + { + opts->payload = 0; + fprintf(stderr, "Payload Off\n"); + } + if (choice == 18) + { + opts->lrrp_file_output = 1; + fprintf(stderr, "LRRP to text\n"); + } + if (choice == 19) + { + ncursesClose(); + //cleanup_rtlsdr_stream(); + cleanupAndExit (opts, state); + } + + if(choice != 0 && choice != 20) /* User did a choice come out of the infinite loop */ + break; + + } + + clrtoeol(); //clear to end of line? + refresh(); + state->menuopen = 0; //flag the menu is closed, resume processing getFrameSync + + //reopen pulse output with new parameters + openPulseOutput (opts); + + if (opts->audio_in_type == 0) //reopen pulse input if it is the specified input method + { + openPulseInput(opts); + } + + if (opts->audio_in_type == 3) //open rtl input if it is the specified input method + { + ncursesPrinter (opts, state); //run one rep to clear menu boxes out + if (opts->rtl_started == 0) + { + opts->rtl_started = 1; //set here so ncurses terminal doesn't attempt to open it again + open_rtlsdr_stream(opts); + } + + } + + +} +//end Ncurses Menu + void ncursesPrinter (dsd_opts * opts, dsd_state * state) { - int level; - level = 0; //start each cycle with 0 + int level = 0; + int c = 0; + + if (opts->audio_in_type != 1) //can't run getch/menues when using STDIN - + { + timeout(0); + c = getch(); + } + + //testing sending UDP commands to the socket inside of rtl_sdr_fm.cpp + //this works, but we will want to make an init func open one time, and have sendto here + if (temp_freq == opts->rtlsdr_center_freq) + { + handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + + memset((char * ) & address, 0, sizeof(address)); + address.sin_family = AF_INET; + address.sin_addr.s_addr = inet_addr(SRV_IP); //address of host + address.sin_port = htons(udp_port); + sendto(handle, data, UDP_BUFLEN, 0, (const struct sockaddr * ) & address, sizeof(struct sockaddr_in)); + + temp_freq = -1; + } //Variable reset/set section //carrier reset if (state->carrier == 0) //reset these to 0 when no carrier { - state->payload_algid = 0; - state->payload_keyid = 0; - state->payload_keyidR = 0; - state->payload_algidR = 0; - //state->payload_mfid = 0; - //state->payload_mi = 0; - //state->payload_miR = 0; - - state->nxdn_key = 0; - state->nxdn_cipher_type = 0; - //memset(state->dstarradioheader, 0, 41); sprintf(state->dmr_branding, " "); } @@ -252,13 +1281,16 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) if (state->dmrburstL == 16 && state->lasttg > 0) //state->currentslot == 0 && { tg = state->lasttg; + } if (state->dmrburstR == 16 && state->lastsrcR > 0) //state->currentslot == 1 && { tgR = state->lasttgR; + } opts->p25enc = 0; + } //P25 @@ -362,6 +1394,15 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) call_matrix[9][4] = dcc; call_matrix[9][5] = time(NULL); + //open wav file if enabled and both rd and tg are not 0 + if (opts->dmr_stereo_wav == 1 && rd != 0 && tg != 0) + { + //close old first, assign name based on time and radio, open wav file + closeWavOutFileL (opts, state); + sprintf (opts->wav_out_file, "%s MS - CC %d - TG %d - RD %d.wav", getTimeN(), dcc, tg, rd); + openWavOutFileL (opts, state); //testing for now, will want to move to per call later + } + } //DMR BS Slot 1 - matrix 0-4 @@ -385,6 +1426,16 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) call_matrix[4][4] = dcc; call_matrix[4][5] = time(NULL); + //open wav file if enabled and both rd and tg are not 0 + if (opts->dmr_stereo_wav == 1 && rd != 0 && tg != 0) + { + //close old first, assign name based on time and radio, open wav file + closeWavOutFileL (opts, state); + + sprintf (opts->wav_out_file, "%s S1 - CC %d - TG %d - RD %d.wav", getTimeN(), dcc, tg, rd); + openWavOutFileL (opts, state); //testing for now, will want to move to per call later + } + } //DMR BS Slot 2 - matrix 5-9 @@ -408,6 +1459,15 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) call_matrix[9][4] = dcc; call_matrix[9][5] = time(NULL); + //open wav file if enabled and both rdR and tgR are not 0 + if (opts->dmr_stereo_wav == 1 && rdR != 0 && tgR != 0) + { + //close old first, assign name based on time and radio, open wav file + closeWavOutFileR (opts, state); + sprintf (opts->wav_out_fileR, "%s S2 - CC %d - TG %d - RD %d.wav", getTimeN(), dcc, tgR, rdR); + openWavOutFileR (opts, state); //testing for now, will want to move to per call later + } + } //P25 @@ -434,29 +1494,41 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) //Start Printing Section erase(); - printw ("%s \n", FM_bannerN[0]); //top line in white - attron(COLOR_PAIR(4)); - for (short int i = 1; i < 7; i++) //following lines in cyan + if (opts->ncurses_compact == 1) { - printw("%s \n", FM_bannerN[i]); + printw ("------------------------------------------------------------------------------\n"); + printw ("| Digital Speech Decoder: Florida Man Edition %s \n", GIT_TAG); } - attroff(COLOR_PAIR(4)); - printw ("--Build Info------------------------------------------------------------------\n"); - printw ("| %s \n", FM_bannerN[7]); //http link - printw ("| Digital Speech Decoder: Florida Man Edition\n"); - printw ("| Github Build Version: %s \n", GIT_TAG); - printw ("| mbelib version %s\n", versionstr); - //printw ("| Press CTRL+C twice to exit\n"); - printw ("------------------------------------------------------------------------------\n"); - attron(COLOR_PAIR(4)); + if (opts->ncurses_compact == 0) + { + attron(COLOR_PAIR(6)); //6 + for (short int i = 0; i < 7; i++) + { + printw("%s \n", FM_bannerN[i]); + } + attroff(COLOR_PAIR(6)); //6 + printw ("--Build Info------------------------------------------------------------------\n"); + printw ("| https://github.com/lwvmobile/dsd-fme/tree/pulseaudio\n"); //http link + printw ("| Digital Speech Decoder: Florida Man Edition\n"); + printw ("| Github Build Version: %s \n", GIT_TAG); + printw ("| MBElib version %s\n", versionstr); + printw ("------------------------------------------------------------------------------\n"); + attron(COLOR_PAIR(4)); + } + printw ("--Input Output----------------------------------------------------------------\n"); if (opts->audio_in_type == 0) { - printw ("| Pulse Audio Input: [%i] kHz [%i] Channel\n", opts->pulse_digi_rate_in/1000, opts->pulse_digi_in_channels); + printw ("| Pulse Audio Input: [%2i] kHz [%i] Channel\n", opts->pulse_digi_rate_in/1000, opts->pulse_digi_in_channels); + } + if (opts->audio_in_type == 4) + { + printw ("| Symbol Capture Input: %s \n", opts->audio_in_dev); } if (opts->audio_in_type == 1) { - printw ("| STDIN Standard Input: - \n"); + printw ("| STDIN Standard Input: - Menu Disabled when using STDIN!\n"); + // printw ("| NCURSES Menu Disabled when using STDIN! - Use CTRL + C to Close. \n"); } if (opts->audio_in_type == 3) { @@ -469,7 +1541,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) } if (opts->audio_out_type == 0) { - printw ("| Pulse Audio Output: [%i] kHz [%i] Channel\n", opts->pulse_digi_rate_out/1000, opts->pulse_digi_out_channels); + printw ("| Pulse Audio Output: [%2i] kHz [%i] Channel\n", opts->pulse_digi_rate_out/1000, opts->pulse_digi_out_channels); } if (opts->monitor_input_audio == 1) { @@ -479,15 +1551,30 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) { printw ("| Writing MBE data files to directory %s\n", opts->mbe_out_dir); } + if (opts->wav_out_file_raw[0] != 0 && opts->audio_in_type == 0) + { + printw ("| Appending Raw Sig Audio WAV to file %s\n", opts->wav_out_file_raw); + } + if (opts->symbol_out_file[0] != 0 && opts->symbol_out == 1) + { + printw ("| Writing Symbol Capture to Bin File: %s\n", opts->symbol_out_file); + } if (opts->wav_out_file[0] != 0 && opts->dmr_stereo == 0) { - printw ("| Appending Audio WAV to file %s\n", opts->wav_out_file); + printw ("| Writing Decoded Audio to WAV File: %s\n", opts->wav_out_file); } + if (opts->dmr_stereo_wav == 1) //opts->wav_out_file[0] != 0 && + { + printw ("| Per Call WAV S1 - %s\n", opts->wav_out_file); + printw ("| Per Call WAV S2 - %s\n", opts->wav_out_fileR); + } + printw ("------------------------------------------------------------------------------\n"); attroff(COLOR_PAIR(4)); - if (state->carrier == 1){ //figure out method that will tell me when is active and when not active, maybe carrier but this doesn't print anyways unless activity + if (state->carrier == 1) + { attron(COLOR_PAIR(3)); level = (int) state->max / 164; //only update on carrier present reset = 1; @@ -540,7 +1627,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) { printw ("| RAN: [%2d] ", rn); printw ("TID: [%4d] ", tgn); - printw ("RID: [%4d] \n| ALG: [0x%02X] KEY [0x%02X] ", src, state->nxdn_cipher_type, state->nxdn_key); + printw ("RID: [%4d] \n| ALG: [0x%02X] KEY: [0x%02X] ", src, state->nxdn_cipher_type, state->nxdn_key); if (state->carrier == 1) { printw("%s ", state->nxdn_call_type); @@ -548,21 +1635,21 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) if (state->nxdn_cipher_type == 0x1 && state->carrier == 1) { attron(COLOR_PAIR(2)); - printw ("Scrambler Encryption "); + printw ("Scrambler "); attroff(COLOR_PAIR(2)); attron(COLOR_PAIR(3)); } if (state->nxdn_cipher_type == 0x2 && state->carrier == 1) { attron(COLOR_PAIR(2)); - printw ("DES Encryption "); + printw ("DES-OFB "); attroff(COLOR_PAIR(2)); attron(COLOR_PAIR(3)); } if (state->nxdn_cipher_type == 0x3 && state->carrier == 1) { attron(COLOR_PAIR(2)); - printw ("AES Encryption "); + printw ("AES-256 "); attroff(COLOR_PAIR(2)); attron(COLOR_PAIR(3)); } @@ -573,24 +1660,38 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) attroff(COLOR_PAIR(2)); attron(COLOR_PAIR(3)); } - //printw("%s ", state->nxdn_call_type); printw("\n"); } //P25 if (lls == 0 || lls == 1) { - printw("| TID:[%8i] RID:[%8i] ", tg, rd); + // printw("| TID:[%8i] RID:[%8i] ", tg, rd); + printw("| TID:[%8i] RID:[%8i] ", state->lasttg, state->lastsrc); + printw(" MFID:[0x%02X] ", state->payload_mfid); printw("NAC: [0x%3X] \n", nc); printw("| ALG:[0x%02X] ", state->payload_algid); - printw(" KEY:[0x%04X] ", state->payload_keyid); - printw(" MFID: [0x%02X] ", state->payload_mfid); //no way of knowing if this is accurate info yet - if (state->payload_algid != 0x80 && state->payload_algid != 0x0 && state->carrier == 1) + printw(" KID:[0x%04X] ", state->payload_keyid); + printw(" MI:[0x%016llX] ", state->payload_miP); + + if (state->payload_algid != 0x80 && state->payload_algid != 0x0 && state->carrier == 1 && state->R == 0) { attron(COLOR_PAIR(2)); printw("**ENC**"); attroff(COLOR_PAIR(2)); attron(COLOR_PAIR(3)); + if (state->payload_algid == 0xAA) + { + attron(COLOR_PAIR(1)); + printw(" ADP/RC4"); + attron(COLOR_PAIR(3)); + } + if (state->payload_algid == 0x81) + { + attron(COLOR_PAIR(1)); + printw(" DES-OFB"); + attron(COLOR_PAIR(3)); + } } printw("\n"); } @@ -627,7 +1728,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) //printw ("| | "); //10 spaces printw ("| V XTRA | "); //10 spaces //Burger King - if(state->dmrburstL == 16 && state->payload_mi == 0 && (state->dmr_so & 0xCF) == 0x40) //4F or CF mask? & 0xCF currently + if(state->dmrburstL == 16 && state->payload_algid == 0 && (state->dmr_so & 0xCF) == 0x40) //4F or CF mask? & 0xCF currently { attron(COLOR_PAIR(5)); printw (" **BP** "); @@ -635,15 +1736,15 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) attron(COLOR_PAIR(3)); } //Point - if(state->dmrburstL == 16 && state->payload_mi == 0 && state->K > 0 && (state->dmr_so & 0xCF) == 0x40) + if(state->dmrburstL == 16 && state->payload_algid == 0 && state->K > 0 && (state->dmr_so & 0xCF) == 0x40) { attron(COLOR_PAIR(1)); printw ("BPK [%3lld] ", state->K); attroff(COLOR_PAIR(1)); attron(COLOR_PAIR(3)); } - //ALG, KeyID, MI - if(state->dmrburstL == 16 && state->payload_keyid > 0 && (state->dmr_so & 0xCF) == 0x40) + //ALG, KeyID, MI //was key_id + if(state->dmrburstL == 16 && state->payload_algid > 0 && (state->dmr_so & 0xCF) == 0x40) { attron(COLOR_PAIR(1)); printw ("ALG: [0x%02X] KEY: [0x%02X] MI: [0x%08X]", state->payload_algid, state->payload_keyid, state->payload_mi); @@ -651,7 +1752,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) attron(COLOR_PAIR(3)); } - if(state->dmrburstL == 16 && state->dmr_so == 0x40) //0100 0000 + if(state->dmrburstL == 16 && state->dmr_so == 0x40 && state->R == 0) //0100 0000 { attron(COLOR_PAIR(2)); printw (" **ENC** "); @@ -728,7 +1829,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) printw ("| V XTRA | "); //10 spaces //Burger King 2 - if(state->dmrburstR == 16 && state->payload_miR == 0 && (state->dmr_soR & 0xCF) == 0x40) //4F or CF mask? + if(state->dmrburstR == 16 && state->payload_algidR == 0 && (state->dmr_soR & 0xCF) == 0x40) //4F or CF mask? { attron(COLOR_PAIR(5)); printw (" **BP** "); @@ -736,15 +1837,15 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) attron(COLOR_PAIR(3)); } //Point 2 - if(state->dmrburstR == 16 && state->payload_miR == 0 && state->K > 0 && (state->dmr_soR & 0xCF) == 0x40) + if(state->dmrburstR == 16 && state->payload_algidR == 0 && state->K > 0 && (state->dmr_soR & 0xCF) == 0x40) { attron(COLOR_PAIR(1)); printw ("BPK [%3lld] ", state->K); attroff(COLOR_PAIR(1)); attron(COLOR_PAIR(3)); } - //ALG, KeyID, MI 2 - if(state->dmrburstR == 16 && state->payload_keyidR > 0 && (state->dmr_soR & 0xCF) == 0x40) + //ALG, KeyID, MI 2 //was keyidR + if(state->dmrburstR == 16 && state->payload_algidR > 0 && (state->dmr_soR & 0xCF) == 0x40) { attron(COLOR_PAIR(1)); printw ("ALG: [0x%02X] KEY: [0x%02X] MI: [0x%08X]", state->payload_algidR, state->payload_keyidR, state->payload_miR); @@ -752,7 +1853,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) attron(COLOR_PAIR(3)); } //Call Types, may switch to the more robust version later? - if(state->dmrburstR == 16 && state->dmr_soR == 0x40) //0100 0000 + if(state->dmrburstR == 16 && state->dmr_soR == 0x40 && state->R == 0) //0100 0000 { attron(COLOR_PAIR(2)); printw (" **ENC** "); @@ -829,65 +1930,72 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) if (state->carrier == 1){ //same as above attroff(COLOR_PAIR(3)); } - - attron(COLOR_PAIR(4)); //cyan for history - printw ("--Call History----------------------------------------------------------------\n"); - for (short int j = 0; j < 10; j++) + //only print call history if enabled + if (opts->ncurses_history == 1) { - //only print if a valid time was assinged to the matrix - if ( ((time(NULL) - call_matrix[9-j][5]) < 9999) ) + attron(COLOR_PAIR(4)); //cyan for history + printw ("--Call History----------------------------------------------------------------\n"); + for (short int j = 0; j < 10; j++) { - printw ("| %s ", SyncTypes[call_matrix[9-j][0]]); - if (lls == 8 || lls == 9 || lls == 16 || lls == 17) + //only print if a valid time was assinged to the matrix + if ( ((time(NULL) - call_matrix[9-j][5]) < 9999) ) { - printw ("RAN [%2lld] ", call_matrix[9-j][1]); - printw ("TG [%4lld] ", call_matrix[9-j][4]); - printw ("RID [%4lld] ", call_matrix[9-j][2]); + printw ("| %s ", SyncTypes[call_matrix[9-j][0]]); + if (lls == 8 || lls == 9 || lls == 16 || lls == 17) + { + printw ("RAN [%2lld] ", call_matrix[9-j][1]); + printw ("TG [%4lld] ", call_matrix[9-j][4]); + printw ("RID [%4lld] ", call_matrix[9-j][2]); + } + //dPMR + if (lls == 20 || lls == 21 || lls == 22 || lls == 23 ||lls == 24 || lls == 25 || lls == 26 || lls == 27) + { + printw ("TGT [%8lld] ", call_matrix[9-j][1]); + printw ("SRC [%8lld] ", call_matrix[9-j][2]); + printw ("DCC [%2lld] ", call_matrix[9-j][4]); + } + //P25P1 Voice and Data + if (call_matrix[9-j][0] == 0 || call_matrix[9-j][0] == 1) + { + printw ("TID [%8lld] ", call_matrix[9-j][1]); + printw ("RID [%8lld] ", call_matrix[9-j][2]); + printw ("NAC [0x%03llX] ", call_matrix[9-j][4]); + } + //DMR BS Types + if (call_matrix[9-j][0] == 12 || call_matrix[9-j][0] == 13 || call_matrix[9-j][0] == 10 || call_matrix[9-j][0] == 11 ) + { + printw ("S[%d] ", call_matrix[9-j][3]); + printw ("TGT [%8lld] ", call_matrix[9-j][1]); + printw ("SRC [%8lld] ", call_matrix[9-j][2]); + printw ("DCC [%02lld] ", call_matrix[9-j][4]); + } + //DMR MS Types + if (call_matrix[9-j][0] == 32 || call_matrix[9-j][0] == 33 || call_matrix[9-j][0] == 34 ) + { + //printw ("S[%d] ", call_matrix[9-j][3]); + printw ("TGT [%8lld] ", call_matrix[9-j][1]); + printw ("SRC [%8lld] ", call_matrix[9-j][2]); + printw ("DCC [%02lld] ", call_matrix[9-j][4]); + } + printw ("%lld secs ago\n", time(NULL) - call_matrix[9-j][5]); } - //dPMR - if (lls == 20 || lls == 21 || lls == 22 || lls == 23 ||lls == 24 || lls == 25 || lls == 26 || lls == 27) - { - printw ("TGT [%8lld] ", call_matrix[9-j][1]); - printw ("SRC [%8lld] ", call_matrix[9-j][2]); - printw ("DCC [%2lld] ", call_matrix[9-j][4]); - } - //P25P1 Voice and Data - if (call_matrix[9-j][0] == 0 || call_matrix[9-j][0] == 1) - { - printw ("TID [%8lld] ", call_matrix[9-j][1]); - printw ("RID [%8lld] ", call_matrix[9-j][2]); - printw ("NAC [0x%03llX] ", call_matrix[9-j][4]); - } - //DMR BS Types - if (call_matrix[9-j][0] == 12 || call_matrix[9-j][0] == 13 || call_matrix[9-j][0] == 10 || call_matrix[9-j][0] == 11 ) - { - printw ("S[%d] ", call_matrix[9-j][3]); - printw ("TGT [%8lld] ", call_matrix[9-j][1]); - printw ("SRC [%8lld] ", call_matrix[9-j][2]); - printw ("DCC [%02lld] ", call_matrix[9-j][4]); - } - //DMR MS Types - if (call_matrix[9-j][0] == 32 || call_matrix[9-j][0] == 33 || call_matrix[9-j][0] == 34 ) - { - //printw ("S[%d] ", call_matrix[9-j][3]); - printw ("TGT [%8lld] ", call_matrix[9-j][1]); - printw ("SRC [%8lld] ", call_matrix[9-j][2]); - printw ("DCC [%02lld] ", call_matrix[9-j][4]); - } - printw ("%lld secs ago\n", time(NULL) - call_matrix[9-j][5]); - } - } //end Call History - //fence bottom - printw ("------------------------------------------------------------------------------\n"); - attroff(COLOR_PAIR(4)); //cyan for history - + } //end Call History + //fence bottom + printw ("------------------------------------------------------------------------------\n"); + attroff(COLOR_PAIR(4)); //cyan for history + } refresh(); + if (c == 27) //esc key + { + ncursesMenu (opts, state); //just a quick test + } + } //end ncursesPrinter void ncursesClose () { endwin(); - printf("Press CTRL+C again to close. Thanks.\n"); - printf("Run 'reset' in your terminal to clean up if necessary."); + //printf("Press CTRL+C again to close. Thanks.\n"); + //printf("Run 'reset' in your terminal to clean up if necessary.\n"); } diff --git a/src/dsd_reset.c b/src/dsd_reset.c index ab6165d..a1d9bfd 100644 --- a/src/dsd_reset.c +++ b/src/dsd_reset.c @@ -8,9 +8,9 @@ resetState (dsd_state * state) int i, j; - state->dibit_buf = malloc (sizeof (int) * 1000000); - state->dibit_buf_p = state->dibit_buf + 200; - memset (state->dibit_buf, 0, sizeof (int) * 200); + // state->dibit_buf = malloc (sizeof (int) * 1000000); + // state->dibit_buf_p = state->dibit_buf + 200; + // memset (state->dibit_buf, 0, sizeof (int) * 200); state->repeat = 0; //not sure yet //state->audio_out_buf = malloc (sizeof (short) * 1000000); //memset (state->audio_out_buf, 0, 100 * sizeof (short)); diff --git a/src/dsd_symbol.c b/src/dsd_symbol.c index 2af17e0..39016ba 100644 --- a/src/dsd_symbol.c +++ b/src/dsd_symbol.c @@ -26,6 +26,7 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync) sum = 0; count = 0; + sample = 0; //init sample with a value of 0...see if this was causing issues with raw audio monitoring for (i = 0; i < state->samplesPerSymbol; i++) //right HERE { @@ -81,15 +82,22 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync) } // Read the new sample from the input - if(opts->audio_in_type == 0) + if(opts->audio_in_type == 0) // && state->menuopen == 0 still not quite working { pa_simple_read(opts->pulse_digi_dev_in, &sample, 2, NULL ); //look into how processAudio handles playback, not sure if latency issues, or garbage sample values crash pulse when written - if (opts->monitor_input_audio == 1 && state->lastsynctype == -1 && sample < 32767 && sample > -32767) + // if (opts->monitor_input_audio == 1 && state->lastsynctype == -1 && sample < 32767 && sample > -32767) + if (opts->monitor_input_audio == 1 && state->lastsynctype == -1 && sample != 0) { state->pulse_raw_out_buffer = sample; //steal raw out buffer sample here? pa_simple_write(opts->pulse_raw_dev_out, (void*)&state->pulse_raw_out_buffer, 2, NULL); } + //playback is wrong, depends on samples_per_symbol, maybe make a buffer and store first? + //making buffer might also fix raw audio monitoring as well + if (opts->wav_out_file_raw[0] != 0) //if set for recording sample raw files + { + //writeRawSample (opts, state, sample); + } } else if (opts->audio_in_type == 1) { @@ -122,7 +130,8 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync) { #ifdef USE_RTLSDR // TODO: need to read demodulated stream here - get_rtlsdr_sample(&sample); + // get_rtlsdr_sample(&sample); + get_rtlsdr_sample(&sample, opts, state); if (opts->monitor_input_audio == 1 && state->lastsynctype == -1 && sample < 32767 && sample > -32767) { state->pulse_raw_out_buffer = sample; //steal raw out buffer sample here? @@ -131,6 +140,11 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync) #endif } + // //test reading symbol bin files + // else if (opts->audio_in_type == 4) + // { + // //use fopen and read in a sample, check boatbod op25 for clues + // } #ifdef TRACE_DSD state->debug_sample_index++; @@ -338,6 +352,73 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync) } #endif + //read op25/fme symbol bin files + if (opts->audio_in_type == 4) + { + //use fopen and read in a symbol, check op25 for clues + if(opts->symbolfile == NULL) + { + fprintf(stderr, "Error Opening File %s\n", opts->symbolfile); + return(-1); + } + + state->symbolc = fgetc(opts->symbolfile); + //fprintf(stderr, "%d", state->symbolc); + if( feof(opts->symbolfile) ) + { + opts->audio_in_type = 0; //switch to pulse after playback, ncurses terminal can initiate replay if wanted + fclose(opts->symbolfile); + openPulseInput(opts); + } + + //flipping these to 'positive' produces terrible results in P25 P1, and I tried flopping it every way I could + //positive polarity works fine with DMR, but not P25, so may look at reading and storing based on frame type? + if (opts->frame_p25p1 == 1) //use inverted polarity for reading P25, but not DMR (or others?) + { + if (state->symbolc == 0) + { + symbol = -1; //-1 + } + if (state->symbolc == 1) + { + symbol = -3; //-3 + } + if (state->symbolc == 2) + { + symbol = 1; //1 + } + if (state->symbolc == 3) + { + symbol = 3; //3 + } + } + else if (opts->frame_provoice == 1) //syncs fine, but issues with dibit reading + { + //provoice has issue where sync is okay, but decode isn't working after sync + //symbol = state->symbolc; + } + else + { + if (state->symbolc == 0) + { + symbol = 1; //-1 + } + if (state->symbolc == 1) + { + symbol = 3; //-3 + } + if (state->symbolc == 2) + { + symbol = -1; //1 + } + if (state->symbolc == 3) + { + symbol = -3; //3 + } + } + + } + state->symbolcnt++; return (symbol); diff --git a/src/fec.c b/src/fec.c index 6180f2d..cfb95f5 100644 --- a/src/fec.c +++ b/src/fec.c @@ -1224,10 +1224,11 @@ void Golay_24_12_encode(unsigned char *origBits, unsigned char *encodedBits) encodedBits[j] += origBits[i] * Golay_24_12_m_G[24*i + j]; } } - + // fprintf (stderr, "\n Inside Golay - Encoded Bits = "); //disable later on for (i = 0; i < 24; i++) { encodedBits[i] %= 2; + // fprintf (stderr, "%b", encodedBits[i]); //disable later on } } diff --git a/src/nxdn_data.c b/src/nxdn_data.c index 3dc93e2..87d2bf3 100644 --- a/src/nxdn_data.c +++ b/src/nxdn_data.c @@ -1,9 +1,6 @@ #include "dsd.h" #include "nxdn_const.h" -//don't know why this doesn't work right in LEH, need to figure that out for him -//works just fien when ripped from his and into mine -//must be some random thing, I'll look at his when I have a chance void processNXDNData (dsd_opts * opts, dsd_state * state) { int i, dibit = 0; @@ -24,7 +21,7 @@ void processNXDNData (dsd_opts * opts, dsd_state * state) } /* Start pseudo-random NXDN sequence after - * LITCH = 16 bit = 8 dibit + * LICH = 16 bit = 8 dibit * ==> Index 8 */ pr = (unsigned char *)(&nxdnpr2[8]); for (i = 0; i < 30; i++) diff --git a/src/nxdn_lib.c b/src/nxdn_lib.c index 22c8c75..fdd6ef5 100644 --- a/src/nxdn_lib.c +++ b/src/nxdn_lib.c @@ -60,13 +60,13 @@ } /* End ConvertBitIntoBytes() */ -uint8_t NXDN_decode_LICH(uint8_t InputLich[8], - uint8_t * RFChannelType, - uint8_t * FunctionnalChannelType, - uint8_t * Option, - uint8_t * Direction, - uint8_t * CompleteLichBinaryFormat, - uint8_t Inverted) + uint8_t NXDN_decode_LICH(uint8_t InputLich[8], + uint8_t * RFChannelType, + uint8_t * FunctionnalChannelType, + uint8_t * Option, + uint8_t * Direction, + uint8_t * CompleteLichBinaryFormat, + uint8_t Inverted) { uint8_t GoodParity = 0; uint32_t i; @@ -294,6 +294,7 @@ void NXDN_SACCH_Full_decode(dsd_opts * opts, dsd_state * state) /* Check CRC */ if(state->NxdnSacchRawPart[i].CrcIsGood == 0) CrcCorrect = 0; + //fprintf(stderr, "\n SAACH P# %1d - %05X", i, state->NxdnSacchRawPart[i].Data); } /* Decodes the element content */ @@ -553,7 +554,7 @@ void NXDN_Elements_Content_decode(dsd_opts * opts, dsd_state * state, uint32_t i; uint8_t MessageType; uint64_t CurrentIV = 0; - + unsigned long long int FullMessage = 0; /* Get the "Message Type" field */ MessageType = (ElementsContent[2] & 1) << 5; MessageType |= (ElementsContent[3] & 1) << 4; @@ -562,6 +563,8 @@ void NXDN_Elements_Content_decode(dsd_opts * opts, dsd_state * state, MessageType |= (ElementsContent[6] & 1) << 1; MessageType |= (ElementsContent[7] & 1) << 0; + //fprintf(stderr, "\nMessage Type = %X ", MessageType); + /* Save the "F1" and "F2" flags */ state->NxdnElementsContent.F1 = ElementsContent[0]; state->NxdnElementsContent.F2 = ElementsContent[1]; @@ -569,7 +572,16 @@ void NXDN_Elements_Content_decode(dsd_opts * opts, dsd_state * state, /* Save the "Message Type" field */ state->NxdnElementsContent.MessageType = MessageType; - //fprintf(stderr, "Message Type = 0x%02X ", MessageType & 0xFF); + //fprintf(stderr, "\n Message Type = 0x%02X ", MessageType & 0xFF); + + //Dump the Message into a HEX value for vieweing + //FullMessage = (unsigned long long int)ConvertBitIntoBytes(&Message[0], 64); + for (short int i = 0; i < 64; i++) + { + FullMessage = FullMessage << 1; + FullMessage |= ElementsContent[i]; + } + //fprintf(stderr, "\nFull Message = %016llX ", FullMessage); /* Decode the right "Message Type" */ switch(MessageType) @@ -666,6 +678,7 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message) uint8_t KeyID = 0; uint8_t DuplexMode[32] = {0}; uint8_t TransmissionMode[32] = {0}; + unsigned long long int FullMessage = 0; //UNUSED_VARIABLE(opts); //UNUSED_VARIABLE(state); @@ -712,14 +725,14 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message) if(CCOption & 0x40) fprintf(stderr, "Visitor "); if(CCOption & 0x20) fprintf(stderr, "Priority Paging "); - /* On an AES or DES encrypted frame one IV is used on two - * superframe. - * The first superframe contains a VCALL message inside - * the SACCH and the second superframe contains the next IV - * to use. - * - * Set the correct part of encrypted frame flag. - */ + //Dump the Message into a HEX value for vieweing + //FullMessage = (unsigned long long int)ConvertBitIntoBytes(&Message[0], 64); + // for (short int i = 0; i < 64; i++) + // { + // FullMessage = FullMessage << 1; + // FullMessage |= Message[i]; + // } + if((CipherType == 2) || (CipherType == 3)) { state->NxdnElementsContent.PartOfCurrentEncryptedFrame = 1; @@ -742,11 +755,17 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message) NXDN_Voice_Call_Option_To_Str(VoiceCallOption, DuplexMode, TransmissionMode); fprintf(stderr, "%s %s - ", DuplexMode, TransmissionMode); + /* Print Source ID and Destination ID (Talk Group or Unit ID) */ + //fprintf (stderr, "%s", KGRN); + fprintf(stderr, "Src=%u - Dst/TG=%u ", SourceUnitID & 0xFFFF, DestinationID & 0xFFFF); + fprintf (stderr, "%s", KNRM); + //state->nxdn_key = (KeyID & 0xFF); //state->nxdn_cipher_type = CipherType; /* Print the "Cipher Type" */ if(CipherType != 0) { + fprintf (stderr, "\n %s", KYEL); fprintf(stderr, "%s - ", NXDN_Cipher_Type_To_Str(CipherType)); //state->nxdn_cipher_type = CipherType; } @@ -754,17 +773,19 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message) /* Print the Key ID */ if(CipherType != 0) { - fprintf (stderr, "%s", KYEL); + fprintf(stderr, "Key ID %u - ", KeyID & 0xFF); - fprintf (stderr, "%s", KNRM); + //fprintf (stderr, "%s", KNRM); //state->nxdn_key = (KeyID & 0xFF); } - /* Print Source ID and Destination ID (Talk Group or Unit ID) */ - - fprintf(stderr, "Src=%u - Dst/TG=%u ", SourceUnitID & 0xFFFF, DestinationID & 0xFFFF); - fprintf (stderr, "%s", KNRM); - + //print scrambler key value if manually inserted + if (state->nxdn_cipher_type == 0x01 && state->R > 0) //scrambler + { + fprintf (stderr, "%s", KYEL); + fprintf(stderr, "Value: 0x%04llX", state->R); //use R and not miN + fprintf (stderr, "%s", KNRM); + } if(state->NxdnElementsContent.VCallCrcIsGood) { @@ -784,7 +805,7 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message) fprintf(stderr, "(CRC ERR) "); fprintf (stderr, "%s", KNRM); } - + //fprintf(stderr, "\nFull Message = %016llX ", FullMessage); } /* End NXDN_decode_VCALL() */ @@ -815,21 +836,15 @@ void NXDN_decode_VCALL_IV(dsd_opts * opts, dsd_state * state, uint8_t * Message) * * Message[8..71] contains : The 64 bits IV */ - + state->payload_miN = 0; //zero out /* Extract the IV from the VCALL_IV message */ for(i = 0; i < 8; i++) { state->NxdnElementsContent.IV[i] = (uint8_t)ConvertBitIntoBytes(&Message[(i + 1) * 8], 8); + //let's load this mother fucker up then lol + state->payload_miN = state->payload_miN << 8 | state->NxdnElementsContent.IV[i]; } - /* On an AES or DES encrypted frame one IV is used on two - * superframe. - * The first superframe contains a VCALL message inside - * the SACCH and the second superframe contains the next IV - * to use. - * - * Set the correct part of encrypted frame flag. - */ state->NxdnElementsContent.PartOfCurrentEncryptedFrame = 2; state->NxdnElementsContent.PartOfNextEncryptedFrame = 1; @@ -1012,35 +1027,640 @@ uint8_t CRC6BitNXDN(uint8_t * BufferIn, uint32_t BitLength) return CRC; } /* End CRC6BitNXDN() */ - -/* Scrambler used for NXDN transmission (different of the - * voice encryption scrambler), see NXDN Part1-A Common Air Interface chapter - * 4.6 for the polynomial description. - * It is a X^9 + X^4 + 1 polynomial used as pseudo-random generator */ -void ScrambledNXDNVoiceBit(int * LfsrValue, char * BufferIn, char * BufferOut, int NbOfBitToScramble) +//NXDN IDLE +void ProcessNXDNIdleData (dsd_opts * opts, dsd_state * state, uint8_t Inverted) { - uint32_t i; - uint32_t LFSR; - uint8_t bit; + int i, dibit = 0; + unsigned char sacch_raw[72] = {0}; + unsigned char sacch_decoded[32] = {0}; /* 26 bit + 6 bit CRC */ + unsigned char *pr; + uint8_t CrcIsGood = 0; + uint8_t StructureField = 0; + uint8_t RAN = 0; + uint8_t PartOfFrame = 0; - /* Load the initial LFSR value - * LFSR = 0x0E4 at starting value */ - LFSR = (uint32_t)*LfsrValue; - - for(i = 0; i < (uint32_t)NbOfBitToScramble; i++) + if (opts->errorbars == 1) { - /* Bit 0 of LFSR is used to scramble data */ - BufferOut[i] = (BufferIn[i] ^ (LFSR & 1)) & 1; - - /* Compute bit = X^0 + X^4 */ - bit = ((LFSR & 1) ^ ((LFSR >> 4) & 1)) & 1; - - /* Insert bit on the 9th bit (X^9) */ - LFSR = ((LFSR >> 1) & 0xFF) | ((bit << 8) & 0x100); + fprintf(stderr, "DATA - "); } - *LfsrValue = (int)LFSR; -} /* End ScrambledNXDNVoiceBit() */ + /* Start pseudo-random NXDN sequence after + * LICH = 16 bit = 8 dibit + * ==> Index 8 */ + pr = (unsigned char *)(&nxdnpr[8]); + for (i = 0; i < 30; i++) + { + dibit = getDibit (opts, state); + + /* Store and de-interleave directly SACCH bits */ + sacch_raw[(2*i)] = ((*pr) & 1) ^ (1 & (dibit >> 1)); // bit 1 + sacch_raw[(2*i)+1] = (1 & dibit); // bit 0 + pr++; +#ifdef NXDN_DUMP + fprintf(stderr, "%c", dibit + 48); +#endif + } +#ifdef NXDN_DUMP + fprintf(stderr, " "); +#endif + + + /* Decode the SACCH fields */ + CrcIsGood = NXDN_SACCH_raw_part_decode(sacch_raw, sacch_decoded); + StructureField = (sacch_decoded[0]<<1 | sacch_decoded[1]<<0) & 0x03; /* Compute the Structure Field (remove 2 first bits of the SR Information in the SACCH) */ + RAN = (sacch_decoded[2]<<5 | sacch_decoded[3]<<4 | sacch_decoded[4]<<3 | sacch_decoded[5]<<2 | sacch_decoded[6]<<1 | sacch_decoded[7]<<0) & 0x3F; /* Compute the RAN (6 last bits of the SR Information in the SACCH) */ + + /* Compute the Part of Frame according to the structure field */ + if (StructureField == 3) PartOfFrame = 0; + else if(StructureField == 2) PartOfFrame = 1; + else if(StructureField == 1) PartOfFrame = 2; + else if(StructureField == 0) PartOfFrame = 3; + else PartOfFrame = 0; /* Normally we should never go here */ + + /* Fill the SACCH structure */ + state->NxdnSacchRawPart[PartOfFrame].CrcIsGood = CrcIsGood; + state->NxdnSacchRawPart[PartOfFrame].StructureField = StructureField; + state->NxdnSacchRawPart[PartOfFrame].RAN = RAN; + memcpy(state->NxdnSacchRawPart[PartOfFrame].Data, &sacch_decoded[8], 18); /* Copy the 18 bits of SACCH content */ + + fprintf(stderr, "RAN=%02d - Part %d/4 ", RAN, PartOfFrame + 1); + if(CrcIsGood) fprintf(stderr, " (OK) - "); + else fprintf(stderr, "(CRC ERR) - "); + + + /* This frame is an idle frame */ + fprintf(stderr, "Idle"); + + + /* Decode the SACCH only when all 4 voice frame + * SACCH spare parts have been received */ + if(PartOfFrame == 3) + { + /* Decode the entire SACCH content */ + NXDN_SACCH_Full_decode(opts, state); + } + + for (i = 0; i < 144; i++) + { + dibit = getDibit (opts, state); +#ifdef NXDN_DUMP + fprintf(stderr, "%c", dibit + 48); +#endif + } + + if (opts->errorbars == 1) + { + fprintf(stderr, "\n"); + } + + /* Reset the SACCH CRCs when all 4 voice frame + * SACCH spare parts have been received */ + if(PartOfFrame == 3) + { + /* Reset all CRCs of the SACCH */ + for(i = 0; i < 4; i++) state->NxdnSacchRawPart[i].CrcIsGood = 0; + } +} /* End ProcessNXDNIdleData() */ + +void ProcessNXDNFacch1Data (dsd_opts * opts, dsd_state * state, uint8_t Inverted) +{ + int i, j, dibit = 0; + unsigned char sacch_raw[72] = {0}; + unsigned char sacch_decoded[32] = {0}; /* 26 bits + 6 bits CRC */ + unsigned char facch1_raw[144] = {0}; + unsigned char facch1_decoded[96] = {0}; /* 80 bits + 12 bits CRC + 4 bits "Tail" (set to "0") */ + unsigned char *pr; + uint8_t CrcIsGood = 0; + uint8_t StructureField = 0; + uint8_t RAN = 0; + uint8_t PartOfFrame = 0; + uint8_t Facch1CrcIsGood = 0; + + if (opts->errorbars == 1) + { + fprintf(stderr, "DATA - "); + } + + /* Start pseudo-random NXDN sequence after + * LITCH = 16 bit = 8 dibit + * ==> Index 8 */ + pr = (unsigned char *)(&nxdnpr[8]); + for (i = 0; i < 30; i++) + { + dibit = getDibit (opts, state); + + /* Store and de-interleave directly SACCH bits */ + sacch_raw[(2*i)] = ((*pr) & 1) ^ (1 & (dibit >> 1)); // bit 1 + sacch_raw[(2*i)+1] = (1 & dibit); // bit 0 + pr++; +#ifdef NXDN_DUMP + fprintf(stderr, "%c", dibit + 48); +#endif + } +#ifdef NXDN_DUMP + fprintf(stderr, " "); +#endif + + + /* Decode the SACCH fields */ + CrcIsGood = NXDN_SACCH_raw_part_decode(sacch_raw, sacch_decoded); + StructureField = (sacch_decoded[0]<<1 | sacch_decoded[1]<<0) & 0x03; /* Compute the Structure Field (remove 2 first bits of the SR Information in the SACCH) */ + RAN = (sacch_decoded[2]<<5 | sacch_decoded[3]<<4 | sacch_decoded[4]<<3 | sacch_decoded[5]<<2 | sacch_decoded[6]<<1 | sacch_decoded[7]<<0) & 0x3F; /* Compute the RAN (6 last bits of the SR Information in the SACCH) */ + + /* Compute the Part of Frame according to the structure field */ + if (StructureField == 3) PartOfFrame = 0; + else if(StructureField == 2) PartOfFrame = 1; + else if(StructureField == 1) PartOfFrame = 2; + else if(StructureField == 0) PartOfFrame = 3; + else PartOfFrame = 0; /* Normally we should never go here */ + + /* Fill the SACCH structure */ + state->NxdnSacchRawPart[PartOfFrame].CrcIsGood = CrcIsGood; + state->NxdnSacchRawPart[PartOfFrame].StructureField = StructureField; + state->NxdnSacchRawPart[PartOfFrame].RAN = RAN; + memcpy(state->NxdnSacchRawPart[PartOfFrame].Data, &sacch_decoded[8], 18); /* Copy the 18 bits of SACCH content */ + + fprintf(stderr, "RAN=%02d - Part %d/4 ", RAN, PartOfFrame + 1); + if(CrcIsGood) fprintf(stderr, " (OK) - "); + else fprintf(stderr, "(CRC ERR) - "); + + + /* This frame is an FACCH1 frame */ + fprintf(stderr, "FACCH1 - "); + + + /* Decode the SACCH only when all 4 voice frame + * SACCH spare parts have been received */ + if(PartOfFrame == 3) + { + /* Decode the entire SACCH content */ + //NXDN_SACCH_Full_decode(opts, state); + } + + /* Start pseudo-random NXDN sequence after + * LITCH = 16 bit = 8 dibit + + * SACCH = 60 bit = 30 dibit + * = 76 bit = 38 dibit + * ==> Index 38 */ + pr = (unsigned char *)(&nxdnpr[38]); + + /* The frame contains 2 * 144 bits = 2 * 72 dibit */ + for(j = 0; j < 2; j++) + { + for (i = 0; i < 72; i++) + { + dibit = getDibit (opts, state); + + /* Store and FACCH1 bits */ + facch1_raw[(2*i)] = ((*pr) & 1) ^ (1 & (dibit >> 1)); // bit 1 + facch1_raw[(2*i)+1] = (1 & dibit); // bit 0 + pr++; + +#ifdef NXDN_DUMP + fprintf(stderr, "%c", dibit + 48); +#endif + } /* End for (i = 0; i < 72; i++) */ + + /* Extract the FACCH1 content */ + Facch1CrcIsGood = NXDN_FACCH1_decode(facch1_raw, facch1_decoded); + + state->NxdnFacch1RawPart[j].CrcIsGood = Facch1CrcIsGood; + memcpy(state->NxdnFacch1RawPart[j].Data, facch1_decoded, 80); + + if(Facch1CrcIsGood) fprintf(stderr, "FACCH1 CRC %d is good - ", j + 1); + else fprintf(stderr, "FACCH1 CRC %d is bad - ", j + 1); + } /* End for(j = 0; j < 2; j++) */ + + if (opts->errorbars == 1) + { + fprintf(stderr, "\n"); + } + + /* Reset the SACCH CRCs when all 4 voice frame + * SACCH spare parts have been received */ + if(PartOfFrame == 3) + { + /* Reset all CRCs of the SACCH */ + for(i = 0; i < 4; i++) state->NxdnSacchRawPart[i].CrcIsGood = 0; + } +} /* End ProcessNXDNFacch1Data() */ + +void ProcessNXDNUdchData (dsd_opts * opts, dsd_state * state, uint8_t Inverted) +{ + int i, dibit = 0; + unsigned char facch2_raw[348] = {0}; + unsigned char facch2_decoded[203] = {0}; /* 184 bits + 15 bits CRC + 4 bits "Tail" (set to "0") */ + unsigned char *pr; + uint8_t Facch2CrcIsGood = 0; + uint8_t StructureField = 0; + uint8_t RAN = 0; + + if (opts->errorbars == 1) + { + fprintf(stderr, "DATA - "); + } + + /* Start pseudo-random NXDN sequence after + * LITCH = 16 bit = 8 dibit + * ==> Index 8 */ + pr = (unsigned char *)(&nxdnpr[8]); + for (i = 0; i < 174; i++) + { + dibit = getDibit (opts, state); + + /* Store and de-interleave directly SACCH bits */ + facch2_raw[(2*i)] = ((*pr) & 1) ^ (1 & (dibit >> 1)); // bit 1 + facch2_raw[(2*i)+1] = (1 & dibit); // bit 0 + pr++; +#ifdef NXDN_DUMP + fprintf(stderr, "%c", dibit + 48); +#endif + } +#ifdef NXDN_DUMP + fprintf(stderr, " "); +#endif + + /* Extract the UDCH/FACCH2 content */ + Facch2CrcIsGood = NXDN_UDCH_decode(facch2_raw, facch2_decoded); + + state->NxdnFacch2RawPart.CrcIsGood = Facch2CrcIsGood; + memcpy(state->NxdnFacch2RawPart.Data, facch2_decoded, 184); + + StructureField = (facch2_decoded[0]<<1 | facch2_decoded[1]<<0) & 0x03; /* Compute the Structure Field (remove 2 first bits of the SR Information in the FACCH2) */ + RAN = (facch2_decoded[2]<<5 | facch2_decoded[3]<<4 | facch2_decoded[4]<<3 | facch2_decoded[5]<<2 | facch2_decoded[6]<<1 | facch2_decoded[7]<<0) & 0x3F; /* Compute the RAN (6 last bits of the SR Information in the FACCH2) */ + + fprintf(stderr, "RAN=%02d ", RAN); + if(Facch2CrcIsGood) fprintf(stderr, " (OK) - "); + else fprintf(stderr, "(CRC ERR) - "); + + /* This frame is an FACCH2 frame */ + fprintf(stderr, "FACCH2 - "); + + if(Facch2CrcIsGood) fprintf(stderr, "UDCH/FACCH2 CRC is good - "); + else fprintf(stderr, "UDCH/FACCH2 CRC is bad - "); + + if (opts->errorbars == 1) + { + fprintf(stderr, "\n"); + } +} /* End ProcessNXDNUdchData() */ + +void ProcessNXDNFrame(dsd_opts * opts, dsd_state * state, uint8_t Inverted) +{ + /* Switch to the correct type of frame */ + switch(state->NxdnLich.RFChannelType) + { + /* RCCH */ + case 0: + { + ProcessNxdnRCCHFrame(opts, state, Inverted); + break; + } /* End case 0 */ + + /* RTCH */ + case 1: + { + ProcessNxdnRTCHFrame(opts, state, Inverted); + break; + } /* End case 1 */ + + /* RDCH */ + case 2: + { + ProcessNxdnRDCHFrame(opts, state, Inverted); + break; + } /* End case 2 */ + + /* RTCH_C (Composite Control Channel) */ + case 3: + { + ProcessNxdnRTCH_C_Frame(opts, state, Inverted); + break; + } /* End case 3 */ + + default: + { + fprintf(stderr, "- Unknown NXDN Frame type\n"); + + /* Unknown frame type, simply skip the entire frame + * 384 bits - 20 bits Frame Sync Word - 16 bits LICH = 348 bits = 174 dibit + * Preserve 24 bits (12 dibit) => 174 - 12 = 162 dibit */ + skipDibit(opts, state, ((384 - 20 - 16) / 2) - 12); + break; + } /* End default */ + } /* End switch(state->NxdnLich.RFChannelType) */ +} /* End NxdnDecodeFrame() */ + +void ProcessNxdnRCCHFrame(dsd_opts * opts, dsd_state * state, uint8_t Inverted) +{ + uint8_t SkipEntireFrameFlag = 0; + + /* Remove compiler warning */ + // UNUSED_VARIABLE(Inverted); + + sprintf(state->fsubtype, " RCCH "); + + switch(state->NxdnLich.CompleteLich) + { + case 0b0011000: + { + fprintf(stderr, "- RCCH - CCCH Transmission using Short CAC\n"); + SkipEntireFrameFlag = 1; + break; + } + case 0b0001000: + { + fprintf(stderr, "- RCCH - UPCH or CCCH Transmission using Long CAC\n"); + SkipEntireFrameFlag = 1; + break; + } + case 0b0000001: + { + fprintf(stderr, "- RCCH - CAC Transmission\n"); + SkipEntireFrameFlag = 1; + break; + } + case 0b0000011: + { + fprintf(stderr, "- RCCH - CAC Transmission which has not to be received\n"); + SkipEntireFrameFlag = 1; + break; + } + case 0b0000101: + { + fprintf(stderr, "- RCCH - CAC Transmission which can be received arbitrary\n"); + SkipEntireFrameFlag = 1; + break; + } + case 0b0011001: + { + fprintf(stderr, "- RCCH - IDAS\n"); + SkipEntireFrameFlag = 1; + break; + } + default: + { + fprintf(stderr, "- RCCH - Unknown RCCH Frame\n"); + SkipEntireFrameFlag = 1; + break; + } /* End default */ + } /* switch(state->NxdnLich.CompleteLich) */ + + if(SkipEntireFrameFlag) + { + /* Unknown frame type or frame not implemented yet, simply skip the entire frame + * 384 bits - 20 bits Frame Sync Word - 16 bits LICH = 348 bits = 174 dibit + * Preserve 24 bits (12 dibit) => 174 - 12 = 162 dibit */ + skipDibit(opts, state, ((384 - 20 - 16) / 2) - 12); + } + +} /* End ProcessNxdnRCCHFrame() */ + +void ProcessNxdnRDCHFrame(dsd_opts * opts, dsd_state * state, uint8_t Inverted) +{ + uint8_t SkipEntireFrameFlag = 0; + + /* Remove compiler warning */ + // UNUSED_VARIABLE(Inverted); + + switch(state->NxdnLich.CompleteLich) + { + /* Voice frame */ + case 0b1010110: /* Voice call transmission : Superframe SACCH, VCH Only */ + case 0b1010100: /* Voice call transmission : Superframe SACCH, first half VCH & last half FACCH1 */ + case 0b1010010: /* Voice call transmission : Superframe SACCH, first half FACCH1 & last half VCH */ + case 0b1010111: /* Voice call transmission : Superframe SACCH, VCH Only */ + case 0b1010101: /* Voice call transmission : Superframe SACCH, first half VCH & last half FACCH1 */ + case 0b1010011: /* Voice call transmission : Superframe SACCH, first half FACCH1 & last half VCH */ + { + fprintf(stderr, "- RDCH - "); + processNXDNVoice(opts, state); + break; + } + + case 0b1010000: /* Voice call transmission : Superframe SACCH, two FACCH1s */ + case 0b1010001: /* Voice call transmission : Superframe SACCH, two FACCH1s */ + { + fprintf(stderr, "- RDCH - "); + processNXDNData(opts, state); + break; + } + + case 0b1011000: /* Voice call transmission : Superframe SACCH, Idle State */ + case 0b1011001: /* Voice call transmission : Superframe SACCH, Idle State */ + { + fprintf(stderr, "- RDCH - "); + ProcessNXDNIdleData(opts, state, Inverted); + break; + } + + case 0b1000000: /* Voice call transmission : Non-superframe SACCH, two FACCH1s */ + case 0b1000001: /* Voice call transmission : Non-superframe SACCH, two FACCH1s */ + { + //fprintf(stderr, "- RDCH - Non-superframe SACCH with two FACCH1s\n"); + fprintf(stderr, "- RDCH - "); + ProcessNXDNFacch1Data(opts, state, Inverted); + break; + } + + case 0b1001110: /* UDCH Transmission */ + case 0b1001111: /* UDCH Transmission */ + { + fprintf(stderr, "- RDCH - UDCH Transmission - "); + ProcessNXDNUdchData(opts, state, Inverted); + break; + } + + case 0b1001000: /* FACCH2 Transmission */ + case 0b1001001: /* FACCH2 Transmission */ + { + fprintf(stderr, "- RDCH - FACCH2 Transmission - "); + ProcessNXDNUdchData(opts, state, Inverted); + break; + } + + default: + { + fprintf(stderr, "- RDCH - Unknown RDCH Frame\n"); + SkipEntireFrameFlag = 1; + break; + } /* End default */ + } /* End switch(state->NxdnLich.CompleteLich) */ + + if(SkipEntireFrameFlag) + { + /* Unknown frame type or frame not implemented yet, simply skip the entire frame + * 384 bits - 20 bits Frame Sync Word - 16 bits LICH = 348 bits = 174 dibit + * Preserve 8 bits (4 dibit) => 174 - 4 = 170 dibit */ + skipDibit(opts, state, ((384 - 20 - 16) / 2) - 4); + } +} /* End ProcessNxdnRDCHFrame() */ + +void ProcessNxdnRTCH_C_Frame(dsd_opts * opts, dsd_state * state, uint8_t Inverted) +{ + uint8_t SkipEntireFrameFlag = 0; + + /* Remove compiler warning */ + // UNUSED_VARIABLE(Inverted); + + switch(state->NxdnLich.CompleteLich) + { + /* Voice frame */ + case 0b1110111: /* Voice call transmission : Superframe SACCH, VCH Only */ + case 0b1110101: /* Voice call transmission : Superframe SACCH, first half VCH & last half FACCH1 */ + case 0b1110011: /* Voice call transmission : Superframe SACCH, first half FACCH1 & last half VCH */ + { + fprintf(stderr, "- RTCH_C - "); + processNXDNVoice(opts, state); + break; + } + + case 0b1110001: /* Voice call transmission : Superframe SACCH, two FACCH1s */ + { + fprintf(stderr, "- RTCH_C - "); + processNXDNData(opts, state); + break; + } + + case 0b1111001: /* Voice call transmission : Superframe SACCH, Idle State */ + { + fprintf(stderr, "- RTCH_C - "); + ProcessNXDNIdleData(opts, state, Inverted); + break; + } + + case 0b1100001: /* Voice call transmission : Non-superframe SACCH, two FACCH1s */ + { + //fprintf(stderr, "- RTCH_C - Non-superframe SACCH with two FACCH1s\n"); + fprintf(stderr, "- RTCH_C - "); + ProcessNXDNFacch1Data(opts, state, Inverted); + break; + } + + case 0b1101111: /* UDCH Transmission */ + { + fprintf(stderr, "- RTCH_C - UDCH Transmission - "); + ProcessNXDNUdchData(opts, state, Inverted); + break; + } + + case 0b1101001: /* FACCH2 Transmission */ + { + fprintf(stderr, "- RTCH_C - FACCH2 Transmission - "); + ProcessNXDNUdchData(opts, state, Inverted); + break; + } + + default: + { + fprintf(stderr, "- RTCH_C - Unknown RTCH_C Frame\n"); + SkipEntireFrameFlag = 1; + break; + } /* End default */ + } /* End switch(state->NxdnLich.CompleteLich) */ + + if(SkipEntireFrameFlag) + { + /* Unknown frame type or frame not implemented yet, simply skip the entire frame + * 384 bits - 20 bits Frame Sync Word - 16 bits LICH = 348 bits = 174 dibit + * Preserve 8 bits (4 dibit) => 174 - 4 = 170 dibit */ + skipDibit(opts, state, ((384 - 20 - 16) / 2) - 4); + } +} + + + +/* + * @brief : This function decodes an NXDN RTCH frame + * + * @param opts : Options + * + * @param state : State + * + * @param Inverted : 1 = Inverted frame ; 0 = Normal frame + * + * @return None + * + */ +void ProcessNxdnRTCHFrame(dsd_opts * opts, dsd_state * state, uint8_t Inverted) +{ + uint8_t SkipEntireFrameFlag = 0; + + /* Remove compiler warning */ + // UNUSED_VARIABLE(Inverted); + + switch(state->NxdnLich.CompleteLich) + { + /* Voice frame */ + case 0b0110110: /* Voice call transmission : Superframe SACCH, VCH Only */ + case 0b0110100: /* Voice call transmission : Superframe SACCH, first half VCH & last half FACCH1 */ + case 0b0110010: /* Voice call transmission : Superframe SACCH, first half FACCH1 & last half VCH */ + case 0b0110111: /* Voice call transmission : Superframe SACCH, VCH Only */ + case 0b0110101: /* Voice call transmission : Superframe SACCH, first half VCH & last half FACCH1 */ + case 0b0110011: /* Voice call transmission : Superframe SACCH, first half FACCH1 & last half VCH */ + { + fprintf(stderr, "- RTCH - "); + processNXDNVoice(opts, state); + break; + } + + case 0b0110000: /* Voice call transmission : Superframe SACCH, two FACCH1s */ + case 0b0110001: /* Voice call transmission : Superframe SACCH, two FACCH1s */ + { + fprintf(stderr, "- RTCH - "); + processNXDNData(opts, state); + break; + } + + case 0b0111000: /* Voice call transmission : Superframe SACCH, Idle State */ + case 0b0111001: /* Voice call transmission : Superframe SACCH, Idle State */ + { + fprintf(stderr, "- RTCH - "); + ProcessNXDNIdleData(opts, state, Inverted); + break; + } + + case 0b0100000: /* Voice call transmission : Non-superframe SACCH, two FACCH1s */ + case 0b0100001: /* Voice call transmission : Non-superframe SACCH, two FACCH1s */ + { + //fprintf(stderr, "- RTCH - Non-superframe SACCH with two FACCH1s\n"); + fprintf(stderr, "- RDCH - "); + ProcessNXDNFacch1Data(opts, state, Inverted); + break; + } + + case 0b0101110: /* UDCH Transmission */ + case 0b0101111: /* UDCH Transmission */ + { + fprintf(stderr, "- RTCH - UDCH Transmission - "); + ProcessNXDNUdchData(opts, state, Inverted); + break; + } + + case 0b0101000: /* FACCH2 Transmission */ + case 0b0101001: /* FACCH2 Transmission */ + { + fprintf(stderr, "- RTCH - FACCH2 Transmission - "); + ProcessNXDNUdchData(opts, state, Inverted); + break; + } + default: + { + fprintf(stderr, "- RTCH - Unknown RTCH Frame\n"); + SkipEntireFrameFlag = 1; + break; + } /* End default */ + } /* End switch(state->NxdnLich.CompleteLich) */ + + if(SkipEntireFrameFlag) + { + /* Unknown frame type or frame not implemented yet, simply skip the entire frame + * 384 bits - 20 bits Frame Sync Word - 16 bits LICH = 348 bits = 174 dibit + * Preserve 8 bits (4 dibit) => 174 - 4 = 170 dibit */ + skipDibit(opts, state, ((384 - 20 - 16) / 2) - 4); + } +} /* End ProcessNxdnRTCHFrame() */ + diff --git a/src/nxdn_voice.c b/src/nxdn_voice.c index 9aa6fb2..ffc454e 100644 --- a/src/nxdn_voice.c +++ b/src/nxdn_voice.c @@ -1,9 +1,6 @@ #include "dsd.h" #include "nxdn_const.h" -//don't know why this doesn't work right in LEH, need to figure that out for him -//works just fien when ripped from his and into mine -//must be some random thing, I'll look at his when I have a chance void processNXDNVoice (dsd_opts * opts, dsd_state * state) { int i, j, dibit; @@ -143,11 +140,12 @@ void processNXDNVoice (dsd_opts * opts, dsd_state * state) y++; z++; } - if (opts->payload == 1 && opts->dmr_stereo == 1) + if (opts->payload == 1) { - fprintf(stderr, "\n"); + //fprintf(stderr, "\n"); } processMbeFrame (opts, state, NULL, ambe_fr, NULL); + state->p25vc++; //increment counter by one here? } /* End for (j = 0; j < 4; j++) */ @@ -162,5 +160,6 @@ void processNXDNVoice (dsd_opts * opts, dsd_state * state) { /* Reset all CRCs of the SACCH */ for(i = 0; i < 4; i++) state->NxdnSacchRawPart[i].CrcIsGood = 0; + } } /* End processNXDNVoice() */ diff --git a/src/p25_p2.c b/src/p25_p2.c new file mode 100644 index 0000000..46dcf23 --- /dev/null +++ b/src/p25_p2.c @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------------- + * p25_p2.c + * Phase 2 TDMA Voice handling + * + * LWVMOBILE + * 2022-08 DSD-FME Florida Man Edition + *-----------------------------------------------------------------------------*/ + /* + * Copyright (C) 2010 DSD Author + * GPG Key ID: 0x3F1D7FD0 (74EF 430D F7F2 0A48 FCE6 F630 FAA2 635D 3F1D 7FD0) + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +#include "dsd.h" + +void processP2(dsd_opts * opts, dsd_state * state) +{ + //Do Something + fprintf (stderr, " Future Development\n"); //obligatory +} diff --git a/src/p25p1_hdu.c b/src/p25p1_hdu.c index 1bdd2c7..36d0b4f 100644 --- a/src/p25p1_hdu.c +++ b/src/p25p1_hdu.c @@ -467,12 +467,24 @@ processHDU(dsd_opts* opts, dsd_state* state) mihex1 = (unsigned long long int)ConvertBitIntoBytes(&mi[0], 32); mihex2 = (unsigned long long int)ConvertBitIntoBytes(&mi[32], 32); mihex3 = (unsigned long long int)ConvertBitIntoBytes(&mi[64], 8); + //only use 64 MSB, trailing 8 bits aren't used, so no mihex3 + state->payload_miP = (mihex1 << 32) | (mihex2); } - if (1 == 1) //print on payload == 1 + //set vc counter to 0 + state->p25vc = 0; + + if (state->payload_algid != 0x80) //print on payload == 1 { fprintf (stderr, "%s", KYEL); - fprintf (stderr, " HDU ALG ID: 0x%02X KEY ID: 0x%02X MI: 0x%08llX%08llX%02llX MFID: 0x%02X \n", algidhex, kidhex, mihex1, mihex2, mihex3, state->payload_mfid); + fprintf (stderr, " HDU ALG ID: 0x%02X KEY ID: 0x%02X MI: 0x%08llX%08llX%02llX MFID: 0x%02X", algidhex, kidhex, mihex1, mihex2, mihex3, state->payload_mfid); + fprintf (stderr, "%s", KNRM); + } + + if (state->payload_algid != 0x80) //print on payload == 1 + { + fprintf (stderr, "%s", KRED); + fprintf (stderr, " ENC \n"); fprintf (stderr, "%s", KNRM); } diff --git a/src/p25p1_ldu1.c b/src/p25p1_ldu1.c index 2c6fe5f..f309fc6 100644 --- a/src/p25p1_ldu1.c +++ b/src/p25p1_ldu1.c @@ -65,7 +65,6 @@ processLDU1 (dsd_opts* opts, dsd_state* state) state->debug_prefix_2 = '1'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 2 read_and_correct_hex_word (opts, state, &(hex_data[11][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_data[10][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -78,7 +77,6 @@ processLDU1 (dsd_opts* opts, dsd_state* state) state->debug_prefix_2 = '2'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 3 read_and_correct_hex_word (opts, state, &(hex_data[ 7][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_data[ 6][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -91,7 +89,6 @@ processLDU1 (dsd_opts* opts, dsd_state* state) state->debug_prefix_2 = '3'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 4 read_and_correct_hex_word (opts, state, &(hex_data[ 3][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_data[ 2][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -104,7 +101,6 @@ processLDU1 (dsd_opts* opts, dsd_state* state) state->debug_prefix_2 = '4'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 5 read_and_correct_hex_word (opts, state, &(hex_parity[11][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_parity[10][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -117,7 +113,6 @@ processLDU1 (dsd_opts* opts, dsd_state* state) state->debug_prefix_2 = '5'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 6 read_and_correct_hex_word (opts, state, &(hex_parity[ 7][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_parity[ 6][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -130,7 +125,6 @@ processLDU1 (dsd_opts* opts, dsd_state* state) state->debug_prefix_2 = '6'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 7 read_and_correct_hex_word (opts, state, &(hex_parity[ 3][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_parity[ 2][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -174,6 +168,7 @@ processLDU1 (dsd_opts* opts, dsd_state* state) { lsd2[i] = lsd[i] + '0'; } + //skip two octets since LSD is part of the encryption portion // TODO: error correction of the LSD bytes... // TODO: do something useful with the LSD bytes... diff --git a/src/p25p1_ldu2.c b/src/p25p1_ldu2.c index 3611cb3..5ff8e3d 100644 --- a/src/p25p1_ldu2.c +++ b/src/p25p1_ldu2.c @@ -49,6 +49,8 @@ processLDU2 (dsd_opts * opts, dsd_state * state) // so we start counter at 36-14-1 = 21 status_count = 21; + state->p25vc = 9; + if (opts->errorbars == 1) { //fprintf (stderr, "e:"); @@ -65,7 +67,6 @@ processLDU2 (dsd_opts * opts, dsd_state * state) state->debug_prefix_2 = '1'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 2 read_and_correct_hex_word (opts, state, &(hex_data[15][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_data[14][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -78,7 +79,6 @@ processLDU2 (dsd_opts * opts, dsd_state * state) state->debug_prefix_2 = '2'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 3 read_and_correct_hex_word (opts, state, &(hex_data[11][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_data[10][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -91,7 +91,6 @@ processLDU2 (dsd_opts * opts, dsd_state * state) state->debug_prefix_2 = '3'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 4 read_and_correct_hex_word (opts, state, &(hex_data[ 7][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_data[ 6][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -104,7 +103,6 @@ processLDU2 (dsd_opts * opts, dsd_state * state) state->debug_prefix_2 = '4'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 5 read_and_correct_hex_word (opts, state, &(hex_data[ 3][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_data[ 2][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -117,7 +115,6 @@ processLDU2 (dsd_opts * opts, dsd_state * state) state->debug_prefix_2 = '5'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 6 read_and_correct_hex_word (opts, state, &(hex_parity[ 7][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_parity[ 6][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -130,7 +127,6 @@ processLDU2 (dsd_opts * opts, dsd_state * state) state->debug_prefix_2 = '6'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 7 read_and_correct_hex_word (opts, state, &(hex_parity[ 3][0]), &status_count, analog_signal_array, &analog_signal_index); read_and_correct_hex_word (opts, state, &(hex_parity[ 2][0]), &status_count, analog_signal_array, &analog_signal_index); @@ -143,7 +139,6 @@ processLDU2 (dsd_opts * opts, dsd_state * state) state->debug_prefix_2 = '7'; #endif process_IMBE (opts, state, &status_count); - // Read data after IMBE 8: LSD (low speed data) { char lsd[8]; @@ -174,6 +169,7 @@ processLDU2 (dsd_opts * opts, dsd_state * state) { lsd2[i] = lsd[i] + '0'; } + //skip two octets since LSD is part of the encryption portion // TODO: error correction of the LSD bytes... // TODO: do something useful with the LSD bytes... @@ -185,6 +181,9 @@ processLDU2 (dsd_opts * opts, dsd_state * state) #endif process_IMBE (opts, state, &status_count); + //set vc counter to 0 + state->p25vc = 0; + if (opts->errorbars == 1) { fprintf (stderr, "\n"); @@ -373,48 +372,23 @@ processLDU2 (dsd_opts * opts, dsd_state * state) mihex1 = (unsigned long long int)ConvertBitIntoBytes(&mi[0], 32); mihex2 = (unsigned long long int)ConvertBitIntoBytes(&mi[32], 32); mihex3 = (unsigned long long int)ConvertBitIntoBytes(&mi[64], 8); - //need to check this for accuracy, may be incorrect, MI may also be incorrect, I have 72, but LFSR shows 64 - state->payload_miP = (mihex1 << 40) | (mihex2 << 8) | mihex3; + //only use 64 MSB, trailing 8 bits aren't used, so no mihex3 + state->payload_miP = (mihex1 << 32) | (mihex2); } - if (1 == 1) //print on payload == 1 + if (state->payload_algid != 0x80) //print on payload == 1 { fprintf (stderr, "%s", KYEL); - fprintf (stderr, " LDU2 ALG ID: 0x%02X KEY ID: 0x%02X MI: 0x%08llX%08llX%02llX\n", algidhex, kidhex, mihex1, mihex2, mihex3); + fprintf (stderr, " LDU2 ALG ID: 0x%02X KEY ID: 0x%02X MI: 0x%08llX%08llX%02llX", algidhex, kidhex, mihex1, mihex2, mihex3); fprintf (stderr, "%s", KNRM); } - if (opts->payload == 1) - { - //LFSRP(state); - } - //why am I doing this part below again? - if (opts->payload == 0) - { - algidhex = strtol (algid, NULL, 2); - kidhex = strtol (kid, NULL, 2); - } -} -//needs some work to make mi value fit in there since its a 72 bit value, need to check this over -//LFSR code courtesy of https://github.com/mattames/LFSR/ -int LFSRP(dsd_state * state) -{ - uint64_t lfsr = 0; - lfsr = state->payload_miP; - uint8_t cnt = 0; - - for(cnt=0;cnt<32;cnt++) + if (state->payload_algid != 0x80) //print on payload == 1 { - // Polynomial is C(x) = x^64 + x^62 + x^46 + x^38 + x^27 + x^15 + 1 - uint64_t bit = ((lfsr >> 63) ^ (lfsr >> 61) ^ (lfsr >> 45) ^ (lfsr >> 37) ^ (lfsr >> 26) ^ (lfsr >> 14)) & 0x1; - lfsr = (lfsr << 1) | (bit); + fprintf (stderr, "%s", KRED); + fprintf (stderr, " ENC \n"); + fprintf (stderr, "%s", KNRM); } - fprintf (stderr, "%s", KYEL); - fprintf (stderr, " LDU2 ALG ID: 0x%02X KEY ID: 0x%02X", state->payload_algid, state->payload_keyid); - fprintf(stderr, " Next MI: 0x%016llX \n", lfsr); - fprintf (stderr, "%s", KNRM); - state->payload_miP = lfsr; - } diff --git a/src/rtl_sdr_fm.cpp b/src/rtl_sdr_fm.cpp index 75fb919..f024eea 100644 --- a/src/rtl_sdr_fm.cpp +++ b/src/rtl_sdr_fm.cpp @@ -954,8 +954,10 @@ static void *socket_thread_fn(void *arg) { new_freq = chars_to_int(buffer); dongle.freq = new_freq; // //opts->rtlsdr_center_freq = new_freq; //or dongle.freq, this should update the freq displayed in ncurses terminal hopefully and not do anything naughty + optimal_settings(new_freq, demod.rate_in); rtlsdr_set_center_freq(dongle.dev, dongle.freq); + //verbose_set_frequency (dongle.dev, new_freq); //fprintf (stderr, "Tuning to: %d [Hz] (central freq: %d [Hz])\n", new_freq, new_freq + freq_offset); fprintf (stderr, "Tuning to: %d [Hz] \n", new_freq); } @@ -1042,8 +1044,8 @@ static void *socket_thread_fn(void *arg) { void rtlsdr_sighandler() { - fprintf (stderr, "Signal caught, exiting!\n"); - fprintf (stderr, "Press CTRL + C again to close. Thanks. \n"); //Kindly remind user to double tap CTRL + C + //fprintf (stderr, "Signal caught, exiting!\n"); + //fprintf (stderr, "Press CTRL + C again to close. Thanks. \n"); //Kindly remind user to double tap CTRL + C rtlsdr_cancel_async(dongle.dev); //cleanup_rtlsdr_stream(); //thank the wraith for this one...if it works...didn't work @@ -1070,6 +1072,7 @@ void open_rtlsdr_stream(dsd_opts *opts) if (opts->rtlsdr_ppm_error > 0 || opts->rtlsdr_ppm_error < 0) { //this way will adjust PPM based on negative values as well dongle.ppm_error = opts->rtlsdr_ppm_error; + fprintf (stderr, "Setting RTL PPM Error Set to %d\n", opts->rtlsdr_ppm_error); } if (opts->audio_in_type == 3) { @@ -1152,6 +1155,8 @@ void cleanup_rtlsdr_stream() safe_cond_signal(&output.ready, &output.ready_m); safe_cond_signal(&controller.hop, &controller.hop_m); pthread_join(controller.thread, NULL); + //add socket thread + //pthread_join(socket_freq, NULL); //dongle_cleanup(&dongle); demod_cleanup(&demod); @@ -1162,16 +1167,29 @@ void cleanup_rtlsdr_stream() } -void get_rtlsdr_sample(int16_t *sample) +//void get_rtlsdr_sample(int16_t *sample) +void get_rtlsdr_sample(int16_t *sample, dsd_opts * opts, dsd_state * state) { if (output.queue.empty()) { + if (opts->use_ncurses_terminal == 1) + { + //ncursesPrinter(opts, state); + //printw ("\n\n\n HELP I'M LOCKED!\n"); + } safe_cond_wait(&output.ready, &output.ready_m); + //goto END; } + pthread_rwlock_wrlock(&output.rw); //*sample = output.queue.front(); *sample = output.queue.front() * volume_multiplier; //try multiplying by numbers here for 'gain' output.queue.pop(); pthread_rwlock_unlock(&output.rw); + // END: + // if (1 == 2) + // { + // fprintf (stderr, "This is a dumb thing to fix"); + // } } From 5d44425b10b9b470b756d1a00c238ed6f33a0397 Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Tue, 9 Aug 2022 18:43:44 -0400 Subject: [PATCH 02/10] Cleanup Straggler Code and Language Cleanup Straggler Code and Language --only dropped one F-Bomb this time --- include/dsd.h | 4 ++-- src/dsd_file.c | 4 ++-- src/dsd_ncurses.c | 1 - src/nxdn_lib.c | 10 +--------- src/p25p1_ldu1.c | 1 - src/p25p1_ldu2.c | 1 - 6 files changed, 5 insertions(+), 16 deletions(-) diff --git a/include/dsd.h b/include/dsd.h index 122311e..cfe7067 100644 --- a/include/dsd.h +++ b/include/dsd.h @@ -254,13 +254,13 @@ typedef struct uint32_t rtlsdr_center_freq; int rtlsdr_ppm_error; //was int, changed to float - int audio_in_type; // 0 for device, 1 for file, 2 for portaudio, 3 for rtlsdr + int audio_in_type; // 0 for device, 1 for file, 3 for rtlsdr char audio_out_dev[1024]; int audio_out_fd; SNDFILE *audio_out_file; SF_INFO *audio_out_file_info; - int audio_out_type; // 0 for device, 1 for file, 2 for portaudio + int audio_out_type; // 0 for device, 1 for file, int split; int playoffset; int playoffsetR; diff --git a/src/dsd_file.c b/src/dsd_file.c index eb5c691..e15d24c 100644 --- a/src/dsd_file.c +++ b/src/dsd_file.c @@ -146,7 +146,7 @@ PrintAMBEData (dsd_opts * opts, dsd_state * state, char *ambe_d) //For DMR Stere err = (unsigned char) state->errs2; k = 0; - if (opts->dmr_stereo == 0) //was 0, switched while working out des + if (opts->dmr_stereo == 0) { fprintf (stderr, "\n"); } @@ -181,7 +181,7 @@ PrintAMBEData (dsd_opts * opts, dsd_state * state, char *ambe_d) //For DMR Stere b = ambe_d[48]; if (opts->dmr_stereo == 1) //need to fix the printouts again { - fprintf (stderr, "\n"); //temp disable while I work on DES + fprintf (stderr, "\n"); } } diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index 622200f..a68fb7e 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -677,7 +677,6 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state) } if (S_ISREG(stat_buf.st_mode)) { - //state->symbolfile = fopen("adp_fdma.bin", "r"); opts->symbolfile = fopen(opts->audio_in_dev, "r"); opts->audio_in_type = 4; //symbol capture bin files } diff --git a/src/nxdn_lib.c b/src/nxdn_lib.c index fdd6ef5..e892caa 100644 --- a/src/nxdn_lib.c +++ b/src/nxdn_lib.c @@ -779,14 +779,6 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message) //state->nxdn_key = (KeyID & 0xFF); } - //print scrambler key value if manually inserted - if (state->nxdn_cipher_type == 0x01 && state->R > 0) //scrambler - { - fprintf (stderr, "%s", KYEL); - fprintf(stderr, "Value: 0x%04llX", state->R); //use R and not miN - fprintf (stderr, "%s", KNRM); - } - if(state->NxdnElementsContent.VCallCrcIsGood) { if ( (SourceUnitID & 0xFFFF) > 0 ) @@ -841,7 +833,7 @@ void NXDN_decode_VCALL_IV(dsd_opts * opts, dsd_state * state, uint8_t * Message) for(i = 0; i < 8; i++) { state->NxdnElementsContent.IV[i] = (uint8_t)ConvertBitIntoBytes(&Message[(i + 1) * 8], 8); - //let's load this mother fucker up then lol + state->payload_miN = state->payload_miN << 8 | state->NxdnElementsContent.IV[i]; } diff --git a/src/p25p1_ldu1.c b/src/p25p1_ldu1.c index f309fc6..aa73be6 100644 --- a/src/p25p1_ldu1.c +++ b/src/p25p1_ldu1.c @@ -168,7 +168,6 @@ processLDU1 (dsd_opts* opts, dsd_state* state) { lsd2[i] = lsd[i] + '0'; } - //skip two octets since LSD is part of the encryption portion // TODO: error correction of the LSD bytes... // TODO: do something useful with the LSD bytes... diff --git a/src/p25p1_ldu2.c b/src/p25p1_ldu2.c index 5ff8e3d..d5fe4d2 100644 --- a/src/p25p1_ldu2.c +++ b/src/p25p1_ldu2.c @@ -169,7 +169,6 @@ processLDU2 (dsd_opts * opts, dsd_state * state) { lsd2[i] = lsd[i] + '0'; } - //skip two octets since LSD is part of the encryption portion // TODO: error correction of the LSD bytes... // TODO: do something useful with the LSD bytes... From b39d5d840186e0fab17edbf76f839b96471b7ced Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Tue, 9 Aug 2022 18:45:21 -0400 Subject: [PATCH 03/10] Accidentally included again Deleted again --- cmake/FindLibPortAudio.cmake | 90 ------------------------------------ 1 file changed, 90 deletions(-) delete mode 100644 cmake/FindLibPortAudio.cmake diff --git a/cmake/FindLibPortAudio.cmake b/cmake/FindLibPortAudio.cmake deleted file mode 100644 index 67c43e9..0000000 --- a/cmake/FindLibPortAudio.cmake +++ /dev/null @@ -1,90 +0,0 @@ -# - Try to find Portaudio -# Once done this will define -# -# PORTAUDIO_FOUND - system has Portaudio -# PORTAUDIO_INCLUDE_DIRS - the Portaudio include directory -# PORTAUDIO_LIBRARIES - Link these to use Portaudio -# PORTAUDIO_DEFINITIONS - Compiler switches required for using Portaudio -# PORTAUDIO_VERSION - Portaudio version -# -# Copyright (c) 2006 Andreas Schneider -# -# Redistribution and use is allowed according to the terms of the New BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. -# - - -if (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) - # in cache already - set(PORTAUDIO_FOUND TRUE) -else (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) - if (NOT WIN32) - include(FindPkgConfig) - pkg_check_modules(PORTAUDIO2 portaudio-2.0) - endif (NOT WIN32) - - find_path (PORTAUDIO_INCLUDE_DIRS - NAMES - portaudio.h - PATHS - ${PORTAUDIO2_INCLUDEDIR} - /usr/include - /usr/local/include - /opt/local/include - /sw/include - ) - if (NOT PORTAUDIO_INCLUDE_DIRS) - set (PORTAUDIO_INCLUDE_DIRS - ${PORTAUDIO2_INCLUDE_DIRS} - ) - list (APPEND PORTAUDIO_INCLUDE_DIRS ${PORTAUDIO2_INCLUDEDIR}) - endif (NOT PORTAUDIO_INCLUDE_DIRS) - - find_library (PORTAUDIO_LIBRARIES - NAMES - portaudio - PATHS - ${PORTAUDIO2_LIBDIR} - /usr/lib - /usr/local/lib - /opt/local/lib - /sw/lib - ) - if (NOT PORTAUDIO_LIBRARIES) - if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set(PORTAUDIO_LIBRARIES "${PORTAUDIO2_LIBDIR}/lib${PORTAUDIO2_LIBRARIES}.dylib") - else (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set(PORTAUDIO_LIBRARIES - ${PORTAUDIO2_LIBRARIES} - ) - endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - endif (NOT PORTAUDIO_LIBRARIES) - - if (PORTAUDIO2_VERSION) - set(PORTAUDIO_VERSION - ${PORTAUDIO2_VERSION} - ) - else (PORTAUDIO2_VERSION) - set(PORTAUDIO_VERSION - 18 - ) - endif (PORTAUDIO2_VERSION) - - if (PORTAUDIO_INCLUDE_DIRS AND PORTAUDIO_LIBRARIES) - set(PORTAUDIO_FOUND TRUE) - endif (PORTAUDIO_INCLUDE_DIRS AND PORTAUDIO_LIBRARIES) - - if (PORTAUDIO_FOUND) - if (NOT Portaudio_FIND_QUIETLY) - message(STATUS "Found Portaudio: ${PORTAUDIO_LIBRARIES}") - endif (NOT Portaudio_FIND_QUIETLY) - else (PORTAUDIO_FOUND) - if (Portaudio_FIND_REQUIRED) - message(FATAL_ERROR "Could not find Portaudio") - endif (Portaudio_FIND_REQUIRED) - endif (PORTAUDIO_FOUND) - - # show the PORTAUDIO_INCLUDE_DIRS and PORTAUDIO_LIBRARIES variables only in the advanced view - mark_as_advanced(PORTAUDIO_INCLUDE_DIRS PORTAUDIO_LIBRARIES) - -endif (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) From 11b353089b3df2138e2a9c56e5aebdb34c9313f0 Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Wed, 10 Aug 2022 18:44:56 -0400 Subject: [PATCH 04/10] Data Header and Data Bursts Cleanup Cleanup the code in the dmr_sync.c file, fix minor code errors. Include the dsd-fme-qgis-map file for opening with QGIS and importing LRRP data dumped to ~/lrrp.txt Update the Readme file. --- README.md | 53 ++--- dsd-fme-qgis-map.qgz | Bin 0 -> 9871 bytes include/dsd.h | 6 +- src/dmr_data.c | 10 +- src/dmr_sync.c | 458 ++++++++++++++++++------------------------- src/dsd_main.c | 10 +- 6 files changed, 231 insertions(+), 306 deletions(-) create mode 100644 dsd-fme-qgis-map.qgz diff --git a/README.md b/README.md index 0a55595..589135d 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,34 @@ -# Digital Speech Decoder - Florida Man Edition - -![DSD-FME](https://github.com/lwvmobile/dsd-fme/blob/pulseaudio/dsd-fme.png) +# Digital Speech Decoder - Florida Man Edition This version of DSD is a flavor blend of [szechyjs](https://github.com/szechyjs/dsd "szechyjs") RTL branch and some of my own additions, along with portions of DMR and NXDN code from the [LouisErigHerve](https://github.com/LouisErigHerve/dsd "LouisErigHerve") branch as well. This code also borrows snippets, inspiration, and ideas from other open source works including [Boatbod OP25](https://github.com/boatbod/op25 "Boatbod OP25"), [DSDcc](https://github.com/f4exb/dsdcc "DSDcc"), [SDTRunk](https://github.com/DSheirer/sdrtrunk "SDRTrunk"), [MMDVMHost](https://github.com/g4klx/MMDVMHost "MMDVMHost"), and [LFSR](https://github.com/mattames/LFSR "LFSR"). This project wouldn't be possible without a few good people providing me plenty of sample audio files to run over and over again. Special thanks to jurek1111, KrisMar, noamlivne, racingfan360, iScottyBotty, LimaZulu and hrh17 for the many hours of wav samples submitted by them. -## 2022.06.20 Update - Current Users Please Read!! ## -The executable for this project has been changed from `dsd` to `dsd-fme` so after pulling or cloning the lastest version, make sure to call the software with `dsd-fme`. It may also be beneficial to open your current build folder and run `sudo make uninstall` to uninstall the binary named `dsd` or to run `sudo rm /usr/local/bin/dsd` to alleviate any confusion or from accidentally calling the older version as it will still be installed along with the new `dsd-fme` executable. The Summer Cleanup Project has also seen a lot of the files that weren't in use, or used for github workflows and cmake files removed from the project folder, slimming it down quite considerably. If you have any issue doing a git pull to get the current version, you may need to instead do a fresh clone, build, and install in a clean folder. Check the info below about running download-and-install-nodeps.sh if needed. +## 2022.08.12 Update ## +A new menu system has been introduced in the NCURSES Terminal. While running DSD-FME, a user can simply use the ESC or arrow keys to open the menu and change options on the fly. This is extremely beneficial when wanting to change settings on the fly, and also to alleviate the need to use complex start up command line arguments. All of the previous command line arguments still work and will get you up faster, but if you would rather configure after start up, or change settings while running, the menu system is very helpful in that regard. -## 2022.05.05 Update ## -I have successfully added a DMR Stereo method for listening to voice audio in both TDMA channels/slots simultaneously. This method will also allow for data decoding in the opposite slot if only one voice call is active, allowing the user not to miss any useful information in the second slot while the previous slot is in use. DMR Stereo also has vastly improved handling of MS/Simplex voice decoding and (hit or miss) MS data decoding. To call this method, see the example below. The old method of decoding DMR is also included and is stil the default for the time being, but the DMR Stereo method is working well, users are encouraged to try both methods and find the one that is suitable for them. New commands include: -``` --T Enable DMR 'TDMA' Stereo --F Enable Passive Frame Sync -``` -Please note, for the time being, MBE file saving and WAV file saving are disabled while using DMR Stereo. These features are still present in the default DMR handling and other voice decoder options and will be re-integrated into DMR Stereo in the future. DMR Stereo will also need to be enabled to handle DMR MS/Simplex voice, as it was removed from the default method due to poor performance. +![DSD-FME](https://github.com/lwvmobile/dsd-fme/blob/pulseaudio/dsd-fme.png) -Use Passive Frame Sync if voice in both slots becomes choppy or skips. Using Passive Sync may cause wonky audio though, depends on quality of signal and bit errors present. +To get started with the new menu system, simply launch with: + +`dsd-fme -N 2> log.txt` + +Virtually all the examples listed below can now be set up on the fly with the menu system, no need to check the help or refer to this page. + +This release also has provisional support for playing back OP25 capture bin files, and the creation and playback of its own capture bin files as well (most likely not OP25 compatible). Mileage may vary. Be sure to choose the decoder option required when playing a bin file back, do not rely on auto-detect. Capture Bin files can be used to reliably replay P25, DMR, and NXDN decodings, and can replace the need for MBE file saving in the case of DMR Stereo, allowing for a complete replay of all events on a system, rather than just voice only. + +Per Call wav file creation has been implemented, currently only for DMR Stereo. Complete audio decode wav is available for all over decoder types. LRRP has been revamped, working more consistently, and an option to dump LRRP data to ~/lrrp.txt in the user home directory now exists, and can be imported into open-source QGIS to provide mapping data for LRRP output. Simply open the newly included map file in QGIS and point it at your geographic region. (Be sure the lrrp.txt file exists, and has data populated in it prior to opening the map file in QGIS, otherwise, the map layer may not want to show back up!) + +DMR Data Header decoding has been revamped, and most data burst decoding types tightened up and code cleaned. FEC error checking now implemented on CACH and Burst types, cleaning up some erroneous slot and burst errors. + +## 2022.06.20 Update - Current Users Please Read!! ## +The executable for this project has been changed from `dsd` to `dsd-fme` so after pulling or cloning the lastest version, make sure to call the software with `dsd-fme`. + +## 2022.05.05 Update ## +DMR Stereo method added for listening to voice audio in both TDMA channels/slots simultaneously. ### Example Usage and Note! `dsd-fme` or `./dsd-fme` may need to be used in your usage, depending on if you are running it from the build folder, or if you have run make install. You will need to tweak the examples to your particular usage. Users can always check `dsd-fme -h` for help and all command line switches to use. -`dsd-fme` is all you need to run for pulse input, pulse output, and auto detect for DMR, P25P1, D-STAR, and X2-TDMA decoding. To use other decoding methods which cannot be auto detected, please use the following command line switches. Make sure to route audio into and out of DSD-FME using pavucontrol and virtual sinks as needed. +`dsd-fme` is all you need to run for pulse input, pulse output, and auto detect for DMR, P25P1, D-STAR, and X2-TDMA decoding. To use other decoding methods which cannot be auto detected, please use the following command line switches. Make sure to route audio into and out of DSD-FME using pavucontrol and virtual sinks as needed. ``` -fi NXDN48 @@ -82,21 +90,22 @@ and in a second terminal tab, same folder, run ## Roadmap The Current list of objectives include: -1. ~~Random Tinkering~~ More Random Tinkering +1. Include P25 P2 Audio decoding with capture bin files, then RTL input and/or disc tap input. +~~Random Tinkering~~ ~~More Random Tinkering~~ -2. ~~Implemented Pulse Audio~~ Remove remaining PortAudio code, ~~improved Pulse Audio for stereo output and channel/slot separation~~ and reimplement wav file saving using DMR Stereo method for stereo wav files, or seperate as per call wav files. +2. ~~Implemented Pulse Audio~~ ~~Remove remaining PortAudio code,~~ ~~improved Pulse Audio for stereo output and channel/slot separation~~ ~~and reimplement wav file saving using DMR Stereo method for stereo wav files, or seperate as per call wav files.~~ -3. ~~Improve NXDN and DMR support~~ Continue to improve ~~NXDN and DMR~~ all data and voice decoding. +3. ~~Improve NXDN and DMR support~~ Continue to improve ~~NXDN and DMR~~ all data and voice decoding. 4. ~~More Concise Printouts - Ncurses~~ -5. ~~Make simple to use installer script.~~ +5. ~~Make simple to use installer script.~~ ## How to clone, check out, and build this branch ### Ubuntu 22.04/20.04/LM20/Debian Bullseye or Newer: -Using the included download-and-install.sh should make for a simple and painless clone, build, and install on newer Debian/Ubuntu/Mint/Pi systems. Simply acquire or copy the script, and run it. Update: Ubuntu 22.04 and RPi Bullseye 64-bit has been tested working with the installer script and functions appropriately. +Using the included download-and-install.sh should make for a simple and painless clone, build, and install on newer Debian/Ubuntu/Mint/Pi systems. Simply acquire or copy the script, and run it. Update: Ubuntu 22.04 and RPi Bullseye 64-bit has been tested working with the installer script and functions appropriately. If you need all dependencies build and installed first (only on Debian/Ubuntu/Mint/Pi), run: @@ -119,7 +128,7 @@ The above install.sh should now function on older system types. You can elect to ## Manual Install -First, install dependency packages. This guide will assume you are using Debian/Ubuntu based distros. Check your package manager for equivalent packages if different. +First, install dependency packages. This guide will assume you are using Debian/Ubuntu based distros. Check your package manager for equivalent packages if different. ``` sudo apt update @@ -139,7 +148,7 @@ sudo apt install libpulse-dev libsndfile1-dev libfftw3-dev liblapack-dev socat l wget -O itpp-latest.tar.bz2 http://sourceforge.net/projects/itpp/files/latest/download?source=files tar xjf itpp* #if you can't cd into this folder, double check folder name first -cd itpp-4.3.1 +cd itpp-4.3.1 mkdir build cd build cmake .. @@ -225,5 +234,3 @@ GPG Key ID: 0x3F1D7FD0 (74EF 430D F7F2 0A48 FCE6 F630 FAA2 635D 3F1D 7FD0) LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - diff --git a/dsd-fme-qgis-map.qgz b/dsd-fme-qgis-map.qgz new file mode 100644 index 0000000000000000000000000000000000000000..0552ba6634b13c4cb01aed2200787661cb01efd7 GIT binary patch literal 9871 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 b?Ej+h-wp5x|9cANKa2P;Km0cb1@*rGKoRA8 literal 0 HcmV?d00001 diff --git a/include/dsd.h b/include/dsd.h index cfe7067..fa9b4ad 100644 --- a/include/dsd.h +++ b/include/dsd.h @@ -519,8 +519,8 @@ typedef struct TimeSlotVoiceSuperFrame_t TS2SuperFrame; char dmr_branding[25]; - uint8_t dmr_12_rate_sf[2][84]; //going seven blocks deep by 12 bytes //[slot][value] - uint8_t dmr_34_rate_sf[2][96]; //going six blocks deep by 16 bytes //[slot][value] + uint8_t dmr_12_rate_sf[2][288]; //was 84, expanded to 288 to prevent possible crash if more comes in than expected + uint8_t dmr_34_rate_sf[2][288]; //was 96, expanded to 288 to prevent possible crash if more comes in than expected int dmr_stereo_payload[144]; //load up 144 dibit buffer for every single DMR TDMA frame uint8_t data_header_blocks[2]; //collect number of blocks to follow from data header per slot uint8_t data_header_padding[2]; //collect number of padding octets in last block per slot @@ -833,7 +833,7 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98], uint8_t syncdata[48], uint8_t SlotType[20]); void ProcessMBCData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]); void ProcessMBChData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]); -void ProcessWTFData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]); +void ProcessReservedData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]); void ProcessUnifiedData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]); //LFSR code courtesy of https://github.com/mattames/LFSR/ diff --git a/src/dmr_data.c b/src/dmr_data.c index 9e98f27..2c6b709 100644 --- a/src/dmr_data.c +++ b/src/dmr_data.c @@ -523,14 +523,14 @@ processDMRdata (dsd_opts * opts, dsd_state * state) /* Burst = MBC Header */ case 0b0100: { - //ProcessMBChData(opts, state, (uint8_t *)info, (uint8_t *)syncdata, (uint8_t *)SlotType); + ProcessMBChData(opts, state, (uint8_t *)info, (uint8_t *)syncdata, (uint8_t *)SlotType); break; } /* Burst = MBC Continuation*/ case 0b0101: { - //ProcessMBCData(opts, state, (uint8_t *)info, (uint8_t *)syncdata, (uint8_t *)SlotType); + ProcessMBCData(opts, state, (uint8_t *)info, (uint8_t *)syncdata, (uint8_t *)SlotType); break; } @@ -566,14 +566,14 @@ processDMRdata (dsd_opts * opts, dsd_state * state) /* Burst = Rate 1 DATA */ case 0b1010: { - //Process1Data(opts, state, (uint8_t *)info, (uint8_t *)syncdata, (uint8_t *)SlotType); + Process1Data(opts, state, (uint8_t *)info, (uint8_t *)syncdata, (uint8_t *)SlotType); break; } /* Burst = Unified Single Block DATA */ case 0b1101: { - //ProcessUnifiedData(opts, state, (uint8_t *)info, (uint8_t *)syncdata, (uint8_t *)SlotType); + ProcessUnifiedData(opts, state, (uint8_t *)info, (uint8_t *)syncdata, (uint8_t *)SlotType); break; } @@ -581,7 +581,7 @@ processDMRdata (dsd_opts * opts, dsd_state * state) default: { /* Nothing to do */ - //ProcessWTFData(opts, state, (uint8_t *)info, (uint8_t *)syncdata, (uint8_t *)SlotType); + ProcessReservedData(opts, state, (uint8_t *)info, (uint8_t *)syncdata, (uint8_t *)SlotType); break; } } /* End switch(burst) */ diff --git a/src/dmr_sync.c b/src/dmr_sync.c index 662eb26..082f8aa 100644 --- a/src/dmr_sync.c +++ b/src/dmr_sync.c @@ -17,8 +17,6 @@ #include "dsd.h" - -//time_t now; char * getTimeL(void) //get pretty hh:mm:ss timestamp { time_t t = time(NULL); @@ -47,11 +45,10 @@ char * getDateL(void) { return curr2; } -//Need to work in a way to seperate data bursts on seperate slots, having data pouring into both slots simultaneously -//Need to make seperate superframe arrays for each +//Trellis Decoding still needs work, so be surprised by bad decodes void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98], uint8_t syncdata[48], uint8_t SlotType[20]) { - //NEED TRELLIS DECODER HERE + uint32_t i, j, k; uint32_t CRCExtracted = 0; uint32_t CRCComputed = 0; @@ -76,52 +73,18 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] TSVoiceSupFrame = &state->TS2SuperFrame; } - CRCExtracted = 0; - CRCComputed = 0; - IrrecoverableErrors = 0; - - /* Deinterleave DMR data */ - //BPTCDeInterleaveDMRData(info, DeInteleavedData); - //info is the dibits; is output DeInterleavedData? - //data is dibits I think, so sub info for data? only wants 98U dibits though. - //returns 'payload' which is 144 bit array, so DmrDataBit maybe? - //CDMRTrellisDecode(const unsigned char* data, unsigned char* payload) unsigned char tdibits_reverse[98]; unsigned char tdibits_inverted[98]; unsigned char tdibits_to_bits[196]; - if (1 == 2) - { - //fprintf (stderr, "\n Raw Trellis Dibits to Bits\n "); - for (i = 0; i < 98; i++) - { - tdibits_to_bits[i * 2] = (tdibits[i] >> 0) & 1; - tdibits_to_bits[(i * 2) + 1] = (tdibits[1] >> 1) & 1; - //fprintf (stderr, "%d%d", tdibits_to_bits[i * 2], tdibits_to_bits[(i * 2) + 1]); - } - } - //fprintf (stderr, "\n Raw Trellis Dibits\n "); for (i = 0; i < 98; i++) { - //fprintf (stderr, "#%d [%X] ", 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; } - unsigned char TrellisReturn[18]; - //CDMRTrellisDecode(tdibits, TrellisReturn); //figure out how this works!! CDMRTrellisDecode(tdibits_reverse, TrellisReturn); //NEEDS REVERSE DIBITS! - /* Extract the BPTC 196,96 DMR data */ - //IrrecoverableErrors = BPTC_196x96_Extract_Data(DeInteleavedData, DmrDataBit, R); - // - //CDMRTrellisDibitsToPoints(const signed char* dibits, unsigned char* points) ?? - // - /* Fill the reserved bit (R(0)-R(2) of the BPTC(196,96) block) */ - //BPTCReservedBits = (R[0] & 0x01) | ((R[1] << 1) & 0x02) | ((R[2] << 2) & 0x08); - for(i = 0, j = 0; i < 18; i++, j+=8) { DmrDataBit[j + 0] = (TrellisReturn[i] >> 7) & 0x01; @@ -134,28 +97,12 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] DmrDataBit[j + 7] = (TrellisReturn[i] >> 0) & 0x01; } - //the reverse card - /* - for(i = 0, j = 0; i < 18; i++, j+=8) - { - DmrDataBit[j + 0] = (TrellisReturn[17-i] >> 0) & 0x01; - DmrDataBit[j + 1] = (TrellisReturn[17-i] >> 1) & 0x01; - DmrDataBit[j + 2] = (TrellisReturn[17-i] >> 2) & 0x01; - DmrDataBit[j + 3] = (TrellisReturn[17-i] >> 3) & 0x01; - DmrDataBit[j + 4] = (TrellisReturn[17-i] >> 4) & 0x01; - DmrDataBit[j + 5] = (TrellisReturn[17-i] >> 5) & 0x01; - DmrDataBit[j + 6] = (TrellisReturn[17-i] >> 6) & 0x01; - DmrDataBit[j + 7] = (TrellisReturn[17-i] >> 7) & 0x01; - } - */ - /* Convert the 96 bit of voice LC Header data into 12 bytes */ - //define our block and padding values uint8_t blocks = state->data_header_blocks[slot] - 1; //subtract 1 for the relevant value in the calc below uint8_t padding = state->data_header_padding[slot]; //shift data in the superframe up a block - k = 0; //is this still used? + k = 0; for(i = 0; i < 16; i++) //16, or 18? seems to have two extra bytes in front currently { state->dmr_34_rate_sf[slot][i] = state->dmr_34_rate_sf[slot][i+16]; @@ -168,7 +115,6 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] for(j = 0; j < 8; j++) { DmrDataByte[i] = DmrDataByte[i] << 1; - //DmrDataByte[i] = DmrDataByte[i] | (DmrDataBit[k] & 0x01); DmrDataByte[i] = DmrDataByte[i] | (DmrDataBit[k] & 0x01); k++; } @@ -182,8 +128,6 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] int message_legnth = 0; if ( (state->dmr_34_rate_sf[slot][0] & 0x7F) == 0x45) //Start LRRP now { - //test opening a file with fopen and dumping the LRRP data into it. - //just going to use the same code from EDACS-FM //find user home directory and append directory and filename. FILE * pFile; //put this outside of the if statement? @@ -201,7 +145,6 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] //hard code filename override for those wanting to use other software //pFile = fopen("DSDPlus.LRRP", "a"); - fprintf (pFile, "%s\t %s\t", getDateL(), getTimeL()); //current timestamp, may find a way to only add this IF no included timestamp in LRRP data? fprintf (pFile, "%08lld\t", state->dmr_lrrp_source[state->currentslot]); //source address from data header } @@ -363,7 +306,7 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] { fprintf (stderr, "%s",KGRN); fprintf (stderr, "\n Rate 3/4 Superframe - Slot [%d]\n ",slot+1); - for (i = 0; i < (16*4); i++) //16, or 18? + for (i = 0; i < ((blocks+1)*16); i++) //(16*4), using 16 since we jump the first two bytes { fprintf (stderr, "[%02X]", state->dmr_34_rate_sf[slot][i]); if (i == 15 || i == 31 || i == 47 || i == 63 || i == 79) @@ -376,7 +319,7 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] state->data_block_counter[state->currentslot]++; //increment block counter } -//This is Data Header, why did I name it Data Data +//This is Data Header void ProcessDataData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) { short int slot = 0; @@ -384,12 +327,12 @@ void ProcessDataData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint //see if we still need this portion if we are going to use the data block info //clear out the 3/4 rate data superframe so we don't repeat old info - for (short int i = 0; i < (16*6); i++) + for (short int i = 0; i < 288; i++) //expanded to 288 to prevent crashing { state->dmr_34_rate_sf[slot][i] = 0; } //clear out the 1/2 rate data superframe so we don't repeat old info - for (short int i = 0; i < (12*5); i++) //12*5 = 60 + for (short int i = 0; i < 288; i++) //expanded to 288 to prevent crashing { state->dmr_12_rate_sf[slot][i] = 0; } @@ -407,13 +350,6 @@ void ProcessDataData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint uint8_t R[3]; uint8_t BPTCReservedBits = 0; - // Extract parameters for logging purposes - uint8_t csbk_lb = 0; - uint8_t csbk_pf = 0; - uint8_t csbk_o = 0; - uint8_t csbk_fid = 0; - uint64_t csbk_data = 0; - uint8_t csbk = 0; /* Check the current time slot */ if(state->currentslot == 0) @@ -453,23 +389,17 @@ void ProcessDataData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint /* Fill the CRC extracted (before Reed-Solomon (12,9) FEC correction) */ CRCExtracted = 0; - //for(i = 0; i < 24; i++) for(i = 0; i < 16; i++) { CRCExtracted = CRCExtracted << 1; - //CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 72] & 1); - CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); //80-96 for PI header + CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); } - //Look into whether or not we need to run these CRC checks for this header information - //and see if its applied the same or differently /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ - //CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? CRCExtracted = CRCExtracted ^ 0xCCCC; /* Check/correct the full link control data and compute the Reed-Solomon (12,9) CRC */ CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0xCCCC); - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x6969); /* Convert corrected 12 bytes into 96 bits */ for(i = 0, j = 0; i < 12; i++, j+=8) @@ -686,116 +616,97 @@ void Process1Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t uint32_t IrrecoverableErrors = 0; uint8_t DeInteleavedData[196]; uint8_t DmrDataBit[96]; - uint8_t DmrDataByte[12]; + uint8_t DmrDataByte[25]; TimeSlotVoiceSuperFrame_t * TSVoiceSupFrame = NULL; uint8_t R[3]; uint8_t BPTCReservedBits = 0; + short int slot = 0; + slot = (short int)state->currentslot; - // Extract parameters for logging purposes - uint8_t csbk_lb = 0; - uint8_t csbk_pf = 0; - uint8_t csbk_o = 0; - uint8_t csbk_fid = 0; - uint64_t csbk_data = 0; - uint8_t csbk = 0; - - /* Check the current time slot */ - if(state->currentslot == 0) - { - TSVoiceSupFrame = &state->TS1SuperFrame; - } - else - { - TSVoiceSupFrame = &state->TS2SuperFrame; - } - - CRCExtracted = 0; - CRCComputed = 0; - IrrecoverableErrors = 0; - - /* Deinterleave DMR data */ - BPTCDeInterleaveDMRData(info, DeInteleavedData); - - /* Extract the BPTC 196,96 DMR data */ - IrrecoverableErrors = BPTC_196x96_Extract_Data(DeInteleavedData, DmrDataBit, R); - - /* Fill the reserved bit (R(0)-R(2) of the BPTC(196,96) block) */ - BPTCReservedBits = (R[0] & 0x01) | ((R[1] << 1) & 0x02) | ((R[2] << 2) & 0x08); - - /* Convert the 96 bit of voice LC Header data into 12 bytes */ + //define our block and padding values + uint8_t blocks = state->data_header_blocks[slot] - 1; //subtract 1 for the relevant value in the calc below + uint8_t padding = state->data_header_padding[slot]; + //shift data in the superframe up a block k = 0; - for(i = 0; i < 12; i++) + for(i = 0; i < 24; i++) { + //reuse dmr_12_rate_sf since 12, we can use 2 blocks to load 1 block here + state->dmr_12_rate_sf[slot][i] = state->dmr_12_rate_sf[slot][i+24]; //shift block 2 to block 1 + state->dmr_12_rate_sf[slot][i+24] = state->dmr_12_rate_sf[slot][i+48]; //shift block 3 to block 2 + state->dmr_12_rate_sf[slot][i+48] = state->dmr_12_rate_sf[slot][i+72]; //shift block 3 to block 2 DmrDataByte[i] = 0; for(j = 0; j < 8; j++) { DmrDataByte[i] = DmrDataByte[i] << 1; - DmrDataByte[i] = DmrDataByte[i] | (DmrDataBit[k] & 0x01); + DmrDataByte[i] = DmrDataByte[i] | (info[k] ); //& 1 k++; } + + //start loading new superframe at appropriate block count determined by the data header + state->dmr_12_rate_sf[slot][i+(blocks*24)] = DmrDataByte[i]; } + //need to rework this for rate 1 data, will be a crc 9 for each confirmed block, + //and/or CRC 32 on last block (full superframe) + //NOTE 2: Only used when CRC-9 present in burst. + /* Fill the CRC extracted (before Reed-Solomon (12,9) FEC correction) */ - CRCExtracted = 0; - //for(i = 0; i < 24; i++) - for(i = 0; i < 16; i++) - { - CRCExtracted = CRCExtracted << 1; - //CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 72] & 1); - CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); //80-96 for PI header - } + // CRCExtracted = 0; + // //for(i = 0; i < 24; i++) + // for(i = 0; i < 16; i++) + // { + // CRCExtracted = CRCExtracted << 1; + // //CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 72] & 1); + // CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); + // } - //Look into whether or not we need to run these CRC checks for this header information - //and see if its applied the same or differently - /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ - //CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? //CRCExtracted = CRCExtracted ^ 0x6969; /* Check/correct the full link control data and compute the Reed-Solomon (12,9) CRC */ //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x969696); - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x6969); - /* Convert corrected 12 bytes into 96 bits */ - for(i = 0, j = 0; i < 12; i++, j+=8) - { - DmrDataBit[j + 0] = (DmrDataByte[i] >> 7) & 0x01; - DmrDataBit[j + 1] = (DmrDataByte[i] >> 6) & 0x01; - DmrDataBit[j + 2] = (DmrDataByte[i] >> 5) & 0x01; - DmrDataBit[j + 3] = (DmrDataByte[i] >> 4) & 0x01; - DmrDataBit[j + 4] = (DmrDataByte[i] >> 3) & 0x01; - DmrDataBit[j + 5] = (DmrDataByte[i] >> 2) & 0x01; - DmrDataBit[j + 6] = (DmrDataByte[i] >> 1) & 0x01; - DmrDataBit[j + 7] = (DmrDataByte[i] >> 0) & 0x01; - } - // - if (DmrDataByte[0] == 0x43) - { - //fprintf (stderr, "\n IP4 Source IP:"); - //fprintf (stderr, " %d", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); - //fprintf (stderr, " Destination IP:"); - //fprintf (stderr, " %d", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); - } - - if (DmrDataByte[0] == 0x01) - { - //fprintf (stderr, "\n LRRP Control ACK - "); - //fprintf (stderr, " Source:"); - //fprintf (stderr, " %d", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); - //fprintf (stderr, " Destination:"); - //fprintf (stderr, " %d", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); - } //Full if (opts->payload == 1) { fprintf (stderr, "%s", KCYN); - fprintf (stderr, "\nFull Rate 1 Payload "); - for (i = 0; i < 12; i++) + fprintf (stderr, "\nFull Rate 1 Payload \n"); + for (i = 0; i < 24; i++) { fprintf (stderr, "[%02X]", DmrDataByte[i]); + if (i == 11) + { + fprintf (stderr, "\n"); + } + } + fprintf (stderr, "\n Hex to Ascii - "); + for (i = 0; i < 24; i++) + { + if (DmrDataByte[i] <= 0x7E && DmrDataByte[i] >=0x20) + { + fprintf (stderr, "%c", DmrDataByte[i]); + } + else fprintf (stderr, "."); } fprintf (stderr, "%s", KNRM); } + //Full Super Frame - Debug Output + if (opts->payload == 1 && state->data_block_counter[state->currentslot] == state->data_header_blocks[state->currentslot]) + { + fprintf (stderr, "%s",KGRN); + fprintf (stderr, "\n Rate 1 Superframe - Slot [%d]\n ",slot+1); + for (i = 0; i < ((blocks+1)*24); i++) //only print as many as we have blocks + { + fprintf (stderr, "[%02X]", state->dmr_12_rate_sf[slot][i]); + if (i == 11 || i == 23 || i == 35 || i == 47 || i == 59 || i == 71) //line break and two spaces after each 12 bytes + { + fprintf (stderr, "\n "); + } + } + fprintf (stderr, "%s ", KNRM); + } + state->data_block_counter[state->currentslot]++; //increment block counter + } void ProcessMBChData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) @@ -813,14 +724,6 @@ void ProcessMBChData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint uint8_t R[3]; uint8_t BPTCReservedBits = 0; - // Extract parameters for logging purposes - uint8_t csbk_lb = 0; - uint8_t csbk_pf = 0; - uint8_t csbk_o = 0; - uint8_t csbk_fid = 0; - uint64_t csbk_data = 0; - uint8_t csbk = 0; - /* Check the current time slot */ if(state->currentslot == 0) { @@ -859,22 +762,16 @@ void ProcessMBChData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint /* Fill the CRC extracted (before Reed-Solomon (12,9) FEC correction) */ CRCExtracted = 0; - //for(i = 0; i < 24; i++) for(i = 0; i < 16; i++) { CRCExtracted = CRCExtracted << 1; - //CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 72] & 1); - CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); //80-96 for PI header + CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); } - //Look into whether or not we need to run these CRC checks for this header information - //and see if its applied the same or differently /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ - //CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? CRCExtracted = CRCExtracted ^ 0xAAAA; /* Check/correct the full link control data and compute the Reed-Solomon (12,9) CRC */ - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x969696); CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0xAAAA); /* Convert corrected 12 bytes into 96 bits */ @@ -889,23 +786,7 @@ void ProcessMBChData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint DmrDataBit[j + 6] = (DmrDataByte[i] >> 1) & 0x01; DmrDataBit[j + 7] = (DmrDataByte[i] >> 0) & 0x01; } - // - if (DmrDataByte[0] == 0x43) - { - //fprintf (stderr, "\n IP4 Source IP:"); - //fprintf (stderr, " %d", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); - //fprintf (stderr, " Destination IP:"); - //fprintf (stderr, " %d", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); - } - if (DmrDataByte[0] == 0x01) - { - //fprintf (stderr, "\n LRRP Control ACK - "); - //fprintf (stderr, " Source:"); - //fprintf (stderr, " %d", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); - //fprintf (stderr, " Destination:"); - //fprintf (stderr, " %d", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); - } //Full if (opts->payload == 1) { @@ -935,14 +816,6 @@ void ProcessMBCData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 uint8_t R[3]; uint8_t BPTCReservedBits = 0; - // Extract parameters for logging purposes - uint8_t csbk_lb = 0; - uint8_t csbk_pf = 0; - uint8_t csbk_o = 0; - uint8_t csbk_fid = 0; - uint64_t csbk_data = 0; - uint8_t csbk = 0; - /* Check the current time slot */ if(state->currentslot == 0) { @@ -979,25 +852,24 @@ void ProcessMBCData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 } } - /* Fill the CRC extracted (before Reed-Solomon (12,9) FEC correction) */ - CRCExtracted = 0; - //for(i = 0; i < 24; i++) - for(i = 0; i < 16; i++) - { - CRCExtracted = CRCExtracted << 1; - //CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 72] & 1); - CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); //80-96 for PI header - } + //NO CRC or FEC on MBC Cont. Data? + //...that seems to be according to the manual - //Look into whether or not we need to run these CRC checks for this header information - //and see if its applied the same or differently + /* Fill the CRC extracted (before Reed-Solomon (12,9) FEC correction) */ + // CRCExtracted = 0; + // for(i = 0; i < 16; i++) + // { + // CRCExtracted = CRCExtracted << 1; + // CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); + // } + + //No CRC Mask for MBC Continuation Data + //Note 1. None required for intermediate or last blocks. /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ - //CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? //CRCExtracted = CRCExtracted ^ 0x6969; /* Check/correct the full link control data and compute the Reed-Solomon (12,9) CRC */ - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x969696); - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x6969); + // CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x0); //0, or FFFF? /* Convert corrected 12 bytes into 96 bits */ for(i = 0, j = 0; i < 12; i++, j+=8) @@ -1011,28 +883,12 @@ void ProcessMBCData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 DmrDataBit[j + 6] = (DmrDataByte[i] >> 1) & 0x01; DmrDataBit[j + 7] = (DmrDataByte[i] >> 0) & 0x01; } - // - if (DmrDataByte[0] == 0x43) - { - //fprintf (stderr, "\n IP4 Source IP:"); - //fprintf (stderr, " %d", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); - //fprintf (stderr, " Destination IP:"); - //fprintf (stderr, " %d", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); - } - if (DmrDataByte[0] == 0x01) - { - //fprintf (stderr, "\n LRRP Control ACK - "); - //fprintf (stderr, " Source:"); - //fprintf (stderr, " %d", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); - //fprintf (stderr, " Destination:"); - //fprintf (stderr, " %d", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); - } //Full if (opts->payload == 1) { fprintf (stderr, "%s", KCYN); - fprintf (stderr, "\nFull MBC Payload "); + fprintf (stderr, "\nFull MBC Continuation Payload "); for (i = 0; i < 12; i++) { fprintf (stderr, "[%02X]", DmrDataByte[i]); @@ -1042,7 +898,8 @@ void ProcessMBCData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 } -void ProcessWTFData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) +//This data shouldn't be active, but come here to dump in case of data burst type decoding failure +void ProcessReservedData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) { //Placeholder uint32_t i, j, k; @@ -1057,13 +914,74 @@ void ProcessWTFData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 uint8_t R[3]; uint8_t BPTCReservedBits = 0; - // Extract parameters for logging purposes - uint8_t csbk_lb = 0; - uint8_t csbk_pf = 0; - uint8_t csbk_o = 0; - uint8_t csbk_fid = 0; - uint64_t csbk_data = 0; - uint8_t csbk = 0; + /* Check the current time slot */ + if(state->currentslot == 0) + { + TSVoiceSupFrame = &state->TS1SuperFrame; + } + else + { + TSVoiceSupFrame = &state->TS2SuperFrame; + } + + /* Convert the 196 bit of voice LC Header data into 12 bytes */ + k = 0; + for(i = 0; i < 24; i++) + { + DmrDataByte[i] = 0; + for(j = 0; j < 8; j++) + { + DmrDataByte[i] = DmrDataByte[i] << 1; + DmrDataByte[i] = DmrDataByte[i] | info[i]; + k++; + } + } + + /* Convert corrected 12 bytes into 96 bits */ + for(i = 0, j = 0; i < 12; i++, j+=8) + { + DmrDataBit[j + 0] = (DmrDataByte[i] >> 7) & 0x01; + DmrDataBit[j + 1] = (DmrDataByte[i] >> 6) & 0x01; + DmrDataBit[j + 2] = (DmrDataByte[i] >> 5) & 0x01; + DmrDataBit[j + 3] = (DmrDataByte[i] >> 4) & 0x01; + DmrDataBit[j + 4] = (DmrDataByte[i] >> 3) & 0x01; + DmrDataBit[j + 5] = (DmrDataByte[i] >> 2) & 0x01; + DmrDataBit[j + 6] = (DmrDataByte[i] >> 1) & 0x01; + DmrDataBit[j + 7] = (DmrDataByte[i] >> 0) & 0x01; + } + + //Full + if (opts->payload == 1) + { + fprintf (stderr, "%s", KCYN); + fprintf (stderr, "\nFull Reserved Payload "); + for (i = 0; i < 12; i++) + { + fprintf (stderr, "[%02X]", DmrDataByte[i]); + } + fprintf (stderr, "%s", KRED); + fprintf (stderr, "\nINFO! This Payload Dump May be caused by erroneous data burst type decoding! "); + fprintf (stderr, "%s", KNRM); + } + +} + +void ProcessUnifiedData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) +{ + + uint32_t i, j, k; + uint32_t CRCExtracted = 0; + uint32_t CRCComputed = 0; + uint32_t CRCCorrect = 0; + uint32_t IrrecoverableErrors = 0; + uint8_t DeInteleavedData[196]; + uint8_t DmrDataBit[96]; + uint8_t DmrDataByte[12]; + TimeSlotVoiceSuperFrame_t * TSVoiceSupFrame = NULL; + uint8_t R[3]; + uint8_t BPTCReservedBits = 0; + short int slot = 0; + slot = (short int)state->currentslot; /* Check the current time slot */ if(state->currentslot == 0) @@ -1088,7 +1006,7 @@ void ProcessWTFData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 /* Fill the reserved bit (R(0)-R(2) of the BPTC(196,96) block) */ BPTCReservedBits = (R[0] & 0x01) | ((R[1] << 1) & 0x02) | ((R[2] << 2) & 0x08); - /* Convert the 96 bit of voice LC Header data into 12 bytes */ + k = 0; for(i = 0; i < 12; i++) { @@ -1099,6 +1017,7 @@ void ProcessWTFData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 DmrDataByte[i] = DmrDataByte[i] | (DmrDataBit[k] & 0x01); k++; } + } /* Fill the CRC extracted (before Reed-Solomon (12,9) FEC correction) */ @@ -1107,19 +1026,32 @@ void ProcessWTFData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 for(i = 0; i < 16; i++) { CRCExtracted = CRCExtracted << 1; - //CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 72] & 1); - CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); //80-96 for PI header + CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); } //Look into whether or not we need to run these CRC checks for this header information //and see if its applied the same or differently /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ - //CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? - //CRCExtracted = CRCExtracted ^ 0x6969; + CRCExtracted = CRCExtracted ^ 0x3333; /* Check/correct the full link control data and compute the Reed-Solomon (12,9) CRC */ - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x969696); - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x6969); + CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x3333); + + //test + if((IrrecoverableErrors == 0) && CRCCorrect) + { + //fprintf (stderr, "\n(Unified Data CRC Okay)"); + } + else if((IrrecoverableErrors == 0)) + { + //fprintf (stderr, "\n(Unified Data FEC Okay)"); + } + else + { + fprintf (stderr, "%s", KRED); + fprintf (stderr, ("\n(Unified Rate CRC Fail, FEC Fail)")); + fprintf (stderr, "%s", KNRM); + } /* Convert corrected 12 bytes into 96 bits */ for(i = 0, j = 0; i < 12; i++, j+=8) @@ -1133,38 +1065,30 @@ void ProcessWTFData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 DmrDataBit[j + 6] = (DmrDataByte[i] >> 1) & 0x01; DmrDataBit[j + 7] = (DmrDataByte[i] >> 0) & 0x01; } - // - if (DmrDataByte[0] == 0x43) - { - //fprintf (stderr, "\n IP4 Source IP:"); - //fprintf (stderr, " %d", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); - //fprintf (stderr, " Destination IP:"); - //fprintf (stderr, " %d", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); - } - if (DmrDataByte[0] == 0x01) - { - //fprintf (stderr, "\n LRRP Control ACK - "); - //fprintf (stderr, " Source:"); - //fprintf (stderr, " %d", (DmrDataByte[2] <<16 ) + (DmrDataByte[3] << 8) + DmrDataByte[4] ); - //fprintf (stderr, " Destination:"); - //fprintf (stderr, " %d", (DmrDataByte[5] <<16 ) + (DmrDataByte[6] <<8 ) + DmrDataByte[7] ); - } //Full if (opts->payload == 1) { - fprintf (stderr, "%s", KCYN); - fprintf (stderr, "\nFull WTF Payload "); + fprintf (stderr,"%s", KCYN); + fprintf (stderr, "\n Full Unified Data Payload "); for (i = 0; i < 12; i++) { fprintf (stderr, "[%02X]", DmrDataByte[i]); } - fprintf (stderr, "%s", KNRM); + fprintf (stderr, "\n Hex to Ascii - "); + for (i = 0; i < 12; i++) + { + if (DmrDataByte[i] <= 0x7E && DmrDataByte[i] >=0x20) + { + fprintf (stderr, "%c", DmrDataByte[i]); + } + else fprintf (stderr, "."); + } + fprintf (stderr,"%s", KNRM); } } - void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) { @@ -1232,23 +1156,17 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ /* Fill the CRC extracted (before Reed-Solomon (12,9) FEC correction) */ CRCExtracted = 0; - //for(i = 0; i < 24; i++) - for(i = 0; i < 16; i++) + for(i = 0; i < 24; i++) { CRCExtracted = CRCExtracted << 1; CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 72] & 1); - //CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); //80-96 for PI header } - //Look into whether or not we need to run these CRC checks for this header information - //and see if its applied the same or differently /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? - //CRCExtracted = CRCExtracted ^ 0x6969; /* Check/correct the full link control data and compute the Reed-Solomon (12,9) CRC */ CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x969696); - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x6969); //test if((IrrecoverableErrors == 0) && CRCCorrect) @@ -1466,7 +1384,7 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ for (i = 0; i < ((blocks+1)*12); i++) //only print as many as we have blocks { fprintf (stderr, "[%02X]", state->dmr_12_rate_sf[slot][i]); - if (i == 11 || i == 23 || i == 35 || i == 47 || i == 59 || i == 71) //line break and two spaces after each 16 bytes + if (i == 11 || i == 23 || i == 35 || i == 47 || i == 59 || i == 71) //line break and two spaces after each 12 bytes { fprintf (stderr, "\n "); } diff --git a/src/dsd_main.c b/src/dsd_main.c index 8363c04..4e76cb4 100644 --- a/src/dsd_main.c +++ b/src/dsd_main.c @@ -153,14 +153,14 @@ noCarrier (dsd_opts * opts, dsd_state * state) state->dmr_lrrp_source[1] = 0; //initialize 12 rate superframe - for (short i = 0; i < 84; i++) + for (short i = 0; i < 288; i++) { state->dmr_12_rate_sf[0][i] = 0; state->dmr_12_rate_sf[1][i] = 0; } //initialize 34 rate superframe - for (short i = 0; i < 96; i++) + for (short i = 0; i < 288; i++) { state->dmr_34_rate_sf[0][i] = 0; state->dmr_34_rate_sf[1][i] = 0; @@ -488,14 +488,14 @@ initState (dsd_state * state) state->dmr_lrrp_source[1] = 0; //initialize 12 rate superframe - for (short i = 0; i < 84; i++) + for (short i = 0; i < 288; i++) { state->dmr_12_rate_sf[0][i] = 0; state->dmr_12_rate_sf[1][i] = 0; } //initialize 34 rate superframe - for (short i = 0; i < 96; i++) + for (short i = 0; i < 288; i++) { state->dmr_34_rate_sf[0][i] = 0; state->dmr_34_rate_sf[1][i] = 0; @@ -1042,7 +1042,7 @@ main (int argc, char **argv) fprintf (stderr,"Writing + Appending decoded audio to file %s\n", opts.wav_out_file); openWavOutFile (&opts, &state); break; - + case 'B': sscanf (optarg, "%d", &opts.serial_baud); break; From 6043b14c1369fad71e218d6c9efe7ef1ad345c49 Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Wed, 10 Aug 2022 20:03:26 -0400 Subject: [PATCH 05/10] Update Readme Update Readme; Minor Bug Fix. Update dmr_so and dmr_soR in the Voice LC Header. --- README.md | 2 +- src/dmr_sync.c | 28 +++++++++++++++++++++------- src/dsd_main.c | 4 ++-- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 589135d..6b7c195 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ To get started with the new menu system, simply launch with: Virtually all the examples listed below can now be set up on the fly with the menu system, no need to check the help or refer to this page. -This release also has provisional support for playing back OP25 capture bin files, and the creation and playback of its own capture bin files as well (most likely not OP25 compatible). Mileage may vary. Be sure to choose the decoder option required when playing a bin file back, do not rely on auto-detect. Capture Bin files can be used to reliably replay P25, DMR, and NXDN decodings, and can replace the need for MBE file saving in the case of DMR Stereo, allowing for a complete replay of all events on a system, rather than just voice only. +This release also has provisional support for playing back OP25 capture bin files, and the creation and playback of its own capture bin files as well (most likely not OP25 compatible). Mileage may vary. Be sure to choose the decoder option required when playing a bin file back, do not rely on auto-detect. Capture Bin files can be used to reliably replay P25, DMR BS, and NXDN decodings, and can replace the need for MBE file saving in the case of DMR Stereo, allowing for a complete replay of all events on a system, rather than just voice only. Per Call wav file creation has been implemented, currently only for DMR Stereo. Complete audio decode wav is available for all over decoder types. LRRP has been revamped, working more consistently, and an option to dump LRRP data to ~/lrrp.txt in the user home directory now exists, and can be imported into open-source QGIS to provide mapping data for LRRP output. Simply open the newly included map file in QGIS and point it at your geographic region. (Be sure the lrrp.txt file exists, and has data populated in it prior to opening the map file in QGIS, otherwise, the map layer may not want to show back up!) diff --git a/src/dmr_sync.c b/src/dmr_sync.c index 082f8aa..b9c2d76 100644 --- a/src/dmr_sync.c +++ b/src/dmr_sync.c @@ -45,7 +45,7 @@ char * getDateL(void) { return curr2; } -//Trellis Decoding still needs work, so be surprised by bad decodes +//Trellis Decoding still needs work, so don't be surprised by bad decodes void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98], uint8_t syncdata[48], uint8_t SlotType[20]) { @@ -1029,8 +1029,6 @@ void ProcessUnifiedData(dsd_opts * opts, dsd_state * state, uint8_t info[196], u CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); } - //Look into whether or not we need to run these CRC checks for this header information - //and see if its applied the same or differently /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ CRCExtracted = CRCExtracted ^ 0x3333; @@ -1464,8 +1462,6 @@ void ProcessCSBK(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); //80-96 for PI header } - //Look into whether or not we need to run these CRC checks for this header information - //and see if its applied the same or differently /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ //CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? CRCExtracted = CRCExtracted ^ 0xA5A5; @@ -1761,8 +1757,6 @@ void ProcessDmrPIHeader(dsd_opts * opts, dsd_state * state, uint8_t info[196], u CRCExtracted = CRCExtracted | (uint32_t)(DmrDataBit[i + 80] & 1); //80-96 for PI header } - //Look into whether or not we need to run these CRC checks for this header information - //and see if its applied the same or differently /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ //CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? CRCExtracted = CRCExtracted ^ 0x6969; @@ -1965,6 +1959,26 @@ void ProcessDmrVoiceLcHeader(dsd_opts * opts, dsd_state * state, uint8_t info[19 { /* CRC is correct so consider the Full LC data as correct/valid */ TSVoiceSupFrame->FullLC.DataValidity = 1; + if (state->currentslot == 0) + { + state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; + } + if (state->currentslot == 1) + { + state->dmr_soR = TSVoiceSupFrame->FullLC.ServiceOptions; + } + } + else if(IrrecoverableErrors == 0) + { + //FEC okay? Set SVCop code anyways + if (state->currentslot == 0) + { + state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; + } + if (state->currentslot == 1) + { + state->dmr_soR = TSVoiceSupFrame->FullLC.ServiceOptions; + } } else { diff --git a/src/dsd_main.c b/src/dsd_main.c index 4e76cb4..2bab823 100644 --- a/src/dsd_main.c +++ b/src/dsd_main.c @@ -180,8 +180,8 @@ noCarrier (dsd_opts * opts, dsd_state * state) state->data_p_head[0] = 0; state->data_p_head[1] = 0; - state->dmr_so = 0; - state->dmr_soR = 0; + // state->dmr_so = 0; //let TLC or Voice Burst zero or set this instead? + // state->dmr_soR = 0; } From 2b847c2270ac02ca282bcc90ed67ae3201b6f62e Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Wed, 10 Aug 2022 23:39:19 -0400 Subject: [PATCH 06/10] Encrypted DMR muted by default now Encrypted DMR muted by default now; Can be toggled in Terminal; Will still dump payload on request. Fix Bug in DMR Stereo 'muddy sound' caused by appending audio errs to both left and right channel each pass instead of only when using left or right. --will not playback audio or write wav files or mbe files when muted Fix errs and errsR to only append/set in MBE when on that slot, not always --- include/dsd.h | 10 ++- src/dmr_process_voice.c | 79 +++++++++++++++--------- src/dmr_sync.c | 131 ++++++---------------------------------- src/dsd_main.c | 17 +++++- src/dsd_mbe.c | 85 ++++++++++++++++++-------- src/dsd_ncurses.c | 22 ++++++- 6 files changed, 173 insertions(+), 171 deletions(-) diff --git a/include/dsd.h b/include/dsd.h index fa9b4ad..67ffb25 100644 --- a/include/dsd.h +++ b/include/dsd.h @@ -340,11 +340,13 @@ typedef struct int dPMR_next_part_of_superframe; int inverted_dpmr; int frame_dpmr; - // + short int dmr_stereo; short int lrrp_file_output; - // + short int dmr_mute_encL; + short int dmr_mute_encR; + int frame_ysf; int inverted_ysf; short int aggressive_framesync; @@ -561,7 +563,9 @@ typedef struct unsigned int dmrburstR; unsigned long long int R; // int block_count; - + short int dmr_encL; + short int dmr_encR; + //dstar header for ncurses unsigned char dstarradioheader[41]; diff --git a/src/dmr_process_voice.c b/src/dmr_process_voice.c index a6ed0f8..9a57aef 100644 --- a/src/dmr_process_voice.c +++ b/src/dmr_process_voice.c @@ -136,25 +136,36 @@ if (state->currentslot == 0) PrintAMBEData(opts, state, TSVoiceSupFrameL->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i]); } - if (opts->mbe_out_f != NULL) + //quick enc toggle to determine whether or not to play enc traffic + int enc_bit = 0; + enc_bit = (state->dmr_so >> 6) & 0x1; + if (enc_bit == 1) { - saveAmbe2450Data (opts, state, TSVoiceSupFrameL->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i]); + state->dmr_encL = 1; } - - state->debug_audio_errors += *errs2; - - processAudio(opts, state); - - if (opts->wav_out_f != NULL) + else state->dmr_encL = 0; + //quick test to determine whether or not to run the next few steps below + if (state->dmr_encL == 0 || opts->dmr_mute_encL == 0) { - writeSynthesizedVoice (opts, state); - } + if (opts->mbe_out_f != NULL) + { + saveAmbe2450Data (opts, state, TSVoiceSupFrameL->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i]); + } - //play only if not equal to enc value, going to set p25enc to 1 if enc detected?? - if (opts->audio_out == 1 && opts->p25enc != 1) - { - playSynthesizedVoice (opts, state); - } + state->debug_audio_errors += *errs2; + + processAudio(opts, state); + + if (opts->wav_out_f != NULL) + { + writeSynthesizedVoice (opts, state); + } + + if (opts->audio_out == 1) //opts->audio_out == 1 + { + playSynthesizedVoice (opts, state); + } + } //second bracket for the test enc condition } /* End for(i = 0; i < 3; i++) */ } /* End for(Frame = 0; Frame < 6; Frame++) */ } //End if Current Slot == 0 @@ -182,24 +193,36 @@ if (state->currentslot == 0) PrintAMBEData(opts, state, TSVoiceSupFrameR->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i]); } - if (opts->mbe_out_f != NULL) + //quick enc toggle to determine whether or not to play enc traffic + int enc_bit = 0; + enc_bit = (state->dmr_soR >> 6) & 0x1; + if (enc_bit == 1) { - saveAmbe2450Data (opts, state, TSVoiceSupFrameR->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i]); + state->dmr_encR = 1; } + else state->dmr_encR = 0; - state->debug_audio_errors += *errs2; - - processAudio(opts, state); - - if (opts->wav_out_f != NULL) + //quick test to determine whether or not to run the next few steps below + if (state->dmr_encR == 0 || opts->dmr_mute_encR == 0) { - writeSynthesizedVoice (opts, state); - } + if (opts->mbe_out_f != NULL) + { + saveAmbe2450Data (opts, state, TSVoiceSupFrameR->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i]); + } - //play only if not equal to enc value, going to set p25enc to 1 if enc detected?? - if (opts->audio_out == 1 && opts->p25enc != 1) - { - playSynthesizedVoice (opts, state); + state->debug_audio_errors += *errs2; + + processAudio(opts, state); + + if (opts->wav_out_f != NULL) + { + writeSynthesizedVoice (opts, state); + } + + if (opts->audio_out == 1) + { + playSynthesizedVoice (opts, state); + } } } /* End for(i = 0; i < 3; i++) */ } /* End for(Frame = 0; Frame < 6; Frame++) */ diff --git a/src/dmr_sync.c b/src/dmr_sync.c index b9c2d76..0a66406 100644 --- a/src/dmr_sync.c +++ b/src/dmr_sync.c @@ -119,7 +119,6 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] k++; } - //state->dmr_34_rate_sf[slot][i+48] = TrellisReturn[i+2]; //plus two to skip the first two bytes state->dmr_34_rate_sf[slot][i+(blocks*16)] = TrellisReturn[i+2]; //plus two to skip the first two bytes } @@ -153,7 +152,6 @@ void Process34Data(dsd_opts * opts, dsd_state * state, unsigned char tdibits[98] fprintf (stderr, "%s ", KMAG); //go to number of octets minus padding and crc, confirmed data may need a second rule to skip Serial Numbers and Block CRCs - //for (short i = 12; i < ( ((blocks+1)*12) - (padding+4) ); i++) for (short i = 12; i < ( ((blocks+1)*16) - (padding+4) ); i++) { @@ -337,7 +335,6 @@ void ProcessDataData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint state->dmr_12_rate_sf[slot][i] = 0; } - //Placeholder uint32_t i, j, k; uint32_t CRCExtracted = 0; uint32_t CRCComputed = 0; @@ -608,7 +605,7 @@ void ProcessDataData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint void Process1Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) { - //Placeholder + uint32_t i, j, k; uint32_t CRCExtracted = 0; uint32_t CRCComputed = 0; @@ -711,7 +708,7 @@ void Process1Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t void ProcessMBChData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) { - //Placeholder + uint32_t i, j, k; uint32_t CRCExtracted = 0; uint32_t CRCComputed = 0; @@ -803,7 +800,7 @@ void ProcessMBChData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint void ProcessMBCData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) { - //Placeholder + uint32_t i, j, k; uint32_t CRCExtracted = 0; uint32_t CRCComputed = 0; @@ -901,7 +898,7 @@ void ProcessMBCData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8 //This data shouldn't be active, but come here to dump in case of data burst type decoding failure void ProcessReservedData(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) { - //Placeholder + uint32_t i, j, k; uint32_t CRCExtracted = 0; uint32_t CRCComputed = 0; @@ -1147,7 +1144,7 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ DmrDataByte[i] = DmrDataByte[i] | (DmrDataBit[k] & 0x01); k++; } - //state->dmr_12_rate_sf[slot][i+48] = DmrDataByte[i]; //copy byte to right hand side of shift frame + //start loading new superframe at appropriate block count determined by the data header state->dmr_12_rate_sf[slot][i+(blocks*12)] = DmrDataByte[i]; //if 3 blocks, then start at position 36; 4 blocks at 48, 5 at } @@ -1200,8 +1197,6 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ int message_legnth = 0; if ( (state->dmr_12_rate_sf[slot][0] & 0x7F) == 0x45) //Start LRRP now { - //test opening a file with fopen and dumping the LRRP data into it. - //just going to use the same code from EDACS-FM //find user home directory and append directory and filename. FILE * pFile; //put this outside of the if statement? @@ -1395,7 +1390,7 @@ void Process12Data(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_ void ProcessCSBK(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) { - //Placeholder + uint32_t i, j, k; uint32_t CRCExtracted = 0; uint32_t CRCComputed = 0; @@ -1463,11 +1458,9 @@ void ProcessCSBK(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t } /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ - //CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? CRCExtracted = CRCExtracted ^ 0xA5A5; /* Check/correct the full link control data and compute the Reed-Solomon (12,9) CRC */ - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x969696); CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0xA5A5); //test @@ -1693,7 +1686,7 @@ void ProcessCSBK(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t void ProcessDmrPIHeader(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t syncdata[48], uint8_t SlotType[20]) { - //Placeholder + uint32_t i, j, k; uint32_t CRCExtracted = 0; uint32_t CRCComputed = 0; @@ -1706,11 +1699,6 @@ void ProcessDmrPIHeader(dsd_opts * opts, dsd_state * state, uint8_t info[196], u uint8_t R[3]; uint8_t BPTCReservedBits = 0; - /* Remove warning compiler */ - //UNUSED_VARIABLE(syncdata[0]); - //UNUSED_VARIABLE(SlotType[0]); - //UNUSED_VARIABLE(BPTCReservedBits); - /* Check the current time slot */ if(state->currentslot == 0) { @@ -1758,11 +1746,9 @@ void ProcessDmrPIHeader(dsd_opts * opts, dsd_state * state, uint8_t info[196], u } /* Apply the CRC mask (see DMR standard B.3.12 Data Type CRC Mask) */ - //CRCExtracted = CRCExtracted ^ 0x969696; //does this mask get applied here though for PI? CRCExtracted = CRCExtracted ^ 0x6969; /* Check/correct the full link control data and compute the Reed-Solomon (12,9) CRC */ - //CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x969696); CRCCorrect = ComputeAndCorrectFullLinkControlCrc(DmrDataByte, &CRCComputed, 0x6969); /* Convert corrected 12 bytes into 96 bits */ @@ -1864,11 +1850,6 @@ void ProcessDmrVoiceLcHeader(dsd_opts * opts, dsd_state * state, uint8_t info[19 uint8_t R[3]; uint8_t BPTCReservedBits = 0; - /* Remove warning compiler */ - //UNUSED_VARIABLE(syncdata[0]); - //UNUSED_VARIABLE(SlotType[0]); - //UNUSED_VARIABLE(BPTCReservedBits); - /* Check the current time slot */ if(state->currentslot == 0) { @@ -1950,7 +1931,7 @@ void ProcessDmrVoiceLcHeader(dsd_opts * opts, dsd_state * state, uint8_t info[19 /* Store the Group address (Talk Group) */ TSVoiceSupFrame->FullLC.GroupAddress = (unsigned int)ConvertBitIntoBytes(&DmrDataBit[24], 24); - //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; + /* Store the Source address */ TSVoiceSupFrame->FullLC.SourceAddress = (unsigned int)ConvertBitIntoBytes(&DmrDataBit[48], 24); //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; @@ -1998,13 +1979,6 @@ void ProcessDmrVoiceLcHeader(dsd_opts * opts, dsd_state * state, uint8_t info[19 fprintf (stderr, "%s \n", KGRN); fprintf (stderr, " Slot %d ", state->currentslot+1); fprintf(stderr, " TGT=%u SRC=%u ", TSVoiceSupFrame->FullLC.GroupAddress, TSVoiceSupFrame->FullLC.SourceAddress); - //fprintf(stderr, "FID=0x%02X ", TSVoiceSupFrame->FullLC.FeatureSetID); - //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; - //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; - //state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID; - - //HERE HERE do some work to get this Emergency and BP modes to display in ncurses - //state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; if(TSVoiceSupFrame->FullLC.ServiceOptions & 0x80) fprintf(stderr, "Emergency "); if(TSVoiceSupFrame->FullLC.ServiceOptions & 0x40) @@ -2104,12 +2078,6 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19 uint8_t R[3]; uint8_t BPTCReservedBits = 0; - /* Remove warning compiler */ - //UNUSED_VARIABLE(opts); - //UNUSED_VARIABLE(syncdata[0]); - //UNUSED_VARIABLE(SlotType[0]); - //UNUSED_VARIABLE(BPTCReservedBits); - /* Check the current time slot */ if(state->currentslot == 0) { @@ -2191,12 +2159,10 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19 /* Store the Group address (Talk Group) */ TSVoiceSupFrame->FullLC.GroupAddress = (unsigned int)ConvertBitIntoBytes(&DmrDataBit[24], 24); - //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; + /* Store the Source address */ TSVoiceSupFrame->FullLC.SourceAddress = (unsigned int)ConvertBitIntoBytes(&DmrDataBit[48], 24); - //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; - //TSVoiceSupFrame->FullLC.LeftOvers = (unsigned int)ConvertBitIntoBytes(&DmrDataBit[64], 8); - //fprintf (stderr, "\nBPTC Left Overs = %02X \n", TSVoiceSupFrame->FullLC.LeftOvers); + if((IrrecoverableErrors == 0))// && CRCCorrect) { /* CRC is correct so consider the Full LC data as correct/valid */ @@ -2208,11 +2174,7 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19 TSVoiceSupFrame->FullLC.DataValidity = 0; } - /* Print the destination ID (TG) and the source ID */ - //fprintf(stderr, "\n TG=%u Src=%u ", TSVoiceSupFrame->FullLC.GroupAddress, TSVoiceSupFrame->FullLC.SourceAddress); - //fprintf(stderr, "FID=0x%02X ", TSVoiceSupFrame->FullLC.FeatureSetID); - - //reset alg, keys, mi during a TLC call termination EVENT so we aren't stuck on an old value, PI header will proceed a new call if BP isn't used + //reset alg, keys, mi during a TLC call termination EVENT so we aren't stuck on an old value if (state->currentslot == 0) { state->payload_algid = 0; @@ -2230,7 +2192,6 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19 } - //tlc if((IrrecoverableErrors == 0) && CRCCorrect) //amateur DMR seems to only set radio ID up here I think, figure out best way to set without messing up other DMR types { @@ -2241,39 +2202,18 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19 fprintf (stderr, "%s ", KNRM); //fprintf(stderr, "(CRC OK ) "); if (TSVoiceSupFrame->FullLC.FullLinkControlOpcode == 0) //other opcodes may convey callsigns, names, etc. - /* - if ( TSVoiceSupFrame->FullLC.FullLinkControlOpcode != 0xAF || - TSVoiceSupFrame->FullLC.FullLinkControlOpcode != 0x04 || - TSVoiceSupFrame->FullLC.FullLinkControlOpcode != 0x05 || - TSVoiceSupFrame->FullLC.FullLinkControlOpcode != 0x06 || - TSVoiceSupFrame->FullLC.FullLinkControlOpcode != 0x07 ) //work out why amateur sets sourceid on other codes, but pro only does on whatever - */ { if (state->currentslot == 0) { - //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; - //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; - //state->dmr_color_code = state->color_code; state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID; state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; } if (state->currentslot == 1) { - //state->lasttgR = TSVoiceSupFrame->FullLC.GroupAddress; - //state->lastsrcR = TSVoiceSupFrame->FullLC.SourceAddress; - //state->dmr_color_code = state->color_code; state->dmr_fidR = TSVoiceSupFrame->FullLC.FeatureSetID; state->dmr_soR = TSVoiceSupFrame->FullLC.ServiceOptions; } - - } - //only set on good CRC value or corrected values - //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; - //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; - //state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID; - //state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; - //state->dmr_color_code = state->color_code; } else if(IrrecoverableErrors == 0) { @@ -2284,37 +2224,19 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19 fprintf(stderr, "RAS (FEC OK/CRC ERR)"); //tlc fprintf (stderr, "%s ", KNRM); if (TSVoiceSupFrame->FullLC.FullLinkControlOpcode == 0) //other opcodes may convey callsigns, names, etc. - /* - if ( TSVoiceSupFrame->FullLC.FullLinkControlOpcode != 0xAF || - TSVoiceSupFrame->FullLC.FullLinkControlOpcode != 0x04 || - TSVoiceSupFrame->FullLC.FullLinkControlOpcode != 0x05 || - TSVoiceSupFrame->FullLC.FullLinkControlOpcode != 0x06 || - TSVoiceSupFrame->FullLC.FullLinkControlOpcode != 0x07 ) //work out why amateur sets sourceid on other codes, but pro only does on whatever - */ + { if (state->currentslot == 0) { - //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; - //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; - //state->dmr_color_code = state->color_code; state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID; state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; } if (state->currentslot == 1) { - //state->lasttgR = TSVoiceSupFrame->FullLC.GroupAddress; - //state->lastsrcR = TSVoiceSupFrame->FullLC.SourceAddress; - //state->dmr_color_code = state->color_code; state->dmr_fidR = TSVoiceSupFrame->FullLC.FeatureSetID; state->dmr_soR = TSVoiceSupFrame->FullLC.ServiceOptions; } } - //only set on good CRC value or corrected values - //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; - //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; - //state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID; - //state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; - //state->dmr_color_code = state->color_code; } else {} //fprintf(stderr, "\n(FEC FAIL/CRC ERR)"); @@ -2438,7 +2360,7 @@ void ProcessVoiceBurstSync(dsd_opts * opts, dsd_state * state) CRCExtracted |= (LC_DataBit[74] & 1) << 2; CRCExtracted |= (LC_DataBit[75] & 1) << 1; CRCExtracted |= (LC_DataBit[76] & 1) << 0; - //fprintf (stderr, "\nLCDB = 0x%X \n", LC_DataBit); + /* Compute the 5 bit CRC */ CRCComputed = ComputeCrc5Bit(LC_DataBit); @@ -2463,7 +2385,7 @@ void ProcessVoiceBurstSync(dsd_opts * opts, dsd_state * state) /* Store the Group address (Talk Group) */ TSVoiceSupFrame->FullLC.GroupAddress = (unsigned int)ConvertBitIntoBytes(&LC_DataBit[24], 24); - //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; + /* Store the Source address */ TSVoiceSupFrame->FullLC.SourceAddress = (unsigned int)ConvertBitIntoBytes(&LC_DataBit[48], 24); //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; @@ -2575,22 +2497,11 @@ void ProcessVoiceBurstSync(dsd_opts * opts, dsd_state * state) state->dmr_fidR = TSVoiceSupFrame->FullLC.FeatureSetID; state->dmr_soR = TSVoiceSupFrame->FullLC.ServiceOptions; } - //state->dmr_color_code = state->color_code; - //state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID; - //state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; } - //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; - //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; - //state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID; - //state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; - //state->dmr_color_code = state->color_code; } else if(IrrecoverableErrors == 0) { - //fprintf(stderr, " TG=%u Src=%u ", TSVoiceSupFrame->FullLC.GroupAddress, TSVoiceSupFrame->FullLC.SourceAddress); - //fprintf(stderr, "FID=0x%02X ", TSVoiceSupFrame->FullLC.FeatureSetID); - //fprintf(stderr, "RAS (FEC OK/CRC ERR)"); //voice burst - //or set if was corrected + if (TSVoiceSupFrame->FullLC.FullLinkControlOpcode < 0x04 || TSVoiceSupFrame->FullLC.FullLinkControlOpcode > 0x08) //7, or 8? { fprintf (stderr, "%s", KGRN); @@ -2610,7 +2521,7 @@ void ProcessVoiceBurstSync(dsd_opts * opts, dsd_state * state) state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; //state->dmr_color_code = state->color_code; state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID; - state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; + // state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; } if (state->currentslot == 1) { @@ -2618,17 +2529,9 @@ void ProcessVoiceBurstSync(dsd_opts * opts, dsd_state * state) state->lastsrcR = TSVoiceSupFrame->FullLC.SourceAddress; //state->dmr_color_code = state->color_code; state->dmr_fidR = TSVoiceSupFrame->FullLC.FeatureSetID; - state->dmr_soR = TSVoiceSupFrame->FullLC.ServiceOptions; + // state->dmr_soR = TSVoiceSupFrame->FullLC.ServiceOptions; } - //state->dmr_color_code = state->color_code; - //state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID; - //state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; } - //state->lasttg = TSVoiceSupFrame->FullLC.GroupAddress; - //state->lastsrc = TSVoiceSupFrame->FullLC.SourceAddress; - //state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID; - //state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; - //state->dmr_color_code = state->color_code; } else {} //fprintf(stderr, "\n(FEC FAIL/CRC ERR)"); diff --git a/src/dsd_main.c b/src/dsd_main.c index 2bab823..164db32 100644 --- a/src/dsd_main.c +++ b/src/dsd_main.c @@ -180,9 +180,12 @@ noCarrier (dsd_opts * opts, dsd_state * state) state->data_p_head[0] = 0; state->data_p_head[1] = 0; - // state->dmr_so = 0; //let TLC or Voice Burst zero or set this instead? + // state->dmr_so = 0; //let TLC or Voice LC/Burst zero or set this instead? // state->dmr_soR = 0; + state->dmr_encL = 0; + state->dmr_encR = 0; + } void @@ -292,6 +295,8 @@ initOpts (dsd_opts * opts) opts->lrrp_file_output = 0; + opts->dmr_mute_encL = 1; + opts->dmr_mute_encR = 1; } @@ -517,6 +522,9 @@ initState (dsd_state * state) state->menuopen = 0; //is the ncurses menu open, if so, don't process frame sync + state->dmr_encL = 0; + state->dmr_encR = 0; + #ifdef TRACE_DSD state->debug_sample_index = 0; state->debug_label_file = NULL; @@ -919,6 +927,13 @@ main (int argc, char **argv) { state.K = 256; } + opts.dmr_mute_encL = 0; + opts.dmr_mute_encR = 0; + if (state.K == 1) + { + opts.dmr_mute_encL = 1; + opts.dmr_mute_encR = 1; + } break; case 'G': //Set rtl device gain diff --git a/src/dsd_mbe.c b/src/dsd_mbe.c index a0eb63f..8db97b8 100644 --- a/src/dsd_mbe.c +++ b/src/dsd_mbe.c @@ -239,11 +239,10 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a ambe_d[j] ^= x; } } - if (1 == 1) //still not quite right //state->payload_algid == 0 || state->K != 0 - { - mbe_processAmbe2450Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, - ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); - } + + mbe_processAmbe2450Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, + ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); + //old method for this step below //mbe_processAmbe3600x2450Framef (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, ambe_fr, ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); @@ -272,11 +271,9 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a ambe_d[j] ^= x; } } - if (1 == 1) //state->payload_algidR == 0 || state->K != 0 - { - mbe_processAmbe2450Dataf (state->audio_out_temp_bufR, &state->errsR, &state->errs2R, state->err_strR, - ambe_d, state->cur_mp2, state->prev_mp2, state->prev_mp_enhanced2, opts->uvquality); - } + + mbe_processAmbe2450Dataf (state->audio_out_temp_bufR, &state->errsR, &state->errs2R, state->err_strR, + ambe_d, state->cur_mp2, state->prev_mp2, state->prev_mp_enhanced2, opts->uvquality); //old method for this step below //mbe_processAmbe3600x2450Framef (state->audio_out_temp_bufR, &state->errsR, &state->errs2R, state->err_strR, ambe_fr, ambe_d, state->cur_mp2, state->prev_mp2, state->prev_mp_enhanced2, opts->uvquality); @@ -285,7 +282,8 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a PrintAMBEData (opts, state, ambe_d); } } - //if using ??? + + //if using ??? dPMR? D-STAR? X2-TDMA? if (opts->dmr_stereo == 0) { mbe_processAmbe3600x2450Framef (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, ambe_fr, ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); @@ -302,32 +300,64 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a } - state->debug_audio_errors += state->errs2; - state->debug_audio_errorsR += state->errs2R; + //having these values here I think caused muddy audio, seems cleaner now when moved to correct area + // state->debug_audio_errors += state->errs2; + // state->debug_audio_errorsR += state->errs2R; + + //quick enc check to determine whether or not to play enc traffic + int enc_bit = 0; + //end enc check + if (opts->dmr_stereo == 1 && state->currentslot == 0) { - processAudio (opts, state); - if (opts->audio_out == 1) + enc_bit = (state->dmr_so >> 6) & 0x1; + if (enc_bit == 1) { - playSynthesizedVoice (opts, state); + state->dmr_encL = 1; + } + else state->dmr_encL = 0; + if (state->dmr_encL == 0 || opts->dmr_mute_encL == 0) + { + state->debug_audio_errors += state->errs2; + processAudio (opts, state); + if (opts->audio_out == 1) + { + playSynthesizedVoice (opts, state); + } } } + if (opts->dmr_stereo == 1 && state->currentslot == 1) { - processAudioR (opts, state); - if (opts->audio_out == 1) + enc_bit = (state->dmr_soR >> 6) & 0x1; + if (enc_bit == 0x1) { - playSynthesizedVoiceR (opts, state); + state->dmr_encR = 1; + } + else state->dmr_encR = 0; + if (state->dmr_encR == 0 || opts->dmr_mute_encR == 0) + { + state->debug_audio_errorsR += state->errs2R; + processAudioR (opts, state); + if (opts->audio_out == 1) + { + playSynthesizedVoiceR (opts, state); + } } } + + //if using ??? dPMR? D-STAR? X2-TDMA? if (opts->dmr_stereo == 0) { + state->debug_audio_errors += state->errs2; processAudio (opts, state); if (opts->audio_out == 1) { playSynthesizedVoice (opts, state); } } + + //if using ??? dPMR? D-STAR? X2-TDMA? if (opts->wav_out_f != NULL && opts->dmr_stereo == 0) { writeSynthesizedVoice (opts, state); @@ -336,14 +366,21 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a //per call can only be used when ncurses terminal is active since we use its call history matrix for when to record if (opts->use_ncurses_terminal == 1 && opts->dmr_stereo_wav == 1 && opts->dmr_stereo == 1 && state->currentslot == 0) { - //write wav to per call on left channel Slot 1 - writeSynthesizedVoice (opts, state); - } + if (state->dmr_encL == 0 || opts->dmr_mute_encL == 0) + { + //write wav to per call on left channel Slot 1 + writeSynthesizedVoice (opts, state); + } + } + //per call can only be used when ncurses terminal is active since we use its call history matrix for when to record if (opts->use_ncurses_terminal == 1 && opts->dmr_stereo_wav == 1 && opts->dmr_stereo == 1 && state->currentslot == 1) { - //write wav to per call on right channel Slot 2 - writeSynthesizedVoiceR (opts, state); + if (state->dmr_encR == 0 || opts->dmr_mute_encR == 0) + { + //write wav to per call on right channel Slot 2 + writeSynthesizedVoiceR (opts, state); + } } diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index a68fb7e..4581b13 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -176,7 +176,7 @@ char *choicesc[] = { "Return", "Save Decoded Audio WAV (NO DMR STEREO!)", "Save Signal to Symbol Capture Bin", - "Toggle Muting ENC P25 Traffic ", + "Toggle Muting Enrypted Traffic ", "Per Call WAV REC (DMR Stereo/MS)", "Setup and Start RTL Input ", "Pulse Audio 48kHz Output", @@ -451,6 +451,19 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state) opts->unmute_encrypted_p25 = 1; } else opts->unmute_encrypted_p25 = 0; + + if (opts->dmr_mute_encL == 0) + { + opts->dmr_mute_encL = 1; + } + else opts->dmr_mute_encL = 0; + + if (opts->dmr_mute_encR == 0) + { + opts->dmr_mute_encR = 1; + } + else opts->dmr_mute_encR = 0; + } if (choicec == 5) { @@ -806,10 +819,17 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state) refresh(); wscanw(entry_win, "%d", &state->K); noecho(); + opts->dmr_mute_encL = 0; + opts->dmr_mute_encR = 0; if (state->K > 255) { state->K = 255; } + if (state->K == 0) + { + opts->dmr_mute_encL = 1; + opts->dmr_mute_encR = 1; + } break; } From 805fdd758354aaae15e5b1605e8aa0b713251f12 Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Thu, 11 Aug 2022 09:11:06 -0400 Subject: [PATCH 07/10] Proof Reading; Tweaks; Proof Read and tweak a few minor things. Add a few #ifdef USE_RTLSDR to make sure it still compiles when not using the rtl support. --- README.md | 7 +++---- src/dmr_sync.c | 1 + src/dsd_ncurses.c | 13 ++++++++----- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6b7c195..99d584f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Virtually all the examples listed below can now be set up on the fly with the me This release also has provisional support for playing back OP25 capture bin files, and the creation and playback of its own capture bin files as well (most likely not OP25 compatible). Mileage may vary. Be sure to choose the decoder option required when playing a bin file back, do not rely on auto-detect. Capture Bin files can be used to reliably replay P25, DMR BS, and NXDN decodings, and can replace the need for MBE file saving in the case of DMR Stereo, allowing for a complete replay of all events on a system, rather than just voice only. -Per Call wav file creation has been implemented, currently only for DMR Stereo. Complete audio decode wav is available for all over decoder types. LRRP has been revamped, working more consistently, and an option to dump LRRP data to ~/lrrp.txt in the user home directory now exists, and can be imported into open-source QGIS to provide mapping data for LRRP output. Simply open the newly included map file in QGIS and point it at your geographic region. (Be sure the lrrp.txt file exists, and has data populated in it prior to opening the map file in QGIS, otherwise, the map layer may not want to show back up!) +Per Call wav file creation has been implemented, currently only for DMR Stereo. Complete audio decode wav is available for all other decoder types. LRRP has been revamped, working more consistently, and an option to dump LRRP data to ~/lrrp.txt in the user home directory now exists, and can be imported into open-source QGIS to provide mapping data for LRRP output. Simply open the newly included map file in QGIS and point it at your geographic region. (Be sure the lrrp.txt file exists, and has data populated in it prior to opening the map file in QGIS, otherwise, the map layer may not want to show back up!) DMR Data Header decoding has been revamped, and most data burst decoding types tightened up and code cleaned. FEC error checking now implemented on CACH and Burst types, cleaning up some erroneous slot and burst errors. @@ -47,8 +47,6 @@ and in a second terminal tab, same folder, run `tail -n 40 -f voice.log` -![DSD-FME](https://github.com/lwvmobile/dsd-fme/blob/pulseaudio/dsd-fme2.png) - Then you can open up your pavucontrol "Pulse Audio Volume Control" or "Volume Control" application and route input into DSD-FME from any application and DSD-FME output to the left and right speakers respectively. (unlock the channel in the application stream and adjust left and right independently) ## Example Usage - RTL2832 Dongle Input @@ -87,6 +85,8 @@ and in a second terminal tab, same folder, run `tail -n 40 -f voice.log` +![DSD-FME](https://github.com/lwvmobile/dsd-fme/blob/pulseaudio/dsd-fme2.png) + ## Roadmap The Current list of objectives include: @@ -208,7 +208,6 @@ Already have this branch, and just want to pull the latest build? You can run th git pull https://github.com/lwvmobile/dsd-fme pulseaudio ##cd into your build folder## cd build -##cmake usually isn't necesary, but could be if I update the cmakelist.txt cmake .. make -j `nproc` sudo make install diff --git a/src/dmr_sync.c b/src/dmr_sync.c index 0a66406..7e78da1 100644 --- a/src/dmr_sync.c +++ b/src/dmr_sync.c @@ -1952,6 +1952,7 @@ void ProcessDmrVoiceLcHeader(dsd_opts * opts, dsd_state * state, uint8_t info[19 else if(IrrecoverableErrors == 0) { //FEC okay? Set SVCop code anyways + TSVoiceSupFrame->FullLC.DataValidity = 0; //shouldn't matter in this context if (state->currentslot == 0) { state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions; diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index 4581b13..b88c77d 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -200,7 +200,7 @@ char *choices[] = { "Decode D-STAR*", "Decode P25-P1*", "Decode DMR (STEREO BS/MS)", - "Decode DMR* (LEH)", //better name + "Decode DMR* (LEH)", "Decode dPMR", "Decode NXDN48", "Decode NXDN96", @@ -445,7 +445,7 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state) } if (choicec == 4) { - //still disabled until a fix is found + //toggle all mutes if (opts->unmute_encrypted_p25 == 0) { opts->unmute_encrypted_p25 = 1; @@ -804,7 +804,7 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state) //endwin(); //causes quick blink in and out of ncursesprinter, not required } - //Burger King + //Cheat Code Entry if (choice == 13) { state->payload_keyid = 0; @@ -1169,7 +1169,7 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state) { openPulseInput(opts); } - + #ifdef USE_RTLSDR if (opts->audio_in_type == 3) //open rtl input if it is the specified input method { ncursesPrinter (opts, state); //run one rep to clear menu boxes out @@ -1180,6 +1180,7 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state) } } + #endif } @@ -1191,7 +1192,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) int level = 0; int c = 0; - if (opts->audio_in_type != 1) //can't run getch/menues when using STDIN - + if (opts->audio_in_type != 1) //can't run getch/menu when using STDIN - { timeout(0); c = getch(); @@ -1199,6 +1200,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) //testing sending UDP commands to the socket inside of rtl_sdr_fm.cpp //this works, but we will want to make an init func open one time, and have sendto here + #ifdef USE_RTLSDR if (temp_freq == opts->rtlsdr_center_freq) { handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); @@ -1211,6 +1213,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) temp_freq = -1; } + #endif //Variable reset/set section From b9223e52070f34d192a1cf9d868903ccdbd2d088 Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Thu, 11 Aug 2022 10:17:32 -0400 Subject: [PATCH 08/10] Mute NXDN and P25 ENC Mute NXDN and P25 ENC by default, but still print frame payloads. --- src/dsd_mbe.c | 13 +++++++------ src/dsd_ncurses.c | 4 ++-- src/dsd_reset.c | 4 ++++ src/nxdn_lib.c | 11 ++++++++++- src/p25p1_ldu.c | 11 ++++++++++- 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/dsd_mbe.c b/src/dsd_mbe.c index 8db97b8..a28a3f9 100644 --- a/src/dsd_mbe.c +++ b/src/dsd_mbe.c @@ -283,7 +283,7 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a } } - //if using ??? dPMR? D-STAR? X2-TDMA? + //if using anything but DMR Stereo, borrowing state->dmr_encL to signal enc or clear for other types if (opts->dmr_stereo == 0) { mbe_processAmbe3600x2450Framef (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, ambe_fr, ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); @@ -291,7 +291,8 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a { PrintAMBEData (opts, state, ambe_d); } - if (opts->mbe_out_f != NULL) + //only save MBE files if not enc or unmuted, THIS does not seem to work for some reason + if (opts->mbe_out_f != NULL && (opts->unmute_encrypted_p25 == 1 || state->dmr_encL == 0) ) { saveAmbe2450Data (opts, state, ambe_d); } @@ -346,8 +347,8 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a } } - //if using ??? dPMR? D-STAR? X2-TDMA? - if (opts->dmr_stereo == 0) + //if using anything but DMR Stereo, borrowing state->dmr_encL to signal enc or clear for other types + if (opts->dmr_stereo == 0 && (opts->unmute_encrypted_p25 == 1 || state->dmr_encL == 0) ) { state->debug_audio_errors += state->errs2; processAudio (opts, state); @@ -357,8 +358,8 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a } } - //if using ??? dPMR? D-STAR? X2-TDMA? - if (opts->wav_out_f != NULL && opts->dmr_stereo == 0) + //if using anything but DMR Stereo, borrowing state->dmr_encL to signal enc or clear for other types + if (opts->wav_out_f != NULL && opts->dmr_stereo == 0 && (opts->unmute_encrypted_p25 == 1 || state->dmr_encL == 0)) { writeSynthesizedVoice (opts, state); } diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index b88c77d..d980ddb 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -1294,7 +1294,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) rdR = state->lastsrcR; } //move to seperate P25 version plz - opts->p25enc = 0; + //opts->p25enc = 0; } //DMR TG @@ -1311,7 +1311,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) tgR = state->lasttgR; } - opts->p25enc = 0; + //opts->p25enc = 0; } diff --git a/src/dsd_reset.c b/src/dsd_reset.c index a1d9bfd..c34f4a2 100644 --- a/src/dsd_reset.c +++ b/src/dsd_reset.c @@ -95,6 +95,10 @@ resetState (dsd_state * state) state->debug_header_critical_errors = 0; state->nxdn_last_ran = 0; + // state->payload_algid = 0; + // state->payload_algidR = 0; + state->dmr_encL = 0; + state->dmr_encR = 0; //each time you run this, it increses memory use by 4MB, massive memory leak //need to revisit this sometime and look into only resetting only the necesary items to let P25 switch between signals (C4FM or Wide) without needing a restart diff --git a/src/nxdn_lib.c b/src/nxdn_lib.c index e892caa..5b3fea1 100644 --- a/src/nxdn_lib.c +++ b/src/nxdn_lib.c @@ -786,10 +786,19 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message) state->nxdn_last_rid = SourceUnitID & 0xFFFF; //only grab if CRC is okay state->nxdn_last_tg = (DestinationID & 0xFFFF); state->nxdn_key = (KeyID & 0xFF); - state->nxdn_cipher_type = CipherType; + state->nxdn_cipher_type = CipherType; //will this set to zero if no enc? } //fprintf(stderr, "(CRC OK) "); } + //set enc bit here so we can tell playSynthesizedVoice whether or not to play enc traffic + if (state->nxdn_cipher_type != 0) + { + state->dmr_encL = 1; + } + if (state->nxdn_cipher_type == 0) + { + state->dmr_encL = 0; + } //fprintf(stderr, " (OK) - "); else { diff --git a/src/p25p1_ldu.c b/src/p25p1_ldu.c index 4c83b38..6e2cecd 100644 --- a/src/p25p1_ldu.c +++ b/src/p25p1_ldu.c @@ -119,8 +119,17 @@ process_IMBE (dsd_opts* opts, dsd_state* state, int* status_count) #ifdef TRACE_DSD state->debug_prefix = '\0'; #endif + //check for enc, then always run below step and mute at the point of playing audio so we can still dump the frames + if (state->payload_algid != 0x80) + { + state->dmr_encL = 1; + } + if (state->payload_algid == 0x80) + { + state->dmr_encL = 0; + } - if (state->p25kid == 0 || opts->unmute_encrypted_p25 == 1) + if (1 == 1) //state->p25kid == 0 || opts->unmute_encrypted_p25 == 1 { { // Check for a non-standard c0 transmitted From e461335b2e062530b586755d0f110f7d489a382b Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Thu, 11 Aug 2022 13:34:03 -0400 Subject: [PATCH 09/10] Update CMakeLists.txt Make PulseAudio a requirement --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb6f787..5ef5dff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ find_package(MBE REQUIRED) find_package(ITPP REQUIRED) find_package(RTLSDR) find_package(Curses REQUIRED) -find_package(PULSEAUDIO) +find_package(PULSEAUDIO REQUIRED) include_directories(SYSTEM ${LIBSNDFILE_INCLUDE_DIR} ${MBE_INCLUDE_DIR} ${ITPP_INCLUDE_DIR} ${PULSEAUDIO_INCLUDE_DIRS} ${CURSES_INCLUDE_DIR}) set(LIBS ${MBE_LIBRARY} ${LIBSNDFILE_LIBRARY} ${ITPP_LIBRARY} ${PULSEAUDIO_SIMPLE_LIBRARY} ${CURSES_LIBRARY}) From 65ce60f6b5eaae995da81874541f927d7759512b Mon Sep 17 00:00:00 2001 From: lwvmobile <59371473+lwvmobile@users.noreply.github.com> Date: Thu, 11 Aug 2022 15:53:29 -0400 Subject: [PATCH 10/10] Update Readme Embed Youtube video link to first image...hopefully. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 99d584f..d58048f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This version of DSD is a flavor blend of [szechyjs](https://github.com/szechyjs/ ## 2022.08.12 Update ## A new menu system has been introduced in the NCURSES Terminal. While running DSD-FME, a user can simply use the ESC or arrow keys to open the menu and change options on the fly. This is extremely beneficial when wanting to change settings on the fly, and also to alleviate the need to use complex start up command line arguments. All of the previous command line arguments still work and will get you up faster, but if you would rather configure after start up, or change settings while running, the menu system is very helpful in that regard. -![DSD-FME](https://github.com/lwvmobile/dsd-fme/blob/pulseaudio/dsd-fme.png) +[![DSD-FME](https://github.com/lwvmobile/dsd-fme/blob/pulseaudio/dsd-fme.png)](https://www.youtube.com/watch?v=TqTfAfaPJ4s "DSD-FME Update 2022.08.12") To get started with the new menu system, simply launch with: