]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
fixes cw key swap and build without FREEDV
authorJohn Melton - G0ORX/N6LYT <john.d.melton@googlemail.com>
Mon, 21 Nov 2016 07:21:16 +0000 (07:21 +0000)
committerJohn Melton - G0ORX/N6LYT <john.d.melton@googlemail.com>
Mon, 21 Nov 2016 07:21:16 +0000 (07:21 +0000)
16 files changed:
Makefile
band.c
bandstack.h
cw_menu.c
main.c
new_menu.c
new_protocol.c
new_protocol.h
old_protocol.c
pihpsdr
radio.c
radio.h
release/pihpsdr.tar
release/pihpsdr/pihpsdr
version.c
xvtr.h

index 6057f7d3a317cb1a8b1c3fc74c72bdd27421a08c..c6d9e3ee662a2f7c933bdda24fab60ee012572a3 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -58,11 +58,14 @@ ifeq ($(FREEDV_INCLUDE),FREEDV)
 FREEDV_OPTIONS=-D FREEDV
 FREEDVLIBS=-lcodec2
 FREEDV_SOURCES= \
-freedv.c
+freedv.c \
+freedv_menu.c
 FREEDV_HEADERS= \
-freedv.h
+freedv.h \
+freedv_menu.h
 FREEDV_OBJS= \
-freedv.o
+freedv.o \
+freedv_menu.o
 endif
 
 #required for MRAA GPIO
@@ -118,7 +121,6 @@ frequency.c \
 discovered.c \
 filter.c \
 main.c \
-menu.c \
 new_menu.c \
 exit_menu.c \
 general_menu.c \
@@ -129,7 +131,7 @@ dsp_menu.c \
 pa_menu.c \
 cw_menu.c \
 oc_menu.c \
-freedv_menu.c \
+xvtr_menu.c \
 rit.c \
 meter.c \
 mode.c \
@@ -162,7 +164,6 @@ bandstack.h \
 channel.h \
 discovered.h \
 filter.h \
-menu.h \
 new_menu.h \
 exit_menu.h \
 general_menu.h \
@@ -173,7 +174,7 @@ dsp_menu.h \
 pa_menu.h \
 cw_menu.h \
 oc_menu.h \
-freedv_menu.h \
+xvtr_menu.h \
 rit.h \
 meter.h \
 mode.h \
@@ -204,7 +205,6 @@ discovered.o \
 filter.o \
 version.o \
 main.o \
-menu.o \
 new_menu.o \
 exit_menu.o \
 general_menu.o \
@@ -215,7 +215,7 @@ dsp_menu.o \
 pa_menu.o \
 cw_menu.o \
 oc_menu.o \
-freedv_menu.o \
+xvtr_menu.o \
 rit.o \
 meter.o \
 mode.o \
diff --git a/band.c b/band.c
index 9f7b5fe31a9390a64a9b91a586913ace32a22bf7..4d7d2b41197a14720a0456f5551cd0a8b9281a4d 100644 (file)
--- a/band.c
+++ b/band.c
@@ -31,7 +31,7 @@
 #define LINESDR
 
 int band=band20;
-int xvtr_band=band160;
+int xvtr_band=BANDS;
 
 /* --------------------------------------------------------------------------*/
 /**
@@ -244,19 +244,42 @@ BAND_LIMITS bandLimits[NUM_BAND_LIMITS] = {
 * @brief xvtr
 */
 /* ----------------------------------------------------------------------------*/
