Bop-It Game
Dependencies: TextLCD mbed ADXL345 VS1053b
Diff: main.cpp
- Revision:
- 0:d16ac399135a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Oct 19 18:04:48 2011 +0000 @@ -0,0 +1,215 @@ +#include "mbed.h" +#include <mpr121.h> +#include <VS1053.h> +#include <ADXL345.h> +#include <ctime> +#include <stdlib.h> +#include <math.h> +#include "TextLCD.h" + +DigitalOut myled1(LED1); +DigitalOut myled2(LED2); +DigitalOut myled3(LED3); +DigitalOut myled4(LED4); +PwmOut tone(p21); +AnalogIn slider(p20); +ADXL345 accelerometer(p5, p6, p7, p8); +Serial pc(USBTX, USBRX); +I2C i2c(p28, p27); //For touch sensor +Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); //touch sensor class +TextLCD lcd(p12, p13, p14, p15, p16, p17); + +// Tickers for game loop functions +Timeout ticker1; +Timeout ticker2; + +InterruptIn TouchPad(p26); +InterruptIn AccTap(p11); +DigitalOut myled5(p29); +DigitalOut myled6(p30); +volatile int Test = 0x0000; +volatile int check = 0; +volatile int i; +volatile int c = 0; +volatile int command = 1; +volatile int ButtonsPressed = 0x0000; +volatile float slid = 0.0; +volatile float Prevslid = 0.0; +volatile float time1 = 2000000; +volatile float time2 = 1500000; +volatile int commandtemp = 0; +volatile int commandarray[20]; +volatile int fail = 0; + +void CheckInput(void); + +void AccTapISR() { + if (command == 1) { + myled4 = !myled4; + command = 0; + } else { + fail = 1; + } +} + +void TouchPadISR() { + myled5 = !myled5; + if (command == 2) { + //ButtonsPressed |= mpr121.read(0x00); + mpr121.read(0x00); + //ButtonsPressed |= mpr121.read(0x01)<<8; + ++ButtonsPressed; + if ((ButtonsPressed >= 6) && (ButtonsPressed < 12)) { //0x0F9F) { + myled4 = !myled4; + ButtonsPressed = 0; + command = 0; + fail = 0; + } else if (ButtonsPressed > 12) { + fail = 21; + } + + + } /*else { + fail = 23; + ButtonsPressed = 0; + }*/ +} + + +///Ticker1 function to generate random command number from 1-3 +void Command() { + myled6 = !myled6; + // command = 1; + check = 1; + command = commandarray[c]; + c++; + if ( c == 20) c = 0; + lcd.cls(); + if (command == 1) { + //lcd.printf("Bop-It!\n"); + myled1 = 1; + myled2 = 0; + myled3 = 0; + } else if (command == 2) { + //lcd.printf("Square-It!\n"); + myled1 = 0; + myled2 = 1; + myled3 = 0; + } else if (command == 3) { + //lcd.printf("Slide-It!\n"); + myled1 = 0; + myled2 = 0; + myled3 = 1; + } + tone = .5; + ticker2.attach_us(&CheckInput,time2 ); + + time2 = time2 - 50000; +} + +void CheckInput() { + ticker1.attach_us(&Command,time1); + time1 = time1 - 50000; + if (command == 3) { + Prevslid = slid; + slid = slider; + if (abs(slid - Prevslid) > .5) { + myled4 = !myled4; + command = 0; + } + if (command) { + fail = 3; + } + } + if (command && (command != 3)) + fail = 4; + accelerometer.getInterruptSource(); +} + + +int main() { + srand( time(NULL)); + printf("Start up \n"); + lcd.printf("Play Bop-It!\n"); + for (i=0; i< 20; i++) { + commandtemp = rand() % 10; + // printf("Before: %i \n \f", commandtemp); + if (commandtemp == 0) { + commandtemp = 8; + } + if (commandtemp == 9) { + commandtemp = 8; + } + commandtemp = (commandtemp/3) + 1; + // printf("After: %i \n", commandtemp); + commandarray[i] = commandtemp; + } + + tone.period_ms(1); + + accelerometer.setPowerControl(0x00); + accelerometer.setDataFormatControl(0x0A); + accelerometer.setDataRate(ADXL345_3200HZ); + accelerometer.setInterruptEnableControl(0x01 << 6); + accelerometer.setInterruptMappingControl(0x00); + accelerometer.setTapThreshold(0x8); + accelerometer.setTapDuration(6000); + accelerometer.setTapAxisControl(0x04); + accelerometer.setPowerControl(0x08); + + mpr121.write(0x77, 0x00); + mpr121.write(0x5E, 0x0C); + + AccTap.rise(&AccTapISR); + accelerometer.getInterruptSource(); + TouchPad.fall(&TouchPadISR); + TouchPad.mode(PullUp); + ticker1.attach_us( &Command, time1); + slid = slider; + int count = 0; + while (1) { + //printf("%X\n",ButtonsPressed); + + //wait(.26); + + __disable_irq(); + if (check) { + if (command == 1) { + lcd.cls(); + lcd.printf("Bop-It!\n"); + myled1 = 1; + myled2 = 0; + myled3 = 0; + tone = 0; + } else if (command == 2) { + lcd.cls(); + lcd.printf("Touch Three!\n"); + myled1 = 0; + myled2 = 1; + myled3 = 0; + tone = 0; + } else if (command == 3) { + lcd.cls(); + lcd.printf("Slide-It!\n"); + myled1 = 0; + myled2 = 0; + myled3 = 1; + tone = 0; + } + check = 0; + } + if (fail) { + ticker1.detach(); + ticker2.detach(); + lcd.cls(); + lcd.printf("Failed on: %d\n", fail); + tone.period_ms(2.3); + tone = .5; + wait(.5); + tone = 0; + while (1); + } + __enable_irq(); + } + +}