From: John Melton g0orx/n6lyt Date: Fri, 15 Apr 2016 11:08:30 +0000 (+0000) Subject: fixed gpio configuration bugs, added attenuation slider, removed calculus file X-Git-Url: https://git.rkrishnan.org/%5B/specifications?a=commitdiff_plain;h=61bba0b8b5e761c91ee1989aa3eae08f0985cb44;p=pihpsdr.git fixed gpio configuration bugs, added attenuation slider, removed calculus file --- diff --git a/band.c b/band.c index fc35dd2..7bc91c4 100644 --- a/band.c +++ b/band.c @@ -119,19 +119,19 @@ BANDSTACK bandstackGEN={3,1,bandstack_entriesGEN}; BANDSTACK bandstackWWV={5,1,bandstack_entriesWWV}; BAND bands[BANDS] = - {{"160",&bandstack160,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"80",&bandstack80,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"60",&bandstack60,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"40",&bandstack40,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"30",&bandstack30,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"20",&bandstack20,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"18",&bandstack18,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"15",&bandstack15,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"12",&bandstack12,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"10",&bandstack10,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"50",&bandstack50,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, - {"GEN",&bandstackGEN,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,0}, - {"WWV",&bandstackWWV,0,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,0}}; + {{"160",&bandstack160,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"80",&bandstack80,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"60",&bandstack60,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"40",&bandstack40,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"30",&bandstack30,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"20",&bandstack20,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"18",&bandstack18,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"15",&bandstack15,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"12",&bandstack12,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"10",&bandstack10,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"50",&bandstack50,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,30}, + {"GEN",&bandstackGEN,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,0}, + {"WWV",&bandstackWWV,0,0,ALEX_RX_ANTENNA_NONE,ALEX_TX_ANTENNA_1,ALEX_ATTENUATION_0dB,0}}; #define NUM_BAND_LIMITS 22 diff --git a/calculus b/calculus deleted file mode 100644 index 7b51e4f..0000000 Binary files a/calculus and /dev/null differ diff --git a/gpio.c b/gpio.c index 06355af..07aae4c 100644 --- a/gpio.c +++ b/gpio.c @@ -41,7 +41,7 @@ int VFO_ENCODER_A_PIN=0; int VFO_ENCODER_B_PIN=1; #endif int ENABLE_AF_ENCODER=88; -int ENABLE_AF_PULLUP=87; +int ENABLE_AF_PULLUP=0; int AF_ENCODER_A=20; int AF_ENCODER_B=26; int AF_FUNCTION=25; @@ -815,14 +815,25 @@ static int rf_encoder_changed(void *data) { static int agc_encoder_changed(void *data) { int pos=*(int*)data; if(pos!=0) { - double gain=agc_gain; - gain+=(double)pos; - if(gain<0.0) { - gain=0.0; - } else if(gain>120.0) { - gain=120.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<0.0) { + gain=0.0; + } else if(gain>120.0) { + gain=120.0; + } + set_agc_gain(gain); } - set_agc_gain(gain); } return 0; } diff --git a/main.c b/main.c index 1d71259..e276d55 100644 --- a/main.c +++ b/main.c @@ -239,7 +239,7 @@ static void configure_gpio() { 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_column_homogeneous(GTK_GRID(grid),TRUE); gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE); @@ -477,27 +477,24 @@ static void configure_gpio() { //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)); 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; @@ -860,6 +857,10 @@ fprintf(stderr,"meter_height=%d\n",METER_HEIGHT); if(!display_toolbar) { height+=TOOLBAR_HEIGHT; } + } else { + if(!display_sliders) { + height+=SLIDERS_HEIGHT/2; + } } fprintf(stderr,"panadapter_height=%d\n",height); panadapter = panadapter_init(display_width,height); @@ -877,7 +878,11 @@ fprintf(stderr,"panadapter_height=%d\n",height); height+=PANADAPTER_HEIGHT; } if(!display_sliders) { - height+=SLIDERS_HEIGHT; + if(display_panadapter) { + height+=SLIDERS_HEIGHT/2; + } else { + height+=SLIDERS_HEIGHT; + } } if(!display_toolbar) { height+=TOOLBAR_HEIGHT; diff --git a/menu.c b/menu.c index fcc96f8..6cdfec6 100644 --- a/menu.c +++ b/menu.c @@ -159,6 +159,24 @@ static void pa_cb(GtkWidget *widget, gpointer data) { } } +static void rx_dither_cb(GtkWidget *widget, gpointer data) { + rx_dither=rx_dither==1?0:1; + if(protocol==NEW_PROTOCOL) { + } +} + +static void rx_random_cb(GtkWidget *widget, gpointer data) { + rx_random=rx_random==1?0:1; + if(protocol==NEW_PROTOCOL) { + } +} + +static void rx_preamp_cb(GtkWidget *widget, gpointer data) { + rx_preamp=rx_preamp==1?0:1; + if(protocol==NEW_PROTOCOL) { + } +} + static void tx_out_of_band_cb(GtkWidget *widget, gpointer data) { tx_out_of_band=tx_out_of_band==1?0:1; @@ -206,6 +224,16 @@ static void oc_tx_cb(GtkWidget *widget, gpointer data) { } } +static void oc_tune_cb(GtkWidget *widget, gpointer data) { + int oc=((int)data)&0xF; + int mask=0x01<OCtune&mask)==mask); + gtk_widget_show(oc_tune_b); + gtk_grid_attach(GTK_GRID(oc_grid),oc_tune_b,j+14,i+2,1,1); + g_signal_connect(oc_tune_b,"toggled",G_CALLBACK(oc_tune_cb),(gpointer)(j+(i<<4))); +*/ } } + int mask; + for(j=1;j<8;j++) { + char oc_id[8]; + sprintf(oc_id,"%d",j); + GtkWidget *oc_tune_title=gtk_label_new(oc_id); + //gtk_widget_override_font(oc_tune_title, pango_font_description_from_string("Arial 18")); + gtk_widget_show(oc_tune_title); + gtk_grid_attach(GTK_GRID(oc_grid),oc_tune_title,18,j+2,1,1); + + mask=0x01<device!=DEVICE_METIS || atlas_penelope) { if(tune) { gain=65535.0*255.0/(double)tune_drive; } else { @@ -551,109 +538,80 @@ static void process_bandscope_buffer(char *buffer) { void ozy_send_buffer() { - output_buffer[0]=SYNC; - output_buffer[1]=SYNC; - output_buffer[2]=SYNC; + + output_buffer[SYNC0]=SYNC; + output_buffer[SYNC1]=SYNC; + output_buffer[SYNC2]=SYNC; switch(command) { -#ifdef EXCLUDE case 0: - //sem_wait(&frequency_changed_sem); - if(frequencyChanged) { - // send rx frequency - output_buffer[3]=control_out[0]|0x04; - output_buffer[4]=ddsFrequency>>24; - output_buffer[5]=ddsFrequency>>16; - output_buffer[6]=ddsFrequency>>8; - output_buffer[7]=ddsFrequency; - //freqcommand++; - } else { - output_buffer[3]=control_out[0]; - output_buffer[4]=control_out[1]; - output_buffer[5]=control_out[2]; - output_buffer[6]=control_out[3]; - output_buffer[7]=control_out[4]; + { + BAND *band=band_get_current_band(); + + output_buffer[C0]=0x00; + + output_buffer[C1]=0x00; + switch(sample_rate) { + case 48000: + output_buffer[C1]|=SPEED_48K; + break; + case 96000: + output_buffer[C1]|=SPEED_96K; + break; + case 192000: + output_buffer[C1]|=SPEED_192K; + break; + case 384000: + output_buffer[C1]|=SPEED_384K; + break; } - //sem_post(&frequency_changed_sem); - break; - case 1: - // send tx frequency - output_buffer[3]=control_out[0]|0x02; -/* - if(bSplit) { - if(frequencyBChanged) { - output_buffer[3]=control_out[0]|0x02; // Penelope - output_buffer[4]=ddsBFrequency>>24; - output_buffer[5]=ddsBFrequency>>16; - output_buffer[6]=ddsBFrequency>>8; - output_buffer[7]=ddsBFrequency; - } else { - output_buffer[3]=control_out[0]; - output_buffer[4]=control_out[1]; - output_buffer[5]=control_out[2]; - output_buffer[6]=control_out[3]; - output_buffer[7]=control_out[4]; + if(d->device==DEVICE_METIS) { + } + + output_buffer[C2]=0x00; + if(classE) { + output_buffer[C2]|=0x01; + } + if(isTransmitting()) { + output_buffer[C2]|=band->OCtx; + if(tune) { + output_buffer[C2]|=OCtune; } } else { -*/ - //sem_wait(&frequency_changed_sem); - if(frequencyChanged) { - output_buffer[4]=ddsFrequency>>24; - output_buffer[5]=ddsFrequency>>16; - output_buffer[6]=ddsFrequency>>8; - output_buffer[7]=ddsFrequency; - } else { - output_buffer[3]=control_out[0]; - output_buffer[4]=control_out[1]; - output_buffer[5]=control_out[2]; - output_buffer[6]=control_out[3]; - output_buffer[7]=control_out[4]; - } - frequencyChanged=0; - //sem_post(&frequency_changed_sem); -/* + output_buffer[C2]|=band->OCrx; + } + +// TODO - add Alex Attenuation and Alex Antenna + output_buffer[C3]=0x00; + if(rx_random) { + output_buffer[C3]|=LT2208_RANDOM_ON; + } + if(rx_dither) { + output_buffer[C3]|=LT2208_DITHER_ON; } -*/ /* - frequencyBChanged=0; + if(rx_preamp) { + output_buffer[C3]|=LT2208_GAIN_ON; + } */ - break; - case 2: - output_buffer[3]=control_out[0]; - output_buffer[4]=control_out[1]; - output_buffer[5]=control_out[2]; - output_buffer[6]=control_out[3]; - output_buffer[7]=control_out[4]; - break; -#endif - case 0: - { - BAND *band=band_get_current_band(); - output_buffer[3]=control_out[0]; - output_buffer[4]=control_out[1]; - if(isTransmitting()) { - output_buffer[5]=control_out[2]|band->OCtx; - } else { - output_buffer[5]=control_out[2]|band->OCrx; - } - output_buffer[6]=control_out[3]; - output_buffer[7]=control_out[4]; +// TODO - add Alex TX relay, duplex, receivers Mercury board frequency + output_buffer[C4]=0x00; } break; case 1: - output_buffer[3]=control_out[0]|0x04; - output_buffer[4]=ddsFrequency>>24; - output_buffer[5]=ddsFrequency>>16; - output_buffer[6]=ddsFrequency>>8; - output_buffer[7]=ddsFrequency; + output_buffer[C0]=0x04; + output_buffer[C1]=ddsFrequency>>24; + output_buffer[C2]=ddsFrequency>>16; + output_buffer[C3]=ddsFrequency>>8; + output_buffer[C4]=ddsFrequency; break; case 2: - output_buffer[3]=control_out[0]|0x02; - output_buffer[4]=ddsFrequency>>24; - output_buffer[5]=ddsFrequency>>16; - output_buffer[6]=ddsFrequency>>8; - output_buffer[7]=ddsFrequency; + output_buffer[C0]=0x02; + output_buffer[C1]=ddsFrequency>>24; + output_buffer[C2]=ddsFrequency>>16; + output_buffer[C3]=ddsFrequency>>8; + output_buffer[C4]=ddsFrequency; break; case 3: { @@ -664,95 +622,105 @@ void ozy_send_buffer() { BAND *band=band_get_current_band(); d=(d/100.0F)*(float)band->pa_calibration; - output_buffer[3]=0x12; - output_buffer[4]=(int)d; - output_buffer[5]=control_out[2]; + output_buffer[C0]=0x12; + output_buffer[C1]=(int)d; + output_buffer[C2]=0x00; if(mic_boost) { - output_buffer[5]|=0x01; + output_buffer[C2]|=0x01; } if(mic_linein) { - output_buffer[5]|=0x02; + output_buffer[C2]|=0x02; } if(filter_board==APOLLO) { - output_buffer[5]|=0x2C; // board, filter ,tuner + output_buffer[C2]|=0x2C; // board, filter ,tuner } if((filter_board==APOLLO) && tune && apollo_tuner) { - output_buffer[5]|=0x10; + output_buffer[C2]|=0x10; + } + output_buffer[C3]=0x00; + if(band_get_current()==band6) { + output_buffer[C3]=output_buffer[6]|0x40; // Alex 6M low noise amplifier } - output_buffer[6]=control_out[3]; - output_buffer[7]=control_out[4]; + output_buffer[C4]=0x00; } break; case 4: - // need to add orion tip/ring and bias configuration - output_buffer[3]=0x14; - output_buffer[4]=0x00; + output_buffer[C0]=0x14; + output_buffer[C1]=0x00; if(mic_ptt_enabled==0) { - output_buffer[4]|=0x40; + output_buffer[C1]|=0x40; } if(mic_bias_enabled) { - output_buffer[4]|=0x20; + output_buffer[C1]|=0x20; } if(mic_ptt_tip_bias_ring) { - output_buffer[4]|=0x10; + output_buffer[C1]|=0x10; + } + output_buffer[C2]=0x00; + output_buffer[C3]=0x00; + + if(d->device==DEVICE_HERMES || d->device==DEVICE_ANGELIA || d->device==DEVICE_ORION) { + output_buffer[C4]=0x20|attenuation; + } else { + output_buffer[C4]=0x00; } - output_buffer[5]=0x00; - output_buffer[6]=0x00; - output_buffer[7]=0x00; break; case 5: - // need to add rx attenuation and cw configuration - output_buffer[3]=0x16; - output_buffer[4]=0x00; - output_buffer[5]=0x00; + // need to add adc 2 and 3 attenuation + output_buffer[C0]=0x16; + output_buffer[C1]=0x00; + output_buffer[C2]=0x00; if(cw_keys_reversed!=0) { - output_buffer[5]|=0x40; + output_buffer[C2]|=0x40; } - output_buffer[6]=cw_keyer_speed | (cw_keyer_mode<<6); - output_buffer[7]=cw_keyer_weight | (cw_keyer_spacing<<7); + output_buffer[C3]=cw_keyer_speed | (cw_keyer_mode<<6); + output_buffer[C4]=cw_keyer_weight | (cw_keyer_spacing<<7); break; case 6: // need to add tx attenuation and rx ADC selection - output_buffer[3]=0x1C; - output_buffer[4]=0x00; - output_buffer[5]=0x00; - output_buffer[6]=0x00; - output_buffer[7]=0x00; + output_buffer[C0]=0x1C; + output_buffer[C1]=0x00; + output_buffer[C2]=0x00; + output_buffer[C3]=0x00; + output_buffer[C4]=0x00; break; case 7: // need to add cw configuration - output_buffer[3]=0x1E; + output_buffer[C0]=0x1E; if(cw_keyer_internal==1) { if(isTransmitting() || (mode!=modeCWU && mode!=modeCWL)) { - output_buffer[4]=0x00; + output_buffer[C1]=0x00; } else { - output_buffer[4]=0x01; + output_buffer[C1]=0x01; } } else { - output_buffer[4]=0x00; + output_buffer[C1]=0x00; } - output_buffer[5]=cw_keyer_sidetone_volume; - output_buffer[6]=cw_keyer_ptt_delay; - output_buffer[7]=0x00; + output_buffer[C2]=cw_keyer_sidetone_volume; + output_buffer[C3]=cw_keyer_ptt_delay; + output_buffer[C4]=0x00; break; case 8: // need to add cw configuration - output_buffer[3]=0x20; - output_buffer[4]=cw_keyer_hang_time; - output_buffer[5]=cw_keyer_hang_time>>8; - output_buffer[6]=cw_keyer_sidetone_frequency; - output_buffer[7]=cw_keyer_sidetone_frequency>>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; break; } command++; - //if(command>=14) { - if(command>=8) { - command=0; - } + if(command>8) { + command=0; + } + // set mox - output_buffer[3]|=isTransmitting(); + output_buffer[C0]|=isTransmitting(); metis_write(0x02,output_buffer,OZY_BUFFER_SIZE); + + //fprintf(stderr,"C0=%02X C1=%02X C2=%02X C3=%02X C4=%02X\n", + // output_buffer[C0],output_buffer[C1],output_buffer[C2],output_buffer[C3],output_buffer[C4]); } static int metis_write(unsigned char ep,char* buffer,int length) { diff --git a/panadapter.c b/panadapter.c index 5741463..f5d4f26 100644 --- a/panadapter.c +++ b/panadapter.c @@ -284,15 +284,15 @@ void panadapter_update(float *data,int tx) { // signal double s1,s2; - samples[0]=panadapter_low-20; - samples[display_width-1]=panadapter_low-20; - s1=samples[0]-(get_attenuation()-20.0); + samples[0]=-200.0; + samples[display_width-1]=-200.0; + s1=(double)samples[0]+(double)get_attenuation()-20.0; s1 = floor((panadapter_high - s1) * (double) panadapter_height / (panadapter_high - panadapter_low)); cairo_move_to(cr, 0.0, s1); for(i=1;ifrequencyA)); -// sprintf(sf,"Step %dHz",step); -// cairo_move_to(cr, 10, 25); -// cairo_show_text(cr, sf); + sprintf(sf,"Step %dHz",step); + cairo_move_to(cr, (my_width/2)+20, 15); + cairo_show_text(cr, sf); if(locked) { cairo_set_source_rgb(cr, 1, 0, 0);