]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
fixed tune when in CW mode. Added FreeDV mode.
authorJohn Melton - G0ORX/N6LYT <john.d.melton@googlemail.com>
Tue, 5 Jul 2016 10:30:10 +0000 (10:30 +0000)
committerJohn Melton - G0ORX/N6LYT <john.d.melton@googlemail.com>
Tue, 5 Jul 2016 10:30:10 +0000 (10:30 +0000)
21 files changed:
Makefile
configure.c [new file with mode: 0644]
configure.h [new file with mode: 0644]
freedv.c
gpio.c
gpio.h
gpio_mraa.c [new file with mode: 0644]
main.c
menu.c
new_protocol.c
old_protocol.c
panadapter.c
pihpsdr
radio.c
release/documentation/pihpsdr-build.odt
release/documentation/pihpsdr-build.pdf
release/documentation/pihpsdr-install.odt
release/documentation/pihpsdr-install.pdf
release/pihpsdr.tar
release/pihpsdr/pihpsdr
toolbar.c

index cc35a17cb80307f4b02b8d32cef12d4561b5fd8b..feb2e7a5ede45533bcaaa9e7c418e966ac9068da 100644 (file)
--- 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 (file)
index 0000000..021a6bb
--- /dev/null
@@ -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 <gtk/gtk.h>
+#include <gdk/gdk.h>
+#include <math.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <semaphore.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#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 (file)
index 0000000..1efad1a
--- /dev/null
@@ -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);
index ccdf47845cf8155b259dc33b858efbc438c77c25..7536a61e8284faf08d914ba1bb7b012fc68a7b49 100644 (file)
--- 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 6c2b9b1d35a82e45d57f8426302d0816925a86ec..4367870605cc71fa69aa6790eae451809e100d1e 100644 (file)
--- a/gpio.c
+++ b/gpio.c
 
 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 6d48ec29e6c3156afd7384094eaef6e99614b959..d94de81d5f1bda63fb90a86bd8b780231368c623 100644 (file)
--- a/gpio.h
+++ b/gpio.h
 *
 */
 
-#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 (file)
index 0000000..e671e43
--- /dev/null
@@ -0,0 +1,1167 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <fcntl.h>
+#include <poll.h>
+#include <sched.h>
+#include <pthread.h>
+#include <mraa.h>
+
+#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 && pos<vfo_encoder_divisor) {
+        pos=0;
+    }
+    pos=pos/vfo_encoder_divisor;
+    vfoEncoderPos=vfoEncoderPos-(pos*vfo_encoder_divisor);
+  } else {
+    vfoEncoderPos=0;
+  }
+  return pos;
+}
+
+int af_encoder_get_pos() {
+    int pos=afEncoderPos;
+    afEncoderPos=0;
+    return pos;
+}
+
+//int af_function_get_state() {
+//    return afFunction;
+//}
+
+int rf_encoder_get_pos() {
+    int pos=rfEncoderPos;
+    rfEncoderPos=0;
+    return pos;
+}
+
+int agc_encoder_get_pos() {
+    int pos=agcEncoderPos;
+    agcEncoderPos=0;
+    return pos;
+}
+
+//int rf_function_get_state() {
+//    return rfFunction;
+//}
+
+int function_get_state() {
+    return function_state;
+}
+
+int band_get_state() {
+    return band_state;
+}
+
+int bandstack_get_state() {
+    return bandstack_state;
+}
+
+int mode_get_state() {
+    return mode_state;
+}
+
+int filter_get_state() {
+    return filter_state;
+}
+
+int noise_get_state() {
+    return noise_state;
+}
+
+int agc_get_state() {
+    return agc_state;
+}
+
+int mox_get_state() {
+    return mox_state;
+}
+
+int lock_get_state() {
+    return lock_state;
+}
+
+
+static int vfo_encoder_changed(void *data) {
+  if(!locked) {
+    int pos=*(int*)data;
+    BANDSTACK_ENTRY* entry=bandstack_entry_get_current();
+    //entry->frequencyA=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 66ac9667d1ff512a80092b5b31f6ad4a56fa5ecf..39c735085863af270d2a57caa13353d9a6618e93 100644 (file)
--- 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 c91bbfe9695a5f98ccf06fe1e20faf69a7a59717..09dc54ddde2a165337069e9ab3f4b6e25f97c62f 100644 (file)
--- 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"));
index 97d40e89d967d131ccc7cc9ff681796b164f6392..465c734a18e4e05603ac39068e7708aabbcb62e4 100644 (file)
@@ -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);
index 88a32398601529120a67160b0c7f91c8d71dadf5..8ded04d9678feb4b0d29eb16f00d511ffd666e7b 100644 (file)
@@ -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;
     }
   }
 
index fbe109b894ac11a0b70a5fea1009c2945702a310..3b26efd1219fce59cfe9b22ce4898dc1031a7792 100644 (file)
@@ -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 843c4207a79ab135e61d897731f9ffc13cf8c427..1124f087fce2ca04ac533c6224ceaf4bc1ad11ff 100755 (executable)
Binary files a/pihpsdr and b/pihpsdr differ
diff --git a/radio.c b/radio.c
index 5570dc35c0ba47ca710e7f8e12ceeb4cf2881ae9..131d7115495584bc1a8753b611113f317fbce283 100644 (file)
--- 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;
 }
 
index 7993d9481fa7629a4a58874f1d42fde89910dbee..a372a554b909ae09c4c7b1938c9b302e12fa433d 100644 (file)
Binary files a/release/documentation/pihpsdr-build.odt and b/release/documentation/pihpsdr-build.odt differ
index a09a38463c3e47f011afe9dfff008771d83f0e7b..95d1e4b383b3050d115fc604740800d93f8a5734 100644 (file)
Binary files a/release/documentation/pihpsdr-build.pdf and b/release/documentation/pihpsdr-build.pdf differ
index 6c0e87e995d5514565e70b806a4956a5923423c0..ba1e9e80e73f46bcaf54b59b974f6eda5780c9ce 100644 (file)
Binary files a/release/documentation/pihpsdr-install.odt and b/release/documentation/pihpsdr-install.odt differ
index c40ceb75f4249d3a3b9312af02033a655f95012c..8272a1765dc0bfe02292682a097f9f3190d3fb51 100644 (file)
Binary files a/release/documentation/pihpsdr-install.pdf and b/release/documentation/pihpsdr-install.pdf differ
index 6c0eb0303d2bb81b75eaa68e2f6bba85e8734a01..971c69aba4432a2d93803e5c362f763691c10925 100644 (file)
Binary files a/release/pihpsdr.tar and b/release/pihpsdr.tar differ
index 843c4207a79ab135e61d897731f9ffc13cf8c427..1124f087fce2ca04ac533c6224ceaf4bc1ad11ff 100755 (executable)
Binary files a/release/pihpsdr/pihpsdr and b/release/pihpsdr/pihpsdr differ
index 6793b331a3f47fc69b76e40f7ab46bd864840d75..6f4209e7e24d28af4f0f7243f8b879171ed2cab4 100644 (file)
--- 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");