From: John Melton - G0ORX/N6LYT Date: Tue, 5 Jul 2016 10:30:10 +0000 (+0000) Subject: fixed tune when in CW mode. Added FreeDV mode. X-Git-Url: https://git.rkrishnan.org/components/%22news.html?a=commitdiff_plain;h=fc88698fba35bd75e1cfa42f6908becf0ff4ce32;p=pihpsdr.git fixed tune when in CW mode. Added FreeDV mode. --- diff --git a/Makefile b/Makefile index cc35a17..feb2e7a 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ endif #required for FREEDV (uncomment lines below) -#FREEDV_INCLUDE=FREEDV +FREEDV_INCLUDE=FREEDV ifeq ($(FREEDV_INCLUDE),FREEDV) FREEDV_OPTIONS=-D FREEDV @@ -37,18 +37,37 @@ FREEDV_OBJS= \ freedv.o endif +#required for MRAA GPIO +#MRAA_INCLUDE=MRAA + +ifeq ($(MRAA_INCLUDE),MRAA) + GPIO_LIBS=-lmraa + GPIO_SOURCES= \ + gpio_mraa.c + GPIO_HEADERS= \ + gpio.h + GPIO_OBJS= \ + gpio_mraa.o +else + ifeq ($(UNAME_N),raspberrypi) + GPIO_LIBS=-lwiringPi -lpigpio + endif + ifeq ($(UNAME_N),odroid) + GPIO_LIBS=-lwiringPi + endif + GPIO_SOURCES= \ + gpio.c + GPIO_HEADERS= \ + gpio.h + GPIO_OBJS= \ + gpio.o +endif + OPTIONS=-g -D $(UNAME_N) $(LIMESDR_OPTIONS) $(FREEDV_OPTIONS) -O3 GTKINCLUDES=`pkg-config --cflags gtk+-3.0` GTKLIBS=`pkg-config --libs gtk+-3.0` - -ifeq ($(UNAME_N),raspberrypi) -GPIOLIBS=-lwiringPi -lpigpio -endif -ifeq ($(UNAME_N),odroid) -GPIOLIBS=-lwiringPi -endif -LIBS=-lrt -lm -lwdsp -lpthread $(GTKLIBS) $(GPIOLIBS) $(SOAPYSDRLIBS) $(FREEDVLIBS) +LIBS=-lrt -lm -lwdsp -lpthread $(GTKLIBS) $(GPIO_LIBS) $(SOAPYSDRLIBS) $(FREEDVLIBS) INCLUDES=$(GTKINCLUDES) COMPILE=$(CC) $(OPTIONS) $(INCLUDES) @@ -57,6 +76,7 @@ PROGRAM=pihpsdr SOURCES= \ band.c \ +configure.c \ frequency.c \ discovered.c \ filter.c \ @@ -72,7 +92,6 @@ new_protocol_programmer.c \ panadapter.c \ property.c \ radio.c \ -gpio.c \ splash.c \ toolbar.c \ sliders.c \ @@ -86,6 +105,7 @@ HEADERS= \ agc.h \ alex.h \ band.h \ +configure.h \ frequency.h \ bandstack.h \ channel.h \ @@ -101,7 +121,6 @@ new_protocol.h \ panadapter.h \ property.h \ radio.h \ -gpio.h \ splash.h \ toolbar.h \ sliders.h \ @@ -114,6 +133,7 @@ xvtr.h OBJS= \ band.o \ +configure.o \ frequency.o \ discovered.o \ filter.o \ @@ -130,7 +150,6 @@ new_protocol_programmer.o \ panadapter.o \ property.o \ radio.o \ -gpio.o \ splash.o \ toolbar.o \ sliders.o \ @@ -138,13 +157,13 @@ vfo.o \ waterfall.o \ wdsp_init.o -all: prebuild $(PROGRAM) $(HEADERS) $(LIMESDR_HEADERS) $(SOURCES) $(LIMESDR_SOURCES) $(FREEDV_SOURCES) +all: prebuild $(PROGRAM) $(HEADERS) $(LIMESDR_HEADERS) $(FREEDV_HEADERS) $(GPIO_HEADERS) $(SOURCES) $(LIMESDR_SOURCES) $(FREEDV_SOURCES) $(GPIO_SOURCES) prebuild: rm -f version.o -$(PROGRAM): $(OBJS) $(LIMESDR_OBJS) $(FREEDV_OBJS) - $(LINK) -o $(PROGRAM) $(OBJS) $(LIMESDR_OBJS) $(FREEDV_OBJS) $(LIBS) +$(PROGRAM): $(OBJS) $(LIMESDR_OBJS) $(FREEDV_OBJS) $(GPIO_OBJS) + $(LINK) -o $(PROGRAM) $(OBJS) $(GPIO_OBJS) $(LIMESDR_OBJS) $(FREEDV_OBJS) $(LIBS) .c.o: $(COMPILE) -c -o $@ $< diff --git a/configure.c b/configure.c new file mode 100644 index 0000000..021a6bb --- /dev/null +++ b/configure.c @@ -0,0 +1,495 @@ +/* Copyright (C) +* 2015 - 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "main.h" +#include "channel.h" +#include "discovered.h" +#include "radio.h" +#include "gpio.h" + +#ifdef raspberrypi +#define INCLUDE_GPIO +#endif +#ifdef odroid +#define INCLUDE_GPIO +#endif +#ifdef up +#define INCLUDE_GPIO +#endif + +static void sample_rate_cb(GtkWidget *widget, gpointer data) { + sample_rate=(int)data; +} + +static void display_panadapter_cb(GtkWidget *widget, gpointer data) { + display_panadapter=display_panadapter==1?0:1; +} + +static void display_waterfall_cb(GtkWidget *widget, gpointer data) { + display_waterfall=display_waterfall==1?0:1; +} + +static void display_sliders_cb(GtkWidget *widget, gpointer data) { + display_sliders=display_sliders==1?0:1; +} + +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; +} + +#ifdef INCLUDE_GPIO +void configure_gpio(GtkWidget *parent) { + gpio_restore_state(); + + GtkWidget *dialog=gtk_dialog_new_with_buttons("Configure GPIO",GTK_WINDOW(parent),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_enable_vfo_encoder=gtk_check_button_new_with_label("Enable VFO"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_vfo_encoder), ENABLE_VFO_ENCODER); + gtk_widget_show(b_enable_vfo_encoder); + gtk_grid_attach(GTK_GRID(grid),b_enable_vfo_encoder,0,0,1,1); + + GtkWidget *vfo_a_label=gtk_label_new("GPIO A:"); + gtk_widget_show(vfo_a_label); + gtk_grid_attach(GTK_GRID(grid),vfo_a_label,1,0,1,1); + + GtkWidget *vfo_a=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(vfo_a),VFO_ENCODER_A); + gtk_widget_show(vfo_a); + gtk_grid_attach(GTK_GRID(grid),vfo_a,2,0,1,1); + + GtkWidget *vfo_b_label=gtk_label_new("GPIO B:"); + gtk_widget_show(vfo_b_label); + gtk_grid_attach(GTK_GRID(grid),vfo_b_label,3,0,1,1); + + GtkWidget *vfo_b=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(vfo_b),VFO_ENCODER_B); + gtk_widget_show(vfo_b); + gtk_grid_attach(GTK_GRID(grid),vfo_b,4,0,1,1); + + GtkWidget *b_enable_vfo_pullup=gtk_check_button_new_with_label("Enable Pull-up"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_vfo_pullup), ENABLE_VFO_PULLUP); + gtk_widget_show(b_enable_vfo_pullup); + gtk_grid_attach(GTK_GRID(grid),b_enable_vfo_pullup,5,0,1,1); + + + + GtkWidget *b_enable_af_encoder=gtk_check_button_new_with_label("Enable AF"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_af_encoder), ENABLE_AF_ENCODER); + gtk_widget_show(b_enable_af_encoder); + gtk_grid_attach(GTK_GRID(grid),b_enable_af_encoder,0,1,1,1); + + GtkWidget *af_a_label=gtk_label_new("GPIO A:"); + gtk_widget_show(af_a_label); + gtk_grid_attach(GTK_GRID(grid),af_a_label,1,1,1,1); + + GtkWidget *af_a=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(af_a),AF_ENCODER_A); + gtk_widget_show(af_a); + gtk_grid_attach(GTK_GRID(grid),af_a,2,1,1,1); + + GtkWidget *af_b_label=gtk_label_new("GPIO B:"); + gtk_widget_show(af_b_label); + gtk_grid_attach(GTK_GRID(grid),af_b_label,3,1,1,1); + + GtkWidget *af_b=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(af_b),AF_ENCODER_B); + gtk_widget_show(af_b); + gtk_grid_attach(GTK_GRID(grid),af_b,4,1,1,1); + + GtkWidget *b_enable_af_pullup=gtk_check_button_new_with_label("Enable Pull-up"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_af_pullup), ENABLE_AF_PULLUP); + gtk_widget_show(b_enable_af_pullup); + gtk_grid_attach(GTK_GRID(grid),b_enable_af_pullup,5,1,1,1); + + + + GtkWidget *b_enable_rf_encoder=gtk_check_button_new_with_label("Enable RF"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_rf_encoder), ENABLE_RF_ENCODER); + gtk_widget_show(b_enable_rf_encoder); + gtk_grid_attach(GTK_GRID(grid),b_enable_rf_encoder,0,2,1,1); + + GtkWidget *rf_a_label=gtk_label_new("GPIO A:"); + gtk_widget_show(rf_a_label); + gtk_grid_attach(GTK_GRID(grid),rf_a_label,1,2,1,1); + + GtkWidget *rf_a=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(rf_a),RF_ENCODER_A); + gtk_widget_show(rf_a); + gtk_grid_attach(GTK_GRID(grid),rf_a,2,2,1,1); + + GtkWidget *rf_b_label=gtk_label_new("GPIO B:"); + gtk_widget_show(rf_b_label); + gtk_grid_attach(GTK_GRID(grid),rf_b_label,3,2,1,1); + + GtkWidget *rf_b=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(rf_b),RF_ENCODER_B); + gtk_widget_show(rf_b); + gtk_grid_attach(GTK_GRID(grid),rf_b,4,2,1,1); + + GtkWidget *b_enable_rf_pullup=gtk_check_button_new_with_label("Enable Pull-up"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_rf_pullup), ENABLE_RF_PULLUP); + gtk_widget_show(b_enable_rf_pullup); + gtk_grid_attach(GTK_GRID(grid),b_enable_rf_pullup,5,2,1,1); + + + + GtkWidget *b_enable_agc_encoder=gtk_check_button_new_with_label("Enable AGC"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_agc_encoder), ENABLE_AGC_ENCODER); + gtk_widget_show(b_enable_agc_encoder); + gtk_grid_attach(GTK_GRID(grid),b_enable_agc_encoder,0,3,1,1); + + GtkWidget *agc_a_label=gtk_label_new("GPIO A:"); + gtk_widget_show(agc_a_label); + gtk_grid_attach(GTK_GRID(grid),agc_a_label,1,3,1,1); + + GtkWidget *agc_a=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(agc_a),AGC_ENCODER_A); + gtk_widget_show(agc_a); + gtk_grid_attach(GTK_GRID(grid),agc_a,2,3,1,1); + + GtkWidget *agc_b_label=gtk_label_new("GPIO B:"); + gtk_widget_show(agc_b_label); + gtk_grid_attach(GTK_GRID(grid),agc_b_label,3,3,1,1); + + GtkWidget *agc_b=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(agc_b),AGC_ENCODER_B); + gtk_widget_show(agc_b); + gtk_grid_attach(GTK_GRID(grid),agc_b,4,3,1,1); + + GtkWidget *b_enable_agc_pullup=gtk_check_button_new_with_label("Enable Pull-up"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_agc_pullup), ENABLE_AGC_PULLUP); + gtk_widget_show(b_enable_agc_pullup); + gtk_grid_attach(GTK_GRID(grid),b_enable_agc_pullup,5,3,1,1); + + + + GtkWidget *b_enable_band=gtk_check_button_new_with_label("Enable Band"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_band), ENABLE_BAND_BUTTON); + gtk_widget_show(b_enable_band); + gtk_grid_attach(GTK_GRID(grid),b_enable_band,0,4,1,1); + + GtkWidget *band_label=gtk_label_new("GPIO:"); + gtk_widget_show(band_label); + gtk_grid_attach(GTK_GRID(grid),band_label,1,4,1,1); + + GtkWidget *band=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(band),BAND_BUTTON); + gtk_widget_show(band); + gtk_grid_attach(GTK_GRID(grid),band,2,4,1,1); + + + GtkWidget *b_enable_mode=gtk_check_button_new_with_label("Enable Mode"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_mode), ENABLE_MODE_BUTTON); + gtk_widget_show(b_enable_mode); + gtk_grid_attach(GTK_GRID(grid),b_enable_mode,0,5,1,1); + + GtkWidget *mode_label=gtk_label_new("GPIO:"); + gtk_widget_show(mode_label); + gtk_grid_attach(GTK_GRID(grid),mode_label,1,5,1,1); + + GtkWidget *mode=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(mode),MODE_BUTTON); + gtk_widget_show(mode); + gtk_grid_attach(GTK_GRID(grid),mode,2,5,1,1); + + + GtkWidget *b_enable_filter=gtk_check_button_new_with_label("Enable Filter"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_filter), ENABLE_FILTER_BUTTON); + gtk_widget_show(b_enable_filter); + gtk_grid_attach(GTK_GRID(grid),b_enable_filter,0,6,1,1); + + GtkWidget *filter_label=gtk_label_new("GPIO:"); + gtk_widget_show(filter_label); + gtk_grid_attach(GTK_GRID(grid),filter_label,1,6,1,1); + + GtkWidget *filter=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(filter),FILTER_BUTTON); + gtk_widget_show(filter); + gtk_grid_attach(GTK_GRID(grid),filter,2,6,1,1); + + + GtkWidget *b_enable_noise=gtk_check_button_new_with_label("Enable Noise"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_noise), ENABLE_NOISE_BUTTON); + gtk_widget_show(b_enable_noise); + gtk_grid_attach(GTK_GRID(grid),b_enable_noise,0,7,1,1); + + GtkWidget *noise_label=gtk_label_new("GPIO:"); + gtk_widget_show(noise_label); + gtk_grid_attach(GTK_GRID(grid),noise_label,1,7,1,1); + + GtkWidget *noise=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(noise),NOISE_BUTTON); + gtk_widget_show(noise); + gtk_grid_attach(GTK_GRID(grid),noise,2,7,1,1); + + + GtkWidget *b_enable_agc=gtk_check_button_new_with_label("Enable AGC"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_agc), ENABLE_AGC_BUTTON); + gtk_widget_show(b_enable_agc); + gtk_grid_attach(GTK_GRID(grid),b_enable_agc,0,8,1,1); + + GtkWidget *agc_label=gtk_label_new("GPIO:"); + gtk_widget_show(agc_label); + gtk_grid_attach(GTK_GRID(grid),agc_label,1,8,1,1); + + GtkWidget *agc=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(agc),AGC_BUTTON); + gtk_widget_show(agc); + gtk_grid_attach(GTK_GRID(grid),agc,2,8,1,1); + + + GtkWidget *b_enable_mox=gtk_check_button_new_with_label("Enable MOX"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_mox), ENABLE_MOX_BUTTON); + gtk_widget_show(b_enable_mox); + gtk_grid_attach(GTK_GRID(grid),b_enable_mox,0,9,1,1); + + GtkWidget *mox_label=gtk_label_new("GPIO:"); + gtk_widget_show(mox_label); + gtk_grid_attach(GTK_GRID(grid),mox_label,1,9,1,1); + + GtkWidget *mox=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(mox),MOX_BUTTON); + gtk_widget_show(mox); + gtk_grid_attach(GTK_GRID(grid),mox,2,9,1,1); + + + GtkWidget *b_enable_function=gtk_check_button_new_with_label("Enable Function"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_function), ENABLE_FUNCTION_BUTTON); + gtk_widget_show(b_enable_function); + gtk_grid_attach(GTK_GRID(grid),b_enable_function,0,10,1,1); + + GtkWidget *function_label=gtk_label_new("GPIO:"); + gtk_widget_show(function_label); + gtk_grid_attach(GTK_GRID(grid),function_label,1,10,1,1); + + GtkWidget *function=gtk_spin_button_new_with_range (0.0,100.0,1.0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(function),FUNCTION_BUTTON); + gtk_widget_show(function); + gtk_grid_attach(GTK_GRID(grid),function,2,10,1,1); + + + + gtk_container_add(GTK_CONTAINER(content),grid); + + 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); + + int result=gtk_dialog_run(GTK_DIALOG(dialog)); + + ENABLE_VFO_ENCODER=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_vfo_encoder))?1:0; + VFO_ENCODER_A=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(vfo_a)); + VFO_ENCODER_B=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(vfo_b)); + ENABLE_VFO_PULLUP=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_vfo_pullup))?1:0; + ENABLE_AF_ENCODER=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_af_encoder))?1:0; + AF_ENCODER_A=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(af_a)); + AF_ENCODER_B=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(af_b)); + ENABLE_AF_PULLUP=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_af_pullup))?1:0; + ENABLE_RF_ENCODER=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_rf_encoder))?1:0; + RF_ENCODER_A=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rf_a)); + RF_ENCODER_B=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rf_b)); + ENABLE_RF_PULLUP=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_rf_pullup))?1:0; + ENABLE_AGC_ENCODER=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_agc_encoder))?1:0; + AGC_ENCODER_A=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(agc_a)); + AGC_ENCODER_B=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(agc_b)); + ENABLE_AGC_PULLUP=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_agc_pullup))?1:0; + ENABLE_BAND_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_band))?1:0; + BAND_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(band)); + ENABLE_MODE_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_mode))?1:0; + MODE_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(mode)); + ENABLE_FILTER_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_filter))?1:0; + FILTER_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(filter)); + ENABLE_NOISE_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_noise))?1:0; + NOISE_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(noise)); + ENABLE_AGC_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_agc))?1:0; + AGC_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(agc)); + ENABLE_MOX_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_mox))?1:0; + MOX_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(mox)); + ENABLE_FUNCTION_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_function))?1:0; + FUNCTION_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(function)); + + gtk_widget_destroy(dialog); + + gpio_save_state(); +} +#endif + +void configure(DISCOVERED* d,GtkWidget *parent) { + + GtkWidget *dialog=gtk_dialog_new_with_buttons("Configure",GTK_WINDOW(parent),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),FALSE); + gtk_grid_set_row_homogeneous(GTK_GRID(grid),FALSE); + + GtkWidget *sample_rate_label=gtk_label_new("Sample Rate:"); + //gtk_widget_override_font(sample_rate_label, pango_font_description_from_string("Arial 18")); + gtk_widget_show(sample_rate_label); + gtk_grid_attach(GTK_GRID(grid),sample_rate_label,0,0,1,1); + + GtkWidget *sample_rate_48=gtk_radio_button_new_with_label(NULL,"48000"); + //gtk_widget_override_font(sample_rate_48, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_48), sample_rate==48000); + gtk_widget_show(sample_rate_48); + gtk_grid_attach(GTK_GRID(grid),sample_rate_48,0,1,1,1); + g_signal_connect(sample_rate_48,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)48000); + + GtkWidget *sample_rate_96=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_48),"96000"); + //gtk_widget_override_font(sample_rate_96, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_96), sample_rate==96000); + gtk_widget_show(sample_rate_96); + gtk_grid_attach(GTK_GRID(grid),sample_rate_96,0,2,1,1); + g_signal_connect(sample_rate_96,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)96000); + + GtkWidget *sample_rate_192=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_96),"192000"); + //gtk_widget_override_font(sample_rate_192, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_192), sample_rate==192000); + gtk_widget_show(sample_rate_192); + gtk_grid_attach(GTK_GRID(grid),sample_rate_192,0,3,1,1); + g_signal_connect(sample_rate_192,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)192000); + + GtkWidget *sample_rate_384=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_192),"384000"); + //gtk_widget_override_font(sample_rate_384, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_384), sample_rate==384000); + gtk_widget_show(sample_rate_384); + gtk_grid_attach(GTK_GRID(grid),sample_rate_384,0,4,1,1); + g_signal_connect(sample_rate_384,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)384000); + + if(d->protocol==NEW_PROTOCOL +#ifdef LIMESDR + || d->protocol==LIMESDR_PROTOCOL +#endif + ) { + GtkWidget *sample_rate_768=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_384),"768000"); + //gtk_widget_override_font(sample_rate_768, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_768), sample_rate==768000); + gtk_widget_show(sample_rate_768); + gtk_grid_attach(GTK_GRID(grid),sample_rate_768,0,5,1,1); + g_signal_connect(sample_rate_768,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)768000); + + GtkWidget *sample_rate_921=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_768),"921180"); + //gtk_widget_override_font(sample_rate_921, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_921), sample_rate==921180); + gtk_widget_show(sample_rate_921); + gtk_grid_attach(GTK_GRID(grid),sample_rate_921,0,6,1,1); + g_signal_connect(sample_rate_921,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)921180); + + GtkWidget *sample_rate_1536=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_921),"1536000"); + //gtk_widget_override_font(sample_rate_1536, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_1536), sample_rate==1536000); + gtk_widget_show(sample_rate_1536); + gtk_grid_attach(GTK_GRID(grid),sample_rate_1536,0,7,1,1); + g_signal_connect(sample_rate_1536,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)1536000); + +#ifdef LIMESDR + if(d->protocol==LIMESDR_PROTOCOL) { + GtkWidget *sample_rate_1M=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_1536),"1048576"); + //gtk_widget_override_font(sample_rate_1M, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_1M), sample_rate==1048576); + gtk_widget_show(sample_rate_1M); + gtk_grid_attach(GTK_GRID(grid),sample_rate_1M,0,8,1,1); + g_signal_connect(sample_rate_1M,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)1048576); + + GtkWidget *sample_rate_2M=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_1M),"2097152"); + //gtk_widget_override_font(sample_rate_2M, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_2M), sample_rate==2097152); + gtk_widget_show(sample_rate_2M); + gtk_grid_attach(GTK_GRID(grid),sample_rate_2M,0,9,1,1); + g_signal_connect(sample_rate_2M,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)2097152); + } +#endif + } + + + GtkWidget *display_label=gtk_label_new("Display:"); + //gtk_widget_override_font(display_label, pango_font_description_from_string("Arial 18")); + gtk_widget_show(display_label); + gtk_grid_attach(GTK_GRID(grid),display_label,0,9,1,1); + + GtkWidget *b_display_panadapter=gtk_check_button_new_with_label("Display Panadapter"); + //gtk_widget_override_font(b_display_panadapter, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_panadapter), display_panadapter); + gtk_widget_show(b_display_panadapter); + gtk_grid_attach(GTK_GRID(grid),b_display_panadapter,0,10,1,1); + g_signal_connect(b_display_panadapter,"toggled",G_CALLBACK(display_panadapter_cb),(gpointer *)NULL); + + GtkWidget *b_display_waterfall=gtk_check_button_new_with_label("Display Waterfall"); + //gtk_widget_override_font(b_display_waterfall, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_waterfall), display_waterfall); + gtk_widget_show(b_display_waterfall); + gtk_grid_attach(GTK_GRID(grid),b_display_waterfall,0,11,1,1); + g_signal_connect(b_display_waterfall,"toggled",G_CALLBACK(display_waterfall_cb),(gpointer *)NULL); + + GtkWidget *b_display_sliders=gtk_check_button_new_with_label("Display Sliders"); + //gtk_widget_override_font(b_display_sliders, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_sliders), display_sliders); + gtk_widget_show(b_display_sliders); + gtk_grid_attach(GTK_GRID(grid),b_display_sliders,0,12,1,1); + g_signal_connect(b_display_sliders,"toggled",G_CALLBACK(display_sliders_cb),(gpointer *)NULL); + + GtkWidget *b_display_toolbar=gtk_check_button_new_with_label("Display Toolbar"); + //gtk_widget_override_font(b_display_toolbar, pango_font_description_from_string("Arial 18")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_toolbar), display_toolbar); + gtk_widget_show(b_display_toolbar); + gtk_grid_attach(GTK_GRID(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); + //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)); + + radioSaveState(); + +} diff --git a/configure.h b/configure.h new file mode 100644 index 0000000..1efad1a --- /dev/null +++ b/configure.h @@ -0,0 +1,24 @@ +/* Copyright (C) +* 2015 - 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. +* +*/ + + +#ifdef INCLUDE_GPIO +void configure_gpio(GtkWidget *parent); +#endif +void configure(DISCOVERED *d,GtkWidget *parent); diff --git a/freedv.c b/freedv.c index ccdf478..7536a61 100644 --- a/freedv.c +++ b/freedv.c @@ -28,17 +28,16 @@ char freedv_rx_text_data[64]; int freedv_rx_text_data_index=0; static void my_put_next_rx_char(void *callback_state, char c) { + int i; fprintf(stderr, "freedv: my_put_next_rx_char: %c sync=%d\n", c, freedv_sync); if(freedv_sync) { if(c==0x0D) { - freedv_rx_text_data_index=0; - } else { - freedv_rx_text_data[freedv_rx_text_data_index++]=c; - freedv_rx_text_data[freedv_rx_text_data_index]=0; - if(freedv_rx_text_data_index>=62) { - freedv_rx_text_data_index=0; - } + c='|'; } + for(i=0;i<62;i++) { + freedv_rx_text_data[i]=freedv_rx_text_data[i+1]; + } + freedv_rx_text_data[62]=c; } } @@ -54,7 +53,9 @@ fprintf(stderr,"freedv: my_get_next_tx_char=%c\n",c); } void init_freedv() { + int i; fprintf(stderr,"init_freedv\n"); + modem=freedv_open(FREEDV_MODE_1600); if(modem==NULL) { fprintf(stderr,"freedv_open: modem is null\n"); @@ -83,7 +84,10 @@ fprintf(stderr,"n_speech_samples=%d n_max_modem_samples=%d\n",n_speech_samples, int rate=freedv_get_modem_sample_rate(modem); fprintf(stderr,"freedv modem sample rate=%d\n",rate); - strcpy(freedv_rx_text_data,""); + for(i=0;i<63;i++) { + freedv_rx_text_data[i]=' '; + } + freedv_rx_text_data[63]=0; } void close_freedv() { diff --git a/gpio.c b/gpio.c index 6c2b9b1..4367870 100644 --- a/gpio.c +++ b/gpio.c @@ -39,17 +39,13 @@ int ENABLE_VFO_ENCODER=1; int ENABLE_VFO_PULLUP=1; -#ifdef raspberrypi int VFO_ENCODER_A=17; int VFO_ENCODER_B=18; -#endif #ifdef odroid -int VFO_ENCODER_A=88; -int VFO_ENCODER_B=87; int VFO_ENCODER_A_PIN=0; int VFO_ENCODER_B_PIN=1; #endif -int ENABLE_AF_ENCODER=88; +int ENABLE_AF_ENCODER=1; int ENABLE_AF_PULLUP=0; int AF_ENCODER_A=20; int AF_ENCODER_B=26; @@ -83,41 +79,6 @@ int FUNCTION_BUTTON=22; int ENABLE_LOCK_BUTTON=1; int LOCK_BUTTON=25; - - -/* -#define PI_VFO_ENCODER_A 17 -#define PI_VFO_ENCODER_B 18 - -#define ODROID_VFO_ENCODER_A 88 -#define ODROID_VFO_ENCODER_B 87 -#define ODROID_VFO_ENCODER_A_PIN 0 -#define ODROID_VFO_ENCODER_B_PIN 1 - -#define AF_ENCODER_A 20 -#define AF_ENCODER_B 26 -#define AF_FUNCTION 21 - -#define RF_ENCODER_A 16 -#define RF_ENCODER_B 19 -#define RF_FUNCTION 13 - -#define FUNCTION_BUTTON 22 -#define BAND_BUTTON 13 -#define BANDSTACK_BUTTON 12 -#define MODE_BUTTON 6 -#define FILTER_BUTTON 5 -#define NOISE_BUTTON 24 -#define AGC_BUTTON 23 -#define MOX_BUTTON 27 - -static int VFO_ENCODER_A=17; -static int VFO_ENCODER_B=18; - -static int VFO_ENCODER_A_PIN=0; -static int VFO_ENCODER_B_PIN=0; -*/ - static volatile int vfoEncoderPos; static volatile int afEncoderPos; static volatile int afFunction; @@ -458,8 +419,13 @@ void gpio_save_state() { int gpio_init() { fprintf(stderr,"encoder_init\n"); + +#ifdef odroid + VFO_ENCODER_A=88; + VFO_ENCODER_B=87; +#endif + gpio_restore_state(); - //if(strcmp(unameData.nodename,"raspberrypi")==0) { #ifdef raspberrypi fprintf(stderr,"encoder_init: VFO_ENCODER_A=%d VFO_ENCODER_B=%d\n",VFO_ENCODER_A,VFO_ENCODER_B); @@ -597,7 +563,7 @@ fprintf(stderr,"encoder_init\n"); } #endif -// } else if(strcmp(unameData.nodename,"odroid")==0) { + #ifdef odroid //VFO_ENCODER_A=ODROID_VFO_ENCODER_A; @@ -639,10 +605,6 @@ fprintf(stderr,"encoder_init\n"); return 1; } #endif -// } else { -// fprintf(stderr,"Unknown nodename: %s. Rotary Encoder not enabled.\n",unameData.nodename); -// return 1; -// } int rc=pthread_create(&rotary_encoder_thread_id, NULL, rotary_encoder_thread, NULL); if(rc<0) { diff --git a/gpio.h b/gpio.h index 6d48ec2..d94de81 100644 --- a/gpio.h +++ b/gpio.h @@ -17,14 +17,6 @@ * */ -#ifdef raspberrypi -#define INCLUDE_GPIO -#endif -#ifdef odroid -#define INCLUDE_GPIO -#endif - -#ifdef INCLUDE_GPIO extern int ENABLE_VFO_ENCODER; extern int ENABLE_VFO_PULLUP; extern int VFO_ENCODER_A; @@ -75,5 +67,3 @@ int mode_get_state(); int filter_get_state(); int noise_get_state(); int mox_get_state(); - -#endif diff --git a/gpio_mraa.c b/gpio_mraa.c new file mode 100644 index 0000000..e671e43 --- /dev/null +++ b/gpio_mraa.c @@ -0,0 +1,1167 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "band.h" +#include "channel.h" +#include "discovered.h" +#include "mode.h" +#include "filter.h" +#include "bandstack.h" +#include "toolbar.h" +#include "gpio.h" +#include "radio.h" +#include "toolbar.h" +#include "main.h" +#include "property.h" +#include "wdsp.h" + + +int ENABLE_VFO_ENCODER=1; +int ENABLE_VFO_PULLUP=1; +int VFO_ENCODER_A=11; +int VFO_ENCODER_B=12; +int ENABLE_AF_ENCODER=1; +int ENABLE_AF_PULLUP=0; +int AF_ENCODER_A=38; +int AF_ENCODER_B=37; +int ENABLE_RF_ENCODER=1; +int ENABLE_RF_PULLUP=0; +int RF_ENCODER_A=36; +int RF_ENCODER_B=35; +int ENABLE_AGC_ENCODER=1; +int ENABLE_AGC_PULLUP=0; +int AGC_ENCODER_A=7; +int AGC_ENCODER_B=40; +int ENABLE_BAND_BUTTON=1; +int BAND_BUTTON=33; +int ENABLE_BANDSTACK_BUTTON=1; +int BANDSTACK_BUTTON=32; +int ENABLE_MODE_BUTTON=1; +int MODE_BUTTON=31; +int ENABLE_FILTER_BUTTON=1; +int FILTER_BUTTON=29; +int ENABLE_NOISE_BUTTON=1; +int NOISE_BUTTON=18; +int ENABLE_AGC_BUTTON=1; +int AGC_BUTTON=16; +int ENABLE_MOX_BUTTON=1; +int MOX_BUTTON=13; +int ENABLE_FUNCTION_BUTTON=1; +int FUNCTION_BUTTON=15; +int ENABLE_LOCK_BUTTON=1; +int LOCK_BUTTON=22; +int SPARE_RF_BUTTON=24; +int SPARE_AGC_BUTTON=26; + +static mraa_gpio_context vfo_a_context; +static mraa_gpio_context vfo_b_context; +static mraa_gpio_context af_a_context; +static mraa_gpio_context af_b_context; +static mraa_gpio_context rf_a_context; +static mraa_gpio_context rf_b_context; +static mraa_gpio_context agc_a_context; +static mraa_gpio_context agc_b_context; +static mraa_gpio_context band_context; +static mraa_gpio_context bandstack_context; +static mraa_gpio_context mode_context; +static mraa_gpio_context filter_context; +static mraa_gpio_context noise_context; +static mraa_gpio_context agc_context; +static mraa_gpio_context mox_context; +static mraa_gpio_context function_context; +static mraa_gpio_context lock_context; +static mraa_gpio_context rf_sw_context; +static mraa_gpio_context agc_sw_context; + +static volatile int vfoEncoderPos; +static volatile int afEncoderPos; +static volatile int rfEncoderPos; +static volatile int agcEncoderPos; +static volatile int function_state; +static volatile int band_state; +static volatile int bandstack_state; +static volatile int mode_state; +static volatile int filter_state; +static volatile int noise_state; +static volatile int agc_state; +static volatile int mox_state; +static volatile int lock_state; + +static void* rotary_encoder_thread(void *arg); +static pthread_t rotary_encoder_thread_id; +static int previous_function_button=0; +static int band_button=0; +static int previous_band_button=0; +static int bandstack_button=0; +static int previous_bandstack_button=0; +static int mode_button=0; +static int previous_mode_button=0; +static int filter_button=0; +static int previous_filter_button=0; +static int noise_button=0; +static int previous_noise_button=0; +static int agc_button=0; +static int previous_agc_button=0; +static int mox_button=0; +static int previous_mox_button=0; +static int lock_button=0; +static int previous_lock_button=0; + + +static void function_interrupt(void *args) { + function_state=(mraa_gpio_read(function_context)==0); +} + +static void band_interrupt(void *args) { + band_state=(mraa_gpio_read(band_context)==0); +} + +static void bandstack_interrupt(void *args) { + bandstack_state=(mraa_gpio_read(bandstack_context)==0); +} + +static void mode_interrupt(void *args) { + mode_state=(mraa_gpio_read(mode_context)==0); +} + +static void filter_interrupt(void *args) { + filter_state=(mraa_gpio_read(filter_context)==0); +} + +static void noise_interrupt(void *args) { + noise_state=(mraa_gpio_read(noise_context)==0); +} + +static void agc_interrupt(void *args) { + agc_state=(mraa_gpio_read(agc_context)==0); +} + +static void mox_interrupt(void *args) { + mox_state=(mraa_gpio_read(mox_context)==0); +} + +static void lock_interrupt(void *args) { + lock_state=(mraa_gpio_read(lock_context)==0); +} + +static void vfo_interrupt(void *args) { +fprintf(stderr,"vfo_interrupt\n"); + if(mraa_gpio_read(vfo_a_context)) { + if(mraa_gpio_read(vfo_b_context)) { + ++vfoEncoderPos; + } else { + --vfoEncoderPos; + } + fprintf(stderr,"vfo pos=%d\n",vfoEncoderPos); + } +} + +static void af_interrupt(void *args) { +fprintf(stderr,"af_interrupt\n"); + if(mraa_gpio_read(af_a_context)) { + if(mraa_gpio_read(af_b_context)) { + ++afEncoderPos; + } else { + --afEncoderPos; + } + fprintf(stderr,"af pos=%d\n",afEncoderPos); + } +} + +static void rf_interrupt(void *args) { +fprintf(stderr,"rf_interrupt\n"); + if(mraa_gpio_read(rf_a_context)) { + if(mraa_gpio_read(rf_b_context)) { + ++rfEncoderPos; + } else { + --rfEncoderPos; + } + fprintf(stderr,"rf pos=%d\n",rfEncoderPos); + } +} + +static void agc_encoder_interrupt(void *args) { +fprintf(stderr,"agc_interrupt\n"); + if(mraa_gpio_read(agc_a_context)) { + if(mraa_gpio_read(agc_b_context)) { + ++agcEncoderPos; + } else { + --agcEncoderPos; + } + fprintf(stderr,"agc pos=%d\n",agcEncoderPos); + } +} + + +void gpio_restore_state() { + char* value; + loadProperties("gpio.props"); + value=getProperty("ENABLE_VFO_ENCODER"); + if(value) ENABLE_VFO_ENCODER=atoi(value); + value=getProperty("ENABLE_VFO_PULLUP"); + if(value) ENABLE_VFO_PULLUP=atoi(value); + value=getProperty("VFO_ENCODER_A"); + if(value) VFO_ENCODER_A=atoi(value); + value=getProperty("VFO_ENCODER_B"); + if(value) VFO_ENCODER_B=atoi(value); + value=getProperty("ENABLE_AF_ENCODER"); + if(value) ENABLE_AF_ENCODER=atoi(value); + value=getProperty("ENABLE_AF_PULLUP"); + if(value) ENABLE_AF_PULLUP=atoi(value); + value=getProperty("AF_ENCODER_A"); + if(value) AF_ENCODER_A=atoi(value); + value=getProperty("AF_ENCODER_B"); + if(value) AF_ENCODER_B=atoi(value); + value=getProperty("ENABLE_RF_ENCODER"); + if(value) ENABLE_RF_ENCODER=atoi(value); + value=getProperty("ENABLE_RF_PULLUP"); + if(value) ENABLE_RF_PULLUP=atoi(value); + value=getProperty("RF_ENCODER_A"); + if(value) RF_ENCODER_A=atoi(value); + value=getProperty("RF_ENCODER_B"); + if(value) RF_ENCODER_B=atoi(value); + value=getProperty("ENABLE_AGC_ENCODER"); + if(value) ENABLE_AGC_ENCODER=atoi(value); + value=getProperty("ENABLE_AGC_PULLUP"); + if(value) ENABLE_AGC_PULLUP=atoi(value); + value=getProperty("AGC_ENCODER_A"); + if(value) AGC_ENCODER_A=atoi(value); + value=getProperty("AGC_ENCODER_B"); + if(value) AGC_ENCODER_B=atoi(value); + value=getProperty("ENABLE_BAND_BUTTON"); + if(value) ENABLE_BAND_BUTTON=atoi(value); + value=getProperty("BAND_BUTTON"); + if(value) BAND_BUTTON=atoi(value); + value=getProperty("ENABLE_BANDSTACK_BUTTON"); + if(value) ENABLE_BANDSTACK_BUTTON=atoi(value); + value=getProperty("BANDSTACK_BUTTON"); + if(value) BANDSTACK_BUTTON=atoi(value); + value=getProperty("ENABLE_MODE_BUTTON"); + if(value) ENABLE_MODE_BUTTON=atoi(value); + value=getProperty("MODE_BUTTON"); + if(value) MODE_BUTTON=atoi(value); + value=getProperty("ENABLE_FILTER_BUTTON"); + if(value) ENABLE_FILTER_BUTTON=atoi(value); + value=getProperty("FILTER_BUTTON"); + if(value) FILTER_BUTTON=atoi(value); + value=getProperty("ENABLE_NOISE_BUTTON"); + if(value) ENABLE_NOISE_BUTTON=atoi(value); + value=getProperty("NOISE_BUTTON"); + if(value) NOISE_BUTTON=atoi(value); + value=getProperty("ENABLE_AGC_BUTTON"); + if(value) ENABLE_AGC_BUTTON=atoi(value); + value=getProperty("AGC_BUTTON"); + if(value) AGC_BUTTON=atoi(value); + value=getProperty("ENABLE_FUNCTION_BUTTON"); + if(value) ENABLE_FUNCTION_BUTTON=atoi(value); + value=getProperty("FUNCTION_BUTTON"); + if(value) FUNCTION_BUTTON=atoi(value); + value=getProperty("ENABLE_MOX_BUTTON"); + if(value) ENABLE_MOX_BUTTON=atoi(value); + value=getProperty("MOX_BUTTON"); + if(value) MOX_BUTTON=atoi(value); + value=getProperty("ENABLE_LOCK_BUTTON"); + if(value) ENABLE_LOCK_BUTTON=atoi(value); + value=getProperty("LOCK_BUTTON"); + if(value) LOCK_BUTTON=atoi(value); +} + +void gpio_save_state() { + char value[80]; + + sprintf(value,"%d",ENABLE_VFO_ENCODER); + setProperty("ENABLE_VFO_ENCODER",value); + sprintf(value,"%d",ENABLE_VFO_PULLUP); + setProperty("ENABLE_VFO_PULLUP",value); + sprintf(value,"%d",VFO_ENCODER_A); + setProperty("VFO_ENCODER_A",value); + sprintf(value,"%d",VFO_ENCODER_B); + setProperty("VFO_ENCODER_B",value); + sprintf(value,"%d",ENABLE_AF_ENCODER); + setProperty("ENABLE_AF_ENCODER",value); + sprintf(value,"%d",ENABLE_AF_PULLUP); + setProperty("ENABLE_AF_PULLUP",value); + sprintf(value,"%d",AF_ENCODER_A); + setProperty("AF_ENCODER_A",value); + sprintf(value,"%d",AF_ENCODER_B); + setProperty("AF_ENCODER_B",value); + sprintf(value,"%d",ENABLE_RF_ENCODER); + setProperty("ENABLE_RF_ENCODER",value); + sprintf(value,"%d",ENABLE_RF_PULLUP); + setProperty("ENABLE_RF_PULLUP",value); + sprintf(value,"%d",RF_ENCODER_A); + setProperty("RF_ENCODER_A",value); + sprintf(value,"%d",RF_ENCODER_B); + setProperty("RF_ENCODER_B",value); + sprintf(value,"%d",ENABLE_AGC_ENCODER); + setProperty("ENABLE_AGC_ENCODER",value); + sprintf(value,"%d",ENABLE_AGC_PULLUP); + setProperty("ENABLE_AGC_PULLUP",value); + sprintf(value,"%d",AGC_ENCODER_A); + setProperty("AGC_ENCODER_A",value); + sprintf(value,"%d",AGC_ENCODER_B); + setProperty("AGC_ENCODER_B",value); + sprintf(value,"%d",ENABLE_BAND_BUTTON); + setProperty("ENABLE_BAND_BUTTON",value); + sprintf(value,"%d",BAND_BUTTON); + setProperty("BAND_BUTTON",value); + sprintf(value,"%d",ENABLE_BANDSTACK_BUTTON); + setProperty("ENABLE_BANDSTACK_BUTTON",value); + sprintf(value,"%d",BANDSTACK_BUTTON); + setProperty("BANDSTACK_BUTTON",value); + sprintf(value,"%d",ENABLE_MODE_BUTTON); + setProperty("ENABLE_MODE_BUTTON",value); + sprintf(value,"%d",MODE_BUTTON); + setProperty("MODE_BUTTON",value); + sprintf(value,"%d",ENABLE_FILTER_BUTTON); + setProperty("ENABLE_FILTER_BUTTON",value); + sprintf(value,"%d",FILTER_BUTTON); + setProperty("FILTER_BUTTON",value); + sprintf(value,"%d",ENABLE_NOISE_BUTTON); + setProperty("ENABLE_NOISE_BUTTON",value); + sprintf(value,"%d",NOISE_BUTTON); + setProperty("NOISE_BUTTON",value); + sprintf(value,"%d",ENABLE_AGC_BUTTON); + setProperty("ENABLE_AGC_BUTTON",value); + sprintf(value,"%d",AGC_BUTTON); + setProperty("AGC_BUTTON",value); + sprintf(value,"%d",ENABLE_FUNCTION_BUTTON); + setProperty("ENABLE_FUNCTION_BUTTON",value); + sprintf(value,"%d",FUNCTION_BUTTON); + setProperty("FUNCTION_BUTTON",value); + sprintf(value,"%d",ENABLE_MOX_BUTTON); + setProperty("ENABLE_MOX_BUTTON",value); + sprintf(value,"%d",MOX_BUTTON); + setProperty("MOX_BUTTON",value); + sprintf(value,"%d",ENABLE_LOCK_BUTTON); + setProperty("ENABLE_LOCK_BUTTON",value); + sprintf(value,"%d",LOCK_BUTTON); + setProperty("LOCK_BUTTON",value); + + saveProperties("gpio.props"); +} + + +int gpio_init() { + mraa_result_t res; +fprintf(stderr,"MRAA: gpio_init\n"); + + gpio_restore_state(); + + mraa_init(); + + vfo_a_context=mraa_gpio_init(VFO_ENCODER_A); + if(vfo_a_context!=NULL) { + res=mraa_gpio_dir(vfo_a_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(VFO_ENCODER_A,MRAA_GPIO_IN) returned %d\n",res); + } + if(ENABLE_VFO_PULLUP) { + res=mraa_gpio_mode(vfo_a_context,MRAA_GPIO_PULLUP); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_mode(VFO_ENCODER_A,MRAA_GPIO_PULLUP) returned %d\n",res); + } + } + res=mraa_gpio_isr(vfo_a_context,MRAA_GPIO_EDGE_RISING,vfo_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(VFO_ENCODER_A,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",VFO_ENCODER_A); + } + + vfo_b_context=mraa_gpio_init(VFO_ENCODER_B); + if(vfo_b_context!=NULL) { + res=mraa_gpio_dir(vfo_b_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(VFO_ENCODER_B,MRAA_GPIO_IN) returned %d\n",res); + } + if(ENABLE_VFO_PULLUP) { + res=mraa_gpio_mode(vfo_b_context,MRAA_GPIO_PULLUP); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_mode(VFO_ENCODER_B,MRAA_GPIO_PULLUP) returned %d\n",res); + } + } + res=mraa_gpio_isr(vfo_b_context,MRAA_GPIO_EDGE_RISING,vfo_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(VFO_ENCODER_B,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",VFO_ENCODER_B); + } + + af_a_context=mraa_gpio_init(AF_ENCODER_A); + if(af_a_context!=NULL) { + res=mraa_gpio_dir(af_a_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(AF_ENCODER_A,MRAA_GPIO_IN) returned %d\n",res); + } + if(ENABLE_AF_PULLUP) { + res=mraa_gpio_mode(af_a_context,MRAA_GPIO_PULLUP); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_mode(AF_ENCODER_A,MRAA_GPIO_PULLUP) returned %d\n",res); + } + } + res=mraa_gpio_isr(af_a_context,MRAA_GPIO_EDGE_RISING,af_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(AF_ENCODER_A,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",AF_ENCODER_A); + } + + af_b_context=mraa_gpio_init(AF_ENCODER_B); + if(af_b_context!=NULL) { + res=mraa_gpio_dir(af_b_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(AF_ENCODER_B,MRAA_GPIO_IN) returned %d\n",res); + } + if(ENABLE_AF_PULLUP) { + res=mraa_gpio_mode(af_b_context,MRAA_GPIO_PULLUP); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_mode(AF_ENCODER_B,MRAA_GPIO_PULLUP) returned %d\n",res); + } + } + res=mraa_gpio_isr(af_b_context,MRAA_GPIO_EDGE_RISING,af_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(AF_ENCODER_B,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",AF_ENCODER_B); + } + + rf_a_context=mraa_gpio_init(RF_ENCODER_A); + if(rf_a_context!=NULL) { + res=mraa_gpio_dir(rf_a_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(RF_ENCODER_A,MRAA_GPIO_IN) returned %d\n",res); + } + if(ENABLE_RF_PULLUP) { + res=mraa_gpio_mode(rf_a_context,MRAA_GPIO_PULLUP); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_mode(RF_ENCODER_A,MRAA_GPIO_PULLUP) returned %d\n",res); + } + } + res=mraa_gpio_isr(rf_a_context,MRAA_GPIO_EDGE_RISING,rf_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(RF_ENCODER_A,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",RF_ENCODER_A); + } + + rf_b_context=mraa_gpio_init(RF_ENCODER_B); + if(rf_b_context!=NULL) { + res=mraa_gpio_dir(rf_b_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(RF_ENCODER_B,MRAA_GPIO_IN) returned %d\n",res); + } + if(ENABLE_RF_PULLUP) { + res=mraa_gpio_mode(rf_b_context,MRAA_GPIO_PULLUP); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_mode(RF_ENCODER_B,MRAA_GPIO_PULLUP) returned %d\n",res); + } + } + res=mraa_gpio_isr(rf_b_context,MRAA_GPIO_EDGE_RISING,rf_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(RF_ENCODER_B,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",RF_ENCODER_B); + } + + agc_a_context=mraa_gpio_init(AGC_ENCODER_A); + if(agc_a_context!=NULL) { + res=mraa_gpio_dir(agc_a_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(AGC_ENCODER_A,MRAA_GPIO_IN) returned %d\n",res); + } + if(ENABLE_AGC_PULLUP) { + res=mraa_gpio_mode(agc_a_context,MRAA_GPIO_PULLUP); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_mode(AGC_ENCODER_A,MRAA_GPIO_PULLUP) returned %d\n",res); + } + } + res=mraa_gpio_isr(agc_a_context,MRAA_GPIO_EDGE_RISING,agc_encoder_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(AGC_ENCODER_A,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",AGC_ENCODER_A); + } + + agc_b_context=mraa_gpio_init(AGC_ENCODER_B); + if(agc_b_context!=NULL) { + res=mraa_gpio_dir(agc_b_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(AGC_ENCODER_B,MRAA_GPIO_IN) returned %d\n",res); + } + if(ENABLE_AGC_PULLUP) { + res=mraa_gpio_mode(agc_b_context,MRAA_GPIO_PULLUP); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_mode(AGC_ENCODER_B,MRAA_GPIO_PULLUP) returned %d\n",res); + } + } + res=mraa_gpio_isr(agc_b_context,MRAA_GPIO_EDGE_RISING,agc_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(AGC_ENCODER_B,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",AGC_ENCODER_B); + } + + function_context=mraa_gpio_init(FUNCTION_BUTTON); + if(function_context!=NULL) { + res=mraa_gpio_dir(function_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(FUNCTION_BUTTON,MRAA_GPIO_IN) returned %d\n",res); + } + res=mraa_gpio_isr(function_context,MRAA_GPIO_EDGE_RISING,function_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(FUNCTION_BUTTON,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",FUNCTION_BUTTON); + } + + band_context=mraa_gpio_init(BAND_BUTTON); + if(band_context!=NULL) { + res=mraa_gpio_dir(band_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(BAND_BUTTON,MRAA_GPIO_IN) returned %d\n",res); + } + res=mraa_gpio_isr(band_context,MRAA_GPIO_EDGE_RISING,function_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(BAND_BUTTON,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",BAND_BUTTON); + } + + bandstack_context=mraa_gpio_init(BANDSTACK_BUTTON); + if(bandstack_context!=NULL) { + res=mraa_gpio_dir(bandstack_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(BANDSTACK_BUTTON,MRAA_GPIO_IN) returned %d\n",res); + } + res=mraa_gpio_isr(bandstack_context,MRAA_GPIO_EDGE_RISING,function_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(BANDSTACK_BUTTON,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",BANDSTACK_BUTTON); + } + + mode_context=mraa_gpio_init(MODE_BUTTON); + if(mode_context!=NULL) { + res=mraa_gpio_dir(mode_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(MODE_BUTTON,MRAA_GPIO_IN) returned %d\n",res); + } + res=mraa_gpio_isr(mode_context,MRAA_GPIO_EDGE_RISING,function_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(MODE_BUTTON,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",MODE_BUTTON); + } + + int rc=pthread_create(&rotary_encoder_thread_id, NULL, rotary_encoder_thread, NULL); + if(rc<0) { + fprintf(stderr,"pthread_create for rotary_encoder_thread failed %d\n",rc); + } + + filter_context=mraa_gpio_init(FILTER_BUTTON); + if(filter_context!=NULL) { + res=mraa_gpio_dir(filter_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(FILTER_BUTTON,MRAA_GPIO_IN) returned %d\n",res); + } + res=mraa_gpio_isr(filter_context,MRAA_GPIO_EDGE_RISING,function_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(FILTER_BUTTON,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",FILTER_BUTTON); + } + + noise_context=mraa_gpio_init(NOISE_BUTTON); + if(noise_context!=NULL) { + res=mraa_gpio_dir(noise_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(NOISE_BUTTON,MRAA_GPIO_IN) returned %d\n",res); + } + res=mraa_gpio_isr(noise_context,MRAA_GPIO_EDGE_RISING,function_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(NOISE_BUTTON,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",NOISE_BUTTON); + } + + agc_context=mraa_gpio_init(AGC_BUTTON); + if(agc_context!=NULL) { + res=mraa_gpio_dir(agc_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(AGC_BUTTON,MRAA_GPIO_IN) returned %d\n",res); + } + res=mraa_gpio_isr(agc_context,MRAA_GPIO_EDGE_RISING,function_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(AGC_BUTTON,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",AGC_BUTTON); + } + + mox_context=mraa_gpio_init(MOX_BUTTON); + if(mox_context!=NULL) { + res=mraa_gpio_dir(mox_context,MRAA_GPIO_IN); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_dir(MOX_BUTTON,MRAA_GPIO_IN) returned %d\n",res); + } + res=mraa_gpio_isr(mox_context,MRAA_GPIO_EDGE_RISING,function_interrupt,NULL); + if(res!=MRAA_SUCCESS) { + fprintf(stderr,"mra_gpio_isr(MOX_BUTTON,MRAA_GPIO_EDGE_BOTH) returned %d\n", res); + } + } else { + fprintf(stderr,"mraa_gpio_init(%d) returned NULL\n",MOX_BUTTON); + } + + return 0; +} + +void gpio_close() { + mraa_result_t res; + + res=mraa_gpio_close(function_context); + res=mraa_gpio_close(band_context); + res=mraa_gpio_close(bandstack_context); + res=mraa_gpio_close(mode_context); + res=mraa_gpio_close(filter_context); + res=mraa_gpio_close(noise_context); + res=mraa_gpio_close(agc_context); + res=mraa_gpio_close(mox_context); + res=mraa_gpio_close(agc_b_context); + res=mraa_gpio_close(agc_a_context); + res=mraa_gpio_close(rf_b_context); + res=mraa_gpio_close(rf_a_context); + res=mraa_gpio_close(af_b_context); + res=mraa_gpio_close(af_a_context); + res=mraa_gpio_close(vfo_b_context); + res=mraa_gpio_close(vfo_a_context); +} + +int vfo_encoder_get_pos() { + int pos=vfoEncoderPos; + + if(vfo_encoder_divisor>1) { + if(pos<0 && pos>-vfo_encoder_divisor) { + pos=0; + } else if(pos>0 && posfrequencyA=entry->frequencyA+(pos*step); + //setFrequency(entry->frequencyA); + setFrequency(entry->frequencyA+ddsOffset+(pos*step)); + vfo_update(NULL); + } + free(data); + return 0; +} + +static int af_encoder_changed(void *data) { + int pos=*(int*)data; + if(pos!=0) { + if(function || isTransmitting()) { + // mic gain + double gain=mic_gain; + gain+=(double)pos/100.0; + if(gain<0.0) { + gain=0.0; + } else if(gain>4.0) { + gain=4.0; + } + set_mic_gain(gain); + } else { + // af gain + double gain=volume; + gain+=(double)pos/100.0; + if(gain<0.0) { + gain=0.0; + } else if(gain>1.0) { + gain=1.0; + } + set_af_gain(gain); + } + } + free(data); + return 0; +} + +static int rf_encoder_changed(void *data) { + int pos=*(int*)data; + if(pos!=0) { + if(function || tune) { + // tune drive + double d=getTuneDrive(); + d+=(double)pos/100.0; + if(d<0.0) { + d=0.0; + } else if(d>1.0) { + d=1.0; + } + set_tune(d); + } else { + // drive + double d=getDrive(); + d+=(double)pos/100.0; + if(d<0.0) { + d=0.0; + } else if(d>1.0) { + d=1.0; + } + set_drive(d); + } + } + free(data); + return 0; +} + +static int agc_encoder_changed(void *data) { + int pos=*(int*)data; + if(pos!=0) { + if(function) { + int att=attenuation; + att+=pos; + if(att<0) { + att=0; + } else if (att>31) { + att=31; + } + set_attenuation_value((double)att); + } else { + double gain=agc_gain; + gain+=(double)pos; + if(gain<-20.0) { + gain=-20.0; + } else if(gain>120.0) { + gain=120.0; + } + set_agc_gain(gain); + } + } + return 0; +} + +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); + + 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); + 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); + 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); + } + return 0; +} + +static int lock_pressed(void *data) { +fprintf(stderr,"lock_pressed\n"); + lock_cb((GtkWidget *)NULL, (gpointer)NULL); + return 0; +} + +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); + + 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); + + 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); + 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); + return 0; +} + +static void* rotary_encoder_thread(void *arg) { + int pos; + while(1) { + + int function_button=function_get_state(); + if(function_button!=previous_function_button) { + previous_function_button=function_button; + if(function_button) { + g_idle_add(function_pressed,(gpointer)NULL); + } + } + + pos=vfo_encoder_get_pos(); + if(pos!=0) { + int *p=malloc(sizeof(int)); + *p=pos; + g_idle_add(vfo_encoder_changed,(gpointer)p); + } + +/* + af_function=af_function_get_state(); + if(af_function!=previous_af_function) { + previous_af_function=af_function; + } +*/ + pos=af_encoder_get_pos(); + if(pos!=0) { + int *p=malloc(sizeof(int)); + *p=pos; + g_idle_add(af_encoder_changed,(gpointer)p); + } + +/* + rf_function=rf_function_get_state(); + if(rf_function!=previous_rf_function) { + previous_rf_function=rf_function; + } +*/ + pos=rf_encoder_get_pos(); + if(pos!=0) { + int *p=malloc(sizeof(int)); + *p=pos; + g_idle_add(rf_encoder_changed,(gpointer)p); + } + + pos=agc_encoder_get_pos(); + if(pos!=0) { + int *p=malloc(sizeof(int)); + *p=pos; + g_idle_add(agc_encoder_changed,(gpointer)p); + } + + + int band_button=band_get_state(); + if(band_button!=previous_band_button) { + previous_band_button=band_button; + if(band_button) { + g_idle_add(band_pressed,(gpointer)NULL); + } + } + + int bandstack_button=bandstack_get_state(); + if(bandstack_button!=previous_bandstack_button) { + previous_bandstack_button=bandstack_button; + if(bandstack_button) { + g_idle_add(bandstack_pressed,(gpointer)NULL); + } + } + + int mode_button=mode_get_state(); + if(mode_button!=previous_mode_button) { + previous_mode_button=mode_button; + if(mode_button) { + g_idle_add(mode_pressed,(gpointer)NULL); + } + } + + int filter_button=filter_get_state(); + if(filter_button!=previous_filter_button) { + previous_filter_button=filter_button; + if(filter_button) { + g_idle_add(filter_pressed,(gpointer)NULL); + } + } + + int noise_button=noise_get_state(); + if(noise_button!=previous_noise_button) { + previous_noise_button=noise_button; + if(noise_button) { + g_idle_add(noise_pressed,(gpointer)NULL); + } + } + + int agc_button=agc_get_state(); + if(agc_button!=previous_agc_button) { + previous_agc_button=agc_button; + if(agc_button) { + g_idle_add(agc_pressed,(gpointer)NULL); + } + } + + int mox_button=mox_get_state(); + if(mox_button!=previous_mox_button) { + previous_mox_button=mox_button; + if(mox_button) { + g_idle_add(mox_pressed,(gpointer)NULL); + } + } + + int lock_button=lock_get_state(); + if(lock_button!=previous_lock_button) { + previous_lock_button=lock_button; + if(lock_button) { + g_idle_add(lock_pressed,(gpointer)NULL); + } + } + + usleep(100000); + } +} diff --git a/main.c b/main.c index 66ac966..39c7350 100644 --- a/main.c +++ b/main.c @@ -30,6 +30,7 @@ #include "main.h" #include "channel.h" #include "discovered.h" +#include "configure.h" #include "gpio.h" #include "old_discovery.h" #include "new_discovery.h" @@ -63,6 +64,9 @@ #ifdef odroid #define INCLUDE_GPIO #endif +#ifdef up +#define INCLUDE_GPIO +#endif #define VFO_HEIGHT ((display_height/32)*4) #define VFO_WIDTH ((display_width/32)*16) @@ -235,314 +239,6 @@ fprintf(stderr,"start_cb\n"); gtk_widget_destroy(discovery_dialog); } -static void sample_rate_cb(GtkWidget *widget, gpointer data) { - sample_rate=(int)data; -} - -static void display_panadapter_cb(GtkWidget *widget, gpointer data) { - display_panadapter=display_panadapter==1?0:1; -} - -static void display_waterfall_cb(GtkWidget *widget, gpointer data) { - display_waterfall=display_waterfall==1?0:1; -} - -static void display_sliders_cb(GtkWidget *widget, gpointer data) { - display_sliders=display_sliders==1?0:1; -} - -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; -} - -#ifdef INCLUDE_GPIO -static void configure_gpio() { - gpio_restore_state(); - - GtkWidget *dialog=gtk_dialog_new_with_buttons("Configure GPIO",GTK_WINDOW(splash_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_enable_vfo_encoder=gtk_check_button_new_with_label("Enable VFO"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_vfo_encoder), ENABLE_VFO_ENCODER); - gtk_widget_show(b_enable_vfo_encoder); - gtk_grid_attach(GTK_GRID(grid),b_enable_vfo_encoder,0,0,1,1); - - GtkWidget *vfo_a_label=gtk_label_new("GPIO A:"); - gtk_widget_show(vfo_a_label); - gtk_grid_attach(GTK_GRID(grid),vfo_a_label,1,0,1,1); - - GtkWidget *vfo_a=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(vfo_a),VFO_ENCODER_A); - gtk_widget_show(vfo_a); - gtk_grid_attach(GTK_GRID(grid),vfo_a,2,0,1,1); - - GtkWidget *vfo_b_label=gtk_label_new("GPIO B:"); - gtk_widget_show(vfo_b_label); - gtk_grid_attach(GTK_GRID(grid),vfo_b_label,3,0,1,1); - - GtkWidget *vfo_b=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(vfo_b),VFO_ENCODER_B); - gtk_widget_show(vfo_b); - gtk_grid_attach(GTK_GRID(grid),vfo_b,4,0,1,1); - - GtkWidget *b_enable_vfo_pullup=gtk_check_button_new_with_label("Enable Pull-up"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_vfo_pullup), ENABLE_VFO_PULLUP); - gtk_widget_show(b_enable_vfo_pullup); - gtk_grid_attach(GTK_GRID(grid),b_enable_vfo_pullup,5,0,1,1); - - - - GtkWidget *b_enable_af_encoder=gtk_check_button_new_with_label("Enable AF"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_af_encoder), ENABLE_AF_ENCODER); - gtk_widget_show(b_enable_af_encoder); - gtk_grid_attach(GTK_GRID(grid),b_enable_af_encoder,0,1,1,1); - - GtkWidget *af_a_label=gtk_label_new("GPIO A:"); - gtk_widget_show(af_a_label); - gtk_grid_attach(GTK_GRID(grid),af_a_label,1,1,1,1); - - GtkWidget *af_a=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(af_a),AF_ENCODER_A); - gtk_widget_show(af_a); - gtk_grid_attach(GTK_GRID(grid),af_a,2,1,1,1); - - GtkWidget *af_b_label=gtk_label_new("GPIO B:"); - gtk_widget_show(af_b_label); - gtk_grid_attach(GTK_GRID(grid),af_b_label,3,1,1,1); - - GtkWidget *af_b=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(af_b),AF_ENCODER_B); - gtk_widget_show(af_b); - gtk_grid_attach(GTK_GRID(grid),af_b,4,1,1,1); - - GtkWidget *b_enable_af_pullup=gtk_check_button_new_with_label("Enable Pull-up"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_af_pullup), ENABLE_AF_PULLUP); - gtk_widget_show(b_enable_af_pullup); - gtk_grid_attach(GTK_GRID(grid),b_enable_af_pullup,5,1,1,1); - - - - GtkWidget *b_enable_rf_encoder=gtk_check_button_new_with_label("Enable RF"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_rf_encoder), ENABLE_RF_ENCODER); - gtk_widget_show(b_enable_rf_encoder); - gtk_grid_attach(GTK_GRID(grid),b_enable_rf_encoder,0,2,1,1); - - GtkWidget *rf_a_label=gtk_label_new("GPIO A:"); - gtk_widget_show(rf_a_label); - gtk_grid_attach(GTK_GRID(grid),rf_a_label,1,2,1,1); - - GtkWidget *rf_a=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(rf_a),RF_ENCODER_A); - gtk_widget_show(rf_a); - gtk_grid_attach(GTK_GRID(grid),rf_a,2,2,1,1); - - GtkWidget *rf_b_label=gtk_label_new("GPIO B:"); - gtk_widget_show(rf_b_label); - gtk_grid_attach(GTK_GRID(grid),rf_b_label,3,2,1,1); - - GtkWidget *rf_b=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(rf_b),RF_ENCODER_B); - gtk_widget_show(rf_b); - gtk_grid_attach(GTK_GRID(grid),rf_b,4,2,1,1); - - GtkWidget *b_enable_rf_pullup=gtk_check_button_new_with_label("Enable Pull-up"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_rf_pullup), ENABLE_RF_PULLUP); - gtk_widget_show(b_enable_rf_pullup); - gtk_grid_attach(GTK_GRID(grid),b_enable_rf_pullup,5,2,1,1); - - - - GtkWidget *b_enable_agc_encoder=gtk_check_button_new_with_label("Enable AGC"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_agc_encoder), ENABLE_AGC_ENCODER); - gtk_widget_show(b_enable_agc_encoder); - gtk_grid_attach(GTK_GRID(grid),b_enable_agc_encoder,0,3,1,1); - - GtkWidget *agc_a_label=gtk_label_new("GPIO A:"); - gtk_widget_show(agc_a_label); - gtk_grid_attach(GTK_GRID(grid),agc_a_label,1,3,1,1); - - GtkWidget *agc_a=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(agc_a),AGC_ENCODER_A); - gtk_widget_show(agc_a); - gtk_grid_attach(GTK_GRID(grid),agc_a,2,3,1,1); - - GtkWidget *agc_b_label=gtk_label_new("GPIO B:"); - gtk_widget_show(agc_b_label); - gtk_grid_attach(GTK_GRID(grid),agc_b_label,3,3,1,1); - - GtkWidget *agc_b=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(agc_b),AGC_ENCODER_B); - gtk_widget_show(agc_b); - gtk_grid_attach(GTK_GRID(grid),agc_b,4,3,1,1); - - GtkWidget *b_enable_agc_pullup=gtk_check_button_new_with_label("Enable Pull-up"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_agc_pullup), ENABLE_AGC_PULLUP); - gtk_widget_show(b_enable_agc_pullup); - gtk_grid_attach(GTK_GRID(grid),b_enable_agc_pullup,5,3,1,1); - - - - GtkWidget *b_enable_band=gtk_check_button_new_with_label("Enable Band"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_band), ENABLE_BAND_BUTTON); - gtk_widget_show(b_enable_band); - gtk_grid_attach(GTK_GRID(grid),b_enable_band,0,4,1,1); - - GtkWidget *band_label=gtk_label_new("GPIO:"); - gtk_widget_show(band_label); - gtk_grid_attach(GTK_GRID(grid),band_label,1,4,1,1); - - GtkWidget *band=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(band),BAND_BUTTON); - gtk_widget_show(band); - gtk_grid_attach(GTK_GRID(grid),band,2,4,1,1); - - - GtkWidget *b_enable_mode=gtk_check_button_new_with_label("Enable Mode"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_mode), ENABLE_MODE_BUTTON); - gtk_widget_show(b_enable_mode); - gtk_grid_attach(GTK_GRID(grid),b_enable_mode,0,5,1,1); - - GtkWidget *mode_label=gtk_label_new("GPIO:"); - gtk_widget_show(mode_label); - gtk_grid_attach(GTK_GRID(grid),mode_label,1,5,1,1); - - GtkWidget *mode=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(mode),MODE_BUTTON); - gtk_widget_show(mode); - gtk_grid_attach(GTK_GRID(grid),mode,2,5,1,1); - - - GtkWidget *b_enable_filter=gtk_check_button_new_with_label("Enable Filter"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_filter), ENABLE_FILTER_BUTTON); - gtk_widget_show(b_enable_filter); - gtk_grid_attach(GTK_GRID(grid),b_enable_filter,0,6,1,1); - - GtkWidget *filter_label=gtk_label_new("GPIO:"); - gtk_widget_show(filter_label); - gtk_grid_attach(GTK_GRID(grid),filter_label,1,6,1,1); - - GtkWidget *filter=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(filter),FILTER_BUTTON); - gtk_widget_show(filter); - gtk_grid_attach(GTK_GRID(grid),filter,2,6,1,1); - - - GtkWidget *b_enable_noise=gtk_check_button_new_with_label("Enable Noise"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_noise), ENABLE_NOISE_BUTTON); - gtk_widget_show(b_enable_noise); - gtk_grid_attach(GTK_GRID(grid),b_enable_noise,0,7,1,1); - - GtkWidget *noise_label=gtk_label_new("GPIO:"); - gtk_widget_show(noise_label); - gtk_grid_attach(GTK_GRID(grid),noise_label,1,7,1,1); - - GtkWidget *noise=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(noise),NOISE_BUTTON); - gtk_widget_show(noise); - gtk_grid_attach(GTK_GRID(grid),noise,2,7,1,1); - - - GtkWidget *b_enable_agc=gtk_check_button_new_with_label("Enable AGC"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_agc), ENABLE_AGC_BUTTON); - gtk_widget_show(b_enable_agc); - gtk_grid_attach(GTK_GRID(grid),b_enable_agc,0,8,1,1); - - GtkWidget *agc_label=gtk_label_new("GPIO:"); - gtk_widget_show(agc_label); - gtk_grid_attach(GTK_GRID(grid),agc_label,1,8,1,1); - - GtkWidget *agc=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(agc),AGC_BUTTON); - gtk_widget_show(agc); - gtk_grid_attach(GTK_GRID(grid),agc,2,8,1,1); - - - GtkWidget *b_enable_mox=gtk_check_button_new_with_label("Enable MOX"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_mox), ENABLE_MOX_BUTTON); - gtk_widget_show(b_enable_mox); - gtk_grid_attach(GTK_GRID(grid),b_enable_mox,0,9,1,1); - - GtkWidget *mox_label=gtk_label_new("GPIO:"); - gtk_widget_show(mox_label); - gtk_grid_attach(GTK_GRID(grid),mox_label,1,9,1,1); - - GtkWidget *mox=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(mox),MOX_BUTTON); - gtk_widget_show(mox); - gtk_grid_attach(GTK_GRID(grid),mox,2,9,1,1); - - - GtkWidget *b_enable_function=gtk_check_button_new_with_label("Enable Function"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_enable_function), ENABLE_FUNCTION_BUTTON); - gtk_widget_show(b_enable_function); - gtk_grid_attach(GTK_GRID(grid),b_enable_function,0,10,1,1); - - GtkWidget *function_label=gtk_label_new("GPIO:"); - gtk_widget_show(function_label); - gtk_grid_attach(GTK_GRID(grid),function_label,1,10,1,1); - - GtkWidget *function=gtk_spin_button_new_with_range (0.0,100.0,1.0); - gtk_spin_button_set_value (GTK_SPIN_BUTTON(function),FUNCTION_BUTTON); - gtk_widget_show(function); - gtk_grid_attach(GTK_GRID(grid),function,2,10,1,1); - - - - gtk_container_add(GTK_CONTAINER(content),grid); - - 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); - - int result=gtk_dialog_run(GTK_DIALOG(dialog)); - - ENABLE_VFO_ENCODER=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_vfo_encoder))?1:0; - VFO_ENCODER_A=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(vfo_a)); - VFO_ENCODER_B=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(vfo_b)); - ENABLE_VFO_PULLUP=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_vfo_pullup))?1:0; - ENABLE_AF_ENCODER=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_af_encoder))?1:0; - AF_ENCODER_A=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(af_a)); - AF_ENCODER_B=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(af_b)); - ENABLE_AF_PULLUP=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_af_pullup))?1:0; - ENABLE_RF_ENCODER=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_rf_encoder))?1:0; - RF_ENCODER_A=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rf_a)); - RF_ENCODER_B=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rf_b)); - ENABLE_RF_PULLUP=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_rf_pullup))?1:0; - ENABLE_AGC_ENCODER=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_agc_encoder))?1:0; - AGC_ENCODER_A=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(agc_a)); - AGC_ENCODER_B=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(agc_b)); - ENABLE_AGC_PULLUP=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_agc_pullup))?1:0; - ENABLE_BAND_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_band))?1:0; - BAND_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(band)); - ENABLE_MODE_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_mode))?1:0; - MODE_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(mode)); - ENABLE_FILTER_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_filter))?1:0; - FILTER_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(filter)); - ENABLE_NOISE_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_noise))?1:0; - NOISE_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(noise)); - ENABLE_AGC_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_agc))?1:0; - AGC_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(agc)); - ENABLE_MOX_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_mox))?1:0; - MOX_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(mox)); - ENABLE_FUNCTION_BUTTON=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b_enable_function))?1:0; - FUNCTION_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(function)); - - gtk_widget_destroy(dialog); - - gpio_save_state(); -} -#endif - static void configure_cb(GtkWidget *widget, gpointer data) { DISCOVERED* d; d=&discovered[(int)data]; @@ -565,144 +261,7 @@ static void configure_cb(GtkWidget *widget, gpointer data) { } radioRestoreState(); - GtkWidget *dialog=gtk_dialog_new_with_buttons("Configure",GTK_WINDOW(splash_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),FALSE); - gtk_grid_set_row_homogeneous(GTK_GRID(grid),FALSE); - - GtkWidget *sample_rate_label=gtk_label_new("Sample Rate:"); - //gtk_widget_override_font(sample_rate_label, pango_font_description_from_string("Arial 18")); - gtk_widget_show(sample_rate_label); - gtk_grid_attach(GTK_GRID(grid),sample_rate_label,0,0,1,1); - - GtkWidget *sample_rate_48=gtk_radio_button_new_with_label(NULL,"48000"); - //gtk_widget_override_font(sample_rate_48, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_48), sample_rate==48000); - gtk_widget_show(sample_rate_48); - gtk_grid_attach(GTK_GRID(grid),sample_rate_48,0,1,1,1); - g_signal_connect(sample_rate_48,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)48000); - - GtkWidget *sample_rate_96=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_48),"96000"); - //gtk_widget_override_font(sample_rate_96, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_96), sample_rate==96000); - gtk_widget_show(sample_rate_96); - gtk_grid_attach(GTK_GRID(grid),sample_rate_96,0,2,1,1); - g_signal_connect(sample_rate_96,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)96000); - - GtkWidget *sample_rate_192=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_96),"192000"); - //gtk_widget_override_font(sample_rate_192, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_192), sample_rate==192000); - gtk_widget_show(sample_rate_192); - gtk_grid_attach(GTK_GRID(grid),sample_rate_192,0,3,1,1); - g_signal_connect(sample_rate_192,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)192000); - - GtkWidget *sample_rate_384=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_192),"384000"); - //gtk_widget_override_font(sample_rate_384, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_384), sample_rate==384000); - gtk_widget_show(sample_rate_384); - gtk_grid_attach(GTK_GRID(grid),sample_rate_384,0,4,1,1); - g_signal_connect(sample_rate_384,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)384000); - - if(d->protocol==NEW_PROTOCOL -#ifdef LIMESDR - || d->protocol==LIMESDR_PROTOCOL -#endif - ) { - GtkWidget *sample_rate_768=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_384),"768000"); - //gtk_widget_override_font(sample_rate_768, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_768), sample_rate==768000); - gtk_widget_show(sample_rate_768); - gtk_grid_attach(GTK_GRID(grid),sample_rate_768,0,5,1,1); - g_signal_connect(sample_rate_768,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)768000); - - GtkWidget *sample_rate_921=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_768),"921180"); - //gtk_widget_override_font(sample_rate_921, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_921), sample_rate==921180); - gtk_widget_show(sample_rate_921); - gtk_grid_attach(GTK_GRID(grid),sample_rate_921,0,6,1,1); - g_signal_connect(sample_rate_921,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)921180); - - GtkWidget *sample_rate_1536=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_921),"1536000"); - //gtk_widget_override_font(sample_rate_1536, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_1536), sample_rate==1536000); - gtk_widget_show(sample_rate_1536); - gtk_grid_attach(GTK_GRID(grid),sample_rate_1536,0,7,1,1); - g_signal_connect(sample_rate_1536,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)1536000); - -#ifdef LIMESDR - if(d->protocol==LIMESDR_PROTOCOL) { - GtkWidget *sample_rate_1M=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_1536),"1048576"); - //gtk_widget_override_font(sample_rate_1M, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_1M), sample_rate==1048576); - gtk_widget_show(sample_rate_1M); - gtk_grid_attach(GTK_GRID(grid),sample_rate_1M,0,8,1,1); - g_signal_connect(sample_rate_1M,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)1048576); - - GtkWidget *sample_rate_2M=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(sample_rate_1M),"2097152"); - //gtk_widget_override_font(sample_rate_2M, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sample_rate_2M), sample_rate==2097152); - gtk_widget_show(sample_rate_2M); - gtk_grid_attach(GTK_GRID(grid),sample_rate_2M,0,9,1,1); - g_signal_connect(sample_rate_2M,"pressed",G_CALLBACK(sample_rate_cb),(gpointer *)2097152); - } -#endif - } - - - GtkWidget *display_label=gtk_label_new("Display:"); - //gtk_widget_override_font(display_label, pango_font_description_from_string("Arial 18")); - gtk_widget_show(display_label); - gtk_grid_attach(GTK_GRID(grid),display_label,0,9,1,1); - - GtkWidget *b_display_panadapter=gtk_check_button_new_with_label("Display Panadapter"); - //gtk_widget_override_font(b_display_panadapter, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_panadapter), display_panadapter); - gtk_widget_show(b_display_panadapter); - gtk_grid_attach(GTK_GRID(grid),b_display_panadapter,0,10,1,1); - g_signal_connect(b_display_panadapter,"toggled",G_CALLBACK(display_panadapter_cb),(gpointer *)NULL); - - GtkWidget *b_display_waterfall=gtk_check_button_new_with_label("Display Waterfall"); - //gtk_widget_override_font(b_display_waterfall, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_waterfall), display_waterfall); - gtk_widget_show(b_display_waterfall); - gtk_grid_attach(GTK_GRID(grid),b_display_waterfall,0,11,1,1); - g_signal_connect(b_display_waterfall,"toggled",G_CALLBACK(display_waterfall_cb),(gpointer *)NULL); - - GtkWidget *b_display_sliders=gtk_check_button_new_with_label("Display Sliders"); - //gtk_widget_override_font(b_display_sliders, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_sliders), display_sliders); - gtk_widget_show(b_display_sliders); - gtk_grid_attach(GTK_GRID(grid),b_display_sliders,0,12,1,1); - g_signal_connect(b_display_sliders,"toggled",G_CALLBACK(display_sliders_cb),(gpointer *)NULL); - - GtkWidget *b_display_toolbar=gtk_check_button_new_with_label("Display Toolbar"); - //gtk_widget_override_font(b_display_toolbar, pango_font_description_from_string("Arial 18")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b_display_toolbar), display_toolbar); - gtk_widget_show(b_display_toolbar); - gtk_grid_attach(GTK_GRID(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); - //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)); - - radioSaveState(); + configure(d,splash_window); } @@ -918,7 +477,7 @@ fprintf(stderr,"protocol=%d name=%s\n",d->protocol,d->name); gtk_widget_destroy(discovery_dialog); #ifdef INCLUDE_GPIO if(result==GTK_RESPONSE_YES) { - configure_gpio(); + configure_gpio(splash_window); } #endif } diff --git a/menu.c b/menu.c index c91bbfe..09dc54d 100644 --- a/menu.c +++ b/menu.c @@ -1020,12 +1020,18 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget, GtkWidget *cw_grid=gtk_grid_new(); gtk_grid_set_row_homogeneous(GTK_GRID(cw_grid),TRUE); +/* GtkWidget *cw_keyer_internal_b=gtk_check_button_new_with_label("CW Internal - Speed (WPM)"); //gtk_widget_override_font(cw_keyer_internal_b, pango_font_description_from_string("Arial 18")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw_keyer_internal_b), cw_keyer_internal); gtk_widget_show(cw_keyer_internal_b); gtk_grid_attach(GTK_GRID(cw_grid),cw_keyer_internal_b,0,0,1,1); g_signal_connect(cw_keyer_internal_b,"toggled",G_CALLBACK(cw_keyer_internal_cb),NULL); +*/ + GtkWidget *cw_speed_label=gtk_label_new("CW Speed (WPM)"); + //gtk_widget_override_font(cw_speed_label, pango_font_description_from_string("Arial 18")); + gtk_widget_show(cw_speed_label); + gtk_grid_attach(GTK_GRID(cw_grid),cw_speed_label,0,0,1,1); GtkWidget *cw_keyer_speed_b=gtk_spin_button_new_with_range(1.0,60.0,1.0); //gtk_widget_override_font(cw_keyer_speed_b, pango_font_description_from_string("Arial 18")); diff --git a/new_protocol.c b/new_protocol.c index 97d40e8..465c734 100644 --- a/new_protocol.c +++ b/new_protocol.c @@ -784,6 +784,16 @@ fprintf(stderr,"outputsamples=%d\n", outputsamples); ptt=buffer[4]&0x01; dot=(buffer[4]>>1)&0x01; dash=(buffer[4]>>2)&0x01; + +if(ptt!=previous_ptt) { + fprintf(stderr,"ptt=%d\n",ptt); +} +if(dot!=previous_dot) { + fprintf(stderr,"dot=%d\n",dot); +} +if(dash!=previous_dash) { + fprintf(stderr,"dash=%d\n",dash); +} pll_locked=(buffer[4]>>3)&0x01; adc_overload=buffer[5]&0x01; exciter_power=((buffer[6]&0xFF)<<8)|(buffer[7]&0xFF); diff --git a/old_protocol.c b/old_protocol.c index 88a3239..8ded04d 100644 --- a/old_protocol.c +++ b/old_protocol.c @@ -594,9 +594,10 @@ static void full_tx_buffer() { int error; double gain; if(tune) { - double tunefrequency = (double)((filterHigh - filterLow) / 2); + double tunefrequency = (double)(filterLow+((filterHigh - filterLow) / 2)); phase=sineWave(micinputbuffer, BUFFER_SIZE, phase, (float)tunefrequency); } + // process the output fexchange0(CHANNEL_TX, micinputbuffer, micoutputbuffer, &error); if(error!=0) { @@ -860,7 +861,7 @@ void ozy_send_buffer() { // output_buffer[C1]|=0x00; } else { if((tune==1) || (mox==1) || (cw_keyer_internal==0)) { - // output_buffer[C1]|=0x00; + output_buffer[C1]|=0x00; } else { output_buffer[C1]|=0x01; } @@ -871,10 +872,10 @@ void ozy_send_buffer() { break; case 8: output_buffer[C0]=0x20; - output_buffer[C1]=cw_keyer_hang_time; - output_buffer[C2]=cw_keyer_hang_time>>8; - output_buffer[C3]=cw_keyer_sidetone_frequency; - output_buffer[C4]=cw_keyer_sidetone_frequency>>8; + output_buffer[C1]=(cw_keyer_hang_time>>2) & 0xFF; + output_buffer[C2]=cw_keyer_hang_time & 0x03; + output_buffer[C3]=(cw_keyer_sidetone_frequency>>4) & 0xFF; + output_buffer[C4]=cw_keyer_sidetone_frequency & 0x0F; break; } @@ -888,6 +889,8 @@ void ozy_send_buffer() { if(cw_keyer_internal==0) { output_buffer[C0]|=0x01; } + } else { + output_buffer[C0]|=0x01; } } diff --git a/panadapter.c b/panadapter.c index fbe109b..3b26efd 100644 --- a/panadapter.c +++ b/panadapter.c @@ -186,6 +186,7 @@ void panadapter_update(float *data,int tx) { float saved_max; float saved_min; gfloat saved_hz_per_pixel; + cairo_text_extents_t extents; samples=data; //if(result==1) { @@ -253,7 +254,6 @@ void panadapter_update(float *data,int tx) { long divisor=20000; long f; long half=(long)getSampleRate()/2L; - cairo_text_extents_t extents; switch(sample_rate) { case 48000: divisor=5000L; @@ -356,12 +356,13 @@ void panadapter_update(float *data,int tx) { #ifdef FREEDV if(mode==modeFREEDV) { - cairo_set_source_rgb(cr, 0, 0, 0); - cairo_rectangle(cr, (double)display_width/2.0+2.0, (double)panadapter_height-20.0, (double)display_width, (double)panadapter_height); - cairo_fill(cr); +// cairo_set_source_rgb(cr, 0, 0, 0); +// cairo_rectangle(cr, (double)display_width/2.0+2.0, (double)panadapter_height-20.0, (double)display_width, (double)panadapter_height); +// cairo_fill(cr); cairo_set_source_rgb(cr, 0, 1, 0); cairo_set_font_size(cr, 16); - cairo_move_to(cr,(double)display_width/2.0+5.0,(double)panadapter_height-2.0); + cairo_text_extents(cr, freedv_rx_text_data, &extents); + cairo_move_to(cr, (double)display_width/2.0-(extents.width/2.0),(double)panadapter_height-2.0); cairo_show_text(cr, freedv_rx_text_data); } #endif diff --git a/pihpsdr b/pihpsdr index 843c420..1124f08 100755 Binary files a/pihpsdr and b/pihpsdr differ diff --git a/radio.c b/radio.c index 5570dc3..131d711 100644 --- a/radio.c +++ b/radio.c @@ -253,6 +253,11 @@ int getTune() { } int isTransmitting() { + BANDSTACK_ENTRY *entry; + entry=bandstack_entry_get_current(); + if((entry->mode==modeCWL || entry->mode==modeCWU) && cw_keyer_internal==1 && !tune) { + return 0; + } return ptt!=0 || mox!=0 || tune!=0; } diff --git a/release/documentation/pihpsdr-build.odt b/release/documentation/pihpsdr-build.odt index 7993d94..a372a55 100644 Binary files a/release/documentation/pihpsdr-build.odt and b/release/documentation/pihpsdr-build.odt differ diff --git a/release/documentation/pihpsdr-build.pdf b/release/documentation/pihpsdr-build.pdf index a09a384..95d1e4b 100644 Binary files a/release/documentation/pihpsdr-build.pdf and b/release/documentation/pihpsdr-build.pdf differ diff --git a/release/documentation/pihpsdr-install.odt b/release/documentation/pihpsdr-install.odt index 6c0e87e..ba1e9e8 100644 Binary files a/release/documentation/pihpsdr-install.odt and b/release/documentation/pihpsdr-install.odt differ diff --git a/release/documentation/pihpsdr-install.pdf b/release/documentation/pihpsdr-install.pdf index c40ceb7..8272a17 100644 Binary files a/release/documentation/pihpsdr-install.pdf and b/release/documentation/pihpsdr-install.pdf differ diff --git a/release/pihpsdr.tar b/release/pihpsdr.tar index 6c0eb03..971c69a 100644 Binary files a/release/pihpsdr.tar and b/release/pihpsdr.tar differ diff --git a/release/pihpsdr/pihpsdr b/release/pihpsdr/pihpsdr index 843c420..1124f08 100755 Binary files a/release/pihpsdr/pihpsdr and b/release/pihpsdr/pihpsdr differ diff --git a/toolbar.c b/toolbar.c index 6793b33..6f4209e 100644 --- a/toolbar.c +++ b/toolbar.c @@ -756,23 +756,23 @@ void lock_cb(GtkWidget *widget, gpointer data) { } void mox_cb(GtkWidget *widget, gpointer data) { +fprintf(stderr,"mox_cb\n"); if(getTune()==1) { setTune(0); } - if(canTransmit() || tx_out_of_band) { - setMox(getMox()==0?1:0); - vfo_update(NULL); + if(getMox()==1) { + setMox(0); + } else if(canTransmit() || tx_out_of_band) { + setMox(1); } + vfo_update(NULL); } int ptt_update(void *data) { - BANDSTACK_ENTRY *entry; - entry=bandstack_entry_get_current(); +fprintf(stderr,"ptt_update\n"); int ptt=(int)data; - if((entry->mode==modeCWL || entry->mode==modeCWU) && cw_keyer_internal==1) { - //if(ptt!=getMox()) { - // mox_cb(NULL,NULL); - //} + if((mode==modeCWL || mode==modeCWU) && cw_keyer_internal==1) { + // just ignore it } else { mox_cb(NULL,NULL); } @@ -780,13 +780,16 @@ int ptt_update(void *data) { } void tune_cb(GtkWidget *widget, gpointer data) { +fprintf(stderr,"tune_cb\n"); if(getMox()==1) { setMox(0); } - if(canTransmit() || tx_out_of_band) { - setTune(getTune()==0?1:0); - vfo_update(NULL); + if(getTune()==1) { + setTune(0); + } else if(canTransmit() || tx_out_of_band) { + setTune(1); } + vfo_update(NULL); } void sim_band_cb(GtkWidget *widget, gpointer data) { @@ -972,16 +975,16 @@ void update_toolbar() { 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_agc),"AGC 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_agc),"AGC ^"); 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"); } } @@ -1026,47 +1029,47 @@ GtkWidget *toolbar_init(int my_width, int my_height, GtkWidget* parent) { 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,0,0,4,1); + 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,4,0,4,1); + 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,8,0,4,1); + 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,12,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,16,0,4,1); + 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,24,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,28,0,4,1); + gtk_grid_attach(GTK_GRID(toolbar),sim_function,28,0,4,1); } else { GtkWidget *band=gtk_button_new_with_label("Band");