#SX1509_INCLUDE=sx1509
# uncomment the line to below include support local CW keyer
-LOCALCW_INCLUDE=LOCALCW
+#LOCALCW_INCLUDE=LOCALCW
#uncomment the line below for the platform being compiled on
UNAME_N=raspberrypi
wdsp_init.c \
button_text.c \
vox.c \
-update.c
+update.c \
+memory.c
HEADERS= \
wdsp_init.h \
button_text.h \
vox.h \
-update.h
+update.h \
+memory.h
OBJS= \
wdsp_init.o \
button_text.o \
vox.o \
-update.o
+update.o \
+memory.o
all: prebuild $(PROGRAM) $(HEADERS) $(LIMESDR_HEADERS) $(FREEDV_HEADERS) $(LOCALCW_HEADERS) $(GPIO_HEADERS) $(PSK_HEADERS) $(SOURCES) $(LIMESDR_SOURCES) $(FREEDV_SOURCES) $(GPIO_SOURCES) $(PSK_SOURCES)
install:
cp pihpsdr ../pihpsdr
cp pihpsdr ./release/pihpsdr
+ cd release; echo $(GIT_VERSION) > pihpsdr/latest
cd release; tar cvf pihpsdr_$(GIT_VERSION).tar pihpsdr
cd release; tar cvf pihpsdr.tar pihpsdr
- cd release; echo $(GIT_VERSION) > pihpsdr/latest
printf("Setting of hwparams failed: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
+
if ((err = set_swparams(handle, swparams)) < 0) {
printf("Setting of swparams failed: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
free(areas);
free(samples);
snd_pcm_close(handle);
+
return 0;
}
gtk_widget_show(function);
gtk_grid_attach(GTK_GRID(grid),function,2,10,1,1);
+#ifdef LOCALCW
GtkWidget *cwl_label=gtk_label_new("CWL");
gtk_widget_show(cwl_label);
gtk_grid_attach(GTK_GRID(grid),cwl_label,0,11,1,1);
gtk_spin_button_set_value (GTK_SPIN_BUTTON(cwr),CWR_BUTTON);
gtk_widget_show(cwr);
gtk_grid_attach(GTK_GRID(grid),cwr,2,12,1,1);
-
+#endif
gtk_container_add(GTK_CONTAINER(content),grid);
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));
+#ifdef LOCALCW
CWL_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(cwl));
CWR_BUTTON=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(cwr));
+#endif
gtk_widget_destroy(dialog);
gtk_grid_attach(GTK_GRID(grid),cw_keyer_weight_b,1,9,1,1);
g_signal_connect(cw_keyer_weight_b,"value_changed",G_CALLBACK(cw_keyer_weight_value_changed_cb),NULL);
+#ifdef LOCALCW
GtkWidget *cw_keyer_internal_b=gtk_check_button_new_with_label("CW Internal");
//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_active_level_b);
gtk_grid_attach(GTK_GRID(grid),cw_active_level_b,1,10,1,1);
g_signal_connect(cw_active_level_b,"toggled",G_CALLBACK(cw_active_level_cb),NULL);
+#endif
gtk_container_add(GTK_CONTAINER(content),grid);
static void cwAlert(int gpio, int level, uint32_t tick) {
fprintf(stderr,"cwAlert: gpio=%d level=%d internal=%d\n",gpio,level,cw_keyer_internal);
- if (cw_keyer_internal == 0)
+#ifdef LOCALCW
+ if (cw_keyer_internal == 0 && (mode==modeCWL || mode==modeCWU))
keyer_event(gpio, cw_active_level == 0 ? level : (level==0));
+#endif
}
static void vfoEncoderPulse(int gpio, int level, unsigned int tick) {
}
static int band_pressed(void *data) {
- sim_band_cb(NULL,NULL);
+ sim_band_pressed_cb(NULL,NULL);
+ return 0;
+}
+
+static int band_released(void *data) {
+ sim_band_released_cb(NULL,NULL);
return 0;
}
static int bandstack_pressed(void *data) {
- sim_bandstack_cb(NULL,NULL);
+ sim_bandstack_pressed_cb(NULL,NULL);
+ return 0;
+}
+
+static int bandstack_released(void *data) {
+ sim_bandstack_released_cb(NULL,NULL);
return 0;
}
previous_band_button=band_button;
if(band_button) {
g_idle_add(band_pressed,(gpointer)NULL);
+ } else {
+ g_idle_add(band_released,(gpointer)NULL);
}
}
previous_bandstack_button=bandstack_button;
if(bandstack_button) {
g_idle_add(bandstack_pressed,(gpointer)NULL);
+ } else {
+ g_idle_add(bandstack_released,(gpointer)NULL);
}
}
#define DISPLAY_INCREMENT (display_height/32)
#define VFO_HEIGHT (DISPLAY_INCREMENT*4)
//#define VFO_HEIGHT (DISPLAY_INCREMENT*8)
-#define VFO_WIDTH ((display_width/32)*16)
+#define VFO_WIDTH ((display_width/32)*21)
#define MENU_HEIGHT VFO_HEIGHT
//#define MENU_HEIGHT (DISPLAY_INCREMENT*4)
-#define MENU_WIDTH ((display_width/32)*8)
-#define RIT_WIDTH ((MENU_WIDTH/3)*2)
+#define MENU_WIDTH ((display_width/32)*3)
+//#define RIT_WIDTH ((MENU_WIDTH/3)*2)
#define METER_HEIGHT VFO_HEIGHT
//#define METER_HEIGHT (DISPLAY_INCREMENT*4)
#define METER_WIDTH ((display_width/32)*8)
- rit_control = rit_init(RIT_WIDTH,MENU_HEIGHT,window);
- gtk_fixed_put(GTK_FIXED(fixed),rit_control,VFO_WIDTH,y);
+ //rit_control = rit_init(RIT_WIDTH,MENU_HEIGHT,window);
+ //gtk_fixed_put(GTK_FIXED(fixed),rit_control,VFO_WIDTH,y);
GtkWidget *minimize_b=gtk_button_new_with_label("Hide");
gtk_widget_override_font(minimize_b, pango_font_description_from_string("FreeMono Bold 10"));
- gtk_widget_set_size_request (minimize_b, MENU_WIDTH-RIT_WIDTH, MENU_HEIGHT/2);
+ gtk_widget_set_size_request (minimize_b, MENU_WIDTH, MENU_HEIGHT/2);
g_signal_connect (minimize_b, "button-press-event", G_CALLBACK(minimize_cb), NULL);
gtk_widget_show(minimize_b);
- gtk_fixed_put(GTK_FIXED(fixed),minimize_b,VFO_WIDTH+((MENU_WIDTH/3)*2),y);
+ gtk_fixed_put(GTK_FIXED(fixed),minimize_b,VFO_WIDTH,y);
//menu = menu_init(MENU_WIDTH,MENU_HEIGHT,window);
- menu = new_menu_init(MENU_WIDTH-RIT_WIDTH,MENU_HEIGHT/2,window);
- gtk_fixed_put(GTK_FIXED(fixed),menu,VFO_WIDTH+((MENU_WIDTH/3)*2),y+(MENU_HEIGHT/2));
+ menu = new_menu_init(MENU_WIDTH,MENU_HEIGHT/2,window);
+ gtk_fixed_put(GTK_FIXED(fixed),menu,VFO_WIDTH,y+(MENU_HEIGHT/2));
meter = meter_init(METER_WIDTH,METER_HEIGHT,window);
gtk_fixed_put(GTK_FIXED(fixed),meter,VFO_WIDTH+MENU_WIDTH,y);
GtkWidget *frequency_b=gtk_button_new_with_label("Frequency");
g_signal_connect (frequency_b, "button-press-event", G_CALLBACK(freqent_cb), NULL);
gtk_grid_attach(GTK_GRID(grid),frequency_b,3,3,1,1);
-/*
- GtkWidget *diversity_b=gtk_button_new_with_label("Diversity");
- g_signal_connect (diversity_b, "button-press-event", G_CALLBACK(diversity_cb), NULL);
- gtk_grid_attach(GTK_GRID(grid),diversity_b,4,3,1,1);
-*/
+
+ if(RECEIVERS==2) {
+ GtkWidget *diversity_b=gtk_button_new_with_label("Diversity");
+ g_signal_connect (diversity_b, "button-press-event", G_CALLBACK(diversity_cb), NULL);
+ gtk_grid_attach(GTK_GRID(grid),diversity_b,4,3,1,1);
+ }
+
GtkWidget *band_b=gtk_button_new_with_label("Band");
g_signal_connect (band_b, "button-press-event", G_CALLBACK(band_cb), NULL);
gtk_grid_attach(GTK_GRID(grid),band_b,0,4,1,1);
g_signal_connect (agc_b, "button-press-event", G_CALLBACK(agc_cb), NULL);
gtk_grid_attach(GTK_GRID(grid),agc_b,5,4,1,1);
-/*
GtkWidget *test_b=gtk_button_new_with_label("Test");
g_signal_connect (test_b, "button-press-event", G_CALLBACK(test_cb), NULL);
gtk_grid_attach(GTK_GRID(grid),test_b,0,5,1,1);
-*/
+
gtk_container_add(GTK_CONTAINER(content),grid);
gtk_widget_show_all(dialog);
if(value) cw_keyer_weight=atoi(value);
value=getProperty("cw_keyer_spacing");
if(value) cw_keyer_spacing=atoi(value);
+#ifdef LOCALCW
value=getProperty("cw_keyer_internal");
if(value) cw_keyer_internal=atoi(value);
+#endif
value=getProperty("cw_active_level");
if(value) cw_active_level=atoi(value);
value=getProperty("cw_keyer_sidetone_volume");
static GdkRGBA white;
static GdkRGBA gray;
+static gint rit_timer;
+
static void set_button_text_color(GtkWidget *widget,char *color) {
GtkStyleContext *style_context;
GtkCssProvider *provider = gtk_css_provider_new ();
void update_toolbar_labels() {
if(toolbar_dialog_buttons) {
- gtk_button_set_label(GTK_BUTTON(sim_band),"Band");
- gtk_button_set_label(GTK_BUTTON(sim_bandstack),"BStack");
- gtk_button_set_label(GTK_BUTTON(sim_mode),"Mode");
- gtk_button_set_label(GTK_BUTTON(sim_filter),"Filter");
- gtk_button_set_label(GTK_BUTTON(sim_noise),"Noise");
- gtk_button_set_label(GTK_BUTTON(sim_agc),"AGC");
if(function) {
- gtk_button_set_label(GTK_BUTTON(sim_mox),"Tune");
} else {
gtk_button_set_label(GTK_BUTTON(sim_mox),"Mox");
+ gtk_button_set_label(GTK_BUTTON(sim_band),"Band");
+ gtk_button_set_label(GTK_BUTTON(sim_bandstack),"BStack");
+ gtk_button_set_label(GTK_BUTTON(sim_mode),"Mode");
+ gtk_button_set_label(GTK_BUTTON(sim_filter),"Filter");
+ gtk_button_set_label(GTK_BUTTON(sim_noise),"Noise");
+ gtk_button_set_label(GTK_BUTTON(sim_agc),"AGC");
+ }
+ if(function) {
+ gtk_button_set_label(GTK_BUTTON(sim_mox),"Tune");
+ gtk_button_set_label(GTK_BUTTON(sim_band),"RIT+");
+ gtk_button_set_label(GTK_BUTTON(sim_bandstack),"RIT-");
+ gtk_button_set_label(GTK_BUTTON(sim_mode),"CTUN");
+ gtk_button_set_label(GTK_BUTTON(sim_filter),"Filter");
+ gtk_button_set_label(GTK_BUTTON(sim_noise),"Noise");
+ gtk_button_set_label(GTK_BUTTON(sim_agc),"AGC");
+ } else {
}
} else {
if(function) {
return 0;
}
-void tune_cb(GtkWidget *widget, gpointer data) {
+static void tune_cb(GtkWidget *widget, gpointer data) {
if(getMox()==1) {
setMox(0);
}
vfo_update(NULL);
}
-void sim_band_cb(GtkWidget *widget, gpointer data) {
- BAND* band;
- BANDSTACK_ENTRY *entry;
- if(toolbar_dialog_buttons) {
- band_cb(widget,data);
+static gboolean rit_timer_cb(gpointer data) {
+ if((int)data==1) {
+ rit+=rit_increment;
} else {
- int b=band_get_current();
- if(function) {
- b--;
- if(b<0) {
- b=BANDS-1;
- }
+ rit-=rit_increment;
+ }
+ if(rit>1000) rit=1000;
+ if(rit<-1000) rit=-1000;
+ vfo_update(NULL);
+ return TRUE;
+}
+
+void sim_band_pressed_cb(GtkWidget *widget, gpointer data) {
+ if(function) {
+ rit+=rit_increment;
+ if(rit>1000) rit=1000;
+ vfo_update(NULL);
+ rit_timer=g_timeout_add(200,rit_timer_cb,(gpointer)1);
+ } else {
+ BAND* band;
+ BANDSTACK_ENTRY *entry;
+ if(toolbar_dialog_buttons) {
+ band_cb(widget,data);
+ } else {
+ int b=band_get_current();
+ if(function) {
+ b--;
+ if(b<0) {
+ b=BANDS-1;
+ }
#ifdef LIMESDR
- if(protocol!=LIMESDR_PROTOCOL) {
- if(b==band3400) {
- b=band6;
+ if(protocol!=LIMESDR_PROTOCOL) {
+ if(b==band3400) {
+ b=band6;
+ }
}
- }
#endif
- } else {
- b++;
- if(b>=BANDS) {
- b=0;
- }
+ } else {
+ b++;
+ if(b>=BANDS) {
+ b=0;
+ }
#ifdef LIMESDR
- if(protocol!=LIMESDR_PROTOCOL) {
- if(b==band70) {
- b=bandGen;
+ if(protocol!=LIMESDR_PROTOCOL) {
+ if(b==band70) {
+ b=bandGen;
+ }
}
- }
#endif
+ }
+ band=band_set_current(b);
+ entry=bandstack_entry_get_current();
+
+ setFrequency(entry->frequencyA);
+ setMode(entry->mode);
+ FILTER* band_filters=filters[entry->mode];
+ FILTER* band_filter=&band_filters[entry->filter];
+ setFilter(band_filter->low,band_filter->high);
+
+ band=band_get_current_band();
+ set_alex_rx_antenna(band->alexRxAntenna);
+ set_alex_tx_antenna(band->alexTxAntenna);
+ set_alex_attenuation(band->alexAttenuation);
+ vfo_update(NULL);
+
+ calcDriveLevel();
+ calcTuneDriveLevel();
}
- 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);
+ }
+}
- calcDriveLevel();
- calcTuneDriveLevel();
+void sim_band_released_cb(GtkWidget *widget, gpointer data) {
+ if(function) {
+ g_source_remove(rit_timer);
}
}
-void sim_bandstack_cb(GtkWidget *widget, gpointer data) {
- BANDSTACK_ENTRY *entry;
- if(toolbar_dialog_buttons) {
- bandstack_cb(widget,data);
+void sim_bandstack_pressed_cb(GtkWidget *widget, gpointer data) {
+ if(function) {
+ rit-=rit_increment;
+ if(rit<-1000) rit=-1000;
+ vfo_update(NULL);
+ rit_timer=g_timeout_add(200,rit_timer_cb,(gpointer)-1);
} else {
- if(function) {
- entry=bandstack_entry_previous();
+ BANDSTACK_ENTRY *entry;
+ if(toolbar_dialog_buttons) {
+ bandstack_cb(widget,data);
} else {
- entry=bandstack_entry_next();
+ if(function) {
+ entry=bandstack_entry_previous();
+ } else {
+ entry=bandstack_entry_next();
+ }
+ setFrequency(entry->frequencyA);
+ setMode(entry->mode);
+ FILTER* band_filters=filters[entry->mode];
+ FILTER* band_filter=&band_filters[entry->filter];
+ setFilter(band_filter->low,band_filter->high);
+ vfo_update(NULL);
}
- setFrequency(entry->frequencyA);
- setMode(entry->mode);
- FILTER* band_filters=filters[entry->mode];
- FILTER* band_filter=&band_filters[entry->filter];
- setFilter(band_filter->low,band_filter->high);
- vfo_update(NULL);
}
}
-void sim_mode_cb(GtkWidget *widget, gpointer data) {
- BAND* band;
- BANDSTACK_ENTRY *entry;
+void sim_bandstack_released_cb(GtkWidget *widget, gpointer data) {
+ if(function) {
+ g_source_remove(rit_timer);
+ }
+}
- if(toolbar_dialog_buttons) {
- mode_cb(widget,data);
+
+void sim_mode_cb(GtkWidget *widget, gpointer data) {
+ if(function) {
+ ctun=ctun==1?0:1;
+ if(!ctun) {
+ ddsOffset=0;
+ wdsp_set_offset(ddsOffset);
+ }
+ vfo_update(NULL);
} else {
- band=band_get_current_band();
- entry=bandstack_entry_get_current();
- if(function) {
- entry->mode--;
- if(entry->mode<0) {
- entry->mode=MODES-1;
- }
+ BAND* band;
+ BANDSTACK_ENTRY *entry;
+
+ if(toolbar_dialog_buttons) {
+ mode_cb(widget,data);
} else {
- entry->mode++;
- if(entry->mode>=MODES) {
- entry->mode=0;
+ band=band_get_current_band();
+ entry=bandstack_entry_get_current();
+ if(function) {
+ entry->mode--;
+ if(entry->mode<0) {
+ entry->mode=MODES-1;
+ }
+ } else {
+ entry->mode++;
+ if(entry->mode>=MODES) {
+ entry->mode=0;
+ }
}
- }
- setMode(entry->mode);
+ setMode(entry->mode);
- FILTER* band_filters=filters[entry->mode];
- FILTER* band_filter=&band_filters[entry->filter];
- setFilter(band_filter->low,band_filter->high);
+ FILTER* band_filters=filters[entry->mode];
+ FILTER* band_filter=&band_filters[entry->filter];
+ setFilter(band_filter->low,band_filter->high);
- vfo_update(NULL);
+ vfo_update(NULL);
+ }
}
}
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);
+ g_signal_connect(G_OBJECT(sim_band),"pressed",G_CALLBACK(sim_band_pressed_cb),NULL);
+ g_signal_connect(G_OBJECT(sim_band),"released",G_CALLBACK(sim_band_released_cb),NULL);
gtk_grid_attach(GTK_GRID(toolbar),sim_band,4,0,4,1);
sim_bandstack=gtk_button_new_with_label("BStack ^");
gtk_widget_set_size_request (sim_bandstack, button_width, 0);
//gtk_widget_override_font(sim_bandstack, pango_font_description_from_string("Arial 16"));
- g_signal_connect(G_OBJECT(sim_bandstack),"clicked",G_CALLBACK(sim_bandstack_cb),NULL);
+ g_signal_connect(G_OBJECT(sim_bandstack),"pressed",G_CALLBACK(sim_bandstack_pressed_cb),NULL);
+ g_signal_connect(G_OBJECT(sim_bandstack),"released",G_CALLBACK(sim_bandstack_released_cb),NULL);
gtk_grid_attach(GTK_GRID(toolbar),sim_bandstack,8,0,4,1);
sim_mode=gtk_button_new_with_label("Mode ^");
void sim_mox_cb(GtkWidget *widget, gpointer data);
-void sim_band_cb(GtkWidget *widget, gpointer data);
-void sim_bandstack_cb(GtkWidget *widget, gpointer data);
+void sim_band_pressed_cb(GtkWidget *widget, gpointer data);
+void sim_band_released_cb(GtkWidget *widget, gpointer data);
+void sim_bandstack_pressed_cb(GtkWidget *widget, gpointer data);
+void sim_bandstack_released_cb(GtkWidget *widget, gpointer data);
void sim_mode_cb(GtkWidget *widget, gpointer data);
void sim_filter_cb(GtkWidget *widget, gpointer data);
void sim_noise_cb(GtkWidget *widget, gpointer data);
int load_update() {
char command[1024];
- sprintf(command,"/usr/sbin/wget -N https://github.com/g0orx/pihpsdr/raw/master/release/pihpsdr_%s.tar",new_version);
+ sprintf(command,"cd ..; /usr/bin/wget -N https://github.com/g0orx/pihpsdr/raw/master/release/pihpsdr_%s.tar",new_version);
fprintf(stderr,"load_update: %s\n",command);
int rc=system(command);
break;
}
+
+ cairo_move_to(cr, 400, 50);
+ if(ctun) {
+ cairo_show_text(cr, "CTUN");
+ }
+
cairo_destroy (cr);
gtk_widget_queue_draw (vfo);
} else {