gbacycle
annotate src/main.c @ 0:858dd5fbfef2
gbacycle import
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Thu, 08 Mar 2012 14:38:21 +0200 |
parents | |
children |
rev | line source |
---|---|
nuclear@0 | 1 #include "gbasys.h" |
nuclear@0 | 2 #include "dashboard.h" |
nuclear@0 | 3 #include "gbacycle.h" |
nuclear@0 | 4 |
nuclear@0 | 5 /* 1800 2sec intervals per hour, \times perimeter, \times x, \over 100000 cm in a kilometer */ |
nuclear@0 | 6 #define RP2S_TO_KMH(x) ((18 * WHEEL_PERIMETER * (x)) / 1000) |
nuclear@0 | 7 |
nuclear@0 | 8 /* wheel perimeter in centimeters */ |
nuclear@0 | 9 #define WHEEL_PERIMETER 194 |
nuclear@0 | 10 |
nuclear@0 | 11 static void init_input(void); |
nuclear@0 | 12 static void comm_handler(int s); |
nuclear@0 | 13 static void timer_sig(int s); |
nuclear@0 | 14 |
nuclear@0 | 15 int main(void) |
nuclear@0 | 16 { |
nuclear@0 | 17 gba_init(); |
nuclear@0 | 18 set_video_mode(VMODE_LFB_240x160_16, 1); |
nuclear@0 | 19 |
nuclear@0 | 20 init_input(); |
nuclear@0 | 21 |
nuclear@0 | 22 init_dash(); |
nuclear@0 | 23 start_dash(); |
nuclear@0 | 24 |
nuclear@0 | 25 signal(SIGALRM, timer_sig); |
nuclear@0 | 26 alarm(2); |
nuclear@0 | 27 |
nuclear@0 | 28 for(;;) { |
nuclear@0 | 29 if(get_key_state(KEY_SELECT)) { |
nuclear@0 | 30 dbg = 1; |
nuclear@0 | 31 } |
nuclear@0 | 32 if(get_key_state(KEY_START)) { |
nuclear@0 | 33 dbg = 0; |
nuclear@0 | 34 } |
nuclear@0 | 35 draw(); |
nuclear@0 | 36 } |
nuclear@0 | 37 return 0; |
nuclear@0 | 38 } |
nuclear@0 | 39 |
nuclear@0 | 40 static void init_input(void) |
nuclear@0 | 41 { |
nuclear@0 | 42 comm_setup(COMM_GPIO); |
nuclear@0 | 43 gpio_dir_mask(0); |
nuclear@0 | 44 |
nuclear@0 | 45 signal(SIGIO, comm_handler); |
nuclear@0 | 46 } |
nuclear@0 | 47 |
nuclear@0 | 48 static void comm_handler(int s) |
nuclear@0 | 49 { |
nuclear@0 | 50 static volatile unsigned long last_upd; |
nuclear@0 | 51 unsigned long msec; |
nuclear@0 | 52 |
nuclear@0 | 53 msec = get_millisec(); |
nuclear@0 | 54 |
nuclear@0 | 55 |
nuclear@0 | 56 if(msec - last_upd >= 80) { |
nuclear@0 | 57 nrot++; |
nuclear@0 | 58 dist_cm = nrot * WHEEL_PERIMETER; |
nuclear@0 | 59 last_upd = msec; |
nuclear@0 | 60 } |
nuclear@0 | 61 } |
nuclear@0 | 62 |
nuclear@0 | 63 static void timer_sig(int s) |
nuclear@0 | 64 { |
nuclear@0 | 65 volatile static unsigned long sec; |
nuclear@0 | 66 volatile static unsigned long last_rot[4]; |
nuclear@0 | 67 int idx; |
nuclear@0 | 68 |
nuclear@0 | 69 alarm(2); |
nuclear@0 | 70 |
nuclear@0 | 71 idx = ++sec & 3; |
nuclear@0 | 72 |
nuclear@0 | 73 speed_rp2s = nrot - last_rot[idx]; |
nuclear@0 | 74 speed_kmh = RP2S_TO_KMH(speed_rp2s); |
nuclear@0 | 75 |
nuclear@0 | 76 last_rot[idx] = nrot; |
nuclear@0 | 77 } |