From: John Melton G0ORX Date: Sat, 5 Oct 2019 17:22:20 +0000 (+0100) Subject: More SoapySDR TX changes X-Git-Url: https://git.rkrishnan.org/pf/content/en/seg/(%5B%5E?a=commitdiff_plain;h=c94c17179bd25c5b6ee0c35ad0d1f838a91bccb8;p=pihpsdr.git More SoapySDR TX changes --- diff --git a/ant_menu.c b/ant_menu.c index 291e71e..5d910ac 100644 --- a/ant_menu.c +++ b/ant_menu.c @@ -39,6 +39,7 @@ static GtkWidget *menu_b=NULL; 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) { @@ -80,6 +81,18 @@ static void adc0_antenna_cb(GtkComboBox *widget,gpointer data) { } } +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(); @@ -403,6 +416,22 @@ g_print("rx_antennas=%d\n",radio->info.soapy.rx_antennas); 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;iinfo.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 diff --git a/audio.c b/audio.c index 2d8e541..70e1600 100644 --- a/audio.c +++ b/audio.c @@ -200,6 +200,9 @@ fprintf(stderr,"audio_open_input: %d\n",transmitter->input_device); case NEW_PROTOCOL: mic_buffer_size = 64; break; + case SOAPYSDR_PROTOCOL: + mic_buffer_size = 720; + break; default: break; } @@ -455,7 +458,7 @@ fprintf(stderr,"mic_read_thread: mic_buffer_size=%d\n",mic_buffer_size); break; #ifdef SOAPYSDR case SOAPYSDR_PROTOCOL: - soapy_protocol_process_local_mic(mic_buffer); + soapy_protocol_process_local_mic(mic_buffer,1); break; #endif default: diff --git a/ext.c b/ext.c index e8e02ba..6fe94e3 100644 --- a/ext.c +++ b/ext.c @@ -133,6 +133,7 @@ int ext_noise_update(void *data) { } 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; } diff --git a/gpio.c b/gpio.c index a69196b..040a1c4 100644 --- a/gpio.c +++ b/gpio.c @@ -403,7 +403,9 @@ fprintf(stderr,"e_function_pressed: %d\n",action); 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); diff --git a/i2c.c b/i2c.c index e6d6a24..89417fb 100644 --- a/i2c.c +++ b/i2c.c @@ -127,6 +127,7 @@ void i2c_interrupt() { 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) { @@ -179,6 +180,7 @@ void i2c_interrupt() { i=SW17; break; } +g_print("i1c_interrupt: sw=%d action=%d\n",i,sw_action[i]); switch(sw_action[i]) { case TUNE: { @@ -195,7 +197,9 @@ void i2c_interrupt() { } break; case PS: +#ifdef PURESIGNAL g_idle_add(ext_ps_update,NULL); +#endif break; case TWO_TONE: g_idle_add(ext_two_tone,NULL); diff --git a/radio.c b/radio.c index 8bfe0d3..84acffd 100644 --- a/radio.c +++ b/radio.c @@ -1067,7 +1067,7 @@ void setMox(int state) { break; #endif default: - break; + break; } } diff --git a/soapy_protocol.c b/soapy_protocol.c index 2255dcb..8895311 100644 --- a/soapy_protocol.c +++ b/soapy_protocol.c @@ -243,6 +243,13 @@ fprintf(stderr,"soapy_protocol_init: SoapySDRDevice_make\n"); } 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) { @@ -342,7 +349,7 @@ fprintf(stderr,"soapy_protocol: receive_thread: SoapySDRDevice_unmake\n"); //_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; @@ -350,7 +357,13 @@ void soapy_protocol_process_local_mic(unsigned char *buffer) { // 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); @@ -414,7 +427,7 @@ void soapy_protocol_set_tx_frequency(TRANSMITTER *tx) { } 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)); diff --git a/soapy_protocol.h b/soapy_protocol.h index 3db9d17..39e6c96 100644 --- a/soapy_protocol.h +++ b/soapy_protocol.h @@ -43,7 +43,7 @@ void soapy_protocol_stop_transmitter(TRANSMITTER *tx); 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 diff --git a/transmitter.c b/transmitter.c index 921c3b3..00b5cb0 100644 --- a/transmitter.c +++ b/transmitter.c @@ -44,6 +44,9 @@ #include "transmitter.h" #include "new_protocol.h" #include "old_protocol.h" +#ifdef SOAPYSDR +#include "soapy_protocol.h" +#endif #ifdef FREEDV #include "freedv.h" #endif @@ -815,6 +818,11 @@ static void full_tx_buffer(TRANSMITTER *tx) { case NEW_PROTOCOL: gain=8388607.0; // 24 bit break; +#ifdef SOAPYSDR + case SOAPYSDR_PROTOCOL: + gain=32767.0; // 16 bit + break; +#endif } if (cwmode) { @@ -946,6 +954,11 @@ static void full_tx_buffer(TRANSMITTER *tx) { 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 } } } diff --git a/tx_menu.c b/tx_menu.c index 895bce0..760eb10 100644 --- a/tx_menu.c +++ b/tx_menu.c @@ -32,9 +32,9 @@ static GtkWidget *dialog=NULL; 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; @@ -116,23 +116,23 @@ static void local_microphone_cb(GtkWidget *widget, gpointer data) { 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); } } }