void sim_mode_cb(GtkWidget *widget, gpointer data) { BAND* band; BANDSTACK_ENTRY *entry; fprintf(stderr,"sim_mode_cb\n"); band=band_get_current_band(); entry=bandstack_entry_get_current(); if(function) { entry->mode--; if(entry->mode<0) { entry->mode=MODES-1; } } 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); }
void sim_filter_cb(GtkWidget *widget, gpointer data) { BAND* band; BANDSTACK_ENTRY *entry; fprintf(stderr,"sim_filter_cb\n"); band=band_get_current_band(); entry=bandstack_entry_get_current(); // note order of filter reversed (largest first) if(function) { entry->filter++; if(entry->filter>=FILTERS) { entry->filter=0; } } 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); }
void vfo_move_to(int hz) { if(!locked) { BANDSTACK_ENTRY* entry=bandstack_entry_get_current(); #ifdef LIMESDR if(protocol==LIMESDR_PROTOCOL) { setFrequency((entry->frequencyA+ddsOffset-hz)/step*step); } else { #endif if(ctun) { setFrequency((entry->frequencyA+hz)/step*step); } else { long f=(entry->frequencyA+ddsOffset+hz)/step*step; if(mode==modeCWL) { f+=cw_keyer_sidetone_frequency; } else if(mode==modeCWU) { f-=cw_keyer_sidetone_frequency; } setFrequency(f); } #ifdef LIMESDR } #endif vfo_update(NULL); } }
static void band_select_cb(GtkWidget *widget, gpointer data) { GtkWidget *label; int b=(int)data; BANDSTACK_ENTRY *entry; if(b==band_get_current()) { entry=bandstack_entry_next(); } else { BAND* band=band_set_current(b); entry=bandstack_entry_get_current(); gtk_widget_override_background_color(last_band, GTK_STATE_NORMAL, &white); last_band=widget; gtk_widget_override_background_color(last_band, GTK_STATE_NORMAL, &gray); } setMode(entry->mode); FILTER* band_filters=filters[entry->mode]; FILTER* band_filter=&band_filters[entry->filter]; setFilter(band_filter->low,band_filter->high); setFrequency(entry->frequencyA); BAND *band=band_get_current_band(); set_alex_rx_antenna(band->alexRxAntenna); set_alex_tx_antenna(band->alexTxAntenna); set_alex_attenuation(band->alexAttenuation); vfo_update(NULL); setFrequency(entry->frequencyA); }
void vfo_step(int steps) { if(!locked) { BANDSTACK_ENTRY* entry=bandstack_entry_get_current(); //entry->frequencyA=entry->frequencyA+(steps*step); //setFrequency(entry->frequencyA); setFrequency(entry->frequencyA+(steps*step)); vfo_update(NULL); } }
static void cw_keyer_sidetone_frequency_value_changed_cb(GtkWidget *widget, gpointer data) { cw_keyer_sidetone_frequency=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); if(mode==modeCWL || mode==modeCWU) { BANDSTACK_ENTRY *entry=bandstack_entry_get_current(); FILTER* band_filters=filters[entry->mode]; FILTER* band_filter=&band_filters[entry->filter]; setFilter(band_filter->low,band_filter->high); } cw_changed(); }
static int vfo_encoder_changed(void *data) { if(!locked) { int pos=*(int*)data; // VFO BANDSTACK_ENTRY* entry=bandstack_entry_get_current(); setFrequency(entry->frequencyA+ddsOffset+(pos*step)); vfo_update(NULL); } free(data); return 0; }
int ptt_update(void *data) { BANDSTACK_ENTRY *entry; entry=bandstack_entry_get_current(); int ptt=(int)data; if((entry->mode==modeCWL || entry->mode==modeCWU) && cw_keyer_internal==1) { //if(ptt!=getMox()) { // mox_cb(NULL,NULL); //} } else { mox_cb(NULL,NULL); } return 0; }
static void filter_select_cb(GtkWidget *widget, gpointer data) { int f=(int)data; BANDSTACK_ENTRY *entry; entry=bandstack_entry_get_current(); entry->filter=f; FILTER* band_filters=filters[entry->mode]; FILTER* band_filter=&band_filters[entry->filter]; setFilter(band_filter->low,band_filter->high); gtk_widget_override_background_color(last_filter, GTK_STATE_NORMAL, &white); last_filter=widget; gtk_widget_override_background_color(last_filter, GTK_STATE_NORMAL, &gray); vfo_update(NULL); }
void vfo_move_to(int hz) { if(!locked) { BANDSTACK_ENTRY* entry=bandstack_entry_get_current(); //entry->frequencyA=(entry->frequencyA+hz)/step*step; //setFrequency(entry->frequencyA); #ifdef LIMESDR if(protocol==LIMESDR_PROTOCOL) setFrequency((entry->frequencyA+ddsOffset-hz)/step*step); else #endif setFrequency((entry->frequencyA+ddsOffset+hz)/step*step); vfo_update(NULL); } }
void sim_band_cb(GtkWidget *widget, gpointer data) { BAND* band; BANDSTACK_ENTRY *entry; fprintf(stderr,"sim_band_cb\n"); int b=band_get_current(); if(function) { b--; if(b<0) { b=BANDS-1; } #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); }
GtkWidget* vfo_init(int width,int height,GtkWidget *parent) { fprintf(stderr,"vfo_init: width=%d height=%d\n", width, height); parent_window=parent; my_width=width; my_height=height; vfo = gtk_drawing_area_new (); gtk_widget_set_size_request (vfo, width, height); /* Signals used to handle the backing surface */ g_signal_connect (vfo, "draw", G_CALLBACK (vfo_draw_cb), NULL); g_signal_connect (vfo,"configure-event", G_CALLBACK (vfo_configure_event_cb), NULL); /* Event signals */ g_signal_connect (vfo, "button-press-event", G_CALLBACK (vfo_press_event_cb), NULL); g_signal_connect(vfo,"scroll_event", G_CALLBACK(vfo_scroll_event_cb),NULL); gtk_widget_set_events (vfo, gtk_widget_get_events (vfo) | GDK_BUTTON_PRESS_MASK | GDK_SCROLL_MASK); fprintf(stderr,"vfo_init: set Frequency,Mode,Filter\n"); BAND *band=band_get_current_band(); BANDSTACK_ENTRY* 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); set_alex_rx_antenna(band->alexRxAntenna); set_alex_tx_antenna(band->alexTxAntenna); set_alex_attenuation(band->alexAttenuation); return vfo; }
static void filter_cb(GtkWidget *widget, gpointer data) { BANDSTACK_ENTRY *entry=bandstack_entry_get_current(); FILTER* band_filters=filters[entry->mode]; GtkWidget *dialog=gtk_dialog_new_with_buttons("Mode",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL); GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog)); GtkWidget *grid=gtk_grid_new(); gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE); gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE); GtkWidget *b; int i; for(i=0;i<FILTERS;i++) { FILTER* band_filter=&band_filters[i]; GtkWidget *b=gtk_button_new_with_label(band_filters[i].title); //gtk_widget_override_font(b, pango_font_description_from_string("Arial 20")); if(i==entry->filter) { gtk_widget_override_background_color(b, GTK_STATE_NORMAL, &gray); last_filter=b; } else { gtk_widget_override_background_color(b, GTK_STATE_NORMAL, &white); } gtk_widget_show(b); gtk_grid_attach(GTK_GRID(grid),b,i%5,i/5,1,1); g_signal_connect(b,"pressed",G_CALLBACK(filter_select_cb),(gpointer *)i); } gtk_container_add(GTK_CONTAINER(content),grid); GtkWidget *close_button=gtk_dialog_add_button(GTK_DIALOG(dialog),"Close",GTK_RESPONSE_OK); //gtk_widget_override_font(close_button, pango_font_description_from_string("Arial 20")); gtk_widget_show_all(dialog); g_signal_connect_swapped (dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); int result=gtk_dialog_run(GTK_DIALOG(dialog)); }
int vfo_update(void *data) { BANDSTACK_ENTRY* entry=bandstack_entry_get_current(); FILTER* band_filters=filters[entry->mode]; FILTER* band_filter=&band_filters[entry->filter]; if(vfo_surface) { cairo_t *cr; cr = cairo_create (vfo_surface); cairo_set_source_rgb (cr, 0, 0, 0); cairo_paint (cr); cairo_select_font_face(cr, "Arial", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); //cairo_set_font_size(cr, 36); cairo_set_font_size(cr, 28); if(isTransmitting()) { cairo_set_source_rgb(cr, 1, 0, 0); } else { cairo_set_source_rgb(cr, 0, 1, 0); } long long f=entry->frequencyA+ddsOffset; char sf[32]; //sprintf(sf,"%0lld.%06lld MHz",entry->frequencyA/(long long)1000000,entry->frequencyA%(long long)1000000); sprintf(sf,"%0lld.%06lld MHz",f/(long long)1000000,f%(long long)1000000); cairo_move_to(cr, 5, 30); cairo_show_text(cr, sf); cairo_set_font_size(cr, 12); cairo_move_to(cr, (my_width/2)+40, 30); //cairo_show_text(cr, getFrequencyInfo(entry->frequencyA)); cairo_show_text(cr, getFrequencyInfo(f)); sprintf(sf,"Step %dHz",step); cairo_move_to(cr, (my_width/2)+40, 15); cairo_show_text(cr, sf); if(locked) { cairo_set_source_rgb(cr, 1, 0, 0); cairo_move_to(cr, 10, 50); cairo_show_text(cr, "Locked"); } if(function) { cairo_set_source_rgb(cr, 1, 0.5, 0); cairo_move_to(cr, 70, 50); cairo_show_text(cr, "Function"); } cairo_set_source_rgb(cr, 1, 1, 0); cairo_move_to(cr, 130, 50); cairo_show_text(cr, mode_string[entry->mode]); cairo_move_to(cr, 190, 50); cairo_show_text(cr, band_filter->title); cairo_move_to(cr, 250, 50); if(nr) { cairo_show_text(cr, "NR"); } if(nr2) { cairo_show_text(cr, "NR2"); } if(nb) { cairo_show_text(cr, "NB"); } if(nb2) { cairo_show_text(cr, "NB2"); } if(anf) { cairo_show_text(cr, "ANF"); } if(snb) { cairo_show_text(cr, "SNB"); } cairo_move_to(cr, 310, 50); switch(agc) { case AGC_OFF: cairo_show_text(cr, "AGC OFF"); break; case AGC_LONG: cairo_show_text(cr, "AGC LONG"); break; case AGC_SLOW: cairo_show_text(cr, "AGC SLOW"); break; case AGC_MEDIUM: cairo_show_text(cr, "AGC MEDIUM"); break; case AGC_FAST: cairo_show_text(cr, "AGC FAST"); break; } cairo_destroy (cr); gtk_widget_queue_draw (vfo); } else { fprintf(stderr,"vfo_update: no surface!\n"); } return 0; }
int vfo_update(void *data) { BANDSTACK_ENTRY* entry=bandstack_entry_get_current(); FILTER* band_filters=filters[entry->mode]; FILTER* band_filter=&band_filters[entry->filter]; if(vfo_surface) { cairo_t *cr; cr = cairo_create (vfo_surface); cairo_set_source_rgb (cr, 0, 0, 0); cairo_paint (cr); cairo_select_font_face(cr, "FreeMono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); char version[16]; char text[128]; if(radio->protocol==ORIGINAL_PROTOCOL) { sprintf(version,"%d.%d", radio->software_version/10, radio->software_version%10); } else { sprintf(version,"%d.%d.%d", radio->software_version/100, (radio->software_version%100)/10, radio->software_version%10); } switch(radio->protocol) { case ORIGINAL_PROTOCOL: case NEW_PROTOCOL: sprintf(text,"%s %s %s", radio->name, version, inet_ntoa(radio->info.network.address.sin_addr)); break; #ifdef LIMESDR case LIMESDR_PROTOCOL: sprintf(text,"%s\n", radio->name); break; #endif } cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); cairo_set_font_size(cr, 10); cairo_move_to(cr, 5, 15); cairo_show_text(cr, text); long long f=entry->frequencyA+ddsOffset; char sf[32]; sprintf(sf,"%0lld.%06lld MHz",f/(long long)1000000,f%(long long)1000000); cairo_set_font_size(cr, 28); if(isTransmitting()) { cairo_set_source_rgb(cr, 1, 0, 0); } else { cairo_set_source_rgb(cr, 0, 1, 0); } cairo_move_to(cr, 5, 38); cairo_show_text(cr, sf); cairo_set_font_size(cr, 12); if(rit==0) { cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); } else { cairo_set_source_rgb(cr, 0, 1, 0); } sprintf(sf,"RIT: %d Hz",rit); cairo_move_to(cr, (my_width/4)*3, 38); cairo_show_text(cr, sf); cairo_set_source_rgb(cr, 0, 1, 0); int s=0; while(steps[s]!=step && steps[s]!=0) { s++; } sprintf(sf,"Step %s",step_labels[s]); cairo_move_to(cr, my_width/2, 15); cairo_show_text(cr, sf); cairo_move_to(cr, (my_width/4)*3, 15); cairo_show_text(cr, getFrequencyInfo(f)); if(locked) { cairo_set_source_rgb(cr, 1, 0, 0); cairo_move_to(cr, 10, 50); cairo_show_text(cr, "Locked"); } if(function) { cairo_set_source_rgb(cr, 1, 0.5, 0); cairo_move_to(cr, 70, 50); cairo_show_text(cr, "Function"); } cairo_set_source_rgb(cr, 1, 1, 0); cairo_move_to(cr, 130, 50); cairo_show_text(cr, mode_string[entry->mode]); cairo_move_to(cr, 190, 50); cairo_show_text(cr, band_filter->title); cairo_move_to(cr, 250, 50); if(nr) { cairo_show_text(cr, "NR"); } if(nr2) { cairo_show_text(cr, "NR2"); } if(nb) { cairo_show_text(cr, "NB"); } if(nb2) { cairo_show_text(cr, "NB2"); } if(anf) { cairo_show_text(cr, "ANF"); } if(snb) { cairo_show_text(cr, "SNB"); } cairo_move_to(cr, 310, 50); switch(agc) { case AGC_OFF: cairo_show_text(cr, "AGC OFF"); break; case AGC_LONG: cairo_show_text(cr, "AGC LONG"); break; case AGC_SLOW: cairo_show_text(cr, "AGC SLOW"); break; case AGC_MEDIUM: cairo_show_text(cr, "AGC MEDIUM"); break; case AGC_FAST: cairo_show_text(cr, "AGC FAST"); break; } cairo_destroy (cr); gtk_widget_queue_draw (vfo); } else { fprintf(stderr,"vfo_update: no surface!\n"); } return 0; }