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 }