]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
added open collector configuration, filled panadapter, wdsp options for display
authorJohn Melton g0orx/n6lyt <john.d.melton@googlemail.com>
Thu, 7 Apr 2016 11:17:55 +0000 (11:17 +0000)
committerJohn Melton g0orx/n6lyt <john.d.melton@googlemail.com>
Thu, 7 Apr 2016 11:17:55 +0000 (11:17 +0000)
14 files changed:
band.c
gpio.c
main.c
menu.c
old_protocol.c
panadapter.c
pihpsdr [new file with mode: 0755]
radio.c
radio.h
release/pihpsdr.tar
release/pihpsdr/pihpsdr
toolbar.c
vfo.c
wdsp_init.c

diff --git a/band.c b/band.c
index d023d04678acd3be62ae54a2bb02519d71441af0..fc35dd29d98b0cb7a83f798565e87a4fe4acc96c 100644 (file)
--- a/band.c
+++ b/band.c
@@ -264,6 +264,14 @@ void bandSaveState() {
         sprintf(name,"band.%d.pa_calibration",b);
         setProperty(name,value);
 
+        sprintf(value,"%d",bands[b].OCrx);
+        sprintf(name,"band.%d.OCrx",b);
+        setProperty(name,value);
+
+        sprintf(value,"%d",bands[b].OCtx);
+        sprintf(name,"band.%d.OCtx",b);
+        setProperty(name,value);
+
         for(stack=0;stack<bands[b].bandstack->entries;stack++) {
             entry=bands[b].bandstack->entry;
             entry+=stack;
@@ -342,6 +350,14 @@ void bandRestoreState() {
         value=getProperty(name);
         if(value) bands[b].pa_calibration=atoi(value);
 
+        sprintf(name,"band.%d.OCrx",b);
+        value=getProperty(name);
+        if(value) bands[b].OCrx=atoi(value);
+
+        sprintf(name,"band.%d.OCtx",b);
+        value=getProperty(name);
+        if(value) bands[b].OCtx=atoi(value);
+
         for(stack=0;stack<bands[b].bandstack->entries;stack++) {
             entry=bands[b].bandstack->entry;
             entry+=stack;
diff --git a/gpio.c b/gpio.c
index ccc35bad811d75ec5ba20b2f05cb793552018b1f..06355af8184a5bb7b9480b29cee76f7736e54530 100644 (file)
--- a/gpio.c
+++ b/gpio.c
@@ -24,6 +24,7 @@
 #include "toolbar.h"
 #include "main.h"
 #include "property.h"
+#include "wdsp.h"
 
 #define SYSFS_GPIO_DIR  "/sys/class/gpio"
 
@@ -963,12 +964,18 @@ fprintf(stderr,"noise_pressed\n");
   if(function) {
     if(nr) {
       nr=0;
-    } else if(nb) {
+    } else if(nr2) {
+      nr2=0;
       nr=1;
+    } else if(nb) {
       nb=0;
-    } else if(anf) {
+      nr2=1;
+    } else if(nb2) {
+      nb2=0;
       nb=1;
+    } else if(anf) {
       anf=0;
+      nb2=1;
     } else if(snb) {
       snb=0;
       anf=1;
@@ -978,9 +985,15 @@ fprintf(stderr,"noise_pressed\n");
   } else {
     if(nr) {
       nr=0;
+      nr2=1;
+    } else if(nr2) {
+      nr2=0;
       nb=1;
     } else if(nb) {
       nb=0;
+      nb2=1;
+    } else if(nb2) {
+      nb2=0;
       anf=1;
     } else if(anf) {
       anf=0;
@@ -992,6 +1005,7 @@ fprintf(stderr,"noise_pressed\n");
     }
   }
   SetRXAANRRun(CHANNEL_RX0, nr);
+  SetRXAEMNRaeRun(CHANNEL_RX0, nb2);
   SetRXAEMNRRun(CHANNEL_RX0, nb);
   SetRXAANFRun(CHANNEL_RX0, anf);
   SetRXASNBARun(CHANNEL_RX0, snb);
diff --git a/main.c b/main.c
index ab7183b63e561395423326438c785e2b083ded4c..1d71259f1a40004297ca588179e677d80e26e53e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -63,7 +63,6 @@ gint display_width;
 gint display_height;
 
 static gint update_timer_id;
-static gint updates_per_second=10;
 
 static gint save_timer_id;
 
diff --git a/menu.c b/menu.c
index 317d8677900e54eb075ca8914adf9ebe13930d91..ae468122558dd975947c94d5a0f4a66cb89be80c 100644 (file)
--- a/menu.c
+++ b/menu.c
 #include <stdio.h>
 
 #include "band.h"
+#include "channel.h"
 #include "discovered.h"
 #include "new_protocol.h"
 #include "radio.h"
 #include "version.h"
+#include "wdsp.h"
 
 static GtkWidget *parent_window;
 
@@ -180,12 +182,58 @@ static gboolean exit_pressed_event_cb (GtkWidget *widget,
   _exit(0);
 }
 
+static void oc_rx_cb(GtkWidget *widget, gpointer data) {
+  int b=((int)data)>>4;
+  int oc=((int)data)&0xF;
+  BAND *band=band_get_band(b);
+  int mask=0x01<<oc;
+  if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
+    band->OCrx|=mask;
+  } else {
+    band->OCrx&=~mask;
+  }
+}
+
+static void oc_tx_cb(GtkWidget *widget, gpointer data) {
+  int b=((int)data)>>4;
+  int oc=((int)data)&0xF;
+  BAND *band=band_get_band(b);
+  int mask=0x01<<oc;
+  if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
+    band->OCtx|=mask;
+  } else {
+    band->OCtx&=~mask;
+  }
+}
+
+static void detector_mode_cb(GtkWidget *widget, gpointer data) {
+  display_detector_mode=(int)data;
+  SetDisplayDetectorMode(CHANNEL_RX0, 0, display_detector_mode);
+}
+
+static void average_mode_cb(GtkWidget *widget, gpointer data) {
+  display_average_mode=(int)data;
+  SetDisplayAverageMode(CHANNEL_RX0, 0, display_average_mode);
+}
+
+static void time_value_changed_cb(GtkWidget *widget, gpointer data) {
+  display_average_time=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
+  calculate_display_average();
+  SetDisplayAvBackmult(CHANNEL_RX0, 0, display_avb);
+  SetDisplayNumAverage(CHANNEL_RX0, 0, display_average);
+
+}
+
+static void filled_cb(GtkWidget *widget, gpointer data) {
+  display_filled=display_filled==1?0:1;
+}
+
+
 static gboolean menu_pressed_event_cb (GtkWidget *widget,
                GdkEventButton *event,
                gpointer        data)
 {
-  int i;
-  int id;
+  int i, j, id;
 
   GtkWidget *dialog=gtk_dialog_new_with_buttons("Menu",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL);
 
@@ -200,6 +248,13 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget,
   GtkWidget *display_grid=gtk_grid_new();
   gtk_grid_set_row_homogeneous(GTK_GRID(display_grid),TRUE);
 
+  GtkWidget *filled_b=gtk_check_button_new_with_label("Filled");
+  //gtk_widget_override_font(filled_b, pango_font_description_from_string("Arial 18"));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (filled_b), display_filled);
+  gtk_widget_show(filled_b);
+  gtk_grid_attach(GTK_GRID(display_grid),filled_b,0,0,1,1);
+  g_signal_connect(filled_b,"toggled",G_CALLBACK(filled_cb),NULL);
+
   GtkWidget *panadapter_high_label=gtk_label_new("Panadapter High: ");
   //gtk_widget_override_font(panadapter_high_label, pango_font_description_from_string("Arial 18"));
   gtk_widget_show(panadapter_high_label);
@@ -260,6 +315,77 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget,
   gtk_grid_attach(GTK_GRID(display_grid),waterfall_low_r,1,5,1,1);
   g_signal_connect(waterfall_low_r,"value_changed",G_CALLBACK(waterfall_low_value_changed_cb),NULL);
 
+  GtkWidget *detector_mode_label=gtk_label_new("Detector: ");
+  //gtk_widget_override_font(detector_mode_label, pango_font_description_from_string("Arial 18"));
+  gtk_widget_show(detector_mode_label);
+  gtk_grid_attach(GTK_GRID(display_grid),detector_mode_label,3,0,1,1);
+
+  GtkWidget *detector_mode_peak=gtk_radio_button_new_with_label(NULL,"Peak");
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (detector_mode_peak), display_detector_mode==DETECTOR_MODE_PEAK);
+  gtk_widget_show(detector_mode_peak);
+  gtk_grid_attach(GTK_GRID(display_grid),detector_mode_peak,4,0,1,1);
+  g_signal_connect(detector_mode_peak,"pressed",G_CALLBACK(detector_mode_cb),(gpointer *)DETECTOR_MODE_PEAK);
+
+  GtkWidget *detector_mode_rosenfell=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(detector_mode_peak),"Rosenfell");
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (detector_mode_rosenfell), display_detector_mode==DETECTOR_MODE_ROSENFELL);
+  gtk_widget_show(detector_mode_rosenfell);
+  gtk_grid_attach(GTK_GRID(display_grid),detector_mode_rosenfell,4,1,1,1);
+  g_signal_connect(detector_mode_rosenfell,"pressed",G_CALLBACK(detector_mode_cb),(gpointer *)DETECTOR_MODE_ROSENFELL);
+
+  GtkWidget *detector_mode_average=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(detector_mode_rosenfell),"Average");
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (detector_mode_average), display_detector_mode==DETECTOR_MODE_AVERAGE);
+  gtk_widget_show(detector_mode_average);
+  gtk_grid_attach(GTK_GRID(display_grid),detector_mode_average,4,2,1,1);
+  g_signal_connect(detector_mode_average,"pressed",G_CALLBACK(detector_mode_cb),(gpointer *)DETECTOR_MODE_AVERAGE);
+
+  GtkWidget *detector_mode_sample=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(detector_mode_average),"Sample");
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (detector_mode_sample), display_detector_mode==DETECTOR_MODE_SAMPLE);
+  gtk_widget_show(detector_mode_sample);
+  gtk_grid_attach(GTK_GRID(display_grid),detector_mode_sample,4,3,1,1);
+  g_signal_connect(detector_mode_sample,"pressed",G_CALLBACK(detector_mode_cb),(gpointer *)DETECTOR_MODE_SAMPLE);
+
+
+  GtkWidget *average_mode_label=gtk_label_new("Averaging: ");
+  //gtk_widget_override_font(average_mode_label, pango_font_description_from_string("Arial 18"));
+  gtk_widget_show(average_mode_label);
+  gtk_grid_attach(GTK_GRID(display_grid),average_mode_label,3,4,1,1);
+
+  GtkWidget *average_mode_none=gtk_radio_button_new_with_label(NULL,"None");
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (average_mode_none), display_detector_mode==AVERAGE_MODE_NONE);
+  gtk_widget_show(average_mode_none);
+  gtk_grid_attach(GTK_GRID(display_grid),average_mode_none,4,4,1,1);
+  g_signal_connect(average_mode_none,"pressed",G_CALLBACK(average_mode_cb),(gpointer *)AVERAGE_MODE_NONE);
+
+  GtkWidget *average_mode_recursive=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(average_mode_none),"Recursive");
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (average_mode_recursive), display_average_mode==AVERAGE_MODE_RECURSIVE);
+  gtk_widget_show(average_mode_recursive);
+  gtk_grid_attach(GTK_GRID(display_grid),average_mode_recursive,4,5,1,1);
+  g_signal_connect(average_mode_recursive,"pressed",G_CALLBACK(average_mode_cb),(gpointer *)AVERAGE_MODE_RECURSIVE);
+
+  GtkWidget *average_mode_time_window=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(average_mode_recursive),"Time Window");
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (average_mode_time_window), display_average_mode==AVERAGE_MODE_TIME_WINDOW);
+  gtk_widget_show(average_mode_time_window);
+  gtk_grid_attach(GTK_GRID(display_grid),average_mode_time_window,4,6,1,1);
+  g_signal_connect(average_mode_time_window,"pressed",G_CALLBACK(average_mode_cb),(gpointer *)AVERAGE_MODE_TIME_WINDOW);
+
+  GtkWidget *average_mode_log_recursive=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(average_mode_time_window),"Log Recursive");
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (average_mode_log_recursive), display_average_mode==AVERAGE_MODE_LOG_RECURSIVE);
+  gtk_widget_show(average_mode_log_recursive);
+  gtk_grid_attach(GTK_GRID(display_grid),average_mode_log_recursive,4,7,1,1);
+  g_signal_connect(average_mode_log_recursive,"pressed",G_CALLBACK(average_mode_cb),(gpointer *)AVERAGE_MODE_LOG_RECURSIVE);
+
+
+  GtkWidget *time_label=gtk_label_new("Time (ms): ");
+  //gtk_widget_override_font(average_mode_label, pango_font_description_from_string("Arial 18"));
+  gtk_widget_show(time_label);
+  gtk_grid_attach(GTK_GRID(display_grid),time_label,3,8,1,1);
+
+  GtkWidget *time_r=gtk_spin_button_new_with_range(1.0,9999.0,1.0);
+  gtk_spin_button_set_value(GTK_SPIN_BUTTON(time_r),(double)display_average_time);
+  gtk_widget_show(time_r);
+  gtk_grid_attach(GTK_GRID(display_grid),time_r,4,8,1,1);
+  g_signal_connect(time_r,"value_changed",G_CALLBACK(time_value_changed_cb),NULL);
+
   id=gtk_notebook_append_page(GTK_NOTEBOOK(notebook),display_grid,display_label);
 
 
