Merge pull request #2 from hayguen/development

Development
master
Joseph Poirier 2016-04-16 12:10:49 -05:00
commit 9d5384aab9
6 changed files with 104 additions and 61 deletions

View File

@ -143,6 +143,13 @@ RTLSDR_API int rtlsdr_write_eeprom(rtlsdr_dev_t *dev, uint8_t *data,
RTLSDR_API int rtlsdr_read_eeprom(rtlsdr_dev_t *dev, uint8_t *data,
uint8_t offset, uint16_t len);
/*!
* Set the frequency the device is tuned to.
*
* \param dev the device handle given by rtlsdr_open()
* \param frequency in Hz
* \return 0 on error, frequency in Hz otherwise
*/
RTLSDR_API int rtlsdr_set_center_freq(rtlsdr_dev_t *dev, uint32_t freq);
/*!

View File

@ -169,7 +169,10 @@ int verbose_set_bandwidth(rtlsdr_dev_t *dev, uint32_t bandwidth)
if (r < 0) {
fprintf(stderr, "WARNING: Failed to set bandwidth.\n");
} else if (bandwidth > 0) {
fprintf(stderr, "Bandwidth set to %u Hz resulted in %u Hz.\n", bandwidth, applied_bw);
if (applied_bw)
fprintf(stderr, "Bandwidth parameter %u Hz resulted in %u Hz.\n", bandwidth, applied_bw);
else
fprintf(stderr, "Set bandwidth parameter %u Hz.\n", bandwidth);
} else {
fprintf(stderr, "Bandwidth set to automatic resulted in %u Hz.\n", applied_bw);
}
@ -198,6 +201,11 @@ int verbose_offset_tuning(rtlsdr_dev_t *dev)
int r;
r = rtlsdr_set_offset_tuning(dev, 1);
if (r != 0) {
if ( r == -2 )
fprintf(stderr, "WARNING: Failed to set offset tuning: tuner doesn't support offset tuning!\n");
else if ( r == -3 )
fprintf(stderr, "WARNING: Failed to set offset tuning: direct sampling not combinable with offset tuning!\n");
else
fprintf(stderr, "WARNING: Failed to set offset tuning.\n");
} else {
fprintf(stderr, "Offset tuning mode enabled.\n");

0
src/librtlsdr.c 100755 → 100644
View File

35
src/rtl_fm.c 100755 → 100644
View File

@ -197,7 +197,7 @@ void usage(void)
"\t-f frequency_to_tune_to [Hz]\n"
"\t use multiple -f for scanning (requires squelch)\n"
"\t ranges supported, -f 118M:137M:25k\n"
"\t[-v verbosity (default: 0)]\n"
"\t[-v increase verbosity (default: 0)]\n"
"\t[-M modulation (default: fm)]\n"
"\t fm or nbfm or nfm, wbfm or wfm, raw or iq, am, usb, lsb\n"
"\t wbfm == -M fm -s 170k -o 4 -A fast -r 32k -l 0 -E deemp\n"
@ -205,7 +205,7 @@ void usage(void)
"\t[-s sample_rate (default: 24k)]\n"
"\t[-d device_index (default: 0)]\n"
"\t[-g tuner_gain (default: automatic)]\n"
"\t[-w tuner_bandwidth (default: automatic)]\n"
"\t[-w tuner_bandwidth (default: automatic. enables offset tuning)]\n"
"\t[-l squelch_level (default: 0/off)]\n"
"\t[-L N prints levels every N calculations]\n"
"\t output are comma separated values (csv):\n"
@ -220,9 +220,11 @@ void usage(void)
"\t rdc: enable dc blocking filter on raw I/Q data at capture rate\n"
"\t adc: enable dc blocking filter on demodulated audio\n"
"\t dc: same as adc\n"
"\t rtlagc: enable rtl2832's digital agc (default: off)\n"
"\t agc: same as rtlagc\n"
"\t deemp: enable de-emphasis filter\n"
"\t direct: enable direct sampling\n"
"\t offset: enable offset tuning\n"
"\t direct: enable direct sampling (bypasses tuner, uses rtl2832 xtal)\n"
"\t offset: enable offset tuning (only e4000 tuner)\n"
"\t[-q dc_avg_factor for option rdc (default: 9)]\n"
"\tfilename ('-' means stdout)\n"
"\t omitting the filename also uses stdout\n\n"
@ -986,7 +988,7 @@ static void *controller_thread_fn(void *arg)
if (s->wb_mode) {
if (verbosity)
fprintf(stderr, "wbfm: adding 16000 Hz to every intput frequency\n");
fprintf(stderr, "wbfm: adding 16000 Hz to every input frequency\n");
for (i=0; i < s->freq_len; i++) {
s->freqs[i] += 16000;}
}
@ -1001,6 +1003,7 @@ static void *controller_thread_fn(void *arg)
/* Set the frequency */
if (verbosity) {
fprintf(stderr, "verbose_set_frequency(%.0f Hz)\n", (double)dongle.freq);
if (!dongle.offset_tuning)
fprintf(stderr, " frequency is away from parametrized one, to avoid negative impact from dc\n");
}
verbose_set_frequency(dongle.dev, dongle.freq);
@ -1158,12 +1161,13 @@ int main(int argc, char **argv)
int dev_given = 0;
int custom_ppm = 0;
int timeConstant = 75; /* default: U.S. 75 uS */
int rtlagc = 0;
dongle_init(&dongle);
demod_init(&demod);
output_init(&output);
controller_init(&controller);
while ((opt = getopt(argc, argv, "d:f:g:s:b:l:L:o:t:r:p:E:q:F:A:M:c:v:h:w:")) != -1) {
while ((opt = getopt(argc, argv, "d:f:g:s:b:l:L:o:t:r:p:E:q:F:A:M:c:h:w:v")) != -1) {
switch (opt) {
case 'd':
dongle.dev_index = verbose_device_search(optarg);
@ -1227,6 +1231,8 @@ int main(int argc, char **argv)
dongle.direct_sampling = 1;}
if (strcmp("offset", optarg) == 0) {
dongle.offset_tuning = 1;}
if (strcmp("rtlagc", optarg) == 0 || strcmp("agc", optarg) == 0) {
rtlagc = 1;}
break;
case 'q':
demod.rdc_block_const = atoi(optarg);
@ -1275,18 +1281,24 @@ int main(int argc, char **argv)
timeConstant = (int)atof(optarg);
break;
case 'v':
verbosity = (int)atof(optarg);
++verbosity;
break;
case 'w':
dongle.bandwidth = (uint32_t)atofs(optarg);
if (dongle.bandwidth)
dongle.offset_tuning = 1; /* automatically switch offset tuning, when using bandwidth filter */
break;
case 'h':
case '?':
default:
usage();
break;
}
}
if (verbosity)
fprintf(stderr, "verbosity set to %d\n", verbosity);
/* quadruple sample_rate to limit to Δθ to ±π/2 */
demod.rate_in *= demod.post_downsample;
@ -1346,9 +1358,9 @@ int main(int argc, char **argv)
verbose_gain_set(dongle.dev, dongle.gain);
}
verbose_ppm_set(dongle.dev, dongle.ppm_error);
rtlsdr_set_agc_mode(dongle.dev, rtlagc);
verbose_set_bandwidth(dongle.dev, dongle.bandwidth);
verbose_ppm_set(dongle.dev, dongle.ppm_error);
verbose_set_bandwidth(dongle.dev, dongle.bandwidth);
@ -1356,11 +1368,12 @@ int main(int argc, char **argv)
{
int r;
uint32_t in_bw, out_bw, last_bw = 0;
fprintf(stderr, "Supported bandwidth values in kHz:\n");
for ( in_bw = 1; in_bw < 3200; ++in_bw )
{
r = rtlsdr_set_and_get_tuner_bandwidth(dongle.dev, in_bw*1000, &out_bw, 0 /* =apply_bw */);
if ( r == 0 && ( out_bw != last_bw || in_bw == 1 ) )
fprintf(stderr, "device sets bandwidth %u Hz for bw para >= %u kHz\n", out_bw, in_bw );
if ( r == 0 && out_bw != 0 && ( out_bw != last_bw || in_bw == 1 ) )
fprintf(stderr, "%s%.1f", (in_bw==1 ? "" : ", "), out_bw/1000.0 );
last_bw = out_bw;
}
fprintf(stderr,"\n");

View File

@ -78,6 +78,8 @@ typedef struct { /* structure size must be multiple of 2 bytes */
static rtlsdr_dev_t *dev = NULL;
static int verbosity = 0;
static uint32_t bandwidth = 0;
static int global_numq = 0;
static struct llist *ll_buffers = 0;
static int llbuf_num = 500;
@ -94,9 +96,10 @@ void usage(void)
"\t[-s samplerate in Hz (default: 2048000 Hz)]\n"
"\t[-b number of buffers (default: 15, set by library)]\n"
"\t[-n max number of linked list buffers to keep (default: 500)]\n"
"\t[-w rtlsdr device bandwidth (for R820T device)\n"
"\t[-w rtlsdr device bandwidth [Hz] (for R820T device)]\n"
"\t[-d device index (default: 0)]\n"
"\t[-P ppm_error (default: 0)]\n");
"\t[-P ppm_error (default: 0)]\n"
"\t[-v increase verbosity (default: 0)]\n");
exit(1);
}
@ -203,7 +206,7 @@ static void *tcp_worker(void *arg)
pthread_mutex_lock(&ll_mutex);
gettimeofday(&tp, NULL);
ts.tv_sec = tp.tv_sec+5;
ts.tv_sec = tp.tv_sec+1;
ts.tv_nsec = tp.tv_usec * 1000;
r = pthread_cond_timedwait(&cond, &ll_mutex, &ts);
if(r == ETIMEDOUT) {
@ -257,6 +260,8 @@ static int set_gain_by_index(rtlsdr_dev_t *_dev, unsigned int index)
count = rtlsdr_get_tuner_gains(_dev, gains);
res = rtlsdr_set_tuner_gain(_dev, gains[index]);
if (verbosity)
fprintf(stderr, "set tuner gain to %.1f dB\n", gains[index] / 10.0);
free(gains);
}
@ -310,6 +315,7 @@ static void *command_worker(void *arg)
case SET_SAMPLE_RATE:
printf("set sample rate %d\n", ntohl(cmd.param));
rtlsdr_set_sample_rate(dev, ntohl(cmd.param));
/*verbose_set_bandwidth(dev, bandwidth);*/
break;
case SET_GAIN_MODE:
printf("set gain mode %d\n", ntohl(cmd.param));
@ -357,8 +363,9 @@ static void *command_worker(void *arg)
set_gain_by_index(dev, ntohl(cmd.param));
break;
case SET_TUNER_BANDWIDTH:
printf("set tuner bandwidth to %i Hz\n", ntohl(cmd.param));
rtlsdr_set_tuner_bandwidth(dev, ntohl(cmd.param));
bandwidth = ntohl(cmd.param);
printf("set tuner bandwidth to %i Hz\n", bandwidth);
verbose_set_bandwidth(dev, bandwidth);
break;
default:
break;
@ -372,7 +379,7 @@ int main(int argc, char **argv)
int r, opt, i;
char* addr = "127.0.0.1";
int port = 1234;
uint32_t frequency = 100000000, samp_rate = 2048000, bandwidth = 0;
uint32_t frequency = 100000000, samp_rate = 2048000;
struct sockaddr_in local, remote;
uint32_t buf_num = 0;
int dev_index = 0;
@ -389,6 +396,7 @@ int main(int argc, char **argv)
fd_set readfds;
u_long blockmode = 1;
dongle_info_t dongle_info;
int gains[100];
#ifdef _WIN32
WSADATA wsd;
i = WSAStartup(MAKEWORD(2,2), &wsd);
@ -396,7 +404,7 @@ int main(int argc, char **argv)
struct sigaction sigact, sigign;
#endif
while ((opt = getopt(argc, argv, "a:p:f:g:s:b:n:d:P:w:")) != -1) {
while ((opt = getopt(argc, argv, "a:p:f:g:s:b:n:d:P:w:v")) != -1) {
switch (opt) {
case 'd':
dev_index = verbose_device_search(optarg);
@ -429,6 +437,9 @@ int main(int argc, char **argv)
case 'w':
bandwidth = (uint32_t)atofs(optarg);
break;
case 'v':
++verbosity;
break;
default:
usage();
break;
@ -438,6 +449,9 @@ int main(int argc, char **argv)
if (argc < optind)
usage();
if (verbosity)
fprintf(stderr, "verbosity set to %d\n", verbosity);
if (!dev_given) {
dev_index = verbose_device_search("0");
}
@ -499,13 +513,7 @@ int main(int argc, char **argv)
fprintf(stderr, "Tuner gain set to %f dB.\n", gain/10.0);
}
r = rtlsdr_set_tuner_bandwidth(dev, bandwidth);
if (r < 0)
fprintf(stderr, "WARNING: Failed to set tuner bandwidth.\n");
else if (bandwidth != 0)
fprintf(stderr, "Tuner bandwidth set to %i.\n", bandwidth);
else
fprintf(stderr, "Tuner bandwidth set to automatic.\n");
verbose_set_bandwidth(dev, bandwidth);
/* Reset endpoint before we start reading from it (mandatory) */
r = rtlsdr_reset_buffer(dev);
@ -571,9 +579,16 @@ int main(int argc, char **argv)
if (r >= 0)
dongle_info.tuner_type = htonl(r);
r = rtlsdr_get_tuner_gains(dev, NULL);
r = rtlsdr_get_tuner_gains(dev, gains);
if (r >= 0)
dongle_info.tuner_gain_count = htonl(r);
if (verbosity)
{
fprintf(stderr, "Supported gain values (%d): ", r);
for (i = 0; i < r; i++)
fprintf(stderr, "%.1f ", gains[i] / 10.0);
fprintf(stderr, "\n");
}
r = send(s, (const char *)&dongle_info, sizeof(dongle_info), 0);
if (sizeof(dongle_info) != r)

0
src/tuner_r82xx.c 100755 → 100644
View File