Add More RTL Options, UDP Remote

Add Gain and Device Index Number for RTL, add UDP remote to control frequency and squelch of RTL. Other Random things.
This commit is contained in:
lwvmobile 2022-01-29 21:53:35 -05:00 committed by GitHub
parent f383d165fd
commit 2523383b14
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 574 additions and 132 deletions

View File

@ -11,9 +11,11 @@ find_package(MBE REQUIRED)
find_package(ITPP REQUIRED)
find_package(LibPortAudio)
find_package(RTLSDR)
#more fucking around
find_package(Curses REQUIRED)
include_directories(SYSTEM ${LIBSNDFILE_INCLUDE_DIR} ${MBE_INCLUDE_DIR} ${ITPP_INCLUDE_DIR})
set(LIBS ${MBE_LIBRARY} ${LIBSNDFILE_LIBRARY} ${ITPP_LIBRARY})
include_directories(SYSTEM ${LIBSNDFILE_INCLUDE_DIR} ${MBE_INCLUDE_DIR} ${ITPP_INCLUDE_DIR} ${CURSES_INCLUDE_DIR})
set(LIBS ${MBE_LIBRARY} ${LIBSNDFILE_LIBRARY} ${ITPP_LIBRARY} ${CURSES_LIBRARY})
if(PORTAUDIO_FOUND)
include_directories(SYSTEM ${PORTAUDIO_INCLUDE_DIRS})

16
cmake/FindCURSES.cmake Normal file
View File

@ -0,0 +1,16 @@
# - Try to find NCURSES
# Once done this will define
#
# ITPP_FOUND - System has ITPP
# ITPP_INCLUDE_DIR - The ITPP include directory
# ITPP_LIBRARY - The library needed to use ITPP
#
set(CURSES_LIBRARY "/opt/lib/libncurses.so")
set(CURSES_INCLUDE_PATH "/opt/include")
find_path(CURSES_INCLUDE_DIR /usr/ncurses.h)
set(CURSES_NAMES ${CURSES_NAMES} curses.h curses curses5w curses6w curses6 curses5 libncursesw)
FIND_LIBRARY(CURSES_LIBRARY NAMES ${CURSES_NAMES})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(CURSES DEFAULT_MSG NCURSES_LIBRARY CURSES_INCLUDE_DIR)

15
cmake/FindNCURSES.cmake Normal file
View File

@ -0,0 +1,15 @@
# - Try to find NCURSES
# Once done this will define
#
# ITPP_FOUND - System has ITPP
# ITPP_INCLUDE_DIR - The ITPP include directory
# ITPP_LIBRARY - The library needed to use ITPP
#
find_path(ITPP_INCLUDE_DIR itpp/itcomm.h)
set(NCURSES_NAMES ${NCURSES_NAMES} curses.h ncurses ncurses5w ncurses6w ncurses6 ncurses5 libncursesw)
FIND_LIBRARY(NCURSES_LIBRARY NAMES ${NCURSES_NAMES})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(NCURSES DEFAULT_MSG NCURSES_LIBRARY NCURSES_INCLUDE_DIR)

View File

@ -66,6 +66,7 @@
* global variables
*/
static volatile int exitflag;
//volatile int exitflag; //didn't work, couldn't build, multiple definitions of exitflag
typedef struct
{
@ -134,6 +135,8 @@ typedef struct
int delay;
int use_cosine_filter;
int unmute_encrypted_p25;
int rtl_dev_index;
int rtl_gain_value;
} dsd_opts;
typedef struct

View File

@ -17,7 +17,6 @@
#include "dsd.h"
void
processAudio (dsd_opts * opts, dsd_state * state)
{
@ -164,7 +163,7 @@ writeSynthesizedVoice (dsd_opts * opts, dsd_state * state)
// for(n=0; n<160; n++)
// printf("%d ", ((short*)(state->audio_out_temp_buf))[n]);
// printf("\n");
aout_buf_p = aout_buf;
state->audio_out_temp_buf_p = state->audio_out_temp_buf;
@ -214,6 +213,84 @@ writeSynthesizedVoice (dsd_opts * opts, dsd_state * state)
*/
}
//Test playing raw audio HERE
//get_rtlsdr_sample(&sample);
void
playRawAudio (dsd_opts * opts, dsd_state * state)
{
ssize_t result;
//if (state->audio_out_idx > opts->delay)
if (opts->audio_in_type == 3) //if set to rtl_fm, maybe it shouldn't matter but for now, using this
{
// output synthesized speech to sound card
if(opts->audio_out_type == 2)
{
#ifdef USE_PORTAUDIO
PaError err = paNoError;
do
{
long available = Pa_GetStreamWriteAvailable( opts->audio_out_pa_stream );
if(available < 0)
err = available;
//printf("Frames available: %d\n", available);
if( err != paNoError )
break;
if(available > SAMPLE_RATE_OUT * PA_LATENCY_OUT)
{
//It looks like this might not be needed for very small latencies. However, it's definitely needed for a bit larger ones.
//When PA_LATENCY_OUT == 0.500 I get output buffer underruns if I don't use this. With PA_LATENCY_OUT <= 0.100 I don't see those happen.
//But with PA_LATENCY_OUT < 0.100 I run the risk of choppy audio and stream errors.
printf("\nSyncing voice output stream\n");
err = Pa_StopStream( opts->audio_out_pa_stream );
if( err != paNoError )
break;
}
err = Pa_IsStreamActive( opts->audio_out_pa_stream );
if(err == 0)
{
printf("Start voice output stream\n");
err = Pa_StartStream( opts->audio_out_pa_stream );
}
else if(err == 1)
{
err = paNoError;
}
if( err != paNoError )
break;
//printf("write stream %d\n", state->audio_out_idx);
err = Pa_WriteStream( opts->audio_out_pa_stream, (state->audio_out_buf_p - state->audio_out_idx), state->audio_out_idx );
if( err != paNoError )
break;
} while(0);
if( err != paNoError )
{
fprintf( stderr, "An error occured while using the portaudio output stream\n" );
fprintf( stderr, "Error number: %d\n", err );
fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
}
#endif
}
else
result = write (opts->audio_out_fd, (state->audio_out_buf_p - state->audio_out_idx), (state->audio_out_idx * 2));
state->audio_out_idx = 0;
}
if (state->audio_out_idx2 >= 800000)
{
state->audio_out_float_buf_p = state->audio_out_float_buf + 100;
state->audio_out_buf_p = state->audio_out_buf + 100;
memset (state->audio_out_float_buf, 0, 100 * sizeof (float));
memset (state->audio_out_buf, 0, 100 * sizeof (short));
state->audio_out_idx2 = 0;
}
}
//end test raw audio
void
playSynthesizedVoice (dsd_opts * opts, dsd_state * state)
@ -309,7 +386,7 @@ int getPADevice(char* dev, int input, PaStream** stream)
printf( "ERROR: Requested device %d is larger than number of devices.\n", devnum );
return(1);
}
const PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo( devnum );
/* print device name */
@ -500,7 +577,7 @@ openAudioInDevice (dsd_opts * opts)
exit(1);
#endif
}
else if(strncmp(opts->audio_in_dev, "rtl:", 3) == 0)
else if(strncmp(opts->audio_in_dev, "rtl", 3) == 0)
{
opts->audio_in_type = 3;
}
@ -533,9 +610,9 @@ openAudioInDevice (dsd_opts * opts)
#ifdef SOLARIS
sample_info_t aset, aget;
int rgain;
rgain = 64;
if (opts->split == 1)
{
opts->audio_in_fd = open (opts->audio_in_dev, O_RDONLY);
@ -549,10 +626,10 @@ openAudioInDevice (dsd_opts * opts)
printf ("Error, couldn't open %s\n", opts->audio_in_dev);
exit(1);
}
// get current
ioctl (opts->audio_in_fd, AUDIO_GETINFO, &aset);
aset.record.sample_rate = SAMPLE_RATE_IN;
aset.play.sample_rate = SAMPLE_RATE_IN;
aset.record.channels = 1;
@ -563,7 +640,7 @@ openAudioInDevice (dsd_opts * opts)
aset.play.encoding = AUDIO_ENCODING_LINEAR;
aset.record.port = AUDIO_LINE_IN;
aset.record.gain = rgain;
if (ioctl (opts->audio_in_fd, AUDIO_SETINFO, &aset) == -1)
{
printf ("Error setting sample device parameters\n");
@ -573,7 +650,7 @@ openAudioInDevice (dsd_opts * opts)
#if defined(BSD) && !defined(__APPLE__)
int fmt;
if (opts->split == 1)
{
opts->audio_in_fd = open (opts->audio_in_dev, O_RDONLY);
@ -582,13 +659,13 @@ openAudioInDevice (dsd_opts * opts)
{
opts->audio_in_fd = open (opts->audio_in_dev, O_RDWR);
}
if (opts->audio_in_fd == -1)
{
printf ("Error, couldn't open %s\n", opts->audio_in_dev);
opts->audio_out = 0;
}
fmt = 0;
if (ioctl (opts->audio_in_fd, SNDCTL_DSP_RESET) < 0)
{

View File

@ -211,7 +211,8 @@ closeMbeOutFile (dsd_opts * opts, dsd_state * state)
fclose (opts->mbe_out_f);
opts->mbe_out_f = NULL;
strftime (datestr, 31, "%Y-%m-%d-%H%M%S", &timep);
sprintf (newfilename, "nac%X-%s-tg%i%s", state->nac, datestr, talkgroup, ext);
//sprintf (newfilename, "nac%X-%s-tg%i%s", state->nac, datestr, talkgroup, ext);
sprintf (newfilename, "%s%s", datestr, ext); //this one
sprintf (new_path, "%s%s", opts->mbe_out_dir, newfilename);
#ifdef _WIN32
sprintf (shell, "move %s %s", opts->mbe_out_path, new_path);

View File

@ -31,7 +31,7 @@ printFrameInfo (dsd_opts * opts, dsd_state * state)
level = (int) state->max / 164;
if (opts->verbose > 0)
{
printf ("inlvl: %2i%% ", level);
//printf ("inlvl: %2i%% ", level);
}
if (state->nac != 0)
{
@ -89,7 +89,7 @@ processFrame (dsd_opts * opts, dsd_state * state)
if (opts->verbose > 0)
{
level = (int) state->max / 164;
printf ("inlvl: %2i%% ", level);
//printf ("inlvl: %2i%% ", level);
}
}
state->nac = 0;
@ -112,7 +112,7 @@ processFrame (dsd_opts * opts, dsd_state * state)
if (opts->verbose > 0)
{
level = (int) state->max / 164;
printf ("inlvl: %2i%% ", level);
//printf ("inlvl: %2i%% ", level);
}
}
state->nac = 0;
@ -134,7 +134,7 @@ processFrame (dsd_opts * opts, dsd_state * state)
if (opts->verbose > 0)
{
level = (int) state->max / 164;
printf ("inlvl: %2i%% ", level);
//printf ("inlvl: %2i%% ", level);
}
}
state->nac = 0;
@ -156,7 +156,7 @@ processFrame (dsd_opts * opts, dsd_state * state)
if (opts->verbose > 0)
{
level = (int) state->max / 164;
printf ("inlvl: %2i%% ", level);
//printf ("inlvl: %2i%% ", level);
}
}
state->nac = 0;
@ -179,7 +179,7 @@ processFrame (dsd_opts * opts, dsd_state * state)
if (opts->verbose > 0)
{
level = (int) state->max / 164;
printf ("inlvl: %2i%% ", level);
//printf ("inlvl: %2i%% ", level);
}
}
if ((state->synctype == 11) || (state->synctype == 12))
@ -233,7 +233,7 @@ processFrame (dsd_opts * opts, dsd_state * state)
if (opts->verbose > 0)
{
level = (int) state->max / 164;
printf ("inlvl: %2i%% ", level);
//printf ("inlvl: %2i%% ", level);
}
}
if ((opts->mbe_out_dir[0] != 0) && (opts->mbe_out_f == NULL))

View File

@ -16,27 +16,81 @@
*/
#include "dsd.h"
#include <locale.h>
#include <ncurses.h>
char * FM_banner2[9] = {
" Digital Speech Decoder: Florida Man Edition - mbelib version 1.3.0 ",
" ███████╗██████╗ █████╗ █████╗ ██████╗ ███████╗███╗ ███╗ ██████╗ ",
" ██╔════╝██╔══██╗██╔══██╗██╔══██╗██╔════╝ ██╔════╝████╗ ████║ ██╔══██╗",
" █████╗ ██║ ██║███████║██║ ╚═╝╚█████╗ ███ █████╗ ██╔████╔██║█████████║",
" ██╔══╝ ██║ ██║██╔══██║██║ ██╗ ╚═══██╗ ██╔══╝ ██║╚██╔╝██║ ██║ ██║",
" ███████╗██████╔╝██║ ██║╚█████╔╝██████╔╝ ██║ ██║ ╚═╝ ██║ ██████╔╝",
" ╚══════╝╚═════╝ ╚═╝ ╚═╝ ╚════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ",
};
time_t now;
char * getTime(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;
}
char * getDate(void) {
char datename[32];
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;
}
void
printFrameSync (dsd_opts * opts, dsd_state * state, char *frametype, int offset, char *modulation)
{
//char datestr[32];
//struct tm timep;
erase();
attron(COLOR_PAIR(4));
for (short int i = 0; i < 7; i++) {
printw("%s \n", FM_banner2[i]);}
attroff(COLOR_PAIR(4));
if (opts->verbose > 0)
{
printf ("Sync: %s ", frametype);
//strftime (datestr, 31, "%Y-%m-%d-%H%M%S", &timep);
//printf ("Sync: %s ", frametype);
//printf ("%s %s Sync: %s ", getDate(), getTime(), frametype);
printf ("%s Sync: %s ", getTime(), frametype);
printw("%s Sync: %s ", getTime(), frametype);
}
if (opts->verbose > 2)
{
printf ("o: %4i ", offset);
printw("o: %4i ", offset);
}
if (opts->verbose > 1)
{
printf ("mod: %s ", modulation);
printw("mod: %s ", modulation);
}
if (opts->verbose > 2)
{
printf ("g: %f ", state->aout_gain);
printw("g: %f ", state->aout_gain);
}
refresh();
}
int
@ -100,6 +154,7 @@ getFrameSync (dsd_opts * opts, dsd_state * state)
if ((opts->symboltiming == 1) && (state->carrier == 1))
{
printf ("\nSymbol Timing:\n");
//printw("\nSymbol Timing:\n");
}
while (sync == 0)
{
@ -489,8 +544,10 @@ getFrameSync (dsd_opts * opts, dsd_state * state)
state->min = ((state->min) + lmin) / 2;
sprintf (state->ftype, " ProVoice ");
if (opts->errorbars == 1)
//if (opts->errorbars == 1 && (time(NULL) - now) > 2 )
{
printFrameSync (opts, state, " -ProVoice ", synctest_pos + 1, modulation);
now = time(NULL);
}
state->lastsynctype = 14;
return (14);
@ -503,8 +560,10 @@ getFrameSync (dsd_opts * opts, dsd_state * state)
state->min = ((state->min) + lmin) / 2;
sprintf (state->ftype, " ProVoice ");
if (opts->errorbars == 1)
//if (opts->errorbars == 1 && (time(NULL) - now) > 2 )
{
printFrameSync (opts, state, " -ProVoice ", synctest_pos + 1, modulation);
now = time(NULL);
}
state->lastsynctype = 15;
return (15);
@ -819,6 +878,14 @@ getFrameSync (dsd_opts * opts, dsd_state * state)
if ((opts->errorbars == 1) && (opts->verbose > 1) && (state->carrier == 1))
{
printf ("Sync: no sync\n");
printf("Press CTRL + C to close.\n"); //Kindly remind user to double tap CTRL + C
erase();
attron(COLOR_PAIR(4));
for (short int i = 0; i < 7; i++) {
printw("%s \n", FM_banner2[i]); }
attroff(COLOR_PAIR(4));
printw("Sync: no sync\n");
refresh();
}
noCarrier (opts, state);
return (-1);

View File

@ -28,6 +28,17 @@
#include "p25p1_heuristics.h"
#include "pa_devs.h"
#include <locale.h>
#include <ncurses.h>
char * FM_banner[9] = {
" CTRL + C twice to exit",
"██████╗ ██████╗██████╗  ███████╗███╗ ███╗███████╗",
"██╔══██╗██╔════╝██╔══██╗   ██╔════╝████╗ ████║██╔════╝",
"██║ ██║╚█████╗ ██║ ██║   █████╗ ██╔████╔██║█████╗ ",
"██║ ██║ ╚═══██╗██║ ██║   ██╔══╝ ██║╚██╔╝██║██╔══╝ ",
"██████╔╝██████╔╝██████╔╝   ██║ ██║ ╚═╝ ██║███████╗",
"╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝",
};
int
comp (const void *a, const void *b)
@ -79,6 +90,11 @@ noCarrier (dsd_opts * opts, dsd_state * state)
sprintf (state->algid, "________");
sprintf (state->keyid, "________________");
mbe_initMbeParms (state->cur_mp, state->prev_mp, state->prev_mp_enhanced);
//test below
//uint16_t sample;
//get_rtlsdr_sample(&sample);
//Pa_StartStream(sample);
//end test
}
void
@ -141,6 +157,8 @@ initOpts (dsd_opts * opts)
opts->delay = 0;
opts->use_cosine_filter = 1;
opts->unmute_encrypted_p25 = 0;
opts->rtl_dev_index = 0; //actual device index since rtl:0 or rtl:1 doesn't do jack shit asshole!
opts->rtl_gain_value = 0; //set actual gain and not this automatic gain bullshit
}
void
@ -266,16 +284,20 @@ usage ()
printf (" -z <num> Frame rate for datascope\n");
printf ("\n");
printf ("Input/Output options:\n");
printf (" -i <device> Audio input device (default is /dev/audio, - for piped stdin)\n");
printf (" -i <device> Audio input device (default is /dev/audio, - for piped stdin, rtl for rtl device)\n");
printf (" -o <device> Audio output device (default is /dev/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");
printf (" -r <files> Read/Play saved mbe data from file(s)\n");
printf (" -g <num> Audio output gain (default = 0 = auto, disable = -1)\n");
printf (" -n Do not send synthesized speech to audio output device\n");
printf (" -w <file> Output synthesized speech to a .wav file\n");
printf (" -w <file> Output synthesized speech to a .wav file\n");
printf (" -a Display port audio devices\n");
printf (" -c <hertz> RTL-SDR center frequency\n");
printf ("\n");
printf ("RTL-SDR options:\n");
printf (" -c <hertz> RTL-SDR tune to frequency\n");
printf (" -P <num> RTL-SDR ppm error (default = 0)\n");
printf (" -D <num> RTL-SDR Device Index Number\n");
printf (" -G <num> RTL-SDR Device Gain (0-49) (default = 0 Auto Gain)\n");
printf ("\n");
printf ("Scanner control options:\n");
printf (" -B <num> Serial port baud rate (default=115200)\n");
@ -286,7 +308,7 @@ 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 (" -fi Decode only NXDN48* (6.25 kHz) / IDAS*\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 (" -fr Decode only DMR/MOTOTRBO\n");
@ -323,9 +345,9 @@ liveScanner (dsd_opts * opts, dsd_state * state)
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 ) );
//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;
}
}
@ -385,9 +407,9 @@ cleanupAndExit (dsd_opts * opts, dsd_state * state)
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 ) );
//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)
@ -397,24 +419,24 @@ cleanupAndExit (dsd_opts * opts, dsd_state * state)
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 ) );
//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 ) );
//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 ) );
//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
@ -468,6 +490,32 @@ sigfun (int sig)
#endif
}
//LEH version of sigfun
/*
void sigfun (int sig)
{
UNUSED_VARIABLE(sig); //what is this and where is it defined?
exitflag = 1;
signal (SIGINT, SIG_DFL);
}
//another LEH thing to free allocated memory
void freeAllocatedMemory(dsd_opts * opts, dsd_state * state)
{
UNUSED_VARIABLE(opts);
// Free allocated memory //
free(state->prev_mp_enhanced);
free(state->prev_mp);
free(state->cur_mp);
free(state->audio_out_float_buf);
free(state->audio_out_buf);
free(state->dibit_buf);
}
*/
//end LEH version of sigfun
double atofs(char *s)
{
char last;
@ -505,7 +553,12 @@ main (int argc, char **argv)
char versionstr[25];
mbe_printVersion (versionstr);
printf ("Digital Speech Decoder 1.7.0-dev (build:%s)\n", GIT_TAG);
for (short int i = 0; i < 7; i++) {
printf("%s \n", FM_banner[i]);
}
//printf ("Digital Speech Decoder 1.7.0-dev (build:%s)\n", GIT_TAG);
printf ("Digital Speech Decoder: Florida Man Edition\n");
printf ("mbelib version %s\n", versionstr);
initOpts (&opts);
@ -514,7 +567,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:rl")) != -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:rl")) != -1)
{
opterr = 0;
switch (c)
@ -575,6 +628,18 @@ main (int argc, char **argv)
case 'v':
sscanf (optarg, "%d", &opts.verbose);
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
//opts->audio_in_type = 3; //set to use RTL this way and maybe ditch the other shitty way
break;
case 'D': //Set rtl device index number
sscanf (optarg, "%d", &opts.rtl_dev_index);
//opts->audio_in_type = 3; //set to use RTL this way and maybe ditch the other shitty way
break;
case 'z':
sscanf (optarg, "%d", &opts.scoperate);
opts.errorbars = 0;
@ -589,6 +654,7 @@ main (int argc, char **argv)
case 'i':
strncpy(opts.audio_in_dev, optarg, 1023);
opts.audio_in_dev[1023] = '\0';
//printf("audio_in_dev = %s\n", opts.audio_in_dev);
break;
case 'o':
strncpy(opts.audio_out_dev, optarg, 1023);
@ -601,7 +667,7 @@ main (int argc, char **argv)
break;
case 'c':
opts.rtlsdr_center_freq = (uint32_t)atofs(optarg);
printf("Using center freq: %i\n", opts.rtlsdr_center_freq);
printf("Tuning to frequency: %i\n", opts.rtlsdr_center_freq);
break;
case 'g':
sscanf (optarg, "%f", &opts.audio_gain);
@ -866,9 +932,9 @@ main (int argc, char **argv)
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 ) );
//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);
}
}
@ -902,7 +968,25 @@ main (int argc, char **argv)
openAudioOutDevice (&opts, SAMPLE_RATE_OUT);
}
openAudioInDevice (&opts);
setlocale(LC_ALL, "");
//sleep(3);
//initscr(); //Initialize NCURSES screen window
start_color();
init_pair(1, COLOR_YELLOW, COLOR_BLACK); //Yellow/Amber for frame sync/control channel, NV style
init_pair(2, COLOR_RED, COLOR_BLACK); //Red for Terminated Calls
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
noecho();
cbreak();
erase();
for (short int i = 0; i < 7; i++) {
printw("%s \n", FM_banner[i]); }
attroff(COLOR_PAIR(4));
refresh();
printf("Press CTRL + C twice to close.\n"); //Kindly remind user to double tap CTRL + C
}
else
{
opts.split = 0;
@ -916,10 +1000,12 @@ main (int argc, char **argv)
{
playMbeFiles (&opts, &state, argc, argv);
}
else
{
liveScanner (&opts, &state);
}
cleanupAndExit (&opts, &state);
endwin();
return (0);
}

View File

@ -135,6 +135,7 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a
if (opts->errorbars == 1)
{
printf ("%s", state->err_str);
//printw("%s", state->err_str);
}
state->debug_audio_errors += state->errs2;

View File

@ -5,25 +5,28 @@ void
processProVoice (dsd_opts * opts, dsd_state * state)
{
int i, j, dibit;
//char datestr[32];
char imbe7100_fr1[7][24];
char imbe7100_fr2[7][24];
const int *w, *x;
//struct tm timep;
if (opts->errorbars == 1)
{
printf ("VOICE e:");
//strftime (datestr, 31, "%Y-%m-%d-%H%M%S", &timep);
//printf ("%s VOICE e:", datestr);
//printf ("VOICE e:");
}
for (i = 0; i < 64; i++)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
}
#ifdef PROVOICE_DUMP
printf (" ");
//printf (" ");
#endif
// lid
@ -31,22 +34,22 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
}
#ifdef PROVOICE_DUMP
printf (" ");
//printf (" ");
#endif
for (i = 0; i < 64; i++)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
}
#ifdef PROVOICE_DUMP
printf (" ");
//printf (" ");
#endif
// imbe frames 1,2 first half
@ -59,14 +62,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 6;
x -= 6;
@ -74,14 +77,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
}
@ -89,14 +92,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 6;
x -= 6;
@ -104,25 +107,25 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf (" ");
//printf (" ");
#endif
// spacer bits
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
printf (" ");
//printf ("%i", dibit);
//printf (" ");
#endif
// imbe frames 1,2 second half
@ -131,14 +134,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
for (i = 0; i < 3; i++)
@ -147,14 +150,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 6;
x -= 6;
@ -162,14 +165,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
}
@ -177,14 +180,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 5;
x -= 5;
@ -192,14 +195,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
for (i = 0; i < 7; i++)
@ -208,14 +211,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 6;
x -= 6;
@ -223,14 +226,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
}
@ -238,14 +241,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 5;
x -= 5;
@ -253,14 +256,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf (" ");
//printf (" ");
#endif
processMbeFrame (opts, state, NULL, NULL, imbe7100_fr1);
@ -269,23 +272,23 @@ processProVoice (dsd_opts * opts, dsd_state * state)
// spacer bits
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
printf (" ");
//printf ("%i", dibit);
//printf (" ");
#endif
for (i = 0; i < 16; i++)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
}
#ifdef PROVOICE_DUMP
printf (" ");
//printf (" ");
#endif
// imbe frames 3,4 first half
@ -297,14 +300,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 6;
x -= 6;
@ -312,28 +315,28 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
}
for (j = 0; j < 6; j++)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 6;
x -= 6;
@ -341,25 +344,25 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf (" ");
//printf (" ");
#endif
// spacer bits
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
printf ("_");
//printf ("%i", dibit);
//printf ("_");
#endif
// imbe frames 3,4 second half
@ -367,14 +370,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
for (i = 0; i < 3; i++)
{
@ -382,14 +385,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 6;
x -= 6;
@ -397,14 +400,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
}
@ -412,14 +415,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 5;
x -= 5;
@ -427,14 +430,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf (" ");
//printf (" ");
#endif
for (i = 0; i < 7; i++)
@ -443,14 +446,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 6;
x -= 6;
@ -458,14 +461,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
}
@ -473,14 +476,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr1[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf ("_");
//printf ("_");
#endif
w -= 5;
x -= 5;
@ -488,14 +491,14 @@ processProVoice (dsd_opts * opts, dsd_state * state)
{
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
imbe7100_fr2[*w][*x] = dibit;
w++;
x++;
}
#ifdef PROVOICE_DUMP
printf (" ");
//printf (" ");
#endif
processMbeFrame (opts, state, NULL, NULL, imbe7100_fr1);
@ -504,12 +507,12 @@ processProVoice (dsd_opts * opts, dsd_state * state)
// spacer bits
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
//printf ("%i", dibit);
#endif
dibit = getDibit (opts, state);
#ifdef PROVOICE_DUMP
printf ("%i", dibit);
printf (" ");
//printf ("%i", dibit);
//printf (" ");
#endif
if (opts->errorbars == 1)

View File

@ -31,9 +31,9 @@
#include <rtl-sdr.h>
#include "dsd.h"
#define DEFAULT_SAMPLE_RATE 48000
#define DEFAULT_SAMPLE_RATE 48000 //48000
#define DEFAULT_BUF_LENGTH (1 * 16384)
#define MAXIMUM_OVERSAMPLE 16
#define MAXIMUM_OVERSAMPLE 16 //16
#define MAXIMUM_BUF_LENGTH (MAXIMUM_OVERSAMPLE * DEFAULT_BUF_LENGTH)
#define AUTO_GAIN -100
#define BUFFER_DUMP 4096
@ -46,7 +46,11 @@ static int ACTUAL_BUF_LENGTH;
static int *atan_lut = NULL;
static int atan_lut_size = 131072; /* 512 KB */
static int atan_lut_coef = 8;
//new for UDP
#include <netinet/in.h>
#include <arpa/inet.h>
static pthread_t socket_freq;
//
struct dongle_state
{
int exit_flag;
@ -585,6 +589,7 @@ static void *demod_thread_fn(void *arg)
int nearest_gain(rtlsdr_dev_t *dev, int target_gain)
{
//target_gain = 36;
int i, r, err1, err2, count, nearest;
int* gains;
r = rtlsdr_set_tuner_gain_mode(dev, 1);
@ -617,7 +622,8 @@ int verbose_set_frequency(rtlsdr_dev_t *dev, uint32_t frequency)
if (r < 0) {
fprintf(stderr, "WARNING: Failed to set center freq.\n");
} else {
fprintf(stderr, "Tuned to %u Hz.\n", frequency);
//fprintf(stderr, "Tuned to %u Hz.\n", frequency);
fprintf(stderr, "Tuned to center frequency %u Hz.\n", frequency);
}
return r;
}
@ -665,6 +671,7 @@ int verbose_offset_tuning(rtlsdr_dev_t *dev)
int verbose_auto_gain(rtlsdr_dev_t *dev)
{
int r;
r = rtlsdr_set_tuner_gain_mode(dev, 0);
if (r != 0) {
@ -677,6 +684,7 @@ int verbose_auto_gain(rtlsdr_dev_t *dev)
int verbose_gain_set(rtlsdr_dev_t *dev, int gain)
{
//gain = 36;
int r;
r = rtlsdr_set_tuner_gain_mode(dev, 1);
if (r < 0) {
@ -694,6 +702,7 @@ int verbose_gain_set(rtlsdr_dev_t *dev, int gain)
int verbose_ppm_set(rtlsdr_dev_t *dev, int ppm_error)
{
//ppm_error = -2; //fix this opt arg to accept negative float values, i.e. float or double??
int r;
if (ppm_error == 0) {
return 0;}
@ -715,10 +724,12 @@ int verbose_reset_buffer(rtlsdr_dev_t *dev)
return r;
}
static void optimal_settings(int freq, int rate)
//static void optimal_settings(struct fm_state *fm, int freq, int hopping)
static void optimal_settings(int freq, int rate) //why did you fuck with optimal settings?
{
// giant ball of hacks
// seems unable to do a single pass, 2:1
//int r, capture_freq, capture_rate;
int capture_freq, capture_rate;
struct dongle_state *d = &dongle;
struct demod_state *dm = &demod;
@ -771,6 +782,7 @@ static void *controller_thread_fn(void *arg)
/* Set the sample rate */
verbose_set_sample_rate(dongle.dev, dongle.rate);
fprintf(stderr, "Output at %u Hz.\n", demod.rate_in/demod.post_downsample);
fprintf(stderr, "Press CTRL + C to close.\n"); //Kindly remind user to double tap CTRL + C
while (!exitflag) {
safe_cond_wait(&s->hop, &s->hop_m);
@ -791,8 +803,9 @@ void dongle_init(struct dongle_state *s)
s->gain = AUTO_GAIN; // tenths of a dB
s->mute = 0;
s->direct_sampling = 0;
s->offset_tuning = 0;
s->offset_tuning = 0; //0 by default, but don't think it listens to proper frequency when 0, offset and tuned seem to be mixed up
s->demod_target = &demod;
//s->dev_index = 1; //need to set dev_index from dsd_main as well...
}
void demod_init(struct demod_state *s)
@ -879,11 +892,148 @@ void sanity_checks(void)
}
}
//UDP remote all below HERE
static unsigned int chars_to_int(unsigned char* buf) {
int i;
unsigned int val = 0;
for(i=1; i<5; i++) {
val = val | ((buf[i]) << ((i-1)*8));
}
return val;
}
static void *socket_thread_fn(void *arg) {
//struct fm_state *fm = arg;
struct demod_state *d = static_cast<demod_state*>(arg);
int port = 6020;
int r, n;
int sockfd, newsockfd, portno;
socklen_t clilen;
unsigned char buffer[5];
struct sockaddr_in serv_addr, cli_addr;
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockfd < 0) {
perror("ERROR opening socket");
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("ERROR on binding");
}
bzero(buffer,5);
fprintf (stderr, "Main socket started! :-) Tuning enabled on UDP/%d \n", port);
int new_freq, demod_type, new_squelch, new_gain, agc_mode;
while((n = read(sockfd,buffer,5)) != 0) {
if(buffer[0] == 0) {
new_freq = chars_to_int(buffer);
dongle.freq = new_freq; //not sure if still needed, or ever was needed lul
optimal_settings(new_freq, demod.rate_in);
rtlsdr_set_center_freq(dongle.dev, dongle.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);
}
/*
if(buffer[0] == 1) {
// change demod type
int type = chars_to_int(buffer);
switch(type) {
case 0:
fprintf (stderr, "Changing demod type to FM\n");
fm->mode_demod = &fm_demod;
break;
case 1:
fprintf (stderr, "Changing demod type to AM\n");
fm->mode_demod = &am_demod;
break;
case 2:
fprintf (stderr, "Changing demod type to USB\n");
fm->mode_demod = &usb_demod;
fm->custom_atan = 1;
break;
case 3:
fprintf (stderr, "Changing demod type to LSB\n");
fm->mode_demod = &lsb_demod;
break;
default:
fprintf (stderr, "Unknown demod type %d\n", type);
break;
}
}
*/
//SQUELCH HERE
if (buffer[0] == 2) {
new_squelch = chars_to_int(buffer);
demod.squelch_level = new_squelch; //demod, or d*? or d->
//full_demod(d);
//new_freq = 850000000;
//dongle.freq = new_freq;
//optimal_settings(new_freq, demod.rate_in); //hacky way to 'squelch', just setting it to a dead freq instead
//rtlsdr_set_center_freq(dongle.dev, dongle.freq);
fprintf (stderr, "Changing squelch to %d \n", new_squelch);
}
/*
if (buffer[0] == 3) {
new_gain = chars_to_int(buffer);
if (new_gain == AUTO_GAIN) {
r = rtlsdr_set_tuner_gain_mode(dev, 0);
} else {
r = rtlsdr_set_tuner_gain_mode(dev, 1);
new_gain = nearest_gain(new_gain);
r = rtlsdr_set_tuner_gain(dev, new_gain);
}
if (r != 0) {
fprintf(stderr, "WARNING: Failed to set tuner gain.\n");
} else if (new_gain == AUTO_GAIN) {
fprintf(stderr, "Tuner gain set to automatic.\n");
} else {
fprintf(stderr, "Tuner gain set to %0.2f dB.\n", new_gain/10.0);
}
}
*/
/*
if (buffer[0] == 8) {
agc_mode = chars_to_int(buffer);
if (agc_mode == 0 || agc_mode == 1) {
fprintf(stderr, "Setting AGC to %d\n", agc_mode);
rtlsdr_set_agc_mode(dev, agc_mode);
} else {
fprintf(stderr, "Failed to set AGC to %d\n", agc_mode);
}
}
*/
}
close(sockfd);
return 0;
}
//UDP Control all above HERE
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
rtlsdr_cancel_async(dongle.dev);
//cleanup_rtlsdr_stream(); //thank the wraith for this one...if it works...didn't work
//_Exit(1);
}
void open_rtlsdr_stream(dsd_opts *opts)
@ -901,10 +1051,18 @@ void open_rtlsdr_stream(dsd_opts *opts)
controller.freq_len++;
}
if (opts->rtlsdr_ppm_error > 0) {
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;
}
if (opts->audio_in_type == 3) {
dongle.dev_index = opts->rtl_dev_index;
}
if (opts->rtl_gain_value > 0) {
dongle.gain = opts->rtl_gain_value * 10; //multiple by ten to make it consitent with the way rtl_fm really works
}
/* quadruple sample_rate to limit to Δθ to ±π/2 */
demod.rate_in *= demod.post_downsample;
@ -915,13 +1073,15 @@ void open_rtlsdr_stream(dsd_opts *opts)
if (controller.freq_len > 1) demod.terminate_on_squelch = 0;
ACTUAL_BUF_LENGTH = lcm_post[demod.post_downsample] * DEFAULT_BUF_LENGTH;
r = rtlsdr_open(&dongle.dev, (uint32_t)dongle.dev_index);
if (r < 0)
{
fprintf(stderr, "Failed to open rtlsdr device %d.\n", dongle.dev_index);
exit(1);
}
} else {
fprintf(stderr, "Using RTLSDR Device Index: %d. \n", dongle.dev_index); //Kindly tell us which device we are using
}
// sigact.sa_handler = sighandler;
// sigemptyset(&sigact.sa_mask);
@ -952,6 +1112,7 @@ void open_rtlsdr_stream(dsd_opts *opts)
usleep(100000);
pthread_create(&demod.thread, NULL, demod_thread_fn, (void*)(&demod));
pthread_create(&dongle.thread, NULL, dongle_thread_fn, (void*)(&dongle));
pthread_create(&socket_freq, NULL, socket_thread_fn, (void *)(&controller));
}
void cleanup_rtlsdr_stream()
@ -971,6 +1132,7 @@ void cleanup_rtlsdr_stream()
controller_cleanup(&controller);
rtlsdr_close(dongle.dev);
}
void get_rtlsdr_sample(int16_t *sample)

9
src/todolist Normal file
View File

@ -0,0 +1,9 @@
opts->rtl_dev_index = 1; //actual device index since rtl:0 or rtl:1 doesn't do jack shit asshole!
opts->rtl_gain_value = 360; //set actual gain and not this automatic gain bullshit
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:rl")) != -1)
G and D, well God Damn
check on/work on offset tuning 'issue'