@@ -299,49 +425,49 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget,
   gtk_grid_set_row_homogeneous(GTK_GRID(cw_grid),TRUE);
 
   GtkWidget *cw_keyer_internal_b=gtk_check_button_new_with_label("CW Internal - Speed (WPM)");
-  gtk_widget_override_font(cw_keyer_internal_b, pango_font_description_from_string("Arial 18"));
+  //gtk_widget_override_font(cw_keyer_internal_b, pango_font_description_from_string("Arial 18"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw_keyer_internal_b), cw_keyer_internal);
   gtk_widget_show(cw_keyer_internal_b);
   gtk_grid_attach(GTK_GRID(cw_grid),cw_keyer_internal_b,0,0,1,1);
   g_signal_connect(cw_keyer_internal_b,"toggled",G_CALLBACK(cw_keyer_internal_cb),NULL);
 
   GtkWidget *cw_keyer_speed_b=gtk_spin_button_new_with_range(1.0,60.0,1.0);
-  gtk_widget_override_font(cw_keyer_speed_b, pango_font_description_from_string("Arial 18"));
+  //gtk_widget_override_font(cw_keyer_speed_b, pango_font_description_from_string("Arial 18"));
   gtk_spin_button_set_value(GTK_SPIN_BUTTON(cw_keyer_speed_b),(double)cw_keyer_speed);
   gtk_widget_show(cw_keyer_speed_b);
   gtk_grid_attach(GTK_GRID(cw_grid),cw_keyer_speed_b,1,0,1,1);
   g_signal_connect(cw_keyer_speed_b,"value_changed",G_CALLBACK(cw_keyer_speed_value_changed_cb),NULL);
 
   GtkWidget *cw_breakin_b=gtk_check_button_new_with_label("CW Break In - Delay (ms)");
