diff --git a/examples/cluster.c b/examples/cluster.c index 0a90296..f8fc568 100644 --- a/examples/cluster.c +++ b/examples/cluster.c @@ -8,6 +8,7 @@ #include #include +#include typedef struct _hexagram_cluster_state { double rpm, rps, temp, fuel; @@ -17,70 +18,6 @@ static hexagram_cluster_state state = { 0, 0, 0, 0 }; -static void draw_needle(cairo_t *cr, - double x, - double y, - double r, - double min_angle, - double max_angle, - double value) { - double angle = min_angle + ((max_angle - min_angle) * value) - (M_PI/2); - - cairo_move_to(cr, x, y); - - cairo_set_source_rgb(cr, 0, 0.25, 1.0); - - cairo_line_to(cr, - x + r * cos(angle), - y + r * sin(angle)); - - cairo_stroke(cr); -} - -static void draw_face_number(cairo_t *cr, - double x, - double y, - double r, - double min_angle, - double max_angle, - double value, - const char *text) { - double angle = min_angle + ((max_angle - min_angle) * value) - 1.658; - - cairo_set_source_rgb(cr, 1, 1, 1); - - cairo_move_to(cr, - x + r * cos(angle), - y + r * sin(angle)); - - cairo_save(cr); - cairo_rotate(cr, angle + 1.658); - cairo_show_text(cr, text); - cairo_stroke(cr); - cairo_restore(cr); -} - -static void draw_face_mark(cairo_t *cr, - double x, - double y, - double min_r, - double max_r, - double min_angle, - double max_angle, - double value) { - double angle = min_angle + ((max_angle - min_angle) * value) - (M_PI/2); - - cairo_move_to(cr, - x + min_r * cos(angle), - y + min_r * sin(angle)); - - cairo_line_to(cr, - x + max_r * cos(angle), - y + max_r * sin(angle)); - - cairo_stroke(cr); -} - static void draw_tachometer_needle(cairo_t *cr, double x, double y, @@ -97,10 +34,10 @@ static void draw_tachometer_needle(cairo_t *cr, cairo_arc(cr, x, y, 0.08 * r, 0, 2*M_PI); cairo_stroke(cr); - draw_needle(cr, x, y, 0.8 * r, - 232 * (M_PI/180), - 488 * (M_PI/180), - rpm / 8000); + hexagram_gauge_draw_needle(cr, x, y, 0.8 * r, + 232 * (M_PI/180), + 488 * (M_PI/180), + rpm / 8000); } static void draw_tachometer(cairo_t *cr, @@ -128,12 +65,12 @@ static void draw_tachometer(cairo_t *cr, snprintf(text, 3, "%02d", i); - draw_face_number(cr, x, y, - 0.85 * r, - 232 * (M_PI/180), - 488 * (M_PI/180), - i / 80.0, - text); + hexagram_gauge_draw_number(cr, x, y, + 0.85 * r, + 232 * (M_PI/180), + 488 * (M_PI/180), + i / 80.0, + text); } for (i=0; i<=80; i++) { @@ -142,19 +79,19 @@ static void draw_tachometer(cairo_t *cr, } if (i % 5 == 0) { - draw_face_mark(cr, x, y, - 0.7 * r, - 0.8 * r, - 232 * (M_PI/180), - 488 * (M_PI/180), - i / 80.0); + hexagram_gauge_draw_mark(cr, x, y, + 0.7 * r, + 0.8 * r, + 232 * (M_PI/180), + 488 * (M_PI/180), + i / 80.0); } else { - draw_face_mark(cr, x, y, - 0.75 * r, - 0.8 * r, - 232 * (M_PI/180), - 488 * (M_PI/180), - i / 80.0); + hexagram_gauge_draw_mark(cr, x, y, + 0.75 * r, + 0.8 * r, + 232 * (M_PI/180), + 488 * (M_PI/180), + i / 80.0); } } } @@ -183,30 +120,21 @@ static void draw_speedometer(cairo_t *cr, snprintf(text, 4, "%02d", i); - draw_face_number(cr, x, y, - 0.85 * r, - 232 * (M_PI/180), - 488 * (M_PI/180), - i / 180.0, - text); + 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) { - if (i % 10 == 0) { - draw_face_mark(cr, x, y, - 0.7 * r, - 0.8 * r, - 232 * (M_PI/180), - 488 * (M_PI/180), - i / 180.0); - } else { - draw_face_mark(cr, x, y, - 0.75 * r, - 0.8 * r, - 232 * (M_PI/180), - 488 * (M_PI/180), - i / 180.0); - } + 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); } } @@ -226,10 +154,10 @@ static void draw_speedometer_needle(cairo_t *cr, cairo_arc(cr, x, y, 0.08 * r, 0, 2*M_PI); cairo_stroke(cr); - draw_needle(cr, x, y, 0.8 * r, - 232 * (M_PI/180), - 488 * (M_PI/180), - kph / 290); + hexagram_gauge_draw_needle(cr, x, y, 0.8 * r, + 232 * (M_PI/180), + 488 * (M_PI/180), + kph / 290); } static void draw_thermometer(cairo_t *cr, @@ -269,21 +197,12 @@ static void draw_thermometer(cairo_t *cr, cairo_set_source_rgb(cr, 1, 0, 0); } - if (i % 35 == 0) { - draw_face_mark(cr, x, y, - 0.70 * r, - 0.90 * r, - 300 * (M_PI/180), - 420 * (M_PI/180), - i / 140.0); - } else { - draw_face_mark(cr, x, y, - 0.80 * r, - 0.90 * r, - 300 * (M_PI/180), - 420 * (M_PI/180), - i / 140.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); } } @@ -303,10 +222,10 @@ static void draw_thermometer_needle(cairo_t *cr, cairo_arc(cr, x, y, 0.08 * r, 0, 2*M_PI); cairo_stroke(cr); - draw_needle(cr, x, y, 0.9 * r, - 300 * (M_PI/180), - 420 * (M_PI/180), - temp / 260); + hexagram_gauge_draw_needle(cr, x, y, 0.9 * r, + 300 * (M_PI/180), + 420 * (M_PI/180), + temp / 260); } static void draw_fuel_gauge(cairo_t *cr, @@ -340,21 +259,12 @@ static void draw_fuel_gauge(cairo_t *cr, cairo_set_source_rgb(cr, 1, 1, 1); } - if (i % 4 == 0) { - draw_face_mark(cr, x, y, - 0.70 * r, - 0.90 * r, - 300 * (M_PI/180), - 420 * (M_PI/180), - (double)i / 16.0); - } else { - draw_face_mark(cr, x, y, - 0.80 * r, - 0.90 * r, - 300 * (M_PI/180), - 420 * (M_PI/180), - (double)i / 16.0); - } + 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); } } @@ -374,10 +284,10 @@ static void draw_fuel_gauge_needle(cairo_t *cr, cairo_arc(cr, x, y, 0.08 * r, 0, 2*M_PI); cairo_stroke(cr); - draw_needle(cr, x, y, 0.9 * r, - 300 * (M_PI/180), - 420 * (M_PI/180), - level / 1.0); + 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, diff --git a/include/hexagram/gauge.h b/include/hexagram/gauge.h new file mode 100644 index 0000000..37f7700 --- /dev/null +++ b/include/hexagram/gauge.h @@ -0,0 +1,27 @@ +#include + +void hexagram_gauge_draw_needle(cairo_t *cr, + double x, + double y, + double r, + double min_angle, + double max_angle, + double value); + +void hexagram_gauge_draw_number(cairo_t *cr, + double x, + double y, + double r, + double min_angle, + double max_angle, + double value, + const char *text); + +void hexagram_gauge_draw_mark(cairo_t *cr, + double x, + double y, + double min_r, + double max_r, + double min_angle, + double max_angle, + double value); diff --git a/src/Makefile b/src/Makefile index 16c6034..c1fb37a 100644 --- a/src/Makefile +++ b/src/Makefile @@ -7,10 +7,13 @@ CC = $(CROSS)cc 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 sim.h +HEADERS = dict.h hash.h can.h capture.h pcapng.h module.h window.h \ + gauge.h sim.h + HEADERS_LOCAL = util.h -OBJS = dict.o hash.o can.o capture.o pcapng.o module.o window.o sim.o +OBJS = dict.o hash.o can.o capture.o pcapng.o module.o window.o \ + gauge.o sim.o VERSION_MAJOR = 0 VERSION_MINOR = 0.1 diff --git a/src/gauge.c b/src/gauge.c new file mode 100644 index 0000000..65637aa --- /dev/null +++ b/src/gauge.c @@ -0,0 +1,68 @@ +#include +#include + +#include + +void hexagram_gauge_draw_needle(cairo_t *cr, + double x, + double y, + double r, + double min_angle, + double max_angle, + double value) { + double angle = min_angle + ((max_angle - min_angle) * value) - (M_PI/2); + + cairo_move_to(cr, x, y); + + cairo_set_source_rgb(cr, 0, 0.25, 1.0); + + cairo_line_to(cr, + x + r * cos(angle), + y + r * sin(angle)); + + cairo_stroke(cr); +} + +void hexagram_gauge_draw_number(cairo_t *cr, + double x, + double y, + double r, + double min_angle, + double max_angle, + double value, + const char *text) { + double angle = min_angle + ((max_angle - min_angle) * value) - 1.658; + + cairo_set_source_rgb(cr, 1, 1, 1); + + cairo_move_to(cr, + x + r * cos(angle), + y + r * sin(angle)); + + cairo_save(cr); + cairo_rotate(cr, angle + 1.658); + cairo_show_text(cr, text); + cairo_stroke(cr); + cairo_restore(cr); +} + +void hexagram_gauge_draw_mark(cairo_t *cr, + double x, + double y, + double min_r, + double max_r, + double min_angle, + double max_angle, + double value) { + double angle = min_angle + ((max_angle - min_angle) * value) - (M_PI/2); + + cairo_move_to(cr, + x + min_r * cos(angle), + y + min_r * sin(angle)); + + cairo_line_to(cr, + x + max_r * cos(angle), + y + max_r * sin(angle)); + + cairo_stroke(cr); +}