#LIMESDR_OBJS= \
#lime_discovery.o
-OPTIONS=-g -D $(UNAME_N) $(LIMESDR_OPTIONS) -O3
+
+#required for FREEDV (uncomment lines below)
+#FREEDV_OPTIONS=-D FREEDV
+#FREEDVLIBS=-lcodec2
+#FREEDV_SOURCES= \
+#freedv.c
+#FREEDV_HEADERS= \
+#freedv.h
+#FREEDV_OBJS= \
+#freedv.o
+
+OPTIONS=-g -D $(UNAME_N) $(LIMESDR_OPTIONS) $(FREEDV_OPTIONS) -O3
GTKINCLUDES=`pkg-config --cflags gtk+-3.0`
GTKLIBS=`pkg-config --libs gtk+-3.0`
ifeq ($(UNAME_N),odroid)
GPIOLIBS=-lwiringPi
endif
-LIBS=-lrt -lm -lwdsp -lpthread $(GTKLIBS) $(GPIOLIBS) $(SOAPYSDRLIBS)
+LIBS=-lcodec2 -lrt -lm -lwdsp -lpthread $(GTKLIBS) $(GPIOLIBS) $(SOAPYSDRLIBS) $(FREEDVLIBS)
INCLUDES=$(GTKINCLUDES)
COMPILE=$(CC) $(OPTIONS) $(INCLUDES)
waterfall.o \
wdsp_init.o
-all: prebuild $(PROGRAM) $(HEADERS) $(LIMESDR_HEADERS) $(SOURCES) $(LIMESDR_SOURCES)
+all: prebuild $(PROGRAM) $(HEADERS) $(LIMESDR_HEADERS) $(SOURCES) $(LIMESDR_SOURCES) $(FREEDV_SOURCES)
prebuild:
rm -f version.o
-$(PROGRAM): $(OBJS) $(LIMESDR_OBJS)
- $(LINK) -o $(PROGRAM) $(OBJS) $(LIMESDR_OBJS) $(LIBS)
+$(PROGRAM): $(OBJS) $(LIMESDR_OBJS) $(FREEDV_OBJS)
+ $(LINK) -o $(PROGRAM) $(OBJS) $(LIMESDR_OBJS) $(FREEDV_OBJS) $(LIBS)
.c.o:
$(COMPILE) -c -o $@ $<
install:
cp pihpsdr ../pihpsdr
cp pihpsdr ./release/pihpsdr
+ cd release; tar cvf pihpsdr.tar pihpsdr
#define band6 10
#ifdef LIMESDR
#define band70 11
-#define band144 12
#define band220 13
#define band430 14
#define band902 15
#define NEW_DEVICE_ORION2 5
#define NEW_DEVICE_HERMES_LITE 6
+#define LIMESDR_DEVICE 0
+
#define STATE_AVAILABLE 2
#define STATE_SENDING 3
#define ORIGINAL_PROTOCOL 0
#define NEW_PROTOCOL 1
-#define LIME_SDR 2
+#define LIMESDR_PROTOCOL 2
struct _DISCOVERED {
int protocol;
{-3300,3300,"Var2"}*/
};
-FILTER *filters[]={filterLSB,filterUSB,filterDSB,filterCWL,filterCWU,filterFMN,filterAM,filterDIGU,filterSPEC,filterDIGL,filterSAM,filterDRM};
+FILTER filterFREEDV[FILTERS]={
+ {150,5150,"5.0k"},
+ {150,4550,"4.4k"},
+ {150,3950,"3.8k"},
+ {150,3450,"3.3k"},
+ {150,3050,"2.9k"},
+ {150,2850,"2.7k"},
+ {150,2550,"2.4k"},
+ {150,2250,"2.1k"},
+ {150,1950,"1.8k"},
+ {150,1150,"1.0k"}/*,
+ {150,2850,"Var1"},
+ {150,2850,"Var2"}*/
+ };
+
+
+FILTER *filters[]={filterLSB,filterUSB,filterDSB,filterCWL,filterCWU,filterFMN,filterAM,filterDIGU,filterSPEC,filterDIGL,filterSAM,filterDRM,filterFREEDV};
FILTER *filters[MODES];
-/*
-int updateFilter(void * data);
-GtkWidget* buildFilterUI();
-void filterSaveState();
-void filterRestoreState();
-void setFilterValues(int mode);
-void setFilter(int filter);
-void setTxFilters();
-*/
#include "band.h"
#include "channel.h"
+#include "discovered.h"
#include "mode.h"
#include "filter.h"
#include "bandstack.h"
if(b<0) {
b=BANDS-1;
}
+#ifdef LIMESDR
+ if(protocol!=LIMESDR_PROTOCOL) {
+ if(b==band3400) {
+ b=band6;
+ }
+ }
+#endif
} else {
b++;
if(b>=BANDS) {
b=0;
}
+#ifdef LIMESDR
+ if(protocol!=LIMESDR_PROTOCOL) {
+ if(b==band70) {
+ b=bandGen;
+ }
+ }
+#endif
}
band=band_set_current(b);
entry=bandstack_entry_get_current();
*
*/
-char *mode_string[]={"LSB","USB","DSB","CWL","CWU","FMN","AM","DIGU","SPEC","DIGL","SAM","DRM"};
+char *mode_string[]={"LSB","USB","DSB","CWL","CWU","FMN","AM","DIGU","SPEC","DIGL","SAM","DRM","FREEDV"};
#define modeDIGL 9
#define modeSAM 10
#define modeDRM 11
+#define modeFREEDV 12
-#define MODES 12
+#define MODES 13
int mode;
char *mode_string[MODES];
-/*
-int updateMode(void * data);
-
-void setMode(int mode);
-void modeSaveState();
-void modeRestoreState();
-GtkWidget* buildModeUI();
-char* modeToString();
-*/
sleep(1);
}
-/*
-float sineWave(float* buf, int samples, float phase, float freq) {
- float phase_step = 2 * PI * freq / 192000.0F;
- int i;
- for (i = 0; i < samples; i++) {
- buf[i] = (float) sin(phase);
- phase += phase_step;
- }
- return phase;
-}
-*/
float sineWave(double* buf, int samples, float phase, float freq) {
float phase_step = 2 * PI * freq / 192000.0F;
int i;
#include "old_protocol.h"
#include "radio.h"
#include "toolbar.h"
+#include "freedv.h"
#define SYNC0 0
#define SYNC1 1
}
static float sineWave(double* buf, int samples, float phase, float freq) {
- float phase_step = 2 * PI * freq / 192000.0F;
+ float phase_step = 2 * PI * freq / 48000.0F;
int i;
for (i = 0; i < samples; i++) {
buf[i*2] = (double) sin(phase);
// add to buffer
if(isTransmitting()) {
- micinputbuffer[samples*2]=(double)mic_sample_float*mic_gain;
- micinputbuffer[(samples*2)+1]=(double)mic_sample_float*mic_gain;
- samples++;
+#ifdef FREEDV
+ if(mode==modeFREEDV) {
+ int modem_samples=mod_sample_freedv(mic_sample);
+ if(modem_samples!=0) {
+
+ }
+ } else {
+#endif
+ micinputbuffer[samples*2]=(double)mic_sample_float*mic_gain;
+ micinputbuffer[(samples*2)+1]=(double)mic_sample_float*mic_gain;
+ iqinputbuffer[samples*2]=0.0;
+ iqinputbuffer[(samples*2)+1]=0.0;
+ samples++;
+#ifdef FREEDV
+ }
+#endif
} else {
+ micinputbuffer[samples*2]=0.0;
+ micinputbuffer[(samples*2)+1]=0.0;
iqinputbuffer[samples*2]=(double)left_sample_float;
iqinputbuffer[(samples*2)+1]=(double)right_sample_float;
samples++;
fprintf(stderr,"fexchange2 (CHANNEL_RX0) returned error: %d\n", error);
}
Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer);
- for(j=0;j<output_buffer_size;j++) {
- left_rx_sample=(short)(audiooutputbuffer[j*2]*32767.0*volume);
- right_rx_sample=(short)(audiooutputbuffer[(j*2)+1]*32767.0*volume);
- left_tx_sample=0;
- right_tx_sample=0;
- output_buffer[output_buffer_index++]=left_rx_sample>>8;
- output_buffer[output_buffer_index++]=left_rx_sample;
- output_buffer[output_buffer_index++]=right_rx_sample>>8;
- output_buffer[output_buffer_index++]=right_rx_sample;
- output_buffer[output_buffer_index++]=left_tx_sample>>8;
- output_buffer[output_buffer_index++]=left_tx_sample;
- output_buffer[output_buffer_index++]=right_tx_sample>>8;
- output_buffer[output_buffer_index++]=right_tx_sample;
- if(output_buffer_index>=OZY_BUFFER_SIZE) {
- ozy_send_buffer();
- output_buffer_index=8;
+
+#ifdef FREEDV
+ if(mode==modeFREEDV) {
+ int demod_samples;
+ int increment=6; // 48000 to 8000
+ for(j=0;j<output_buffer_size;j+=increment) {
+ left_rx_sample=(short)(audiooutputbuffer[j*2]*32767.0*volume);
+ demod_samples=demod_sample_freedv(left_rx_sample);
+ if(demod_samples!=0) {
+ int s;
+ int t;
+ for(s=0;s<demod_samples;s++) {
+ for(t=0;t<6;t++) { // 8k to 48k
+ left_rx_sample=speech_out[s];
+ right_rx_sample=speech_out[s];
+ left_tx_sample=0;
+ right_tx_sample=0;
+ output_buffer[output_buffer_index++]=left_rx_sample>>8;
+ output_buffer[output_buffer_index++]=left_rx_sample;
+ output_buffer[output_buffer_index++]=right_rx_sample>>8;
+ output_buffer[output_buffer_index++]=right_rx_sample;
+ output_buffer[output_buffer_index++]=left_tx_sample>>8;
+ output_buffer[output_buffer_index++]=left_tx_sample;
+ output_buffer[output_buffer_index++]=right_tx_sample>>8;
+ output_buffer[output_buffer_index++]=right_tx_sample;
+ if(output_buffer_index>=OZY_BUFFER_SIZE) {
+ ozy_send_buffer();
+ output_buffer_index=8;
+ }
+ }
+ }
+ }
+ }
+ } else {
+#endif
+ for(j=0;j<output_buffer_size;j++) {
+ left_rx_sample=(short)(audiooutputbuffer[j*2]*32767.0*volume);
+ right_rx_sample=(short)(audiooutputbuffer[(j*2)+1]*32767.0*volume);
+ left_tx_sample=0;
+ right_tx_sample=0;
+ output_buffer[output_buffer_index++]=left_rx_sample>>8;
+ output_buffer[output_buffer_index++]=left_rx_sample;
+ output_buffer[output_buffer_index++]=right_rx_sample>>8;
+ output_buffer[output_buffer_index++]=right_rx_sample;
+ output_buffer[output_buffer_index++]=left_tx_sample>>8;
+ output_buffer[output_buffer_index++]=left_tx_sample;
+ output_buffer[output_buffer_index++]=right_tx_sample>>8;
+ output_buffer[output_buffer_index++]=right_tx_sample;
+ if(output_buffer_index>=OZY_BUFFER_SIZE) {
+ ozy_send_buffer();
+ output_buffer_index=8;
+ }
}
+#ifdef FREEDV
}
+#endif
}
samples=0;
}
if(mode!=modeCWU && mode!=modeCWL) {
// output_buffer[C1]|=0x00;
} else {
- if((tune==1) || (cw_keyer_internal==0)) {
+ if((tune==1) || (mox==1) || (cw_keyer_internal==0)) {
// output_buffer[C1]|=0x00;
} else {
output_buffer[C1]|=0x01;
output_buffer[C0]|=0x01;
}
} else {
- if(tune==1) {
- output_buffer[C0]|=0x01;
- } else {
+ if(tune==0) {
if(cw_keyer_internal==0) {
output_buffer[C0]|=0x01;
}
}
int isTransmitting() {
-/*
- BANDSTACK_ENTRY *entry;
- entry=bandstack_entry_get_current();
- if((entry->mode==modeCWL || entry->mode==modeCWU) && cw_keyer_internal==1 && ptt==1) {
- return 0;
- }
-*/
return ptt!=0 || mox!=0 || tune!=0;
}
}
void setDrive(double value) {
-//fprintf(stderr,"setDrive: protocol=%d\n", protocol);
drive=(int)(value*255.0);
if(protocol==NEW_PROTOCOL) {
schedule_high_priority(6);
--- /dev/null
+cp libwdsp.so /usr/local/lib
+cp libcodec2.so.0.5 /usr/local/lib
+cp libSoapySDR.so.0.5-1 /usr/local/lib
+cd /usr/local/lib; ln -s libcodec2.so.0.5 libcodec2.so
+cd /usr/local/lib; ln -s libSoapySDR.so.0.5-1 libSoapySDR.so.0.5.0
+cd /usr/local/lib; ln -s libSoapySDR.so.0.5-1 libSoapySDR.so
+ldconfig
GtkWidget *b;
int i;
for(i=0;i<BANDS;i++) {
+#ifdef LIMESDR
+ if(protocol!=LIMESDR_PROTOCOL) {
+ if(i>=band70 && i<=band3400) {
+ continue;
+ }
+ }
+#endif
BAND* band=band_get_band(i);
GtkWidget *b=gtk_button_new_with_label(band->title);
gtk_widget_override_background_color(b, GTK_STATE_NORMAL, &white);
if(b<0) {
b=BANDS-1;
}
+#ifdef LIMESDR
+ if(protocol!=LIMESDR_PROTOCOL) {
+ if(b==band3400) {
+ b=band6;
+ }
+ }
+#endif
} else {
b++;
if(b>=BANDS) {
b=0;
}
+#ifdef LIMESDR
+ if(protocol!=LIMESDR_PROTOCOL) {
+ if(b==band70) {
+ b=bandGen;
+ }
+ }
+#endif
}
band=band_set_current(b);
entry=bandstack_entry_get_current();
#include "vfo.h"
#include "toolbar.h"
#include "wdsp_init.h"
+#include "freedv.h"
#define PI 3.1415926535897932F
#define min(x,y) (x<y?x:y)
static void initAnalyzer(int channel,int buffer_size);
+void setRXMode(int m) {
+ SetRXAMode(receiver, mode==modeFREEDV?modeUSB:mode);
+}
+
+void setTXMode(int m) {
+ SetTXAMode(CHANNEL_TX, mode==modeFREEDV?modeUSB:mode);
+}
+
void setMode(int m) {
+#ifdef FREEDV
+ if(mode!=modeFREEDV && m==modeFREEDV) {
+ init_freedv();
+ } if(mode==modeFREEDV && m!=modeFREEDV) {
+ close_freedv();
+ }
+#endif
mode=m;
- SetRXAMode(receiver, mode);
- SetTXAMode(CHANNEL_TX, mode);
+ setRXMode(m);
+ setTXMode(m);
}
int getMode() {
}
initAnalyzer(CHANNEL_TX,tx_buffer_size);
- SetRXAMode(rx, mode);
+ setRXMode(mode);
SetRXABandpassFreqs(rx, (double)filterLow, (double)filterHigh);
SetRXAAGCMode(rx, agc);
SetRXAAGCTop(rx,agc_gain);
SetRXAANFRun(CHANNEL_RX0, anf);
SetRXASNBARun(CHANNEL_RX0, snb);
- SetTXAMode(CHANNEL_TX, mode);
+ setTXMode(mode);
SetTXABandpassFreqs(CHANNEL_TX, (double)filterLow, (double)filterHigh);
SetTXABandpassWindow(CHANNEL_TX, 1);
SetTXABandpassRun(CHANNEL_TX, 1);
SetTXAPreGenRun(CHANNEL_TX, 0);
SetTXAPostGenRun(CHANNEL_TX, 0);
- SetChannelState(CHANNEL_TX,0,0);
+ SetChannelState(CHANNEL_TX,1,0);
SetChannelState(CHANNEL_RX0,1,0);
}