Bop-It Game

Dependencies:   TextLCD mbed ADXL345 VS1053b

Committer:
jdumond3
Date:
Wed Oct 19 18:04:48 2011 +0000
Revision:
0:d16ac399135a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jdumond3 0:d16ac399135a 1 #include "mbed.h"
jdumond3 0:d16ac399135a 2 #include <mpr121.h>
jdumond3 0:d16ac399135a 3 #include <VS1053.h>
jdumond3 0:d16ac399135a 4 #include <ADXL345.h>
jdumond3 0:d16ac399135a 5 #include <ctime>
jdumond3 0:d16ac399135a 6 #include <stdlib.h>
jdumond3 0:d16ac399135a 7 #include <math.h>
jdumond3 0:d16ac399135a 8 #include "TextLCD.h"
jdumond3 0:d16ac399135a 9
jdumond3 0:d16ac399135a 10 DigitalOut myled1(LED1);
jdumond3 0:d16ac399135a 11 DigitalOut myled2(LED2);
jdumond3 0:d16ac399135a 12 DigitalOut myled3(LED3);
jdumond3 0:d16ac399135a 13 DigitalOut myled4(LED4);
jdumond3 0:d16ac399135a 14 PwmOut tone(p21);
jdumond3 0:d16ac399135a 15 AnalogIn slider(p20);
jdumond3 0:d16ac399135a 16 ADXL345 accelerometer(p5, p6, p7, p8);
jdumond3 0:d16ac399135a 17 Serial pc(USBTX, USBRX);
jdumond3 0:d16ac399135a 18 I2C i2c(p28, p27); //For touch sensor
jdumond3 0:d16ac399135a 19 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); //touch sensor class
jdumond3 0:d16ac399135a 20 TextLCD lcd(p12, p13, p14, p15, p16, p17);
jdumond3 0:d16ac399135a 21
jdumond3 0:d16ac399135a 22 // Tickers for game loop functions
jdumond3 0:d16ac399135a 23 Timeout ticker1;
jdumond3 0:d16ac399135a 24 Timeout ticker2;
jdumond3 0:d16ac399135a 25
jdumond3 0:d16ac399135a 26 InterruptIn TouchPad(p26);
jdumond3 0:d16ac399135a 27 InterruptIn AccTap(p11);
jdumond3 0:d16ac399135a 28 DigitalOut myled5(p29);
jdumond3 0:d16ac399135a 29 DigitalOut myled6(p30);
jdumond3 0:d16ac399135a 30 volatile int Test = 0x0000;
jdumond3 0:d16ac399135a 31 volatile int check = 0;
jdumond3 0:d16ac399135a 32 volatile int i;
jdumond3 0:d16ac399135a 33 volatile int c = 0;
jdumond3 0:d16ac399135a 34 volatile int command = 1;
jdumond3 0:d16ac399135a 35 volatile int ButtonsPressed = 0x0000;
jdumond3 0:d16ac399135a 36 volatile float slid = 0.0;
jdumond3 0:d16ac399135a 37 volatile float Prevslid = 0.0;
jdumond3 0:d16ac399135a 38 volatile float time1 = 2000000;
jdumond3 0:d16ac399135a 39 volatile float time2 = 1500000;
jdumond3 0:d16ac399135a 40 volatile int commandtemp = 0;
jdumond3 0:d16ac399135a 41 volatile int commandarray[20];
jdumond3 0:d16ac399135a 42 volatile int fail = 0;
jdumond3 0:d16ac399135a 43
jdumond3 0:d16ac399135a 44 void CheckInput(void);
jdumond3 0:d16ac399135a 45
jdumond3 0:d16ac399135a 46 void AccTapISR() {
jdumond3 0:d16ac399135a 47 if (command == 1) {
jdumond3 0:d16ac399135a 48 myled4 = !myled4;
jdumond3 0:d16ac399135a 49 command = 0;
jdumond3 0:d16ac399135a 50 } else {
jdumond3 0:d16ac399135a 51 fail = 1;
jdumond3 0:d16ac399135a 52 }
jdumond3 0:d16ac399135a 53 }
jdumond3 0:d16ac399135a 54
jdumond3 0:d16ac399135a 55 void TouchPadISR() {
jdumond3 0:d16ac399135a 56 myled5 = !myled5;
jdumond3 0:d16ac399135a 57 if (command == 2) {
jdumond3 0:d16ac399135a 58 //ButtonsPressed |= mpr121.read(0x00);
jdumond3 0:d16ac399135a 59 mpr121.read(0x00);
jdumond3 0:d16ac399135a 60 //ButtonsPressed |= mpr121.read(0x01)<<8;
jdumond3 0:d16ac399135a 61 ++ButtonsPressed;
jdumond3 0:d16ac399135a 62 if ((ButtonsPressed >= 6) && (ButtonsPressed < 12)) { //0x0F9F) {
jdumond3 0:d16ac399135a 63 myled4 = !myled4;
jdumond3 0:d16ac399135a 64 ButtonsPressed = 0;
jdumond3 0:d16ac399135a 65 command = 0;
jdumond3 0:d16ac399135a 66 fail = 0;
jdumond3 0:d16ac399135a 67 } else if (ButtonsPressed > 12) {
jdumond3 0:d16ac399135a 68 fail = 21;
jdumond3 0:d16ac399135a 69 }
jdumond3 0:d16ac399135a 70
jdumond3 0:d16ac399135a 71
jdumond3 0:d16ac399135a 72 } /*else {
jdumond3 0:d16ac399135a 73 fail = 23;
jdumond3 0:d16ac399135a 74 ButtonsPressed = 0;
jdumond3 0:d16ac399135a 75 }*/
jdumond3 0:d16ac399135a 76 }
jdumond3 0:d16ac399135a 77
jdumond3 0:d16ac399135a 78
jdumond3 0:d16ac399135a 79 ///Ticker1 function to generate random command number from 1-3
jdumond3 0:d16ac399135a 80 void Command() {
jdumond3 0:d16ac399135a 81 myled6 = !myled6;
jdumond3 0:d16ac399135a 82 // command = 1;
jdumond3 0:d16ac399135a 83 check = 1;
jdumond3 0:d16ac399135a 84 command = commandarray[c];
jdumond3 0:d16ac399135a 85 c++;
jdumond3 0:d16ac399135a 86 if ( c == 20) c = 0;
jdumond3 0:d16ac399135a 87 lcd.cls();
jdumond3 0:d16ac399135a 88 if (command == 1) {
jdumond3 0:d16ac399135a 89 //lcd.printf("Bop-It!\n");
jdumond3 0:d16ac399135a 90 myled1 = 1;
jdumond3 0:d16ac399135a 91 myled2 = 0;
jdumond3 0:d16ac399135a 92 myled3 = 0;
jdumond3 0:d16ac399135a 93 } else if (command == 2) {
jdumond3 0:d16ac399135a 94 //lcd.printf("Square-It!\n");
jdumond3 0:d16ac399135a 95 myled1 = 0;
jdumond3 0:d16ac399135a 96 myled2 = 1;
jdumond3 0:d16ac399135a 97 myled3 = 0;
jdumond3 0:d16ac399135a 98 } else if (command == 3) {
jdumond3 0:d16ac399135a 99 //lcd.printf("Slide-It!\n");
jdumond3 0:d16ac399135a 100 myled1 = 0;
jdumond3 0:d16ac399135a 101 myled2 = 0;
jdumond3 0:d16ac399135a 102 myled3 = 1;
jdumond3 0:d16ac399135a 103 }
jdumond3 0:d16ac399135a 104 tone = .5;
jdumond3 0:d16ac399135a 105 ticker2.attach_us(&CheckInput,time2 );
jdumond3 0:d16ac399135a 106
jdumond3 0:d16ac399135a 107 time2 = time2 - 50000;
jdumond3 0:d16ac399135a 108 }
jdumond3 0:d16ac399135a 109
jdumond3 0:d16ac399135a 110 void CheckInput() {
jdumond3 0:d16ac399135a 111 ticker1.attach_us(&Command,time1);
jdumond3 0:d16ac399135a 112 time1 = time1 - 50000;
jdumond3 0:d16ac399135a 113 if (command == 3) {
jdumond3 0:d16ac399135a 114 Prevslid = slid;
jdumond3 0:d16ac399135a 115 slid = slider;
jdumond3 0:d16ac399135a 116 if (abs(slid - Prevslid) > .5) {
jdumond3 0:d16ac399135a 117 myled4 = !myled4;
jdumond3 0:d16ac399135a 118 command = 0;
jdumond3 0:d16ac399135a 119 }
jdumond3 0:d16ac399135a 120 if (command) {
jdumond3 0:d16ac399135a 121 fail = 3;
jdumond3 0:d16ac399135a 122 }
jdumond3 0:d16ac399135a 123 }
jdumond3 0:d16ac399135a 124 if (command && (command != 3))
jdumond3 0:d16ac399135a 125 fail = 4;
jdumond3 0:d16ac399135a 126 accelerometer.getInterruptSource();
jdumond3 0:d16ac399135a 127 }
jdumond3 0:d16ac399135a 128
jdumond3 0:d16ac399135a 129
jdumond3 0:d16ac399135a 130 int main() {
jdumond3 0:d16ac399135a 131 srand( time(NULL));
jdumond3 0:d16ac399135a 132 printf("Start up \n");
jdumond3 0:d16ac399135a 133 lcd.printf("Play Bop-It!\n");
jdumond3 0:d16ac399135a 134 for (i=0; i< 20; i++) {
jdumond3 0:d16ac399135a 135 commandtemp = rand() % 10;
jdumond3 0:d16ac399135a 136 // printf("Before: %i \n \f", commandtemp);
jdumond3 0:d16ac399135a 137 if (commandtemp == 0) {
jdumond3 0:d16ac399135a 138 commandtemp = 8;
jdumond3 0:d16ac399135a 139 }
jdumond3 0:d16ac399135a 140 if (commandtemp == 9) {
jdumond3 0:d16ac399135a 141 commandtemp = 8;
jdumond3 0:d16ac399135a 142 }
jdumond3 0:d16ac399135a 143 commandtemp = (commandtemp/3) + 1;
jdumond3 0:d16ac399135a 144 // printf("After: %i \n", commandtemp);
jdumond3 0:d16ac399135a 145 commandarray[i] = commandtemp;
jdumond3 0:d16ac399135a 146 }
jdumond3 0:d16ac399135a 147
jdumond3 0:d16ac399135a 148 tone.period_ms(1);
jdumond3 0:d16ac399135a 149
jdumond3 0:d16ac399135a 150 accelerometer.setPowerControl(0x00);
jdumond3 0:d16ac399135a 151 accelerometer.setDataFormatControl(0x0A);
jdumond3 0:d16ac399135a 152 accelerometer.setDataRate(ADXL345_3200HZ);
jdumond3 0:d16ac399135a 153 accelerometer.setInterruptEnableControl(0x01 << 6);
jdumond3 0:d16ac399135a 154 accelerometer.setInterruptMappingControl(0x00);
jdumond3 0:d16ac399135a 155 accelerometer.setTapThreshold(0x8);
jdumond3 0:d16ac399135a 156 accelerometer.setTapDuration(6000);
jdumond3 0:d16ac399135a 157 accelerometer.setTapAxisControl(0x04);
jdumond3 0:d16ac399135a 158 accelerometer.setPowerControl(0x08);
jdumond3 0:d16ac399135a 159
jdumond3 0:d16ac399135a 160 mpr121.write(0x77, 0x00);
jdumond3 0:d16ac399135a 161 mpr121.write(0x5E, 0x0C);
jdumond3 0:d16ac399135a 162
jdumond3 0:d16ac399135a 163 AccTap.rise(&AccTapISR);
jdumond3 0:d16ac399135a 164 accelerometer.getInterruptSource();
jdumond3 0:d16ac399135a 165 TouchPad.fall(&TouchPadISR);
jdumond3 0:d16ac399135a 166 TouchPad.mode(PullUp);
jdumond3 0:d16ac399135a 167 ticker1.attach_us( &Command, time1);
jdumond3 0:d16ac399135a 168 slid = slider;
jdumond3 0:d16ac399135a 169 int count = 0;
jdumond3 0:d16ac399135a 170 while (1) {
jdumond3 0:d16ac399135a 171 //printf("%X\n",ButtonsPressed);
jdumond3 0:d16ac399135a 172
jdumond3 0:d16ac399135a 173 //wait(.26);
jdumond3 0:d16ac399135a 174
jdumond3 0:d16ac399135a 175 __disable_irq();
jdumond3 0:d16ac399135a 176 if (check) {
jdumond3 0:d16ac399135a 177 if (command == 1) {
jdumond3 0:d16ac399135a 178 lcd.cls();
jdumond3 0:d16ac399135a 179 lcd.printf("Bop-It!\n");
jdumond3 0:d16ac399135a 180 myled1 = 1;
jdumond3 0:d16ac399135a 181 myled2 = 0;
jdumond3 0:d16ac399135a 182 myled3 = 0;
jdumond3 0:d16ac399135a 183 tone = 0;
jdumond3 0:d16ac399135a 184 } else if (command == 2) {
jdumond3 0:d16ac399135a 185 lcd.cls();
jdumond3 0:d16ac399135a 186 lcd.printf("Touch Three!\n");
jdumond3 0:d16ac399135a 187 myled1 = 0;
jdumond3 0:d16ac399135a 188 myled2 = 1;
jdumond3 0:d16ac399135a 189 myled3 = 0;
jdumond3 0:d16ac399135a 190 tone = 0;
jdumond3 0:d16ac399135a 191 } else if (command == 3) {
jdumond3 0:d16ac399135a 192 lcd.cls();
jdumond3 0:d16ac399135a 193 lcd.printf("Slide-It!\n");
jdumond3 0:d16ac399135a 194 myled1 = 0;
jdumond3 0:d16ac399135a 195 myled2 = 0;
jdumond3 0:d16ac399135a 196 myled3 = 1;
jdumond3 0:d16ac399135a 197 tone = 0;
jdumond3 0:d16ac399135a 198 }
jdumond3 0:d16ac399135a 199 check = 0;
jdumond3 0:d16ac399135a 200 }
jdumond3 0:d16ac399135a 201 if (fail) {
jdumond3 0:d16ac399135a 202 ticker1.detach();
jdumond3 0:d16ac399135a 203 ticker2.detach();
jdumond3 0:d16ac399135a 204 lcd.cls();
jdumond3 0:d16ac399135a 205 lcd.printf("Failed on: %d\n", fail);
jdumond3 0:d16ac399135a 206 tone.period_ms(2.3);
jdumond3 0:d16ac399135a 207 tone = .5;
jdumond3 0:d16ac399135a 208 wait(.5);
jdumond3 0:d16ac399135a 209 tone = 0;
jdumond3 0:d16ac399135a 210 while (1);
jdumond3 0:d16ac399135a 211 }
jdumond3 0:d16ac399135a 212 __enable_irq();
jdumond3 0:d16ac399135a 213 }
jdumond3 0:d16ac399135a 214
jdumond3 0:d16ac399135a 215 }