Bop-It Game
Dependencies: TextLCD mbed ADXL345 VS1053b
main.cpp@0:d16ac399135a, 2011-10-19 (annotated)
- Committer:
- jdumond3
- Date:
- Wed Oct 19 18:04:48 2011 +0000
- Revision:
- 0:d16ac399135a
Who changed what in which revision?
User | Revision | Line number | New 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 | } |