-  gtk_widget_override_font(cw_breakin_b, pango_font_description_from_string("Arial 18"));
+  //gtk_widget_override_font(cw_breakin_b, pango_font_description_from_string("Arial 18"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw_breakin_b), cw_breakin);
   gtk_widget_show(cw_breakin_b);
   gtk_grid_attach(GTK_GRID(cw_grid),cw_breakin_b,0,1,1,1);
   g_signal_connect(cw_breakin_b,"toggled",G_CALLBACK(cw_breakin_cb),NULL);
 
   GtkWidget *cw_keyer_hang_time_b=gtk_spin_button_new_with_range(0.0,1000.0,1.0);
-  gtk_widget_override_font(cw_keyer_hang_time_b, pango_font_description_from_string("Arial 18"));
+  //gtk_widget_override_font(cw_keyer_hang_time_b, pango_font_description_from_string("Arial 18"));
   gtk_spin_button_set_value(GTK_SPIN_BUTTON(cw_keyer_hang_time_b),(double)cw_keyer_hang_time);
   gtk_widget_show(cw_keyer_hang_time_b);
   gtk_grid_attach(GTK_GRID(cw_grid),cw_keyer_hang_time_b,1,1,1,1);
   g_signal_connect(cw_keyer_hang_time_b,"value_changed",G_CALLBACK(cw_keyer_hang_time_value_changed_cb),NULL);
  
   GtkWidget *cw_keyer_straight=gtk_radio_button_new_with_label(NULL,"CW KEYER STRAIGHT");
-  gtk_widget_override_font(cw_keyer_straight, pango_font_description_from_string("Arial 18"));
+  //gtk_widget_override_font(cw_keyer_straight, pango_font_description_from_string("Arial 18"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw_keyer_straight), cw_keyer_mode==KEYER_STRAIGHT);
   gtk_widget_show(cw_keyer_straight);
   gtk_grid_attach(GTK_GRID(cw_grid),cw_keyer_straight,0,2,1,1);
   g_signal_connect(cw_keyer_straight,"pressed",G_CALLBACK(cw_keyer_mode_cb),(gpointer *)KEYER_STRAIGHT);
 
   GtkWidget *cw_keyer_mode_a=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(cw_keyer_straight),"CW KEYER MODE A");
-  gtk_widget_override_font(cw_keyer_mode_a, pango_font_description_from_string("Arial 18"));
+  //gtk_widget_override_font(cw_keyer_mode_a, pango_font_description_from_string("Arial 18"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw_keyer_mode_a), cw_keyer_mode==KEYER_MODE_A);
   gtk_widget_show(cw_keyer_mode_a);
   gtk_grid_attach(GTK_GRID(cw_grid),cw_keyer_mode_a,0,3,1,1);
   g_signal_connect(cw_keyer_mode_a,"pressed",G_CALLBACK(cw_keyer_mode_cb),(gpointer *)KEYER_MODE_A);
 
   GtkWidget *cw_keyer_mode_b=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(cw_keyer_mode_a),"CW KEYER MODE B");
-  gtk_widget_override_font(cw_keyer_mode_b, pango_font_description_from_string("Arial 18"));
+  //gtk_widget_override_font(cw_keyer_mode_b, pango_font_description_from_string("Arial 18"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw_keyer_mode_b), cw_keyer_mode==KEYER_MODE_B);
   gtk_widget_show(cw_keyer_mode_b);
   gtk_grid_attach(GTK_GRID(cw_grid),cw_keyer_mode_b,0,4,1,1);
@@ -355,12 +481,12 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget,
   gtk_grid_set_row_homogeneous(GTK_GRID(encoder_grid),TRUE);
 
   GtkWidget *vfo_divisor_label=gtk_label_new("Divisor: ");
-  gtk_widget_override_font(vfo_divisor_label, pango_font_description_from_string("Arial 18"));
+  //gtk_widget_override_font(vfo_divisor_label, pango_font_description_from_string("Arial 18"));
   gtk_widget_show(vfo_divisor_label);
   gtk_grid_attach(GTK_GRID(encoder_grid),vfo_divisor_label,0,0,1,1);
 
   GtkWidget *vfo_divisor=gtk_spin_button_new_with_range(1.0,60.0,1.0);
-  gtk_widget_override_font(vfo_divisor, pango_font_description_from_string("Arial 18"));
+  //gtk_widget_override_font(vfo_divisor, pango_font_description_from_string("Arial 18"));
   gtk_spin_button_set_value(GTK_SPIN_BUTTON(vfo_divisor),(double)vfo_encoder_divisor);
   gtk_widget_show(vfo_divisor);
   gtk_grid_attach(GTK_GRID(encoder_grid),vfo_divisor,1,0,1,1);
