From: Markus Großer Date: Tue, 15 May 2018 16:10:18 +0000 (+0200) Subject: Add support for Charly25 filter board X-Git-Url: https://git.rkrishnan.org/running.html?a=commitdiff_plain;h=ed93ff3cdab38206016a608899ea756e765ba75a;p=pihpsdr.git Add support for Charly25 filter board 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 … --- diff --git a/radio.h b/radio.h index 9130f0e..0ec654f 100644 --- 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 diff --git a/radio_menu.c b/radio_menu.c index 95c37eb..d273451 100644 --- a/radio_menu.c +++ b/radio_menu.c @@ -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++; } diff --git a/rx_menu.c b/rx_menu.c index 9e8387e..95c8723 100644 --- 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; diff --git a/sliders.c b/sliders.c index f5571fe..7c76985 100644 --- 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); diff --git a/sliders.h b/sliders.h index 14b55f5..991ec86 100644 --- 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();