Control the wondrous spinning-frog game of Zuma's Revenge with a rotating chair and an Airzooka. Maps compass rotation, flex sensor and push button input to USB actions to control Zuma's Revenge (http://www.popcap.com/games/zumas-revenge/online)
Dependencies: LSM303DLHC mbed
Note that content for USB HID and USB Device is actually from the USBDevice mbed library. However, we made a couple of small changes to this library (allowing USB clicks at a particular location) that required us to break it off from the main project if we wanted to publish without pushing upstream.
Diff: main.cpp
- Revision:
- 0:4df415dde990
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Sep 29 01:12:20 2014 +0000 @@ -0,0 +1,78 @@ +#include "mbed.h" +#include "LSM303DLHC.h" +#include "USBMouseKeyboard.h" + + +USBMouseKeyboard mouseKeyboard(ABS_MOUSE); +LSM303DLHC compass(PTC11, PTC10); +InterruptIn switchButton(D13); +AnalogIn fireButton(A0); + + +const float FLEX_THRESHOLD = .6; +float lastFlexValue = 0; +bool spaceHit = false; + + +void hitSpace(void) { + /* Register trigger that the SPACE control button has been hit */ + spaceHit = true; +} + + +bool wasFlexReleased(void) { + /* Check to see whether the flex sensor was released according to predetermined threshold. */ + bool released = false; + float flexValue = fireButton.read(); + if ((lastFlexValue > FLEX_THRESHOLD) && (flexValue < FLEX_THRESHOLD)) { + released = true; + } + lastFlexValue = flexValue; + return released; +} + + +int main(void) { + + /* Variables for sensing orientation */ + int16_t x_center = (X_MAX_ABS - X_MIN_ABS)/2; + int16_t y_center = (Y_MAX_ABS - Y_MIN_ABS)/2; + float xRot, yRot, nullRot; + int16_t xPos, yPos; + + /* When the switch button is hit, register SPACE getting hit */ + switchButton.fall(&hitSpace); + + while (1) { + /* This loop just checks sensors and maps them to keyboard and mouse motions that + will accurately enough control the game that has been opened in a browser + and centered in the middle of the screen. */ + + /* Detect rotation from the compass. We don't care about several compass variables, + (the ones returned into the nullRot variable) so we just pass in an unused variable. */ + /* The x and y that we compute don't appear to be perfectly accurate mappings to the + rotating compass -- the radius of the circle changes as one rotates. But the + heuristic effect we get below is good enough for playing Zuma. */ + compass.read(&nullRot, &nullRot, &nullRot, &xRot, &yRot, &nullRot); + xPos = x_center + int16_t(xRot * 12000); + yPos = y_center + int16_t(yRot * 12000); + + /* Move the mouse to a rotated position on a circle centered at the middle of the screen */ + mouseKeyboard.move(xPos, yPos); + + /* Check on flex sensor to see if ball was fired */ + bool fired = wasFlexReleased(); + if (fired) { + mouseKeyboard.click(xPos, yPos, MOUSE_LEFT); + } + + /* Check to see if button for hitting SPACE was triggered */ + if (spaceHit == true) { + mouseKeyboard.printf(" "); + spaceHit = false; + } + + /* Put a healthy amount of space between each iteration */ + wait_ms(10); + } +} \ No newline at end of file