From 387f2253b1f8aeb5129808b168850773c869de75 Mon Sep 17 00:00:00 2001
From: lwvmobile <59371473+lwvmobile@users.noreply.github.com>
Date: Sun, 20 Feb 2022 15:41:28 -0500
Subject: [PATCH] More NCURSES Tweaking
More NCURSES Tweaking
-tweak array, seems to update smoother now, immediate
-more concise, cleaner names for sync types
-array updates on DMR, P25P1, NXDN, PV types only currenlty (no dstar etc yet)
More P25 resetState tweaking/testing
Other under the hood tweaking
---
CMakeLists.txt | 2 +-
src/dsd_file.c | 24 +++++-
src/dsd_main.c | 10 ++-
src/dsd_ncurses.c | 185 +++++++++++++++++++++++++++++-----------------
src/dsd_reset.c | 2 +-
5 files changed, 153 insertions(+), 70 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 03495c9..1e36638 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,7 +14,7 @@ find_package(RTLSDR)
#more messing around
#find_package(Curses)
find_package(Curses REQUIRED) #making this required until I can fix all instances of it being called to ifdef lines
-find_package(PULSEAUDIO)
+find_package(PulseAudio)
#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})
diff --git a/src/dsd_file.c b/src/dsd_file.c
index b27b67a..9a0dc32 100644
--- a/src/dsd_file.c
+++ b/src/dsd_file.c
@@ -16,7 +16,7 @@
*/
#include "dsd.h"
-
+int payload = 0;
void
saveImbe4400Data (dsd_opts * opts, dsd_state * state, char *imbe_d)
{
@@ -28,17 +28,28 @@ saveImbe4400Data (dsd_opts * opts, dsd_state * state, char *imbe_d)
fputc (err, opts->mbe_out_f);
k = 0;
+ if (payload == 1) //make opt variable later on to toggle this
+ {
+ fprintf(stderr, "\n");
+ }
+
for (i = 0; i < 11; i++)
{
b = 0;
+
for (j = 0; j < 8; j++)
{
b = b << 1;
b = b + imbe_d[k];
k++;
}
+ if (payload == 1) //make opt variable later on to toggle this
+ {
+ fprintf (stderr, "[%2X] ", b);
+ }
fputc (b, opts->mbe_out_f);
}
+ //fprintf(stderr, "\n");
fflush (opts->mbe_out_f);
}
@@ -53,17 +64,28 @@ saveAmbe2450Data (dsd_opts * opts, dsd_state * state, char *ambe_d)
fputc (err, opts->mbe_out_f);
k = 0;
+ if (payload == 1) //make opt variable later on to toggle this
+ {
+ fprintf(stderr, "\n");
+ }
for (i = 0; i < 6; i++)
{
b = 0;
+
for (j = 0; j < 8; j++)
{
b = b << 1;
b = b + ambe_d[k];
k++;
}
+ if (payload == 1) //make opt variable later on to toggle this
+ {
+ fprintf (stderr, "[%2X] ", b);
+ }
+
fputc (b, opts->mbe_out_f);
}
+ //fprintf(stderr, "\n");
b = ambe_d[48];
fputc (b, opts->mbe_out_f);
fflush (opts->mbe_out_f);
diff --git a/src/dsd_main.c b/src/dsd_main.c
index 1c70081..8f74c25 100644
--- a/src/dsd_main.c
+++ b/src/dsd_main.c
@@ -334,7 +334,7 @@ usage ()
fprintf (stderr," -d
Create mbe data files, use this directory\n");
fprintf (stderr," -r Read/Play saved mbe data from file(s)\n");
fprintf (stderr," -g Audio output gain (default = 0 = auto, disable = -1)\n");
- fprintf (stderr," -n Do not send synthesized speech to audio output device\n");
+ //fprintf (stderr," -n Do not send synthesized speech to audio output device\n");
fprintf (stderr," -w Output synthesized speech to a .wav file\n");
fprintf (stderr," -a Display port audio devices\n");
fprintf (stderr," -W Monitor Source Audio When No Sync Detected (WIP!)\n");
@@ -381,6 +381,9 @@ usage ()
fprintf (stderr," (default=36)\n");
fprintf (stderr," -M Min/Max buffer size for QPSK decision point tracking\n");
fprintf (stderr," (default=15)\n");
+ fprintf (stderr," -n Reset P25 Heuristics and initState variables on mixed decoding signal\n");
+ fprintf (stderr," Helps when decoding multiple signal types at same time\n");
+ fprintf (stderr," (WiP! May Cause Slow Memory Leak - Experimental)\n");
fprintf (stderr,"\n");
fprintf (stderr,"Report bugs to: https://github.com/lwvmobile/dsd-fme/issues \n");
exit (0);
@@ -715,6 +718,7 @@ main (int argc, char **argv)
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");
break;
case 'z':
@@ -767,6 +771,9 @@ main (int argc, char **argv)
//opts.audio_out = 0;
//fprintf (stderr,"Disabling audio output to soundcard.\n");
opts.reset_state = 1;
+ 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");
break;
case 'w':
strncpy(opts.wav_out_file, optarg, 1023);
@@ -1090,6 +1097,7 @@ main (int argc, char **argv)
else
{
liveScanner (&opts, &state);
+
}
if (opts.use_ncurses_terminal == 1){
ncursesClose ();
diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c
index fb69582..037e9dc 100644
--- a/src/dsd_ncurses.c
+++ b/src/dsd_ncurses.c
@@ -27,16 +27,7 @@
#include "dsd.h"
#include "git_ver.h"
-/*
-short hexbuf;
-unsigned long long sr_0 = 0; //64-bit shift registers for pushing decoded binary or dibit data
-unsigned long long sr_1 = 0; //384
-unsigned long long sr_2 = 0; //
-unsigned long long sr_3 = 0; //
-unsigned long long sr_4 = 0; //
-unsigned long long sr_5 = 0; //
-unsigned long long sr_6 = 0; //
-*/
+
int reset = 0;
char c; //getch key
int tg; //last tg
@@ -62,6 +53,7 @@ char * FM_bannerN[9] = {
"https://github.com/lwvmobile/dsd-fme/tree/pulseaudio "
};
+/*
char * SyncTypes[20] = {
"P25P1_SYNC",
"INV_P25P1_SYNC",
@@ -84,6 +76,30 @@ char * SyncTypes[20] = {
"DSTAR_HD",
"INV_DSTAR_HD"
+};
+*/
+char * SyncTypes[20] = {
+ "+P25P1",
+ "-P25P1",
+ "+X2TDMA DATA",
+ "-X2TDMA DATA",
+ "+X2TDMA VOICE",
+ "-X2TDMA VOICE",
+ "+DSTARC",
+ "-DSTAR",
+ "+NXDN VOICE", //8
+ "-NXDN VOICE", //9
+ "+DMR DATA", //10
+ "-DMR VOICE", //11
+ "+DMR DATA", //12
+ "-DMR VOICE", //13
+ "+PROVOICE", //14
+ "-PROVOICE", //15
+ "+NXDN DATA", //16
+ "-NXDN DATA", //17
+ "+DSTAR HD",
+ "-DSTAR HD"
+
};
time_t nowN;
@@ -115,7 +131,7 @@ void ncursesOpen ()
init_pair(5, COLOR_MAGENTA, COLOR_BLACK); //Magenta for no frame sync/signal
noecho();
cbreak();
- fprintf (stderr, "Opening NCurses Terminal. \n");
+ //fprintf (stderr, "Opening NCurses Terminal. \n");
}
@@ -143,39 +159,9 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
printw ("------------------------------------------------------------------------------\n");
- if ( (state->lastsynctype == 14 || state->lastsynctype == 15) ) //honestly have no idea how to do this for pV
+ if ( (lls == 14 || lls == 15) && (time(NULL) - call_matrix[9][5] > 5) ) //honestly have no idea how to do this for pV, just going time based?
{
- call_matrix[5][0] = lls;
- call_matrix[5][1] = 1;
- call_matrix[5][2] = 1;
- call_matrix[5][3] = 1;
- call_matrix[5][4] = 1;
- call_matrix[5][5] = time(NULL);
- }
-
- if ( (state->nxdn_last_rid != src && src > 0) || (state->nxdn_last_ran != rn && rn > 0) ) //find condition to make this work well, probably if last != local last variables
- {
- for (short int k = 0; k < 5; k++)
- {
- call_matrix[k][0] = call_matrix[k+1][0];
- call_matrix[k][1] = call_matrix[k+1][1];
- call_matrix[k][2] = call_matrix[k+1][2];
- call_matrix[k][3] = call_matrix[k+1][3];
- call_matrix[k][4] = call_matrix[k+1][4];
- call_matrix[k][5] = call_matrix[k+1][5];
- }
- call_matrix[5][0] = lls;
- call_matrix[5][1] = rn;
- call_matrix[5][2] = src;
- call_matrix[5][3] = 0;
- call_matrix[5][4] = 0;
- call_matrix[5][5] = time(NULL);
-
- }
-
- if ( (lls == 0 || lls == 1) && state->lastsrc != rd && state->lastsrc > 0) //find condition to make this work well, probably if last != local last variables
- {
- for (short int k = 0; k < 5; k++)
+ for (short int k = 0; k < 9; k++)
{
call_matrix[k][0] = call_matrix[k+1][0];
call_matrix[k][1] = call_matrix[k+1][1];
@@ -185,12 +171,79 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
call_matrix[k][5] = call_matrix[k+1][5];
}
- call_matrix[5][0] = lls;
- call_matrix[5][1] = tg;
- call_matrix[5][2] = rd;
- call_matrix[5][3] = 0;
- call_matrix[5][4] = nc;
- call_matrix[5][5] = time(NULL);
+ call_matrix[9][0] = lls;
+ call_matrix[9][1] = 1;
+ call_matrix[9][2] = 1;
+ call_matrix[9][3] = 1;
+ call_matrix[9][4] = 1;
+ call_matrix[9][5] = time(NULL);
+ //nowN = time(NULL);
+ }
+
+ //if ( (state->nxdn_last_rid != src && src > 0) || (state->nxdn_last_ran != rn && rn > 0) ) //find condition to make this work well, probably if last != local last variables
+ //if ( (call_matrix[9][2] != src && src > 0) || (call_matrix[9][1] != rn && rn > 0) ) //NXDN working well now with this, updates immediately and only once
+ if ( call_matrix[9][2] != src && src > 0 && rn > 0 ) //NXDN working well now with this, updates immediately and only once
+ {
+ for (short int k = 0; k < 9; k++)
+ {
+ call_matrix[k][0] = call_matrix[k+1][0];
+ call_matrix[k][1] = call_matrix[k+1][1];
+ call_matrix[k][2] = call_matrix[k+1][2];
+ call_matrix[k][3] = call_matrix[k+1][3];
+ call_matrix[k][4] = call_matrix[k+1][4];
+ call_matrix[k][5] = call_matrix[k+1][5];
+ }
+ call_matrix[9][0] = lls;
+ call_matrix[9][1] = rn;
+ call_matrix[9][2] = src;
+ call_matrix[9][3] = 0;
+ call_matrix[9][4] = 0;
+ call_matrix[9][5] = time(NULL);
+
+ }
+
+ //if (state->dmr_color_code != dcc && (lls == 11 || lls == 13 || lls == 10 || lls == 12) ) //DMR Voice + last two is data
+ if ( (call_matrix[9][4] != dcc || call_matrix[9][2] != rd) && (lls == 11 || lls == 13 || lls == 10 || lls == 12) ) //DMR Voice + last two is data
+ {
+ //dcc = state->dmr_color_code;
+ for (short int k = 0; k < 9; k++)
+ {
+ call_matrix[k][0] = call_matrix[k+1][0];
+ call_matrix[k][1] = call_matrix[k+1][1];
+ call_matrix[k][2] = call_matrix[k+1][2];
+ call_matrix[k][3] = call_matrix[k+1][3];
+ call_matrix[k][4] = call_matrix[k+1][4];
+ call_matrix[k][5] = call_matrix[k+1][5];
+ }
+
+ call_matrix[9][0] = lls;
+ call_matrix[9][1] = tg;
+ call_matrix[9][2] = rd;
+ call_matrix[9][3] = 0;
+ call_matrix[9][4] = dcc;
+ call_matrix[9][5] = time(NULL);
+ //i++;
+ }
+
+ //if ( (lls == 0 || lls == 1) && state->lastsrc != rd && state->lastsrc > 0) //find condition to make this work well, probably if last != local last variables
+ if ( (lls == 0 || lls == 1) && call_matrix[9][2] != rd && nc > 0 && tg > 0) //P25
+ {
+ for (short int k = 0; k < 9; k++)
+ {
+ call_matrix[k][0] = call_matrix[k+1][0];
+ call_matrix[k][1] = call_matrix[k+1][1];
+ call_matrix[k][2] = call_matrix[k+1][2];
+ call_matrix[k][3] = call_matrix[k+1][3];
+ call_matrix[k][4] = call_matrix[k+1][4];
+ call_matrix[k][5] = call_matrix[k+1][5];
+ }
+
+ call_matrix[9][0] = lls;
+ call_matrix[9][1] = tg;
+ call_matrix[9][2] = rd;
+ call_matrix[9][3] = 0;
+ call_matrix[9][4] = nc;
+ call_matrix[9][5] = time(NULL);
//i++;
}
//printw ("Time: ");
@@ -199,7 +252,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
printw ("--Input Output----------------------------------------------------------------\n");
if (opts->audio_in_type == 0)
{
- printw ("| Pulse Audio Input [%i] kHz [%i] Channel\n", opts->pulse_digi_rate_in, opts->pulse_digi_in_channels);
+ printw ("| Pulse Audio Input [%i] kHz [%i] Channel\n", opts->pulse_digi_rate_in/1000, opts->pulse_digi_in_channels);
}
if (opts->audio_in_type == 1)
{
@@ -216,7 +269,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, opts->pulse_digi_out_channels);
+ printw ("| Pulse Audio Output [%i] kHz [%i] Channel\n", opts->pulse_digi_rate_out/1000, opts->pulse_digi_out_channels);
}
if (opts->mbe_out_dir[0] != 0)
{
@@ -311,7 +364,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
printw ("%s \n", s1last);
}
- if (state->dmr_color_code > 0 && (lls == 11 || lls == 13) ) //DMR VOice
+ if (state->dmr_color_code > 0 && (lls == 11 || lls == 13 || lls == 10 || lls == 12) ) //DMR Voice + last two is data
{
dcc = state->dmr_color_code;
}
@@ -361,36 +414,36 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
//0 - sync type; 1 - tg/ran; 2 - rid; 3 - slot; 4 - cc; 5 - time(NULL) ;
printw ("--Call History----------------------------------------------------------------\n");
- for (short int j = 0; j < 6; j++)
+ for (short int j = 0; j < 10; j++)
{
- if ( (time(NULL) - call_matrix[j][5]) < 9999)
+ if ( ((time(NULL) - call_matrix[9-j][5]) < 9999) )
//if (1 == 1)
{
- printw ("| #%d %s ", 6-j, SyncTypes[call_matrix[j][0]]);
+ printw ("| #%d %s ", j, SyncTypes[call_matrix[9-j][0]]);
if (lls == 8 || lls == 9 || lls == 16 || lls == 17)
{
- printw ("RAN [%2d] ", call_matrix[j][1]);
+ printw ("RAN [%2d] ", call_matrix[9-j][1]);
}
if (lls == 0 || lls == 1 || lls == 11 || lls == 13) //P25 P1 and DMR Voice
{
- printw ("TID [%2d] ", call_matrix[j][1]);
+ printw ("TID [%2d] ", call_matrix[9-j][1]);
}
- printw ("RID [%4d] ", call_matrix[j][2]);
+ printw ("RID [%4d] ", call_matrix[9-j][2]);
//printw ("S %d - ", call_matrix[j][3]);
- if (call_matrix[j][0] == 0 || call_matrix[j][0] == 1) //P25P1 Voice
+ if (call_matrix[9-j][0] == 0 || call_matrix[9-j][0] == 1) //P25P1 Voice
{
- printw ("NAC [0x%X] ", call_matrix[j][4]);
+ printw ("NAC [0x%X] ", call_matrix[9-j][4]);
}
- if (call_matrix[j][0] == 12 || call_matrix[j][0] == 13) //DMR Voice 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 ) //DMR Voice Types
{
- printw ("DCC [%d] ", call_matrix[j][4]);
+ printw ("DCC [%d] ", call_matrix[9-j][4]);
}
- printw ("%d secs ago\n", time(NULL) - call_matrix[j][5]);
+ printw ("%d secs ago\n", time(NULL) - call_matrix[9-j][5]);
}
//printw("\n");
}
- printw ("------------------------------------------------------------------------------");
+ printw ("------------------------------------------------------------------------------\n");
attroff(COLOR_PAIR(4)); //cyan for history
//put sync type at very bottom
//printw ("%s %s\n", state->ftype, state->fsubtype); //some ftype strings have extra spaces in them
@@ -425,7 +478,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
void ncursesClose ()
{
- erase();
- refresh();
+ //erase();
+ //refresh();
endwin();
}
diff --git a/src/dsd_reset.c b/src/dsd_reset.c
index e794701..e8aa893 100644
--- a/src/dsd_reset.c
+++ b/src/dsd_reset.c
@@ -103,5 +103,5 @@ resetState (dsd_state * state)
// state->debug_label_imbe_file = NULL;
//#endif
- initialize_p25_heuristics(&state->p25_heuristics); //see if we want to re-init this or not, currently seems to cause memory leak when running over and over
+ initialize_p25_heuristics(&state->p25_heuristics); //see if we want to re-init this or not, currently seems to cause memory leak when running over and over, mitigated with a reset flag
}