diff --git a/examples/cluster.c b/examples/cluster.c index 52e9b7c..6af33db 100644 --- a/examples/cluster.c +++ b/examples/cluster.c @@ -10,34 +10,31 @@ #include #include -static hexagram_cluster_state state = { - 0, 0, 0, 0 -}; - -static void cluster_update(struct can_frame *frame) { +static void cluster_update(hexagram_cluster *cluster, + struct can_frame *frame) { switch (frame->can_id) { case 0x280: { - state.rpm = 0.25 * + cluster->state.rpm = 0.25 * (double)(frame->data[2] | (frame->data[3] << 8)); break; } case 0x288: { - state.temp = (double)(frame->data[1] - 48 * 0.75); + cluster->state.temp = (double)(frame->data[1] - 48 * 0.75); break; } case 0x320: { - state.fuel = (double)(frame->data[2] & 0xf) / 16.0; + cluster->state.fuel = (double)(frame->data[2] & 0xf) / 16.0; break; } case 0x5a0: { - state.rps = 0.001 * (double)(frame->data[1] - | (frame->data[2] << 8)); + cluster->state.rps = 0.001 * (double)(frame->data[1] + | (frame->data[2] << 8)); break; } @@ -136,7 +133,7 @@ int main(int argc, char **argv) { case MapNotify: case Expose: hexagram_window_refresh_bg(window); - hexagram_cluster_draw_fg(cluster, fg, &state); + hexagram_cluster_draw_fg(cluster, fg); hexagram_window_swap_buffer(window); break; @@ -168,14 +165,14 @@ int main(int argc, char **argv) { case 0x5a0: { struct timeval now; - cluster_update(&frame); + cluster_update(cluster, &frame); (void)gettimeofday(&now, NULL); if (now.tv_sec - last.tv_sec || now.tv_usec - last.tv_usec > 16666) { hexagram_window_refresh_bg(window); - hexagram_cluster_draw_fg(cluster, fg, &state); + hexagram_cluster_draw_fg(cluster, fg); hexagram_window_swap_buffer(window); (void)memcpy(&last, &now, sizeof(now)); diff --git a/include/hexagram/cluster.h b/include/hexagram/cluster.h index f66c0d8..8514dc6 100644 --- a/include/hexagram/cluster.h +++ b/include/hexagram/cluster.h @@ -9,10 +9,6 @@ #include #include -typedef struct _hexagram_cluster_state { - double rpm, rps, temp, fuel; -} hexagram_cluster_state; - typedef struct _hexagram_cluster { hexagram_tacho tacho; hexagram_speedo speedo; @@ -22,6 +18,10 @@ typedef struct _hexagram_cluster { double width, height; + + struct { + double rpm, rps, temp, fuel; + } state; } hexagram_cluster; hexagram_cluster *hexagram_cluster_new(double width, @@ -31,7 +31,6 @@ void hexagram_cluster_draw_bg(hexagram_cluster *cluster, cairo_t *cr); void hexagram_cluster_draw_fg(hexagram_cluster *cluster, - cairo_t *cr, - hexagram_cluster_state *state); + cairo_t *cr); #endif /* _HEXAGRAM_CLUSTER_H */ diff --git a/src/cluster.c b/src/cluster.c index edef543..424de0c 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -1,4 +1,5 @@ #include +#include #include @@ -41,6 +42,11 @@ hexagram_cluster *hexagram_cluster_new(double width, double height) { cluster->width = width; cluster->height = height; + /* + * Initialize mutable state + */ + memset(&cluster->state, '\0', sizeof(cluster->state)); + return cluster; error_malloc_cluster: @@ -63,16 +69,15 @@ void hexagram_cluster_draw_bg(hexagram_cluster *cluster, } void hexagram_cluster_draw_fg(hexagram_cluster *cluster, - cairo_t *cr, - hexagram_cluster_state *state) { - hexagram_tacho_draw_needle(&cluster->tacho, cr, state->rpm); + cairo_t *cr) { + hexagram_tacho_draw_needle(&cluster->tacho, cr, cluster->state.rpm); hexagram_speedo_draw_needle(&cluster->speedo, cr, - (2.032 * state->rps * 3600) / 1000.0); + (2.032 * cluster->state.rps * 3600) / 1000.0); hexagram_thermo_draw_needle(&cluster->thermo, cr, - state->temp); + cluster->state.temp); hexagram_fuel_draw_needle(&cluster->fuel, cr, - state->fuel); + cluster->state.fuel); }