*pointing at The Cheat* Oh, and how 'bout a blue one for my little friend here?

This commit is contained in:
XANTRONIX Development 2019-06-09 13:37:45 -05:00
parent 32f94bfb6d
commit cd9b07b8ac
4 changed files with 159 additions and 151 deletions

View file

@ -8,6 +8,7 @@
#include <hexagram/can.h> #include <hexagram/can.h>
#include <hexagram/window.h> #include <hexagram/window.h>
#include <hexagram/gauge.h>
typedef struct _hexagram_cluster_state { typedef struct _hexagram_cluster_state {
double rpm, rps, temp, fuel; double rpm, rps, temp, fuel;
@ -17,70 +18,6 @@ static hexagram_cluster_state state = {
0, 0, 0, 0 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, static void draw_tachometer_needle(cairo_t *cr,
double x, double x,
double y, 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_arc(cr, x, y, 0.08 * r, 0, 2*M_PI);
cairo_stroke(cr); cairo_stroke(cr);
draw_needle(cr, x, y, 0.8 * r, hexagram_gauge_draw_needle(cr, x, y, 0.8 * r,
232 * (M_PI/180), 232 * (M_PI/180),
488 * (M_PI/180), 488 * (M_PI/180),
rpm / 8000); rpm / 8000);
} }
static void draw_tachometer(cairo_t *cr, static void draw_tachometer(cairo_t *cr,
@ -128,12 +65,12 @@ static void draw_tachometer(cairo_t *cr,
snprintf(text, 3, "%02d", i); snprintf(text, 3, "%02d", i);
draw_face_number(cr, x, y, hexagram_gauge_draw_number(cr, x, y,
0.85 * r, 0.85 * r,
232 * (M_PI/180), 232 * (M_PI/180),
488 * (M_PI/180), 488 * (M_PI/180),
i / 80.0, i / 80.0,
text); text);
} }
for (i=0; i<=80; i++) { for (i=0; i<=80; i++) {
@ -142,19 +79,19 @@ static void draw_tachometer(cairo_t *cr,
} }
if (i % 5 == 0) { if (i % 5 == 0) {
draw_face_mark(cr, x, y, hexagram_gauge_draw_mark(cr, x, y,
0.7 * r, 0.7 * r,
0.8 * r, 0.8 * r,
232 * (M_PI/180), 232 * (M_PI/180),
488 * (M_PI/180), 488 * (M_PI/180),
i / 80.0); i / 80.0);
} else { } else {
draw_face_mark(cr, x, y, hexagram_gauge_draw_mark(cr, x, y,
0.75 * r, 0.75 * r,
0.8 * r, 0.8 * r,
232 * (M_PI/180), 232 * (M_PI/180),
488 * (M_PI/180), 488 * (M_PI/180),
i / 80.0); i / 80.0);
} }
} }
} }
@ -183,30 +120,21 @@ static void draw_speedometer(cairo_t *cr,
snprintf(text, 4, "%02d", i); snprintf(text, 4, "%02d", i);
draw_face_number(cr, x, y, hexagram_gauge_draw_number(cr, x, y,
0.85 * r, 0.85 * r,
232 * (M_PI/180), 232 * (M_PI/180),
488 * (M_PI/180), 488 * (M_PI/180),
i / 180.0, i / 180.0,
text); text);
} }
for (i=0; i<=180; i+=2) { for (i=0; i<=180; i+=2) {
if (i % 10 == 0) { hexagram_gauge_draw_mark(cr, x, y,
draw_face_mark(cr, x, y, ((i % 10)? 0.75: 0.7) * r,
0.7 * r, 0.8 * r,
0.8 * r, 232 * (M_PI/180),
232 * (M_PI/180), 488 * (M_PI/180),
488 * (M_PI/180), i / 180.0);
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);
}
} }
} }
@ -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_arc(cr, x, y, 0.08 * r, 0, 2*M_PI);
cairo_stroke(cr); cairo_stroke(cr);
draw_needle(cr, x, y, 0.8 * r, hexagram_gauge_draw_needle(cr, x, y, 0.8 * r,
232 * (M_PI/180), 232 * (M_PI/180),
488 * (M_PI/180), 488 * (M_PI/180),
kph / 290); kph / 290);
} }
static void draw_thermometer(cairo_t *cr, 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); cairo_set_source_rgb(cr, 1, 0, 0);
} }
if (i % 35 == 0) { hexagram_gauge_draw_mark(cr, x, y,
draw_face_mark(cr, x, y, ((i % 35)? 0.8: 0.7) * r,
0.70 * r, 0.90 * r,
0.90 * r, 300 * (M_PI/180),
300 * (M_PI/180), 420 * (M_PI/180),
420 * (M_PI/180), i / 140.0);
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);
}
} }
} }
@ -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_arc(cr, x, y, 0.08 * r, 0, 2*M_PI);
cairo_stroke(cr); cairo_stroke(cr);
draw_needle(cr, x, y, 0.9 * r, hexagram_gauge_draw_needle(cr, x, y, 0.9 * r,
300 * (M_PI/180), 300 * (M_PI/180),
420 * (M_PI/180), 420 * (M_PI/180),
temp / 260); temp / 260);
} }
static void draw_fuel_gauge(cairo_t *cr, 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); cairo_set_source_rgb(cr, 1, 1, 1);
} }
if (i % 4 == 0) { hexagram_gauge_draw_mark(cr, x, y,
draw_face_mark(cr, x, y, ((i % 4)? 0.8: 0.7) * r,
0.70 * r, 0.90 * r,
0.90 * r, 300 * (M_PI/180),
300 * (M_PI/180), 420 * (M_PI/180),
420 * (M_PI/180), (double)i / 16.0);
(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);
}
} }
} }
@ -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_arc(cr, x, y, 0.08 * r, 0, 2*M_PI);
cairo_stroke(cr); cairo_stroke(cr);
draw_needle(cr, x, y, 0.9 * r, hexagram_gauge_draw_needle(cr, x, y, 0.9 * r,
300 * (M_PI/180), 300 * (M_PI/180),
420 * (M_PI/180), 420 * (M_PI/180),
level / 1.0); level / 1.0);
} }
static void draw_mfd(cairo_t *cr, static void draw_mfd(cairo_t *cr,

27
include/hexagram/gauge.h Normal file
View file

@ -0,0 +1,27 @@
#include <cairo.h>
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);

View file

@ -7,10 +7,13 @@ CC = $(CROSS)cc
CFLAGS += -fPIC -I$(INCLUDE_PATH) $(shell pkg-config --cflags cairo x11) CFLAGS += -fPIC -I$(INCLUDE_PATH) $(shell pkg-config --cflags cairo x11)
LDFLAGS = $(shell pkg-config --libs cairo x11) -lXext 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 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_MAJOR = 0
VERSION_MINOR = 0.1 VERSION_MINOR = 0.1

68
src/gauge.c Normal file
View file

@ -0,0 +1,68 @@
#include <stdlib.h>
#include <math.h>
#include <hexagram/gauge.h>
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);
}