From 13b2c285df72ceb1f4d561ecd3f9469d5063903c Mon Sep 17 00:00:00 2001 From: Ramakrishnan Muthukrishnan Date: Wed, 22 Nov 2023 20:43:38 +0530 Subject: [PATCH] move vfo coordinates, colours etc into another file Ideally these should go into a CSS file, but that would be the next step. --- Makefile | 9 +-- screen.c | 32 ++++++++ screen.h | 111 +++++++++++----------------- vfo.c | 220 +++++++++++++++++++++++++++++-------------------------- 4 files changed, 194 insertions(+), 178 deletions(-) create mode 100644 screen.c diff --git a/Makefile b/Makefile index a7a9307..d0e5ef1 100644 --- a/Makefile +++ b/Makefile @@ -258,9 +258,8 @@ i2c.c \ gpio.c \ encoder_menu.c \ switch_menu.c \ -toolbar_menu.c - - +toolbar_menu.c \ +screen.c HEADERS= \ agc.h \ @@ -340,7 +339,6 @@ switch_menu.h \ toolbar_menu.h \ screen.h - OBJS= \ band.o \ discovered.o \ @@ -415,7 +413,8 @@ i2c.o \ gpio.o \ encoder_menu.o \ switch_menu.o \ -toolbar_menu.o +toolbar_menu.o \ +screen.o $(PROGRAM): $(OBJS) $(AUDIO_OBJS) $(REMOTE_OBJS) $(USBOZY_OBJS) \ $(LOCALCW_OBJS) $(PURESIGNAL_OBJS) \ diff --git a/screen.c b/screen.c new file mode 100644 index 0000000..c3006fc --- /dev/null +++ b/screen.c @@ -0,0 +1,32 @@ +#include "screen.h" + +const colour_t grey = { GREY_R, GREY_G, GREY_B }; +const colour_t red = { RED_R, RED_G, RED_B}; +const colour_t black = { BLACK_R, BLACK_G, BLACK_B }; +const colour_t white = { WHITE_R, WHITE_G, WHITE_B }; +const colour_t yellow = { YELLOW_R, YELLOW_G, YELLOW_B }; +const colour_t cyan = { CYAN_R, CYAN_G, CYAN_B }; +const colour_t green = { GREEN_R, GREEN_G, GREEN_B }; +const colour_t dark_green = { DARK_GREEN_R, DARK_GREEN_G, DARK_GREEN_B }; + +widget_props_t default_widget_prop_table[NUM_ACTIVE_BUTTONS] = { + // label, x, y, font_size, off_colour, on_colour + [SCR_VFO_A] = { "", 285, 95, 70, white, green }, + [SCR_VFO_B] = { "", 285, 18, 18, grey, cyan }, + [SCR_ACTIVE_VFO] = { "", 400, 20, 18, yellow, yellow }, + [SCR_MODE] = { "MODE", 70, 80, 30, yellow, yellow }, + [SCR_PS] = { "PS", 120, 50, 12, yellow, grey }, + [SCR_RIT] = { "RIT", 220, 40, 16, red, grey }, + [SCR_XIT] = { "XIT", 220, 20, 16, red, grey }, + [SCR_NB] = { "NB", 115, 40, 16, yellow, grey }, + [SCR_NR] = { "NR", 70, 40, 16, yellow, grey }, + [SCR_ANF] = { "ANF", 70, 20, 16, yellow, grey }, + [SCR_SNB] = { "SNB", 115, 20, 16, yellow, grey }, + [SCR_MIDI] = { "MIDI", 480, 20, 16, yellow, grey }, + [SCR_AGC] = { "AGC", 160, 20, 16, yellow, grey }, + [SCR_VOX] = { "VOX", 160, 40, 16, red, grey }, + [SCR_LOCK] = { "LOCK", 5, 80, 16, red, grey }, + [SCR_CTUN] = { "CTUN", 5, 40, 16, yellow, grey }, + [SCR_SPLIT] = { "SPLIT", 5, 20, 16, red, grey, }, + [SCR_DUP] = {"DUP", 5, 60, 16, red, grey }, +}; diff --git a/screen.h b/screen.h index c61c49c..39d2dcf 100644 --- a/screen.h +++ b/screen.h @@ -1,9 +1,12 @@ #ifndef _SCREEN_H #define _SCREEN_H +#include + #define MENU_HEIGHT (50) #define MENU_WIDTH (50) -// so menu height x 2 == meter height (but we still have 20 pixels + +// menu height x 2 == meter height (but we still have 20 pixels // empty. #define METER_HEIGHT (100) // edit default = 60 #define METER_WIDTH (240) @@ -13,6 +16,43 @@ #define TOOLBAR_HEIGHT (30) #define WATERFALL_HEIGHT (105) +typedef struct colour { + float r; + float g; + float b; +} colour_t; + +typedef struct widget_props { + char *label; + size_t x; + size_t y; + size_t font_size; + colour_t on; + colour_t off; +} widget_props_t; + +enum on_screen_buttons { + SCR_VFO_A = 0, + SCR_VFO_B, + SCR_ACTIVE_VFO, + SCR_MODE, + SCR_PS, + SCR_RIT, + SCR_XIT, + SCR_NB, + SCR_NR, + SCR_ANF, + SCR_SNB, + SCR_MIDI, + SCR_AGC, + SCR_VOX, + SCR_LOCK, + SCR_CTUN, + SCR_SPLIT, + SCR_DUP, + NUM_ACTIVE_BUTTONS, +}; + // define a type and coordinates for various widgets on the screen. #define VFO_HEIGHT (100) #define VFO_WIDTH (display_width - METER_WIDTH - MENU_WIDTH) @@ -49,73 +89,6 @@ #define GREY_G (0.7) #define GREY_B (0.7) -// font/typeface sizes - -#define MODE_RENDER_FONT_SIZE (30) -#define VFO_A_RENDER_FONT_SIZE (70) -#define VFO_B_RENDER_FONT_SIZE (18) -#define ACTIVE_VFO_INDICATION_SIZE (18) -#define PS_RENDER_FONT_SIZE (12) -#define RIT_RENDER_FONT_SIZE (16) -#define XIT_RENDER_FONT_SIZE (16) -#define NB_RENDER_FONT_SIZE (16) -#define NR_RENDER_FONT_SIZE (16) -#define DUP_RENDER_FONT_SIZE (16) -#define SPLIT_RENDER_FONT_SIZE (16) -// coordinates - -#define MODE_X 70 -#define MODE_Y 80 - -#define VFO_A_X 285 -#define VFO_A_Y 95 - -#define VFO_B_X 285 -#define VFO_B_Y 18 - -#define ACTIVE_VFO_INDICATION_X 400 -#define ACTIVE_VFO_INDICATION_Y 20 - -#define PS_X 130 -#define PS_Y 50 - -#define RIT_X 220 -#define RIT_Y 40 - -#define XIT_X 220 -#define XIT_Y 20 - -#define NB_X 115 -#define NB_Y 40 - -#define NR_X 70 -#define NR_Y 40 - -#define ANF_X 70 -#define ANF_Y 20 - -#define SNB_X 115 -#define SNB_Y 20 - -#define AGC_X 160 -#define AGC_Y 20 - -#define MIDI_X 480 -#define MIDI_Y 20 - -#define VOX_X 160 -#define VOX_Y 40 - -#define LOCK_X 5 -#define LOCK_Y 80 - -#define SPLIT_X 5 -#define SPLIT_Y 20 - -#define CTUN_X 5 -#define CTUN_Y 40 - -#define DUP_X 5 -#define DUP_Y 60 +extern widget_props_t default_widget_prop_table[]; #endif // _SCREEN_H diff --git a/vfo.c b/vfo.c index d020e3f..015ced6 100644 --- a/vfo.c +++ b/vfo.c @@ -1046,10 +1046,12 @@ void vfo_update(void) { break; } + widget_props_t *entry; // draw mode - cairo_set_font_size(cr, MODE_RENDER_FONT_SIZE); - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); - cairo_move_to(cr, MODE_X, MODE_Y); + entry = &default_widget_prop_table[SCR_MODE]; + cairo_set_font_size(cr, entry->font_size); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); + cairo_move_to(cr, entry->x, entry->y); cairo_show_text(cr, temp_text); // In what follows, we want to display the VFO frequency @@ -1082,6 +1084,7 @@ void vfo_update(void) { if (s >= STEPS) s = 0; + entry = &default_widget_prop_table[SCR_VFO_A]; // draw VFO A cairo_select_font_face(cr, "Cantarell", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); @@ -1103,8 +1106,8 @@ void vfo_update(void) { cairo_set_source_rgb(cr, DARK_GREEN_R, DARK_GREEN_G, DARK_GREEN_B); } } - cairo_move_to(cr, VFO_A_X, VFO_A_Y); - cairo_set_font_size(cr, VFO_A_RENDER_FONT_SIZE); + cairo_move_to(cr, entry->x, entry->y); + cairo_set_font_size(cr, entry->font_size); // cairo_show_text(cr, temp_text); // try to show VFO text according to step value @@ -1150,202 +1153,207 @@ void vfo_update(void) { } } - cairo_move_to(cr, VFO_B_X, VFO_B_Y); - cairo_set_font_size(cr, VFO_B_RENDER_FONT_SIZE); + // show vfo-b + entry = &default_widget_prop_table[SCR_VFO_B]; + cairo_move_to(cr, entry->x, entry->y); + cairo_set_font_size(cr, entry->font_size); cairo_show_text(cr, temp_text); // show the currently active VFO. - cairo_set_source_rgb(cr, - YELLOW_R, - YELLOW_G, - YELLOW_B); sprintf(temp_text, "%c", active_receiver->active_vfo == 0 ? 'A' : 'B'); - cairo_move_to(cr, - ACTIVE_VFO_INDICATION_X, - ACTIVE_VFO_INDICATION_Y); - cairo_set_font_size(cr, ACTIVE_VFO_INDICATION_SIZE); + entry = &default_widget_prop_table[SCR_ACTIVE_VFO]; + cairo_move_to(cr, entry->x, entry->y); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); + cairo_set_font_size(cr, entry->font_size); cairo_show_text(cr, temp_text); #ifdef PURESIGNAL if (can_transmit) { - cairo_move_to(cr, PS_X, PS_Y); + entry = &default_widget_prop_table[SCR_PS]; + cairo_move_to(cr, entry->x, entry->y); if (transmitter->puresignal) { - cairo_set_source_rgb(cr, - YELLOW_R, - YELLOW_G, - YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } else { - cairo_set_source_rgb(cr, - GREY_R, - GREY_G, - GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } - cairo_set_font_size(cr, PS_RENDER_FONT_SIZE); - cairo_show_text(cr, "PS"); + cairo_set_font_size(cr, entry->font_size); + cairo_show_text(cr, entry->label); } #endif + // RIT + entry = &default_widget_prop_table[SCR_RIT]; + cairo_move_to(cr, entry->x, entry->y); if (vfo[id].rit_enabled == 0) { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } else { - cairo_set_source_rgb(cr, RED_R, RED_G, RED_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } sprintf(temp_text, "RIT: %lld", vfo[id].rit); - cairo_move_to(cr, RIT_X, RIT_Y); - cairo_set_font_size(cr, RIT_RENDER_FONT_SIZE); + cairo_set_font_size(cr, entry->font_size); cairo_show_text(cr, temp_text); if (can_transmit) { + entry = &default_widget_prop_table[SCR_XIT]; + cairo_move_to(cr, entry->x, entry->y); if (transmitter->xit_enabled == 0) { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } else { - cairo_set_source_rgb(cr, RED_R, RED_G, RED_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } sprintf(temp_text, "XIT: %lld", transmitter->xit); - cairo_move_to(cr, XIT_X, XIT_Y); - cairo_set_font_size(cr, XIT_RENDER_FONT_SIZE); + + cairo_set_font_size(cr, entry->font_size); cairo_show_text(cr, temp_text); } // NB and NB2 are mutually exclusive, therefore // they are put to the same place in order to save // some space - cairo_move_to(cr, NB_X, NB_Y); - cairo_set_font_size(cr, NB_RENDER_FONT_SIZE); + entry = &default_widget_prop_table[SCR_NB]; + cairo_move_to(cr, entry->x, entry->y); + cairo_set_font_size(cr, entry->font_size); if (active_receiver->nb) { - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); - cairo_show_text(cr, "NB"); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); + cairo_show_text(cr, "NB"); } else if (active_receiver->nb2) { - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); - cairo_show_text(cr, "NB2"); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); + cairo_show_text(cr, "NB2"); } else { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); cairo_show_text(cr, "NB"); } + // NR // NR, NR2, NR3 and NR4 are mutually exclusive - cairo_move_to(cr, NR_X, NR_Y); + entry = &default_widget_prop_table[SCR_NR]; + cairo_move_to(cr, entry->x, entry->y); if (active_receiver->nr) { - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); cairo_show_text(cr, "NR"); } else if (active_receiver->nr2) { - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); cairo_show_text(cr, "NR2"); } else if (active_receiver->nr3) { - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); cairo_show_text(cr, "NR3"); } else if (active_receiver->nr4) { - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); - cairo_show_text(cr, "NR4"); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); + cairo_show_text(cr, "NR4"); } else { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); cairo_show_text(cr, "NR"); } - cairo_move_to(cr, ANF_X, ANF_Y); + // anf + entry = &default_widget_prop_table[SCR_ANF]; + cairo_move_to(cr, entry->x, entry->y); if (active_receiver->anf) { - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } else { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } - cairo_show_text(cr, "ANF"); + cairo_show_text(cr, entry->label); - cairo_move_to(cr, SNB_X, SNB_Y); + // snb + entry = &default_widget_prop_table[SCR_SNB]; + cairo_move_to(cr, entry->x, entry->y); if (active_receiver->snb) { - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } else { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } - cairo_show_text(cr, "SNB"); + cairo_show_text(cr, entry->label); - cairo_move_to(cr, AGC_X, AGC_Y); + // agc + entry = &default_widget_prop_table[SCR_AGC]; + cairo_move_to(cr, entry->x, entry->y); switch (active_receiver->agc) { case AGC_OFF: - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); cairo_show_text(cr, "AGC"); break; case AGC_LONG: - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); cairo_show_text(cr, "AGC L"); break; case AGC_SLOW: - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); - cairo_show_text(cr, "AGC S"); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); + cairo_show_text(cr, "AGC S"); break; case AGC_MEDIUM: - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); cairo_show_text(cr, "AGC M"); break; case AGC_FAST: - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); cairo_show_text(cr, "AGC F"); break; } #ifdef MIDI - cairo_move_to(cr, MIDI_X, MIDI_Y); + entry = &default_widget_prop_table[SCR_MIDI]; + cairo_move_to(cr, entry->x, entry->y); if (midi_enabled) { - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } else { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } - cairo_show_text(cr, "MIDI"); + cairo_show_text(cr, entry->label); #endif if (can_transmit) { - cairo_move_to(cr, VOX_X, VOX_Y); + entry = &default_widget_prop_table[SCR_VOX]; + cairo_move_to(cr, entry->x, entry->y); if (vox_enabled) { - cairo_set_source_rgb(cr, RED_R, RED_G, RED_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } else { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } - cairo_show_text(cr, "VOX"); + cairo_show_text(cr, entry->label); } - cairo_move_to(cr, LOCK_X, LOCK_Y); + // lock + entry = &default_widget_prop_table[SCR_LOCK]; + cairo_move_to(cr, entry->x, entry->y); if (locked) { - cairo_set_source_rgb(cr, RED_R, RED_G, RED_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } else { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } - cairo_show_text(cr, "LOCK"); + cairo_show_text(cr, entry->label); - cairo_move_to(cr, SPLIT_X, SPLIT_Y); + // split + entry = &default_widget_prop_table[SCR_SPLIT]; + cairo_move_to(cr, entry->x, entry->y); if (split) { - cairo_set_source_rgb(cr, RED_R, RED_G, RED_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } else { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } - cairo_set_font_size(cr, SPLIT_RENDER_FONT_SIZE); - cairo_show_text(cr, "SPLIT"); + cairo_set_font_size(cr, entry->font_size); + cairo_show_text(cr, entry->label); - cairo_move_to(cr, CTUN_X, CTUN_Y); + // Ctun + entry = &default_widget_prop_table[SCR_CTUN]; + cairo_move_to(cr, entry->x, entry->y); if (vfo[id].ctun) { - cairo_set_source_rgb(cr, YELLOW_R, YELLOW_G, YELLOW_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } else { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } - cairo_show_text(cr, "CTUN"); - /* if(sat_mode!=SAT_NONE) { */ - /* cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); */ - /* } else { */ - /* cairo_set_source_rgb(cr, 0.7, 0.7, 0.7); */ - /* } */ - /* cairo_set_font_size(cr, 16); */ - /* if(sat_mode==SAT_NONE || sat_mode==SAT_MODE) { */ - /* cairo_show_text(cr, "SAT"); */ - /* } else { */ - /* cairo_show_text(cr, "RSAT"); */ - /* } */ + cairo_show_text(cr, entry->label); + // dup + entry = &default_widget_prop_table[SCR_DUP]; + cairo_move_to(cr, entry->x, entry->y); if (duplex) { - cairo_set_source_rgb(cr, RED_R, RED_G, RED_B); + cairo_set_source_rgb(cr, entry->on.r, entry->on.g, entry->on.b); } else { - cairo_set_source_rgb(cr, GREY_R, GREY_G, GREY_B); + cairo_set_source_rgb(cr, entry->off.r, entry->off.g, entry->off.b); } - sprintf(temp_text, "DUP"); - cairo_move_to(cr, DUP_X, DUP_Y); - cairo_set_font_size(cr, DUP_RENDER_FONT_SIZE); + sprintf(temp_text, entry->label); + cairo_set_font_size(cr, entry->font_size); cairo_show_text(cr, temp_text); cairo_destroy(cr); @@ -1359,13 +1367,14 @@ static gboolean vfo_press_event_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) { // vfo a and b are drawn at x = 280, so it is the y coordinate // that matters. - if (event->x >= VFO_B_X && event->y <= VFO_B_Y) { + if (event->x >= default_widget_prop_table[SCR_VFO_B].x && + event->y <= default_widget_prop_table[SCR_VFO_B].y) { // vfo B start_vfo(VFO_B); return TRUE; - } else if (event->x >= VFO_A_X && - event->y > VFO_B_Y && - event->y <= VFO_A_Y) { + } else if (event->x >= default_widget_prop_table[SCR_VFO_A].x && + event->y > default_widget_prop_table[SCR_VFO_B].y && + event->y <= default_widget_prop_table[SCR_VFO_A].y) { // vfo A start_vfo(VFO_A); return TRUE; @@ -1374,6 +1383,9 @@ static gboolean vfo_press_event_cb(GtkWidget *widget, GdkEventButton *event, return FALSE; } +void draw_element(size_t index, char *buf) { +} + GtkWidget *vfo_init(int width, int height, GtkWidget *parent) { fprintf(stderr, "vfo_init: width=%d height=%d\n", width, height); -- 2.45.2