static GtkWidget *dialog=NULL;
static GtkWidget *grid=NULL;
static GtkWidget *adc0_antenna_combo_box;
+static GtkWidget *dac0_antenna_combo_box;
static void cleanup() {
if(dialog!=NULL) {
}
}
+static void dac0_antenna_cb(GtkComboBox *widget,gpointer data) {
+ DAC *dac=(DAC *)data;
+ dac->antenna=gtk_combo_box_get_active(widget);
+ if(radio->protocol==NEW_PROTOCOL) {
+ schedule_high_priority();
+#ifdef SOAPYSDR
+ } else if(radio->device==SOAPYSDR_USB_DEVICE) {
+ soapy_protocol_set_tx_antenna(transmitter,dac[0].antenna);
+#endif
+ }
+}
+
static void rx_lime_ant_cb(GtkWidget *widget, gpointer data) {
int ant=((uintptr_t)data)&0xF;
BAND *band=band_get_current_band();
g_signal_connect(adc0_antenna_combo_box,"changed",G_CALLBACK(adc0_antenna_cb),&adc[0]);
gtk_grid_attach(GTK_GRID(grid),adc0_antenna_combo_box,1,1,1,1);
}
+
+ g_print("tx_antennas=%d\n",radio->info.soapy.tx_antennas);
+ if(radio->info.soapy.tx_antennas>0) {
+ GtkWidget *antenna_label=gtk_label_new("TX Antenna:");
+ gtk_grid_attach(GTK_GRID(grid),antenna_label,0,2,1,1);
+ dac0_antenna_combo_box=gtk_combo_box_text_new();
+
+ for(i=0;i<radio->info.soapy.tx_antennas;i++) {
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(dac0_antenna_combo_box),NULL,radio->info.soapy.tx_antenna[i]);
+ }
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(dac0_antenna_combo_box),dac[0].antenna);
+ g_signal_connect(dac0_antenna_combo_box,"changed",G_CALLBACK(dac0_antenna_cb),&dac[0]);
+ gtk_grid_attach(GTK_GRID(grid),dac0_antenna_combo_box,1,2,1,1);
+ }
+
}
#endif
case NEW_PROTOCOL:
mic_buffer_size = 64;
break;
+ case SOAPYSDR_PROTOCOL:
+ mic_buffer_size = 720;
+ break;
default:
break;
}
break;
#ifdef SOAPYSDR
case SOAPYSDR_PROTOCOL:
- soapy_protocol_process_local_mic(mic_buffer);
+ soapy_protocol_process_local_mic(mic_buffer,1);
break;
#endif
default:
}
int ext_mox_update(void *data) {
+g_print("ext_mox_update: %d\n",GPOINTER_TO_INT(data));
mox_update(GPOINTER_TO_INT(data));
return 0;
}
g_idle_add(ext_mox_update,NULL);
break;
case PS:
+#ifdef PURESIGNAL
g_idle_add(ext_ps_update,NULL);
+#endif
break;
case TWO_TONE:
g_idle_add(ext_two_tone,NULL);
flags=read_word_data(ADDRESS_1,0x0E);
if(flags) {
ints=read_word_data(ADDRESS_1,0x10);
+g_print("i1c_interrupt: flags=%04X ints=%04X\n",flags,ints);
if(ints) {
int i=-1;
switch(ints) {
i=SW17;
break;
}
+g_print("i1c_interrupt: sw=%d action=%d\n",i,sw_action[i]);
switch(sw_action[i]) {
case TUNE:
{
}
break;
case PS:
+#ifdef PURESIGNAL
g_idle_add(ext_ps_update,NULL);
+#endif
break;
case TWO_TONE:
g_idle_add(ext_two_tone,NULL);
break;
#endif
default:
- break;
+ break;
}
}
}
SoapySDRKwargs_clear(&args);
+ if(transmitter->local_microphone) {
+ if(audio_open_input()!=0) {
+ fprintf(stderr,"audio_open_input failed\n");
+ transmitter->local_microphone=0;
+ }
+ }
+
}
static void *receive_thread(void *arg) {
//_exit(0);
}
-void soapy_protocol_process_local_mic(unsigned char *buffer) {
+void soapy_protocol_process_local_mic(unsigned char *buffer,int le) {
int b;
int i;
short sample;
// always 48000 samples per second
b=0;
for(i=0;i<720;i++) {
- sample=(short)(buffer[i]*32767.0);
+ if(le) {
+ sample = (short) (buffer[b++]&0xFF);
+ sample |= (short) (buffer[b++]<<8);
+ } else {
+ sample = (short)(buffer[b++]<<8);
+ sample |= (short) (buffer[b++]&0xFF);
+ }
#ifdef FREEDV
if(active_receiver->freedv) {
add_freedv_mic_sample(transmitter,sample);
} else {
f=(double)(vfo[v].frequency-vfo[v].lo_tx);
}
-//g_print("soapy_protocol_set_tx_frequency: %f\n",f);
+g_print("soapy_protocol_set_tx_frequency: %f\n",f);
rc=SoapySDRDevice_setFrequency(soapy_device,SOAPY_SDR_TX,active_receiver->adc,f,NULL);
if(rc!=0) {
fprintf(stderr,"soapy_protocol: SoapySDRDevice_setFrequency(TX) failed: %s\n",SoapySDR_errToStr(rc));
void soapy_protocol_set_tx_frequency(TRANSMITTER *tx);
void soapy_protocol_set_tx_antenna(TRANSMITTER *tx,int ant);
void soapy_protocol_set_tx_gain(TRANSMITTER *tx,char *name,int gain);
-void soapy_protocol_process_local_mic(unsigned char *buffer);
+void soapy_protocol_process_local_mic(unsigned char *buffer,int le);
void soapy_protocol_iq_samples(float isample,float qsample);
void soapy_protocol_set_mic_sample_rate(int rate);
#endif
#include "transmitter.h"
#include "new_protocol.h"
#include "old_protocol.h"
+#ifdef SOAPYSDR
+#include "soapy_protocol.h"
+#endif
#ifdef FREEDV
#include "freedv.h"
#endif
case NEW_PROTOCOL:
gain=8388607.0; // 24 bit
break;
+#ifdef SOAPYSDR
+ case SOAPYSDR_PROTOCOL:
+ gain=32767.0; // 16 bit
+ break;
+#endif
}
if (cwmode) {
case NEW_PROTOCOL:
new_protocol_iq_samples(isample,qsample);
break;
+#ifdef SOAPYSDR
+ case SOAPYSDR_PROTOCOL:
+ soapy_protocol_iq_samples((float)tx->iq_output_buffer[j*2],(float)tx->iq_output_buffer[(j*2)+1]);
+ break;
+#endif
}
}
}
static GtkWidget *last_filter;
-static GtkWidget *micin_b;
-static GtkWidget *linein_b;
-static GtkWidget *micboost_b;
+static GtkWidget *micin_b=NULL;
+static GtkWidget *linein_b=NULL;
+static GtkWidget *micboost_b=NULL;
static GtkWidget *tune_label;
static GtkWidget *tune_scale;
if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) {
if(audio_open_input()==0) {
transmitter->local_microphone=1;
- gtk_widget_hide(micin_b);
- gtk_widget_hide(linein_b);
- gtk_widget_hide(micboost_b);
+ if(micin_b!=NULL) gtk_widget_hide(micin_b);
+ if(linein_b!=NULL) gtk_widget_hide(linein_b);
+ if(micboost_b!=NULL) gtk_widget_hide(micboost_b);
} else {
transmitter->local_microphone=0;
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
- gtk_widget_show(micin_b);
- gtk_widget_show(linein_b);
- gtk_widget_show(micboost_b);
+ if(micin_b!=NULL) gtk_widget_show(micin_b);
+ if(linein_b!=NULL) gtk_widget_show(linein_b);
+ if(micboost_b!=NULL) gtk_widget_show(micboost_b);
}
} else {
if(transmitter->local_microphone) {
transmitter->local_microphone=0;
audio_close_input();
- gtk_widget_show(micin_b);
- gtk_widget_show(linein_b);
- gtk_widget_show(micboost_b);
+ if(micin_b!=NULL) gtk_widget_show(micin_b);
+ if(linein_b!=NULL) gtk_widget_show(linein_b);
+ if(micboost_b!=NULL) gtk_widget_show(micboost_b);
}
}
}