@@ -455,6 +581,69 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget,
 
   id=gtk_notebook_append_page(GTK_NOTEBOOK(notebook),filters_grid,filters_label);
 
+  GtkWidget *oc_label=gtk_label_new("OC");
+  GtkWidget *oc_grid=gtk_grid_new();
+  gtk_grid_set_row_homogeneous(GTK_GRID(oc_grid),TRUE);
+  gtk_grid_set_column_spacing (GTK_GRID(oc_grid),15);
+
+  GtkWidget *band_title=gtk_label_new("Band");
+  //gtk_widget_override_font(band_title, pango_font_description_from_string("Arial 18"));
+  gtk_widget_show(band_title);
+  gtk_grid_attach(GTK_GRID(oc_grid),band_title,0,0,1,1);
+
+  GtkWidget *rx_title=gtk_label_new("Rx");
+  //gtk_widget_override_font(rx_title, pango_font_description_from_string("Arial 18"));
+  gtk_widget_show(rx_title);
+  gtk_grid_attach(GTK_GRID(oc_grid),rx_title,4,0,1,1);
+
+  GtkWidget *tx_title=gtk_label_new("Tx");
+  //gtk_widget_override_font(tx_title, pango_font_description_from_string("Arial 18"));
+  gtk_widget_show(tx_title);
+  gtk_grid_attach(GTK_GRID(oc_grid),tx_title,11,0,1,1);
+
+  for(i=1;i<8;i++) {
+    char oc_id[8];
+    sprintf(oc_id,"%d",i);
+    GtkWidget *oc_rx_title=gtk_label_new(oc_id);
+    //gtk_widget_override_font(oc_rx_title, pango_font_description_from_string("Arial 18"));
+    gtk_widget_show(oc_rx_title);
+    gtk_grid_attach(GTK_GRID(oc_grid),oc_rx_title,i,1,1,1);
+    GtkWidget *oc_tx_title=gtk_label_new(oc_id);
+    //gtk_widget_override_font(oc_tx_title, pango_font_description_from_string("Arial 18"));
+    gtk_widget_show(oc_tx_title);
+    gtk_grid_attach(GTK_GRID(oc_grid),oc_tx_title,i+7,1,1,1);
+  }
+
+  for(i=0;i<HAM_BANDS;i++) {
+    BAND *band=band_get_band(i);
+
+    GtkWidget *band_label=gtk_label_new(band->title);
+    //gtk_widget_override_font(band_label, pango_font_description_from_string("Arial 18"));
+    gtk_widget_show(band_label);
+    gtk_grid_attach(GTK_GRID(oc_grid),band_label,0,i+2,1,1);
+
+    int mask;
+    for(j=1;j<8;j++) {
+      mask=0x01<<j;
+      GtkWidget *oc_rx_b=gtk_check_button_new();
+      //gtk_widget_override_font(oc_rx_b, pango_font_description_from_string("Arial 18"));
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (oc_rx_b), (band->OCrx&mask)==mask);
+      gtk_widget_show(oc_rx_b);
+      gtk_grid_attach(GTK_GRID(oc_grid),oc_rx_b,j,i+2,1,1);
+      g_signal_connect(oc_rx_b,"toggled",G_CALLBACK(oc_rx_cb),(gpointer)(j+(i<<4)));
+
+      GtkWidget *oc_tx_b=gtk_check_button_new();
+      //gtk_widget_override_font(oc_tx_b, pango_font_description_from_string("Arial 18"));
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (oc_tx_b), (band->OCtx&mask)==mask);
+      gtk_widget_show(oc_tx_b);
+      gtk_grid_attach(GTK_GRID(oc_grid),oc_tx_b,j+7,i+2,1,1);
+      g_signal_connect(oc_tx_b,"toggled",G_CALLBACK(oc_tx_cb),(gpointer)(j+(i<<4)));
+    }
+  }
+
+
+  id=gtk_notebook_append_page(GTK_NOTEBOOK(notebook),oc_grid,oc_label);
+
 
   GtkWidget *exit_label=gtk_label_new("Exit");
   GtkWidget *exit_grid=gtk_grid_new();
index 9be6c60510efda4dbfa46f161c5312b1a020f9ec..ed4b35f9b8e31b8082e5873593c3b49d21ff9233 100644 (file)
@@ -628,11 +628,18 @@ void ozy_send_buffer() {
 #endif
 
     case 0:
+      {
+      BAND *band=band_get_current_band();
       output_buffer[3]=control_out[0];
       output_buffer[4]=control_out[1];
-      output_buffer[5]=control_out[2];
+      if(isTransmitting()) {
+        output_buffer[5]=control_out[2]|band->OCtx;
+      } else {
+        output_buffer[5]=control_out[2]|band->OCrx;
+      }
       output_buffer[6]=control_out[3];
       output_buffer[7]=control_out[4];
+      }
       break;
     case 1:
       output_buffer[3]=control_out[0]|0x04;
index 4d50c379954499f61cb7cfda84c6f6de2eecbfc1..57414635ed443ed811bbf2960b20428364d29091 100644 (file)
@@ -229,13 +229,15 @@ void panadapter_update(float *data,int tx) {
             // plot frequency markers
             long f;
             long half=(long)getSampleRate()/2L;
+            cairo_text_extents_t extents;
             for(i=0;i<display_width;i++) {
                 f = getFrequency() - half + (long) (hz_per_pixel * i);
                 if (f > 0) {
                     if ((f % 20000) < (long) hz_per_pixel) {
                         cairo_set_source_rgb (cr, 0, 1, 1);
                         cairo_set_line_width(cr, 1.0);
-                        cairo_move_to(cr,(double)i,0.0);
+                        //cairo_move_to(cr,(double)i,0.0);
+                        cairo_move_to(cr,(double)i,10.0);
                         cairo_line_to(cr,(double)i,(double)panadapter_height);
 
                         cairo_set_source_rgb (cr, 0, 1, 1);
@@ -245,7 +247,9 @@ void panadapter_update(float *data,int tx) {
                         cairo_set_font_size(cr, 12);
                         char v[32];
                         sprintf(v,"%0ld.%03ld",f/1000000,(f%1000000)/1000);
-                        cairo_move_to(cr, (double)i, (double)(panadapter_height-10));  
+                        //cairo_move_to(cr, (double)i, (double)(panadapter_height-10));  
+                        cairo_text_extents(cr, v, &extents);
+                        cairo_move_to(cr, (double)i-(extents.width/2.0), 10.0);  
                         cairo_show_text(cr, v);
                     }
                 }
@@ -279,27 +283,29 @@ void panadapter_update(float *data,int tx) {
             cairo_stroke(cr);
 
             // signal
-            cairo_set_source_rgb(cr, 1, 1, 1);
-            cairo_set_line_width(cr, 1.0);
-
             double s1,s2;
             samples[0]=panadapter_low-20;
             samples[display_width-1]=panadapter_low-20;
+            s1=samples[0]-(get_attenuation()-20.0);
+            s1 = floor((panadapter_high - s1)
+                        * (double) panadapter_height
+                        / (panadapter_high - panadapter_low));
+            cairo_move_to(cr, 0.0, s1);
             for(i=1;i<display_width;i++) {
-                s1=samples[i-1]+get_attenuation();
-                s1 = floor((panadapter_high - s1)
-                            * (double) panadapter_height
-                            / (panadapter_high - panadapter_low));
-                s2=samples[i]+get_attenuation();
+                s2=samples[i]-(get_attenuation()-20.0);
                 s2 = floor((panadapter_high - s2)
                             * (double) panadapter_height
                             / (panadapter_high - panadapter_low));
-                cairo_move_to(cr, (double)i-1, s1);
                 cairo_line_to(cr, (double)i, s2);
             }
+            if(display_filled) {
+              cairo_close_path (cr);
+              cairo_set_source_rgba(cr, 1, 1, 1,0.5);
+              cairo_fill_preserve (cr);
+            }
+            cairo_set_source_rgb(cr, 1, 1, 1);
+            cairo_set_line_width(cr, 1.0);
             cairo_stroke(cr);
-            //cairo_close_path(cr);
-            //cairo_fill(cr);
 
             cairo_destroy (cr);
             gtk_widget_queue_draw (panadapter);
diff --git a/pihpsdr b/pihpsdr
new file mode 100755 (executable)
index 0000000..0de5af7
Binary files /dev/null and b/pihpsdr differ
diff --git a/radio.c b/radio.c
index 3dcff68c5852ff2728090e236301d7c5c77c3f8d..d51589225bf538c3c4bc0215a80e93e137cbc4f0 100644 (file)
--- a/radio.c
+++ b/radio.c
@@ -21,6 +21,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <semaphore.h>
+#include <math.h>
 
 #include "radio.h"
 #include "agc.h"
 #include "discovered.h"
 #include "property.h"
 #include "new_protocol.h"
+#include "wdsp.h"
+
+#define min(x,y) (x<y?x:y)
+#define max(x,y) (x<y?y:x)
 
 char property_path[128];
 sem_t property_sem;
@@ -41,10 +46,20 @@ int filter_board=ALEX;
 int pa=PA_ENABLED;
 int apollo_tuner=0;
 
+int updates_per_second=10;
+
 int display_panadapter=1;
 int panadapter_high=-60;
 int panadapter_low=-140;
 
+int display_filled=1;
+int display_detector_mode=DETECTOR_MODE_AVERAGE;
+int display_average_mode=AVERAGE_MODE_LOG_RECURSIVE;
+int display_average_time=120;
+double display_avb;
+double display_average;
+
+
 int display_waterfall=1;
 int waterfall_high=-100;
 int waterfall_low=-150;
@@ -66,7 +81,9 @@ int agc=AGC_MEDIUM;
 double agc_gain=60.0;
 
 int nr=0;
+int nr2=0;
 int nb=0;
+int nb2=0;
 int anf=0;
 int snb=0;
 
@@ -266,8 +283,14 @@ void radioRestoreState() {
     if(value) apollo_tuner=atoi(value);
     value=getProperty("pa");
     if(value) pa=atoi(value);
+    value=getProperty("updates_per_second");
+    if(value) updates_per_second=atoi(value);
     value=getProperty("display_panadapter");
     if(value) display_panadapter=atoi(value);
+    value=getProperty("display_detector_mode");
+    if(value) display_detector_mode=atoi(value);
+    value=getProperty("display_average_mode");
+    if(value) display_average_mode=atoi(value);
     value=getProperty("panadapter_high");
     if(value) panadapter_high=atoi(value);
     value=getProperty("panadapter_low");
@@ -359,8 +382,14 @@ void radioSaveState() {
     setProperty("apollo_tuner",value);
     sprintf(value,"%d",pa);
     setProperty("pa",value);
+    sprintf(value,"%d",updates_per_second);
+    setProperty("updates_per_second",value);
     sprintf(value,"%d",display_panadapter);
     setProperty("display_panadapter",value);
+    sprintf(value,"%d",display_detector_mode);
+    setProperty("display_detector_mode",value);
+    sprintf(value,"%d",display_average_mode);
+    setProperty("display_average_mode",value);
     sprintf(value,"%d",panadapter_high);
     setProperty("panadapter_high",value);
     sprintf(value,"%d",panadapter_low);
@@ -441,3 +470,8 @@ void radioSaveState() {
     saveProperties(property_path);
     sem_post(&property_sem);
 }
+
+void calculate_display_average() {
+  double display_avb = exp(-1.0 / (updates_per_second * display_average_time));
+  int display_average = max(2, (int)min(60, updates_per_second * display_average_time));
+}
diff --git a/radio.h b/radio.h
index 87d1b696d46db14220b2abb0f336c7224eb4f6f7..b81293d82c2d3bfe28b3e3fec107e3311ba2a8cd 100644 (file)
--- a/radio.h
+++ b/radio.h
@@ -63,10 +63,19 @@ extern int filter_board;
 extern int pa;
 extern int apollo_tuner;
 
+extern int updates_per_second;
 extern int display_panadapter;
 extern int panadapter_high;
 extern int panadapter_low;
 
+extern int display_filled;
+extern int display_detector_mode;
+extern int display_average_mode;
+extern int display_average_time;
+extern double display_avb;
+extern double display_average;
+
+
 extern int display_waterfall;
 extern int waterfall_high;
 extern int waterfall_low;
@@ -81,7 +90,9 @@ extern int agc;
 extern double agc_gain;
 
 extern int nr;
+extern int nr2;
 extern int nb;
+extern int nb2;
 extern int anf;
 extern int snb;
 
@@ -177,3 +188,4 @@ extern long long getFrequency();
 extern void radioRestoreState();
 extern void radioSaveState();
 
+extern void calculate_display_average();
index 22c46e80b6df19144fcd29d984cab68d94e4d624..f0bbb61edcde53e787d3e814210c9e288374878f 100644 (file)
Binary files a/release/pihpsdr.tar and b/release/pihpsdr.tar differ
index 58d70fc0e0b31f4a3dbd4fd5df71fbdffe3524c1..0de5af7996ce953b85d65e1d5e19bcc04f922f71 100755 (executable)
Binary files a/release/pihpsdr/pihpsdr and b/release/pihpsdr/pihpsdr differ
index b3ca9a48260b870cd9cca1648e9bb309c66d2d06..b4d6c79a33ad30c5a12a60a232af8149660967fc 100644 (file)
--- a/toolbar.c
+++ b/toolbar.c
@@ -376,11 +376,21 @@ static void nr_cb(GtkWidget *widget, gpointer data) {
   SetRXAANRRun(CHANNEL_RX0, nr);
 }
 
+static void nr2_cb(GtkWidget *widget, gpointer data) {
+  nr2=nr2==0?1:0;
+  //SetRXAANRaeRun(CHANNEL_RX0, nr2);
+}
+
 static void nb_cb(GtkWidget *widget, gpointer data) {
   nb=nb==0?1:0;
   SetRXAEMNRRun(CHANNEL_RX0, nb);
 }
 
+static void nb2_cb(GtkWidget *widget, gpointer data) {
+  nb2=nb2==0?1:0;
+  SetRXAEMNRaeRun(CHANNEL_RX0, nb2);
+}
+
 static void anf_cb(GtkWidget *widget, gpointer data) {
   anf=anf==0?1:0;
   SetRXAANFRun(CHANNEL_RX0, anf);
@@ -443,25 +453,39 @@ static void audio_cb(GtkWidget *widget, gpointer data) {
   gtk_grid_attach(GTK_GRID(grid),b_nr,2,0,2,1);
   g_signal_connect(b_nr,"toggled",G_CALLBACK(nr_cb),NULL);
 
+  GtkWidget *b_nr2=gtk_check_button_new_with_label("NR2");
+  //gtk_widget_override_font(b_nr2, pango_font_description_from_string("Arial 16"));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_nr2), nr2==1);
+  gtk_widget_show(b_nr2);
+  gtk_grid_attach(GTK_GRID(grid),b_nr2,2,1,2,1);
+  g_signal_connect(b_nr2,"toggled",G_CALLBACK(nr2_cb),NULL);
+
   GtkWidget *b_nb=gtk_check_button_new_with_label("NB");
   //gtk_widget_override_font(b_nb, pango_font_description_from_string("Arial 16"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_nb), nb==1);
   gtk_widget_show(b_nb);
-  gtk_grid_attach(GTK_GRID(grid),b_nb,2,1,2,1);
+  gtk_grid_attach(GTK_GRID(grid),b_nb,2,2,2,1);
   g_signal_connect(b_nb,"toggled",G_CALLBACK(nb_cb),NULL);
 
+  GtkWidget *b_nb2=gtk_check_button_new_with_label("NB2");
+  //gtk_widget_override_font(b_nb2, pango_font_description_from_string("Arial 16"));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_nb2), nb2==1);
+  gtk_widget_show(b_nb2);
+  gtk_grid_attach(GTK_GRID(grid),b_nb2,2,3,2,1);
+  g_signal_connect(b_nb2,"toggled",G_CALLBACK(nb2_cb),NULL);
+
   GtkWidget *b_anf=gtk_check_button_new_with_label("ANF");
   //gtk_widget_override_font(b_anf, pango_font_description_from_string("Arial 16"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_anf), anf==1);
   gtk_widget_show(b_anf);
-  gtk_grid_attach(GTK_GRID(grid),b_anf,2,2,2,1);
+  gtk_grid_attach(GTK_GRID(grid),b_anf,2,4,2,1);
   g_signal_connect(b_anf,"toggled",G_CALLBACK(anf_cb),NULL);
 
-  GtkWidget *b_snb=gtk_check_button_new_with_label("NR2");
+  GtkWidget *b_snb=gtk_check_button_new_with_label("SNB");
   //gtk_widget_override_font(b_snb, pango_font_description_from_string("Arial 16"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_snb), snb==1);
   gtk_widget_show(b_snb);
-  gtk_grid_attach(GTK_GRID(grid),b_snb,2,3,2,1);
+  gtk_grid_attach(GTK_GRID(grid),b_snb,2,5,2,1);
   g_signal_connect(b_snb,"toggled",G_CALLBACK(snb_cb),NULL);
 
   gtk_container_add(GTK_CONTAINER(content),grid);
diff --git a/vfo.c b/vfo.c
index b0ba2616e28c5a86c6060c722286f98073f146a5..bfc2d937d7686ff19d16b06d09e660281ddf54b7 100644 (file)
--- a/vfo.c
+++ b/vfo.c
@@ -165,14 +165,20 @@ int vfo_update(void *data) {
         if(nr) {
           cairo_show_text(cr, "NR");
         }
+        if(nr2) {
+          cairo_show_text(cr, "NR2");
+        }
         if(nb) {
           cairo_show_text(cr, "NB");
         }
+        if(nb2) {
+          cairo_show_text(cr, "NB2");
+        }
         if(anf) {
           cairo_show_text(cr, "ANF");
         }
         if(snb) {
-          cairo_show_text(cr, "NR2");
+          cairo_show_text(cr, "SNB");
         }
 
         cairo_move_to(cr, 310, 50);  
index da15bdaacfd9b5a921c8fd035489896df8409411..4e106168a7efefc13f5a14489042bbf8d4a911c1 100644 (file)
@@ -49,6 +49,8 @@
 #include "wdsp_init.h"
 
 #define PI 3.1415926535897932F
+#define min(x,y) (x<y?x:y)
+#define max(x,y) (x<y?y:x)
 
 static int receiver;
 static int running=0;
@@ -185,6 +187,13 @@ void wdsp_init(int rx,int pixels,int protocol) {
         }
     initAnalyzer(rx,buffer_size);
 
+    SetDisplayDetectorMode(rx, 0, display_detector_mode);
+    SetDisplayAverageMode(rx, 0,  display_average_mode);
+    
+    calculate_display_average();
+    SetDisplayAvBackmult(rx, 0, display_avb);
+    SetDisplayNumAverage(rx, 0, display_average);
+
     while (gtk_events_pending ())
       gtk_main_iteration ();
 
@@ -206,8 +215,10 @@ void wdsp_init(int rx,int pixels,int protocol) {
     SetRXAEMNRaeRun(CHANNEL_RX0, 1);
     SetRXAEMNRPosition(CHANNEL_RX0, 0);
     SetRXAEMNRRun(CHANNEL_RX0, 0);
+    SetRXAEMNRaeRun(CHANNEL_RX0, 0);
     SetRXAANRRun(CHANNEL_RX0, 0);
     SetRXAANFRun(CHANNEL_RX0, 0);
+    SetRXASNBARun(CHANNEL_RX0, 0);
 
     SetTXAMode(CHANNEL_TX, mode);
     SetTXABandpassFreqs(CHANNEL_TX, (double)filterLow, (double)filterHigh);