Call Alert; Call History Bug Fix; Minor Tweaks

Call Alert (-a or toggle on/off in ncurses)
--beep sound on radio id change when using ncurses terminal (tied to call history array)
---need to copy tone8.wav and tone24.wav files to /usr/share/ directory and chmod 777 them.
---updated all auto install scripts to copy and chmod as appropriate
----iz4tow, need to update windows tutorials for the wav files, else they won't play

Tweaks/Bug Fix to Call History (specifically DMR) to only set src ids on voice sync, and not on data sync

Manually Set P2 Parameters at CLI (-X BEE00ABC123)
-- use -X (capital X) and then enter WACN/SYSID/CC altogether 
--- feature already available in ncurses terminal menu

Update Linux Install Instructions and auto installers to copy/paste wav files into /usr/share/ directory

Other Minor Tweaks
This commit is contained in:
lwvmobile 2022-09-22 20:46:47 -04:00 committed by GitHub
parent 370d6be28e
commit f3d2dbb4dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 221 additions and 40 deletions

View File

@ -186,6 +186,10 @@ git branch -a
git checkout remotes/origin/pulseaudio git checkout remotes/origin/pulseaudio
git checkout -b pulseaudio git checkout -b pulseaudio
git branch -a #double check to see if you are on pulseaudio branch git branch -a #double check to see if you are on pulseaudio branch
sudo cp tone8.wav /usr/share/
sudo cp tone24.wav /usr/share/
sudo chmod 777 /usr/share/tone8.wav
sudo chmod 777 /usr/share/tone24.wav
mkdir build mkdir build
cd build cd build
cmake .. cmake ..
@ -216,6 +220,16 @@ make -j `nproc`
sudo make install sudo make install
sudo ldconfig sudo ldconfig
``` ```
If the call alert wav files aren't playing, then make sure to run the following in the dsd-fme folder to copy the wav files to the /usr/share/ folder and give them adequate permission to be accessed.
```
sudo cp tone8.wav /usr/share/
sudo cp tone24.wav /usr/share/
sudo chmod 777 /usr/share/tone8.wav
sudo chmod 777 /usr/share/tone24.wav
```
# Join the Conversation # Join the Conversation
Want to help drive the direction of this project and read more about the latest updates and releases to DSD-FME? Then join the conversation on the 'unofficial official' [DSD-FME](https://forums.radioreference.com/threads/dsd-fme.438137/ "DSD-FME") Forum Thread on the Radio Reference Forums. Want to help drive the direction of this project and read more about the latest updates and releases to DSD-FME? Then join the conversation on the 'unofficial official' [DSD-FME](https://forums.radioreference.com/threads/dsd-fme.438137/ "DSD-FME") Forum Thread on the Radio Reference Forums.

View File

@ -13,6 +13,10 @@ git branch -a
git checkout remotes/origin/pulseaudio git checkout remotes/origin/pulseaudio
git checkout -b pulseaudio git checkout -b pulseaudio
git branch -a #double check to see if you are on pulseaudio branch git branch -a #double check to see if you are on pulseaudio branch
sudo cp tone8.wav /usr/share/
sudo cp tone24.wav /usr/share/
sudo chmod 777 /usr/share/tone8.wav
sudo chmod 777 /usr/share/tone24.wav
mkdir build mkdir build
cd build cd build
cmake .. cmake ..

View File

@ -49,6 +49,10 @@ git branch -a
git checkout remotes/origin/pulseaudio git checkout remotes/origin/pulseaudio
git checkout -b pulseaudio git checkout -b pulseaudio
git branch -a #double check to see if you are on pulseaudio branch git branch -a #double check to see if you are on pulseaudio branch
sudo cp tone8.wav /usr/share/
sudo cp tone24.wav /usr/share/
sudo chmod 777 /usr/share/tone8.wav
sudo chmod 777 /usr/share/tone24.wav
mkdir build mkdir build
cd build cd build
cmake .. cmake ..

View File

@ -356,6 +356,7 @@ typedef struct
short int aggressive_framesync; short int aggressive_framesync;
FILE *symbolfile; FILE *symbolfile;
int call_alert;
} dsd_opts; } dsd_opts;
@ -593,7 +594,7 @@ typedef struct
int p2_is_lcch; //flag to tell us when a frame is lcch and not sacch int p2_is_lcch; //flag to tell us when a frame is lcch and not sacch
//experimental symbol file capture read throttle //experimental symbol file capture read throttle
unsigned long long int symbol_throttle; //throttle speed int symbol_throttle; //throttle speed
int use_throttle; //only use throttle if set to 1 int use_throttle; //only use throttle if set to 1
//dstar header for ncurses //dstar header for ncurses

