]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
More SoapySDR TX changes
authorJohn Melton G0ORX <john.d.melton@googlemail.com>
Sat, 5 Oct 2019 17:22:20 +0000 (18:22 +0100)
committerJohn Melton G0ORX <john.d.melton@googlemail.com>
Sat, 5 Oct 2019 17:22:20 +0000 (18:22 +0100)
ant_menu.c
audio.c
ext.c
gpio.c
i2c.c
radio.c
soapy_protocol.c
soapy_protocol.h
transmitter.c
tx_menu.c

index 291e71e52c9202efceba08c74f52f62b94bbf58c..5d910ac01a440956f9f5fb43c4798388e47124c8 100644 (file)
@@ -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 2d8e541eb59279919c7b25f34feb9ad8c7e8410c..70e160048401d7c39f49f7749fccbc23f77a4b3a 100644 (file)
--- 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 e8e02babab155d51431eb869cedbc5cbeab2d15f..6fe94e3bc2c5d6b4882226f4cf7048c3d23216f9 100644 (file)
--- 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 a69196bc2aac16e036968f288b52f90cf5249ed7..040a1c49d91dcb4c91032c7e30730c815eb47e43 100644 (file)
--- 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 e6d6a24fddb00741bc3b16ce656727109f29b725..89417fbedba4c6c578e047fae765933891a18e6e 100644 (file)
--- 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 8bfe0d3a7d037bc6d96f3f637b941b3d345f7cb0..84acffdce7432a077b488db12a24a8c46734b377 100644 (file)
--- a/radio.c
+++ b/radio.c
@@ -1067,7 +1067,7 @@ void setMox(int state) {
       break;
 #endif
     default:
-     break;
+      break;
   }
 }
 
index 2255dcb87c2b7c55ae92e08675559d5ba2efa0d9..88953116475c5eb053202392f7a99a76f3464b6c 100644 (file)
@@ -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));
index 3db9d1735e94bf487a92710ea05692fe2c391b5e..39e6c96a2549028aca273949126a870c32665ec7 100644 (file)
@@ -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
index 921c3b300be3bf44720ebe8003371f8020760f19..00b5cb0fd3f673a2a569060fe8e45f1e0448ec90 100644 (file)
@@ -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
            }
        }
     }
index 895bce0407dc6be23f2b6b7f7ddae621923c6ea9..760eb10b866e2a1f03f46a205c8fb07bbc27b616 100644 (file)
--- 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);
     }
   }
 }