*pointing at The Cheat* Oh, and how 'bout a blue one for my little friend here?
This commit is contained in:
parent
32f94bfb6d
commit
cd9b07b8ac
4 changed files with 159 additions and 151 deletions
|
@ -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
27
include/hexagram/gauge.h
Normal 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);
|
|
@ -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
68
src/gauge.c
Normal 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);
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue