]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
Add support for Charly25 filter board
authorMarkus Großer <markus.grosser2+git@gmail.com>
Tue, 15 May 2018 16:10:18 +0000 (18:10 +0200)
committerMarkus Großer <markus.grosser2+git@gmail.com>
Tue, 15 May 2018 16:10:18 +0000 (18:10 +0200)
This also contains a small fix for the filter board switching –
apparently GCC by default doesn't warn about a missing `()` for a method
call, so that slipped through …

radio.h
radio_menu.c
rx_menu.c
sliders.c
sliders.h

diff --git a/radio.h b/radio.h
index 9130f0e9e7b831dc3443cf39f1686fafa5ff4e0f..0ec654f3ef52bcae3870bbb797b61fd106c765f7 100644 (file)
--- a/radio.h
+++ b/radio.h
@@ -52,6 +52,7 @@ extern char property_path[];
 
 #define ALEX 1
 #define APOLLO 2
+#define CHARLY25 3
 
 #define REGION_OTHER 0
 #define REGION_UK 1
index 95c37eb140684580508f9627cc8a75f9cb2af765..d27345191b6ad8d8f6ee8af51f3f89b64e8f1078 100644 (file)
@@ -30,6 +30,7 @@
 #include "filter.h"
 #include "radio.h"
 #include "receiver.h"
+#include "sliders.h"
 #include "new_protocol.h"
 #include "old_protocol.h"
 #include "gpio.h"
@@ -114,6 +115,7 @@ static void load_filters(void) {
       set_alex_attenuation(band->alexAttenuation);
     }
   }
+  att_type_changed();
 }
 
 static void none_cb(GtkWidget *widget, gpointer data) {
@@ -133,7 +135,14 @@ static void alex_cb(GtkWidget *widget, gpointer data) {
 static void apollo_cb(GtkWidget *widget, gpointer data) {
   if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
     filter_board = APOLLO;
-    load_filters;
+    load_filters();
+  }
+}
+
+static void charly25_cb(GtkWidget *widget, gpointer data) {
+  if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
+    filter_board = CHARLY25;
+    load_filters();
   }
 }
 
@@ -349,9 +358,14 @@ void radio_menu(GtkWidget *parent) {
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(apollo_b), filter_board == APOLLO);
     gtk_grid_attach(GTK_GRID(grid), apollo_b, x, 3, 1, 1);
 
+    GtkWidget *charly25_b = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(none_b), "CHARLY25");
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(charly25_b), filter_board == CHARLY25);
+    gtk_grid_attach(GTK_GRID(grid), charly25_b, x, 4, 1, 1);
+
     g_signal_connect(none_b, "toggled", G_CALLBACK(none_cb), NULL);
     g_signal_connect(alex_b, "toggled", G_CALLBACK(alex_cb), NULL);
     g_signal_connect(apollo_b, "toggled", G_CALLBACK(apollo_cb), NULL);
+    g_signal_connect(charly25_b, "toggled", G_CALLBACK(charly25_cb), NULL);
 
     x++;
   }
index 9e8387e349342b82b2ba66ec404324827cd3bb22..95c8723aa7ec45dc68a34427bcc016c690b471f0 100644 (file)
--- a/rx_menu.c
+++ b/rx_menu.c
@@ -31,6 +31,7 @@
 #include "filter.h"
 #include "radio.h"
 #include "receiver.h"
+#include "sliders.h"
 
 static GtkWidget *parent_window=NULL;
 
@@ -58,6 +59,7 @@ static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_d
 
 static void dither_cb(GtkWidget *widget, gpointer data) {
   active_receiver->dither=active_receiver->dither==1?0:1;
+  update_att_preamp();
 }
 
 static void random_cb(GtkWidget *widget, gpointer data) {
@@ -66,11 +68,13 @@ static void random_cb(GtkWidget *widget, gpointer data) {
 
 static void preamp_cb(GtkWidget *widget, gpointer data) {
   active_receiver->preamp=active_receiver->preamp==1?0:1;
+  update_att_preamp();
 }
 
 static void alex_att_cb(GtkWidget *widget, gpointer data) {
   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
     set_alex_attenuation((intptr_t) data);
+    update_att_preamp();
   }
 }
 
@@ -229,51 +233,55 @@ void rx_menu(GtkWidget *parent) {
 #endif
   }
 
-  switch(protocol) {
+  // The CHARLY25 board (with RedPitaya) has no support for dither or random,
+  // so those are left out. PreAmps and Alex Attenuator are controlled via sliders.
+  if (filter_board != CHARLY25) {
+    switch(protocol) {
 #ifdef RADIOBERRY
-       case RADIOBERRY_PROTOCOL:
+      case RADIOBERRY_PROTOCOL:
 #endif
-    case ORIGINAL_PROTOCOL:
-    case NEW_PROTOCOL: 
-      {
-      GtkWidget *dither_b=gtk_check_button_new_with_label("Dither");
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dither_b), active_receiver->dither);
-      gtk_grid_attach(GTK_GRID(grid),dither_b,x,2,1,1);
-      g_signal_connect(dither_b,"toggled",G_CALLBACK(dither_cb),NULL);
-
-      GtkWidget *random_b=gtk_check_button_new_with_label("Random");
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (random_b), active_receiver->random);
-      gtk_grid_attach(GTK_GRID(grid),random_b,x,3,1,1);
-      g_signal_connect(random_b,"toggled",G_CALLBACK(random_cb),NULL);
-
-      if((protocol==ORIGINAL_PROTOCOL && device==DEVICE_METIS) ||
+      case ORIGINAL_PROTOCOL:
+      case NEW_PROTOCOL:
+        {
+          GtkWidget *dither_b=gtk_check_button_new_with_label("Dither");
+          gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dither_b), active_receiver->dither);
+          gtk_grid_attach(GTK_GRID(grid),dither_b,x,2,1,1);
+          g_signal_connect(dither_b,"toggled",G_CALLBACK(dither_cb),NULL);
+
+          GtkWidget *random_b=gtk_check_button_new_with_label("Random");
+          gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (random_b), active_receiver->random);
+          gtk_grid_attach(GTK_GRID(grid),random_b,x,3,1,1);
+          g_signal_connect(random_b,"toggled",G_CALLBACK(random_cb),NULL);
+
+          if((protocol==ORIGINAL_PROTOCOL && device==DEVICE_METIS) ||
 #ifdef USBOZY
-         (protocol==ORIGINAL_PROTOCOL && device==DEVICE_OZY) ||
+              (protocol==ORIGINAL_PROTOCOL && device==DEVICE_OZY) ||
 #endif
-         (protocol==NEW_PROTOCOL && device==NEW_DEVICE_ATLAS)) {
-
-        GtkWidget *preamp_b=gtk_check_button_new_with_label("Preamp");
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (preamp_b), active_receiver->preamp);
-        gtk_grid_attach(GTK_GRID(grid),preamp_b,x,4,1,1);
-        g_signal_connect(preamp_b,"toggled",G_CALLBACK(preamp_cb),NULL);
-      }
-      GtkWidget *alex_att_label=gtk_label_new("Alex Attenuator");
-      gtk_grid_attach(GTK_GRID(grid), alex_att_label, x, 5, 1, 1);
-      GtkWidget *last_alex_att_b = NULL;
-      for (int i = 0; i <= 3; i++) {
-        gchar button_text[] = "xx dB";
-        sprintf(button_text, "%d dB", i*10);
-        GtkWidget *alex_att_b=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(last_alex_att_b), button_text);
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alex_att_b), active_receiver->alex_attenuation == i);
-        gtk_grid_attach(GTK_GRID(grid), alex_att_b, x, 6 + i, 1, 1);
-        g_signal_connect(alex_att_b, "toggled", G_CALLBACK(alex_att_cb), (gpointer) (long) i);
-        last_alex_att_b = alex_att_b;
-      }
-      }
-      x++;
-      break;
-    default:
-      break;
+              (protocol==NEW_PROTOCOL && device==NEW_DEVICE_ATLAS)) {
+
+            GtkWidget *preamp_b=gtk_check_button_new_with_label("Preamp");
+            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (preamp_b), active_receiver->preamp);
+            gtk_grid_attach(GTK_GRID(grid),preamp_b,x,4,1,1);
+            g_signal_connect(preamp_b,"toggled",G_CALLBACK(preamp_cb),NULL);
+          }
+          GtkWidget *alex_att_label=gtk_label_new("Alex Attenuator");
+          gtk_grid_attach(GTK_GRID(grid), alex_att_label, x, 5, 1, 1);
+          GtkWidget *last_alex_att_b = NULL;
+          for (int i = 0; i <= 3; i++) {
+            gchar button_text[] = "xx dB";
+            sprintf(button_text, "%d dB", i*10);
+            GtkWidget *alex_att_b=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(last_alex_att_b), button_text);
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(alex_att_b), active_receiver->alex_attenuation == i);
+            gtk_grid_attach(GTK_GRID(grid), alex_att_b, x, 6 + i, 1, 1);
+            g_signal_connect(alex_att_b, "toggled", G_CALLBACK(alex_att_cb), (gpointer) (long) i);
+            last_alex_att_b = alex_att_b;
+          }
+        }
+        x++;
+        break;
+      default:
+        break;
+    }
   }
 
   int n_adc=1;
index f5571fe4cd070447d4fae119a311e3e0e94e42d7..7c7698539b61145cd473b5c1c8799e2192d64117 100644 (file)
--- a/sliders.c
+++ b/sliders.c
@@ -67,6 +67,9 @@ static GtkWidget *agc_gain_label;
 static GtkWidget *agc_scale;
 static GtkWidget *attenuation_label;
 static GtkWidget *attenuation_scale;
