-#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "discovered.h"
#include "lime_protocol.h"
#include "radio.h"
+#include "receiver.h"
#include "SoapySDR/Constants.h"
#include "SoapySDR/Device.h"
static double bandwidth=3000000.0;
-static int lime_sample_rate=
-static size_t receiver;
+static size_t lime_receiver;
static SoapySDRDevice *lime_device;
static SoapySDRStream *stream;
+static int lime_sample_rate;
static int display_width;
-static int buffer_size=BUFFER_SIZE;
+static int lime_buffer_size=BUFFER_SIZE;
static int outputsamples;
-static int fft_size=4096;
+static int lime_fft_size=4096;
static int dspRate=48000;
static int outputRate=48000;
static float *buffer;
static long long saved_frequency=0LL;
static int saved_antenna=-1;
-static double iqinputbuffer[BUFFER_SIZE*2];
+//static double iqinputbuffer[BUFFER_SIZE*2];
static double audiooutputbuffer[BUFFER_SIZE*2];
static int samples=0;
-static pthread_t receive_thread_id;
-static void *receive_thread(void* arg);
+static GThread *receive_thread_id;
+static gpointer receive_thread(gpointer data);
-static void *resampler;
static int actual_rate;
+#ifdef RESAMPLE
+static void *resampler;
static double resamples[1024*2];
static double resampled[1024*2];
+#endif
#ifdef TIMING
static int rate_samples;
static int running;
+void lime_protocol_change_sample_rate(int rate) {
+}
+
void lime_protocol_init(int rx,int pixels,int sample_rate) {
SoapySDRKwargs args;
int rc;
-fprintf(stderr,"lime_protocol_init: receiver=%d pixels=%d sample_rate=%d\n",rx,pixels,sample_rate);
+fprintf(stderr,"lime_protocol_init: lime_receiver=%d pixels=%d sample_rate=%d\n",rx,pixels,sample_rate);
- receiver=(size_t)rx;
+ lime_receiver=(size_t)rx;
display_width=pixels;
lime_sample_rate=sample_rate;
// initialize the radio
fprintf(stderr,"lime_protocol: receive_thread: SoapySDRDevice_make\n");
- lime_device=SoapySDRDevice_make(discovered->info.soapy.args);
+ lime_device=SoapySDRDevice_make(radio->info.soapy.args);
if(lime_device==NULL) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_make failed: %s\n",SoapySDRDevice_lastError());
_exit(-1);
lime_protocol_set_antenna(0);
fprintf(stderr,"lime_protocol: setting samplerate=%f\n",(double)sample_rate);
- rc=SoapySDRDevice_setSampleRate(lime_device,SOAPY_SDR_RX,receiver,(double)sample_rate);
+ rc=SoapySDRDevice_setSampleRate(lime_device,SOAPY_SDR_RX,lime_receiver,(double)sample_rate);
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setSampleRate(%f) failed: %s\n",(double)sample_rate,SoapySDRDevice_lastError());
}
- actual_rate=(int)SoapySDRDevice_getSampleRate(lime_device, SOAPY_SDR_RX, receiver);
+ actual_rate=(int)SoapySDRDevice_getSampleRate(lime_device, SOAPY_SDR_RX, lime_receiver);
fprintf(stderr,"lime_protocol: actual samplerate= %d\n",actual_rate);
+#ifdef RESAMPLE
if(sample_rate==768000 && actual_rate==767999) {
actual_rate=768000;
fprintf(stderr,"lime_protocol: forced actual_rate\n");
}
-
-void lime_protocol_change_sample_rate(int rate) {
-}
+#endif
fprintf(stderr,"lime_protocol: setting bandwidth =%f\n",bandwidth);
- rc=SoapySDRDevice_setBandwidth(lime_device,SOAPY_SDR_RX,receiver,bandwidth);
+ rc=SoapySDRDevice_setBandwidth(lime_device,SOAPY_SDR_RX,lime_receiver,bandwidth);
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setBandwidth(%f) failed: %s\n",bandwidth,SoapySDRDevice_lastError());
}
/*
fprintf(stderr,"lime_protocol: set baseband frequency\n");
- rc=SoapySDRDevice_setFrequencyComponent(lime_device,SOAPY_SDR_RX,receiver,"BB",0.0,&args);
+ rc=SoapySDRDevice_setFrequencyComponent(lime_device,SOAPY_SDR_RX,lime_receiver,"BB",0.0,&args);
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setFrequencyComponent(BB) failed: %s\n",SoapySDRDevice_lastError());
}
lime_protocol_set_antenna(2);
fprintf(stderr,"setting Gain LNA=30.0\n");
- rc=SoapySDRDevice_setGainElement(lime_device,SOAPY_SDR_RX,receiver,"LNA",30.0);
+ rc=SoapySDRDevice_setGainElement(lime_device,SOAPY_SDR_RX,lime_receiver,"LNA",30.0);
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setGain LNA failed: %s\n",SoapySDRDevice_lastError());
}
fprintf(stderr,"setting Gain PGA=19.0\n");
- rc=SoapySDRDevice_setGainElement(lime_device,SOAPY_SDR_RX,receiver,"PGA",19.0);
+ rc=SoapySDRDevice_setGainElement(lime_device,SOAPY_SDR_RX,lime_receiver,"PGA",19.0);
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setGain PGA failed: %s\n",SoapySDRDevice_lastError());
}
fprintf(stderr,"setting Gain TIA=12.0\n");
- rc=SoapySDRDevice_setGainElement(lime_device,SOAPY_SDR_RX,receiver,"TIA",12.0);
+ rc=SoapySDRDevice_setGainElement(lime_device,SOAPY_SDR_RX,lime_receiver,"TIA",12.0);
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setGain TIA failed: %s\n",SoapySDRDevice_lastError());
}
fprintf(stderr,"lime_protocol: receive_thread: SoapySDRDevice_setupStream\n");
- size_t channels=(size_t)receiver;
+ size_t channels=(size_t)lime_receiver;
rc=SoapySDRDevice_setupStream(lime_device,&stream,SOAPY_SDR_RX,"CF32",&channels,1,&args);
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setupStream failed: %s\n",SoapySDRDevice_lastError());
buffer=(float *)malloc(max_samples*sizeof(float)*2);
+#ifdef RESAMPLE
if(actual_rate!=sample_rate) {
fprintf(stderr,"lime_protocol: creating resampler from %d to %d\n",actual_rate,sample_rate);
resampler=create_resample (1, max_samples, resamples, resampled, actual_rate, sample_rate, 0.0, 0, 1.0);
}
+#endif
rc=SoapySDRDevice_activateStream(lime_device, stream, 0, 0LL, 0);
if(rc!=0) {
}
fprintf(stderr,"lime_protocol_init: audio_open_output\n");
- if(audio_open_output()!=0) {
- local_audio=false;
+ if(audio_open_output(receiver[0])!=0) {
+ receiver[0]->local_audio=false;
fprintf(stderr,"audio_open_output failed\n");
}
fprintf(stderr,"lime_protocol_init: create receive_thread\n");
- rc=pthread_create(&receive_thread_id,NULL,receive_thread,NULL);
- if(rc != 0) {
- fprintf(stderr,"lime_protocol: pthread_create failed on receive_thread: rc=%d\n", rc);
- _exit(-1);
+ receive_thread_id = g_thread_new( "lime protocol", receive_thread, NULL);
+ if( ! receive_thread_id )
+ {
+ fprintf(stderr,"g_thread_new failed for receive_thread\n");
+ exit( -1 );
}
-
-
-
+ fprintf(stderr, "receive_thread: id=%p\n",receive_thread_id);
}
static void *receive_thread(void *arg) {
while(running) {
elements=SoapySDRDevice_readStream(lime_device,stream,(void *)&buffer,max_samples,&flags,&timeNs,timeoutUs);
//fprintf(stderr,"read %d elements\n",elements);
- if(actual_rate!=sample_rate) {
+#ifdef RESAMPLE
+ if(actual_rate!=lime_sample_rate) {
for(i=0;i<elements;i++) {
resamples[i*2]=(double)buffer[i*2];
resamples[(i*2)+1]=(double)buffer[(i*2)+1];
outsamples=xresample(resampler);
for(i=0;i<outsamples;i++) {
- iqinputbuffer[samples*2]=(double)resampled[i*2];
- iqinputbuffer[(samples*2)+1]=(double)resampled[(i*2)+1];
- samples++;
-#ifdef TIMING
- rate_samples++;
- if(rate_samples==sample_rate) {
- gettimeofday(&tv, NULL); end_time=tv.tv_usec + 1000000 * tv.tv_sec;
- fprintf(stderr,"%d samples in %ld\n",rate_samples, end_time-start_time);
- start_time=end_time;
- rate_samples=0;
- }
-#endif
- if(samples==buffer_size) {
- int error;
- fexchange0(CHANNEL_RX0, iqinputbuffer, audiooutputbuffer, &error);
- if(error!=0) {
- fprintf(stderr,"fexchange0 (CHANNEL_RX0) returned error: %d\n", error);
- }
-
- if(local_audio) {
- audio_write(audiooutputbuffer,outputsamples);
- }
- Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer);
- samples=0;
- }
+ add_iq_samples(receiver[0],(double)resampled[i*2],(double)resampled[(i*2)+1]);
}
} else {
+#endif
for(i=0;i<elements;i++) {
- iqinputbuffer[samples*2]=(double)buffer[i*2];
- iqinputbuffer[(samples*2)+1]=(double)buffer[(i*2)+1];
- samples++;
- if(samples==buffer_size) {
- int error;
- fexchange0(CHANNEL_RX0, iqinputbuffer, audiooutputbuffer, &error);
- if(error!=0) {
- fprintf(stderr,"fexchange0 (CHANNEL_RX0) returned error: %d\n", error);
- }
-
- audio_write(audiooutputbuffer,outputsamples);
- Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer);
- samples=0;
- }
+ add_iq_samples(receiver[0],(double)buffer[i*2],(double)buffer[(i*2)+1]);
}
+#ifdef RESAMPLE
}
+#endif
}
fprintf(stderr,"lime_protocol: receive_thread: SoapySDRDevice_closeStream\n");
SoapySDRKwargs args;
args.size=0;
fprintf(stderr,"lime_protocol: setFrequency: %lld\n",f);
- //rc=SoapySDRDevice_setFrequencyComponent(lime_device,SOAPY_SDR_RX,receiver,"RF",(double)f,&args);
- rc=SoapySDRDevice_setFrequency(lime_device,SOAPY_SDR_RX,receiver,(double)f,&args);
+ rc=SoapySDRDevice_setFrequency(lime_device,SOAPY_SDR_RX,lime_receiver,(double)f,&args);
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setFrequency() failed: %s\n",SoapySDRDevice_lastError());
}
// char *antstr;
if(lime_device!=NULL) {
/*
- antstr=SoapySDRDevice_getAntenna(lime_device,SOAPY_SDR_RX,receiver);
+ antstr=SoapySDRDevice_getAntenna(lime_device,SOAPY_SDR_RX,lime_receiver);
fprintf(stderr,"lime_protocol: set_antenna: current antenna=%s\n",antstr);
*/
switch(ant) {
case 0:
fprintf(stderr,"lime_protocol: setAntenna: NONE\n");
- rc=SoapySDRDevice_setAntenna(lime_device,SOAPY_SDR_RX,receiver,"NONE");
+ rc=SoapySDRDevice_setAntenna(lime_device,SOAPY_SDR_RX,lime_receiver,"NONE");
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setAntenna NONE failed: %s\n",SoapySDRDevice_lastError());
}
break;
case 1:
fprintf(stderr,"lime_protocol: setAntenna: LNAH\n");
- rc=SoapySDRDevice_setAntenna(lime_device,SOAPY_SDR_RX,receiver,"LNAH");
+ rc=SoapySDRDevice_setAntenna(lime_device,SOAPY_SDR_RX,lime_receiver,"LNAH");
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setAntenna LNAH failed: %s\n",SoapySDRDevice_lastError());
}
break;
case 2:
fprintf(stderr,"lime_protocol: setAntenna: LNAL\n");
- rc=SoapySDRDevice_setAntenna(lime_device,SOAPY_SDR_RX,receiver,"LNAL");
+ rc=SoapySDRDevice_setAntenna(lime_device,SOAPY_SDR_RX,lime_receiver,"LNAL");
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setAntenna LNAL failed: %s\n",SoapySDRDevice_lastError());
}
break;
case 3:
fprintf(stderr,"lime_protocol: setAntenna: LNAW\n");
- rc=SoapySDRDevice_setAntenna(lime_device,SOAPY_SDR_RX,receiver,"LNAW");
+ rc=SoapySDRDevice_setAntenna(lime_device,SOAPY_SDR_RX,lime_receiver,"LNAW");
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setAntenna LNAW failed: %s\n",SoapySDRDevice_lastError());
}
break;
}
/*
- antstr=SoapySDRDevice_getAntenna(lime_device,SOAPY_SDR_RX,receiver);
+ antstr=SoapySDRDevice_getAntenna(lime_device,SOAPY_SDR_RX,lime_receiver);
fprintf(stderr,"lime_protocol: set_antenna: antenna=%s\n",antstr);
*/
} else {
void lime_protocol_set_attenuation(int attenuation) {
int rc;
fprintf(stderr,"setting Gain LNA=%f\n",30.0-(double)attenuation);
- rc=SoapySDRDevice_setGainElement(lime_device,SOAPY_SDR_RX,receiver,"LNA",30.0-(double)attenuation);
+ rc=SoapySDRDevice_setGainElement(lime_device,SOAPY_SDR_RX,lime_receiver,"LNA",30.0-(double)attenuation);
if(rc!=0) {
fprintf(stderr,"lime_protocol: SoapySDRDevice_setGain LNA failed: %s\n",SoapySDRDevice_lastError());
}