rev |
line source |
nuclear@0
|
1 #include <string.h>
|
nuclear@0
|
2 #include "dashboard.h"
|
nuclear@0
|
3 #include "gbasys.h"
|
nuclear@0
|
4 #include "gbacycle.h"
|
nuclear@0
|
5
|
nuclear@0
|
6 /* data files in C arrays */
|
nuclear@0
|
7 #include "data/dashbg.h" /* dash_img */
|
nuclear@0
|
8 #include "data/7seg-big.h" /* digits_img */
|
nuclear@0
|
9 #include "data/7seg-sm.h" /* digits_small_img */
|
nuclear@0
|
10 #include "data/led_blue.h" /* led_blue_img */
|
nuclear@0
|
11 #include "data/led_red.h" /* led_red_img */
|
nuclear@0
|
12 #include "data/led_off.h" /* led_off_img */
|
nuclear@0
|
13
|
nuclear@0
|
14 static void dash_draw(void);
|
nuclear@0
|
15 static void draw_speed(void);
|
nuclear@0
|
16 static void draw_dist(void);
|
nuclear@0
|
17 static void draw_leds(void);
|
nuclear@0
|
18 static void dash_keyb(unsigned int keys);
|
nuclear@0
|
19
|
nuclear@0
|
20 static struct pixel_buffer dash;
|
nuclear@0
|
21 static struct pixel_buffer digits, digits_small;
|
nuclear@0
|
22 static struct pixel_buffer led_blue, led_red, led_off;
|
nuclear@0
|
23
|
nuclear@0
|
24 static struct {
|
nuclear@0
|
25 int x, y;
|
nuclear@0
|
26 } ledpos[] = {
|
nuclear@0
|
27 {31, 138}, {25, 130}, {19, 120}, {16, 111},
|
nuclear@0
|
28 {13, 100}, {12, 90}, {12, 79}, {14, 70},
|
nuclear@0
|
29 {17, 60}, {22, 51}, {28, 42}, {35, 34},
|
nuclear@0
|
30 {44, 27}, {52, 22}, {63, 17}, {72, 14},
|
nuclear@0
|
31 {83, 13},
|
nuclear@0
|
32 {92, 13}, {103, 14}, {112, 17}, {123, 22},
|
nuclear@0
|
33 {131, 27}, {140, 34}, {147, 42}, {153, 51},
|
nuclear@0
|
34 {158, 60}, {161, 70}, {163, 79}, {163, 90},
|
nuclear@0
|
35 {162, 100}, {159, 111}, {156, 120}, {150, 130},
|
nuclear@0
|
36 {144, 138}
|
nuclear@0
|
37 };
|
nuclear@0
|
38 static const int nleds = sizeof ledpos / sizeof *ledpos;
|
nuclear@0
|
39
|
nuclear@0
|
40 void init_dash(void)
|
nuclear@0
|
41 {
|
nuclear@0
|
42 dash.x = 183;
|
nuclear@0
|
43 dash.y = 160;
|
nuclear@0
|
44 dash.bpp = 16;
|
nuclear@0
|
45 dash.pixels = (unsigned short*)dash_img;
|
nuclear@0
|
46
|
nuclear@0
|
47 digits.x = 300;
|
nuclear@0
|
48 digits.y = 34;
|
nuclear@0
|
49 digits.bpp = 16;
|
nuclear@0
|
50 digits.pixels = (unsigned short*)digits_img;
|
nuclear@0
|
51
|
nuclear@0
|
52 digits_small.x = 150;
|
nuclear@0
|
53 digits_small.y = 17;
|
nuclear@0
|
54 digits_small.bpp = 16;
|
nuclear@0
|
55 digits_small.pixels = (unsigned short*)digits_small_img;
|
nuclear@0
|
56
|
nuclear@0
|
57 led_blue.x = led_blue.y = 8;
|
nuclear@0
|
58 led_blue.bpp = 16;
|
nuclear@0
|
59 led_blue.pixels = (unsigned short*)led_blue_img;
|
nuclear@0
|
60
|
nuclear@0
|
61 led_red.x = led_red.y = 8;
|
nuclear@0
|
62 led_red.bpp = 16;
|
nuclear@0
|
63 led_red.pixels = (unsigned short*)led_red_img;
|
nuclear@0
|
64
|
nuclear@0
|
65 led_off.x = led_off.y = 8;
|
nuclear@0
|
66 led_off.bpp = 16;
|
nuclear@0
|
67 led_off.pixels = (unsigned short*)led_off_img;
|
nuclear@0
|
68 }
|
nuclear@0
|
69
|
nuclear@0
|
70 void start_dash(void)
|
nuclear@0
|
71 {
|
nuclear@0
|
72 draw = dash_draw;
|
nuclear@0
|
73 keyb = dash_keyb;
|
nuclear@0
|
74 }
|
nuclear@0
|
75
|
nuclear@0
|
76 static void dash_draw(void)
|
nuclear@0
|
77 {
|
nuclear@0
|
78 dash_keyb(get_key_state(KEY_ALL));
|
nuclear@0
|
79
|
nuclear@0
|
80 clear_buffer(back_buffer, 0);
|
nuclear@0
|
81
|
nuclear@0
|
82 /* backdrop */
|
nuclear@0
|
83 blit(&dash, 0, 0, -1, -1, back_buffer, 28, 0);
|
nuclear@0
|
84
|
nuclear@0
|
85 draw_speed();
|
nuclear@0
|
86 draw_dist();
|
nuclear@0
|
87 draw_leds();
|
nuclear@0
|
88
|
nuclear@0
|
89 if(dbg) {
|
nuclear@0
|
90 set_text_color(RGB(255, 0, 0), RGB(1, 2, 155));
|
nuclear@0
|
91 draw_string("rot/s", 152, 92, back_buffer);
|
nuclear@0
|
92 draw_string("rot", 156, 144, back_buffer);
|
nuclear@0
|
93 }
|
nuclear@0
|
94
|
nuclear@0
|
95 flip();
|
nuclear@0
|
96 }
|
nuclear@0
|
97
|
nuclear@0
|
98 static void draw_speed(void)
|
nuclear@0
|
99 {
|
nuclear@0
|
100 int i, digit, pos = 120;
|
nuclear@0
|
101 int speed = dbg ? (speed_rp2s / 2) : speed_kmh;
|
nuclear@0
|
102
|
nuclear@0
|
103 for(i=0; i<2; i++) {
|
nuclear@0
|
104 digit = speed % 10;
|
nuclear@0
|
105 speed /= 10;
|
nuclear@0
|
106
|
nuclear@0
|
107 blit(&digits, digit * 30, 0, 30, -1, back_buffer, pos, 75);
|
nuclear@0
|
108
|
nuclear@0
|
109 pos -= 30;
|
nuclear@0
|
110 }
|
nuclear@0
|
111 }
|
nuclear@0
|
112
|
nuclear@0
|
113 static void draw_dist(void)
|
nuclear@0
|
114 {
|
nuclear@0
|
115 int i, digit, pos = 140;
|
nuclear@0
|
116 long dist = dbg ? nrot : (dist_cm / 10000);
|
nuclear@0
|
117
|
nuclear@0
|
118 for(i=0; i<5; i++) {
|
nuclear@0
|
119 digit = dist % 10;
|
nuclear@0
|
120 dist /= 10;
|
nuclear@0
|
121
|
nuclear@0
|
122 blit(&digits_small, digit * 15, 0, 15, -1, back_buffer, pos, 136);
|
nuclear@0
|
123
|
nuclear@0
|
124 pos -= 15;
|
nuclear@0
|
125 }
|
nuclear@0
|
126 }
|
nuclear@0
|
127
|
nuclear@0
|
128 static void draw_leds(void)
|
nuclear@0
|
129 {
|
nuclear@0
|
130 int i;
|
nuclear@0
|
131 int speed = dbg ? (speed_rp2s / 2) : speed_kmh;
|
nuclear@0
|
132
|
nuclear@0
|
133 for(i=0; i<nleds; i++) {
|
nuclear@0
|
134 struct pixel_buffer *img;
|
nuclear@0
|
135
|
nuclear@0
|
136 if(i < speed) {
|
nuclear@0
|
137 img = i < 20 ? &led_blue : &led_red;
|
nuclear@0
|
138 } else {
|
nuclear@0
|
139 img = &led_off;
|
nuclear@0
|
140 }
|
nuclear@0
|
141 blit(img, 0, 0, -1, -1, back_buffer, 28 + ledpos[i].x, ledpos[i].y);
|
nuclear@0
|
142 }
|
nuclear@0
|
143 }
|
nuclear@0
|
144
|
nuclear@0
|
145 static void dash_keyb(unsigned int keys)
|
nuclear@0
|
146 {
|
nuclear@0
|
147 if(keys & KEY_UP) {
|
nuclear@0
|
148 speed_kmh += 1;
|
nuclear@0
|
149 }
|
nuclear@0
|
150 if((keys & KEY_DOWN) && speed_kmh > 0) {
|
nuclear@0
|
151 speed_kmh -= 1;
|
nuclear@0
|
152 }
|
nuclear@0
|
153
|
nuclear@0
|
154 if(keys & KEY_RIGHT) {
|
nuclear@0
|
155 dist_cm += 10;
|
nuclear@0
|
156 }
|
nuclear@0
|
157 if((keys & KEY_LEFT) && dist_cm >= 10) {
|
nuclear@0
|
158 dist_cm -= 10;
|
nuclear@0
|
159 }
|
nuclear@0
|
160 }
|