Merge pull request #85 from lwvmobile/callalert
Call Alert; Call History Bug Fix; Minor Tweaks
This commit is contained in:
commit
05a9268aef
14
README.md
14
README.md
|
|
@ -186,6 +186,10 @@ git branch -a
|
|||
git checkout remotes/origin/pulseaudio
|
||||
git checkout -b pulseaudio
|
||||
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
|
||||
cd build
|
||||
cmake ..
|
||||
|
|
@ -216,6 +220,16 @@ make -j `nproc`
|
|||
sudo make install
|
||||
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
|
||||
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -13,6 +13,10 @@ git branch -a
|
|||
git checkout remotes/origin/pulseaudio
|
||||
git checkout -b pulseaudio
|
||||
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
|
||||
cd build
|
||||
cmake ..
|
||||
|
|
|
|||
|
|
@ -49,6 +49,10 @@ git branch -a
|
|||
git checkout remotes/origin/pulseaudio
|
||||
git checkout -b pulseaudio
|
||||
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
|
||||
cd build
|
||||
cmake ..
|
||||
|
|
|
|||
|
|
@ -356,6 +356,7 @@ typedef struct
|
|||
short int aggressive_framesync;
|
||||
|
||||
FILE *symbolfile;
|
||||
int call_alert;
|
||||
|
||||
} dsd_opts;
|
||||
|
||||
|
|
@ -593,7 +594,7 @@ typedef struct
|
|||
int p2_is_lcch; //flag to tell us when a frame is lcch and not sacch
|
||||
|
||||
//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
|
||||
|
||||
//dstar header for ncurses
|
||||
|
|
|
|||
|
|
@ -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
|
||||
cd build
|
||||
cmake ..
|
||||
|
|
|
|||
|
|
@ -7,6 +7,10 @@ sleep 1
|
|||
##Open your clone folder##
|
||||
git pull https://github.com/lwvmobile/dsd-fme pulseaudio
|
||||
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 build
|
||||
##cmake usually isn't necesary, but could be if I update the cmakelist.txt
|
||||
|
|
|
|||
|
|
@ -1757,6 +1757,32 @@ void ProcessCSBK(dsd_opts * opts, dsd_state * state, uint8_t info[196], uint8_t
|
|||
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
|
||||
if (opts->payload == 1)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ comp (const void *a, const void *b)
|
|||
//struct for checking existence of directory to write to
|
||||
struct stat st = {0};
|
||||
char wav_file_directory[1024] = {0};
|
||||
unsigned long long int p2vars = 0;
|
||||
|
||||
void
|
||||
noCarrier (dsd_opts * opts, dsd_state * state)
|
||||
|
|
@ -320,6 +321,8 @@ initOpts (dsd_opts * opts)
|
|||
opts->inverted_p2 = 0;
|
||||
opts->p2counter = 0;
|
||||
|
||||
opts->call_alert = 0; //call alert beeper for ncurses
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -403,6 +406,8 @@ initState (dsd_state * state)
|
|||
state->tgcount = 0;
|
||||
state->lasttg = 0;
|
||||
state->lastsrc = 0;
|
||||
state->lasttgR = 0;
|
||||
state->lastsrcR = 0;
|
||||
state->nac = 0;
|
||||
state->errs = 0;
|
||||
state->errs2 = 0;
|
||||
|
|
@ -614,7 +619,7 @@ usage ()
|
|||
printf (" -z <num> Frame rate for datascope\n");
|
||||
printf ("\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 (" -d <dir> Create mbe data files, use this directory\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 (" (Per Call can only be used in Ncurses Terminal!)\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 ("\n");
|
||||
printf ("RTL-SDR options:\n");
|
||||
|
|
@ -662,11 +669,13 @@ usage ()
|
|||
printf (" * denotes frame types that cannot be auto-detected.\n");
|
||||
printf ("\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 (" -S <num> Symbol buffer size for QPSK decision point tracking\n");
|
||||
printf (" (default=36)\n");
|
||||
printf (" -M <num> Min/Max buffer size for QPSK decision point tracking\n");
|
||||
printf (" (default=15)\n");
|
||||
// printf (" -S <num> Symbol buffer size for QPSK decision point tracking\n");
|
||||
// printf (" (default=36)\n");
|
||||
// printf (" -M <num> Min/Max buffer size for QPSK decision point tracking\n");
|
||||
// printf (" (default=15)\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");
|
||||
|
|
@ -918,7 +927,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: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;
|
||||
switch (c)
|
||||
|
|
@ -928,7 +937,8 @@ main (int argc, char **argv)
|
|||
exit (0);
|
||||
case 'a':
|
||||
//printPortAudioDevices();
|
||||
exit(0);
|
||||
//exit(0);
|
||||
opts.call_alert = 1;
|
||||
case 'e':
|
||||
opts.errorbars = 1;
|
||||
opts.datascope = 0;
|
||||
|
|
@ -1030,6 +1040,21 @@ main (int argc, char **argv)
|
|||
state.K1 = state.H; //shim
|
||||
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
|
||||
sscanf (optarg, "%d", &opts.rtl_gain_value); //multiple value by ten to make it consitent with the way rtl_fm really works
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -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 datename[99]; //bug in 32-bit Ubuntu when using date in filename, date is garbage text
|
||||
char * curr2;
|
||||
|
|
@ -209,7 +264,7 @@ char *choicesc[] = {
|
|||
"Replay Last Symbol Capture Bin",
|
||||
"Stop & Close Symbol Capture Bin Playback",
|
||||
"Stop & Close Symbol Capture Bin Saving",
|
||||
" ",
|
||||
"Toggle Call Alert Beep ",
|
||||
"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 (opts->ncurses_compact == 0)
|
||||
|
|
@ -728,28 +817,14 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state)
|
|||
choicec = 18; //exit
|
||||
}
|
||||
|
||||
if (choicec == 7) //RTL UDP Retune
|
||||
//toggle call alert beep
|
||||
if (choicec == 17)
|
||||
{
|
||||
//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 (opts->call_alert == 0)
|
||||
{
|
||||
opts->call_alert = 1;
|
||||
}
|
||||
else opts->call_alert = 0;
|
||||
}
|
||||
|
||||
if (choicec != 0 && choicec != 18 ) //return to last menu
|
||||
|
|
@ -765,6 +840,7 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state)
|
|||
//wrefresh(menu_win);
|
||||
break;
|
||||
}
|
||||
|
||||
if (choicec == 18) //exit both menus
|
||||
{
|
||||
//exit
|
||||
|
|
@ -1495,7 +1571,8 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
|
|||
}
|
||||
|
||||
//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 &&
|
||||
{
|
||||
|
|
@ -1506,17 +1583,15 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
|
|||
{
|
||||
rdR = state->lastsrcR;
|
||||
}
|
||||
//move to seperate P25 version plz
|
||||
//opts->p25enc = 0;
|
||||
|
||||
}
|
||||
|
||||
//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 &&
|
||||
{
|
||||
tg = state->lasttg;
|
||||
|
||||
}
|
||||
|
||||
if (state->dmrburstR == 16 && state->lasttgR > 0) //state->currentslot == 1 &&
|
||||
|
|
@ -1524,7 +1599,6 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
|
|||
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
|
||||
}
|
||||
|
||||
if (opts->call_alert == 1)
|
||||
{
|
||||
beeper (opts, state, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//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++)
|
||||
|
|
@ -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
|
||||
}
|
||||
|
||||
if (opts->call_alert == 1)
|
||||
{
|
||||
beeper (opts, state, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//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++)
|
||||
|
|
@ -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
|
||||
}
|
||||
|
||||
if (opts->call_alert == 1)
|
||||
{
|
||||
beeper (opts, state, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//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++)
|
||||
|
|
@ -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
|
||||
}
|
||||
|
||||
if (opts->call_alert == 1)
|
||||
{
|
||||
beeper (opts, state, 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//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
|
||||
}
|
||||
|
||||
if (opts->call_alert == 1)
|
||||
{
|
||||
beeper (opts, state, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Start Printing Section
|
||||
|
|
|
|||
Binary file not shown.
Loading…
Reference in New Issue