Could you please repeat that?
This commit is contained in:
parent
f5a5710f0e
commit
a3816b4a2f
1 changed files with 104 additions and 64 deletions
|
@ -50,20 +50,38 @@ static void draw_face_number(cairo_t *cr,
|
||||||
cairo_save(cr);
|
cairo_save(cr);
|
||||||
cairo_rotate(cr, angle + 1.658);
|
cairo_rotate(cr, angle + 1.658);
|
||||||
cairo_show_text(cr, text);
|
cairo_show_text(cr, text);
|
||||||
|
cairo_stroke(cr);
|
||||||
cairo_restore(cr);
|
cairo_restore(cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void draw_tachometer_needle(cairo_t *cr,
|
||||||
|
double x,
|
||||||
|
double y,
|
||||||
|
double r,
|
||||||
|
double rpm) {
|
||||||
|
if (rpm > 8000) {
|
||||||
|
rpm = 8000;
|
||||||
|
}
|
||||||
|
|
||||||
|
draw_needle(cr, x, y, 0.77 * r,
|
||||||
|
232 * (M_PI/180),
|
||||||
|
488 * (M_PI/180),
|
||||||
|
rpm / 8000);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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_fill(cr);
|
||||||
|
}
|
||||||
|
|
||||||
static void draw_tachometer(cairo_t *cr,
|
static void draw_tachometer(cairo_t *cr,
|
||||||
double x,
|
double x,
|
||||||
double y,
|
double y,
|
||||||
double r,
|
double r) {
|
||||||
double rpm) {
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (rpm > 8000) {
|
|
||||||
rpm = 8000;
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_select_font_face(cr, "Helvetica",
|
cairo_select_font_face(cr, "Helvetica",
|
||||||
CAIRO_FONT_SLANT_NORMAL,
|
CAIRO_FONT_SLANT_NORMAL,
|
||||||
CAIRO_FONT_WEIGHT_NORMAL);
|
CAIRO_FONT_WEIGHT_NORMAL);
|
||||||
|
@ -89,21 +107,6 @@ static void draw_tachometer(cairo_t *cr,
|
||||||
i / 80.0,
|
i / 80.0,
|
||||||
text);
|
text);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Draw a gauge needle
|
|
||||||
*/
|
|
||||||
draw_needle(cr, x, y, 0.77 * r,
|
|
||||||
232 * (M_PI/180),
|
|
||||||
488 * (M_PI/180),
|
|
||||||
rpm / 8000);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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_fill(cr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw_speedometer(cairo_t *cr,
|
static void draw_speedometer(cairo_t *cr,
|
||||||
|
@ -152,7 +155,55 @@ static void draw_mfd(cairo_t *cr,
|
||||||
cairo_stroke(cr);
|
cairo_stroke(cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw_gauge_cluster(cairo_t *cr,
|
static void draw_gauge_cluster_bg(Pixmap buf,
|
||||||
|
Display *display,
|
||||||
|
int screen,
|
||||||
|
double width,
|
||||||
|
double height) {
|
||||||
|
cairo_surface_t *sfc;
|
||||||
|
cairo_t *cr;
|
||||||
|
|
||||||
|
sfc = cairo_xlib_surface_create(display, buf, DefaultVisual(display, screen), width, height);
|
||||||
|
cairo_xlib_surface_set_size(sfc, width, height);
|
||||||
|
|
||||||
|
cr = cairo_create(sfc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Paint canvas black
|
||||||
|
*/
|
||||||
|
cairo_set_source_rgb(cr, 0, 0, 0);
|
||||||
|
cairo_paint(cr);
|
||||||
|
|
||||||
|
draw_tachometer(cr,
|
||||||
|
width * 0.2,
|
||||||
|
height * 0.5,
|
||||||
|
height * 0.4);
|
||||||
|
|
||||||
|
draw_speedometer(cr,
|
||||||
|
width * 0.8,
|
||||||
|
height * 0.5,
|
||||||
|
height * 0.4);
|
||||||
|
|
||||||
|
draw_thermometer(cr,
|
||||||
|
width * 0.43,
|
||||||
|
height * 0.76,
|
||||||
|
height * 0.13);
|
||||||
|
|
||||||
|
draw_fuel_gauge(cr,
|
||||||
|
width * 0.57,
|
||||||
|
height * 0.76,
|
||||||
|
height * 0.13);
|
||||||
|
|
||||||
|
draw_mfd(cr,
|
||||||
|
width * 0.42,
|
||||||
|
height * 0.1,
|
||||||
|
width * 0.16,
|
||||||
|
height * 0.5);
|
||||||
|
|
||||||
|
cairo_destroy(cr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void update_gauge_cluster(cairo_t *cr,
|
||||||
struct can_frame *frame,
|
struct can_frame *frame,
|
||||||
double x,
|
double x,
|
||||||
double y,
|
double y,
|
||||||
|
@ -162,46 +213,21 @@ static void draw_gauge_cluster(cairo_t *cr,
|
||||||
|
|
||||||
if (frame->can_id == 0x280) {
|
if (frame->can_id == 0x280) {
|
||||||
rpm = 0.25 * (double)(frame->data[2] | (frame->data[3] << 8));
|
rpm = 0.25 * (double)(frame->data[2] | (frame->data[3] << 8));
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
draw_tachometer_needle(cr,
|
||||||
* Paint canvas black
|
x + width * 0.2,
|
||||||
*/
|
y + height * 0.5,
|
||||||
cairo_set_source_rgb(cr, 0, 0, 0);
|
height * 0.4,
|
||||||
cairo_paint(cr);
|
rpm);
|
||||||
|
|
||||||
draw_tachometer(cr,
|
|
||||||
x + width * 0.2,
|
|
||||||
y + height * 0.5,
|
|
||||||
height * 0.4,
|
|
||||||
rpm);
|
|
||||||
|
|
||||||
draw_speedometer(cr,
|
|
||||||
x + width * 0.8,
|
|
||||||
y + height * 0.5,
|
|
||||||
height * 0.4);
|
|
||||||
|
|
||||||
draw_thermometer(cr,
|
|
||||||
x + width * 0.43,
|
|
||||||
y + height * 0.76,
|
|
||||||
height * 0.13);
|
|
||||||
|
|
||||||
draw_fuel_gauge(cr,
|
|
||||||
x + width * 0.57,
|
|
||||||
y + height * 0.76,
|
|
||||||
height * 0.13);
|
|
||||||
|
|
||||||
draw_mfd(cr,
|
|
||||||
x + width * 0.42,
|
|
||||||
y + height * 0.1,
|
|
||||||
width * 0.16,
|
|
||||||
height * 0.5);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
Display *display;
|
Display *display;
|
||||||
Window win;
|
Window win;
|
||||||
Pixmap buf;
|
Pixmap bg;
|
||||||
GC gc;
|
GC gc;
|
||||||
fd_set rfds, rready;
|
fd_set rfds, rready;
|
||||||
|
|
||||||
|
@ -230,18 +256,29 @@ int main(int argc, char **argv) {
|
||||||
fd2 = ConnectionNumber(display);
|
fd2 = ConnectionNumber(display);
|
||||||
|
|
||||||
screen = DefaultScreen(display);
|
screen = DefaultScreen(display);
|
||||||
win = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0, width, height, 0, 0, 0);
|
win = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0, width, height, 0, 0, 0);
|
||||||
gc = XCreateGC(display, win, GCForeground | GCBackground | GCGraphicsExposures, &values);
|
gc = XCreateGC(display, win, GCForeground | GCBackground | GCGraphicsExposures, &values);
|
||||||
buf = XCreatePixmap(display, win, width, height, 24);
|
bg = XCreatePixmap(display, win, width, height, 24);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Draw the background layer
|
||||||
|
*/
|
||||||
|
draw_gauge_cluster_bg(bg, display, screen, width, height);
|
||||||
|
|
||||||
XSelectInput(display, win, ExposureMask | ButtonPressMask | KeyPressMask);
|
XSelectInput(display, win, ExposureMask | ButtonPressMask | KeyPressMask);
|
||||||
XMapWindow(display, win);
|
XMapWindow(display, win);
|
||||||
|
|
||||||
sfc = cairo_xlib_surface_create(display, buf, DefaultVisual(display, screen), width, height);
|
/*
|
||||||
|
* Set up the foreground surface
|
||||||
|
*/
|
||||||
|
sfc = cairo_xlib_surface_create(display, win, DefaultVisual(display, screen), width, height);
|
||||||
cairo_xlib_surface_set_size(sfc, width, height);
|
cairo_xlib_surface_set_size(sfc, width, height);
|
||||||
|
|
||||||
cr = cairo_create(sfc);
|
cr = cairo_create(sfc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up file descriptors to monitor
|
||||||
|
*/
|
||||||
FD_ZERO(&rfds);
|
FD_ZERO(&rfds);
|
||||||
|
|
||||||
FD_SET(fd, &rfds);
|
FD_SET(fd, &rfds);
|
||||||
|
@ -259,7 +296,7 @@ int main(int argc, char **argv) {
|
||||||
case Expose:
|
case Expose:
|
||||||
fprintf(stderr, "Event %d\n", e.type);
|
fprintf(stderr, "Event %d\n", e.type);
|
||||||
|
|
||||||
XCopyArea(display, buf, win, gc,
|
XCopyArea(display, bg, win, gc,
|
||||||
e.xexpose.x,
|
e.xexpose.x,
|
||||||
e.xexpose.y,
|
e.xexpose.y,
|
||||||
e.xexpose.width,
|
e.xexpose.width,
|
||||||
|
@ -288,11 +325,14 @@ int main(int argc, char **argv) {
|
||||||
struct can_frame frame;
|
struct can_frame frame;
|
||||||
|
|
||||||
hexagram_can_if_read(can_if, &frame);
|
hexagram_can_if_read(can_if, &frame);
|
||||||
draw_gauge_cluster(cr, &frame, 0, 0, width, height);
|
|
||||||
|
|
||||||
XCopyArea(display, buf, win, gc, 0, 0,
|
if (frame.can_id == 0x280) {
|
||||||
width, height,
|
XCopyArea(display, bg, win, gc, 0, 0,
|
||||||
0, 0);
|
width, height,
|
||||||
|
0, 0);
|
||||||
|
|
||||||
|
update_gauge_cluster(cr, &frame, 0, 0, width, height);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue