From: John Melton - G0ORX/N6LYT Date: Tue, 12 Jul 2016 13:41:40 +0000 (+0000) Subject: Cleaned up gpio and toolbar code. Moved Button configuration to Menu and made physica... X-Git-Url: https://git.rkrishnan.org/pf/components/$rel_link?a=commitdiff_plain;h=b7ee29205cd62563cfd2e7496a3aeb895e2b22dc;p=pihpsdr.git Cleaned up gpio and toolbar code. Moved Button configuration to Menu and made physical buttons act same as toolbar buttons. Change touching VFO area to lock frequency when touched on left half and to pop up dialog for step size when touched on right half. --- diff --git a/Makefile b/Makefile index feb2e7a..2ccc0f6 100644 --- a/Makefile +++ b/Makefile @@ -7,17 +7,14 @@ LINK=gcc ifeq ($(LIMESDR_INCLUDE),LIMESDR) LIMESDR_OPTIONS=-D LIMESDR -SOAPYSDRLIBS=-lSoapySDR -lpulse-simple -lpulse +SOAPYSDRLIBS=-lSoapySDR LIMESDR_SOURCES= \ -audio.c \ lime_discovery.c \ lime_protocol.c LIMESDR_HEADERS= \ -audio.h \ lime_discovery.h \ lime_protocol.h LIMESDR_OBJS= \ -audio.o \ lime_discovery.o \ lime_protocol.o endif @@ -67,7 +64,7 @@ OPTIONS=-g -D $(UNAME_N) $(LIMESDR_OPTIONS) $(FREEDV_OPTIONS) -O3 GTKINCLUDES=`pkg-config --cflags gtk+-3.0` GTKLIBS=`pkg-config --libs gtk+-3.0` -LIBS=-lrt -lm -lwdsp -lpthread $(GTKLIBS) $(GPIO_LIBS) $(SOAPYSDRLIBS) $(FREEDVLIBS) +LIBS=-lrt -lm -lwdsp -lpthread -lpulse-simple -lpulse $(GTKLIBS) $(GPIO_LIBS) $(SOAPYSDRLIBS) $(FREEDVLIBS) INCLUDES=$(GTKINCLUDES) COMPILE=$(CC) $(OPTIONS) $(INCLUDES) @@ -75,6 +72,7 @@ COMPILE=$(CC) $(OPTIONS) $(INCLUDES) PROGRAM=pihpsdr SOURCES= \ +audio.c \ band.c \ configure.c \ frequency.c \ @@ -102,6 +100,7 @@ wdsp_init.c HEADERS= \ +audio.h \ agc.h \ alex.h \ band.h \ @@ -132,6 +131,7 @@ xvtr.h OBJS= \ +audio.o \ band.o \ configure.o \ frequency.o \ diff --git a/audio.c b/audio.c index 17e99eb..3804d3a 100644 --- a/audio.c +++ b/audio.c @@ -51,10 +51,11 @@ static pthread_t audioThreadId; static unsigned char *audio_buffer; static int audio_offset=0; +static int running; void* audioThread(void* arg); -void audio_init() { +int audio_init() { static const pa_sample_spec spec= { .format = PA_SAMPLE_S16RE, @@ -70,30 +71,34 @@ fprintf(stderr,"audio_init audio_buffer_size=%d\n",audio_buffer_size); if (!(stream = pa_simple_new(NULL, "pihpsdr", PA_STREAM_PLAYBACK, NULL, "playback", &spec, NULL, NULL, &error))) { fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error)); - _exit(1); + return -1; } int res=sem_init(&audioBufferFull, 0, 0); if(res!=0) { fprintf(stderr,"audio_init: sem_init failed for audioBufferFull%d\n", res); - _exit(1); + return -1; } res=sem_init(&audioBufferEmpty, 0, 0); if(res!=0) { fprintf(stderr,"audio_init: sem_init failed for audioBufferEmpty%d\n", res); - _exit(1); + return -1; } res=pthread_create(&audioThreadId, NULL, audioThread, NULL); if(res<0) { fprintf(stderr, "Error creating DFC thread: %d\n", res); - _exit(1); + return -1; } fprintf(stderr,"... audio_init\n"); + return 0; } +void audio_close() { + running=0; +} void audio_write(double* buffer,int samples) { int i; @@ -122,8 +127,9 @@ void audio_write(double* buffer,int samples) { void* audioThread(void* arg) { int error; fprintf(stderr,"audioThread running on cpu%d\n", sched_getcpu()); + running=1; - while(1) { + while(running) { /* error=sem_post(&audioBufferEmpty); @@ -143,4 +149,8 @@ void* audioThread(void* arg) { _exit(1); } } + + fprintf(stderr,"audioThread: ending\n"); + pa_simple_free(stream); + } diff --git a/audio.h b/audio.h index e6d2da5..f8aff4a 100644 --- a/audio.h +++ b/audio.h @@ -20,5 +20,6 @@ extern int audio; extern int audio_buffer_size; -void audio_init(); +int audio_init(); +void audio_close(); void audio_write(double *buffer,int samples); diff --git a/configure.c b/configure.c index 021a6bb..aecdb4e 100644 --- a/configure.c +++ b/configure.c @@ -63,9 +63,11 @@ static void display_toolbar_cb(GtkWidget *widget, gpointer data) { display_toolbar=display_toolbar==1?0:1; } -static void toolbar_simulate_buttons_cb(GtkWidget *widget, gpointer data) { - toolbar_simulate_buttons=toolbar_simulate_buttons==1?0:1; +/* +static void toolbar_dialog_buttons_cb(GtkWidget *widget, gpointer data) { + toolbar_dialog_buttons=toolbar_dialog_buttons==1?0:1; } +*/ #ifdef INCLUDE_GPIO void configure_gpio(GtkWidget *parent) { @@ -471,12 +473,6 @@ void configure(DISCOVERED* d,GtkWidget *parent) { gtk_grid_attach(GTK_GRID(grid),b_display_toolbar,0,13,1,1); g_signal_connect(b_display_toolbar,"toggled",G_CALLBACK(display_toolbar_cb),(gpointer *)NULL); - GtkWidget *b_toolbar_simulate_buttons=gtk_check_button_new_with_label("Toolbar Simulate Buttons"); - //gtk_widget_override_font(b_toolbar_simulate_buttons, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_toolbar_simulate_buttons), toolbar_simulate_buttons); - gtk_widget_show(b_toolbar_simulate_buttons); - gtk_grid_attach(GTK_GRID(grid),b_toolbar_simulate_buttons,0,14,1,1); - g_signal_connect(b_toolbar_simulate_buttons,"toggled",G_CALLBACK(toolbar_simulate_buttons_cb),(gpointer *)NULL); gtk_container_add(GTK_CONTAINER(content),grid); GtkWidget *close_button=gtk_dialog_add_button(GTK_DIALOG(dialog),"Close",GTK_RESPONSE_OK); diff --git a/gpio.c b/gpio.c index 4367870..b00e740 100644 --- a/gpio.c +++ b/gpio.c @@ -810,87 +810,22 @@ static int agc_encoder_changed(void *data) { } static int band_pressed(void *data) { - BAND* band; - BANDSTACK_ENTRY *entry; -fprintf(stderr,"band_pressed\n"); - int b=band_get_current(); - if(function) { - b--; - if(b<0) { - b=BANDS-1; - } -#ifdef LIMESDR - if(protocol!=LIMESDR_PROTOCOL) { - if(b==band3400) { - b=band6; - } - } -#endif - } else { - b++; - if(b>=BANDS) { - b=0; - } -#ifdef LIMESDR - if(protocol!=LIMESDR_PROTOCOL) { - if(b==band70) { - b=bandGen; - } - } -#endif - } - band=band_set_current(b); - entry=bandstack_entry_get_current(); - - setFrequency(entry->frequencyA); - setMode(entry->mode); - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); - - band=band_get_current_band(); - set_alex_rx_antenna(band->alexRxAntenna); - set_alex_tx_antenna(band->alexTxAntenna); - set_alex_attenuation(band->alexAttenuation); - vfo_update(NULL); - + sim_band_cb(NULL,NULL); return 0; } static int bandstack_pressed(void *data) { - BANDSTACK_ENTRY *entry; - fprintf(stderr,"bandstack_pressed\n"); - if(function) { - entry=bandstack_entry_previous(); - } else { - entry=bandstack_entry_next(); - } - setFrequency(entry->frequencyA); - setMode(entry->mode); - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); - vfo_update(NULL); + sim_bandstack_cb(NULL,NULL); return 0; } static int function_pressed(void *data) { -fprintf(stderr,"function_pressed\n"); - function=function==1?0:1; - if(display_toolbar && toolbar_simulate_buttons) { - update_toolbar(); - } - vfo_update(NULL); + sim_function_cb(NULL,NULL); return 0; } static int mox_pressed(void *data) { -fprintf(stderr,"mox_pressed\n"); - if(function) { - tune_cb((GtkWidget *)NULL, (gpointer)NULL); - } else { - mox_cb((GtkWidget *)NULL, (gpointer)NULL); - } + sim_mox_cb(NULL,NULL); return 0; } @@ -901,119 +836,22 @@ fprintf(stderr,"lock_pressed\n"); } static int mode_pressed(void *data) { - BAND* band; - BANDSTACK_ENTRY *entry; - -fprintf(stderr,"mode_pressed\n"); - band=band_get_current_band(); - entry=bandstack_entry_get_current(); - if(function) { - entry->mode--; - if(entry->mode<0) { - entry->mode=MODES-1; - } - } else { - entry->mode++; - if(entry->mode>=MODES) { - entry->mode=0; - } - } - setMode(entry->mode); - - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); - - vfo_update(NULL); - + sim_mode_cb(NULL,NULL); return 0; } static int filter_pressed(void *data) { - BAND* band; - BANDSTACK_ENTRY *entry; - -fprintf(stderr,"filter_pressed\n"); - band=band_get_current_band(); - entry=bandstack_entry_get_current(); - // note order of filter reversed (largest first) - if(function) { - entry->filter++; - if(entry->filter>=FILTERS) { - entry->filter=0; - } - } else { - entry->filter--; - if(entry->filter<0) { - entry->filter=FILTERS-1; - } - } - - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); - - vfo_update(NULL); - + sim_filter_cb(NULL,NULL); return 0; } static int noise_pressed(void *data) { -fprintf(stderr,"noise_pressed\n"); - if(function) { - if(nr) { - nr=0; - } else if(nr2) { - nr2=0; - nr=1; - } else if(anf) { - anf=0; - nr2=1; - } else if(snb) { - snb=0; - anf=1; - } else { - snb=1; - } - } else { - if(nr) { - nr=0; - nr2=1; - } else if(nr2) { - nr2=0; - anf=1; - } else if(anf) { - anf=0; - snb=1; - } else if(snb) { - snb=0; - } else { - nr=1; - } - } - SetRXAANRRun(CHANNEL_RX0, nr); - SetRXAEMNRRun(CHANNEL_RX0, nr2); - SetRXAANFRun(CHANNEL_RX0, anf); - SetRXASNBARun(CHANNEL_RX0, snb); - vfo_update(NULL); + sim_noise_cb(NULL,NULL); return 0; } static int agc_pressed(void *data) { -fprintf(stderr,"agc_pressed\n"); - if(function) { - agc--; - if(agc<0) { - agc=3; - } - } else { - agc++; - if(agc>=4) { - agc=0; - } - } - SetRXAAGCMode(CHANNEL_RX0, agc); - vfo_update(NULL); + sim_agc_cb(NULL,NULL); return 0; } diff --git a/gpio_mraa.c b/gpio_mraa.c index e671e43..32b9b96 100644 --- a/gpio_mraa.c +++ b/gpio_mraa.c @@ -838,87 +838,22 @@ static int agc_encoder_changed(void *data) { } static int band_pressed(void *data) { - BAND* band; - BANDSTACK_ENTRY *entry; -fprintf(stderr,"band_pressed\n"); - int b=band_get_current(); - if(function) { - b--; - if(b<0) { - b=BANDS-1; - } -#ifdef LIMESDR - if(protocol!=LIMESDR_PROTOCOL) { - if(b==band3400) { - b=band6; - } - } -#endif - } else { - b++; - if(b>=BANDS) { - b=0; - } -#ifdef LIMESDR - if(protocol!=LIMESDR_PROTOCOL) { - if(b==band70) { - b=bandGen; - } - } -#endif - } - band=band_set_current(b); - entry=bandstack_entry_get_current(); - - setFrequency(entry->frequencyA); - setMode(entry->mode); - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); - - band=band_get_current_band(); - set_alex_rx_antenna(band->alexRxAntenna); - set_alex_tx_antenna(band->alexTxAntenna); - set_alex_attenuation(band->alexAttenuation); - vfo_update(NULL); - + sim_band_cb(NULL,NULL); return 0; } static int bandstack_pressed(void *data) { - BANDSTACK_ENTRY *entry; - fprintf(stderr,"bandstack_pressed\n"); - if(function) { - entry=bandstack_entry_previous(); - } else { - entry=bandstack_entry_next(); - } - setFrequency(entry->frequencyA); - setMode(entry->mode); - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); - vfo_update(NULL); + sim_bandstack_cb(NULL,NULL); return 0; } static int function_pressed(void *data) { -fprintf(stderr,"function_pressed\n"); - function=function==1?0:1; - if(display_toolbar && toolbar_simulate_buttons) { - update_toolbar(); - } - vfo_update(NULL); + sim_function_cb(NULL,NULL); return 0; } static int mox_pressed(void *data) { -fprintf(stderr,"mox_pressed\n"); - if(function) { - tune_cb((GtkWidget *)NULL, (gpointer)NULL); - } else { - mox_cb((GtkWidget *)NULL, (gpointer)NULL); - } + sim_mox_cb(NULL,NULL); return 0; } @@ -929,119 +864,22 @@ fprintf(stderr,"lock_pressed\n"); } static int mode_pressed(void *data) { - BAND* band; - BANDSTACK_ENTRY *entry; - -fprintf(stderr,"mode_pressed\n"); - band=band_get_current_band(); - entry=bandstack_entry_get_current(); - if(function) { - entry->mode--; - if(entry->mode<0) { - entry->mode=MODES-1; - } - } else { - entry->mode++; - if(entry->mode>=MODES) { - entry->mode=0; - } - } - setMode(entry->mode); - - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); - - vfo_update(NULL); - + sim_mode_cb(NULL,NULL); return 0; } static int filter_pressed(void *data) { - BAND* band; - BANDSTACK_ENTRY *entry; - -fprintf(stderr,"filter_pressed\n"); - band=band_get_current_band(); - entry=bandstack_entry_get_current(); - // note order of filter reversed (largest first) - if(function) { - entry->filter++; - if(entry->filter>=FILTERS) { - entry->filter=0; - } - } else { - entry->filter--; - if(entry->filter<0) { - entry->filter=FILTERS-1; - } - } - - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); - - vfo_update(NULL); - + sim_filter_cb(NULL,NULL); return 0; } static int noise_pressed(void *data) { -fprintf(stderr,"noise_pressed\n"); - if(function) { - if(nr) { - nr=0; - } else if(nr2) { - nr2=0; - nr=1; - } else if(anf) { - anf=0; - nr2=1; - } else if(snb) { - snb=0; - anf=1; - } else { - snb=1; - } - } else { - if(nr) { - nr=0; - nr2=1; - } else if(nr2) { - nr2=0; - anf=1; - } else if(anf) { - anf=0; - snb=1; - } else if(snb) { - snb=0; - } else { - nr=1; - } - } - SetRXAANRRun(CHANNEL_RX0, nr); - SetRXAEMNRRun(CHANNEL_RX0, nr2); - SetRXAANFRun(CHANNEL_RX0, anf); - SetRXASNBARun(CHANNEL_RX0, snb); - vfo_update(NULL); + sim_noise_cb(NULL,NULL); return 0; } static int agc_pressed(void *data) { -fprintf(stderr,"agc_pressed\n"); - if(function) { - agc--; - if(agc<0) { - agc=3; - } - } else { - agc++; - if(agc>=4) { - agc=0; - } - } - SetRXAAGCMode(CHANNEL_RX0, agc); - vfo_update(NULL); + sim_agc_cb(NULL,NULL); return 0; } diff --git a/lime_protocol.c b/lime_protocol.c index c7332eb..47bfbcc 100644 --- a/lime_protocol.c +++ b/lime_protocol.c @@ -190,7 +190,10 @@ fprintf(stderr,"lime_protocol: setting save_frequency: %lld\n",saved_frequency); } fprintf(stderr,"lime_protocol_init: audio_init\n"); - audio_init(); + if(audio_init()!=0) { + local_audio=false; + fprintf(stderr,"audio_init failed\n"); + } fprintf(stderr,"lime_protocol_init: create receive_thread\n"); rc=pthread_create(&receive_thread_id,NULL,receive_thread,NULL); @@ -251,7 +254,9 @@ fprintf(stderr,"lime_protocol: receive_thread\n"); fprintf(stderr,"fexchange0 (CHANNEL_RX0) returned error: %d\n", error); } - audio_write(audiooutputbuffer,outputsamples); + if(local_audio) { + audio_write(audiooutputbuffer,outputsamples); + } Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer); samples=0; } diff --git a/menu.c b/menu.c index 09dc54d..0476888 100644 --- a/menu.c +++ b/menu.c @@ -29,11 +29,13 @@ #include #include +#include "audio.h" #include "band.h" #include "channel.h" #include "discovered.h" #include "new_protocol.h" #include "radio.h" +#include "toolbar.h" #include "version.h" #include "wdsp.h" #ifdef FREEDV @@ -120,6 +122,23 @@ static void micboost_cb(GtkWidget *widget, gpointer data) { mic_boost=mic_boost==1?0:1; } +static void local_audio_cb(GtkWidget *widget, gpointer data) { + local_audio=local_audio==1?0:1; + if(local_audio) { + if(audio_init()!=0) { + fprintf(stderr,"audio_init failed\n"); + local_audio=0; + } + } else { + audio_close(); + } +} + +static void toolbar_dialog_buttons_cb(GtkWidget *widget, gpointer data) { + toolbar_dialog_buttons=toolbar_dialog_buttons==1?0:1; + update_toolbar_labels(); +} + static void ptt_cb(GtkWidget *widget, gpointer data) { mic_ptt_enabled=mic_ptt_enabled==1?0:1; } @@ -517,6 +536,19 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget, gtk_grid_attach(GTK_GRID(general_grid),micboost_b,1,2,1,1); g_signal_connect(micboost_b,"toggled",G_CALLBACK(micboost_cb),NULL); + GtkWidget *local_audio_b=gtk_check_button_new_with_label("Local Audio"); + //gtk_widget_override_font(local_audio_b, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (local_audio_b), local_audio); + gtk_widget_show(local_audio_b); + gtk_grid_attach(GTK_GRID(general_grid),local_audio_b,1,3,1,1); + g_signal_connect(local_audio_b,"toggled",G_CALLBACK(local_audio_cb),NULL); + + GtkWidget *b_toolbar_dialog_buttons=gtk_check_button_new_with_label("Buttons Display Dialog"); + //gtk_widget_override_font(b_toolbar_dialog_buttons, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_toolbar_dialog_buttons), toolbar_dialog_buttons); + gtk_widget_show(b_toolbar_dialog_buttons); + gtk_grid_attach(GTK_GRID(general_grid),b_toolbar_dialog_buttons,1,4,1,1); + g_signal_connect(b_toolbar_dialog_buttons,"toggled",G_CALLBACK(toolbar_dialog_buttons_cb),(gpointer *)NULL); if((protocol==NEW_PROTOCOL && device==NEW_DEVICE_ORION) || (protocol==NEW_PROTOCOL && device==NEW_DEVICE_ORION2) || @@ -526,28 +558,28 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget, //gtk_widget_override_font(ptt_ring_b, pango_font_description_from_string("Arial 18")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptt_ring_b), mic_ptt_tip_bias_ring==0); gtk_widget_show(ptt_ring_b); - gtk_grid_attach(GTK_GRID(general_grid),ptt_ring_b,1,3,1,1); + gtk_grid_attach(GTK_GRID(general_grid),ptt_ring_b,1,5,1,1); g_signal_connect(ptt_ring_b,"pressed",G_CALLBACK(ptt_ring_cb),NULL); GtkWidget *ptt_tip_b=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(ptt_ring_b),"PTT On Tip, Mic and Bias on Ring"); //gtk_widget_override_font(ptt_tip_b, pango_font_description_from_string("Arial 18")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptt_tip_b), mic_ptt_tip_bias_ring==1); gtk_widget_show(ptt_tip_b); - gtk_grid_attach(GTK_GRID(general_grid),ptt_tip_b,1,4,1,1); + gtk_grid_attach(GTK_GRID(general_grid),ptt_tip_b,1,6,1,1); g_signal_connect(ptt_tip_b,"pressed",G_CALLBACK(ptt_tip_cb),NULL); GtkWidget *ptt_b=gtk_check_button_new_with_label("PTT Enabled"); //gtk_widget_override_font(ptt_b, pango_font_description_from_string("Arial 18")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ptt_b), mic_ptt_enabled); gtk_widget_show(ptt_b); - gtk_grid_attach(GTK_GRID(general_grid),ptt_b,1,5,1,1); + gtk_grid_attach(GTK_GRID(general_grid),ptt_b,1,7,1,1); g_signal_connect(ptt_b,"toggled",G_CALLBACK(ptt_cb),NULL); GtkWidget *bias_b=gtk_check_button_new_with_label("BIAS Enabled"); //gtk_widget_override_font(bias_b, pango_font_description_from_string("Arial 18")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bias_b), mic_bias_enabled); gtk_widget_show(bias_b); - gtk_grid_attach(GTK_GRID(general_grid),bias_b,1,6,1,1); + gtk_grid_attach(GTK_GRID(general_grid),bias_b,1,8,1,1); g_signal_connect(bias_b,"toggled",G_CALLBACK(bias_cb),NULL); } @@ -583,6 +615,7 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget, } + id=gtk_notebook_append_page(GTK_NOTEBOOK(notebook),general_grid,general_label); GtkWidget *ant_label=gtk_label_new("Ant"); diff --git a/old_protocol.c b/old_protocol.c index a199e39..9da941f 100644 --- a/old_protocol.c +++ b/old_protocol.c @@ -208,6 +208,13 @@ void old_protocol_init(int rx,int pixels) { //int result=sem_init(&frequency_changed_sem, 0, 1); + if(local_audio) { + if(audio_init()!=0) { + fprintf(stderr,"audio_init failed\n"); + local_audio=0; + } + } + receiver=rx; display_width=pixels; @@ -518,6 +525,10 @@ static void full_rx_buffer() { if(error!=0) { fprintf(stderr,"fexchange2 (CHANNEL_RX0) returned error: %d\n", error); } + if(local_audio) { + audio_write(audiooutputbuffer,output_buffer_size); + } + Spectrum0(1, CHANNEL_RX0, 0, 0, iqinputbuffer); int demod_samples; diff --git a/pihpsdr b/pihpsdr index 74f215a..a166ed4 100755 Binary files a/pihpsdr and b/pihpsdr differ diff --git a/radio.c b/radio.c index 0cf7aec..3fd8c7a 100644 --- a/radio.c +++ b/radio.c @@ -80,7 +80,7 @@ int waterfall_automatic=1; int display_sliders=1; int display_toolbar=1; -int toolbar_simulate_buttons=1; +int toolbar_dialog_buttons=1; double volume=0.2; double mic_gain=1.5; @@ -178,6 +178,8 @@ long long tune_timeout; int smeter=RXA_S_AV; int alc=TXA_ALC_PK; +int local_audio=0; + #ifdef FREEDV char freedv_tx_text_data[64]; #endif @@ -418,8 +420,8 @@ void radioRestoreState() { if(value) display_sliders=atoi(value); value=getProperty("display_toolbar"); if(value) display_toolbar=atoi(value); - value=getProperty("toolbar_simulate_buttons"); - if(value) toolbar_simulate_buttons=atoi(value); + value=getProperty("toolbar_dialog_buttons"); + if(value) toolbar_dialog_buttons=atoi(value); value=getProperty("waterfall_high"); if(value) waterfall_high=atoi(value); value=getProperty("waterfall_low"); @@ -518,6 +520,8 @@ void radioRestoreState() { if(value) smeter=atoi(value); value=getProperty("alc"); if(value) alc=atoi(value); + value=getProperty("local_audio"); + if(value) local_audio=atoi(value); bandRestoreState(); sem_post(&property_sem); } @@ -556,8 +560,8 @@ void radioSaveState() { setProperty("display_sliders",value); sprintf(value,"%d",display_toolbar); setProperty("display_toolbar",value); - sprintf(value,"%d",toolbar_simulate_buttons); - setProperty("toolbar_simulate_buttons",value); + sprintf(value,"%d",toolbar_dialog_buttons); + setProperty("toolbar_dialog_buttons",value); sprintf(value,"%d",waterfall_high); setProperty("waterfall_high",value); sprintf(value,"%d",waterfall_low); @@ -657,6 +661,8 @@ void radioSaveState() { setProperty("smeter",value); sprintf(value,"%d",alc); setProperty("alc",value); + sprintf(value,"%d",local_audio); + setProperty("local_audio",value); bandSaveState(); saveProperties(property_path); diff --git a/radio.h b/radio.h index 934b964..1b6eadf 100644 --- a/radio.h +++ b/radio.h @@ -92,7 +92,7 @@ extern int waterfall_automatic; extern int display_sliders; extern int display_toolbar; -extern int toolbar_simulate_buttons; +extern int toolbar_dialog_buttons; extern double volume; extern double mic_gain; @@ -189,6 +189,8 @@ extern char freedv_tx_text_data[64]; extern int smeter; extern int alc; +extern int local_audio; + extern void init_radio(); extern void setSampleRate(int rate); extern int getSampleRate(); diff --git a/release/pihpsdr.tar b/release/pihpsdr.tar index a080be8..e212c0f 100644 Binary files a/release/pihpsdr.tar and b/release/pihpsdr.tar differ diff --git a/release/pihpsdr/pihpsdr b/release/pihpsdr/pihpsdr index 74f215a..a166ed4 100755 Binary files a/release/pihpsdr/pihpsdr and b/release/pihpsdr/pihpsdr differ diff --git a/toolbar.c b/toolbar.c index 6f4209e..12ab671 100644 --- a/toolbar.c +++ b/toolbar.c @@ -47,6 +47,7 @@ static int height; static GtkWidget *parent_window; static GtkWidget *toolbar; +static GtkWidget *sim_mox; static GtkWidget *sim_band; static GtkWidget *sim_bandstack; static GtkWidget *sim_mode; @@ -54,16 +55,50 @@ static GtkWidget *sim_filter; static GtkWidget *sim_agc; static GtkWidget *sim_noise; static GtkWidget *sim_function; -static GtkWidget *sim_mox; static GtkWidget *last_band; +static GtkWidget *last_bandstack; static GtkWidget *last_mode; static GtkWidget *last_filter; static GdkRGBA white; static GdkRGBA gray; +void update_toolbar_labels() { + if(toolbar_dialog_buttons) { + gtk_button_set_label(GTK_BUTTON(sim_band),"Band"); + gtk_button_set_label(GTK_BUTTON(sim_bandstack),"BStack"); + gtk_button_set_label(GTK_BUTTON(sim_mode),"Mode"); + gtk_button_set_label(GTK_BUTTON(sim_filter),"Filter"); + gtk_button_set_label(GTK_BUTTON(sim_noise),"Noise"); + gtk_button_set_label(GTK_BUTTON(sim_agc),"AGC"); + if(function) { + gtk_button_set_label(GTK_BUTTON(sim_mox),"Tune"); + } else { + gtk_button_set_label(GTK_BUTTON(sim_mox),"Mox"); + } + } else { + if(function) { + gtk_button_set_label(GTK_BUTTON(sim_band),"Band v"); + gtk_button_set_label(GTK_BUTTON(sim_bandstack),"BStack v"); + gtk_button_set_label(GTK_BUTTON(sim_mode),"Mode v"); + gtk_button_set_label(GTK_BUTTON(sim_filter),"Filter v"); + gtk_button_set_label(GTK_BUTTON(sim_noise),"Noise v"); + gtk_button_set_label(GTK_BUTTON(sim_agc),"AGC v"); + gtk_button_set_label(GTK_BUTTON(sim_mox),"Tune"); + } else { + gtk_button_set_label(GTK_BUTTON(sim_band),"Band ^"); + gtk_button_set_label(GTK_BUTTON(sim_bandstack),"BStack ^"); + gtk_button_set_label(GTK_BUTTON(sim_mode),"Mode ^"); + gtk_button_set_label(GTK_BUTTON(sim_filter),"Filter ^"); + gtk_button_set_label(GTK_BUTTON(sim_noise),"Noise ^"); + gtk_button_set_label(GTK_BUTTON(sim_agc),"AGC ^"); + gtk_button_set_label(GTK_BUTTON(sim_mox),"Mox"); + } + } +} + static void band_select_cb(GtkWidget *widget, gpointer data) { GtkWidget *label; int b=(int)data; @@ -93,7 +128,7 @@ static void band_select_cb(GtkWidget *widget, gpointer data) { setFrequency(entry->frequencyA); } -static void band_cb(GtkWidget *widget, gpointer data) { + void band_cb(GtkWidget *widget, gpointer data) { GtkWidget *dialog=gtk_dialog_new_with_buttons("Band",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL); GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); GtkWidget *grid=gtk_grid_new(); @@ -137,6 +172,85 @@ static void band_cb(GtkWidget *widget, gpointer data) { } +static void bandstack_select_cb(GtkWidget *widget, gpointer data) { + int b=(int)data; + BAND *band=band_get_current_band(); + BANDSTACK *bandstack=band->bandstack; + + bandstack->current_entry=b; + + gtk_widget_override_background_color(last_bandstack, GTK_STATE_NORMAL, &white); + last_bandstack=widget; + gtk_widget_override_background_color(last_bandstack, GTK_STATE_NORMAL, &gray); + + BANDSTACK_ENTRY *entry; + entry=&(bandstack->entry[b]); + + setMode(entry->mode); + FILTER* band_filters=filters[entry->mode]; + FILTER* band_filter=&band_filters[entry->filter]; + setFilter(band_filter->low,band_filter->high); + setFrequency(entry->frequencyA); + + set_alex_rx_antenna(band->alexRxAntenna); + set_alex_tx_antenna(band->alexTxAntenna); + set_alex_attenuation(band->alexAttenuation); + + vfo_update(NULL); + + setFrequency(entry->frequencyA); +} + +void bandstack_cb(GtkWidget *widget, gpointer data) { + GtkWidget *dialog=gtk_dialog_new_with_buttons("Band",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL); + GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + GtkWidget *grid=gtk_grid_new(); + gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE); + gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE); + GtkWidget *b; + int i; + + char label[16]; + + BAND *band=band_get_current_band(); + BANDSTACK *bandstack=band->bandstack; + + for(i=0;ientries;i++) { + BANDSTACK_ENTRY *entry=&bandstack->entry[i]; + sprintf(label,"%lld",entry->frequencyA); + GtkWidget *b=gtk_button_new_with_label(label); + gtk_widget_override_background_color(b, GTK_STATE_NORMAL, &white); + //gtk_widget_override_font(b, pango_font_description_from_string("Arial 20")); + if(i==bandstack->current_entry) { + gtk_widget_override_background_color(b, GTK_STATE_NORMAL, &gray); + last_bandstack=b; + } + gtk_widget_show(b); + gtk_grid_attach(GTK_GRID(grid),b,i%5,i/5,1,1); + g_signal_connect(b,"clicked",G_CALLBACK(bandstack_select_cb),(gpointer *)i); + } + + gtk_container_add(GTK_CONTAINER(content),grid); + + GtkWidget *close_button=gtk_dialog_add_button(GTK_DIALOG(dialog),"Close",GTK_RESPONSE_OK); + //gtk_widget_override_font(close_button, pango_font_description_from_string("Arial 20")); + gtk_widget_show_all(dialog); + + g_signal_connect_swapped (dialog, + "response", + G_CALLBACK (gtk_widget_destroy), + dialog); + + int result=gtk_dialog_run(GTK_DIALOG(dialog)); +} + +void function_cb(GtkWidget *widget, gpointer data) { + fprintf(stderr,"function_cb\n"); + function=function==1?0:1; + update_toolbar_labels(); + vfo_update(NULL); +} + static void mode_select_cb(GtkWidget *widget, gpointer data) { int m=(int)data; BANDSTACK_ENTRY *entry; @@ -152,7 +266,7 @@ static void mode_select_cb(GtkWidget *widget, gpointer data) { vfo_update(NULL); } -static void mode_cb(GtkWidget *widget, gpointer data) { +void mode_cb(GtkWidget *widget, gpointer data) { BANDSTACK_ENTRY *entry=bandstack_entry_get_current(); GtkWidget *dialog=gtk_dialog_new_with_buttons("Mode",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL); GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); @@ -203,7 +317,7 @@ static void filter_select_cb(GtkWidget *widget, gpointer data) { vfo_update(NULL); } -static void filter_cb(GtkWidget *widget, gpointer data) { +void filter_cb(GtkWidget *widget, gpointer data) { BANDSTACK_ENTRY *entry=bandstack_entry_get_current(); FILTER* band_filters=filters[entry->mode]; GtkWidget *dialog=gtk_dialog_new_with_buttons("Mode",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL); @@ -325,8 +439,9 @@ static void snb_cb(GtkWidget *widget, gpointer data) { update_noise(); } -static void audio_cb(GtkWidget *widget, gpointer data) { - GtkWidget *dialog=gtk_dialog_new_with_buttons("Audio",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL); + +void agc_cb(GtkWidget *widget, gpointer data) { + GtkWidget *dialog=gtk_dialog_new_with_buttons("AGC",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL); GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); GtkWidget *grid=gtk_grid_new(); @@ -369,25 +484,49 @@ static void audio_cb(GtkWidget *widget, gpointer data) { gtk_grid_attach(GTK_GRID(grid),b_fast,0,4,2,1); g_signal_connect(b_fast,"pressed",G_CALLBACK(agc_select_cb),(gpointer *)AGC_FAST); + gtk_container_add(GTK_CONTAINER(content),grid); + + GtkWidget *close_button=gtk_dialog_add_button(GTK_DIALOG(dialog),"Close",GTK_RESPONSE_OK); + //gtk_widget_override_font(close_button, pango_font_description_from_string("Arial 16")); + gtk_widget_show_all(dialog); + + g_signal_connect_swapped (dialog, + "response", + G_CALLBACK (gtk_widget_destroy), + dialog); + + int result=gtk_dialog_run(GTK_DIALOG(dialog)); + +} + +void noise_cb(GtkWidget *widget, gpointer data) { + GtkWidget *dialog=gtk_dialog_new_with_buttons("Noise",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL); + + GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + GtkWidget *grid=gtk_grid_new(); + + gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE); + gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE); + GtkWidget *b_nr_none=gtk_radio_button_new_with_label(NULL,"None"); //gtk_widget_override_font(b_none, pango_font_description_from_string("Arial 16")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_nr_none), nr_none==1); gtk_widget_show(b_nr_none); - gtk_grid_attach(GTK_GRID(grid),b_nr_none,2,0,2,1); + gtk_grid_attach(GTK_GRID(grid),b_nr_none,0,0,2,1); g_signal_connect(b_nr_none,"pressed",G_CALLBACK(nr_none_cb),NULL); GtkWidget *b_nr=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(b_nr_none),"NR"); //gtk_widget_override_font(b_nr, pango_font_description_from_string("Arial 16")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_nr), nr==1); gtk_widget_show(b_nr); - gtk_grid_attach(GTK_GRID(grid),b_nr,2,1,2,1); + gtk_grid_attach(GTK_GRID(grid),b_nr,0,1,2,1); g_signal_connect(b_nr,"pressed",G_CALLBACK(nr_cb),NULL); GtkWidget *b_nr2=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(b_nr),"NR2"); //gtk_widget_override_font(b_nr2, pango_font_description_from_string("Arial 16")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_nr2), nr2==1); gtk_widget_show(b_nr2); - gtk_grid_attach(GTK_GRID(grid),b_nr2,2,2,2,1); + gtk_grid_attach(GTK_GRID(grid),b_nr2,0,2,2,1); g_signal_connect(b_nr2,"pressed",G_CALLBACK(nr2_cb),NULL); /* @@ -395,14 +534,14 @@ static void audio_cb(GtkWidget *widget, gpointer data) { //gtk_widget_override_font(b_nb, pango_font_description_from_string("Arial 16")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_nb), nb==1); gtk_widget_show(b_nb); - gtk_grid_attach(GTK_GRID(grid),b_nb,2,3,2,1); + gtk_grid_attach(GTK_GRID(grid),b_nb,0,3,2,1); g_signal_connect(b_nb,"pressed",G_CALLBACK(nb_cb),NULL); GtkWidget *b_nb2=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(b_nb),"NB2"); //gtk_widget_override_font(b_nb2, pango_font_description_from_string("Arial 16")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_nb2), nb2==1); gtk_widget_show(b_nb2); - gtk_grid_attach(GTK_GRID(grid),b_nb2,2,4,2,1); + gtk_grid_attach(GTK_GRID(grid),b_nb2,0,4,2,1); g_signal_connect(b_nb2,"pressed",G_CALLBACK(nb2_cb),NULL); */ @@ -410,14 +549,14 @@ static void audio_cb(GtkWidget *widget, gpointer data) { //gtk_widget_override_font(b_anf, pango_font_description_from_string("Arial 16")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_anf), anf==1); gtk_widget_show(b_anf); - gtk_grid_attach(GTK_GRID(grid),b_anf,2,3,2,1); + gtk_grid_attach(GTK_GRID(grid),b_anf,0,3,2,1); g_signal_connect(b_anf,"pressed",G_CALLBACK(anf_cb),NULL); GtkWidget *b_snb=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(b_anf),"SNB"); //gtk_widget_override_font(b_snb, pango_font_description_from_string("Arial 16")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_snb), snb==1); gtk_widget_show(b_snb); - gtk_grid_attach(GTK_GRID(grid),b_snb,2,4,2,1); + gtk_grid_attach(GTK_GRID(grid),b_snb,0,4,2,1); g_signal_connect(b_snb,"pressed",G_CALLBACK(snb_cb),NULL); gtk_container_add(GTK_CONTAINER(content),grid); @@ -796,62 +935,70 @@ void sim_band_cb(GtkWidget *widget, gpointer data) { BAND* band; BANDSTACK_ENTRY *entry; fprintf(stderr,"sim_band_cb\n"); - int b=band_get_current(); - if(function) { - b--; - if(b<0) { - b=BANDS-1; - } + if(toolbar_dialog_buttons) { + band_cb(widget,data); + } else { + int b=band_get_current(); + if(function) { + b--; + if(b<0) { + b=BANDS-1; + } #ifdef LIMESDR - if(protocol!=LIMESDR_PROTOCOL) { - if(b==band3400) { - b=band6; + if(protocol!=LIMESDR_PROTOCOL) { + if(b==band3400) { + b=band6; + } } - } #endif - } else { - b++; - if(b>=BANDS) { - b=0; - } + } else { + b++; + if(b>=BANDS) { + b=0; + } #ifdef LIMESDR - if(protocol!=LIMESDR_PROTOCOL) { - if(b==band70) { - b=bandGen; + if(protocol!=LIMESDR_PROTOCOL) { + if(b==band70) { + b=bandGen; + } } - } #endif - } - band=band_set_current(b); - entry=bandstack_entry_get_current(); - - setFrequency(entry->frequencyA); - setMode(entry->mode); - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); + } + band=band_set_current(b); + entry=bandstack_entry_get_current(); - band=band_get_current_band(); - set_alex_rx_antenna(band->alexRxAntenna); - set_alex_tx_antenna(band->alexTxAntenna); - set_alex_attenuation(band->alexAttenuation); - vfo_update(NULL); + setFrequency(entry->frequencyA); + setMode(entry->mode); + FILTER* band_filters=filters[entry->mode]; + FILTER* band_filter=&band_filters[entry->filter]; + setFilter(band_filter->low,band_filter->high); + + band=band_get_current_band(); + set_alex_rx_antenna(band->alexRxAntenna); + set_alex_tx_antenna(band->alexTxAntenna); + set_alex_attenuation(band->alexAttenuation); + vfo_update(NULL); + } } void sim_bandstack_cb(GtkWidget *widget, gpointer data) { BANDSTACK_ENTRY *entry; fprintf(stderr,"sim_bandstack_cb\n"); - if(function) { - entry=bandstack_entry_previous(); + if(toolbar_dialog_buttons) { + bandstack_cb(widget,data); } else { - entry=bandstack_entry_next(); + if(function) { + entry=bandstack_entry_previous(); + } else { + entry=bandstack_entry_next(); + } + setFrequency(entry->frequencyA); + setMode(entry->mode); + FILTER* band_filters=filters[entry->mode]; + FILTER* band_filter=&band_filters[entry->filter]; + setFilter(band_filter->low,band_filter->high); + vfo_update(NULL); } - setFrequency(entry->frequencyA); - setMode(entry->mode); - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); - vfo_update(NULL); } void sim_mode_cb(GtkWidget *widget, gpointer data) { @@ -859,27 +1006,31 @@ void sim_mode_cb(GtkWidget *widget, gpointer data) { BANDSTACK_ENTRY *entry; fprintf(stderr,"sim_mode_cb\n"); - band=band_get_current_band(); - entry=bandstack_entry_get_current(); - if(function) { - entry->mode--; - if(entry->mode<0) { - entry->mode=MODES-1; - } + if(toolbar_dialog_buttons) { + mode_cb(widget,data); } else { - entry->mode++; - if(entry->mode>=MODES) { - entry->mode=0; + band=band_get_current_band(); + entry=bandstack_entry_get_current(); + if(function) { + entry->mode--; + if(entry->mode<0) { + entry->mode=MODES-1; + } + } else { + entry->mode++; + if(entry->mode>=MODES) { + entry->mode=0; + } } - } - setMode(entry->mode); + setMode(entry->mode); -fprintf(stderr,"sim_mode_cb: entry->mode=%d entry->filter=%d\n",entry->mode,entry->filter); - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); + fprintf(stderr,"sim_mode_cb: entry->mode=%d entry->filter=%d\n",entry->mode,entry->filter); + FILTER* band_filters=filters[entry->mode]; + FILTER* band_filter=&band_filters[entry->filter]; + setFilter(band_filter->low,band_filter->high); - vfo_update(NULL); + vfo_update(NULL); + } } void sim_filter_cb(GtkWidget *widget, gpointer data) { @@ -887,124 +1038,115 @@ void sim_filter_cb(GtkWidget *widget, gpointer data) { BANDSTACK_ENTRY *entry; fprintf(stderr,"sim_filter_cb\n"); - band=band_get_current_band(); - entry=bandstack_entry_get_current(); - // note order of filter reversed (largest first) - if(function) { - entry->filter++; - if(entry->filter>=FILTERS) { - entry->filter=0; - } + if(toolbar_dialog_buttons) { + filter_cb(widget,data); } else { - entry->filter--; - if(entry->filter<0) { - entry->filter=FILTERS-1; + band=band_get_current_band(); + entry=bandstack_entry_get_current(); + // note order of filter reversed (largest first) + if(function) { + entry->filter++; + if(entry->filter>=FILTERS) { + entry->filter=0; + } + } else { + entry->filter--; + if(entry->filter<0) { + entry->filter=FILTERS-1; + } } - } - -fprintf(stderr,"sim_filter_cb: entry->mode=%d entry->filter=%d\n",entry->mode,entry->filter); - FILTER* band_filters=filters[entry->mode]; - FILTER* band_filter=&band_filters[entry->filter]; - setFilter(band_filter->low,band_filter->high); - vfo_update(NULL); + fprintf(stderr,"sim_filter_cb: entry->mode=%d entry->filter=%d\n",entry->mode,entry->filter); + FILTER* band_filters=filters[entry->mode]; + FILTER* band_filter=&band_filters[entry->filter]; + setFilter(band_filter->low,band_filter->high); + + vfo_update(NULL); + } } void sim_agc_cb(GtkWidget *widget, gpointer data) { fprintf(stderr,"sim_agc_cb\n"); - if(function) { - agc--; - if(agc<0) { - agc=3; - } + if(toolbar_dialog_buttons) { + agc_cb(widget,data); } else { - agc++; - if(agc>=4) { - agc=0; + if(function) { + agc--; + if(agc<0) { + agc=3; + } + } else { + agc++; + if(agc>=4) { + agc=0; + } } + SetRXAAGCMode(CHANNEL_RX0, agc); + vfo_update(NULL); } - SetRXAAGCMode(CHANNEL_RX0, agc); - vfo_update(NULL); } void sim_noise_cb(GtkWidget *widget, gpointer data) { fprintf(stderr,"sim_noise_cb\n"); - if(function) { - if(nr) { - nr=0; - } else if(nr2) { - nr2=0; - nr=1; - } else if(anf) { - anf=0; - nr2=1; - } else if(snb) { - snb=0; - anf=1; - } else { - snb=1; - } + if(toolbar_dialog_buttons) { + noise_cb(widget,data); } else { - if(nr) { - nr=0; - nr2=1; - } else if(nr2) { - nr2=0; - anf=1; - } else if(anf) { - anf=0; - snb=1; - } else if(snb) { - snb=0; + if(function) { + if(nr) { + nr=0; + } else if(nr2) { + nr2=0; + nr=1; + } else if(anf) { + anf=0; + nr2=1; + } else if(snb) { + snb=0; + anf=1; + } else { + snb=1; + } } else { - nr=1; + if(nr) { + nr=0; + nr2=1; + } else if(nr2) { + nr2=0; + anf=1; + } else if(anf) { + anf=0; + snb=1; + } else if(snb) { + snb=0; + } else { + nr=1; + } } + SetRXAANRRun(CHANNEL_RX0, nr); + SetRXAEMNRRun(CHANNEL_RX0, nr2); + SetRXAANFRun(CHANNEL_RX0, anf); + SetRXASNBARun(CHANNEL_RX0, snb); + vfo_update(NULL); } - SetRXAANRRun(CHANNEL_RX0, nr); - SetRXAEMNRRun(CHANNEL_RX0, nr2); - SetRXAANFRun(CHANNEL_RX0, anf); - SetRXASNBARun(CHANNEL_RX0, snb); - vfo_update(NULL); - } -void update_toolbar() { +void sim_mox_cb(GtkWidget *widget, gpointer data) { + fprintf(stderr,"sim_pressed\n"); if(function) { - gtk_button_set_label(GTK_BUTTON(sim_band),"Band v"); - gtk_button_set_label(GTK_BUTTON(sim_bandstack),"BStack v"); - gtk_button_set_label(GTK_BUTTON(sim_mode),"Mode v"); - gtk_button_set_label(GTK_BUTTON(sim_filter),"Filter v"); - gtk_button_set_label(GTK_BUTTON(sim_noise),"Noise v"); - gtk_button_set_label(GTK_BUTTON(sim_agc),"AGC v"); - gtk_button_set_label(GTK_BUTTON(sim_mox),"Tune"); + tune_cb((GtkWidget *)NULL, (gpointer)NULL); } else { - gtk_button_set_label(GTK_BUTTON(sim_band),"Band ^"); - gtk_button_set_label(GTK_BUTTON(sim_bandstack),"BStack ^"); - gtk_button_set_label(GTK_BUTTON(sim_mode),"Mode ^"); - gtk_button_set_label(GTK_BUTTON(sim_filter),"Filter ^"); - gtk_button_set_label(GTK_BUTTON(sim_noise),"Noise ^"); - gtk_button_set_label(GTK_BUTTON(sim_agc),"AGC ^"); - gtk_button_set_label(GTK_BUTTON(sim_mox),"Mox"); + mox_cb((GtkWidget *)NULL, (gpointer)NULL); } } void sim_function_cb(GtkWidget *widget, gpointer data) { fprintf(stderr,"sim_function_cb\n"); function=function==1?0:1; - update_toolbar(); + update_toolbar_labels(); vfo_update(NULL); } -void sim_mox_cb(GtkWidget *widget, gpointer data) { - fprintf(stderr,"sim_pressed\n"); - if(function) { - tune_cb((GtkWidget *)NULL, (gpointer)NULL); - } else { - mox_cb((GtkWidget *)NULL, (gpointer)NULL); - } -} - GtkWidget *toolbar_init(int my_width, int my_height, GtkWidget* parent) { width=my_width; height=my_height; @@ -1028,86 +1170,49 @@ GtkWidget *toolbar_init(int my_width, int my_height, GtkWidget* parent) { gtk_widget_set_size_request (toolbar, width, height); gtk_grid_set_column_homogeneous(GTK_GRID(toolbar),TRUE); - if(toolbar_simulate_buttons) { - sim_mox=gtk_button_new_with_label("Mox"); - //gtk_widget_override_font(sim_mox, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(sim_mox),"clicked",G_CALLBACK(sim_mox_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),sim_mox,0,0,4,1); - - sim_band=gtk_button_new_with_label("Band ^"); - gtk_widget_set_size_request (sim_band, button_width, 0); - //gtk_widget_override_font(sim_band, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(sim_band),"clicked",G_CALLBACK(sim_band_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),sim_band,4,0,4,1); - - sim_bandstack=gtk_button_new_with_label("BStack ^"); - gtk_widget_set_size_request (sim_bandstack, button_width, 0); - //gtk_widget_override_font(sim_bandstack, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(sim_bandstack),"clicked",G_CALLBACK(sim_bandstack_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),sim_bandstack,8,0,4,1); - - sim_mode=gtk_button_new_with_label("Mode ^"); - //gtk_widget_override_font(sim_mode, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(sim_mode),"clicked",G_CALLBACK(sim_mode_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),sim_mode,12,0,4,1); - - sim_filter=gtk_button_new_with_label("Filter ^"); - //gtk_widget_override_font(sim_filter, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(sim_filter),"clicked",G_CALLBACK(sim_filter_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),sim_filter,16,0,4,1); - - sim_noise=gtk_button_new_with_label("Noise ^"); - //gtk_widget_override_font(sim_noise, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(sim_noise),"clicked",G_CALLBACK(sim_noise_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),sim_noise,20,0,4,1); - - sim_agc=gtk_button_new_with_label("AGC ^"); - //gtk_widget_override_font(sim_agc, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(sim_agc),"clicked",G_CALLBACK(sim_agc_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),sim_agc,24,0,4,1); - - sim_function=gtk_button_new_with_label("Function"); - //gtk_widget_override_font(sim_function, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(sim_function),"clicked",G_CALLBACK(sim_function_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),sim_function,28,0,4,1); - - } else { - GtkWidget *band=gtk_button_new_with_label("Band"); - gtk_widget_set_size_request (band, button_width, 0); - //gtk_widget_override_font(band, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(band),"clicked",G_CALLBACK(band_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),band,0,0,4,1); - - GtkWidget *mode=gtk_button_new_with_label("Mode"); - //gtk_widget_override_font(mode, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(mode),"clicked",G_CALLBACK(mode_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),mode,4,0,4,1); - - GtkWidget *filter=gtk_button_new_with_label("Filter"); - //gtk_widget_override_font(filter, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(filter),"clicked",G_CALLBACK(filter_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),filter,8,0,4,1); - - GtkWidget *audio=gtk_button_new_with_label("Audio"); - //gtk_widget_override_font(audio, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(audio),"clicked",G_CALLBACK(audio_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),audio,12,0,4,1); - - GtkWidget *lock=gtk_button_new_with_label("Lock"); - //gtk_widget_override_font(lock, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(lock),"clicked",G_CALLBACK(lock_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),lock,16,0,4,1); - - GtkWidget *tune=gtk_button_new_with_label("Tune"); - //gtk_widget_override_font(tune, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(tune),"clicked",G_CALLBACK(tune_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),tune,24,0,4,1); - - GtkWidget *tx=gtk_button_new_with_label("Mox"); - //gtk_widget_override_font(tx, pango_font_description_from_string("Arial 16")); - g_signal_connect(G_OBJECT(tx),"clicked",G_CALLBACK(mox_cb),NULL); - gtk_grid_attach(GTK_GRID(toolbar),tx,28,0,4,1); - } + sim_mox=gtk_button_new_with_label("Mox"); + //gtk_widget_override_font(sim_mox, pango_font_description_from_string("Arial 16")); + g_signal_connect(G_OBJECT(sim_mox),"clicked",G_CALLBACK(sim_mox_cb),NULL); + gtk_grid_attach(GTK_GRID(toolbar),sim_mox,0,0,4,1); + + sim_band=gtk_button_new_with_label("Band ^"); + gtk_widget_set_size_request (sim_band, button_width, 0); + //gtk_widget_override_font(sim_band, pango_font_description_from_string("Arial 16")); + g_signal_connect(G_OBJECT(sim_band),"clicked",G_CALLBACK(sim_band_cb),NULL); + gtk_grid_attach(GTK_GRID(toolbar),sim_band,4,0,4,1); + + sim_bandstack=gtk_button_new_with_label("BStack ^"); + gtk_widget_set_size_request (sim_bandstack, button_width, 0); + //gtk_widget_override_font(sim_bandstack, pango_font_description_from_string("Arial 16")); + g_signal_connect(G_OBJECT(sim_bandstack),"clicked",G_CALLBACK(sim_bandstack_cb),NULL); + gtk_grid_attach(GTK_GRID(toolbar),sim_bandstack,8,0,4,1); + + sim_mode=gtk_button_new_with_label("Mode ^"); + //gtk_widget_override_font(sim_mode, pango_font_description_from_string("Arial 16")); + g_signal_connect(G_OBJECT(sim_mode),"clicked",G_CALLBACK(sim_mode_cb),NULL); + gtk_grid_attach(GTK_GRID(toolbar),sim_mode,12,0,4,1); + + sim_filter=gtk_button_new_with_label("Filter ^"); + //gtk_widget_override_font(sim_filter, pango_font_description_from_string("Arial 16")); + g_signal_connect(G_OBJECT(sim_filter),"clicked",G_CALLBACK(sim_filter_cb),NULL); + gtk_grid_attach(GTK_GRID(toolbar),sim_filter,16,0,4,1); + + sim_noise=gtk_button_new_with_label("Noise ^"); + //gtk_widget_override_font(sim_noise, pango_font_description_from_string("Arial 16")); + g_signal_connect(G_OBJECT(sim_noise),"clicked",G_CALLBACK(sim_noise_cb),NULL); + gtk_grid_attach(GTK_GRID(toolbar),sim_noise,20,0,4,1); + + sim_agc=gtk_button_new_with_label("AGC ^"); + //gtk_widget_override_font(sim_agc, pango_font_description_from_string("Arial 16")); + g_signal_connect(G_OBJECT(sim_agc),"clicked",G_CALLBACK(sim_agc_cb),NULL); + gtk_grid_attach(GTK_GRID(toolbar),sim_agc,24,0,4,1); + + sim_function=gtk_button_new_with_label("Function"); + //gtk_widget_override_font(sim_function, pango_font_description_from_string("Arial 16")); + g_signal_connect(G_OBJECT(sim_function),"clicked",G_CALLBACK(function_cb),NULL); + gtk_grid_attach(GTK_GRID(toolbar),sim_function,28,0,4,1); + + update_toolbar_labels(); gtk_widget_show_all(toolbar); diff --git a/toolbar.h b/toolbar.h index acaa7ca..e717e80 100644 --- a/toolbar.h +++ b/toolbar.h @@ -19,9 +19,18 @@ extern int function; -void update_toolbar(); +void update_toolbar_labels(); int ptt_update(void *data); void lock_cb(GtkWidget *widget, gpointer data); -void mox_cb(GtkWidget *widget, gpointer data); -void tune_cb(GtkWidget *widget, gpointer data); + + +void sim_mox_cb(GtkWidget *widget, gpointer data); +void sim_band_cb(GtkWidget *widget, gpointer data); +void sim_bandstack_cb(GtkWidget *widget, gpointer data); +void sim_mode_cb(GtkWidget *widget, gpointer data); +void sim_filter_cb(GtkWidget *widget, gpointer data); +void sim_noise_cb(GtkWidget *widget, gpointer data); +void sim_agc_cb(GtkWidget *widget, gpointer data); +void sim_function_cb(GtkWidget *widget, gpointer data); + GtkWidget *toolbar_init(int my_width, int my_height, GtkWidget* parent); diff --git a/vfo.c b/vfo.c index 99c19c6..f328c93 100644 --- a/vfo.c +++ b/vfo.c @@ -254,43 +254,47 @@ vfo_press_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { - GtkWidget *dialog=gtk_dialog_new_with_buttons("Step",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL); - GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - GtkWidget *grid=gtk_grid_new(); - - gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE); - gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE); - - GtkWidget *step_rb=NULL; - int i=0; - while(steps[i]!=0) { - if(i==0) { - step_rb=gtk_radio_button_new_with_label(NULL,step_labels[i]); - } else { - step_rb=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(step_rb),step_labels[i]); + if((int)event->x < (my_width/2)) { + lock_cb(NULL,NULL); + } else { + GtkWidget *dialog=gtk_dialog_new_with_buttons("Step",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL); + + GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + GtkWidget *grid=gtk_grid_new(); + + gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE); + gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE); + + GtkWidget *step_rb=NULL; + int i=0; + while(steps[i]!=0) { + if(i==0) { + step_rb=gtk_radio_button_new_with_label(NULL,step_labels[i]); + } else { + step_rb=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(step_rb),step_labels[i]); + } + gtk_widget_override_font(step_rb, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (step_rb), steps[i]==step); + gtk_widget_show(step_rb); + gtk_grid_attach(GTK_GRID(grid),step_rb,i%5,i/5,1,1); + g_signal_connect(step_rb,"pressed",G_CALLBACK(vfo_step_select_cb),(gpointer *)i); + i++; } - gtk_widget_override_font(step_rb, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (step_rb), steps[i]==step); - gtk_widget_show(step_rb); - gtk_grid_attach(GTK_GRID(grid),step_rb,i%5,i/5,1,1); - g_signal_connect(step_rb,"pressed",G_CALLBACK(vfo_step_select_cb),(gpointer *)i); - i++; - } - - gtk_container_add(GTK_CONTAINER(content),grid); - - GtkWidget *close_button=gtk_dialog_add_button(GTK_DIALOG(dialog),"Close",GTK_RESPONSE_OK); - gtk_widget_override_font(close_button, pango_font_description_from_string("Arial 18")); - gtk_widget_show_all(dialog); - - g_signal_connect_swapped (dialog, - "response", - G_CALLBACK (gtk_widget_destroy), - dialog); - - int result=gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_container_add(GTK_CONTAINER(content),grid); + + GtkWidget *close_button=gtk_dialog_add_button(GTK_DIALOG(dialog),"Close",GTK_RESPONSE_OK); + gtk_widget_override_font(close_button, pango_font_description_from_string("Arial 18")); + gtk_widget_show_all(dialog); + + g_signal_connect_swapped (dialog, + "response", + G_CALLBACK (gtk_widget_destroy), + dialog); + + int result=gtk_dialog_run(GTK_DIALOG(dialog)); + } return TRUE; }