View File

@ -1,3 +1,7 @@
sudo cp tone8.wav /usr/share/
sudo cp tone24.wav /usr/share/
sudo chmod 777 /usr/share/tone8.wav
sudo chmod 777 /usr/share/tone24.wav
mkdir build mkdir build
cd build cd build
cmake .. cmake ..

View File

@ -7,6 +7,10 @@ sleep 1
##Open your clone folder## ##Open your clone folder##
git pull https://github.com/lwvmobile/dsd-fme pulseaudio git pull https://github.com/lwvmobile/dsd-fme pulseaudio
sleep 2 sleep 2
sudo cp tone8.wav /usr/share/
sudo cp tone24.wav /usr/share/
sudo chmod 777 /usr/share/tone8.wav
sudo chmod 777 /usr/share/tone24.wav
##cd into your build folder## ##cd into your build folder##
cd build cd build
##cmake usually isn't necesary, but could be if I update the cmakelist.txt ##cmake usually isn't necesary, but could be if I update the cmakelist.txt

View File

@ -1757,6 +1757,32 @@ void ProcessCSBK(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t
sprintf(state->dmr_branding, " Hytera XPT "); sprintf(state->dmr_branding, " Hytera XPT ");
} }
//Testing CSBK Voice Call on Tait //CSBK Protect RID ILLEGALLY_PARKED
// if ((IrrecoverableErrors == 0) && CRCCorrect)
// {
// if (DmrDataByte[0] == 0xAF)
// {
// if (state->currentslot == 0)
// {
// state->lastsrc = (DmrDataByte[4] << 16) | (DmrDataByte[5] << 8) | (DmrDataByte[6] << 0);
// state->lasttg = (DmrDataByte[7] << 16) | (DmrDataByte[8] << 8) | (DmrDataByte[9] << 0);
// fprintf (stderr, "%s", KGRN);
// fprintf (stderr, "\n SLOT %d ", state->currentslot+1);
// fprintf(stderr, "TGT=%u SRC=%u ", state->lasttg, state->lastsrc);
// fprintf(stderr, " CSBK Voice LC??");
// }
// if (state->currentslot == 1)
// {
// state->lastsrcR = (DmrDataByte[4] << 16) | (DmrDataByte[5] << 8) | (DmrDataByte[6] << 0);
// state->lasttgR = (DmrDataByte[7] << 16) | (DmrDataByte[8] << 8) | (DmrDataByte[9] << 0);
// fprintf (stderr, "%s", KGRN);
// fprintf (stderr, "\n SLOT %d ", state->currentslot+1);
// fprintf(stderr, "TGT=%u SRC=%u ", state->lasttgR, state->lastsrcR);
// fprintf(stderr, " CSBK Voice LC??");
// }
// }
// }
//Full //Full
if (opts->payload == 1) if (opts->payload == 1)
{ {

View File

@ -69,6 +69,7 @@ comp (const void *a, const void *b)
//struct for checking existence of directory to write to //struct for checking existence of directory to write to
struct stat st = {0}; struct stat st = {0};
char wav_file_directory[1024] = {0}; char wav_file_directory[1024] = {0};
unsigned long long int p2vars = 0;
void void
noCarrier (dsd_opts * opts, dsd_state * state) noCarrier (dsd_opts * opts, dsd_state * state)
@ -320,6 +321,8 @@ initOpts (dsd_opts * opts)
opts->inverted_p2 = 0; opts->inverted_p2 = 0;
opts->p2counter = 0; opts->p2counter = 0;
opts->call_alert = 0; //call alert beeper for ncurses
} }
void void
@ -403,6 +406,8 @@ initState (dsd_state * state)
state->tgcount = 0; state->tgcount = 0;
state->lasttg = 0; state->lasttg = 0;
state->lastsrc = 0; state->lastsrc = 0;
state->lasttgR = 0;
state->lastsrcR = 0;
state->nac = 0; state->nac = 0;
state->errs = 0; state->errs = 0;
state->errs2 = 0; state->errs2 = 0;
@ -614,7 +619,7 @@ usage ()
printf (" -z <num> Frame rate for datascope\n"); printf (" -z <num> Frame rate for datascope\n");
printf ("\n"); printf ("\n");
printf ("Input/Output options:\n"); printf ("Input/Output options:\n");
printf (" -i <device> Audio input device (default is pulse audio, \n - for piped stdin, rtl for rtl device)\n"); printf (" -i <device> Audio input device (default is pulse audio), \n - for piped stdin, rtl for rtl device,\n filename.bin for OP25/FME capture bin files\n");
printf (" -o <device> Audio output device (default is pulse audio)\n"); printf (" -o <device> Audio output device (default is pulse audio)\n");
printf (" -d <dir> Create mbe data files, use this directory\n"); printf (" -d <dir> Create mbe data files, use this directory\n");
printf (" -r <files> Read/Play saved mbe data from file(s)\n"); printf (" -r <files> Read/Play saved mbe data from file(s)\n");
@ -623,7 +628,9 @@ usage ()
printf (" -T Enable Per Call WAV file saving in XDMA and NXDN decoding classes\n"); printf (" -T Enable Per Call WAV file saving in XDMA and NXDN decoding classes\n");
printf (" (Per Call can only be used in Ncurses Terminal!)\n"); printf (" (Per Call can only be used in Ncurses Terminal!)\n");
printf (" (Running in console will use static wav files)\n"); printf (" (Running in console will use static wav files)\n");
printf (" -n Throttle Symbol Capture Bin Input"); printf (" -a Enable Call Alert Beep (NCurses Terminal Only)\n");
printf (" (Warning! Might be annoying.)");
printf (" -n Throttle Symbol Capture Bin Input\n");
printf (" (useful when reading files still being written to by OP25)"); printf (" (useful when reading files still being written to by OP25)");
printf ("\n"); printf ("\n");
printf ("RTL-SDR options:\n"); printf ("RTL-SDR options:\n");
@ -662,11 +669,13 @@ usage ()
printf (" * denotes frame types that cannot be auto-detected.\n"); printf (" * denotes frame types that cannot be auto-detected.\n");
printf ("\n"); printf ("\n");
printf ("Advanced Decoder options:\n"); printf ("Advanced Decoder options:\n");
printf (" -X <hex> Manually Set P2 Parameters (WACN, SYSID, CC/NAC)\n");
printf (" (-X BEE00ABC123)\n");
// printf (" -A <num> QPSK modulation auto detection threshold (default=26)\n"); // printf (" -A <num> QPSK modulation auto detection threshold (default=26)\n");
printf (" -S <num> Symbol buffer size for QPSK decision point tracking\n"); // printf (" -S <num> Symbol buffer size for QPSK decision point tracking\n");
printf (" (default=36)\n"); // printf (" (default=36)\n");
printf (" -M <num> Min/Max buffer size for QPSK decision point tracking\n"); // printf (" -M <num> Min/Max buffer size for QPSK decision point tracking\n");
printf (" (default=15)\n"); // printf (" (default=15)\n");
// printf (" -F Enable DMR TDMA Stereo Passive Frame Sync\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 (" 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 (" Use if skipping occurs, but may cause wonky audio due to loss of good sync\n");
@ -918,7 +927,7 @@ main (int argc, char **argv)
exitflag = 0; exitflag = 0;
signal (SIGINT, sigfun); 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:H:NQWrlZTF")) != -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:H:X:NQWrlZTF")) != -1)
{ {
opterr = 0; opterr = 0;
switch (c) switch (c)
@ -928,7 +937,8 @@ main (int argc, char **argv)
exit (0); exit (0);
case 'a': case 'a':
//printPortAudioDevices(); //printPortAudioDevices();
exit(0); //exit(0);
opts.call_alert = 1;
case 'e': case 'e':
opts.errorbars = 1; opts.errorbars = 1;
opts.datascope = 0; opts.datascope = 0;
@ -1030,6 +1040,21 @@ main (int argc, char **argv)
state.K1 = state.H; //shim state.K1 = state.H; //shim
break; break;
//manually set Phase 2 TDMA WACN/SYSID/CC
case 'X':
sscanf (optarg, "%llX", &p2vars);
if (p2vars > 0)
{
state.p2_wacn = p2vars >> 24;
state.p2_sysid = (p2vars >> 12) & 0xFFF;
state.p2_cc = p2vars & 0xFFF;
}
if (state.p2_wacn != 0 && state.p2_sysid != 0 && state.p2_cc != 0)
{
state.p2_hardset = 1;
}
break;
case 'G': //Set rtl device gain 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 sscanf (optarg, "%d", &opts.rtl_gain_value); //multiple value by ten to make it consitent with the way rtl_fm really works
break; break;

View File

@ -157,6 +157,61 @@ char * DMRBusrtTypes[32] = {
}; };
void beeper (dsd_opts * opts, dsd_state * state, int type)
{
FILE *beep;
char wav_name[1024] = {0};
if (opts->dmr_stereo == 1)
{
//24k tone wav file
strncpy(wav_name, "/usr/share/tone24.wav", 1023);
}
else
{
//8k tone
strncpy(wav_name, "/usr/share/tone8.wav", 1023);
}
wav_name[1023] = '\0';
struct stat stat_buf;
if (stat(wav_name, &stat_buf) == 0)
{
beep = fopen (wav_name, "ro");
uint8_t buf[1024] = {0};
short blip = 0;
int loop = 1;
while (loop == 1)
{
fread(buf, sizeof(buf), 1, beep);
if ( feof (beep) )
{
loop = 0;
}
if (loop == 1)
{
//only beep on R if dmr_stereo is active and slot 2, else beep on L
if (type == 0 && state->dmr_stereo == 1)
{
pa_simple_write(opts->pulse_digi_dev_out, buf, sizeof(buf), NULL);
}
if (type == 1 && state->dmr_stereo == 1)
{
pa_simple_write(opts->pulse_digi_dev_outR, buf, sizeof(buf), NULL);
}
if (state->dmr_stereo == 0)
{
pa_simple_write(opts->pulse_digi_dev_out, buf, sizeof(buf), NULL);
}
}
}
fclose (beep);
}
}
char * getDateN(void) { char * getDateN(void) {
char datename[99]; //bug in 32-bit Ubuntu when using date in filename, date is garbage text char datename[99]; //bug in 32-bit Ubuntu when using date in filename, date is garbage text
char * curr2; char * curr2;
@ -209,7 +264,7 @@ char *choicesc[] = {
"Replay Last Symbol Capture Bin", "Replay Last Symbol Capture Bin",
"Stop & Close Symbol Capture Bin Playback", "Stop & Close Symbol Capture Bin Playback",
"Stop & Close Symbol Capture Bin Saving", "Stop & Close Symbol Capture Bin Saving",
" ", "Toggle Call Alert Beep ",
"Resume Decoding" "Resume Decoding"
}; };
@ -621,6 +676,40 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state)
} }
if (choicec == 7) //RTL UDP Retune
{
//read in new rtl frequency
#ifdef USE_RTLSDR
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;
#endif
choicec = 18;
}
if (choicec == 8)
{
//vacant box
}
if (choicec == 9)
{
//vacant box
}
if (choicec == 10) if (choicec == 10)
{ {
if (opts->ncurses_compact == 0) if (opts->ncurses_compact == 0)
@ -728,28 +817,14 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state)
choicec = 18; //exit choicec = 18; //exit
} }
if (choicec == 7) //RTL UDP Retune //toggle call alert beep
if (choicec == 17)
{ {
//read in new rtl frequency if (opts->call_alert == 0)
#ifdef USE_RTLSDR {
entry_win = newwin(6, WIDTH+18, starty+10, startx+10); opts->call_alert = 1;
box (entry_win, 0, 0); }
mvwprintw(entry_win, 2, 2, " Enter Frequency in Hz (851.8 MHz is 851800000 Hz) "); else opts->call_alert = 0;
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;
#endif
choicec = 18;
} }
if (choicec != 0 && choicec != 18 ) //return to last menu if (choicec != 0 && choicec != 18 ) //return to last menu
@ -765,6 +840,7 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state)
//wrefresh(menu_win); //wrefresh(menu_win);
break; break;
} }
if (choicec == 18) //exit both menus if (choicec == 18) //exit both menus
{ {
//exit //exit
@ -1495,7 +1571,8 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
} }
//DMR SRC //DMR SRC
if ( (lls == 12 || lls == 13 || lls == 10 || lls == 11 || lls == 32) ) // if ( (lls == 12 || lls == 13 || lls == 10 || lls == 11 || lls == 32) )
if ( (lls == 12 || lls == 11 || lls == 32) )
{ {
if (state->dmrburstL == 16 && state->lastsrc > 0) //state->currentslot == 0 && if (state->dmrburstL == 16 && state->lastsrc > 0) //state->currentslot == 0 &&
{ {
@ -1506,17 +1583,15 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
{ {
rdR = state->lastsrcR; rdR = state->lastsrcR;
} }
//move to seperate P25 version plz
//opts->p25enc = 0;
} }
//DMR TG //DMR TG
if ( (lls == 12 || lls == 13 || lls == 10 || lls == 11 || lls == 32) ) if ( (lls == 12 || lls == 11 || lls == 32) )
{ {
if (state->dmrburstL == 16 && state->lasttg > 0) //state->currentslot == 0 && if (state->dmrburstL == 16 && state->lasttg > 0) //state->currentslot == 0 &&
{ {
tg = state->lasttg; tg = state->lasttg;
} }
if (state->dmrburstR == 16 && state->lasttgR > 0) //state->currentslot == 1 && if (state->dmrburstR == 16 && state->lasttgR > 0) //state->currentslot == 1 &&
@ -1524,7 +1599,6 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
tgR = state->lasttgR; tgR = state->lasttgR;
} }
//opts->p25enc = 0;
} }
@ -1629,10 +1703,15 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
openWavOutFileL (opts, state); //testing for now, will want to move to per call later openWavOutFileL (opts, state); //testing for now, will want to move to per call later
} }
if (opts->call_alert == 1)
{
beeper (opts, state, 0);
}
} }
//DMR MS //DMR MS
if ( call_matrix[9][2] != rd && (lls == 32 || lls == 33 || lls == 34) ) if ( call_matrix[9][2] != rd && lls == 32)
{ {
for (short int k = 0; k < 10; k++) for (short int k = 0; k < 10; k++)
@ -1661,10 +1740,15 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
openWavOutFileL (opts, state); //testing for now, will want to move to per call later openWavOutFileL (opts, state); //testing for now, will want to move to per call later
} }
if (opts->call_alert == 1)
{
beeper (opts, state, 0);
}
} }
//DMR BS Slot 1 - matrix 0-4 //DMR BS Slot 1 - matrix 0-4
if ( call_matrix[4][2] != rd && (lls == 12 || lls == 13 || lls == 10 || lls == 11 || lls == 35 || lls == 36) ) if ( call_matrix[4][2] != rd && (lls == 11 || lls == 12 || lls == 35 || lls == 36) )
{ {
for (short int k = 0; k < 4; k++) for (short int k = 0; k < 4; k++)
@ -1694,10 +1778,15 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
openWavOutFileL (opts, state); //testing for now, will want to move to per call later openWavOutFileL (opts, state); //testing for now, will want to move to per call later
} }
if (opts->call_alert == 1)
{
beeper (opts, state, 0);
}
} }
//DMR BS Slot 2 - matrix 5-9 //DMR BS Slot 2 - matrix 5-9
if ( call_matrix[9][2] != rdR && (lls == 12 || lls == 13 || lls == 10 || lls == 11 || lls == 35 || lls == 36) ) if ( call_matrix[9][2] != rdR && (lls == 11 || lls == 12 || lls == 35 || lls == 36) )
{ {
for (short int k = 5; k < 9; k++) for (short int k = 5; k < 9; k++)
@ -1726,6 +1815,11 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
openWavOutFileR (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 (opts->call_alert == 1)
{
beeper (opts, state, 1);
}
} }
//P25 P1 //P25 P1
@ -1757,6 +1851,11 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
openWavOutFileL (opts, state); //testing for now, will want to move to per call later openWavOutFileL (opts, state); //testing for now, will want to move to per call later
} }
if (opts->call_alert == 1)
{
beeper (opts, state, 0);
}
} }
//Start Printing Section //Start Printing Section

BIN
tone24.wav Normal file

Binary file not shown.

BIN
tone8.wav Normal file

Binary file not shown.