-static XVTR_ENTRY xvtr[12]=
-    {{"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0},
-     {"",0LL,0LL,0LL,0LL,0LL,0LL,0LL,0LL,0,modeUSB,filterF5,-2800,-200,-2800,-200,0,0,0,0}};
+
+BANDSTACK_ENTRY bandstack_entries_xvtr_0[] =
+    {{0LL,modeUSB,filterF6,150,2550,150,2550}};
+BANDSTACK_ENTRY bandstack_entries_xvtr_1[] =
+    {{0LL,modeUSB,filterF6,150,2550,150,2550}};
+BANDSTACK_ENTRY bandstack_entries_xvtr_2[] =
+    {{0LL,modeUSB,filterF6,150,2550,150,2550}};
+BANDSTACK_ENTRY bandstack_entries_xvtr_3[] =
+    {{0LL,modeUSB,filterF6,150,2550,150,2550}};
+BANDSTACK_ENTRY bandstack_entries_xvtr_4[] =
+    {{0LL,modeUSB,filterF6,150,2550,150,2550}};
+BANDSTACK_ENTRY bandstack_entries_xvtr_5[] =
+    {{0LL,modeUSB,filterF6,150,2550,150,2550}};
+BANDSTACK_ENTRY bandstack_entries_xvtr_6[] =
+    {{0LL,modeUSB,filterF6,150,2550,150,2550}};
+BANDSTACK_ENTRY bandstack_entries_xvtr_7[] =
+    {{0LL,modeUSB,filterF6,150,2550,150,2550}};
+
+BANDSTACK bandstack_xvtr_0={1,1,bandstack_entries_xvtr_0};
+BANDSTACK bandstack_xvtr_1={1,1,bandstack_entries_xvtr_1};
+BANDSTACK bandstack_xvtr_2={1,1,bandstack_entries_xvtr_2};
+BANDSTACK bandstack_xvtr_3={1,1,bandstack_entries_xvtr_3};
+BANDSTACK bandstack_xvtr_4={1,1,bandstack_entries_xvtr_4};
+BANDSTACK bandstack_xvtr_5={1,1,bandstack_entries_xvtr_5};
+BANDSTACK bandstack_xvtr_6={1,1,bandstack_entries_xvtr_6};
+BANDSTACK bandstack_xvtr_7={1,1,bandstack_entries_xvtr_7};
+
+static XVTR_ENTRY xvtr[XVTRS]=
+    {{"",&bandstack_xvtr_0,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL},
+     {"",&bandstack_xvtr_1,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL},
+     {"",&bandstack_xvtr_2,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL},
+     {"",&bandstack_xvtr_3,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL},
+     {"",&bandstack_xvtr_4,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL},
+     {"",&bandstack_xvtr_5,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL},
+     {"",&bandstack_xvtr_6,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL},
+     {"",&bandstack_xvtr_7,0x00,0x00,0,0,0,0,0.0,0LL,0LL,0LL}};
 
 
 BANDSTACK_ENTRY *bandstack_entry_get_current() {
index 4506c5f52ce086ab1bfe046d28c2202687f9012e..9e8b30e5911961710e0457323dfadeedc9ff5952 100644 (file)
@@ -26,6 +26,7 @@
 */
 struct _BANDSTACK_ENTRY {
     long long frequencyA;
+    long long frequencyB;
     int mode;
     int filter;
     int var1Low;
index 57be2e2498035cfd12311842b9753be5d443ace1..d1c90d87097b1c0d6c8aabb0c6605060c833e705 100644 (file)
--- a/cw_menu.c
+++ b/cw_menu.c
@@ -175,6 +175,7 @@ void cw_menu(GtkWidget *parent) {
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw_keys_reversed_b), cw_keys_reversed);
   gtk_widget_show(cw_keys_reversed_b);
   gtk_grid_attach(GTK_GRID(grid),cw_keys_reversed_b,0,6,1,1);
+  g_signal_connect(cw_keys_reversed_b,"toggled",G_CALLBACK(cw_keys_reversed_cb),NULL);
 
   GtkWidget *cw_keyer_sidetone_level_label=gtk_label_new("Sidetone Level:");
   //gtk_widget_override_font(cw_keyer_sidetone_level_label, pango_font_description_from_string("Arial 18"));
diff --git a/main.c b/main.c
index e642e2056b60665e117fa795299c8687a59d6eb7..e585fc7f6fa522c463eec6e14789e3b96166c986 100644 (file)
--- a/main.c
+++ b/main.c
@@ -563,7 +563,7 @@ fprintf(stderr,"selected radio=%p device=%d\n",radio,radio->device);
     case NEW_PROTOCOL:
       splash_status("Initializing new protocol ...");
   fprintf(stderr,"new_protocol_init\n");
-      new_protocol_init(0,display_width);
+      new_protocol_init(display_width);
       break;
 #ifdef LIMESDR
     case LIMESDR_PROTOCOL:
index c308632ab07181f082f7afcc3830bb1ff575d4b3..d356dd43fb0dfa9ae6000832c69d313fd731bb8d 100644 (file)
 #include "dsp_menu.h"
 #include "pa_menu.h"
 #include "oc_menu.h"
+#ifdef FREEDV
 #include "freedv_menu.h"
+#endif
+#include "xvtr_menu.h"
 #include "radio.h"
 
 static GtkWidget *parent_window=NULL;
@@ -113,12 +116,21 @@ static gboolean oc_cb (GtkWidget *widget, GdkEventButton *event, gpointer data)
   return TRUE;
 }
 
+#ifdef FREEDV
 static gboolean freedv_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) {
   gtk_widget_destroy(dialog);
   dialog=NULL;
   freedv_menu(parent_window);
   return TRUE;
 }
