Whoah, you're loaded!
This commit is contained in:
parent
1d275dcb5a
commit
b850ddd289
1 changed files with 76 additions and 24 deletions
|
@ -1,12 +1,15 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
#include <cairo.h>
|
#include <cairo.h>
|
||||||
#include <cairo-xlib.h>
|
#include <cairo-xlib.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <hexagram/can.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
static void draw_needle(cairo_t *cr,
|
static void draw_needle(cairo_t *cr,
|
||||||
double x,
|
double x,
|
||||||
|
@ -53,9 +56,14 @@ static void draw_face_number(cairo_t *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);
|
||||||
|
@ -87,7 +95,8 @@ static void draw_tachometer(cairo_t *cr,
|
||||||
*/
|
*/
|
||||||
draw_needle(cr, x, y, 0.77 * r,
|
draw_needle(cr, x, y, 0.77 * r,
|
||||||
232 * (M_PI/180),
|
232 * (M_PI/180),
|
||||||
488 * (M_PI/180), 0.0);
|
488 * (M_PI/180),
|
||||||
|
rpm / 8000);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Draw a tiny boi circle
|
* Draw a tiny boi circle
|
||||||
|
@ -144,10 +153,17 @@ static void draw_mfd(cairo_t *cr,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw_gauge_cluster(cairo_t *cr,
|
static void draw_gauge_cluster(cairo_t *cr,
|
||||||
|
struct can_frame *frame,
|
||||||
double x,
|
double x,
|
||||||
double y,
|
double y,
|
||||||
double width,
|
double width,
|
||||||
double height) {
|
double height) {
|
||||||
|
static double rpm = 0;
|
||||||
|
|
||||||
|
if (frame->can_id == 0x280) {
|
||||||
|
rpm = 0.25 * (double)(frame->data[2] | (frame->data[3] << 8));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Paint canvas black
|
* Paint canvas black
|
||||||
*/
|
*/
|
||||||
|
@ -157,7 +173,8 @@ static void draw_gauge_cluster(cairo_t *cr,
|
||||||
draw_tachometer(cr,
|
draw_tachometer(cr,
|
||||||
x + width * 0.2,
|
x + width * 0.2,
|
||||||
y + height * 0.5,
|
y + height * 0.5,
|
||||||
height * 0.4);
|
height * 0.4,
|
||||||
|
rpm);
|
||||||
|
|
||||||
draw_speedometer(cr,
|
draw_speedometer(cr,
|
||||||
x + width * 0.8,
|
x + width * 0.8,
|
||||||
|
@ -186,8 +203,11 @@ int main(int argc, char **argv) {
|
||||||
Window win;
|
Window win;
|
||||||
Pixmap buf;
|
Pixmap buf;
|
||||||
GC gc;
|
GC gc;
|
||||||
|
fd_set rfds, wfds, rready, wready;
|
||||||
|
|
||||||
int screen,
|
hexagram_can_if *can_if;
|
||||||
|
|
||||||
|
int screen, fd, fd2,
|
||||||
width = 1024,
|
width = 1024,
|
||||||
height = 480;
|
height = 480;
|
||||||
|
|
||||||
|
@ -200,11 +220,15 @@ int main(int argc, char **argv) {
|
||||||
cairo_surface_t *sfc;
|
cairo_surface_t *sfc;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
|
|
||||||
XEvent e;
|
if ((can_if = hexagram_can_if_open("vcan0")) == NULL)
|
||||||
|
exit(1);
|
||||||
|
|
||||||
if ((display = XOpenDisplay(NULL)) == NULL)
|
if ((display = XOpenDisplay(NULL)) == NULL)
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
||||||
|
fd = hexagram_can_if_fd(can_if);
|
||||||
|
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);
|
||||||
|
@ -218,29 +242,57 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
cr = cairo_create(sfc);
|
cr = cairo_create(sfc);
|
||||||
|
|
||||||
draw_gauge_cluster(cr, 0, 0, width, height);
|
FD_ZERO(&rfds);
|
||||||
|
|
||||||
|
FD_SET(fd, &rfds);
|
||||||
|
FD_SET(fd2, &rfds);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
XExposeEvent *expose;
|
int nready, pending;
|
||||||
|
|
||||||
XNextEvent(cairo_xlib_surface_get_display(sfc), &e);
|
while ((pending = XPending(display)) != 0) {
|
||||||
|
XEvent e;
|
||||||
|
|
||||||
switch (e.type) {
|
XNextEvent(display, &e);
|
||||||
case Expose:
|
|
||||||
expose = (XExposeEvent *)&e;
|
|
||||||
|
|
||||||
XCopyArea(display, buf, win, gc, expose->x, expose->y,
|
switch (e.type) {
|
||||||
expose->width, expose->height,
|
case Expose:
|
||||||
expose->x, expose->y);
|
fprintf(stderr, "Event %d\n", e.type);
|
||||||
|
|
||||||
break;
|
XCopyArea(display, buf, win, gc,
|
||||||
|
e.xexpose.x,
|
||||||
case ButtonPress:
|
e.xexpose.y,
|
||||||
case KeyPress:
|
e.xexpose.width,
|
||||||
goto done;
|
e.xexpose.height,
|
||||||
|
e.xexpose.x,
|
||||||
|
e.xexpose.y);
|
||||||
|
|
||||||
default:
|
break;
|
||||||
fprintf(stderr, "Dropping unhandled XEvent.type = %d.\n", e.type);
|
|
||||||
|
case ButtonPress:
|
||||||
|
case KeyPress:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Dropping unhandled XEvent.type = %d.\n", e.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(&rready, &rfds, sizeof(rfds));
|
||||||
|
|
||||||
|
if (select(fd2, &rready, NULL, NULL, NULL) < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FD_ISSET(fd, &rready)) {
|
||||||
|
struct can_frame frame;
|
||||||
|
|
||||||
|
hexagram_can_if_read(can_if, &frame);
|
||||||
|
draw_gauge_cluster(cr, &frame, 0, 0, width, height);
|
||||||
|
|
||||||
|
XCopyArea(display, buf, win, gc, 0, 0,
|
||||||
|
1024, 480,
|
||||||
|
0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue