Lots of refactoring to move the SDR-type-specific bits out of the
main code and make them optionally buildable.
This commit is contained in:
parent
bfc4b742af
commit
75b221c0e3
9 changed files with 800 additions and 500 deletions
145
sdr.c
Normal file
145
sdr.c
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
#include "dump1090.h"
|
||||
#include "sdr.h"
|
||||
|
||||
#define ENABLE_RTLSDR
|
||||
|
||||
#include "sdr_ifile.h"
|
||||
#ifdef ENABLE_RTLSDR
|
||||
# include "sdr_rtlsdr.h"
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
sdr_type_t sdr_type;
|
||||
void (*initConfig)();
|
||||
void (*showHelp)();
|
||||
bool (*handleOption)(int, char**, int*);
|
||||
bool (*open)();
|
||||
void (*run)();
|
||||
void (*close)();
|
||||
} sdr_handler;
|
||||
|
||||
static void noInitConfig()
|
||||
{
|
||||
}
|
||||
|
||||
static void noShowHelp()
|
||||
{
|
||||
}
|
||||
|
||||
static bool noHandleOption(int argc, char **argv, int *jptr)
|
||||
{
|
||||
MODES_NOTUSED(argc);
|
||||
MODES_NOTUSED(argv);
|
||||
MODES_NOTUSED(jptr);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool noOpen()
|
||||
{
|
||||
fprintf(stderr, "Net-only mode, no SDR device or file open.\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static void noRun()
|
||||
{
|
||||
}
|
||||
|
||||
static void noClose()
|
||||
{
|
||||
}
|
||||
|
||||
static bool unsupportedOpen()
|
||||
{
|
||||
fprintf(stderr, "Support for this SDR type was not enabled in this build.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
static sdr_handler sdr_handlers[] = {
|
||||
#ifdef ENABLE_RTLSDR
|
||||
{ "rtlsdr", SDR_RTLSDR, rtlsdrInitConfig, rtlsdrShowHelp, rtlsdrHandleOption, rtlsdrOpen, rtlsdrRun, rtlsdrClose },
|
||||
#endif
|
||||
|
||||
{ "ifile", SDR_IFILE, ifileInitConfig, ifileShowHelp, ifileHandleOption, ifileOpen, ifileRun, ifileClose },
|
||||
{ "none", SDR_NONE, noInitConfig, noShowHelp, noHandleOption, noOpen, noRun, noClose },
|
||||
|
||||
{ NULL, SDR_NONE, NULL, NULL, NULL, NULL, NULL, NULL } /* must come last */
|
||||
};
|
||||
|
||||
void sdrInitConfig()
|
||||
{
|
||||
// Default SDR is the first type available in the handlers array.
|
||||
Modes.sdr_type = sdr_handlers[0].sdr_type;
|
||||
|
||||
for (int i = 0; sdr_handlers[i].name; ++i) {
|
||||
sdr_handlers[i].initConfig();
|
||||
}
|
||||
}
|
||||
|
||||
void sdrShowHelp()
|
||||
{
|
||||
printf("--device-type <type> Select SDR type (default: %s)\n", sdr_handlers[0].name);
|
||||
printf("\n");
|
||||
|
||||
for (int i = 0; sdr_handlers[i].name; ++i) {
|
||||
sdr_handlers[i].showHelp();
|
||||
}
|
||||
}
|
||||
|
||||
bool sdrHandleOption(int argc, char **argv, int *jptr)
|
||||
{
|
||||
int j = *jptr;
|
||||
if (!strcmp(argv[j], "--device-type") && (j+1) < argc) {
|
||||
++j;
|
||||
for (int i = 0; sdr_handlers[i].name; ++i) {
|
||||
if (!strcasecmp(sdr_handlers[i].name, argv[j])) {
|
||||
Modes.sdr_type = sdr_handlers[i].sdr_type;
|
||||
*jptr = j;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "SDR type '%s' not recognized; supported SDR types are:\n", argv[j]);
|
||||
for (int i = 0; sdr_handlers[i].name; ++i) {
|
||||
fprintf(stderr, " %s\n", sdr_handlers[i].name);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0; sdr_handlers[i].name; ++i) {
|
||||
if (sdr_handlers[i].handleOption(argc, argv, jptr))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static sdr_handler *current_handler()
|
||||
{
|
||||
static sdr_handler unsupported_handler = { "unsupported", SDR_NONE, noInitConfig, noShowHelp, noHandleOption, unsupportedOpen, noRun, noClose };
|
||||
|
||||
for (int i = 0; sdr_handlers[i].name; ++i) {
|
||||
if (Modes.sdr_type == sdr_handlers[i].sdr_type) {
|
||||
return &sdr_handlers[i];
|
||||
}
|
||||
}
|
||||
|
||||
return &unsupported_handler;
|
||||
}
|
||||
|
||||
bool sdrOpen()
|
||||
{
|
||||
return current_handler()->open();
|
||||
}
|
||||
|
||||
void sdrRun()
|
||||
{
|
||||
return current_handler()->run();
|
||||
}
|
||||
|
||||
void sdrClose()
|
||||
{
|
||||
current_handler()->close();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue