]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
Reworked AGC
authorJohn Melton - G0ORX/N6LYT <john.d.melton@googlemail.com>
Sun, 14 Aug 2016 16:53:37 +0000 (16:53 +0000)
committerJohn Melton - G0ORX/N6LYT <john.d.melton@googlemail.com>
Sun, 14 Aug 2016 16:53:37 +0000 (16:53 +0000)
13 files changed:
Makefile
band.c
menu.c
old_protocol.c
panadapter.c
pihpsdr
radio.c
radio.h
release/pihpsdr.tar
release/pihpsdr/pihpsdr
toolbar.c
wdsp_init.c
wdsp_init.h

index 92c9f4406d4c8b6f4f74236cfd1daad8aa3aabc7..83f900bf0064fca9ec78ca2018034fd70a2b85f8 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -18,6 +18,9 @@ UNAME_N=raspberrypi
 CC=gcc
 LINK=gcc
 
+# uncomment the line below for various denug facilities
+#DEBUG_OPTION=-D DEBUG
+
 # uncomment the line below for LimeSDR (uncomment line below)
 #LIMESDR_INCLUDE=LIMESDR
 
@@ -90,7 +93,7 @@ else
   gpio.o
 endif
 
-OPTIONS=-g -D $(UNAME_N) $(GPIO_OPTIONS) $(LIMESDR_OPTIONS) $(FREEDV_OPTIONS) $(PSK_OPTIONS) -D GIT_DATE='"$(GIT_DATE)"' -D GIT_VERSION='"$(GIT_VERSION)"' -O3
+OPTIONS=-g -D $(UNAME_N) $(GPIO_OPTIONS) $(LIMESDR_OPTIONS) $(FREEDV_OPTIONS) $(PSK_OPTIONS) -D GIT_DATE='"$(GIT_DATE)"' -D GIT_VERSION='"$(GIT_VERSION)"' $(DEBUG_OPTION) -O3
 
 GTKINCLUDES=`pkg-config --cflags gtk+-3.0`
 GTKLIBS=`pkg-config --libs gtk+-3.0`
diff --git a/band.c b/band.c
index 9667ac8634bcef59c6523d1b6a252f57676c528f..eaf0183329e5d370137d1e9ef2519f71569035e0 100644 (file)
--- a/band.c
+++ b/band.c
@@ -66,6 +66,7 @@ BANDSTACK_ENTRY bandstack_entries30[] =
 
 BANDSTACK_ENTRY bandstack_entries20[] =
     {{14010000LL,modeCWU,filterF0,200,2800,200,2800},
+     {14150000LL,modeUSB,filterF5,200,2800,200,2800},
      {14230000LL,modeUSB,filterF5,200,2800,200,2800},
      {14336000LL,modeUSB,filterF5,200,2800,200,2800}};
 
@@ -164,7 +165,7 @@ BANDSTACK bandstack80={3,1,bandstack_entries80};
 BANDSTACK bandstack60={5,1,bandstack_entries60};
 BANDSTACK bandstack40={3,1,bandstack_entries40};
 BANDSTACK bandstack30={3,1,bandstack_entries30};
-BANDSTACK bandstack20={3,1,bandstack_entries20};
+BANDSTACK bandstack20={4,1,bandstack_entries20};
 BANDSTACK bandstack18={3,1,bandstack_entries18};
 BANDSTACK bandstack15={3,1,bandstack_entries15};
 BANDSTACK bandstack12={3,1,bandstack_entries12};
diff --git a/menu.c b/menu.c
index 51eee5ee4128e8629786c1f85bc72502a0460fc1..91d1c606a36b0d1b4145812299781218ee84c6cb 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -22,6 +22,7 @@
 #include <stdio.h>
 #include <string.h>
 
+#include "agc.h"
 #include "audio.h"
 #include "band.h"
 #include "bandstack.h"
@@ -46,6 +47,32 @@ static GtkWidget *menu;
 static GtkWidget *ant_grid;
 static gint ant_id=-1;
 
+#ifdef DEBUG
+static void scale_value_changed_cb(GtkWidget *widget, gpointer data) {
+  scale=(int)gtk_range_get_value(GTK_RANGE(widget));
+}
+
+#ifdef PSK
+static void psk_scale_value_changed_cb(GtkWidget *widget, gpointer data) {
+  psk_scale=(int)gtk_range_get_value(GTK_RANGE(widget));
+}
+#endif
+
+#ifdef FREEDV
+static void freedv_scale_value_changed_cb(GtkWidget *widget, gpointer data) {
+  freedv_scale=(int)gtk_range_get_value(GTK_RANGE(widget));
+}
+#endif
+
+#endif
+
+static void agc_hang_threshold_value_changed_cb(GtkWidget *widget, gpointer data) {
+  agc_hang_threshold=(int)gtk_range_get_value(GTK_RANGE(widget));
+  if(agc==AGC_LONG || agc==AGC_SLOW) {
+    SetRXAAGCHangThreshold(CHANNEL_RX0, (int)agc_hang_threshold);
+  }
+}
+
 static void display_panadapter_cb(GtkWidget *widget, gpointer data) {
   display_panadapter=display_panadapter==1?0:1;
   reconfigure_display();
@@ -979,30 +1006,30 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget,
   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);
+  gtk_grid_attach(GTK_GRID(display_grid),detector_mode_label,2,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,3,1,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),detector_mode_peak,2,1,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,3,2,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),detector_mode_rosenfell,2,2,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,3,3,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),detector_mode_average,2,3,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,3,4,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),detector_mode_sample,2,4,1,1);
   g_signal_connect(detector_mode_sample,"pressed",G_CALLBACK(detector_mode_cb),(gpointer *)DETECTOR_MODE_SAMPLE);
 
 
@@ -1010,70 +1037,70 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget,
   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,4,0,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),average_mode_label,3,0,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,1,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),average_mode_none,3,1,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,2,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),average_mode_recursive,3,2,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,3,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),average_mode_time_window,3,3,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,4,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),average_mode_log_recursive,3,4,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,4,5,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),time_label,3,5,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,5,5,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),time_r,4,5,1,1);
   g_signal_connect(time_r,"value_changed",G_CALLBACK(time_value_changed_cb),NULL);
 
   GtkWidget *b_display_panadapter=gtk_check_button_new_with_label("Display Panadapter");
   //gtk_widget_override_font(b_display_panadapter, pango_font_description_from_string("Arial 18"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_panadapter), display_panadapter);
   gtk_widget_show(b_display_panadapter);
-  gtk_grid_attach(GTK_GRID(display_grid),b_display_panadapter,6,0,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),b_display_panadapter,0,7,1,1);
   g_signal_connect(b_display_panadapter,"toggled",G_CALLBACK(display_panadapter_cb),(gpointer *)NULL);
 
   GtkWidget *b_display_waterfall=gtk_check_button_new_with_label("Display Waterfall");
   //gtk_widget_override_font(b_display_waterfall, pango_font_description_from_string("Arial 18"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_waterfall), display_waterfall);
   gtk_widget_show(b_display_waterfall);
-  gtk_grid_attach(GTK_GRID(display_grid),b_display_waterfall,6,1,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),b_display_waterfall,1,7,1,1);
   g_signal_connect(b_display_waterfall,"toggled",G_CALLBACK(display_waterfall_cb),(gpointer *)NULL);
 
   GtkWidget *b_display_sliders=gtk_check_button_new_with_label("Display Sliders");
   //gtk_widget_override_font(b_display_sliders, pango_font_description_from_string("Arial 18"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_sliders), display_sliders);
   gtk_widget_show(b_display_sliders);
-  gtk_grid_attach(GTK_GRID(display_grid),b_display_sliders,6,2,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),b_display_sliders,2,7,1,1);
   g_signal_connect(b_display_sliders,"toggled",G_CALLBACK(display_sliders_cb),(gpointer *)NULL);
 
   GtkWidget *b_display_toolbar=gtk_check_button_new_with_label("Display Toolbar");
   //gtk_widget_override_font(b_display_toolbar, pango_font_description_from_string("Arial 18"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_toolbar), display_toolbar);
   gtk_widget_show(b_display_toolbar);
-  gtk_grid_attach(GTK_GRID(display_grid),b_display_toolbar,6,3,1,1);
+  gtk_grid_attach(GTK_GRID(display_grid),b_display_toolbar,3,7,1,1);
   g_signal_connect(b_display_toolbar,"toggled",G_CALLBACK(display_toolbar_cb),(gpointer *)NULL);
 
 
@@ -1087,68 +1114,77 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget,
   gtk_grid_set_row_homogeneous(GTK_GRID(dsp_grid),TRUE);
   gtk_grid_set_column_spacing (GTK_GRID(dsp_grid),10);
 
+  GtkWidget *agc_hang_threshold_label=gtk_label_new("AGC Hang Threshold:");
+  gtk_widget_show(agc_hang_threshold_label);
+  gtk_grid_attach(GTK_GRID(dsp_grid),agc_hang_threshold_label,0,0,1,1);
+  GtkWidget *agc_hang_threshold_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0.0, 100.0, 1.0);
+  gtk_range_set_value (GTK_RANGE(agc_hang_threshold_scale),agc_hang_threshold);
+  gtk_widget_show(agc_hang_threshold_scale);
+  gtk_grid_attach(GTK_GRID(dsp_grid),agc_hang_threshold_scale,1,0,2,1);
+  g_signal_connect(G_OBJECT(agc_hang_threshold_scale),"value_changed",G_CALLBACK(agc_hang_threshold_value_changed_cb),NULL);
+
   GtkWidget *pre_post_agc_label=gtk_label_new("NR/NR2/ANF");
   //gtk_widget_override_font(pre_post_agc_label, pango_font_description_from_string("Arial 18"));
   gtk_widget_show(pre_post_agc_label);
-  gtk_grid_attach(GTK_GRID(dsp_grid),pre_post_agc_label,0,0,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),pre_post_agc_label,0,1,1,1);
 
   GtkWidget *pre_agc_b=gtk_radio_button_new_with_label(NULL,"Pre AGC");
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pre_agc_b),nr_agc==0);
   gtk_widget_show(pre_agc_b);
-  gtk_grid_attach(GTK_GRID(dsp_grid),pre_agc_b,1,0,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),pre_agc_b,1,1,1,1);
   g_signal_connect(pre_agc_b,"pressed",G_CALLBACK(pre_post_agc_cb),(gpointer *)0);
 
   GtkWidget *post_agc_b=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(pre_agc_b),"Post AGC");
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (post_agc_b), nr_agc==1);
   gtk_widget_show(post_agc_b);
-  gtk_grid_attach(GTK_GRID(dsp_grid),post_agc_b,2,0,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),post_agc_b,2,1,1,1);
   g_signal_connect(post_agc_b,"pressed",G_CALLBACK(pre_post_agc_cb),(gpointer *)1);
 
   GtkWidget *nr2_gain_label=gtk_label_new("NR2 Gain Method");
   //gtk_widget_override_font(nr2_gain_label, pango_font_description_from_string("Arial 18"));
   gtk_widget_show(nr2_gain_label);
-  gtk_grid_attach(GTK_GRID(dsp_grid),nr2_gain_label,0,1,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),nr2_gain_label,0,2,1,1);
 
   GtkWidget *linear_b=gtk_radio_button_new_with_label(NULL,"Linear");
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (linear_b),nr2_gain_method==0);
   gtk_widget_show(linear_b);
-  gtk_grid_attach(GTK_GRID(dsp_grid),linear_b,1,1,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),linear_b,1,2,1,1);
   g_signal_connect(linear_b,"pressed",G_CALLBACK(nr2_gain_cb),(gpointer *)0);
 
   GtkWidget *log_b=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(linear_b),"Log");
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (log_b), nr2_gain_method==1);
   gtk_widget_show(log_b);
-  gtk_grid_attach(GTK_GRID(dsp_grid),log_b,2,1,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),log_b,2,2,1,1);
   g_signal_connect(log_b,"pressed",G_CALLBACK(nr2_gain_cb),(gpointer *)1);
 
   GtkWidget *gamma_b=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(log_b),"Gamma");
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gamma_b), nr2_gain_method==2);
   gtk_widget_show(gamma_b);
-  gtk_grid_attach(GTK_GRID(dsp_grid),gamma_b,3,1,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),gamma_b,3,2,1,1);
   g_signal_connect(gamma_b,"pressed",G_CALLBACK(nr2_gain_cb),(gpointer *)2);
 
   GtkWidget *nr2_npe_method_label=gtk_label_new("NR2 NPE Method");
   //gtk_widget_override_font(nr2_npe_method_label, pango_font_description_from_string("Arial 18"));
   gtk_widget_show(nr2_npe_method_label);
-  gtk_grid_attach(GTK_GRID(dsp_grid),nr2_npe_method_label,0,2,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),nr2_npe_method_label,0,3,1,1);
 
   GtkWidget *osms_b=gtk_radio_button_new_with_label(NULL,"OSMS");
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (osms_b),nr2_npe_method==0);
   gtk_widget_show(osms_b);
-  gtk_grid_attach(GTK_GRID(dsp_grid),osms_b,1,2,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),osms_b,1,3,1,1);
   g_signal_connect(osms_b,"pressed",G_CALLBACK(nr2_npe_method_cb),(gpointer *)0);
 
   GtkWidget *mmse_b=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(osms_b),"MMSE");
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mmse_b), nr2_npe_method==1);
   gtk_widget_show(mmse_b);
-  gtk_grid_attach(GTK_GRID(dsp_grid),mmse_b,2,2,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),mmse_b,2,3,1,1);
   g_signal_connect(mmse_b,"pressed",G_CALLBACK(nr2_npe_method_cb),(gpointer *)1);
 
   GtkWidget *ae_b=gtk_check_button_new_with_label("NR2 AE Filter");
   //gtk_widget_override_font(ae_b, pango_font_description_from_string("Arial 18"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ae_b), nr2_ae);
   gtk_widget_show(ae_b);
-  gtk_grid_attach(GTK_GRID(dsp_grid),ae_b,0,3,1,1);
+  gtk_grid_attach(GTK_GRID(dsp_grid),ae_b,0,4,1,1);
   g_signal_connect(ae_b,"toggled",G_CALLBACK(ae_cb),NULL);
 
   id=gtk_notebook_append_page(GTK_NOTEBOOK(notebook),dsp_grid,dsp_label);
@@ -1446,27 +1482,43 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget,
   id=gtk_notebook_append_page(GTK_NOTEBOOK(notebook),exit_grid,exit_label);
 
 
+#ifdef DEBUG
+
+  GtkWidget *debug_label=gtk_label_new("Debug");
+  GtkWidget *debug_grid=gtk_grid_new();
+  gtk_grid_set_column_homogeneous(GTK_GRID(debug_grid),TRUE);
+
+  GtkWidget *scale_label=gtk_label_new("Scale:");
+  gtk_widget_show(scale_label);
+  gtk_grid_attach(GTK_GRID(debug_grid),scale_label,0,0,1,1);
+  GtkWidget *scale_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,0.0, 20.0, 0.1);
+  gtk_range_set_value (GTK_RANGE(scale_scale),scale);
+  gtk_widget_show(scale_scale);
+  gtk_grid_attach(GTK_GRID(debug_grid),scale_scale,1,0,1,1);
+  g_signal_connect(G_OBJECT(scale_scale),"value_changed",G_CALLBACK(scale_value_changed_cb),NULL);
+
+  GtkWidget *psk_scale_label=gtk_label_new("PSK Scale:");
+  gtk_widget_show(psk_scale_label);
+  gtk_grid_attach(GTK_GRID(debug_grid),psk_scale_label,0,1,1,1);
+  GtkWidget *psk_scale_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,0.0, 20.0, 0.1);
+  gtk_range_set_value (GTK_RANGE(psk_scale_scale),psk_scale);
+  gtk_widget_show(psk_scale_scale);
+  gtk_grid_attach(GTK_GRID(debug_grid),psk_scale_scale,1,1,1,1);
+  g_signal_connect(G_OBJECT(psk_scale_scale),"value_changed",G_CALLBACK(psk_scale_value_changed_cb),NULL);
+
+  GtkWidget *freedv_scale_label=gtk_label_new("FREEDV Scale:");
+  gtk_widget_show(freedv_scale_label);
+  gtk_grid_attach(GTK_GRID(debug_grid),freedv_scale_label,0,2,1,1);
+  GtkWidget *freedv_scale_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,0.0, 20.0, 0.1);
+  gtk_range_set_value (GTK_RANGE(freedv_scale_scale),freedv_scale);
+  gtk_widget_show(freedv_scale_scale);
+  gtk_grid_attach(GTK_GRID(debug_grid),freedv_scale_scale,1,2,1,1);
+  g_signal_connect(G_OBJECT(freedv_scale_scale),"value_changed",G_CALLBACK(freedv_scale_value_changed_cb),NULL);
+
+  id=gtk_notebook_append_page(GTK_NOTEBOOK(notebook),debug_grid,debug_label);
+
+#endif
 
-/*
-  GtkWidget *about_label=gtk_label_new("About");
-  GtkWidget *about_grid=gtk_grid_new();
-  gtk_grid_set_column_homogeneous(GTK_GRID(about_grid),TRUE);
-
-  char build[64];
-
-  sprintf(build,"build: %s %s",build_date, build_time);
-  GtkWidget *pi_label=gtk_label_new("pihpsdr by John Melton g0orx/n6lyt");
-  gtk_widget_show(pi_label);
-  gtk_grid_attach(GTK_GRID(about_grid),pi_label,0,0,1,1);
-  GtkWidget *filler_label=gtk_label_new("");
-  gtk_widget_show(filler_label);
-  gtk_grid_attach(GTK_GRID(about_grid),filler_label,0,1,1,1);
-  GtkWidget *build_date_label=gtk_label_new(build);
-  gtk_widget_show(build_date_label);
-  gtk_grid_attach(GTK_GRID(about_grid),build_date_label,0,2,1,1);
-   
-  id=gtk_notebook_append_page(GTK_NOTEBOOK(notebook),about_grid,about_label);
-*/
   gtk_container_add(GTK_CONTAINER(content),notebook);
 
   GtkWidget *close_button=gtk_dialog_add_button(GTK_DIALOG(dialog),"Close Dialog",GTK_RESPONSE_OK);
index 6e35ef86451c2d5e81e4f2a259e348a3414828ec..8e9fe6f8aeca1ea6ae7a5671c31e8739b8130831 100644 (file)
 #define C3 6
 #define C4 7
 
-#define SCALE 4.6
-#ifdef FREEDV
-#define FREEDV_SCALE 8.5
-#endif
-
 #define DATA_PORT 1024
 
 #define SYNC 0x7F
@@ -635,7 +630,7 @@ static void full_rx_buffer() {
 static void full_tx_buffer() {
   int j;
   int error;
-  double gain=32767.0*SCALE; // 2^16-1
+  double gain=32767.0*scale; // 2^16-1
 
   // debug
   //int min_sample=0;
@@ -648,7 +643,7 @@ static void full_tx_buffer() {
 
 #ifdef FREEDV
   if(mode==modeFREEDV) {
-    gain=32767.0*FREEDV_SCALE;
+    gain=32767.0*freedv_scale;
   }
 #endif
 
@@ -699,10 +694,8 @@ static void full_tx_buffer() {
     }
   }
 
-  //fprintf(stderr,"scale=%f min_sample=%d max_sample=%d\n",scale, min_sample,max_sample);
-  //fprintf(stderr,"scale=%f overflow=%d\n",scale,overflow);
-
 }
+
 /*
 static void process_bandscope_buffer(char  *buffer) {
 }
index ac81e889670c0be95bb3c03a8df7ef832eb3f77f..9d34bafdd46616c2d81a4de6a3b6e8abd32774df 100644 (file)
@@ -24,7 +24,9 @@
 #include <stdlib.h>
 #include <string.h>
 #include <semaphore.h>
+#include "agc.h"
 #include "band.h"
+#include "channel.h"
 #include "discovered.h"
 #include "radio.h"
 #include "panadapter.h"
@@ -309,6 +311,49 @@ void panadapter_update(float *data,int tx) {
                 }
             }
             
+            // agc
+            if(agc!=AGC_OFF) {
+                double hang=0.0;
+                double thresh=0;
+
+                GetRXAAGCHangLevel(CHANNEL_RX0, &hang);
+                GetRXAAGCThresh(CHANNEL_RX0, &thresh, 4096.0, (double)sample_rate);
+
+                double knee_y=thresh+(double)get_attenuation()-20.0;
+                knee_y = floor((panadapter_high - knee_y)
+                        * (double) display_height
+                        / (panadapter_high - panadapter_low));
+
+                double hang_y=hang+(double)get_attenuation()-20.0;
+                hang_y = floor((panadapter_high - hang_y)
+                        * (double) display_height
+                        / (panadapter_high - panadapter_low));
+
+//fprintf(stderr,"hang=%f thresh=%f hang_y=%f knee_y=%f\n",rx1_hang,rx1_thresh,hang_y,knee_y);
+                if(agc!=AGC_MEDIUM && agc!=AGC_FAST) {
+                    cairo_set_source_rgb (cr, 1.0, 1.0, 0.0);
+                    cairo_move_to(cr,40.0,hang_y-8.0);
+                    cairo_rectangle(cr, 40, hang_y-8.0,8.0,8.0);
+                    cairo_fill(cr);
+                    cairo_move_to(cr,40.0,hang_y);
+                    cairo_line_to(cr,(double)display_width-40.0,hang_y);
+                    cairo_stroke(cr);
+                    cairo_move_to(cr,48.0,hang_y);
+                    cairo_show_text(cr, "-H");
+                }
+
+                cairo_set_source_rgb (cr, 0.0, 1.0, 0.0);
+                cairo_move_to(cr,40.0,knee_y-8.0);
+                cairo_rectangle(cr, 40, knee_y-8.0,8.0,8.0);
+                cairo_fill(cr);
+                cairo_move_to(cr,40.0,knee_y);
+                cairo_line_to(cr,(double)display_width-40.0,knee_y);
+                cairo_stroke(cr);
+                cairo_move_to(cr,48.0,knee_y);
+                cairo_show_text(cr, "-G");
+            }
+
+
             // cursor
             cairo_set_source_rgb (cr, 1, 0, 0);
             cairo_set_line_width(cr, 1.0);
@@ -355,6 +400,7 @@ void panadapter_update(float *data,int tx) {
             }
 #endif
 
+
             cairo_destroy (cr);
             gtk_widget_queue_draw (panadapter);
 
diff --git a/pihpsdr b/pihpsdr
index e597d679c99df947f8f783a7e095d75e969fa358..cfb5ee5012f9ea73398a5e5ca32671720ddd6254 100755 (executable)
Binary files a/pihpsdr and b/pihpsdr differ
diff --git a/radio.c b/radio.c
index 976682c2e14d944eafab98537f17706d45c57b82..d1cd9f611ab64ad1eaec2d619754f14298a98d29 100644 (file)
--- a/radio.c
+++ b/radio.c
 char property_path[128];
 sem_t property_sem;
 
+double scale=4.6;
+#ifdef FREEDV
+double freedv_scale=4.6;
+#endif
+#ifdef PSK
+double psk_scale=8.5;
+#endif
 
 int atlas_penelope=0;
 int atlas_clock_source_10mhz=0;
@@ -96,7 +103,9 @@ int mic_ptt_enabled=0;
 int mic_ptt_tip_bias_ring=0;
 
 int agc=AGC_MEDIUM;
-double agc_gain=60.0;
+double agc_gain=80.0;
+double agc_slope=35.0;
+double agc_hang_threshold=0.0;
 
 int nr_none=1;
 int nr=0;
@@ -495,6 +504,8 @@ void radioRestoreState() {
     if(value) agc=atoi(value);
     value=getProperty("agc_gain");
     if(value) agc_gain=atof(value);
+    value=getProperty("agc_slope");
+    if(value) agc_slope=atof(value);
     value=getProperty("step");
     if(value) step=atoi(value);
     value=getProperty("cw_keys_reversed");
@@ -637,6 +648,8 @@ void radioSaveState() {
     setProperty("agc",value);
     sprintf(value,"%f",agc_gain);
     setProperty("agc_gain",value);
+    sprintf(value,"%f",agc_slope);
+    setProperty("agc_slope",value);
     sprintf(value,"%d",step);
     setProperty("step",value);
     sprintf(value,"%d",cw_keys_reversed);
diff --git a/radio.h b/radio.h
index e127cb41c6aa00519d0da853b789f50a040af373..5712282f92d4fd05e1db712491dd980f54393fc2 100644 (file)
--- a/radio.h
+++ b/radio.h
 
 extern char property_path[];
 
+extern double scale;
+#ifdef FREEDV
+extern double freedv_scale;
+#endif
+#ifdef PSK
+extern double psk_scale;
+#endif
+
+
 #define NONE 0
 
 #define ALEX 1
@@ -98,6 +107,8 @@ extern double volume;
 extern double mic_gain;
 extern int agc;
 extern double agc_gain;
+extern double agc_slope;
+extern double agc_hang_threshold;
 
 extern int nr_none;
 extern int nr;
index b2868bbc16d618c653d36234051b25f69f6b7c7f..4e831a8edebdea9bbfcf069c1e9c47c13ec05953 100644 (file)
Binary files a/release/pihpsdr.tar and b/release/pihpsdr.tar differ
index e597d679c99df947f8f783a7e095d75e969fa358..cfb5ee5012f9ea73398a5e5ca32671720ddd6254 100755 (executable)
Binary files a/release/pihpsdr/pihpsdr and b/release/pihpsdr/pihpsdr differ
index 4aad9ab544c66e618c759db667631fa2ee21ee9e..7bfe95c0f06b188c5427d10c0bc2586e804d9c43 100644 (file)
--- a/toolbar.c
+++ b/toolbar.c
@@ -245,7 +245,7 @@ void bandstack_cb(GtkWidget *widget, gpointer data) {
 
     for(i=0;i<bandstack->entries;i++) {
       BANDSTACK_ENTRY *entry=&bandstack->entry[i];
-      sprintf(label,"%lld",entry->frequencyA);
+      sprintf(label,"%lld %s",entry->frequencyA,mode_string[entry->mode]);
       GtkWidget *b=gtk_button_new_with_label(label);
       gtk_widget_override_background_color(b, GTK_STATE_NORMAL, &white);
       //gtk_widget_override_font(b, pango_font_description_from_string("Arial 20"));
@@ -254,7 +254,7 @@ void bandstack_cb(GtkWidget *widget, gpointer data) {
         last_bandstack=b;
       }
       gtk_widget_show(b);
-      gtk_grid_attach(GTK_GRID(grid),b,i%5,i/5,1,1);
+      gtk_grid_attach(GTK_GRID(grid),b,i/5,i%5,1,1);
       g_signal_connect(b,"clicked",G_CALLBACK(bandstack_select_cb),(gpointer *)i);
     }
 
@@ -417,7 +417,8 @@ void filter_cb(GtkWidget *widget, gpointer data) {
 
 static void agc_select_cb(GtkWidget *widget, gpointer data) {
   agc=(int)data;
-  SetRXAAGCMode(CHANNEL_RX0, agc);
+  wdsp_set_agc(CHANNEL_RX0, agc);
+  //SetRXAAGCMode(CHANNEL_RX0, agc);
 }
 
 static void update_noise() {
index b1bccb90bbe6af78f0fa930f5222ff8e62dfd7bb..3884206364585647925ba3e97939efcb327022af 100644 (file)
@@ -36,6 +36,7 @@
 #include <semaphore.h>
 #include <math.h>
 
+#include "agc.h"
 #include "alex.h"
 #include "new_protocol.h"
 #include "channel.h"
@@ -180,6 +181,42 @@ int getFilterHigh() {
     return filterHigh;
 }
 
+void wdsp_set_agc(int rx, int agc) {
+  
+  SetRXAAGCMode(rx, agc);
+  //SetRXAAGCThresh(rx, agc_thresh_point, 4096.0, sample_rate);
+  SetRXAAGCSlope(rx,agc_slope);
+  SetRXAAGCTop(rx,agc_gain);
+  switch(agc) {
+    case AGC_OFF:
+      break;
+    case AGC_LONG:
+      SetRXAAGCAttack(rx,2);
+      SetRXAAGCHang(rx,2000);
+      SetRXAAGCDecay(rx,2000);
+      SetRXAAGCHangThreshold(rx,(int)agc_hang_threshold);
+      break;
+    case AGC_SLOW:
+      SetRXAAGCAttack(rx,2);
+      SetRXAAGCHang(rx,1000);
+      SetRXAAGCDecay(rx,500);
+      SetRXAAGCHangThreshold(rx,(int)agc_hang_threshold);
+      break;
+    case AGC_MEDIUM:
+      SetRXAAGCAttack(rx,2);
+      SetRXAAGCHang(rx,0);
+      SetRXAAGCDecay(rx,250);
+      SetRXAAGCHangThreshold(rx,100);
+      break;
+    case AGC_FAST:
+      SetRXAAGCAttack(rx,2);
+      SetRXAAGCHang(rx,0);
+      SetRXAAGCDecay(rx,50);
+      SetRXAAGCHangThreshold(rx,100);
+      break;
+  }
+}
+
 void wdsp_set_offset(long long offset) {
     if(offset==0) {
       SetRXAShiftFreq(receiver, (double)offset);
@@ -199,8 +236,10 @@ void wdsp_set_input_rate(double rate) {
 static void setupRX(int rx) {
     setRXMode(rx,mode);
     SetRXABandpassFreqs(rx, (double)filterLow, (double)filterHigh);
-    SetRXAAGCMode(rx, agc);
-    SetRXAAGCTop(rx,agc_gain);
+    
+    //SetRXAAGCMode(rx, agc);
+    //SetRXAAGCTop(rx,agc_gain);
+    wdsp_set_agc(rx, agc);
 
     SetRXAAMDSBMode(rx, 0);
     SetRXAShiftRun(rx, 0);
index f19f87117f60bdd9772ee96eb818f712d046c2de..72e89a9d6c82a8bab0b11780d245c0a8ea647114 100644 (file)
@@ -26,3 +26,4 @@ extern int getFilterLow();
 extern int getFilterHigh();
 extern void wdsp_init(int rx,int pixels,int protocol);
 extern void wdsp_new_sample_rate(int rate);
+extern void wdsp_set_agc(int rx, int agc);