]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
update new protocol to support OC outputs and antenna selection
authorJohn Melton g0orx/n6lyt <john.d.melton@googlemail.com>
Fri, 22 Apr 2016 16:02:05 +0000 (16:02 +0000)
committerJohn Melton g0orx/n6lyt <john.d.melton@googlemail.com>
Fri, 22 Apr 2016 16:02:05 +0000 (16:02 +0000)
menu.c
new_protocol.c
old_protocol.c
pihpsdr
radio.c
radio.h
release/pihpsdr.tar
release/pihpsdr/pihpsdr
sliders.c

diff --git a/menu.c b/menu.c
index 4d18ee3a3bbeda137a5fe683bc4c47c7dcc41faa..bf1d1a79e00f3f2d2f8906a171e7d144f53948a8 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -342,6 +342,7 @@ static void rx_ant_cb(GtkWidget *widget, gpointer data) {
   int ant=((int)data)&0xF;
   BAND *band=band_get_band(b);
   band->alexRxAntenna=ant;
+  set_alex_rx_antenna(ant);
 }
 
 static void tx_ant_cb(GtkWidget *widget, gpointer data) {
@@ -349,6 +350,7 @@ static void tx_ant_cb(GtkWidget *widget, gpointer data) {
   int ant=((int)data)&0xF;
   BAND *band=band_get_band(b);
   band->alexTxAntenna=ant;
+  set_alex_tx_antenna(ant);
 }
 
 static void switch_page_cb(GtkNotebook *notebook,
index dab050616b55a93bea85877999ed60c6955a70fd..cc43408931d622c08896d0ca24d7ad7f24a40953 100644 (file)
@@ -40,6 +40,7 @@
 #include <math.h>
 
 #include "alex.h"
+#include "band.h"
 #include "new_protocol.h"
 #include "channel.h"
 #include "discovered.h"
@@ -197,6 +198,7 @@ fprintf(stderr,"new_protocol_general: receiver=%d\n", receiver);
 
 static void new_protocol_high_priority(int run,int tx,int drive) {
     unsigned char buffer[1444];
+    BAND *band=band_get_current_band();
 
 //fprintf(stderr,"new_protocol_high_priority: run=%d tx=%d drive=%d tx_ant=0x%08x rx_ant=0x%08x\n", run, tx, drive, alex_tx_antenna, alex_rx_antenna);
     memset(buffer, 0, sizeof(buffer));
@@ -225,6 +227,24 @@ static void new_protocol_high_priority(int run,int tx,int drive) {
 
     buffer[345]=drive;
 
+
+    if(isTransmitting()) {
+      buffer[1401]=band->OCtx;
+      if(tune) {
+        if(OCmemory_tune_time!=0) {
+          struct timeval te;
+          gettimeofday(&te,NULL);
+          long long now=te.tv_sec*1000LL+te.tv_usec/1000;
+          if(tune_timeout>now) {
+            buffer[1401]|=OCtune;
+          }
+        } else {
+          buffer[1401]|=OCtune;
+        }
+      }
+    } else {
+      buffer[1401]=band->OCrx;
+    }
 // alex HPF filters
 /*
 if              (frequency <  1800000) HPF <= 6'b100000;        // bypass
@@ -235,6 +255,8 @@ else if (frequency < 20000000) HPF <= 6'b000001;        // 13MHz HPF
 else                                               HPF <= 6'b000010;    // 20MHz HPF
 */
 
+
+
     long filters=0x00000000;
 // set HPF
     if(ddsFrequency<1800000L) {
@@ -277,9 +299,69 @@ else LPF <= 7'b0001000;             // < 2.4MHz so use 160m LPF^M
         filters|=ALEX_160_LPF;
     }
 
-    filters|=alex_rx_antenna;
-    filters|=alex_tx_antenna;
-    filters|=alex_attenuation;
+
+    switch(band->alexRxAntenna) {
+        case 0:  // ANT 1
+          break;
+        case 1:  // ANT 2
+          break;
+        case 2:  // ANT 3
+          break;
+        case 3:  // EXT 1
+          //filters|=ALEX_RX_ANTENNA_EXT1;
+          filters|=ALEX_RX_ANTENNA_EXT2;
+          break;
+        case 4:  // EXT 2
+          //filters|=ALEX_RX_ANTENNA_EXT2;
+          filters|=ALEX_RX_ANTENNA_EXT1;
+          break;
+        case 5:  // XVTR
+          filters|=ALEX_RX_ANTENNA_XVTR;
+          break;
+    }
+
+    if(isTransmitting()) {
+      switch(band->alexTxAntenna) {
+        case 0:  // ANT 1
+          filters|=ALEX_TX_ANTENNA_1;
+          break;
+        case 1:  // ANT 2
+          filters|=ALEX_TX_ANTENNA_2;
+          break;
+        case 2:  // ANT 3
+          filters|=ALEX_TX_ANTENNA_3;
+          break;
+      }
+    } else {
+      switch(band->alexRxAntenna) {
+        case 0:  // ANT 1
+          filters|=ALEX_TX_ANTENNA_1;
+          break;
+        case 1:  // ANT 2
+          filters|=ALEX_TX_ANTENNA_2;
+          break;
+        case 2:  // ANT 3
+          filters|=ALEX_TX_ANTENNA_3;
+          break;
+        case 3:  // EXT 1
+        case 4:  // EXT 2
+        case 5:  // XVTR
+          switch(band->alexTxAntenna) {
+            case 0:  // ANT 1
+              filters|=ALEX_TX_ANTENNA_1;
+              break;
+            case 1:  // ANT 2
+              filters|=ALEX_TX_ANTENNA_2;
+              break;
+            case 2:  // ANT 3
+              filters|=ALEX_TX_ANTENNA_3;
+              break;
+          }
+          break;
+      }
+    }
+
+    //filters|=alex_attenuation;
 
     if(tx) {
         filters|=0x08000000;
@@ -524,6 +606,8 @@ void* new_protocol_thread(void* arg) {
 */
     double micoutputbuffer[BUFFER_SIZE*4*2];
 
+    double gain;
+
     int isample;
     int qsample;
     long tx_iq_sequence;
@@ -721,17 +805,12 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples);
               b=4;
 
               for(i=0;i<720;i++) {
-                  if(byte_swap) {
-                      micsample  = (int)((unsigned char)buffer[b++] & 0xFF);
-                      micsample  |= (int)((signed char) buffer[b++]) << 8;
-                  } else {
-                      micsample  = (int)((signed char) buffer[b++]) << 8;
-                      micsample  |= (int)((unsigned char)buffer[b++] & 0xFF);
-                  }
+                  micsample  = (int)((signed char) buffer[b++]) << 8;
+                  micsample  |= (int)((unsigned char)buffer[b++] & 0xFF);
                   micsamplefloat = (float)micsample/32767.0F; // 16 bit sample
 
                   micinputbuffer[micsamples*2]=(double)(micsamplefloat*mic_gain);
-                  micinputbuffer[(micsamples*2)+1]=0.0;
+                  micinputbuffer[(micsamples*2)+1]=(double)(micsamplefloat*mic_gain);
 
                   micsamples++;
 
@@ -739,7 +818,6 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples);
                       int error;
 
                       if(tune==1) {
-                          //float tunefrequency = (float)((filterLow + filterHigh - filterLow) / 2);
                           float tunefrequency = (float)((filterHigh - filterLow) / 2);
                           phase=sineWave(micinputbuffer, BUFFER_SIZE, phase, tunefrequency);
                       }
@@ -749,9 +827,20 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples);
                           fprintf(stderr,"fexchange0 returned error: %d for transmitter\n", error);
                       }
 
+                      if(d->device!=DEVICE_METIS || atlas_penelope) {
+                          if(tune) {
+                              gain=8388607.0*255.0/(double)tune_drive;
+                          } else {
+                              gain=8388607.0*255.0/(double)drive;
+                          }
+                      } else {
+                          gain=65535.0;
+                      }
+
+
                       for(j=0;j<micoutputsamples;j++) {
-                        isample=(int)(micoutputbuffer[j*2]*8388607.0); // 24 bit
-                        qsample=(int)(micoutputbuffer[(j*2)+1]*8388607.0); // 24 bit
+                        isample=(int)(micoutputbuffer[j*2]*gain*2); // 24 bit
+                        qsample=(int)(micoutputbuffer[(j*2)+1]*gain*2); // 24 bit
 
                         iqbuffer[iqindex++]=isample>>16;
                         iqbuffer[iqindex++]=isample>>8;
index ae06510e5b9d8d7dc3317ad88d8c69bf3333ca33..d5ede39c8dc8ca425c76796584c3db8403f72e23 100644 (file)
@@ -612,10 +612,12 @@ void ozy_send_buffer() {
          case 2:  // ANT 3
            break;
          case 3:  // EXT 1
-           output_buffer[C3]|=0xA0;
+           //output_buffer[C3]|=0xA0;
+           output_buffer[C3]|=0xC0;
            break;
          case 4:  // EXT 2
-           output_buffer[C3]|=0xC0;
+           //output_buffer[C3]|=0xC0;
+           output_buffer[C3]|=0xA0;
            break;
          case 5:  // XVTR
            output_buffer[C3]|=0xE0;
diff --git a/pihpsdr b/pihpsdr
index f0d26e45e18b27cc3eb5675acfe6646d69962e67..2da472806e90712c6c7c898f8c916dd8f7c1ff46 100755 (executable)
Binary files a/pihpsdr and b/pihpsdr differ
diff --git a/radio.c b/radio.c
index 3e1d2c33b71718200beeccc90a6dbc15a294d110..6a0a0b8606b1d89c09151646978fe9f056dbd54d 100644 (file)
--- a/radio.c
+++ b/radio.c
@@ -116,14 +116,12 @@ int locked=0;
 
 int step=100;
 
-int byte_swap=0;
-
 int lt2208Dither = 0;
 int lt2208Random = 0;
 int attenuation = 0; // 0dB
-unsigned long alex_rx_antenna=0;
-unsigned long alex_tx_antenna=0;
-unsigned long alex_attenuation=0;
+//unsigned long alex_rx_antenna=0;
+//unsigned long alex_tx_antenna=0;
+//unsigned long alex_attenuation=0;
 
 int cw_keys_reversed=0; // 0=disabled 1=enabled
 int cw_keyer_speed=12; // 1-60 WPM
@@ -266,29 +264,32 @@ fprintf(stderr,"setTuneDrive: protocol=%d\n", protocol);
 }
 
 void set_attenuation(int value) {
-    attenuation=value;
+    //attenuation=value;
+    if(protocol==NEW_PROTOCOL) {
+        schedule_high_priority(8);
+    }
 }
 
 int get_attenuation() {
     return attenuation;
 }
 
-void set_alex_rx_antenna(unsigned long v) {
-    alex_rx_antenna=v;
+void set_alex_rx_antenna(int v) {
+    //alex_rx_antenna=v;
     if(protocol==NEW_PROTOCOL) {
         schedule_high_priority(1);
     }
 }
 
-void set_alex_tx_antenna(unsigned long v) {
-    alex_tx_antenna=v;
+void set_alex_tx_antenna(int v) {
+    //alex_tx_antenna=v;
     if(protocol==NEW_PROTOCOL) {
         schedule_high_priority(2);
     }
 }
 
-void set_alex_attenuation(unsigned long v) {
-    alex_attenuation=v;
+void set_alex_attenuation(int v) {
+    //alex_attenuation=v;
     if(protocol==NEW_PROTOCOL) {
         schedule_high_priority(0);
     }
@@ -386,8 +387,6 @@ void radioRestoreState() {
     if(value) agc_gain=atof(value);
     value=getProperty("step");
     if(value) step=atoi(value);
-    value=getProperty("byte_swap");
-    if(value) byte_swap=atoi(value);
     value=getProperty("cw_keys_reversed");
     if(value) cw_keys_reversed=atoi(value);
     value=getProperty("cw_keyer_speed");
@@ -511,8 +510,6 @@ void radioSaveState() {
     setProperty("agc_gain",value);
     sprintf(value,"%d",step);
     setProperty("step",value);
-    sprintf(value,"%d",byte_swap);
-    setProperty("byte_swap",value);
     sprintf(value,"%d",cw_keys_reversed);
     setProperty("cw_keys_reversed",value);
     sprintf(value,"%d",cw_keyer_speed);
diff --git a/radio.h b/radio.h
index 02ade6fcb7b4b5027a96b723ed688dfde5ba637d..ab23048ca639d931971faa7e8fea5bef5e481e5c 100644 (file)
--- a/radio.h
+++ b/radio.h
@@ -130,8 +130,6 @@ int locked;
 
 extern int step;
 
-extern int byte_swap;
-
 extern int lt2208Dither;
 extern int lt2208Random;
 extern int attenuation;
@@ -197,9 +195,9 @@ void setTuneDrive(double d);
 
 void set_attenuation(int value);
 int get_attenuation();
-void set_alex_rx_antenna(unsigned long v);
-void set_alex_tx_antenna(unsigned long v);
-void set_alex_attenuation(unsigned long v);
+void set_alex_rx_antenna(int v);
+void set_alex_tx_antenna(int v);
+void set_alex_attenuation(int v);
 
 extern int isTransmitting();
 
index 12ef82832b7c9733dfae408604e868890e27ce4e..88501af32b5987a0a05100689f49e611bb6b951f 100644 (file)
Binary files a/release/pihpsdr.tar and b/release/pihpsdr.tar differ
index f0d26e45e18b27cc3eb5675acfe6646d69962e67..2da472806e90712c6c7c898f8c916dd8f7c1ff46 100755 (executable)
Binary files a/release/pihpsdr/pihpsdr and b/release/pihpsdr/pihpsdr differ
index 7f70828fe619b6b30badc566e4a76d3908d0c42d..3ed778cb50a372ad1a86e1b96c1727ec0cc58601 100644 (file)
--- a/sliders.c
+++ b/sliders.c
@@ -82,9 +82,7 @@ fprintf(stderr,"scale_timeout_cb\n");
 
 static void attenuation_value_changed_cb(GtkWidget *widget, gpointer data) {
   attenuation=gtk_range_get_value(GTK_RANGE(attenuation_scale));
-  if(protocol==NEW_PROTOCOL) {
-    // need to schedule something
-  }
+  set_attenuation(attenuation);
 }
 
 void set_attenuation_value(double value) {
@@ -117,9 +115,7 @@ void set_attenuation_value(double value) {
       scale_timer=g_timeout_add(2000,scale_timeout_cb,NULL);
     }
   }
-  if(protocol==NEW_PROTOCOL) {
-    // need to schedule something
-  }
+  set_attenuation(attenuation);
 }
 
 static void agcgain_value_changed_cb(GtkWidget *widget, gpointer data) {