From: John Melton G0ORX <john.d.melton@googlemail.com>
Date: Sat, 5 Oct 2019 17:22:20 +0000 (+0100)
Subject: More SoapySDR TX changes
X-Git-Url: https://git.rkrishnan.org/components/specifications/flags/%22file:/cyclelanguage?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;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
 
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);
     }
   }
 }