From 70e9349734bb25eed52e07e36d4d2f15dee339dd Mon Sep 17 00:00:00 2001 From: John Melton - G0ORX <john.d.melton@googlemail.com> Date: Tue, 13 Jul 2021 12:31:36 +0100 Subject: [PATCH] Changes to actions selection for switches and encoders --- Makefile | 16 ++- action_dialog.c | 73 ++++++++++ action_dialog.h | 1 + actions.c | 106 +++++++-------- css.c | 5 +- css.h | 3 + discovery.c | 2 +- encoder_menu.c | 349 ++++++++++++++++++++++++++++++++++-------------- gpio.c | 40 +++--- main.c | 3 + midi2.c | 2 +- midi3.c | 2 + midi_menu.c | 214 ++++++++++++----------------- new_menu.c | 34 ++++- radio.c | 8 -- switch_menu.c | 102 +++++++------- toolbar_menu.c | 156 ++++++++++++++++++++++ toolbar_menu.h | 1 + vfo.c | 28 ++-- vfo_menu.c | 4 +- 20 files changed, 763 insertions(+), 386 deletions(-) create mode 100644 action_dialog.c create mode 100644 action_dialog.h create mode 100644 css.h create mode 100644 toolbar_menu.c create mode 100644 toolbar_menu.h diff --git a/Makefile b/Makefile index 72661a7..177adaf 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ GPIO_INCLUDE=GPIO PURESIGNAL_INCLUDE=PURESIGNAL # uncomment the line below to include MIDI support -MIDI_INCLUDE=MIDI +#MIDI_INCLUDE=MIDI # uncomment the line below to include USB Ozy support # USBOZY_INCLUDE=USBOZY @@ -29,7 +29,7 @@ MIDI_INCLUDE=MIDI #LOCALCW_INCLUDE=LOCALCW # uncomment the line below for SoapySDR -SOAPYSDR_INCLUDE=SOAPYSDR +#SOAPYSDR_INCLUDE=SOAPYSDR # uncomment the line to below include support for sx1509 i2c expander #SX1509_INCLUDE=sx1509 @@ -296,11 +296,13 @@ cwramp.c \ protocols.c \ css.c \ actions.c \ +action_dialog.c \ configure.c \ i2c.c \ gpio.c \ encoder_menu.c \ -switch_menu.c +switch_menu.c \ +toolbar_menu.c @@ -372,11 +374,13 @@ error_handler.h \ protocols.h \ css.h \ actions.h \ +action_dialog.h \ configure.h \ i2c.h \ gpio.h \ encoder_menu.h \ -switch_menu.h +switch_menu.h \ +toolbar_menu.h @@ -447,11 +451,13 @@ cwramp.o \ protocols.o \ css.o \ actions.o \ +action_dialog.o \ configure.o \ i2c.o \ gpio.o \ encoder_menu.o \ -switch_menu.o +switch_menu.o \ +toolbar_menu.o $(PROGRAM): $(OBJS) $(AUDIO_OBJS) $(REMOTE_OBJS) $(USBOZY_OBJS) $(SOAPYSDR_OBJS) \ $(LOCALCW_OBJS) $(PURESIGNAL_OBJS) \ diff --git a/action_dialog.c b/action_dialog.c new file mode 100644 index 0000000..a60fd71 --- /dev/null +++ b/action_dialog.c @@ -0,0 +1,73 @@ +#include <gtk/gtk.h> +#include "actions.h" + +#define GRID_WIDTH 6 + +typedef struct _choice { + int action; + GtkWidget *button; + gulong signal_id; +} CHOICE; + +static GtkWidget *dialog; +static GtkWidget *previous_button; +static gulong previous_signal_id; +static int action; + +static void action_select_cb(GtkWidget *widget,gpointer data) { + CHOICE *choice=(CHOICE *)data; + g_signal_handler_block(G_OBJECT(previous_button),previous_signal_id); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(previous_button),FALSE); + g_signal_handler_unblock(G_OBJECT(previous_button),previous_signal_id); + previous_button=widget; + previous_signal_id=choice->signal_id; + action=choice->action; +} + +int action_dialog(GtkWidget *parent,int filter,int currentAction) { + int i,j; + + action=currentAction; + previous_button=NULL; + dialog=gtk_dialog_new_with_buttons("Action",GTK_WINDOW(parent),GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,("_OK"),GTK_RESPONSE_ACCEPT,("_Cancel"),GTK_RESPONSE_REJECT,NULL); + GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + GtkWidget *scrolled_window=gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS); + gtk_widget_set_size_request(scrolled_window,790,380); + + GtkWidget *grid=gtk_grid_new(); + gtk_grid_set_column_spacing(GTK_GRID(grid),2); + gtk_grid_set_row_spacing(GTK_GRID(grid),2); + gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE); + gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE); + j=0; + for(i=0;i<ACTIONS;i++) { + if((ActionTable[i].type&filter) || (ActionTable[i].type==TYPE_NONE)) { + GtkWidget *button=gtk_toggle_button_new_with_label(ActionTable[i].str); + gtk_widget_set_name(button,"small_button"); + gtk_grid_attach(GTK_GRID(grid),button,j%GRID_WIDTH,j/GRID_WIDTH,1,1); + if(ActionTable[i].action==currentAction) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),TRUE); + } + CHOICE *choice=g_new0(CHOICE,1); + choice->action=i; + choice->button=button; + choice->signal_id=g_signal_connect(button,"toggled",G_CALLBACK(action_select_cb),choice); + if(ActionTable[i].action==currentAction) { + previous_button=button; + previous_signal_id=choice->signal_id; + } + j++; + } + } + gtk_container_add(GTK_CONTAINER(scrolled_window),grid); + gtk_container_add(GTK_CONTAINER(content),scrolled_window); + gtk_widget_show_all(content); + int result = gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy(dialog); + if(result!=GTK_RESPONSE_ACCEPT) { + action=currentAction; + } + return action; +} + diff --git a/action_dialog.h b/action_dialog.h new file mode 100644 index 0000000..c134e2e --- /dev/null +++ b/action_dialog.h @@ -0,0 +1 @@ +int action_dialog(GtkWidget *parent,int filter,int current); diff --git a/actions.c b/actions.c index 9d17398..b2a2e7e 100644 --- a/actions.c +++ b/actions.c @@ -42,35 +42,35 @@ ACTION_TABLE ActionTable[] = { {AF_GAIN_RX2, "AF GAIN\nRX2", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, {AGC, "AGC", "AGC", MIDI_KEY | CONTROLLER_SWITCH}, {AGC_GAIN, "AGC GAIN", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, - {AGC_GAIN_RX1, "AGC GAIN\nRX1", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, - {AGC_GAIN_RX2, "AGC GAIN\nRX2", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, + {AGC_GAIN_RX1, "AGC GAIN\nRX1", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, + {AGC_GAIN_RX2, "AGC GAIN\nRX2", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, {ANF, "ANF", "ANF", MIDI_KEY | CONTROLLER_SWITCH}, {ATTENUATION, "ATTEN", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, {B_TO_A, "A<B", "A<B", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_10, "BAND 10", "10", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_12, "BAND 12", "12", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_1240, "BAND 1240", "1240", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_144, "BAND 144", "144", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_15, "BAND 15", "15", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_160, "BAND 160", "160", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_17, "BAND 17", "17", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_20, "BAND 20", "20", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_220, "BAND 220", "220", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_2300, "BAND 2300", "2300", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_30, "BAND 30", "30", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_3400, "BAND 3400", "3400", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_40, "BAND 40", "40", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_430, "BAND 430", "430", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_6, "BAND 6", "6", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_60, "BAND 60", "60", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_70, "BAND 70", "70", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_80, "BAND 80", "80", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_902, "BAND 902", "902", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_AIR, "BAND AIR", "AIR", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_GEN, "BAND GEN", "GEN", MIDI_KEY | CONTROLLER_SWITCH}, + {BAND_10, "BAND 10", "10", MIDI_KEY}, + {BAND_12, "BAND 12", "12", MIDI_KEY}, + {BAND_1240, "BAND 1240", "1240", MIDI_KEY}, + {BAND_144, "BAND 144", "144", MIDI_KEY}, + {BAND_15, "BAND 15", "15", MIDI_KEY}, + {BAND_160, "BAND 160", "160", MIDI_KEY}, + {BAND_17, "BAND 17", "17", MIDI_KEY}, + {BAND_20, "BAND 20", "20", MIDI_KEY}, + {BAND_220, "BAND 220", "220", MIDI_KEY}, + {BAND_2300, "BAND 2300", "2300", MIDI_KEY}, + {BAND_30, "BAND 30", "30", MIDI_KEY}, + {BAND_3400, "BAND 3400", "3400", MIDI_KEY}, + {BAND_40, "BAND 40", "40", MIDI_KEY}, + {BAND_430, "BAND 430", "430", MIDI_KEY}, + {BAND_6, "BAND 6", "6", MIDI_KEY}, + {BAND_60, "BAND 60", "60", MIDI_KEY}, + {BAND_70, "BAND 70", "70", MIDI_KEY}, + {BAND_80, "BAND 80", "80", MIDI_KEY}, + {BAND_902, "BAND 902", "902", MIDI_KEY}, + {BAND_AIR, "BAND AIR", "AIR", MIDI_KEY}, + {BAND_GEN, "BAND GEN", "GEN", MIDI_KEY}, {BAND_MINUS, "BAND -", "BND+", MIDI_KEY | CONTROLLER_SWITCH}, {BAND_PLUS, "BAND +", "BND-", MIDI_KEY | CONTROLLER_SWITCH}, - {BAND_WWV, "BAND WWV", "WWV", MIDI_KEY | CONTROLLER_SWITCH}, + {BAND_WWV, "BAND WWV", "WWV", MIDI_KEY}, {BANDSTACK_MINUS, "BANDSTACK -", "BSTK-", MIDI_KEY | CONTROLLER_SWITCH}, {BANDSTACK_PLUS, "BANDSTACK +", "BSTK+", MIDI_KEY | CONTROLLER_SWITCH}, {COMP_ENABLE, "COMP ON/OFF", "COMP", MIDI_KEY | CONTROLLER_SWITCH}, @@ -91,44 +91,44 @@ ACTION_TABLE ActionTable[] = { {DUPLEX, "DUPLEX", "DUP", MIDI_KEY | CONTROLLER_SWITCH}, {FILTER_MINUS, "FILTER +", "FL+", MIDI_KEY | CONTROLLER_SWITCH}, {FILTER_PLUS, "FILTER -", "FL-", MIDI_KEY | CONTROLLER_SWITCH}, - {FUNCTION, "FUNC", "FUNC", CONTROLLER_SWITCH}, + {FUNCTION, "FUNC", "FUNC", CONTROLLER_SWITCH}, {IF_SHIFT, "IF SHIFT", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, - {IF_SHIFT_RX1, "IF SHIFT\nRX1", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, - {IF_SHIFT_RX2, "IF SHIFT\nRX2", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, + {IF_SHIFT_RX1, "IF SHIFT\nRX1", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, + {IF_SHIFT_RX2, "IF SHIFT\nRX2", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, {IF_WIDTH, "IF WIDTH", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, - {IF_WIDTH_RX1, "IF WIDTH\nRX1", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, - {IF_WIDTH_RX2, "IF WIDTH\nRX2", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, + {IF_WIDTH_RX1, "IF WIDTH\nRX1", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, + {IF_WIDTH_RX2, "IF WIDTH\nRX2", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, {LINEIN_GAIN, "LINEIN\nGAIN", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, {LOCK, "LOCK", "LOCK", MIDI_KEY | CONTROLLER_SWITCH}, {MENU_AGC, "AGC\nMENU", "AGC", MIDI_KEY | CONTROLLER_SWITCH}, {MENU_BAND, "BAND\nMENU", "BAND", MIDI_KEY | CONTROLLER_SWITCH}, - {MENU_BANDSTACK, "BSTCK\nMENU", "BSTK", MIDI_KEY | CONTROLLER_SWITCH}, - {MENU_DIVERSITY, "DIV\nMENU", "DIV", MIDI_KEY | CONTROLLER_SWITCH}, + {MENU_BANDSTACK, "BSTK\nMENU", "BSTK", MIDI_KEY | CONTROLLER_SWITCH}, + {MENU_DIVERSITY, "DIV\nMENU", "DIV", MIDI_KEY | CONTROLLER_SWITCH}, {MENU_FILTER, "FILT\nMENU", "FILT", MIDI_KEY | CONTROLLER_SWITCH}, - {MENU_FREQUENCY, "FREQ\nMENU", "FREQ", MIDI_KEY | CONTROLLER_SWITCH}, - {MENU_MEMORY, "MEMORY\nMENU", "MEM", MIDI_KEY | CONTROLLER_SWITCH}, + {MENU_FREQUENCY, "FREQ\nMENU", "FREQ", MIDI_KEY | CONTROLLER_SWITCH}, + {MENU_MEMORY, "MEM\nMENU", "MEM", MIDI_KEY | CONTROLLER_SWITCH}, {MENU_MODE, "MODE\nMENU", "MODE", MIDI_KEY | CONTROLLER_SWITCH}, {MENU_NOISE, "NOISE\nMENU", "NOISE", MIDI_KEY | CONTROLLER_SWITCH}, {MENU_PS, "PS MENU", "PS", MIDI_KEY | CONTROLLER_SWITCH}, {MIC_GAIN, "MIC GAIN", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, - {MODE_MINUS, "MODE +", "MOD+", MIDI_KEY | CONTROLLER_SWITCH}, - {MODE_PLUS, "MODE -", "MOD-", MIDI_KEY | CONTROLLER_SWITCH}, + {MODE_MINUS, "MODE -", "MD-", MIDI_KEY | CONTROLLER_SWITCH}, + {MODE_PLUS, "MODE +", "MD+", MIDI_KEY | CONTROLLER_SWITCH}, {MOX, "MOX", "MOX", MIDI_KEY | CONTROLLER_SWITCH}, {MUTE, "MUTE", "MUTE", MIDI_KEY | CONTROLLER_SWITCH}, {NB, "NB", "NB", MIDI_KEY | CONTROLLER_SWITCH}, {NR, "NR", "NR", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_0, "NUMPAD\n0", "0", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_1, "NUMPAD\n1", "1", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_2, "NUMPAD\n2", "2", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_3, "NUMPAD\n3", "3", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_4, "NUMPAD\n4", "4", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_5, "NUMPAD\n5", "5", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_6, "NUMPAD\n6", "6", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_7, "NUMPAD\n7", "7", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_8, "NUMPAD\n8", "8", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_9, "NUMPAD\n9", "9", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_CL, "NUMPAD\nCL", "CL", MIDI_KEY | CONTROLLER_SWITCH}, - {NUMPAD_ENTER, "NUMPAD\nENTER", "EN", MIDI_KEY | CONTROLLER_SWITCH}, + {NUMPAD_0, "NUMPAD 0", "0", MIDI_KEY}, + {NUMPAD_1, "NUMPAD 1", "1", MIDI_KEY}, + {NUMPAD_2, "NUMPAD 2", "2", MIDI_KEY}, + {NUMPAD_3, "NUMPAD 3", "3", MIDI_KEY}, + {NUMPAD_4, "NUMPAD 4", "4", MIDI_KEY}, + {NUMPAD_5, "NUMPAD 5", "5", MIDI_KEY}, + {NUMPAD_6, "NUMPAD 6", "6", MIDI_KEY}, + {NUMPAD_7, "NUMPAD 7", "7", MIDI_KEY}, + {NUMPAD_8, "NUMPAD 8", "8", MIDI_KEY}, + {NUMPAD_9, "NUMPAD 9", "9", MIDI_KEY}, + {NUMPAD_CL, "NUMPAD\nCL", "CL", MIDI_KEY}, + {NUMPAD_ENTER, "NUMPAD\nENTER", "EN", MIDI_KEY}, {PAN, "PAN", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, {PAN_MINUS, "PAN -", "PAN-", MIDI_KEY | CONTROLLER_SWITCH}, {PAN_PLUS, "PAN +", "PAN+", MIDI_KEY | CONTROLLER_SWITCH}, @@ -158,9 +158,9 @@ ACTION_TABLE ActionTable[] = { {SQUELCH_RX2, "SQUELCH\nRX1", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, {SWAP_RX, "SWAP RX", "SWAPRX", MIDI_KEY | CONTROLLER_SWITCH}, {TUNE, "TUNE", "TUNE", MIDI_KEY | CONTROLLER_SWITCH}, - {TUNE_DRIVE, "TUNE\nDRIVE", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, - {TUNE_FULL, "TUNE\nFULL", "TUNF", MIDI_KEY | CONTROLLER_SWITCH}, - {TUNE_MEMORY, "TUNE\nMEMORY", "TUNM", MIDI_KEY | CONTROLLER_SWITCH}, + {TUNE_DRIVE, "TUNE\nDRV", NULL, MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER}, + {TUNE_FULL, "TUNE\nFUL", "TUNF", MIDI_KEY | CONTROLLER_SWITCH}, + {TUNE_MEMORY, "TUNE\nMEM", "TUNM", MIDI_KEY | CONTROLLER_SWITCH}, {TWO_TONE, "TWO TONE", "2TONE", MIDI_KEY | CONTROLLER_SWITCH}, {VFO, "VFO", NULL, MIDI_WHEEL | CONTROLLER_ENCODER}, {VFO_STEP_MINUS, "VFO STEP -", "STEP-", MIDI_KEY | CONTROLLER_SWITCH}, @@ -169,8 +169,8 @@ ACTION_TABLE ActionTable[] = { {VFOB, "VFO B", NULL, MIDI_WHEEL | CONTROLLER_ENCODER}, {VOX, "VOX\nON/OFF", "VOX", MIDI_KEY | CONTROLLER_SWITCH}, {VOXLEVEL, "VOX\nLEVEL", NULL, MIDI_WHEEL | CONTROLLER_ENCODER}, - {WATERFALL_HIGH, "WATERFALL\nHIGH", NULL, MIDI_WHEEL | CONTROLLER_ENCODER}, - {WATERFALL_LOW, "WATERFALL\nLOW", NULL, MIDI_WHEEL | CONTROLLER_ENCODER}, + {WATERFALL_HIGH, "WFALL\nHIGH", NULL, MIDI_WHEEL | CONTROLLER_ENCODER}, + {WATERFALL_LOW, "WFALL\nLOW", NULL, MIDI_WHEEL | CONTROLLER_ENCODER}, {XIT , "XIT", NULL, MIDI_WHEEL | CONTROLLER_ENCODER}, {XIT_CLEAR, "XIT\nCLEAR", "XITCL", MIDI_KEY | CONTROLLER_SWITCH}, {XIT_ENABLE, "XIT\nON/OFF", "XIT", MIDI_KEY | CONTROLLER_SWITCH}, @@ -194,7 +194,7 @@ int process_action(void *data) { int new_val; int i; - //g_print("%s: action=%d mode=%d value=%d\n",__FUNCTION__,a->action,a->mode,a->val); + g_print("%s: action=%d mode=%d value=%d\n",__FUNCTION__,a->action,a->mode,a->val); switch(a->action) { case A_SWAP_B: diff --git a/css.c b/css.c index c8b9ae3..810492c 100644 --- a/css.c +++ b/css.c @@ -1,10 +1,11 @@ #include <gtk/gtk.h> +#include "css.h" char *css= -" #small {\n" +" #small_button {\n" " padding: 0;\n" " font-family: Sans;\n" -" font-size: 12px;\n" +" font-size: 15px;\n" " }\n" ; diff --git a/css.h b/css.h new file mode 100644 index 0000000..148a8aa --- /dev/null +++ b/css.h @@ -0,0 +1,3 @@ +extern char *css; +extern void load_css(); + diff --git a/discovery.c b/discovery.c index c3a69bd..7fdfaa1 100644 --- a/discovery.c +++ b/discovery.c @@ -465,7 +465,7 @@ fprintf(stderr,"%p Protocol=%d name=%s\n",d,d->protocol,d->name); gtk_widget_override_font(start_button, pango_font_description_from_string("Sans 16")); gtk_widget_show(start_button); gtk_grid_attach(GTK_GRID(grid),start_button,3,row,1,1); - g_signal_connect(start_button,"button_press_event",G_CALLBACK(start_cb),(gpointer)d); + g_signal_connect(start_button,"button-press-event",G_CALLBACK(start_cb),(gpointer)d); // if not available then cannot start it if(d->status!=STATE_AVAILABLE) { diff --git a/encoder_menu.c b/encoder_menu.c index aa8aa59..933be4b 100644 --- a/encoder_menu.c +++ b/encoder_menu.c @@ -33,13 +33,16 @@ #include "vfo.h" #include "button_text.h" #include "actions.h" +#include "action_dialog.h" #include "gpio.h" #include "i2c.h" typedef struct _choice { int id; int action; + GtkWidget *initial_button; GtkWidget *button; + gulong signal_id; } CHOICE; static GtkWidget *parent_window=NULL; @@ -65,116 +68,54 @@ static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_d return FALSE; } -static void encoder_bottom_select_cb(GtkWidget *widget,gpointer data) { - CHOICE *choice=(CHOICE *)data; - encoders[choice->id].bottom_encoder_function=choice->action; - gtk_button_set_label(GTK_BUTTON(choice->button),ActionTable[choice->action].button_str); -} - -static void encoder_top_select_cb(GtkWidget *widget,gpointer data) { - CHOICE *choice=(CHOICE *)data; - encoders[choice->id].top_encoder_function=choice->action; - gtk_button_set_label(GTK_BUTTON(choice->button),ActionTable[choice->action].button_str); -} - -static void encoder_switch_select_cb(GtkWidget *widget,gpointer data) { - CHOICE *choice=(CHOICE *)data; - encoders[choice->id].switch_function=choice->action; - gtk_button_set_label(GTK_BUTTON(choice->button),ActionTable[choice->action].button_str); -} - static gboolean encoder_bottom_cb(GtkWidget *widget, GdkEvent *event, gpointer data) { - int encoder=GPOINTER_TO_INT(data); - int i; - - GtkWidget *menu=gtk_menu_new(); - for(i=0;i<ACTIONS;i++) { - if(ActionTable[i].type|CONTROLLER_ENCODER) { - GtkWidget *menu_item=gtk_menu_item_new_with_label(ActionTable[i].str); - CHOICE *choice=g_new0(CHOICE,1); - choice->id=encoder; - choice->action=i; - choice->button=widget; - g_signal_connect(menu_item,"activate",G_CALLBACK(encoder_bottom_select_cb),choice); - gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); - } - } - gtk_widget_show_all(menu); -#if GTK_CHECK_VERSION(3,22,0) - gtk_menu_popup_at_pointer(GTK_MENU(menu),(GdkEvent *)event); -// the following line of code is to work around the problem of the popup menu not having scroll bars. - gtk_menu_reposition(GTK_MENU(menu)); -#else - gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time()); -#endif + int en=GPOINTER_TO_INT(data); + int action=action_dialog(top_window,CONTROLLER_ENCODER,encoders[en].bottom_encoder_function); + gtk_button_set_label(GTK_BUTTON(widget),ActionTable[action].str); + encoders[en].bottom_encoder_function=action; return TRUE; } static gboolean encoder_top_cb(GtkWidget *widget, GdkEvent *event, gpointer data) { - int encoder=GPOINTER_TO_INT(data); - int i; - - GtkWidget *menu=gtk_menu_new(); - for(i=0;i<ACTIONS;i++) { - if(ActionTable[i].type|CONTROLLER_ENCODER) { - GtkWidget *menu_item=gtk_menu_item_new_with_label(ActionTable[i].str); - CHOICE *choice=g_new0(CHOICE,1); - choice->id=encoder; - choice->action=i; - choice->button=widget; - g_signal_connect(menu_item,"activate",G_CALLBACK(encoder_top_select_cb),choice); - gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); - } - } - gtk_widget_show_all(menu); -#if GTK_CHECK_VERSION(3,22,0) - gtk_menu_popup_at_pointer(GTK_MENU(menu),(GdkEvent *)event); -// the following line of code is to work around the problem of the popup menu not having scroll bars. - gtk_menu_reposition(GTK_MENU(menu)); -#else - gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time()); -#endif + int en=GPOINTER_TO_INT(data); + int action=action_dialog(dialog,CONTROLLER_ENCODER,encoders[en].top_encoder_function); + gtk_button_set_label(GTK_BUTTON(widget),ActionTable[action].str); + encoders[en].top_encoder_function=action; return TRUE; } static gboolean encoder_switch_cb(GtkWidget *widget, GdkEvent *event, gpointer data) { - int encoder=GPOINTER_TO_INT(data); - int i; - - GtkWidget *menu=gtk_menu_new(); - for(i=0;i<ACTIONS;i++) { - if(ActionTable[i].type|CONTROLLER_SWITCH) { - GtkWidget *menu_item=gtk_menu_item_new_with_label(ActionTable[i].str); - CHOICE *choice=g_new0(CHOICE,1); - choice->id=encoder; - choice->action=i; - choice->button=widget; - g_signal_connect(menu_item,"activate",G_CALLBACK(encoder_switch_select_cb),choice); - gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); - } - } - gtk_widget_show_all(menu); -#if GTK_CHECK_VERSION(3,22,0) - gtk_menu_popup_at_pointer(GTK_MENU(menu),(GdkEvent *)event); -// the following line of code is to work around the problem of the popup menu not having scroll bars. - gtk_menu_reposition(GTK_MENU(menu)); -#else - gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time()); -#endif + int en=GPOINTER_TO_INT(data); + int action=action_dialog(dialog,CONTROLLER_SWITCH,encoders[en].switch_function); + gtk_button_set_label(GTK_BUTTON(widget),ActionTable[action].str); + encoders[en].switch_function=action; return TRUE; } - void encoder_menu(GtkWidget *parent) { gint row=0; gint col=0; char label[32]; + GtkWidget *widget; dialog=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(parent)); //gtk_window_set_decorated(GTK_WINDOW(dialog),FALSE); char title[32]; - sprintf(title,"piHPSDR - Encoder Actions"); + switch(controller) { + case NO_CONTROLLER: + sprintf(title,"piHPSDR - No Encoders"); + break; + case CONTROLLER1: + sprintf(title,"piHPSDR - Controller 1 Encoder Actions"); + break; + case CONTROLLER2_V1: + sprintf(title,"piHPSDR - Controller 2 V1 Encoder Actions"); + break; + case CONTROLLER2_V2: + sprintf(title,"piHPSDR - Controller 2 V2 Encoder Actions"); + break; + } gtk_window_set_title(GTK_WINDOW(dialog),title); g_signal_connect (dialog, "delete_event", G_CALLBACK (delete_event), NULL); @@ -191,26 +132,238 @@ void encoder_menu(GtkWidget *parent) { row++; col=0; - gint max_encoders=MAX_ENCODERS; switch(controller) { case NO_CONTROLLER: - max_encoders=0; + // should never happen break; case CONTROLLER1: - max_encoders=4; + // 3 vertical single encoders with switches plus VFO + col=4; + for(int i=0;i<3;i++) { + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget), "<b>Switch</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[i].switch_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(i)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + row++; + col=4; + + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[i].bottom_encoder_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(i)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + row++; + col=4; + } + + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + g_sprintf(label,"<b>%s</b>",ActionTable[encoders[3].bottom_encoder_function].str); + gtk_label_set_markup (GTK_LABEL(widget), label); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + row++; + col=0; break; case CONTROLLER2_V1: - max_encoders=5; + // 3 horizontal single encoders with switches + row=4; + col=0; + for(int i=0;i<3;i++) { + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget), "<b>Switch</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[i].switch_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(i)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + } + row++; + col=0; + for(int i=0;i<3;i++) { + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[i].bottom_encoder_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(i)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + } + + // padding + row=1; + col=6; + widget=gtk_label_new(""); + gtk_widget_set_name(widget,"small_button"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + + // 1 vertical single encoder with switch plus VFO encoder + row=1; + col=7; + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget), "<b>Switch</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[3].switch_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(3)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + row++; + col=7; + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[3].bottom_encoder_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(3)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + + row=5; + col=7; + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[4].bottom_encoder_function].str); + gtk_widget_set_name(widget,"small_button"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + break; case CONTROLLER2_V2: - max_encoders=5; + // 3 horizontal double encoders with switches + row=5; + col=0; + for(int i=0;i<3;i++) { + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget), "<b>Switch</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[i].switch_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(i)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + } + row++; + col=0; + for(int i=0;i<3;i++) { + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget),"<b>Top</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[i].top_encoder_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_top_cb),GINT_TO_POINTER(i)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + } + row++; + col=0; + for(int i=0;i<3;i++) { + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget),"<b>Bottom</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[i].bottom_encoder_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(i)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + } + + // padding + row=1; + col=6; + widget=gtk_label_new(""); + gtk_widget_set_name(widget,"small_button"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + + // 1 vertical single double with switch plus VFO encoder + row=1; + col=7; + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget), "<b>Switch</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[3].switch_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(3)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + row++; + col=7; + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget),"<b>Top</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[3].top_encoder_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_top_cb),GINT_TO_POINTER(3)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + row++; + col=7; + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget),"<b>Bottom</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[3].bottom_encoder_function].str); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(3)); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + + row=7; + col=7; + widget=gtk_label_new(NULL); + gtk_widget_set_name(widget,"small_button"); + gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + widget=gtk_button_new_with_label(ActionTable[encoders[4].bottom_encoder_function].str); + gtk_widget_set_name(widget,"small_button"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + break; } +/* + widget=gtk_label_new(NULL); + gtk_label_set_markup (GTK_LABEL(widget), controller==CONTROLLER2_V2?"<b>Bottom Encoder</b>":"<b>Encoder</b>"); + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + GtkWidget *widget=gtk_label_new(""); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; + widget=gtk_label_new(NULL); gtk_label_set_markup (GTK_LABEL(widget), controller==CONTROLLER2_V2?"<b>Bottom Encoder</b>":"<b>Encoder</b>"); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); @@ -243,21 +396,21 @@ void encoder_menu(GtkWidget *parent) { gtk_label_set_markup (GTK_LABEL(widget), label); } else { widget=gtk_button_new_with_label(ActionTable[encoders[i].bottom_encoder_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(i)); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(i)); } gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; if(controller==CONTROLLER2_V2) { widget=gtk_button_new_with_label(ActionTable[encoders[i].top_encoder_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(encoder_top_cb),GINT_TO_POINTER(i)); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_top_cb),GINT_TO_POINTER(i)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; } if(i!=(max_encoders-1)) { widget=gtk_button_new_with_label(ActionTable[encoders[i].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(i)); + g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(i)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; } @@ -265,7 +418,7 @@ void encoder_menu(GtkWidget *parent) { row++; col=0; } - +*/ gtk_container_add(GTK_CONTAINER(content),grid); sub_menu=dialog; diff --git a/gpio.c b/gpio.c index 9eab905..5505c5b 100644 --- a/gpio.c +++ b/gpio.c @@ -410,7 +410,7 @@ static unsigned long switch_debounce; static void process_encoder(int e,int l,int addr,int val) { guchar pinstate; - //g_print("%s: encoder=%d level=%d addr=0x%02X val=%d\n",__FUNCTION__,e,l,addr,val); + g_print("%s: encoder=%d level=%d addr=0x%02X val=%d\n",__FUNCTION__,e,l,addr,val); g_mutex_lock(&encoder_mutex); switch(l) { case BOTTOM_ENCODER: @@ -419,7 +419,7 @@ static void process_encoder(int e,int l,int addr,int val) { encoders[e].bottom_encoder_a_value=val; pinstate=(encoders[e].bottom_encoder_b_value<<1) | encoders[e].bottom_encoder_a_value; encoders[e].bottom_encoder_state=encoder_state_table[encoders[e].bottom_encoder_state&0xf][pinstate]; - //g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].bottom_encoder_state); + g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].bottom_encoder_state); switch(encoders[e].bottom_encoder_state&0x30) { case DIR_NONE: break; @@ -433,13 +433,13 @@ static void process_encoder(int e,int l,int addr,int val) { break; } - //g_print("%s: %s BOTTOM pos=%d\n",__FUNCTION__,encoder_string[encoders[e].bottom_encoder_function],encoders[e].bottom_encoder_pos); + g_print("%s: %d BOTTOM pos=%d\n",__FUNCTION__,e,encoders[e].bottom_encoder_pos); break; case B: encoders[e].bottom_encoder_b_value=val; pinstate=(encoders[e].bottom_encoder_b_value<<1) | encoders[e].bottom_encoder_a_value; encoders[e].bottom_encoder_state=encoder_state_table[encoders[e].bottom_encoder_state&0xf][pinstate]; - //g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].bottom_encoder_state); + g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].bottom_encoder_state); switch(encoders[e].bottom_encoder_state&0x30) { case DIR_NONE: break; @@ -453,7 +453,7 @@ static void process_encoder(int e,int l,int addr,int val) { break; } - //g_print("%s: %s BOTTOM pos=%d\n",__FUNCTION__,encoder_string[encoders[e].bottom_encoder_function],encoders[e].bottom_encoder_pos); + g_print("%s: %d BOTTOM pos=%d\n",__FUNCTION__,e,encoders[e].bottom_encoder_pos); break; } @@ -464,7 +464,7 @@ static void process_encoder(int e,int l,int addr,int val) { encoders[e].top_encoder_a_value=val; pinstate=(encoders[e].top_encoder_b_value<<1) | encoders[e].top_encoder_a_value; encoders[e].top_encoder_state=encoder_state_table[encoders[e].top_encoder_state&0xf][pinstate]; - //g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].top_encoder_state); + g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].top_encoder_state); switch(encoders[e].top_encoder_state&0x30) { case DIR_NONE: break; @@ -477,13 +477,13 @@ static void process_encoder(int e,int l,int addr,int val) { default: break; } - //g_print("%s: %s TOP pos=%d\n",__FUNCTION__,encoder_string[encoders[e].top_encoder_function],encoders[e].top_encoder_pos); + g_print("%s: %d TOP pos=%d\n",__FUNCTION__,e,encoders[e].top_encoder_pos); break; case B: encoders[e].top_encoder_b_value=val; pinstate=(encoders[e].top_encoder_b_value<<1) | encoders[e].top_encoder_a_value; encoders[e].top_encoder_state=encoder_state_table[encoders[e].top_encoder_state&0xf][pinstate]; - //g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].top_encoder_state); + g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].top_encoder_state); switch(encoders[e].top_encoder_state&0x30) { case DIR_NONE: break; @@ -496,7 +496,7 @@ static void process_encoder(int e,int l,int addr,int val) { default: break; } - //g_print("%s: %s TOP pos=%d\n",__FUNCTION__,encoder_string[encoders[e].top_encoder_function],encoders[e].top_encoder_pos); + g_print("%s: %d TOP pos=%d\n",__FUNCTION__,e,encoders[e].top_encoder_pos); break; } @@ -528,22 +528,22 @@ static void process_edge(int offset,int value) { for(i=0;i<MAX_ENCODERS;i++) { if(encoders[i].bottom_encoder_enabled && encoders[i].bottom_encoder_address_a==offset) { //g_print("%s: found %d encoder %d bottom A\n",__FUNCTION__,offset,i); - process_encoder(i,BOTTOM_ENCODER,A,value); + process_encoder(i,BOTTOM_ENCODER,A,value==PRESSED?1:0); found=TRUE; break; } else if(encoders[i].bottom_encoder_enabled && encoders[i].bottom_encoder_address_b==offset) { //g_print("%s: found %d encoder %d bottom B\n",__FUNCTION__,offset,i); - process_encoder(i,BOTTOM_ENCODER,B,value); + process_encoder(i,BOTTOM_ENCODER,B,value==PRESSED?1:0); found=TRUE; break; } else if(encoders[i].top_encoder_enabled && encoders[i].top_encoder_address_a==offset) { //g_print("%s: found %d encoder %d top A\n",__FUNCTION__,offset,i); - process_encoder(i,TOP_ENCODER,A,value); + process_encoder(i,TOP_ENCODER,A,value==PRESSED?1:0); found=TRUE; break; } else if(encoders[i].top_encoder_enabled && encoders[i].top_encoder_address_b==offset) { //g_print("%s: found %d encoder %d top B\n",__FUNCTION__,offset,i); - process_encoder(i,TOP_ENCODER,B,value); + process_encoder(i,TOP_ENCODER,B,value==PRESSED?1:0); found=TRUE; break; } else if(encoders[i].switch_enabled && encoders[i].switch_address==offset) { @@ -641,7 +641,6 @@ void gpio_restore_state() { loadProperties("gpio.props"); - controller=NO_CONTROLLER; value=getProperty("controller"); if(value) controller=atoi(value); gpio_set_defaults(controller); @@ -711,7 +710,6 @@ void gpio_restore_state() { if(value) switches[i].switch_address=atoi(value); } } - } void gpio_save_state() { @@ -798,6 +796,13 @@ void gpio_save_state() { void gpio_restore_actions() { char name[80]; char *value; + int previous_controller=NO_CONTROLLER; + + value=getProperty("controller"); + if(value) previous_controller=atoi(value); + gpio_set_defaults(controller); + + if(controller==previous_controller) { if(controller!=NO_CONTROLLER) { for(int i=0;i<MAX_ENCODERS;i++) { sprintf(name,"encoders[%d].bottom_encoder_function",i); @@ -826,11 +831,16 @@ void gpio_restore_actions() { if(value) switches[i].switch_function=atoi(value); } } + } } void gpio_save_actions() { char value[80]; char name[80]; + + sprintf(value,"%d",controller); + setProperty("controller",value); + if(controller!=NO_CONTROLLER) { for(int i=0;i<MAX_ENCODERS;i++) { sprintf(name,"encoders[%d].bottom_encoder_function",i); diff --git a/main.c b/main.c index 07bc002..903f450 100644 --- a/main.c +++ b/main.c @@ -62,6 +62,7 @@ #endif #include "ext.h" #include "vfo.h" +#include "css.h" struct utsname unameData; @@ -229,6 +230,8 @@ static void activate_pihpsdr(GtkApplication *app, gpointer data) { fprintf(stderr,"version: %s\n",unameData.version); fprintf(stderr,"machine: %s\n",unameData.machine); + load_css(); + GdkScreen *screen=gdk_screen_get_default(); if(screen==NULL) { fprintf(stderr,"no default screen!\n"); diff --git a/midi2.c b/midi2.c index 054c0f5..6b22790 100644 --- a/midi2.c +++ b/midi2.c @@ -34,7 +34,7 @@ void NewMidiEvent(enum MIDIevent event, int channel, int note, int val) { static struct timespec tp, last_wheel_tp={0,0}; long delta; -//g_print("%s: EVENT=%d CHAN=%d NOTE=%d VAL=%d\n",__FUNCTION__,event,channel,note,val); +g_print("%s: EVENT=%d CHAN=%d NOTE=%d VAL=%d\n",__FUNCTION__,event,channel,note,val); if (event == MIDI_PITCH) { desc=MidiCommandsTable.pitch; } else { diff --git a/midi3.c b/midi3.c index 2294a62..f2f0e7b 100644 --- a/midi3.c +++ b/midi3.c @@ -39,6 +39,8 @@ void DoTheMidi(int action, enum ACTIONtype type, int val) { // Handle cases in alphabetical order of the key words in midi.props // + g_print("%s: action=%d type=%d val=%d\n",__FUNCTION__,action,type,val); + switch(type) { case MIDI_KEY: a=g_new(PROCESS_ACTION,1); diff --git a/midi_menu.c b/midi_menu.c index 4d69ec6..20acaaf 100644 --- a/midi_menu.c +++ b/midi_menu.c @@ -24,6 +24,7 @@ #include <unistd.h> #include <termios.h> +#include "main.h" #include "discovered.h" #include "mode.h" #include "filter.h" @@ -35,6 +36,7 @@ #include "dac.h" #include "radio.h" #include "actions.h" +#include "action_dialog.h" #include "midi.h" #include "alsa_midi.h" #include "new_menu.h" @@ -97,6 +99,13 @@ enum { UPDATE_EXISTING }; +typedef struct _choice { + int action; + GtkWidget *initial_button; + GtkWidget *button; + gulong signal_id; +} CHOICE; + static int update(void *data); static void load_store(); @@ -159,47 +168,27 @@ static void type_changed_cb(GtkWidget *widget, gpointer data) { // update actions available for the type gchar *type=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widget)); + g_print("%s: %s\n",__FUNCTION__,type); + gtk_button_set_label(GTK_BUTTON(newAction),ActionTable[thisAction].str); // NONE +} - g_print("%s: type=%s action=%d\n",__FUNCTION__,type,thisAction); - gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(newAction)); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,ActionTable[0].str); +static gboolean action_cb(GtkWidget *widget,gpointer data) { + int selection=0; + gchar *type=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newType)); if(type==NULL || strcmp(type,"NONE")==0) { - // leave empty - gtk_combo_box_set_active (GTK_COMBO_BOX(newAction),0); + return TRUE; } else if(strcmp(type,"KEY")==0) { - // add all the Key actions - for(i=1;i<ACTIONS;i++) { - if(ActionTable[i].type&MIDI_KEY) { - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,ActionTable[i].str); - if(ActionTable[i].action==thisAction) { - gtk_combo_box_set_active(GTK_COMBO_BOX(newAction),j); - } - j++; - } - } + selection=MIDI_KEY; } else if(strcmp(type,"KNOB/SLIDER")==0) { - // add all the Knob actions - for(i=1;i<ACTIONS;i++) { - if(ActionTable[i].type&MIDI_KNOB) { - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,ActionTable[i].str); - if(ActionTable[i].action==thisAction) { - gtk_combo_box_set_active (GTK_COMBO_BOX(newAction),j); - } - j++; - } - } + selection=MIDI_KNOB; } else if(strcmp(type,"WHEEL")==0) { - // add all the Wheel actions - for(i=1;i<ACTIONS;i++) { - if(ActionTable[i].type&MIDI_WHEEL || ActionTable[i].type&MIDI_KNOB) { - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,ActionTable[i].str); - if(ActionTable[i].action==thisAction) { - gtk_combo_box_set_active (GTK_COMBO_BOX(newAction),j); - } - j++; - } - } + selection=MIDI_WHEEL | MIDI_KNOB; } +g_print("%s: type=%s selection=%02X thisAction=%d\n",__FUNCTION__,type,selection,thisAction); + int action=action_dialog(top_window,selection,thisAction); + thisAction=action; + gtk_button_set_label(GTK_BUTTON(newAction),ActionTable[action].str); + return TRUE; } static void row_inserted_cb(GtkTreeModel *tree_model,GtkTreePath *path, GtkTreeIter *iter,gpointer user_data) { @@ -214,65 +203,58 @@ static void tree_selection_changed_cb (GtkTreeSelection *selection, gpointer dat char *str_note; char *str_type; char *str_action; + int i; - //g_print("%s\n",__FUNCTION__); - //if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(configure_b))) { - if (gtk_tree_selection_get_selected (selection, &model, &iter)) { - gtk_tree_model_get(model, &iter, EVENT_COLUMN, &str_event, -1); - gtk_tree_model_get(model, &iter, CHANNEL_COLUMN, &str_channel, -1); - gtk_tree_model_get(model, &iter, NOTE_COLUMN, &str_note, -1); - gtk_tree_model_get(model, &iter, TYPE_COLUMN, &str_type, -1); - gtk_tree_model_get(model, &iter, ACTION_COLUMN, &str_action, -1); - - g_print("%s: %s %s %s %s %s\n",__FUNCTION__,str_event,str_channel,str_note,str_type,str_action); - - if(str_event!=NULL && str_channel!=NULL && str_note!=NULL && str_type!=NULL && str_action!=NULL) { + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + gtk_tree_model_get(model, &iter, EVENT_COLUMN, &str_event, -1); + gtk_tree_model_get(model, &iter, CHANNEL_COLUMN, &str_channel, -1); + gtk_tree_model_get(model, &iter, NOTE_COLUMN, &str_note, -1); + gtk_tree_model_get(model, &iter, TYPE_COLUMN, &str_type, -1); + gtk_tree_model_get(model, &iter, ACTION_COLUMN, &str_action, -1); + + if(str_event!=NULL && str_channel!=NULL && str_note!=NULL && str_type!=NULL && str_action!=NULL) { + + if(strcmp(str_event,"CTRL")==0) { + thisEvent=MIDI_CTRL; + } else if(strcmp(str_event,"PITCH")==0) { + thisEvent=MIDI_PITCH; + } else if(strcmp(str_event,"NOTE")==0) { + thisEvent=MIDI_NOTE; + } else { + thisEvent=EVENT_NONE; + } + thisChannel=atoi(str_channel); + thisNote=atoi(str_note); + thisVal=0; + thisMin=0; + thisMax=0; + if(strcmp(str_type,"KEY")==0) { + thisType=MIDI_KEY; + } else if(strcmp(str_type,"KNOB/SLIDER")==0) { + thisType=MIDI_KNOB; + } else if(strcmp(str_type,"WHEEL")==0) { + thisType=MIDI_WHEEL; + } else { + thisType=TYPE_NONE; + } - if(strcmp(str_event,"CTRL")==0) { - thisEvent=MIDI_CTRL; - } else if(strcmp(str_event,"PITCH")==0) { - thisEvent=MIDI_PITCH; - } else if(strcmp(str_event,"NOTE")==0) { - thisEvent=MIDI_NOTE; - } else { - thisEvent=EVENT_NONE; - } - thisChannel=atoi(str_channel); - thisNote=atoi(str_note); - thisVal=0; - thisMin=0; - thisMax=0; - if(strcmp(str_type,"KEY")==0) { - thisType=MIDI_KEY; - } else if(strcmp(str_type,"KNOB/SLIDER")==0) { - thisType=MIDI_KNOB; - } else if(strcmp(str_type,"WHEEL")==0) { - thisType=MIDI_WHEEL; - } else { - thisType=TYPE_NONE; - } - thisAction=NO_ACTION; - int i=1; - while(ActionTable[i].action!=NO_ACTION) { - if(strcmp(ActionTable[i].str,str_action)==0) { - thisAction=ActionTable[i].action; - break; - } - i++; + thisAction=NO_ACTION; + for(i=0;i<ACTIONS;i++) { + if(strcmp(ActionTable[i].str,str_action)==0) { + thisAction=ActionTable[i].action; + break; } - g_idle_add(update,GINT_TO_POINTER(UPDATE_EXISTING)); } + g_idle_add(update,GINT_TO_POINTER(UPDATE_EXISTING)); } - //} + } } static void find_current_cmd() { struct desc *cmd; - g_print("%s:\n",__FUNCTION__); cmd=MidiCommandsTable.desc[thisNote]; while(cmd!=NULL) { if((cmd->channel==thisChannel || cmd->channel==-1) && cmd->type==thisType && cmd->action==thisAction) { - g_print("%s: found cmd %p\n",__FUNCTION__,cmd); break; } cmd=cmd->next; @@ -476,7 +458,8 @@ static void load_store() { static void add_cb(GtkButton *widget,gpointer user_data) { gchar *str_type=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newType)); - gchar *str_action=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newAction)); + //gchar *str_action=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newAction)); + const gchar *str_action=gtk_button_get_label(GTK_BUTTON(newAction)); ; gint i; @@ -498,13 +481,11 @@ static void add_cb(GtkButton *widget,gpointer user_data) { } action=NO_ACTION; - i=1; - while(ActionTable[i].action!=NO_ACTION) { + for(i=0;i<ACTIONS;i++) { if(strcmp(ActionTable[i].str,str_action)==0) { action=ActionTable[i].action; break; } - i++; } g_print("%s: type=%s (%d) action=%s (%d)\n",__FUNCTION__,str_type,type,str_action,action); @@ -557,7 +538,8 @@ static void update_cb(GtkButton *widget,gpointer user_data) { gchar *str_type=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newType)); - gchar *str_action=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newAction)); + //gchar *str_action=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newAction)); + const gchar *str_action=gtk_button_get_label(GTK_BUTTON(newAction)); ; //g_print("%s: type=%s action=%s\n",__FUNCTION__,str_type,str_action); @@ -572,13 +554,11 @@ static void update_cb(GtkButton *widget,gpointer user_data) { } thisAction=NO_ACTION; - i=1; - while(ActionTable[i].action!=NO_ACTION) { + for(i=0;i<ACTIONS;i++) { if(strcmp(ActionTable[i].str,str_action)==0) { thisAction=ActionTable[i].action; break; } - i++; } current_cmd->channel=thisChannel; @@ -776,20 +756,20 @@ void midi_menu(GtkWidget *parent) { col++; g_signal_connect(newType,"changed",G_CALLBACK(type_changed_cb),NULL); newVal=gtk_label_new(""); - col++; gtk_grid_attach(GTK_GRID(grid),newVal,col,row,1,1); - newMin=gtk_label_new(""); col++; + newMin=gtk_label_new(""); gtk_grid_attach(GTK_GRID(grid),newMin,col,row,1,1); - newMax=gtk_label_new(""); col++; + newMax=gtk_label_new(""); gtk_grid_attach(GTK_GRID(grid),newMax,col,row,1,1); + col++; row++; col=col-4; - newAction=gtk_combo_box_text_new(); - gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(newAction),5); + newAction=gtk_button_new_with_label(" "); + g_signal_connect(newAction, "button-press-event", G_CALLBACK(action_cb),NULL); gtk_grid_attach(GTK_GRID(grid),newAction,col++,row,1,1); add_b=gtk_button_new_with_label("Add"); @@ -812,7 +792,7 @@ void midi_menu(GtkWidget *parent) { scrolled_window=gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS); - gtk_widget_set_size_request(scrolled_window,400,300); + gtk_widget_set_size_request(scrolled_window,400,200); view=gtk_tree_view_new(); @@ -862,7 +842,6 @@ static int update(void *data) { switch(state) { case UPDATE_NEW: - g_print("%s: UPDATE_NEW\n",__FUNCTION__); switch(thisEvent) { case EVENT_NONE: gtk_label_set_text(GTK_LABEL(newEvent),"NONE"); @@ -898,24 +877,7 @@ static int update(void *data) { gtk_combo_box_set_active (GTK_COMBO_BOX(newType),0); break; } - gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(newAction)); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,"NONE"); - gtk_combo_box_set_active (GTK_COMBO_BOX(newAction),0); - if(thisEvent==MIDI_PITCH || thisEvent==MIDI_NOTE) { - i=1; - j=0; - while(ActionTable[i].action!=NO_ACTION) { - if(ActionTable[i].type&MIDI_KEY) { - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,ActionTable[i].str); - if(ActionTable[i].action==thisAction) { - gtk_combo_box_set_active(GTK_COMBO_BOX(newAction),j); - } - j++; - } - i++; - } - - } + gtk_button_set_label(GTK_BUTTON(newAction),ActionTable[0].str); // NONE sprintf(text,"%d",thisVal); gtk_label_set_text(GTK_LABEL(newVal),text); sprintf(text,"%d",thisMin); @@ -929,7 +891,6 @@ static int update(void *data) { break; case UPDATE_CURRENT: - g_print("%s: UPDATE_CURRENT\n",__FUNCTION__); sprintf(text,"%d",thisVal); gtk_label_set_text(GTK_LABEL(newVal),text); sprintf(text,"%d",thisMin); @@ -939,7 +900,6 @@ static int update(void *data) { break; case UPDATE_EXISTING: - g_print("%s: UPDATE_EXISTING\n",__FUNCTION__); switch(thisEvent) { case EVENT_NONE: gtk_label_set_text(GTK_LABEL(newEvent),"NONE"); @@ -1013,21 +973,18 @@ void NewMidiConfigureEvent(enum MIDIevent event, int channel, int note, int val) char *str_note; char *str_type; char *str_action; + int i; gint tree_event; gint tree_channel; gint tree_note; - //g_print("%s: event=%d channel=%d note=%d val=%d\n", __FUNCTION__,event,channel,note,val); - if(event==thisEvent && channel==thisChannel && note==thisNote) { - //g_print("%s: current event\n",__FUNCTION__); thisVal=val; if(val<thisMin) thisMin=val; if(val>thisMax) thisMax=val; g_idle_add(update,GINT_TO_POINTER(UPDATE_CURRENT)); } else { - //g_print("%s: new or existing event\n",__FUNCTION__); thisEvent=event; thisChannel=channel; thisNote=note; @@ -1046,8 +1003,6 @@ void NewMidiConfigureEvent(enum MIDIevent event, int channel, int note, int val) gtk_tree_model_get(model, &iter, TYPE_COLUMN, &str_type, -1); gtk_tree_model_get(model, &iter, ACTION_COLUMN, &str_action, -1); - //g_print("%s: %s %s %s %s %s\n",__FUNCTION__,str_event,str_channel,str_note,str_type,str_action); - if(str_event!=NULL && str_channel!=NULL && str_note!=NULL && str_type!=NULL && str_action!=NULL) { if(strcmp(str_event,"CTRL")==0) { tree_event=MIDI_CTRL; @@ -1075,13 +1030,11 @@ void NewMidiConfigureEvent(enum MIDIevent event, int channel, int note, int val) thisType=TYPE_NONE; } thisAction=NO_ACTION; - int i=1; - while(ActionTable[i].action!=NO_ACTION) { + for(i=0;i<ACTIONS;i++) { if(strcmp(ActionTable[i].str,str_action)==0) { thisAction=ActionTable[i].action; break; } - i++; } gtk_tree_view_set_cursor(GTK_TREE_VIEW(view),gtk_tree_model_get_path(model,&iter),NULL,FALSE); g_idle_add(update,GINT_TO_POINTER(UPDATE_EXISTING)); @@ -1146,6 +1099,7 @@ void midi_restore_state() { gint onoff; gint type; gint action; + int i, j; struct desc *cmd; @@ -1168,7 +1122,7 @@ void midi_restore_state() { } } - for(int i=0;i<128;i++) { + for(i=0;i<128;i++) { sprintf(name,"midi[%d].channels",i); value=getProperty(name); if(value) { @@ -1196,7 +1150,7 @@ void midi_restore_state() { value=getProperty(name); type=TYPE_NONE; if(value) { - for(int j=0;j<5;j++) { + for(j=0;j<5;j++) { if(strcmp(value,midi_types[j])==0) { type=j; break; @@ -1207,13 +1161,11 @@ void midi_restore_state() { value=getProperty(name); action=NO_ACTION; if(value) { - int j=1; - while(ActionTable[j].type!=NO_ACTION) { + for(j=0;j<ACTIONS;j++) { if(strcmp(value,ActionTable[j].str)==0) { action=ActionTable[j].action; break; } - j++; } } diff --git a/new_menu.c b/new_menu.c index 7c5c1b3..663a7ca 100644 --- a/new_menu.c +++ b/new_menu.c @@ -54,6 +54,7 @@ #include "ps_menu.h" #include "encoder_menu.h" #include "switch_menu.h" +#include "toolbar_menu.h" #include "vfo_menu.h" #include "fft_menu.h" #include "main.h" @@ -194,13 +195,19 @@ static gboolean encoder_cb (GtkWidget *widget, GdkEventButton *event, gpointer d encoder_menu(top_window); return TRUE; } -#endif static gboolean switch_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { cleanup(); switch_menu(top_window); return TRUE; } +#endif + +static gboolean toolbar_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { + cleanup(); + toolbar_menu(top_window); + return TRUE; +} static gboolean cw_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { cleanup(); @@ -594,14 +601,28 @@ void new_menu() switch(controller) { case NO_CONTROLLER: - { + { + GtkWidget *toolbar_b=gtk_button_new_with_label("Toolbar"); + g_signal_connect (toolbar_b, "button-press-event", G_CALLBACK(toolbar_cb), NULL); + gtk_grid_attach(GTK_GRID(grid),toolbar_b,(i%5),i/5,1,1); + i++; + } + break; + case CONTROLLER1: +#ifdef GPIO + { + GtkWidget *encoders_b=gtk_button_new_with_label("Encoders"); + g_signal_connect (encoders_b, "button-press-event", G_CALLBACK(encoder_cb), NULL); + gtk_grid_attach(GTK_GRID(grid),encoders_b,(i%5),i/5,1,1); + i++; + GtkWidget *switches_b=gtk_button_new_with_label("Switches"); g_signal_connect (switches_b, "button-press-event", G_CALLBACK(switch_cb), NULL); gtk_grid_attach(GTK_GRID(grid),switches_b,(i%5),i/5,1,1); i++; } +#endif break; - case CONTROLLER1: case CONTROLLER2_V1: case CONTROLLER2_V2: { @@ -610,11 +631,16 @@ void new_menu() g_signal_connect (encoders_b, "button-press-event", G_CALLBACK(encoder_cb), NULL); gtk_grid_attach(GTK_GRID(grid),encoders_b,(i%5),i/5,1,1); i++; -#endif + GtkWidget *switches_b=gtk_button_new_with_label("Switches"); g_signal_connect (switches_b, "button-press-event", G_CALLBACK(switch_cb), NULL); gtk_grid_attach(GTK_GRID(grid),switches_b,(i%5),i/5,1,1); i++; +#endif + GtkWidget *toolbar_b=gtk_button_new_with_label("Toolbar"); + g_signal_connect (toolbar_b, "button-press-event", G_CALLBACK(toolbar_cb), NULL); + gtk_grid_attach(GTK_GRID(grid),toolbar_b,(i%5),i/5,1,1); + i++; } break; } diff --git a/radio.c b/radio.c index 2b9e1c4..d39d510 100644 --- a/radio.c +++ b/radio.c @@ -2099,9 +2099,6 @@ g_print("radioRestoreState: %s\n",property_path); memRestoreState(); vfo_restore_state(); modesettings_restore_state(); -//#ifdef GPIO -// gpio_restore_actions(); -//#endif gpio_restore_actions(); value=getProperty("rigctl_enable"); if(value) rigctl_enable=atoi(value); @@ -2236,11 +2233,6 @@ g_print("radioSaveState: %s\n",property_path); g_mutex_lock(&property_mutex); clearProperties(); -//#ifdef GPIO -// if(controller!=NO_CONTROLLER) { -// gpio_save_actions(); -// } -//#endif gpio_save_actions(); sprintf(value,"%d",receivers); setProperty("receivers",value); diff --git a/switch_menu.c b/switch_menu.c index 34fbf00..16d479e 100644 --- a/switch_menu.c +++ b/switch_menu.c @@ -34,13 +34,16 @@ #include "button_text.h" #include "toolbar.h" #include "actions.h" +#include "action_dialog.h" #include "gpio.h" #include "i2c.h" typedef struct _choice { int sw; int action; + GtkWidget *initial_button; GtkWidget *button; + gulong signal_id; } CHOICE; static GtkWidget *parent_window=NULL; @@ -73,40 +76,12 @@ void switch_page_cb(GtkNotebook *notebook,GtkWidget *page,guint page_num,gpointe temp_switches=switches_controller1[page_num]; } -static void switch_select_cb(GtkWidget *widget, gpointer data) { - char text[128]; - CHOICE *choice=(CHOICE *)data; - temp_switches[choice->sw].switch_function=choice->action; - GtkWidget *label=gtk_bin_get_child(GTK_BIN(choice->button)); - sprintf(text,"<span size=\"smaller\">%s</span>",ActionTable[choice->action].str); - gtk_label_set_markup (GTK_LABEL(label), text); - update_toolbar_labels(); -} - static gboolean switch_cb(GtkWidget *widget, GdkEvent *event, gpointer data) { int sw=GPOINTER_TO_INT(data); - int i; - - GtkWidget *menu=gtk_menu_new(); - for(i=0;i<ACTIONS;i++) { - if(ActionTable[i].type | CONTROLLER_SWITCH) { - GtkWidget *menu_item=gtk_menu_item_new_with_label(ActionTable[i].str); - CHOICE *choice=g_new0(CHOICE,1); - choice->sw=sw; - choice->action=i; - choice->button=widget; - g_signal_connect(menu_item,"activate",G_CALLBACK(switch_select_cb),choice); - gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); - } - } - gtk_widget_show_all(menu); -#if GTK_CHECK_VERSION(3,22,0) - gtk_menu_popup_at_pointer(GTK_MENU(menu),(GdkEvent *)event); -// the following line of code is to work around the problem of the popup menu not having scroll bars. - gtk_menu_reposition(GTK_MENU(menu)); -#else - gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time()); -#endif + int action=action_dialog(top_window,CONTROLLER_SWITCH,temp_switches[sw].switch_function); + gtk_button_set_label(GTK_BUTTON(widget),ActionTable[action].str); + temp_switches[sw].switch_function=action; + update_toolbar_labels(); return TRUE; } @@ -127,7 +102,7 @@ void switch_menu(GtkWidget *parent) { gint function=0; - dialog=gtk_dialog_new_with_buttons("piHPSDR - Switch Actions",GTK_WINDOW(parent),GTK_DIALOG_DESTROY_WITH_PARENT,("OK"),GTK_RESPONSE_ACCEPT,NULL); + dialog=gtk_dialog_new_with_buttons("piHPSDR - Switch Actions",GTK_WINDOW(parent),GTK_DIALOG_DESTROY_WITH_PARENT,"_OK",GTK_RESPONSE_ACCEPT,NULL); g_signal_connect (dialog, "response", G_CALLBACK (response_event), NULL); GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); @@ -142,9 +117,9 @@ next_function_set: grid=gtk_grid_new(); gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE); - gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE); - gtk_grid_set_column_spacing (GTK_GRID(grid),2); - gtk_grid_set_row_spacing (GTK_GRID(grid),2); + gtk_grid_set_row_homogeneous(GTK_GRID(grid),FALSE); + gtk_grid_set_column_spacing (GTK_GRID(grid),0); + gtk_grid_set_row_spacing (GTK_GRID(grid),0); row=0; @@ -177,74 +152,90 @@ next_function_set: row=row+5; col=0; widget=gtk_button_new_with_label(ActionTable[temp_switches[0].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(0)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(0)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; widget=gtk_button_new_with_label(ActionTable[temp_switches[1].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(1)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(1)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; widget=gtk_button_new_with_label(ActionTable[temp_switches[2].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(2)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(2)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; widget=gtk_button_new_with_label(ActionTable[temp_switches[3].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(3)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(3)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; widget=gtk_button_new_with_label(ActionTable[temp_switches[4].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(4)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(4)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; widget=gtk_button_new_with_label(ActionTable[temp_switches[5].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(5)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(5)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; widget=gtk_button_new_with_label(ActionTable[temp_switches[6].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(6)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(6)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; row=original_row; col=8; widget=gtk_button_new_with_label(ActionTable[temp_switches[7].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(7)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(7)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); row++; col=7; widget=gtk_button_new_with_label(ActionTable[temp_switches[8].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(8)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(8)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; widget=gtk_button_new_with_label(ActionTable[temp_switches[9].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(9)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(9)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); row++; col=7; widget=gtk_button_new_with_label(ActionTable[temp_switches[10].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(10)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(10)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; widget=gtk_button_new_with_label(ActionTable[temp_switches[11].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(11)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(11)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); row++; col=7; widget=gtk_button_new_with_label(ActionTable[temp_switches[12].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(12)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(12)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; widget=gtk_button_new_with_label(ActionTable[temp_switches[13].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(13)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(13)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); row++; col=7; widget=gtk_button_new_with_label(ActionTable[temp_switches[14].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(14)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(14)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; widget=gtk_button_new_with_label(ActionTable[temp_switches[15].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(15)); + gtk_widget_set_name(widget,"small_button"); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(15)); gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); gtk_container_add(GTK_CONTAINER(content),grid); @@ -253,12 +244,11 @@ next_function_set: for(int i=0;i<max_switches;i++) { if((controller==NO_CONTROLLER || controller==CONTROLLER1) && (temp_switches[i].switch_function==FUNCTION)) { widget=gtk_button_new_with_label(ActionTable[temp_switches[i].switch_function].str); - //widget=gtk_label_new(NULL); - //g_sprintf(label,"<b>%s</b>",ActionTable[temp_switches[i].switch_function].str); - //gtk_label_set_markup (GTK_LABEL(widget), label); + // no signal for Function button } else { widget=gtk_button_new_with_label(ActionTable[temp_switches[i].switch_function].str); - g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(i)); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(i)); +g_print("%s: %d\n",__FUNCTION__,i); } gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); col++; diff --git a/toolbar_menu.c b/toolbar_menu.c new file mode 100644 index 0000000..0297e36 --- /dev/null +++ b/toolbar_menu.c @@ -0,0 +1,156 @@ + +/* Copyright (C) +* 2016 - John Melton, G0ORX/N6LYT +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +*/ + +#include <gtk/gtk.h> +#include <glib/gprintf.h> +#include <stdio.h> +#include <string.h> + +#include "main.h" +#include "new_menu.h" +#include "agc_menu.h" +#include "agc.h" +#include "band.h" +#include "channel.h" +#include "radio.h" +#include "receiver.h" +#include "vfo.h" +#include "button_text.h" +#include "toolbar.h" +#include "actions.h" +#include "action_dialog.h" +#include "gpio.h" +#include "i2c.h" + +typedef struct _choice { + int sw; + int action; + GtkWidget *initial_button; + GtkWidget *button; + gulong signal_id; +} CHOICE; + +static GtkWidget *parent_window=NULL; + +static GtkWidget *dialog=NULL; + +static SWITCH *temp_switches; + + +static void cleanup() { + if(dialog!=NULL) { + gtk_widget_destroy(dialog); + dialog=NULL; + active_menu=NO_MENU; + sub_menu=NULL; + } +} + +static gboolean close_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { + cleanup(); + return TRUE; +} + +static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { + cleanup(); + return FALSE; +} + +static void switch_page_cb(GtkNotebook *notebook,GtkWidget *page,guint page_num,gpointer user_data) { + temp_switches=switches_controller1[page_num]; +} + +static gboolean switch_cb(GtkWidget *widget, GdkEvent *event, gpointer data) { + int sw=GPOINTER_TO_INT(data); + int action=action_dialog(top_window,CONTROLLER_SWITCH,temp_switches[sw].switch_function); + gtk_button_set_label(GTK_BUTTON(widget),ActionTable[action].str); + temp_switches[sw].switch_function=action; + update_toolbar_labels(); + return TRUE; +} + +static void response_event(GtkWidget *dialog,gint id,gpointer user_data) { + gtk_widget_destroy(dialog); + dialog=NULL; + active_menu=NO_MENU; + sub_menu=NULL; +} + +void toolbar_menu(GtkWidget *parent) { + gint row; + gint col; + gchar label[64]; + GtkWidget *notebook; + GtkWidget *grid; + GtkWidget *widget; + gint function=0; + + + dialog=gtk_dialog_new_with_buttons("piHPSDR - Toolbar Actions",GTK_WINDOW(parent),GTK_DIALOG_DESTROY_WITH_PARENT,"_OK",GTK_RESPONSE_ACCEPT,NULL); + g_signal_connect (dialog, "response", G_CALLBACK (response_event), NULL); + + GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + + function=0; + + notebook=gtk_notebook_new(); + +next_function_set: + + grid=gtk_grid_new(); + gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE); + gtk_grid_set_row_homogeneous(GTK_GRID(grid),FALSE); + gtk_grid_set_column_spacing (GTK_GRID(grid),0); + gtk_grid_set_row_spacing (GTK_GRID(grid),0); + + + row=0; + col=0; + + gint max_switches=MAX_SWITCHES; + max_switches=8; + temp_switches=switches_controller1[function]; + + for(int i=0;i<max_switches;i++) { + if(temp_switches[i].switch_function==FUNCTION) { + widget=gtk_button_new_with_label(ActionTable[temp_switches[i].switch_function].str); + // no signal for Function button + } else { + widget=gtk_button_new_with_label(ActionTable[temp_switches[i].switch_function].str); + g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(i)); +g_print("%s: %d\n",__FUNCTION__,i); + } + gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1); + col++; + } + + g_sprintf(label,"Function %d",function); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook),grid,gtk_label_new(label)); + function++; + if(function<MAX_FUNCTIONS) { + goto next_function_set; + } + gtk_container_add(GTK_CONTAINER(content),notebook); + g_signal_connect (notebook, "switch-page",G_CALLBACK(switch_page_cb),NULL); + + sub_menu=dialog; + + gtk_widget_show_all(dialog); +} diff --git a/toolbar_menu.h b/toolbar_menu.h new file mode 100644 index 0000000..a1d52df --- /dev/null +++ b/toolbar_menu.h @@ -0,0 +1 @@ +void toolbar_menu(GtkWidget *parent); diff --git a/vfo.c b/vfo.c index 549e7f1..5fe726c 100644 --- a/vfo.c +++ b/vfo.c @@ -1115,16 +1115,16 @@ void vfo_update() { if(can_transmit) { cairo_move_to(cr, 330, 50); if (transmitter->compressor) { - sprintf(temp_text,"CMPR %d dB",(int) transmitter->compressor_level); - cairo_set_source_rgb(cr, 1.0, 1.0, 0.0); - cairo_show_text(cr, temp_text); + sprintf(temp_text,"CMPR %ddB",(int) transmitter->compressor_level); + cairo_set_source_rgb(cr, 1.0, 1.0, 0.0); + cairo_show_text(cr, temp_text); } else { - cairo_set_source_rgb(cr, 0.7, 0.7, 0.7); - cairo_show_text(cr, "CMPR OFF"); + cairo_set_source_rgb(cr, 0.7, 0.7, 0.7); + cairo_show_text(cr, "CMPR"); } } - cairo_move_to(cr, 500, 50); + cairo_move_to(cr, 505, 50); if(diversity_enabled) { cairo_set_source_rgb(cr, 1.0, 1.0, 0.0); } else { @@ -1143,7 +1143,7 @@ void vfo_update() { cairo_set_source_rgb(cr, 1.0, 1.0, 0.0); cairo_show_text(cr, temp_text); - cairo_move_to(cr, 430, 50); + cairo_move_to(cr, 405, 50); if(vfo[id].ctun) { cairo_set_source_rgb(cr, 1.0, 1.0, 0.0); } else { @@ -1151,7 +1151,17 @@ void vfo_update() { } cairo_show_text(cr, "CTUN"); - cairo_move_to(cr, 470, 50); +#ifdef MIDI + cairo_move_to(cr, 445, 50); + if(midi_enabled) { + cairo_set_source_rgb(cr, 1.0, 1.0, 0.0); + } else { + cairo_set_source_rgb(cr, 0.7, 0.7, 0.7); + } + cairo_show_text(cr, "MIDI"); +#endif + + cairo_move_to(cr, 475, 50); if(cat_control>0) { cairo_set_source_rgb(cr, 1.0, 1.0, 0.0); } else { @@ -1160,7 +1170,7 @@ void vfo_update() { cairo_show_text(cr, "CAT"); if(can_transmit) { - cairo_move_to(cr, 500, 15); + cairo_move_to(cr, 505, 15); if(vox_enabled) { cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); } else { diff --git a/vfo_menu.c b/vfo_menu.c index b7eba43..2b4da08 100644 --- a/vfo_menu.c +++ b/vfo_menu.c @@ -291,13 +291,11 @@ void vfo_menu(GtkWidget *parent,int vfo) { gtk_grid_attach(GTK_GRID(grid),vfo_label,3,3,1,1); GtkWidget *vfo_b=gtk_combo_box_text_new(); - i=0; - while(steps[i]!=0) { + for(i=0;i<15;i++) { gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(vfo_b),NULL,step_labels[i]); if(steps[i]==step) { gtk_combo_box_set_active (GTK_COMBO_BOX(vfo_b), i); } - i++; } g_signal_connect(vfo_b,"changed",G_CALLBACK(vfo_cb),NULL); gtk_grid_attach(GTK_GRID(grid),vfo_b,4,3,1,1); -- 2.45.2