+static GtkWidget *c25_att_preamp_label;
+static GtkWidget *c25_att_combobox;
+static GtkWidget *c25_preamp_combobox;
 static GtkWidget *mic_gain_label;
 static GtkWidget *mic_gain_scale;
 static GtkWidget *drive_label;
@@ -156,6 +159,49 @@ void set_attenuation_value(double value) {
   set_attenuation(adc_attenuation[active_receiver->adc]);
 }
 
+void update_att_preamp(void) {
+  if (filter_board == CHARLY25) {
+    char id[] = "x";
+    sprintf(id, "%d", active_receiver->alex_attenuation);
+    gtk_combo_box_set_active_id(GTK_COMBO_BOX(c25_att_combobox), id);
+    sprintf(id, "%d", active_receiver->preamp + active_receiver->dither);
+    gtk_combo_box_set_active_id(GTK_COMBO_BOX(c25_preamp_combobox), id);
+  }
+}
+
+void att_type_changed(void) {
+  if (filter_board == CHARLY25) {
+    gtk_widget_hide(attenuation_label);
+    gtk_widget_hide(attenuation_scale);
+    gtk_widget_show(c25_att_preamp_label);
+    gtk_widget_show(c25_att_combobox);
+    gtk_widget_show(c25_preamp_combobox);
+    update_att_preamp();
+  } else {
+    gtk_widget_hide(c25_att_preamp_label);
+    gtk_widget_hide(c25_att_combobox);
+    gtk_widget_hide(c25_preamp_combobox);
+    gtk_widget_show(attenuation_label);
+    gtk_widget_show(attenuation_scale);
+  }
+}
+
+static gboolean load_att_type_cb(gpointer data) {
+  att_type_changed();
+  return G_SOURCE_REMOVE;
+}
+
+static void c25_att_combobox_changed(GtkWidget *widget, gpointer data) {
+  int id = atoi(gtk_combo_box_get_active_id(GTK_COMBO_BOX(widget)));
+  set_alex_attenuation(id);
+}
+
+static void c25_preamp_combobox_changed(GtkWidget *widget, gpointer data) {
+  int id = atoi(gtk_combo_box_get_active_id(GTK_COMBO_BOX(widget)));
+  active_receiver->dither = id >= 2;
+  active_receiver->preamp = id >= 1;
+}
+
 static void agcgain_value_changed_cb(GtkWidget *widget, gpointer data) {
   active_receiver->agc_gain=gtk_range_get_value(GTK_RANGE(agc_scale));
   SetRXAAGCTop(active_receiver->id, active_receiver->agc_gain);
@@ -499,6 +545,25 @@ fprintf(stderr,"sliders_init: width=%d height=%d\n", width,height);
   gtk_grid_attach(GTK_GRID(sliders),attenuation_scale,7,0,2,1);
   g_signal_connect(G_OBJECT(attenuation_scale),"value_changed",G_CALLBACK(attenuation_value_changed_cb),NULL);
 
+  c25_att_preamp_label = gtk_label_new("Att/PreAmp");
+  gtk_grid_attach(GTK_GRID(sliders), c25_att_preamp_label, 6, 0, 1, 1);
+
+  c25_att_combobox = gtk_combo_box_text_new();
+  gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(c25_att_combobox), "0", "0 dB");
+  gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(c25_att_combobox), "1", "-12 dB");
+  gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(c25_att_combobox), "2", "-24 dB");
+  gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(c25_att_combobox), "3", "-36 dB");
+  gtk_grid_attach(GTK_GRID(sliders), c25_att_combobox, 7, 0, 1, 1);
+  g_signal_connect(G_OBJECT(c25_att_combobox), "changed", G_CALLBACK(c25_att_combobox_changed), NULL);
+
+  c25_preamp_combobox = gtk_combo_box_text_new();
+  gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(c25_preamp_combobox), "0", "0 dB");
+  gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(c25_preamp_combobox), "1", "18 dB");
+  gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(c25_preamp_combobox), "2", "36 dB");
+  gtk_grid_attach(GTK_GRID(sliders), c25_preamp_combobox, 8, 0, 1, 1);
+  g_signal_connect(G_OBJECT(c25_preamp_combobox), "changed", G_CALLBACK(c25_preamp_combobox_changed), NULL);
+  g_idle_add(load_att_type_cb, NULL);
+
 
   mic_gain_label=gtk_label_new(mic_linein?"Linein:":"Mic (dB):");
   gtk_grid_attach(GTK_GRID(sliders),mic_gain_label,0,1,1,1);
index 14b55f51a45d393853591025121a76115c0a4a2a..991ec86f9a6cb372de1a4d14f75d0eb4003199b4 100644 (file)
--- a/sliders.h
+++ b/sliders.h
@@ -20,6 +20,9 @@
 #ifndef _SLIDERS_H
 #define _SLIDERS_H
 
+extern void att_type_changed(void);
+extern void update_att_preamp(void);
+
 extern int sliders_active_receiver_changed(void *data);
 extern void update_agc_gain(double gain);
 extern void update_af_gain();