diff --git a/examples/cluster.c b/examples/cluster.c index 62f085c..dd77535 100644 --- a/examples/cluster.c +++ b/examples/cluster.c @@ -12,6 +12,7 @@ #include #include #include +#include typedef struct _hexagram_cluster_state { double rpm, rps, temp, fuel; @@ -21,68 +22,6 @@ static hexagram_cluster_state state = { 0, 0, 0, 0 }; -static void draw_fuel_gauge(cairo_t *cr, - double x, - double y, - double r, - double redline) { - int i; - - cairo_set_source_rgb(cr, 1, 1, 1); - - cairo_arc(cr, x, y, r, 0, 2*M_PI); - cairo_stroke(cr); - - cairo_move_to(cr, x - 0.8 * r, y - 0.1 * r); - cairo_show_text(cr, "0"); - - cairo_move_to(cr, x - 0.15 * r, y - 0.5 * r); - cairo_show_text(cr, "1/2"); - - cairo_move_to(cr, x + 0.65 * r, y - 0.1 * r); - cairo_show_text(cr, "1"); - - /* - * Draw gauge graduations - */ - for (i=0; i<=16; i++) { - if (i <= (16.0 * redline)) { - cairo_set_source_rgb(cr, 1, 0, 0); - } else { - cairo_set_source_rgb(cr, 1, 1, 1); - } - - hexagram_gauge_draw_mark(cr, x, y, - ((i % 4)? 0.8: 0.7) * r, - 0.90 * r, - 300 * (M_PI/180), - 420 * (M_PI/180), - (double)i / 16.0); - } -} - -static void draw_fuel_gauge_needle(cairo_t *cr, - double x, - double y, - double r, - double level) { - if (level > 1.0) { - level = 1.0; - } - - /* - * Draw a tiny boi circle - */ - cairo_set_source_rgb(cr, 1, 1, 1); - cairo_arc(cr, x, y, 0.08 * r, 0, 2*M_PI); - cairo_stroke(cr); - - hexagram_gauge_draw_needle(cr, x, y, 0.9 * r, - 300 * (M_PI/180), - 420 * (M_PI/180), - level / 1.0); -} - static void draw_mfd(cairo_t *cr, double x, double y, @@ -131,11 +70,11 @@ static void cluster_draw_bg(cairo_t *cr, height * 0.13, 240.0); - draw_fuel_gauge(cr, - width * 0.57, - height * 0.76, - height * 0.13, - 0.125); + hexagram_fuel_draw_face(cr, + width * 0.57, + height * 0.76, + height * 0.13, + 0.125); draw_mfd(cr, width * 0.42, @@ -197,11 +136,11 @@ static void cluster_draw(cairo_t *cr, height * 0.13, state.temp); - draw_fuel_gauge_needle(cr, - width * 0.57, - height * 0.76, - height * 0.13, - state.fuel); + hexagram_fuel_draw_needle(cr, + width * 0.57, + height * 0.76, + height * 0.13, + state.fuel); } static int usage(int argc, char **argv, const char *message, ...) { diff --git a/include/hexagram/fuel.h b/include/hexagram/fuel.h new file mode 100644 index 0000000..26002c7 --- /dev/null +++ b/include/hexagram/fuel.h @@ -0,0 +1,16 @@ +#ifndef _HEXAGRAM_FUEL_H +#define _HEXAGRAM_FUEL_H + +void hexagram_fuel_draw_face(cairo_t *cr, + double x, + double y, + double r, + double redline); + +void hexagram_fuel_draw_needle(cairo_t *cr, + double x, + double y, + double r, + double level); + +#endif /* _HEXAGRAM_FUEL_H */ diff --git a/include/hexagram/speedo.h b/include/hexagram/speedo.h new file mode 100644 index 0000000..30fc9c0 --- /dev/null +++ b/include/hexagram/speedo.h @@ -0,0 +1,17 @@ +#ifndef _HEXAGRAM_SPEEDO_H +#define _HEXAGRAM_SPEEDO_H + +#include + +void hexagram_speedo_draw_face(cairo_t *cr, + double x, + double y, + double r); + +void hexagram_speedo_draw_needle(cairo_t *cr, + double x, + double y, + double r, + double kph); + +#endif /* _HEXAGRAM_SPEEDO_H */ diff --git a/include/hexagram/thermo.h b/include/hexagram/thermo.h new file mode 100644 index 0000000..fcc4c58 --- /dev/null +++ b/include/hexagram/thermo.h @@ -0,0 +1,18 @@ +#ifndef _HEXAGRAM_THERMO_H +#define _HEXAGRAM_THERMO_H + +#include + +void hexagram_thermo_draw_face(cairo_t *cr, + double x, + double y, + double r, + double redline); + +void hexagram_thermo_draw_needle(cairo_t *cr, + double x, + double y, + double r, + double temp); + +#endif /* _HEXAGRAM_THERMO_H */ diff --git a/src/Makefile b/src/Makefile index 0567d18..bdc83c5 100644 --- a/src/Makefile +++ b/src/Makefile @@ -8,12 +8,12 @@ CFLAGS += -fPIC -I$(INCLUDE_PATH) $(shell pkg-config --cflags cairo x11) LDFLAGS = $(shell pkg-config --libs cairo x11) -lXext HEADERS = dict.h hash.h can.h capture.h pcapng.h module.h window.h \ - gauge.h tacho.h speedo.h thermo.h sim.h + gauge.h tacho.h speedo.h thermo.h fuel.h sim.h HEADERS_LOCAL = util.h OBJS = dict.o hash.o can.o capture.o pcapng.o module.o window.o \ - gauge.o tacho.o speedo.o thermo.o sim.o + gauge.o tacho.o speedo.o thermo.o fuel.o sim.o VERSION_MAJOR = 0 VERSION_MINOR = 0.1 diff --git a/src/fuel.c b/src/fuel.c new file mode 100644 index 0000000..3771a44 --- /dev/null +++ b/src/fuel.c @@ -0,0 +1,67 @@ +#include + +#include +#include + +void hexagram_fuel_draw_face(cairo_t *cr, + double x, + double y, + double r, + double redline) { + int i; + + cairo_set_source_rgb(cr, 1, 1, 1); + + cairo_arc(cr, x, y, r, 0, 2*M_PI); + cairo_stroke(cr); + + cairo_move_to(cr, x - 0.8 * r, y - 0.1 * r); + cairo_show_text(cr, "0"); + + cairo_move_to(cr, x - 0.15 * r, y - 0.5 * r); + cairo_show_text(cr, "1/2"); + + cairo_move_to(cr, x + 0.65 * r, y - 0.1 * r); + cairo_show_text(cr, "1"); + + /* + * Draw gauge graduations + */ + for (i=0; i<=16; i++) { + if (i <= (16.0 * redline)) { + cairo_set_source_rgb(cr, 1, 0, 0); + } else { + cairo_set_source_rgb(cr, 1, 1, 1); + } + + hexagram_gauge_draw_mark(cr, x, y, + ((i % 4)? 0.8: 0.7) * r, + 0.90 * r, + 300 * (M_PI/180), + 420 * (M_PI/180), + (double)i / 16.0); + } +} + +void hexagram_fuel_draw_needle(cairo_t *cr, + double x, + double y, + double r, + double level) { + if (level > 1.0) { + level = 1.0; + } + + /* + * Draw a tiny boi circle + */ + cairo_set_source_rgb(cr, 1, 1, 1); + cairo_arc(cr, x, y, 0.08 * r, 0, 2*M_PI); + cairo_stroke(cr); + + hexagram_gauge_draw_needle(cr, x, y, 0.9 * r, + 300 * (M_PI/180), + 420 * (M_PI/180), + level / 1.0); +} + diff --git a/src/speedo.c b/src/speedo.c new file mode 100644 index 0000000..2cb7cef --- /dev/null +++ b/src/speedo.c @@ -0,0 +1,69 @@ +#include +#include + +#include +#include + +void hexagram_speedo_draw_face(cairo_t *cr, + double x, + double y, + double r) { + int i; + + cairo_select_font_face(cr, "Helvetica", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + cairo_set_font_size(cr, r * 0.125); + + cairo_set_source_rgb(cr, 1, 1, 1); + cairo_arc(cr, x, y, r, 0, 2*M_PI); + cairo_stroke(cr); + + /* + * Draw face numbers + */ + for (i=0; i<=180; i+=20) { + char text[5]; + + snprintf(text, 4, "%02d", i); + + hexagram_gauge_draw_number(cr, x, y, + 0.85 * r, + 232 * (M_PI/180), + 488 * (M_PI/180), + i / 180.0, + text); + } + + for (i=0; i<=180; i+=2) { + hexagram_gauge_draw_mark(cr, x, y, + ((i % 10)? 0.75: 0.7) * r, + 0.8 * r, + 232 * (M_PI/180), + 488 * (M_PI/180), + i / 180.0); + } +} + +void hexagram_speedo_draw_needle(cairo_t *cr, + double x, + double y, + double r, + double kph) { + if (kph > 290) { + kph = 290; + } + + /* + * Draw a tiny boi circle + */ + cairo_set_source_rgb(cr, 1, 1, 1); + cairo_arc(cr, x, y, 0.08 * r, 0, 2*M_PI); + cairo_stroke(cr); + + hexagram_gauge_draw_needle(cr, x, y, 0.8 * r, + 232 * (M_PI/180), + 488 * (M_PI/180), + kph / 290); +} diff --git a/src/thermo.c b/src/thermo.c new file mode 100644 index 0000000..f983a76 --- /dev/null +++ b/src/thermo.c @@ -0,0 +1,73 @@ +#include + +#include +#include + +void hexagram_thermo_draw_face(cairo_t *cr, + double x, + double y, + double r, + double redline) { + int i; + + cairo_select_font_face(cr, "Helvetica", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + cairo_set_font_size(cr, r * 0.2); + + cairo_set_source_rgb(cr, 1, 1, 1); + cairo_arc(cr, x, y, r, 0, 2*M_PI); + cairo_stroke(cr); + + /* + * Draw face numbers + */ + cairo_move_to(cr, x - 0.8 * r, y - 0.1 * r); + cairo_show_text(cr, "120"); + + cairo_move_to(cr, x - 0.15 * r, y - 0.5 * r); + cairo_show_text(cr, "190"); + + cairo_move_to(cr, x + 0.5 * r, y - 0.1 * r); + cairo_show_text(cr, "260"); + + /* + * Draw gauge graduations + */ + for (i=0; i<=140; i+=7) { + if (i + 120 >= redline) { + cairo_set_source_rgb(cr, 1, 0, 0); + } + + hexagram_gauge_draw_mark(cr, x, y, + ((i % 35)? 0.8: 0.7) * r, + 0.90 * r, + 300 * (M_PI/180), + 420 * (M_PI/180), + i / 140.0); + } +} + +void hexagram_thermo_draw_needle(cairo_t *cr, + double x, + double y, + double r, + double temp) { + if (temp > 260) { + temp = 260; + } + + /* + * Draw a tiny boi circle + */ + cairo_set_source_rgb(cr, 1, 1, 1); + cairo_arc(cr, x, y, 0.08 * r, 0, 2*M_PI); + cairo_stroke(cr); + + hexagram_gauge_draw_needle(cr, x, y, 0.9 * r, + 300 * (M_PI/180), + 420 * (M_PI/180), + temp / 260); +} +