2011-07-07 14:09:57 +00:00
|
|
|
#include <stdlib.h>
|
2011-08-20 11:49:29 +00:00
|
|
|
#include <stdbool.h>
|
2011-07-07 14:09:57 +00:00
|
|
|
#include <gtk/gtk.h>
|
2011-07-29 20:09:42 +00:00
|
|
|
#include <alsa/asoundlib.h>
|
2011-08-15 21:03:50 +00:00
|
|
|
#include <math.h>
|
2012-12-25 20:43:26 +00:00
|
|
|
|
2011-08-16 21:29:38 +00:00
|
|
|
#include <fftw3.h>
|
2011-07-07 14:09:57 +00:00
|
|
|
|
2011-08-02 23:42:56 +00:00
|
|
|
#include "common.h"
|
2011-07-07 14:09:57 +00:00
|
|
|
|
|
|
|
void createGUI() {
|
|
|
|
|
2011-08-02 23:42:56 +00:00
|
|
|
GtkBuilder *builder;
|
|
|
|
|
|
|
|
builder = gtk_builder_new();
|
|
|
|
gtk_builder_add_from_file(builder, "slowrx.ui", NULL);
|
2013-01-13 19:18:10 +00:00
|
|
|
gtk_builder_add_from_file(builder, "window_about.ui", NULL);
|
2013-01-09 19:46:39 +00:00
|
|
|
|
2013-01-13 19:48:20 +00:00
|
|
|
gui.button_abort = GTK_WIDGET(gtk_builder_get_object(builder,"button_abort"));
|
2013-01-13 19:18:10 +00:00
|
|
|
gui.button_browse = GTK_WIDGET(gtk_builder_get_object(builder,"button_browse"));
|
2013-01-13 19:48:20 +00:00
|
|
|
gui.button_clear = GTK_WIDGET(gtk_builder_get_object(builder,"button_clear"));
|
|
|
|
gui.button_start = GTK_WIDGET(gtk_builder_get_object(builder,"button_start"));
|
2013-01-13 19:18:10 +00:00
|
|
|
gui.combo_card = GTK_WIDGET(gtk_builder_get_object(builder,"combo_card"));
|
|
|
|
gui.combo_mode = GTK_WIDGET(gtk_builder_get_object(builder,"combo_mode"));
|
|
|
|
gui.entry_picdir = GTK_WIDGET(gtk_builder_get_object(builder,"entry_picdir"));
|
2013-01-14 21:21:15 +00:00
|
|
|
gui.eventbox_img = GTK_WIDGET(gtk_builder_get_object(builder,"eventbox_img"));
|
2013-01-13 19:48:20 +00:00
|
|
|
gui.frame_manual = GTK_WIDGET(gtk_builder_get_object(builder,"frame_manual"));
|
2013-01-14 21:21:15 +00:00
|
|
|
gui.frame_slant = GTK_WIDGET(gtk_builder_get_object(builder,"frame_slant"));
|
2013-01-13 19:18:10 +00:00
|
|
|
gui.grid_vu = GTK_WIDGET(gtk_builder_get_object(builder,"grid_vu"));
|
2013-01-13 19:48:20 +00:00
|
|
|
gui.iconview = GTK_WIDGET(gtk_builder_get_object(builder,"SavedIconView"));
|
2013-01-13 19:18:10 +00:00
|
|
|
gui.image_devstatus = GTK_WIDGET(gtk_builder_get_object(builder,"image_devstatus"));
|
2013-01-13 19:48:20 +00:00
|
|
|
gui.image_pwr = GTK_WIDGET(gtk_builder_get_object(builder,"image_pwr"));
|
2013-01-13 19:18:10 +00:00
|
|
|
gui.image_rx = GTK_WIDGET(gtk_builder_get_object(builder,"image_rx"));
|
2013-01-13 19:48:20 +00:00
|
|
|
gui.image_snr = GTK_WIDGET(gtk_builder_get_object(builder,"image_snr"));
|
|
|
|
gui.label_fskid = GTK_WIDGET(gtk_builder_get_object(builder,"label_fskid"));
|
2013-01-13 19:18:10 +00:00
|
|
|
gui.label_lastmode = GTK_WIDGET(gtk_builder_get_object(builder,"label_lastmode"));
|
|
|
|
gui.label_utc = GTK_WIDGET(gtk_builder_get_object(builder,"label_utc"));
|
|
|
|
gui.menuitem_quit = GTK_WIDGET(gtk_builder_get_object(builder,"menuitem_quit"));
|
|
|
|
gui.menuitem_about = GTK_WIDGET(gtk_builder_get_object(builder,"menuitem_about"));
|
2013-01-13 19:48:20 +00:00
|
|
|
gui.spin_shift = GTK_WIDGET(gtk_builder_get_object(builder,"spin_shift"));
|
2013-01-13 19:18:10 +00:00
|
|
|
gui.statusbar = GTK_WIDGET(gtk_builder_get_object(builder,"statusbar"));
|
2013-01-13 19:48:20 +00:00
|
|
|
gui.tog_adapt = GTK_WIDGET(gtk_builder_get_object(builder,"tog_adapt"));
|
|
|
|
gui.tog_fsk = GTK_WIDGET(gtk_builder_get_object(builder,"tog_fsk"));
|
|
|
|
gui.tog_rx = GTK_WIDGET(gtk_builder_get_object(builder,"tog_rx"));
|
|
|
|
gui.tog_save = GTK_WIDGET(gtk_builder_get_object(builder,"tog_save"));
|
|
|
|
gui.tog_setedge = GTK_WIDGET(gtk_builder_get_object(builder,"tog_setedge"));
|
|
|
|
gui.tog_slant = GTK_WIDGET(gtk_builder_get_object(builder,"tog_slant"));
|
2013-01-13 19:18:10 +00:00
|
|
|
gui.window_about = GTK_WIDGET(gtk_builder_get_object(builder,"window_about"));
|
|
|
|
gui.window_main = GTK_WIDGET(gtk_builder_get_object(builder,"window_main"));
|
|
|
|
|
2013-01-13 19:48:20 +00:00
|
|
|
g_signal_connect (gui.button_abort, "clicked", G_CALLBACK(evt_AbortRx), NULL);
|
|
|
|
g_signal_connect (gui.button_browse, "clicked", G_CALLBACK(evt_chooseDir), NULL);
|
|
|
|
g_signal_connect (gui.button_clear, "clicked", G_CALLBACK(evt_clearPix), NULL);
|
|
|
|
g_signal_connect (gui.button_start, "clicked", G_CALLBACK(evt_ManualStart), NULL);
|
|
|
|
g_signal_connect (gui.combo_card, "changed", G_CALLBACK(evt_changeDevices), NULL);
|
2013-01-14 21:21:15 +00:00
|
|
|
g_signal_connect (gui.eventbox_img, "button-press-event",G_CALLBACK(evt_clickimg), NULL);
|
2013-01-13 19:48:20 +00:00
|
|
|
g_signal_connect (gui.menuitem_quit, "activate", G_CALLBACK(evt_deletewindow), NULL);
|
|
|
|
g_signal_connect (gui.menuitem_about,"activate", G_CALLBACK(evt_show_about), NULL);
|
|
|
|
g_signal_connect_swapped(gui.tog_adapt, "toggled", G_CALLBACK(evt_GetAdaptive), NULL);
|
|
|
|
g_signal_connect (gui.window_main, "delete-event", G_CALLBACK(evt_deletewindow), NULL);
|
2013-01-13 19:18:10 +00:00
|
|
|
|
|
|
|
savedstore = GTK_LIST_STORE(gtk_icon_view_get_model(GTK_ICON_VIEW(gui.iconview)));
|
2011-08-13 12:26:49 +00:00
|
|
|
|
2013-01-13 19:52:31 +00:00
|
|
|
pixbuf_rx = gdk_pixbuf_new (GDK_COLORSPACE_RGB, false, 8, 320, 256);
|
|
|
|
gdk_pixbuf_fill(pixbuf_rx, 0x000000ff);
|
|
|
|
pixbuf_disp = gdk_pixbuf_scale_simple (pixbuf_rx, 500, 400, GDK_INTERP_BILINEAR);
|
|
|
|
gtk_image_set_from_pixbuf(GTK_IMAGE(gui.image_rx), pixbuf_disp);
|
2011-08-02 23:42:56 +00:00
|
|
|
|
2013-01-13 19:52:31 +00:00
|
|
|
pixbuf_PWR = gdk_pixbuf_new (GDK_COLORSPACE_RGB, false, 8, 100, 20);
|
|
|
|
pixbuf_SNR = gdk_pixbuf_new (GDK_COLORSPACE_RGB, false, 8, 100, 20);
|
2011-07-07 14:09:57 +00:00
|
|
|
|
2013-01-13 19:18:10 +00:00
|
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(gui.combo_mode), 0);
|
2013-01-09 21:38:30 +00:00
|
|
|
|
2013-01-17 06:44:38 +00:00
|
|
|
if (g_key_file_get_string(config,"slowrx","rxdir",NULL) != NULL) {
|
|
|
|
gtk_entry_set_text(GTK_ENTRY(gui.entry_picdir),g_key_file_get_string(config,"slowrx","rxdir",NULL));
|
2013-01-10 17:30:28 +00:00
|
|
|
} else {
|
2013-01-17 06:44:38 +00:00
|
|
|
g_key_file_set_string(config,"slowrx","rxdir",g_get_home_dir());
|
|
|
|
gtk_entry_set_text(GTK_ENTRY(gui.entry_picdir),g_key_file_get_string(config,"slowrx","rxdir",NULL));
|
2013-01-10 17:30:28 +00:00
|
|
|
}
|
2013-01-09 21:38:30 +00:00
|
|
|
|
2011-08-10 20:43:17 +00:00
|
|
|
setVU(0, -100);
|
2011-07-07 14:09:57 +00:00
|
|
|
|
2013-01-13 19:18:10 +00:00
|
|
|
gtk_widget_show_all (gui.window_main);
|
2011-07-07 14:09:57 +00:00
|
|
|
|
|
|
|
}
|
2011-08-15 21:03:50 +00:00
|
|
|
|
|
|
|
// Draw signal level meters according to given values
|
|
|
|
void setVU (short int PcmValue, double SNRdB) {
|
2013-01-13 20:32:31 +00:00
|
|
|
int x,y;
|
|
|
|
int PWRdB = (int)round(10 * log10(pow(PcmValue/32767.0,2)));
|
|
|
|
guchar *pixelsPWR, *pixelsSNR, *pPWR, *pSNR;
|
2011-08-15 21:03:50 +00:00
|
|
|
unsigned int rowstridePWR,rowstrideSNR;
|
|
|
|
|
2013-01-13 19:52:31 +00:00
|
|
|
rowstridePWR = gdk_pixbuf_get_rowstride (pixbuf_PWR);
|
|
|
|
pixelsPWR = gdk_pixbuf_get_pixels (pixbuf_PWR);
|
2011-08-15 21:03:50 +00:00
|
|
|
|
2013-01-13 19:52:31 +00:00
|
|
|
rowstrideSNR = gdk_pixbuf_get_rowstride (pixbuf_SNR);
|
|
|
|
pixelsSNR = gdk_pixbuf_get_pixels (pixbuf_SNR);
|
2011-08-15 21:03:50 +00:00
|
|
|
|
|
|
|
for (y=0; y<20; y++) {
|
|
|
|
for (x=0; x<100; x++) {
|
|
|
|
|
|
|
|
pPWR = pixelsPWR + y * rowstridePWR + (99-x) * 3;
|
|
|
|
pSNR = pixelsSNR + y * rowstrideSNR + (99-x) * 3;
|
|
|
|
|
2013-01-14 21:21:15 +00:00
|
|
|
if (y > 1 && y < 18 && x % 2 == 0) {
|
2011-08-15 21:03:50 +00:00
|
|
|
|
2013-01-13 20:32:31 +00:00
|
|
|
if (PWRdB >= -0.0075*pow(x,2)-3) {
|
|
|
|
pPWR[0] = 0x89;
|
2011-08-15 21:03:50 +00:00
|
|
|
pPWR[1] = 0xfe;
|
|
|
|
pPWR[2] = 0xf4;
|
|
|
|
} else {
|
|
|
|
pPWR[0] = pPWR[1] = pPWR[2] = 0x80;
|
|
|
|
}
|
|
|
|
|
2013-01-13 20:32:31 +00:00
|
|
|
if (SNRdB >= -0.6*x+40) {
|
2011-08-15 21:03:50 +00:00
|
|
|
pSNR[0] = 0xef;
|
|
|
|
pSNR[1] = 0xe4;
|
|
|
|
pSNR[2] = 0x34;
|
|
|
|
} else {
|
|
|
|
pSNR[0] = pSNR[1] = pSNR[2] = 0x80;
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
pPWR[0] = pPWR[1] = pPWR[2] = 0x40;
|
|
|
|
pSNR[0] = pSNR[1] = pSNR[2] = 0x40;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
gdk_threads_enter();
|
2013-01-13 19:52:31 +00:00
|
|
|
gtk_image_set_from_pixbuf(GTK_IMAGE(gui.image_pwr), pixbuf_PWR);
|
|
|
|
gtk_image_set_from_pixbuf(GTK_IMAGE(gui.image_snr), pixbuf_SNR);
|
2011-08-15 21:03:50 +00:00
|
|
|
gdk_threads_leave();
|
|
|
|
|
|
|
|
}
|
2013-01-10 17:30:28 +00:00
|
|
|
|
2013-01-13 19:48:20 +00:00
|
|
|
void evt_chooseDir() {
|
2013-01-10 17:30:28 +00:00
|
|
|
GtkWidget *dialog;
|
|
|
|
dialog = gtk_file_chooser_dialog_new ("Select folder",
|
2013-01-13 19:18:10 +00:00
|
|
|
GTK_WINDOW(gui.window_main),
|
2013-01-10 17:30:28 +00:00
|
|
|
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
|
|
|
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
|
|
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
|
2013-01-17 06:44:38 +00:00
|
|
|
g_key_file_set_string(config,"slowrx","rxdir",gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
|
2013-01-13 19:18:10 +00:00
|
|
|
gtk_entry_set_text(GTK_ENTRY(gui.entry_picdir),gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
|
2013-01-10 17:30:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gtk_widget_destroy (dialog);
|
|
|
|
}
|
2013-01-10 18:46:30 +00:00
|
|
|
|
2013-01-13 19:48:20 +00:00
|
|
|
void evt_show_about() {
|
2013-01-13 19:18:10 +00:00
|
|
|
gtk_dialog_run(GTK_DIALOG(gui.window_about));
|
|
|
|
gtk_widget_hide(gui.window_about);
|
2013-01-10 18:46:30 +00:00
|
|
|
}
|