+#endif
+
+static gboolean xvtr_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) {
+  gtk_widget_destroy(dialog);
+  dialog=NULL;
+  xvtr_menu(parent_window);
+  return TRUE;
+}
 
 static gboolean new_menu_pressed_event_cb (GtkWidget *widget,
                GdkEventButton *event,
@@ -193,9 +205,16 @@ static gboolean new_menu_pressed_event_cb (GtkWidget *widget,
     g_signal_connect (oc_b, "button-press-event", G_CALLBACK(oc_cb), NULL);
     gtk_grid_attach(GTK_GRID(grid),oc_b,2,2,1,1);
 
+#ifdef FREEDV
     GtkWidget *freedv_b=gtk_button_new_with_label("FreeDV");
     g_signal_connect (freedv_b, "button-press-event", G_CALLBACK(freedv_cb), NULL);
     gtk_grid_attach(GTK_GRID(grid),freedv_b,3,2,1,1);
+#endif
+/*
+    GtkWidget *xvtr_b=gtk_button_new_with_label("XVTR");
+    g_signal_connect (xvtr_b, "button-press-event", G_CALLBACK(xvtr_cb), NULL);
+    gtk_grid_attach(GTK_GRID(grid),xvtr_b,4,2,1,1);
+*/
 
     gtk_container_add(GTK_CONTAINER(content),grid);
 
index c51cf59572706a8f96d6ed7be439821a3c54a1ae..b3968b6c5b2362a8075a35a8ba2c0a6d1d562e5b 100644 (file)
@@ -63,7 +63,6 @@
 
 int data_socket;
 
-static int receiver;
 static int running;
 
 sem_t response_sem;
@@ -86,8 +85,8 @@ static int audio_addr_length;
 static struct sockaddr_in iq_addr;
 static int iq_addr_length;
 
-static struct sockaddr_in data_addr;
-static int data_addr_length;
+static struct sockaddr_in data_addr[RECEIVERS];
+static int data_addr_length[RECEIVERS];
 
 static pthread_t new_protocol_thread_id;
 static pthread_t new_protocol_timer_thread_id;
@@ -130,10 +129,10 @@ static int send_high_priority=0;
 static sem_t send_general_sem;
 static int send_general=0;
 
-static int samples=0;
+static int samples[RECEIVERS];
 static int outputsamples=BUFFER_SIZE;
 
-static double iqinputbuffer[BUFFER_SIZE*2];
+static double iqinputbuffer[RECEIVERS][BUFFER_SIZE*2];
 static double audiooutputbuffer[BUFFER_SIZE*2];
 
 static int leftaudiosample;
@@ -158,7 +157,7 @@ static int psk_resample=6;  // convert from 48000 to 8000
 static void new_protocol_high_priority(int run);
 static void* new_protocol_thread(void* arg);
 static void* new_protocol_timer_thread(void* arg);
-static void  process_iq_data(unsigned char *buffer);
+static void  process_iq_data(int rx,unsigned char *buffer);
 static void  process_command_response(unsigned char *buffer);
 static void  process_high_priority(unsigned char *buffer);
 static void  process_mic_data(unsigned char *buffer);
@@ -217,12 +216,11 @@ void tuner_changed() {
 void cw_changed() {
 }
 
-void new_protocol_init(int rx,int pixels) {
+void new_protocol_init(int pixels) {
     int rc;
-    receiver=rx;
     spectrumWIDTH=pixels;
 
-    fprintf(stderr,"new_protocol_init: %d\n",rx);
+    fprintf(stderr,"new_protocol_init\n");
 
     if(local_audio) {
       if(audio_open_output()!=0) {
@@ -246,7 +244,7 @@ void new_protocol_init(int rx,int pixels) {
 
     rc=pthread_create(&new_protocol_thread_id,NULL,new_protocol_thread,NULL);
     if(rc != 0) {
-        fprintf(stderr,"pthread_create failed on new_protocol_thread for receiver %d: rc=%d\n", receiver, rc);
+        fprintf(stderr,"pthread_create failed on new_protocol_thread: rc=%d\n", rc);
         exit(-1);
     }
 
@@ -293,6 +291,7 @@ static void new_protocol_general() {
 }
 
 static void new_protocol_high_priority(int run) {
+    int r;
     unsigned char buffer[1444];
     BAND *band=band_get_current_band();
 
@@ -323,10 +322,13 @@ static void new_protocol_high_priority(int run) {
     long phase=(long)((4294967296.0*(double)rxFrequency)/122880000.0);
 
 // rx
-    buffer[9]=phase>>24;
-    buffer[10]=phase>>16;
-    buffer[11]=phase>>8;
-    buffer[12]=phase;
+
+    for(r=0;r<receivers;r++) {
+      buffer[9+(r*4)]=phase>>24;
+      buffer[10+(r*4)]=phase>>16;
+      buffer[11+(r*4)]=phase>>8;
+      buffer[12+(r*4)]=phase;
+    }
 
 // tx (no split yet)
     long long txFrequency=ddsFrequency;
@@ -600,11 +602,15 @@ static void new_protocol_receive_specific() {
     buffer[4]=2; // 2 ADCs
     buffer[5]=0; // dither off
     if(lt2208Dither) {
-        buffer[5]=0x01<<receiver;
+      for(i=0;i<receivers;i++) {
+        buffer[5]|=0x01<<i;
+      }
     }
     buffer[6]=0; // random off
     if(lt2208Random) {
-        buffer[6]=0x01<<receiver;
+      for(i=0;i<receivers;i++) {
+        buffer[6]|=0x01<<i;
+      }
     }
     buffer[7]=0x00;
     for(i=0;i<receivers;i++) {
@@ -624,7 +630,7 @@ static void new_protocol_receive_specific() {
     buffer[28]=24;
 
     if(sendto(data_socket,buffer,sizeof(buffer),0,(struct sockaddr*)&receiver_addr,receiver_addr_length)<0) {
-        fprintf(stderr,"sendto socket failed for start: receiver=%d\n",receiver);
+        fprintf(stderr,"sendto socket failed for start\n");
         exit(1);
     }
 
@@ -658,14 +664,14 @@ double calibrate(int v) {
 
 void* new_protocol_thread(void* arg) {
 
-
+    int i;
     struct sockaddr_in addr;
     int length;
     unsigned char buffer[2048];
     int bytesread;
     short sourceport;
 
-fprintf(stderr,"new_protocol_thread: receiver=%d\n", receiver);
+fprintf(stderr,"new_protocol_thread\n");
 
     micsamples=0;
     iqindex=4;
@@ -674,7 +680,7 @@ fprintf(stderr,"new_protocol_thread: receiver=%d\n", receiver);
 fprintf(stderr,"outputsamples=%d\n", outputsamples);
     data_socket=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
     if(data_socket<0) {
-        fprintf(stderr,"metis: create socket failed for data_socket: receiver=%d\n",receiver);
+        fprintf(stderr,"metis: create socket failed for data_socket\n");
         exit(-1);
     }
 
@@ -683,7 +689,7 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples);
 
     // bind to the interface
     if(bind(data_socket,(struct sockaddr*)&radio->info.network.interface_address,radio->info.network.interface_length)<0) {
-        fprintf(stderr,"metis: bind socket failed for data_socket: receiver=%d\n",receiver);
+        fprintf(stderr,"metis: bind socket failed for data_socket\n");
         exit(-1);
     }
 
@@ -711,11 +717,14 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples);
     iq_addr_length=radio->info.network.address_length;
     iq_addr.sin_port=htons(TX_IQ_FROM_HOST_PORT);
 
-    memcpy(&data_addr,&radio->info.network.address,radio->info.network.address_length);
-    data_addr_length=radio->info.network.address_length;
-    data_addr.sin_port=htons(RX_IQ_TO_HOST_PORT+receiver);
+   
+    for(i=0;i<RECEIVERS;i++) {
+        memcpy(&data_addr[i],&radio->info.network.address,radio->info.network.address_length);
+        data_addr_length[i]=radio->info.network.address_length;
+        data_addr[i].sin_port=htons(RX_IQ_TO_HOST_PORT_0+i);
+        samples[i]=0;
+    }
 
-    samples=0;
     audioindex=4; // leave space for sequence
     audiosequence=0L;
 
@@ -726,7 +735,7 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples);
     while(running) {
         bytesread=recvfrom(data_socket,buffer,sizeof(buffer),0,(struct sockaddr*)&addr,&length);
         if(bytesread<0) {
-            fprintf(stderr,"recvfrom socket failed for new_protocol_thread: receiver=%d", receiver);
+            fprintf(stderr,"recvfrom socket failed for new_protocol_thread");
             exit(1);
         }
 
@@ -735,8 +744,11 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples);
 //fprintf(stderr,"received packet length %d from port %d\n",bytesread,sourceport);
 
         switch(sourceport) {
-            case RX_IQ_TO_HOST_PORT:
-              process_iq_data(buffer);
+            case RX_IQ_TO_HOST_PORT_0:
+              process_iq_data(0,buffer);
+              break;
+            case RX_IQ_TO_HOST_PORT_1:
+              process_iq_data(1,buffer);
               break;
             case COMMAND_RESPONCE_TO_HOST_PORT:
               process_command_response(buffer);
@@ -774,7 +786,7 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples);
     close(data_socket);
 }
 
-static void process_iq_data(unsigned char *buffer) {
+static void process_iq_data(int rx,unsigned char *buffer) {
     long sequence;
     long long timestamp;
     int bitspersample;
@@ -805,13 +817,13 @@ static void process_iq_data(unsigned char *buffer) {
             leftsampledouble=(double)leftsample/8388607.0; // for 24 bits
             rightsampledouble=(double)rightsample/8388607.0; // for 24 bits
 
-            iqinputbuffer[samples*2]=leftsampledouble;
-            iqinputbuffer[(samples*2)+1]=rightsampledouble;
+            iqinputbuffer[rx][samples[rx]*2]=leftsampledouble;
+            iqinputbuffer[rx][(samples[rx]*2)+1]=rightsampledouble;
 
-            samples++;
-            if(samples==BUFFER_SIZE) {
-                full_rx_buffer();
-                samples=0;
+            samples[rx]++;
+            if(samples[rx]==BUFFER_SIZE) {
+                full_rx_buffer(rx);
+                samples[rx]=0;
             }
        }
   //}
@@ -1028,33 +1040,35 @@ static void process_rx_buffer() {
   }
 }
 
-static void full_rx_buffer() {
+static void full_rx_buffer(int rx) {
   int j;
   int error;
 
-  fexchange0(CHANNEL_RX0, iqinputbuffer, audiooutputbuffer, &error);
-if(error!=0) {
-fprintf(stderr,"full_rx_buffer: fexchange0: error=%d\n",error);
-}
-  switch(mode) {
+if(rx==0) {
+  fexchange0(CHANNEL_RX0, iqinputbuffer[rx], audiooutputbuffer, &error);
+  if(error!=0) {
+    fprintf(stderr,"full_rx_buffer: fexchange0: error=%d\n",error);
+  }
+    switch(mode) {
 #ifdef PSK
-    case modePSK:
-      break;
+      case modePSK:
+        break;
 #endif
-    default:
-      Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer);
-      break;
-  }
+      default:
+        Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer[rx]);
+        break;
+    }
 
-  switch(mode) {
+    switch(mode) {
 #ifdef FREEDV
-    case modeFREEDV:
-      process_freedv_rx_buffer();
-      break;
+      case modeFREEDV:
+        process_freedv_rx_buffer();
+        break;
 #endif
-    default:
-      process_rx_buffer();
-      break;
+      default:
+        process_rx_buffer();
+        break;
+    }
   }
 }
 
index e8df587ce4ce202df9eb44119b40b836ca9d465a..2f3e096db37b7fb489bd96dd4d5844963f76f212 100644 (file)
 #define HIGH_PRIORITY_TO_HOST_PORT 1025
 #define MIC_LINE_TO_HOST_PORT 1026
 #define WIDE_BAND_TO_HOST_PORT 1027
-#define RX_IQ_TO_HOST_PORT 1035
+#define RX_IQ_TO_HOST_PORT_0 1035
+#define RX_IQ_TO_HOST_PORT_1 1036
+#define RX_IQ_TO_HOST_PORT_2 1037
+#define RX_IQ_TO_HOST_PORT_3 1038
 
 #define BUFFER_SIZE 1024
 
@@ -64,7 +67,7 @@ extern int send_general;
 void schedule_high_priority(int source);
 void schedule_general();
 
-void new_protocol_init(int rx,int pixels);
+void new_protocol_init(int pixels);
 void new_protocol_stop();
 
 void filter_board_changed();
index 21d5c79d474821f7c7d43754da5b1df50a5d401b..45f91a24e16d15156571bb797a3c16d464103a6c 100644 (file)
@@ -139,7 +139,7 @@ static int psk_divisor=6;
 
 //static float left_input_buffer[BUFFER_SIZE];
 //static float right_input_buffer[BUFFER_SIZE];
-static double iqinputbuffer[BUFFER_SIZE*2];
+static double iqinputbuffer[RECEIVERS][BUFFER_SIZE*2];
 
 //static float mic_left_buffer[BUFFER_SIZE];
 //static float mic_right_buffer[BUFFER_SIZE];
@@ -367,17 +367,18 @@ static void *receive_thread(void* arg) {
 
 static void process_ozy_input_buffer(char  *buffer) {
   int i,j;
+  int r;
   int b=0;
   unsigned char ozy_samples[8*8];
   int bytes;
   int last_ptt;
   int last_dot;
   int last_dash;
-  int left_sample;
-  int right_sample;
+  int left_sample[RECEIVERS];
+  int right_sample[RECEIVERS];
   int mic_sample;
-  double left_sample_double;
-  double right_sample_double;
+  double left_sample_double[RECEIVERS];
+  double right_sample_double[RECEIVERS];
   double mic_sample_double;
   double gain=pow(10.0, mic_gain / 20.0);
 
@@ -435,19 +436,32 @@ static void process_ozy_input_buffer(char  *buffer) {
 
 
     // extract the 63 samples
-    for(i=0;i<63;i++) {
-
-      left_sample   = (int)((signed char) buffer[b++]) << 16;
-      left_sample  += (int)((unsigned char)buffer[b++]) << 8;
-      left_sample  += (int)((unsigned char)buffer[b++]);
-      right_sample  = (int)((signed char) buffer[b++]) << 16;
-      right_sample += (int)((unsigned char)buffer[b++]) << 8;
-      right_sample += (int)((unsigned char)buffer[b++]);
+    int iq_samples=63;
+    switch(RECEIVERS) {
+      case 1:
+        iq_samples=63;
+        break;
+      case 2:
+        iq_samples=36;
+        break;
+    }
+    for(i=0;i<iq_samples;i++) {
+
+      for(r=0;r<RECEIVERS;r++) {
+        left_sample[r]   = (int)((signed char) buffer[b++]) << 16;
+        left_sample[r]  += (int)((unsigned char)buffer[b++]) << 8;
+        left_sample[r]  += (int)((unsigned char)buffer[b++]);
+        right_sample[r]  = (int)((signed char) buffer[b++]) << 16;
+        right_sample[r] += (int)((unsigned char)buffer[b++]) << 8;
+        right_sample[r] += (int)((unsigned char)buffer[b++]);
+      }
       mic_sample    = (int)((signed char) buffer[b++]) << 8;
       mic_sample   += (int)((unsigned char)buffer[b++]);
 
-      left_sample_double=(double)left_sample/8388607.0; // 24 bit sample 2^23-1
-      right_sample_double=(double)right_sample/8388607.0; // 24 bit sample 2^23-1
+      for(r=0;r<RECEIVERS;r++) {
+        left_sample_double[r]=(double)left_sample[r]/8388607.0; // 24 bit sample 2^23-1
+        right_sample_double[r]=(double)right_sample[r]/8388607.0; // 24 bit sample 2^23-1
+      }
       mic_sample_double = (1.0 / 2147483648.0) * (double)(mic_sample<<16);
 
       // add to buffer
@@ -465,8 +479,8 @@ static void process_ozy_input_buffer(char  *buffer) {
                   mic_sample_double = (1.0 / 2147483648.0) * (double)(mic_sample<<16);
                   micinputbuffer[samples*2]=mic_sample_double;
                   micinputbuffer[(samples*2)+1]=mic_sample_double;
-                  iqinputbuffer[samples*2]=0.0;
-                  iqinputbuffer[(samples*2)+1]=0.0;
+                  iqinputbuffer[0][samples*2]=0.0;
+                  iqinputbuffer[0][(samples*2)+1]=0.0;
                   samples++;
                   if(samples==buffer_size) {
                     full_tx_buffer();
@@ -489,8 +503,8 @@ static void process_ozy_input_buffer(char  *buffer) {
             micinputbuffer[samples*2]=mic_sample_double*gain;
             micinputbuffer[(samples*2)+1]=mic_sample_double*gain;
           }
-          iqinputbuffer[samples*2]=0.0;
-          iqinputbuffer[(samples*2)+1]=0.0;
+          iqinputbuffer[0][samples*2]=0.0;
+          iqinputbuffer[0][(samples*2)+1]=0.0;
           samples++;
           if(samples==buffer_size) {
             full_tx_buffer();
@@ -503,8 +517,8 @@ static void process_ozy_input_buffer(char  *buffer) {
         if(!isTransmitting()) {
           micinputbuffer[samples*2]=0.0;
           micinputbuffer[(samples*2)+1]=0.0;
-          iqinputbuffer[samples*2]=left_sample_double;
-          iqinputbuffer[(samples*2)+1]=right_sample_double;
+          iqinputbuffer[0][samples*2]=left_sample_double[0];
+          iqinputbuffer[0][(samples*2)+1]=right_sample_double[0];
           samples++;
           if(samples==buffer_size) {
             full_rx_buffer();
@@ -617,13 +631,13 @@ static void full_rx_buffer() {
   int j;
   int error;
 
-  fexchange0(CHANNEL_RX0, iqinputbuffer, audiooutputbuffer, &error);
+  fexchange0(CHANNEL_RX0, iqinputbuffer[0], audiooutputbuffer, &error);
   fexchange0(CHANNEL_TX, micinputbuffer, iqoutputbuffer, &error);
 
 #ifdef PSK
   if(mode!=modePSK) {
 #endif
-    Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer);
+    Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer[0]);
 #ifdef PSK
   }
 #endif
@@ -708,8 +722,8 @@ void old_protocol_process_local_mic(unsigned char *buffer,int le) {
                 leftmicsampledouble=(double)leftmicsample/32767.0; // 16 bit sample 2^16-1
                 micinputbuffer[samples*2]=leftmicsampledouble;
                 micinputbuffer[(samples*2)+1]=leftmicsampledouble;
-                iqinputbuffer[samples*2]=0.0;
-                iqinputbuffer[(samples*2)+1]=0.0;
+                iqinputbuffer[0][samples*2]=0.0;
+                iqinputbuffer[0][(samples*2)+1]=0.0;
                 samples++;
                 if(samples==buffer_size) {
                   full_tx_buffer();
@@ -733,8 +747,8 @@ void old_protocol_process_local_mic(unsigned char *buffer,int le) {
            micinputbuffer[samples*2]=leftmicsampledouble;
            micinputbuffer[(samples*2)+1]=leftmicsampledouble;
          }
-         iqinputbuffer[samples*2]=0.0;
-         iqinputbuffer[(samples*2)+1]=0.0;
+         iqinputbuffer[0][samples*2]=0.0;
+         iqinputbuffer[0][(samples*2)+1]=0.0;
          samples++;
          if(samples==buffer_size) {
            full_tx_buffer();
@@ -756,6 +770,8 @@ static void process_bandscope_buffer(char  *buffer) {
 */
 
 
+int current_rx=0;
+
 void ozy_send_buffer() {
 
   output_buffer[SYNC0]=SYNC;
@@ -849,7 +865,9 @@ void ozy_send_buffer() {
 
 
 // TODO - add Alex TX relay, duplex, receivers Mercury board frequency
-      output_buffer[C4]=0x04;
+      output_buffer[C4]=0x04;  // duplex
+      output_buffer[C4]|=(RECEIVERS-1)<<3;
+    
       if(isTransmitting()) {
         switch(band->alexTxAntenna) {
           case 0:  // ANT 1
@@ -908,7 +926,7 @@ void ozy_send_buffer() {
       output_buffer[C4]=txFrequency;
       break;
     case 2: // rx frequency
-      output_buffer[C0]=0x04;
+      output_buffer[C0]=0x04+(current_rx*2);
       long long rxFrequency=ddsFrequency+(long long)rit;
       if(mode==modeCWU) {
         rxFrequency-=(long long)cw_keyer_sidetone_frequency;
@@ -919,6 +937,10 @@ void ozy_send_buffer() {
       output_buffer[C2]=rxFrequency>>16;
       output_buffer[C3]=rxFrequency>>8;
       output_buffer[C4]=rxFrequency;
+      current_rx++;
+      if(current_rx==RECEIVERS) {
+        current_rx=0;
+      }
       break;
     case 3:
       {
diff --git a/pihpsdr b/pihpsdr
index 16c0ab8335389165737e10e7ba42bba30ef60587..23dc59a6df3185bf5460544b1345bef5a00a782e 100755 (executable)
Binary files a/pihpsdr and b/pihpsdr differ
diff --git a/radio.c b/radio.c
index 15f750d36a42208d1b92d1dd9bb042377f61f0f6..985086fe7e62100eb1417c84c1dffbb116666df9 100644 (file)
--- a/radio.c
+++ b/radio.c
@@ -128,7 +128,7 @@ double drive=50;
 int drive_level=0;
 int tune_drive_level=0;
 
-int receivers=2;
+int receivers=RECEIVERS;
 int adc[2]={0,1};
 
 int locked=0;
diff --git a/radio.h b/radio.h
index 86a4558638f7304b16f5f23b294f479bf56d12e6..19ad1d4ed618dd11d2627cedd916cb2de23bfff2 100644 (file)
--- a/radio.h
+++ b/radio.h
@@ -51,6 +51,7 @@ extern char property_path[];
 #define ALEX 1
 #define APOLLO 2
 
+#define RECEIVERS 2
 /*
 #define PA_DISABLED 0
 #define PA_ENABLED 1
index ec7ccaa083d10b1221f46f379060b80e8e824071..901e40a63772e3ee04fcdc749ea8f873700e630f 100644 (file)
Binary files a/release/pihpsdr.tar and b/release/pihpsdr.tar differ
index 16c0ab8335389165737e10e7ba42bba30ef60587..23dc59a6df3185bf5460544b1345bef5a00a782e 100755 (executable)
Binary files a/release/pihpsdr/pihpsdr and b/release/pihpsdr/pihpsdr differ
index 0538f3b2339f7664814bc9957aa12b227bb46ae4..337aa7b8386175010220db40e7cc621e55b7524e 100644 (file)
--- a/version.c
+++ b/version.c
@@ -20,4 +20,4 @@
 char build_date[]=GIT_DATE;
 char build_version[]=GIT_VERSION;
 
-char version[]="1.0.0";
+char version[]="1.0.1";
diff --git a/xvtr.h b/xvtr.h
index 697b1c21bbf3f09fd551ea744f3d91d944a8238b..f94ab491bf57cd35041bf8eaf1cd5f0b5988e23a 100644 (file)
--- a/xvtr.h
+++ b/xvtr.h
 #ifndef _XVTR_H
 #define _XVTR_H
 
+#include "bandstack.h"
+
+#define XVTRS 8
+
 /* --------------------------------------------------------------------------*/
 /**
 * @brief XVTR definition
 */
 struct _XVTR_ENTRY {
-    char name[32];
-    long long rxFrequency;
-    long long rxFrequencyMin;
-    long long rxFrequencyMax;
-    long long rxFrequencyLO;
-    long long txFrequency;
-    long long txFrequencyMin;
-    long long txFrequencyMax;
-    long long txFrequencyLO;
-    int fullDuplex;
-    int mode;
-    int filter;
-    int var1Low;
-    int var1High;
-    int var2Low;
-    int var2High;
-    int step;
+    char title[16];
+    BANDSTACK *bandstack;
+    unsigned char OCrx;
+    unsigned char OCtx;
     int preamp;
     int alexRxAntenna;
     int alexTxAntenna;
     int alexAttenuation;
+    double pa_calibration;
+    long long frequencyMin;
+    long long frequencyMax;
+    long long frequencyLO;
 };
 
 typedef struct _XVTR_ENTRY XVTR_ENTRY;