4180 Lab 4 v1.0
Dependencies: 4DGL-uLCD-SE mbed
Fork of MPR121_Demo by
main.cpp
- Committer:
- jsobchuk3
- Date:
- 2014-10-20
- Revision:
- 1:288da1e5d10b
- Parent:
- 0:e09703934ff4
File content as of revision 1:288da1e5d10b:
/*
Dhruvin Desai and Joseph Sobchuk
fallInterrupt() and API for mpr121 written by Anthony Buckton in 2011
*/
#include <mbed.h>
#include <mpr121.h> // Thanks to Anthony Buckton
#include "uLCD_4DGL.h"
uLCD_4DGL uLCD(p28,p27,p29);
// Create the interrupt receiver object on pin 26
InterruptIn interrupt(p26);
// Setup the i2c bus on pins 9 and 10
I2C i2c(p9, p10);
// Setup the Mpr121:
// constructor(i2c object, i2c address of the mpr121)
Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
int on [9] = {0,0,0,0,0,0,0,0,0};
int key;
int radius = 15;
int initpos = 23; // Initial x and y shift from the edge of the display
int shift = 40; // Space in between each circle
// Function to invert any specified circle
void invert(int on [9], int circleN) {
switch (circleN) {
case 1:
if (on[0] == 0) { // If circle 1 is off then Fill 1st Circle
uLCD.filled_circle(initpos, initpos, radius, RED); // Fill 1st Circle
on[0] = 1; // Then change status of circle 1 to on
}
else if (on[0] == 1) { // If circle 1 is on then erase 1st circle
uLCD.filled_circle(initpos, initpos, radius, BLACK);
uLCD.circle(initpos, initpos, radius, RED); // Erase 1st Circle
on[0] = 0;
}
break;
case 2:
if (on[1] == 0) {
uLCD.filled_circle(initpos + shift, initpos, radius, RED); // Fill 2nd Circle
on[1] = 1;
}
else if (on[1] == 1) {
uLCD.filled_circle(initpos + shift, initpos, radius, BLACK);
uLCD.circle(initpos + shift, initpos, radius, RED); // Erase 2nd Circle
on[1] = 0;
}
break;
case 3:
if (on[2] == 0) {
uLCD.filled_circle(initpos + 2*shift, initpos, radius, RED);
on[2] = 1;
}
else if (on[2] == 1) {
uLCD.filled_circle(initpos + 2*shift, initpos, radius, BLACK);
uLCD.circle(initpos + 2*shift, initpos, radius, RED);
on[2] = 0;
}
break;
case 4:
if (on[3] == 0) {
uLCD.filled_circle(initpos, initpos + shift, radius, RED); // Fill 4th Circle
on[3] = 1;
}
else if (on[3] == 1) {
uLCD.filled_circle(initpos, initpos + shift, radius, BLACK);
uLCD.circle(initpos, initpos + shift, radius, RED); // Erase 4th Circle
on[3] = 0;
}
break;
case 5:
if (on[4] == 0) {
uLCD.filled_circle(initpos + shift, initpos + shift, radius, RED); // Fill 5th Circle
on[4] = 1;
}
else if (on[4] == 1) {
uLCD.filled_circle(initpos + shift, initpos + shift, radius, BLACK);
uLCD.circle(initpos + shift, initpos + shift, radius, RED); // Erase 5th Circle
on[4] = 0;
}
break;
case 6:
if (on[5] == 0) {
uLCD.filled_circle(initpos + 2*shift, initpos + shift, radius, RED); // Fill 6th Circle
on[5] = 1;
}
else if (on[5] == 1) {
uLCD.filled_circle(initpos + 2*shift, initpos + shift, radius, BLACK);
uLCD.circle(initpos + 2*shift, initpos + shift, radius, RED); // Erase 6th Circle
on[5] = 0;
}
break;
case 7:
if (on[6] == 0) {
uLCD.filled_circle(initpos, initpos + 2*shift, radius, RED); // Fill 7th Circle
on[6] = 1;
}
else if (on[6] == 1) {
uLCD.filled_circle(initpos, initpos + 2*shift, radius, BLACK); // Erase 7th Circle
uLCD.circle(initpos, initpos + 2*shift, radius, RED);
on[6] = 0;
}
break;
case 8:
if (on[7] == 0) {
uLCD.filled_circle(initpos + shift, initpos + 2*shift, radius, RED); // Fill 8th Circle
on[7] = 1;
}
else if (on[7] == 1) {
uLCD.filled_circle(initpos + shift, initpos + 2*shift, radius, BLACK); // Erase 8th Circle
uLCD.circle(initpos + shift, initpos + 2*shift, radius, RED);
on[7] = 0;
}
break;
case 9:
if (on[8] == 0) {
uLCD.filled_circle(initpos + 2*shift, initpos + 2*shift, radius, RED); // Fill 9th Circle
on[8] = 1;
}
else if (on[8] == 1) {
uLCD.filled_circle(initpos + 2*shift, initpos + 2*shift, radius, BLACK);
uLCD.circle(initpos + 2*shift, initpos + 2*shift, radius, RED); // Erase 9th Circle
on[8] = 0;
}
break;
}
}
void pushButton(int on [9],int key_code) {
// The winning combination of buttons is 0,2,4,8 (1,3,5,9 in key_codes)
// The rest of the buttons are programmed to give bogus combinations to confuse the player, but one of them might coincidently win the game.
switch (key_code) {
case 2:
invert(on,7);
invert(on,4);
invert(on,5);
invert(on,8);
break;
case 3:
invert(on,7);
invert(on,4);
invert(on,1);
break;
case 4:
invert(on,2);
invert(on,4);
invert(on,5);
invert(on,1);
break;
case 6:
invert(on,9);
invert(on,7);
invert(on,8);
break;
case 7:
invert(on,2);
invert(on,5);
invert(on,4);
invert(on,8);
invert(on,6);
break;
case 8:
invert(on,1);
invert(on,2);
invert(on,3);
break;
case 10:
invert(on,8);
invert(on,9);
invert(on,5);
invert(on,6);
break;
case 11:
invert(on,9);
invert(on,6);
invert(on,3);
break;
case 12:
invert(on,2);
invert(on,3);
invert(on,6);
invert(on,5);
break;
}
}
// Key hit/release interrupt routine thanks to Anthony Buckton
void fallInterrupt() {
int key_code = 0;
int i = 0;
int value = mpr121.read(0x00);
value += mpr121.read(0x01) << 8;
// LED demo mod
i = 0;
// puts key number out to LEDs for demo
for (i=0; i<12; i++) {
if (((value>>i)&0x01)==1) {
key_code=i+1;
}
}
key = key_code;
}
int main() {
int j;
uLCD.rectangle(0,0,127,127,WHITE); // Draw border
// Draw empty circles in correct positions
uLCD.circle(initpos, initpos, radius, RED);
uLCD.circle(initpos + shift, initpos, radius, RED);
uLCD.circle(initpos + 2*shift, initpos, radius, RED);
uLCD.circle(initpos, initpos + shift, radius, RED);
uLCD.circle(initpos + shift, initpos + shift, radius, RED);
uLCD.circle(initpos + 2*shift, initpos + shift, radius, RED);
uLCD.circle(initpos, initpos + 2*shift, radius, RED);
uLCD.circle(initpos + shift, initpos + 2*shift, radius, RED);
uLCD.circle(initpos + 2*shift, initpos + 2*shift, radius, RED);
interrupt.fall(&fallInterrupt);
interrupt.mode(PullUp);
while (1) {
// Call pushButton once button is pressed by passing the key of the button pushed and the status of the circles
if(key != 0) {
pushButton(on, key);
if(key != 1)key = 0;
}
// If all circles are filled, then print You win!!! Reset the mbed
if (key == 1 || (on[0] && on[1] && on[2] && on[3] && on[4] && on[5] && on[6] && on[7] && on[8])) {
uLCD.locate(5,5);
if(key != 1) uLCD.printf("You Win!!!");
uLCD.locate(0,7);
uLCD.printf("Resetting the game");
wait(3);
for (j = 0; j < 9; j++) {
on[j] = rand() % 2;
}
uLCD.filled_rectangle(0,0,127,127,BLACK);// Erase Everything
uLCD.rectangle(0,0,127,127,WHITE); // Draw border
// Draw empty circles in correct positions
uLCD.circle(initpos, initpos, radius, RED);
uLCD.circle(initpos + shift, initpos, radius, RED);
uLCD.circle(initpos + 2*shift, initpos, radius, RED);
uLCD.circle(initpos, initpos + shift, radius, RED);
uLCD.circle(initpos + shift, initpos + shift, radius, RED);
uLCD.circle(initpos + 2*shift, initpos + shift, radius, RED);
uLCD.circle(initpos, initpos + 2*shift, radius, RED);
uLCD.circle(initpos + shift, initpos + 2*shift, radius, RED);
uLCD.circle(initpos + 2*shift, initpos + 2*shift, radius, RED);
//Make sure they match the array
for(j = 0; j < 9; j++) {
invert(on,j);
}
}
//wait(0.2); // Used wait to eliminate multiple presses of button. <- Done somewhere else
}
}
