gbacycle

diff src/dashboard.c @ 0:858dd5fbfef2

gbacycle import
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 08 Mar 2012 14:38:21 +0200
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/dashboard.c	Thu Mar 08 14:38:21 2012 +0200
     1.3 @@ -0,0 +1,160 @@
     1.4 +#include <string.h>
     1.5 +#include "dashboard.h"
     1.6 +#include "gbasys.h"
     1.7 +#include "gbacycle.h"
     1.8 +
     1.9 +/* data files in C arrays */
    1.10 +#include "data/dashbg.h"	/* dash_img */
    1.11 +#include "data/7seg-big.h"	/* digits_img */
    1.12 +#include "data/7seg-sm.h"	/* digits_small_img */
    1.13 +#include "data/led_blue.h"	/* led_blue_img */
    1.14 +#include "data/led_red.h"	/* led_red_img */
    1.15 +#include "data/led_off.h"	/* led_off_img */
    1.16 +
    1.17 +static void dash_draw(void);
    1.18 +static void draw_speed(void);
    1.19 +static void draw_dist(void);
    1.20 +static void draw_leds(void);
    1.21 +static void dash_keyb(unsigned int keys);
    1.22 +
    1.23 +static struct pixel_buffer dash;
    1.24 +static struct pixel_buffer digits, digits_small;
    1.25 +static struct pixel_buffer led_blue, led_red, led_off;
    1.26 +
    1.27 +static struct {
    1.28 +	int x, y;
    1.29 +} ledpos[] = {
    1.30 +	{31, 138}, {25, 130}, {19, 120}, {16, 111},
    1.31 +	{13, 100}, {12, 90}, {12, 79}, {14, 70},
    1.32 +	{17, 60}, {22, 51}, {28, 42}, {35, 34},
    1.33 +	{44, 27}, {52, 22}, {63, 17}, {72, 14},
    1.34 +	{83, 13},
    1.35 +	{92, 13}, {103, 14}, {112, 17}, {123, 22},
    1.36 +	{131, 27}, {140, 34}, {147, 42}, {153, 51},
    1.37 +	{158, 60}, {161, 70}, {163, 79}, {163, 90},
    1.38 +	{162, 100}, {159, 111}, {156, 120}, {150, 130},
    1.39 +	{144, 138}
    1.40 +};
    1.41 +static const int nleds = sizeof ledpos / sizeof *ledpos;
    1.42 +
    1.43 +void init_dash(void)
    1.44 +{
    1.45 +	dash.x = 183;
    1.46 +	dash.y = 160;
    1.47 +	dash.bpp = 16;
    1.48 +	dash.pixels = (unsigned short*)dash_img;
    1.49 +
    1.50 +	digits.x = 300;
    1.51 +	digits.y = 34;
    1.52 +	digits.bpp = 16;
    1.53 +	digits.pixels = (unsigned short*)digits_img;
    1.54 +
    1.55 +	digits_small.x = 150;
    1.56 +	digits_small.y = 17;
    1.57 +	digits_small.bpp = 16;
    1.58 +	digits_small.pixels = (unsigned short*)digits_small_img;
    1.59 +
    1.60 +	led_blue.x = led_blue.y = 8;
    1.61 +	led_blue.bpp = 16;
    1.62 +	led_blue.pixels = (unsigned short*)led_blue_img;
    1.63 +
    1.64 +	led_red.x = led_red.y = 8;
    1.65 +	led_red.bpp = 16;
    1.66 +	led_red.pixels = (unsigned short*)led_red_img;
    1.67 +
    1.68 +	led_off.x = led_off.y = 8;
    1.69 +	led_off.bpp = 16;
    1.70 +	led_off.pixels = (unsigned short*)led_off_img;
    1.71 +}
    1.72 +
    1.73 +void start_dash(void)
    1.74 +{
    1.75 +	draw = dash_draw;
    1.76 +	keyb = dash_keyb;
    1.77 +}
    1.78 +
    1.79 +static void dash_draw(void)
    1.80 +{
    1.81 +	dash_keyb(get_key_state(KEY_ALL));
    1.82 +
    1.83 +	clear_buffer(back_buffer, 0);
    1.84 +
    1.85 +	/* backdrop */
    1.86 +	blit(&dash, 0, 0, -1, -1, back_buffer, 28, 0);
    1.87 +
    1.88 +	draw_speed();
    1.89 +	draw_dist();
    1.90 +	draw_leds();
    1.91 +
    1.92 +	if(dbg) {
    1.93 +		set_text_color(RGB(255, 0, 0), RGB(1, 2, 155));
    1.94 +		draw_string("rot/s", 152, 92, back_buffer);
    1.95 +		draw_string("rot", 156, 144, back_buffer);
    1.96 +	}
    1.97 +
    1.98 +	flip();
    1.99 +}
   1.100 +
   1.101 +static void draw_speed(void)
   1.102 +{
   1.103 +	int i, digit, pos = 120;
   1.104 +	int speed = dbg ? (speed_rp2s / 2) : speed_kmh;
   1.105 +
   1.106 +	for(i=0; i<2; i++) {
   1.107 +		digit = speed % 10;
   1.108 +		speed /= 10;
   1.109 +
   1.110 +		blit(&digits, digit * 30, 0, 30, -1, back_buffer, pos, 75);
   1.111 +
   1.112 +		pos -= 30;
   1.113 +	}
   1.114 +}
   1.115 +
   1.116 +static void draw_dist(void)
   1.117 +{
   1.118 +	int i, digit, pos = 140;
   1.119 +	long dist = dbg ? nrot : (dist_cm / 10000);
   1.120 +
   1.121 +	for(i=0; i<5; i++) {
   1.122 +		digit = dist % 10;
   1.123 +		dist /= 10;
   1.124 +
   1.125 +		blit(&digits_small, digit * 15, 0, 15, -1, back_buffer, pos, 136);
   1.126 +
   1.127 +		pos -= 15;
   1.128 +	}
   1.129 +}
   1.130 +
   1.131 +static void draw_leds(void)
   1.132 +{
   1.133 +	int i;
   1.134 +	int speed = dbg ? (speed_rp2s / 2) : speed_kmh;
   1.135 +
   1.136 +	for(i=0; i<nleds; i++) {
   1.137 +		struct pixel_buffer *img;
   1.138 +
   1.139 +		if(i < speed) {
   1.140 +			img = i < 20 ? &led_blue : &led_red;
   1.141 +		} else {
   1.142 +			img = &led_off;
   1.143 +		}
   1.144 +		blit(img, 0, 0, -1, -1, back_buffer, 28 + ledpos[i].x, ledpos[i].y);
   1.145 +	}
   1.146 +}
   1.147 +
   1.148 +static void dash_keyb(unsigned int keys)
   1.149 +{
   1.150 +	if(keys & KEY_UP) {
   1.151 +		speed_kmh += 1;
   1.152 +	}
   1.153 +	if((keys & KEY_DOWN) && speed_kmh > 0) {
   1.154 +		speed_kmh -= 1;
   1.155 +	}
   1.156 +
   1.157 +	if(keys & KEY_RIGHT) {
   1.158 +		dist_cm += 10;
   1.159 +	}
   1.160 +	if((keys & KEY_LEFT) && dist_cm >= 10) {
   1.161 +		dist_cm -= 10;
   1.162 +	}
   1.163 +}