From: John Melton - G0ORX/N6LYT Date: Sat, 5 Nov 2016 08:50:16 +0000 (+0000) Subject: Added CTUN. Changed RIT interface. Fixed TX overdrive. Additional small fixes. X-Git-Url: https://git.rkrishnan.org/uri//%22%22?a=commitdiff_plain;h=2acfbf1ea332998e5105cffcacb7455b3303f54b;p=pihpsdr.git Added CTUN. Changed RIT interface. Fixed TX overdrive. Additional small fixes. --- diff --git a/Makefile b/Makefile index f34fa68..0bc1ad7 100644 --- a/Makefile +++ b/Makefile @@ -93,13 +93,15 @@ else gpio.o endif +#uncomment if build for SHORT FRAMES (MIC and Audio) +SHORT_FRAMES="-D SHORT_FRAMES" GTKINCLUDES=`pkg-config --cflags gtk+-3.0` GTKLIBS=`pkg-config --libs gtk+-3.0` AUDIO_LIBS=-lasound -OPTIONS=-g -D $(UNAME_N) $(GPIO_OPTIONS) $(LIMESDR_OPTIONS) $(FREEDV_OPTIONS) $(PSK_OPTIONS) -D GIT_DATE='"$(GIT_DATE)"' -D GIT_VERSION='"$(GIT_VERSION)"' $(DEBUG_OPTION) -O3 +OPTIONS=-g -D $(UNAME_N) $(GPIO_OPTIONS) $(LIMESDR_OPTIONS) $(FREEDV_OPTIONS) $(PSK_OPTIONS) $(SHORT_FRAMES) -D GIT_DATE='"$(GIT_DATE)"' -D GIT_VERSION='"$(GIT_VERSION)"' $(DEBUG_OPTION) -O3 LIBS=-lrt -lm -lwdsp -lpthread $(AUDIO_LIBS) -lpulse $(PSKLIBS) $(GTKLIBS) $(GPIO_LIBS) $(SOAPYSDRLIBS) $(FREEDVLIBS) INCLUDES=$(GTKINCLUDES) diff --git a/gpio.c b/gpio.c index da56eae..86a3a6a 100644 --- a/gpio.c +++ b/gpio.c @@ -450,8 +450,12 @@ fprintf(stderr,"encoder_init\n"); } if(ENABLE_VFO_ENCODER) { - gpioSetMode(VFO_ENCODER_A, PI_INPUT); - gpioSetMode(VFO_ENCODER_B, PI_INPUT); + if(gpioSetMode(VFO_ENCODER_A, PI_INPUT)!=0) { + fprintf(stderr,"gpioSetMode for VFO_ENCODER_A failed\n"); + } + if(gpioSetMode(VFO_ENCODER_B, PI_INPUT)!=0) { + fprintf(stderr,"gpioSetMode for VFO_ENCODER_B failed\n"); + } if(ENABLE_VFO_PULLUP) { gpioSetPullUpDown(VFO_ENCODER_A, PI_PUD_UP); gpioSetPullUpDown(VFO_ENCODER_B, PI_PUD_UP); @@ -459,8 +463,12 @@ fprintf(stderr,"encoder_init\n"); gpioSetPullUpDown(VFO_ENCODER_A, PI_PUD_OFF); gpioSetPullUpDown(VFO_ENCODER_B, PI_PUD_OFF); } - gpioSetAlertFunc(VFO_ENCODER_A, vfoEncoderPulse); - gpioSetAlertFunc(VFO_ENCODER_B, vfoEncoderPulse); + if(gpioSetAlertFunc(VFO_ENCODER_A, vfoEncoderPulse)!=0) { + fprintf(stderr,"gpioSetAlertFunc for VFO_ENCODER_A failed\n"); + } + if(gpioSetAlertFunc(VFO_ENCODER_B, vfoEncoderPulse)!=0) { + fprintf(stderr,"gpioSetAlertFunc for VFO_ENCODER_B failed\n"); + } vfoEncoderPos=0; } @@ -588,7 +596,7 @@ fprintf(stderr,"encoder_init\n"); fprintf(stderr,"wiringPiSetup\n"); if (wiringPiSetup () < 0) { printf ("Unable to setup wiringPi: %s\n", strerror (errno)); - return 1; + return -1; } FILE *fp; @@ -609,12 +617,12 @@ fprintf(stderr,"encoder_init\n"); if ( wiringPiISR (0, INT_EDGE_BOTH, &interruptB) < 0 ) { printf ("Unable to setup ISR: %s\n", strerror (errno)); - return 1; + return -1; } if ( wiringPiISR (1, INT_EDGE_BOTH, &interruptA) < 0 ) { printf ("Unable to setup ISR: %s\n", strerror (errno)); - return 1; + return -1; } #endif @@ -796,31 +804,24 @@ static int rf_encoder_changed(void *data) { static int agc_encoder_changed(void *data) { int pos=*(int*)data; if(pos!=0) { - if(agcFunction) { - rit-=pos; - if(rit>1000) rit=1000; - if(rit<-1000) rit=-1000; - vfo_update(NULL); + if(function) { + int att=attenuation; + att+=pos; + if(att<0) { + att=0; + } else if (att>31) { + att=31; + } + set_attenuation_value((double)att); } else { - 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); + 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; diff --git a/main.c b/main.c index dad0605..6c95e0a 100644 --- a/main.c +++ b/main.c @@ -65,9 +65,11 @@ #define VFO_HEIGHT ((display_height/32)*4) #define VFO_WIDTH ((display_width/32)*16) #define MENU_HEIGHT VFO_HEIGHT -#define MENU_WIDTH ((display_width/32)*3) +//#define MENU_WIDTH ((display_width/32)*3) +#define MENU_WIDTH ((display_width/32)*8) #define METER_HEIGHT VFO_HEIGHT -#define METER_WIDTH ((display_width/32)*13) +//#define METER_WIDTH ((display_width/32)*13) +#define METER_WIDTH ((display_width/32)*8) #define PANADAPTER_HEIGHT ((display_height/32)*8) #define SLIDERS_HEIGHT ((display_height/32)*6) #define TOOLBAR_HEIGHT ((display_height/32)*2) @@ -384,7 +386,7 @@ gint init(void* arg) { GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, "No devices found! Retry Discovery?"); - gtk_widget_override_font(discovery_dialog, pango_font_description_from_string("Arial 18")); + gtk_widget_override_font(discovery_dialog, pango_font_description_from_string("FreeMono 18")); gint result=gtk_dialog_run (GTK_DIALOG (discovery_dialog)); gtk_widget_destroy(discovery_dialog); if(result==GTK_RESPONSE_CANCEL) { @@ -407,7 +409,7 @@ gint init(void* arg) { GTK_RESPONSE_CLOSE, NULL); - gtk_widget_override_font(discovery_dialog, pango_font_description_from_string("Arial 18")); + gtk_widget_override_font(discovery_dialog, pango_font_description_from_string("FreeMono 18")); GtkWidget *content; content=gtk_dialog_get_content_area(GTK_DIALOG(discovery_dialog)); @@ -463,12 +465,12 @@ fprintf(stderr,"%p protocol=%d name=%s\n",d,d->protocol,d->name); } GtkWidget *label=gtk_label_new(text); - gtk_widget_override_font(label, pango_font_description_from_string("Arial 12")); + gtk_widget_override_font(label, pango_font_description_from_string("FreeMono 12")); gtk_widget_show(label); gtk_grid_attach(GTK_GRID(grid),label,0,i,3,1); GtkWidget *start_button=gtk_button_new_with_label("Start"); - gtk_widget_override_font(start_button, pango_font_description_from_string("Arial 18")); + gtk_widget_override_font(start_button, pango_font_description_from_string("FreeMono 18")); gtk_widget_show(start_button); gtk_grid_attach(GTK_GRID(grid),start_button,3,i,1,1); g_signal_connect(start_button,"pressed",G_CALLBACK(start_cb),(gpointer)d); @@ -543,7 +545,7 @@ fprintf(stderr,"selected radio=%p device=%d\n",radio,radio->device); } //splash_status("Initializing wdsp ..."); - wdsp_init(0,display_width,d->protocol); + wdsp_init(0,display_width,radio->protocol); switch(radio->protocol) { case ORIGINAL_PROTOCOL: @@ -564,7 +566,8 @@ fprintf(stderr,"selected radio=%p device=%d\n",radio,radio->device); splash_status("Initializing GPIO ..."); #ifdef GPIO - gpio_init(); + if(gpio_init()<0) { + } #endif window = gtk_window_new (GTK_WINDOW_TOPLEVEL); diff --git a/menu.c b/menu.c index 9a1e4f2..c2f3f98 100644 --- a/menu.c +++ b/menu.c @@ -41,30 +41,31 @@ static GtkWidget *parent_window; -static GtkWidget *box; -static GtkWidget *menu; +static GtkWidget *h_box; +static GtkWidget *v_box_1; +static GtkWidget *v_box_2; +static GtkWidget *menu_b; +static GtkWidget *ctun_b; +static GtkWidget *rit_b; +static GtkWidget *rit_plus_b; +static GtkWidget *rit_minus_b; +static gint rit_timer; static GtkWidget *ant_grid; static gint ant_id=-1; -#ifdef DEBUG -static void scale_value_changed_cb(GtkWidget *widget, gpointer data) { - scale=(int)gtk_range_get_value(GTK_RANGE(widget)); -} - -#ifdef PSK -static void psk_scale_value_changed_cb(GtkWidget *widget, gpointer data) { - psk_scale=(int)gtk_range_get_value(GTK_RANGE(widget)); -} -#endif +static gboolean rit_enabled=FALSE; -#ifdef FREEDV -static void freedv_scale_value_changed_cb(GtkWidget *widget, gpointer data) { - freedv_scale=(int)gtk_range_get_value(GTK_RANGE(widget)); +static void set_button_text_color(GtkWidget *widget,char *color) { + GtkStyleContext *style_context; + GtkCssProvider *provider = gtk_css_provider_new (); + gchar tmp[64]; + style_context = gtk_widget_get_style_context(widget); + gtk_style_context_add_provider(style_context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + g_snprintf(tmp, sizeof tmp, "GtkButton, GtkLabel { color: %s; }", color); + gtk_css_provider_load_from_data(GTK_CSS_PROVIDER(provider), tmp, -1, NULL); + g_object_unref (provider); } -#endif - -#endif static void agc_hang_threshold_value_changed_cb(GtkWidget *widget, gpointer data) { agc_hang_threshold=(int)gtk_range_get_value(GTK_RANGE(widget)); @@ -264,6 +265,19 @@ static void alex_cb(GtkWidget *widget, gpointer data) { if(protocol==NEW_PROTOCOL) { filter_board_changed(); } + + if(filter_board==ALEX) { + 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); + } } static void apollo_cb(GtkWidget *widget, gpointer data) { @@ -279,6 +293,16 @@ static void apollo_cb(GtkWidget *widget, gpointer data) { if(protocol==NEW_PROTOCOL) { filter_board_changed(); } + + if(filter_board==APOLLO) { + 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); + } } /* static void apollo_tuner_cb(GtkWidget *widget, gpointer data) { @@ -1306,38 +1330,6 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget, gtk_grid_attach(GTK_GRID(tx_grid),tx_out_of_band_b,0,7,4,1); g_signal_connect(tx_out_of_band_b,"toggled",G_CALLBACK(tx_out_of_band_cb),NULL); - -#ifdef DEBUG - int column=((i/6)*2)+2; - - GtkWidget *scale_label=gtk_label_new("Mic Scale:"); - gtk_widget_show(scale_label); - gtk_grid_attach(GTK_GRID(tx_grid),scale_label,column,0,1,1); - GtkWidget *scale_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,0.0, 20.0, 0.1); - gtk_range_set_value (GTK_RANGE(scale_scale),scale); - gtk_widget_show(scale_scale); - gtk_grid_attach(GTK_GRID(tx_grid),scale_scale,column+1,0,30,1); - g_signal_connect(G_OBJECT(scale_scale),"value_changed",G_CALLBACK(scale_value_changed_cb),NULL); - - GtkWidget *psk_scale_label=gtk_label_new("PSK Scale:"); - gtk_widget_show(psk_scale_label); - gtk_grid_attach(GTK_GRID(tx_grid),psk_scale_label,column,1,1,1); - GtkWidget *psk_scale_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,0.0, 20.0, 0.1); - gtk_range_set_value (GTK_RANGE(psk_scale_scale),psk_scale); - gtk_widget_show(psk_scale_scale); - gtk_grid_attach(GTK_GRID(tx_grid),psk_scale_scale,column+1,1,30,1); - g_signal_connect(G_OBJECT(psk_scale_scale),"value_changed",G_CALLBACK(psk_scale_value_changed_cb),NULL); - - GtkWidget *freedv_scale_label=gtk_label_new("FREEDV Scale:"); - gtk_widget_show(freedv_scale_label); - gtk_grid_attach(GTK_GRID(tx_grid),freedv_scale_label,column,2,1,1); - GtkWidget *freedv_scale_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,0.0, 20.0, 0.1); - gtk_range_set_value (GTK_RANGE(freedv_scale_scale),freedv_scale); - gtk_widget_show(freedv_scale_scale); - gtk_grid_attach(GTK_GRID(tx_grid),freedv_scale_scale,column+1,2,30,1); - g_signal_connect(G_OBJECT(freedv_scale_scale),"value_changed",G_CALLBACK(freedv_scale_value_changed_cb),NULL); -#endif - id=gtk_notebook_append_page(GTK_NOTEBOOK(notebook),tx_grid,tx_label); } @@ -1618,6 +1610,70 @@ static gboolean menu_pressed_event_cb (GtkWidget *widget, } +static gboolean ctun_pressed_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { + ctun=ctun==1?0:1; + + if(ctun) { + set_button_text_color(ctun_b,"red"); + } else { + set_button_text_color(ctun_b,"black"); + if(ddsOffset!=0) { + ddsOffset=0; + wdsp_set_offset(ddsOffset); + vfo_update(NULL); + } + } + return TRUE; +} + +static gboolean rit_timer_cb(gpointer data) { + if((GtkWidget*)data==rit_plus_b) { + rit++; + } else { + rit--; + } + if(rit>1000) rit=1000; + if(rit<-1000) rit=-1000; + vfo_update(NULL); + return TRUE; +} + +static gboolean rit_pressed_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { + if(rit_enabled) { + rit_enabled=FALSE; + set_button_text_color(rit_b,"black"); + rit=0; + gtk_widget_set_sensitive(rit_plus_b,FALSE); + gtk_widget_set_sensitive(rit_minus_b,FALSE); + } else { + rit_enabled=TRUE; + set_button_text_color(rit_b,"red"); + gtk_widget_set_sensitive(rit_plus_b,TRUE); + gtk_widget_set_sensitive(rit_minus_b,TRUE); + } + vfo_update(NULL); +} + +static gboolean rit_step_pressed_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { + if(widget==rit_plus_b) { + rit++; + } else { + rit--; + } + if(rit>1000) rit=1000; + if(rit<-1000) rit=-1000; + vfo_update(NULL); + rit_timer=g_timeout_add(200,rit_timer_cb,widget); + return TRUE; +} + + +static gboolean rit_step_released_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { + g_source_remove(rit_timer); + return TRUE; +} + + GtkWidget* menu_init(int width,int height,GtkWidget *parent) { GdkRGBA black; @@ -1633,16 +1689,52 @@ GtkWidget* menu_init(int width,int height,GtkWidget *parent) { parent_window=parent; - box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); - gtk_widget_set_size_request (box, width, height); - gtk_widget_override_background_color(box, GTK_STATE_NORMAL, &black); + h_box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); + gtk_widget_set_size_request (h_box, width, height); + gtk_widget_override_background_color(h_box, GTK_STATE_NORMAL, &black); + + v_box_2=gtk_box_new(GTK_ORIENTATION_VERTICAL,0); + gtk_widget_override_background_color(v_box_2, GTK_STATE_NORMAL, &black); + + rit_plus_b=gtk_button_new_with_label("RIT+"); + gtk_widget_override_font(rit_plus_b, pango_font_description_from_string("FreeMono Bold 10")); + g_signal_connect (rit_plus_b, "pressed", G_CALLBACK(rit_step_pressed_event_cb), NULL); + g_signal_connect (rit_plus_b, "released", G_CALLBACK(rit_step_released_event_cb), NULL); + gtk_box_pack_start (GTK_BOX(v_box_2),rit_plus_b,TRUE,TRUE,0); + + rit_minus_b=gtk_button_new_with_label("RIT-"); + gtk_widget_override_font(rit_minus_b, pango_font_description_from_string("FreeMono Bold 10")); + g_signal_connect (rit_minus_b, "pressed", G_CALLBACK(rit_step_pressed_event_cb), NULL); + g_signal_connect (rit_minus_b, "released", G_CALLBACK(rit_step_released_event_cb), NULL); + gtk_box_pack_start (GTK_BOX(v_box_2),rit_minus_b,TRUE,TRUE,0); + + gtk_widget_set_sensitive(rit_plus_b,FALSE); + gtk_widget_set_sensitive(rit_minus_b,FALSE); + + gtk_box_pack_start (GTK_BOX(h_box),v_box_2,TRUE,TRUE,0); + + v_box_1=gtk_box_new(GTK_ORIENTATION_VERTICAL,0); + gtk_widget_override_background_color(v_box_1, GTK_STATE_NORMAL, &black); + + ctun_b=gtk_button_new_with_label("CTUN"); + gtk_widget_override_font(ctun_b, pango_font_description_from_string("FreeMono Bold 10")); + g_signal_connect (ctun_b, "pressed", G_CALLBACK(ctun_pressed_event_cb), NULL); + gtk_box_pack_start (GTK_BOX(v_box_1),ctun_b,TRUE,TRUE,0); + + rit_b=gtk_button_new_with_label("RIT"); + gtk_widget_override_font(rit_b, pango_font_description_from_string("FreeMono Bold 10")); + g_signal_connect (rit_b, "pressed", G_CALLBACK(rit_pressed_event_cb), NULL); + gtk_box_pack_start (GTK_BOX(v_box_1),rit_b,TRUE,TRUE,0); + + gtk_box_pack_start (GTK_BOX(h_box),v_box_1,TRUE,TRUE,0); - menu=gtk_button_new_with_label("Menu"); - // gtk_widget_set_size_request (menu, width, height); - g_signal_connect (menu, "pressed", G_CALLBACK(menu_pressed_event_cb), NULL); - gtk_box_pack_start (GTK_BOX(box),menu,TRUE,TRUE,0); + menu_b=gtk_button_new_with_label("Menu"); + // gtk_widget_set_size_request (menu_b, width, height); + gtk_widget_override_font(menu_b, pango_font_description_from_string("FreeMono Bold 10")); + g_signal_connect (menu_b, "pressed", G_CALLBACK(menu_pressed_event_cb), NULL); + gtk_box_pack_start (GTK_BOX(h_box),menu_b,TRUE,TRUE,0); - gtk_widget_show_all(box); + gtk_widget_show_all(h_box); - return box; + return h_box; } diff --git a/meter.c b/meter.c index 2d4aae5..3f7fb7e 100644 --- a/meter.c +++ b/meter.c @@ -154,7 +154,7 @@ meter_press_event_cb (GtkWidget *widget, 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 18")); + gtk_widget_override_font(close_button, pango_font_description_from_string("FreeMono 18")); gtk_widget_show_all(dialog); g_signal_connect_swapped (dialog, @@ -207,10 +207,13 @@ void meter_update(int meter_type,double value,double reverse,double exciter,doub cairo_set_source_rgb (cr, 0, 0, 0); cairo_paint (cr); - - sprintf(text,"Version: %s %s", build_date, build_version); + //sprintf(text,"Version: %s %s", build_date, build_version); + sprintf(text,"Version: %s", version); + cairo_select_font_face(cr, "FreeMono", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_BOLD); cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); - cairo_set_font_size(cr, 12); + cairo_set_font_size(cr, 10); cairo_move_to(cr, 5, 15); cairo_show_text(cr, text); @@ -231,13 +234,11 @@ void meter_update(int meter_type,double value,double reverse,double exciter,doub // value is dBm text_location=10; offset=5.0; - cairo_select_font_face(cr, "Arial", - CAIRO_FONT_SLANT_NORMAL, - CAIRO_FONT_WEIGHT_BOLD); double level=value+(double)get_attenuation(); if(meter_width>=114) { - int db=meter_width/114; // S9+60 (9*6)+60 - if(db>2) db=2; + //int db=meter_width/114; // S9+60 (9*6)+60 + //if(db>2) db=2; + int db=1; int i; cairo_set_line_width(cr, 1.0); cairo_set_source_rgb(cr, 1, 1, 1); @@ -354,7 +355,7 @@ void meter_update(int meter_type,double value,double reverse,double exciter,doub #endif case POWER: // value is Watts - cairo_select_font_face(cr, "Arial", + cairo_select_font_face(cr, "FreeMono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cr, 18); @@ -370,7 +371,7 @@ void meter_update(int meter_type,double value,double reverse,double exciter,doub cairo_show_text(cr, sf); double swr=(max_level+reverse)/(max_level-reverse); - cairo_select_font_face(cr, "Arial", + cairo_select_font_face(cr, "FreeMono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cr, 18); diff --git a/new_protocol.c b/new_protocol.c index 4e4ee03..804fc6c 100644 --- a/new_protocol.c +++ b/new_protocol.c @@ -137,7 +137,11 @@ static double audiooutputbuffer[BUFFER_SIZE*2]; static int leftaudiosample; static int rightaudiosample; static long audiosequence; +#ifdef SHORT_FRAMES static unsigned char audiobuffer[260]; // was 1444 +#else +static unsigned char audiobuffer[1444]; // was 1444 +#endif static int audioindex; #ifdef FREEDV @@ -327,7 +331,10 @@ static void new_protocol_high_priority(int run) { buffer[12]=phase; // tx (no split yet) - long txFrequency=ddsFrequency; + long long txFrequency=ddsFrequency; + if(ctun) { + txFrequency+=ddsOffset; + } phase=(long)((4294967296.0*(double)txFrequency)/122880000.0); buffer[329]=phase>>24; @@ -501,7 +508,7 @@ else LPF <= 7'b0001000; // < 2.4MHz so use 160m LPF^M //buffer[1442]=attenuation; buffer[1443]=attenuation; -//fprintf(stderr,"[4]=%02X\n", buffer[4]); +//fprintf(stderr,"high_priority[4]=0x%02X\n", buffer[4]); //fprintf(stderr,"filters=%04X\n", filters); if(sendto(data_socket,buffer,sizeof(buffer),0,(struct sockaddr*)&high_priority_addr,high_priority_addr_length)<0) { @@ -884,8 +891,8 @@ static void process_mic_data(unsigned char *buffer) { for(j=0;jdevice==DEVICE_METIS && atlas_penelope) { + if(radio->device==NEW_DEVICE_ATLAS && atlas_penelope) { if(tune) { - gain=8388607.0*(double)tune_drive; + gain=gain*tune_drive; } else { - gain=8388607.0*(double)drive; + gain=gain*(double)drive; } } diff --git a/new_protocol.h b/new_protocol.h index 807d992..e53710c 100644 --- a/new_protocol.h +++ b/new_protocol.h @@ -38,7 +38,11 @@ #define BUFFER_SIZE 1024 +#ifdef SHORT_FRAMES #define MIC_SAMPLES 64 +#else +#define MIC_SAMPLES 720 +#endif extern int data_socket; extern sem_t response_sem; diff --git a/old_protocol.c b/old_protocol.c index b46a1b6..e8600aa 100644 --- a/old_protocol.c +++ b/old_protocol.c @@ -160,7 +160,7 @@ static int left_tx_sample; static int right_tx_sample; static unsigned char output_buffer[OZY_BUFFER_SIZE]; -static int output_buffer_index=0; +static int output_buffer_index=8; static int command=0; @@ -460,8 +460,8 @@ static void process_ozy_input_buffer(char *buffer) { for(j=0;jdevice==DEVICE_METIS && atlas_penelope) { if(tune) { - gain=32767.0*tune_drive; + gain=gain*tune_drive; } else { - gain=32767.0*drive; + gain=gain*drive; } } +fprintf(stderr,"full_tx_buffer: gain=%f\n",gain); for(j=0;j>24; output_buffer[C2]=txFrequency>>16; output_buffer[C3]=txFrequency>>8; @@ -947,11 +945,13 @@ void ozy_send_buffer() { if(tune) { d=(float)tune_drive; } - BAND *band=band_get_current_band(); - d=d*((float)band->pa_calibration/100.0F); - int power=(int)(d*255.0); -//fprintf(stderr,"power=%d\n", power); + int power=0; + if(isTransmitting()) { + BAND *band=band_get_current_band(); + d=d*((float)band->pa_calibration/100.0F); + power=(int)(d*255.0); + } output_buffer[C0]=0x12; output_buffer[C1]=power&0xFF; diff --git a/panadapter.c b/panadapter.c index 33f08b8..2ac9faa 100644 --- a/panadapter.c +++ b/panadapter.c @@ -209,8 +209,13 @@ void panadapter_update(float *data,int tx) { // filter cairo_set_source_rgb (cr, 0.25, 0.25, 0.25); - filter_left=(double)display_width/2.0+(((double)getFilterLow()+ddsOffset)/hz_per_pixel); - filter_right=(double)display_width/2.0+(((double)getFilterHigh()+ddsOffset)/hz_per_pixel); + if(ctun && isTransmitting()) { + filter_left=(double)display_width/2.0+((double)getFilterLow()/hz_per_pixel); + filter_right=(double)display_width/2.0+((double)getFilterHigh()/hz_per_pixel); + } else { + filter_left=(double)display_width/2.0+(((double)getFilterLow()+ddsOffset)/hz_per_pixel); + filter_right=(double)display_width/2.0+(((double)getFilterHigh()+ddsOffset)/hz_per_pixel); + } cairo_rectangle(cr, filter_left, 0.0, filter_right-filter_left, (double)display_height); cairo_fill(cr); @@ -227,7 +232,7 @@ void panadapter_update(float *data,int tx) { cairo_line_to(cr,(double)display_width,(double)y); cairo_set_source_rgb (cr, 0, 1, 1); - cairo_select_font_face(cr, "Arial", + cairo_select_font_face(cr, "FreeMono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cr, 12); @@ -243,6 +248,9 @@ void panadapter_update(float *data,int tx) { long divisor=20000; long half=(long)getSampleRate()/2L; long frequency=getFrequency(); + if(ctun && isTransmitting()) { + frequency+=ddsOffset; + } switch(sample_rate) { case 48000: divisor=5000L; @@ -277,7 +285,7 @@ void panadapter_update(float *data,int tx) { cairo_line_to(cr,(double)i,(double)display_height); cairo_set_source_rgb (cr, 0, 1, 1); - cairo_select_font_face(cr, "Arial", + cairo_select_font_face(cr, "FreeMono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cr, 12); @@ -357,8 +365,8 @@ void panadapter_update(float *data,int tx) { // cursor cairo_set_source_rgb (cr, 1, 0, 0); cairo_set_line_width(cr, 1.0); - cairo_move_to(cr,(double)display_width/2.0,0.0); - cairo_line_to(cr,(double)display_width/2.0,(double)display_height); + cairo_move_to(cr,(double)(display_width/2.0)+(ddsOffset/hz_per_pixel),0.0); + cairo_line_to(cr,(double)(display_width/2.0)+(ddsOffset/hz_per_pixel),(double)display_height); cairo_stroke(cr); // signal diff --git a/pihpsdr b/pihpsdr index 30ef735..d3fbb4d 100755 Binary files a/pihpsdr and b/pihpsdr differ diff --git a/property.c b/property.c index 32a7f07..8e3c60d 100644 --- a/property.c +++ b/property.c @@ -68,10 +68,14 @@ void saveProperties(char* filename) { PROPERTY* property=properties; FILE* f=fopen(filename,"w+"); char line[512]; + char version[32]; if(!f) { fprintf(stderr,"can't open %s\n",filename); exit(1); } + + sprintf(version,"%0.2f", PROPERTY_VERSION); + setProperty("property_version",version); while(property) { sprintf(line,"%s=%s\n",property->name,property->value); fwrite(line,1,strlen(line),f); diff --git a/property.h b/property.h index 7cccaea..883025b 100644 --- a/property.h +++ b/property.h @@ -20,6 +20,8 @@ #ifndef _PROPERTY_H #define _PROPERTY_H +#define PROPERTY_VERSION 1.0 + typedef struct _PROPERTY PROPERTY; /* --------------------------------------------------------------------------*/ diff --git a/radio.c b/radio.c index 964ac4a..7afd0d3 100644 --- a/radio.c +++ b/radio.c @@ -49,14 +49,6 @@ DISCOVERED *radio; char property_path[128]; sem_t property_sem; -double scale=4.6; -#ifdef FREEDV -double freedv_scale=4.6; -#endif -#ifdef PSK -double psk_scale=8.5; -#endif - int atlas_penelope=0; int atlas_clock_source_10mhz=0; int atlas_clock_source_128mhz=0; @@ -206,6 +198,8 @@ char freedv_tx_text_data[64]; static int pre_tune_mode; +int ctun=0; + void init_radio() { int rc; rc=sem_init(&property_sem, 0, 0); @@ -225,7 +219,6 @@ int getSampleRate() { } void setMox(int state) { -fprintf(stderr,"setMox: protocol=%d\n", protocol); if(mox!=state) { mox=state; if(protocol==NEW_PROTOCOL) { @@ -251,7 +244,6 @@ int getMox() { } void setTune(int state) { -fprintf(stderr,"setTune: protocol=%d\n", protocol); if(tune!=state) { tune=state; if(tune) { @@ -279,6 +271,7 @@ fprintf(stderr,"setTune: protocol=%d\n", protocol); } else { SetTXAPostGenToneFreq(CHANNEL_TX,(double)cw_keyer_sidetone_frequency); } + //SetTXAPostGenToneMag(CHANNEL_TX,0.99999); SetTXAPostGenToneMag(CHANNEL_TX,1.0); SetTXAPostGenRun(CHANNEL_TX,1); SetChannelState(CHANNEL_RX0,0,1); @@ -309,7 +302,17 @@ void setFrequency(long long f) { switch(protocol) { case NEW_PROTOCOL: case ORIGINAL_PROTOCOL: - entry->frequencyA=f; + if(ctun) { + long long minf=entry->frequencyA-(long long)(sample_rate/2); + long long maxf=entry->frequencyA+(long long)(sample_rate/2); + if(fmaxf) f=maxf; + ddsOffset=f-entry->frequencyA; + wdsp_set_offset(ddsOffset); + return; + } else { + entry->frequencyA=f; + } break; #ifdef LIMESDR case LIMESDR_PROTOCOL: @@ -319,7 +322,6 @@ void setFrequency(long long f) { if(fmaxf) f=maxf; ddsOffset=f-entry->frequencyA; -fprintf(stderr,"radio.c: setFrequency: ddsOffset=%lld\n",ddsOffset); wdsp_set_offset(ddsOffset); return; } @@ -328,7 +330,6 @@ fprintf(stderr,"radio.c: setFrequency: ddsOffset=%lld\n",ddsOffset); } } -//fprintf(stderr,"setFrequency: protocol=%d f=%lld\n", protocol, f); ddsFrequency=f; switch(protocol) { case NEW_PROTOCOL: diff --git a/radio.h b/radio.h index b158ab1..4326f01 100644 --- a/radio.h +++ b/radio.h @@ -46,15 +46,6 @@ extern DISCOVERED *radio; extern char property_path[]; -extern double scale; -#ifdef FREEDV -extern double freedv_scale; -#endif -#ifdef PSK -extern double psk_scale; -#endif - - #define NONE 0 #define ALEX 1 @@ -214,6 +205,8 @@ extern int eer_pwm_max; extern int tx_filter_low; extern int tx_filter_high; +extern int ctun; + extern void init_radio(); extern void setSampleRate(int rate); extern int getSampleRate(); diff --git a/release/pihpsdr.tar b/release/pihpsdr.tar index da67cba..c5530ca 100644 Binary files a/release/pihpsdr.tar and b/release/pihpsdr.tar differ diff --git a/release/pihpsdr/pihpsdr b/release/pihpsdr/pihpsdr index 30ef735..d3fbb4d 100755 Binary files a/release/pihpsdr/pihpsdr and b/release/pihpsdr/pihpsdr differ diff --git a/splash.c b/splash.c index 59b48be..b465a86 100644 --- a/splash.c +++ b/splash.c @@ -82,7 +82,7 @@ void splash_show(char* image_name,int width,int height,int full_screen) status=gtk_label_new(""); gtk_label_set_justify(GTK_LABEL(status),GTK_JUSTIFY_LEFT); - gtk_widget_override_font(status, pango_font_description_from_string("Arial 18")); + gtk_widget_override_font(status, pango_font_description_from_string("FreeMono 18")); gtk_widget_show(status); //gtk_container_add(GTK_CONTAINER(splash_window), status); gtk_grid_attach(GTK_GRID(grid), status, 1, 3, 1, 1); diff --git a/version.c b/version.c index 54d090c..6d60f92 100644 --- a/version.c +++ b/version.c @@ -20,3 +20,4 @@ char build_date[]=GIT_DATE; char build_version[]=GIT_VERSION; +char version[]="1.0 rc1"; diff --git a/version.h b/version.h index 694d25d..714f98a 100644 --- a/version.h +++ b/version.h @@ -22,5 +22,6 @@ extern char build_version[]; extern char build_date[]; +extern char version[]; #endif diff --git a/vfo.c b/vfo.c index 2f55319..454265e 100644 --- a/vfo.c +++ b/vfo.c @@ -82,28 +82,34 @@ void vfo_move(int hz) { setFrequency((entry->frequencyA+ddsOffset-hz)/step*step); else #endif - setFrequency((entry->frequencyA+ddsOffset+hz)/step*step); + if(ctun) { + setFrequency((entry->frequencyA+ddsOffset-hz)/step*step); + } else { + setFrequency((entry->frequencyA+ddsOffset+hz)/step*step); + } 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 - 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; + 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); } - setFrequency(f); #ifdef LIMESDR } #endif @@ -189,7 +195,7 @@ int vfo_update(void *data) { cairo_set_source_rgb (cr, 0, 0, 0); cairo_paint (cr); - cairo_select_font_face(cr, "Arial", + cairo_select_font_face(cr, "FreeMono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); @@ -209,9 +215,8 @@ int vfo_update(void *data) { switch(radio->protocol) { case ORIGINAL_PROTOCOL: case NEW_PROTOCOL: - sprintf(text,"%s (%s %s) %s", + sprintf(text,"%s %s %s", radio->name, - radio->protocol==ORIGINAL_PROTOCOL?"old":"new", version, inet_ntoa(radio->info.network.address.sin_addr)); break; @@ -223,7 +228,7 @@ int vfo_update(void *data) { #endif } cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); - cairo_set_font_size(cr, 12); + cairo_set_font_size(cr, 10); cairo_move_to(cr, 5, 15); cairo_show_text(cr, text); @@ -362,7 +367,7 @@ vfo_press_event_cb (GtkWidget *widget, } else { step_rb=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(step_rb),step_labels[i]); } - gtk_widget_override_font(step_rb, pango_font_description_from_string("Arial 18")); + gtk_widget_override_font(step_rb, pango_font_description_from_string("FreeMono 18")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (step_rb), steps[i]==step); gtk_widget_show(step_rb); gtk_grid_attach(GTK_GRID(grid),step_rb,i%5,i/5,1,1); @@ -373,7 +378,7 @@ vfo_press_event_cb (GtkWidget *widget, 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 18")); + gtk_widget_override_font(close_button, pango_font_description_from_string("FreeMono 18")); gtk_widget_show_all(dialog); g_signal_connect_swapped (dialog, diff --git a/wdsp_init.c b/wdsp_init.c index 34040e2..77496b7 100644 --- a/wdsp_init.c +++ b/wdsp_init.c @@ -155,6 +155,8 @@ fprintf(stderr,"setFilter: %d %d\n",low,high); filterHigh=high; } +fprintf(stderr,"setFilter: filterLow=%d filterHigh=%d\n",filterLow,filterHigh); + double fl=filterLow+ddsOffset; double fh=filterHigh+ddsOffset; @@ -313,7 +315,7 @@ void wdsp_init(int rx,int pixels,int protocol) { receiver=rx; spectrumWIDTH=pixels; - fprintf(stderr,"wdsp_init: %d\n",rx); + fprintf(stderr,"wdsp_init: rx=%d pixels=%d protocol=%d\n",rx,pixels,protocol); if(protocol==ORIGINAL_PROTOCOL) { micSampleRate=sample_rate;