The preloaded firmware shipped on the Roulette.

Dependencies:   TextLCD mbed

Committer:
Experiment626
Date:
Sat Sep 13 03:26:15 2014 +0000
Revision:
0:5552a00c7c9b
Child:
1:d5d57d6ba20a
Official Roulette Firmware 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Experiment626 0:5552a00c7c9b 1 #include "mbed.h"
Experiment626 0:5552a00c7c9b 2 #include "TextLCD.h"
Experiment626 0:5552a00c7c9b 3
Experiment626 0:5552a00c7c9b 4 SPI spi(P0_21, P0_22, P1_15); // mosi, miso, sclk
Experiment626 0:5552a00c7c9b 5 TextLCD lcd(P0_23, P0_16, P0_14, P0_13, P0_12, P0_11); // RS, E, D4-D7, LCDType=LCD16x2, BL=NC, E2=NC, LCDTCtrl=HD44780
Experiment626 0:5552a00c7c9b 6
Experiment626 0:5552a00c7c9b 7 DigitalOut compassLED[] = {(P0_19), (P0_9), (P0_18), (P0_8)}; // The South, West, North, East LEDs
Experiment626 0:5552a00c7c9b 8 DigitalOut OutputEnable(P0_5);
Experiment626 0:5552a00c7c9b 9 DigitalOut Latch(P0_4);
Experiment626 0:5552a00c7c9b 10 DigitalOut Buzzer(P0_22);
Experiment626 0:5552a00c7c9b 11
Experiment626 0:5552a00c7c9b 12 DigitalIn userButton1(P0_17, PullUp);
Experiment626 0:5552a00c7c9b 13 InterruptIn selectButton(P0_1);
Experiment626 0:5552a00c7c9b 14
Experiment626 0:5552a00c7c9b 15 enum CompassPoints { SOUTH = 0, WEST = 1, NORTH = 2, EAST = 3 };
Experiment626 0:5552a00c7c9b 16
Experiment626 0:5552a00c7c9b 17 void initilize();
Experiment626 0:5552a00c7c9b 18 void printToLCD(const char* text);
Experiment626 0:5552a00c7c9b 19 void RotateLEDs(float delay);
Experiment626 0:5552a00c7c9b 20 void SetLED(uint32_t LEDBitMap);
Experiment626 0:5552a00c7c9b 21 bool ReadPlayerButton();
Experiment626 0:5552a00c7c9b 22 bool ReadSelectButton();
Experiment626 0:5552a00c7c9b 23 void soundBuzzer(int Hz);
Experiment626 0:5552a00c7c9b 24 void splash();
Experiment626 0:5552a00c7c9b 25 void gameLoop();
Experiment626 0:5552a00c7c9b 26 int checkTargetHit(int currentLED);
Experiment626 0:5552a00c7c9b 27 void displayHighestLevel();
Experiment626 0:5552a00c7c9b 28 void score();
Experiment626 0:5552a00c7c9b 29 void winner();
Experiment626 0:5552a00c7c9b 30
Experiment626 0:5552a00c7c9b 31 int level;
Experiment626 0:5552a00c7c9b 32 int highestLevel;
Experiment626 0:5552a00c7c9b 33 int rotateFactor;
Experiment626 0:5552a00c7c9b 34 int LEDBitmap;
Experiment626 0:5552a00c7c9b 35 char debugString [50];
Experiment626 0:5552a00c7c9b 36
Experiment626 0:5552a00c7c9b 37 void initilize()
Experiment626 0:5552a00c7c9b 38 {
Experiment626 0:5552a00c7c9b 39 level = 1;
Experiment626 0:5552a00c7c9b 40 highestLevel = 1;
Experiment626 0:5552a00c7c9b 41 rotateFactor = 5;
Experiment626 0:5552a00c7c9b 42 LEDBitmap = 1;
Experiment626 0:5552a00c7c9b 43
Experiment626 0:5552a00c7c9b 44 OutputEnable = false;
Experiment626 0:5552a00c7c9b 45 selectButton.mode(PullUp);
Experiment626 0:5552a00c7c9b 46 selectButton.rise(&displayHighestLevel);
Experiment626 0:5552a00c7c9b 47
Experiment626 0:5552a00c7c9b 48 lcd.putc('R');
Experiment626 0:5552a00c7c9b 49 lcd.putc('o');
Experiment626 0:5552a00c7c9b 50 lcd.putc('u');
Experiment626 0:5552a00c7c9b 51 lcd.putc('l');
Experiment626 0:5552a00c7c9b 52 lcd.putc('e');
Experiment626 0:5552a00c7c9b 53 lcd.putc('t');
Experiment626 0:5552a00c7c9b 54 lcd.putc('t');
Experiment626 0:5552a00c7c9b 55 lcd.putc('e');
Experiment626 0:5552a00c7c9b 56
Experiment626 0:5552a00c7c9b 57 spi.format(16,0); // Sets the bits to 16 to write; sets the clock's Polarity and Phase
Experiment626 0:5552a00c7c9b 58 spi.frequency(10 * 1000 * 1000); // Sets SPI clock to 20,000,000 Hz or 10MHz
Experiment626 0:5552a00c7c9b 59 }
Experiment626 0:5552a00c7c9b 60
Experiment626 0:5552a00c7c9b 61 void printToLCD(const char* text)
Experiment626 0:5552a00c7c9b 62 {
Experiment626 0:5552a00c7c9b 63 // Will add a text scrolling function here if the text is
Experiment626 0:5552a00c7c9b 64 // greater than 8 characters.
Experiment626 0:5552a00c7c9b 65 if (strlen(text) > 8) {
Experiment626 0:5552a00c7c9b 66 return;
Experiment626 0:5552a00c7c9b 67 }
Experiment626 0:5552a00c7c9b 68
Experiment626 0:5552a00c7c9b 69 int x = 0;
Experiment626 0:5552a00c7c9b 70 lcd.cls();
Experiment626 0:5552a00c7c9b 71
Experiment626 0:5552a00c7c9b 72 while (text[x] != '\0') {
Experiment626 0:5552a00c7c9b 73 lcd.putc(text[x]);
Experiment626 0:5552a00c7c9b 74 x++;
Experiment626 0:5552a00c7c9b 75 }
Experiment626 0:5552a00c7c9b 76 }
Experiment626 0:5552a00c7c9b 77
Experiment626 0:5552a00c7c9b 78 void SetLED(uint32_t LEDBitMap)
Experiment626 0:5552a00c7c9b 79 {
Experiment626 0:5552a00c7c9b 80 uint16_t shiftMap = 0;
Experiment626 0:5552a00c7c9b 81
Experiment626 0:5552a00c7c9b 82 // Ring Segments - all on linked shift registers
Experiment626 0:5552a00c7c9b 83 shiftMap = (LEDBitMap >> 1) &0xf;
Experiment626 0:5552a00c7c9b 84 shiftMap |= ((LEDBitMap >> 6) &0xf) << 4;
Experiment626 0:5552a00c7c9b 85 shiftMap |= ((LEDBitMap >> 11) &0xf) << 8;
Experiment626 0:5552a00c7c9b 86 shiftMap |= ((LEDBitMap >> 16) &0xf) << 12;
Experiment626 0:5552a00c7c9b 87
Experiment626 0:5552a00c7c9b 88 spi.write(shiftMap);
Experiment626 0:5552a00c7c9b 89
Experiment626 0:5552a00c7c9b 90 Latch = true;
Experiment626 0:5552a00c7c9b 91 Latch = false;
Experiment626 0:5552a00c7c9b 92
Experiment626 0:5552a00c7c9b 93 // Set the LEDs connected directly to the processor
Experiment626 0:5552a00c7c9b 94 compassLED[SOUTH] = LEDBitMap &0x1;
Experiment626 0:5552a00c7c9b 95 compassLED[WEST] = (LEDBitMap >> 5) &0x1;
Experiment626 0:5552a00c7c9b 96 compassLED[NORTH] = (LEDBitMap >> 10) &0x1;
Experiment626 0:5552a00c7c9b 97 compassLED[EAST] = (LEDBitMap >> 15) &0x1;
Experiment626 0:5552a00c7c9b 98 }
Experiment626 0:5552a00c7c9b 99
Experiment626 0:5552a00c7c9b 100 bool ReadPlayerButton()
Experiment626 0:5552a00c7c9b 101 {
Experiment626 0:5552a00c7c9b 102 // Logic High = True, Logic Low = False.
Experiment626 0:5552a00c7c9b 103 // userButton1 is set with an internal Pull-up which makes
Experiment626 0:5552a00c7c9b 104 // the button true by default and false when pressed.
Experiment626 0:5552a00c7c9b 105 // Must invert to make the read button function true.
Experiment626 0:5552a00c7c9b 106 return !userButton1; // Logic inverted
Experiment626 0:5552a00c7c9b 107 }
Experiment626 0:5552a00c7c9b 108
Experiment626 0:5552a00c7c9b 109 bool ReadSelectButton()
Experiment626 0:5552a00c7c9b 110 {
Experiment626 0:5552a00c7c9b 111 // Logic High = True, Logic Low = False.
Experiment626 0:5552a00c7c9b 112 // selectButton is set with an internal Pull-up which makes
Experiment626 0:5552a00c7c9b 113 // the button true by default and false when pressed.
Experiment626 0:5552a00c7c9b 114 // Must invert to make the read button function true.
Experiment626 0:5552a00c7c9b 115 return !selectButton; // Logic inverted
Experiment626 0:5552a00c7c9b 116 }
Experiment626 0:5552a00c7c9b 117
Experiment626 0:5552a00c7c9b 118 void soundBuzzer(int Hz)
Experiment626 0:5552a00c7c9b 119 {
Experiment626 0:5552a00c7c9b 120 int ticks = Hz/64;
Experiment626 0:5552a00c7c9b 121 int tickCount = 0;
Experiment626 0:5552a00c7c9b 122 float frequency = 1/(float)Hz;
Experiment626 0:5552a00c7c9b 123
Experiment626 0:5552a00c7c9b 124 while(tickCount < ticks) {
Experiment626 0:5552a00c7c9b 125 wait(frequency);
Experiment626 0:5552a00c7c9b 126 Buzzer = true;
Experiment626 0:5552a00c7c9b 127 wait(frequency);
Experiment626 0:5552a00c7c9b 128 Buzzer = false;
Experiment626 0:5552a00c7c9b 129 tickCount++;
Experiment626 0:5552a00c7c9b 130 }
Experiment626 0:5552a00c7c9b 131 }
Experiment626 0:5552a00c7c9b 132
Experiment626 0:5552a00c7c9b 133 void RotateLEDs(float delay)
Experiment626 0:5552a00c7c9b 134 {
Experiment626 0:5552a00c7c9b 135 if (LEDBitmap == (1 << 10)) {
Experiment626 0:5552a00c7c9b 136 soundBuzzer(300);
Experiment626 0:5552a00c7c9b 137 }
Experiment626 0:5552a00c7c9b 138
Experiment626 0:5552a00c7c9b 139 SetLED(LEDBitmap);
Experiment626 0:5552a00c7c9b 140
Experiment626 0:5552a00c7c9b 141 LEDBitmap <<= 1;
Experiment626 0:5552a00c7c9b 142 wait(delay);
Experiment626 0:5552a00c7c9b 143 if(LEDBitmap >= (1 << 20)) {
Experiment626 0:5552a00c7c9b 144 LEDBitmap = 1;
Experiment626 0:5552a00c7c9b 145 }
Experiment626 0:5552a00c7c9b 146 }
Experiment626 0:5552a00c7c9b 147
Experiment626 0:5552a00c7c9b 148 void splash()
Experiment626 0:5552a00c7c9b 149 {
Experiment626 0:5552a00c7c9b 150 int LEDBitmap = 1;
Experiment626 0:5552a00c7c9b 151
Experiment626 0:5552a00c7c9b 152 for (int x = 1; x <= 20; x++) {
Experiment626 0:5552a00c7c9b 153 LEDBitmap <<= 1;
Experiment626 0:5552a00c7c9b 154 SetLED(LEDBitmap);
Experiment626 0:5552a00c7c9b 155 soundBuzzer((x * 100) + 500);
Experiment626 0:5552a00c7c9b 156 wait(0.0078125);
Experiment626 0:5552a00c7c9b 157 }
Experiment626 0:5552a00c7c9b 158
Experiment626 0:5552a00c7c9b 159 for (int y = 0; y < 5; y++) {
Experiment626 0:5552a00c7c9b 160 SetLED(0xfffff);
Experiment626 0:5552a00c7c9b 161 soundBuzzer(600);
Experiment626 0:5552a00c7c9b 162 wait(.03125);
Experiment626 0:5552a00c7c9b 163 SetLED(0x0);
Experiment626 0:5552a00c7c9b 164 wait(.03125);
Experiment626 0:5552a00c7c9b 165 }
Experiment626 0:5552a00c7c9b 166 }
Experiment626 0:5552a00c7c9b 167
Experiment626 0:5552a00c7c9b 168 int checkTargetHit(int currentLED)
Experiment626 0:5552a00c7c9b 169 {
Experiment626 0:5552a00c7c9b 170 wait(.5);
Experiment626 0:5552a00c7c9b 171 if (currentLED == (1 << 11)) {
Experiment626 0:5552a00c7c9b 172 return 3;
Experiment626 0:5552a00c7c9b 173 } else if (currentLED == (1 << 10) || currentLED == (1 << 12)) {
Experiment626 0:5552a00c7c9b 174 return 2;
Experiment626 0:5552a00c7c9b 175 } else if (currentLED == (1 << 9) || currentLED == (1 << 13)) {
Experiment626 0:5552a00c7c9b 176 return 1;
Experiment626 0:5552a00c7c9b 177 } else {
Experiment626 0:5552a00c7c9b 178 return 0;
Experiment626 0:5552a00c7c9b 179 }
Experiment626 0:5552a00c7c9b 180 }
Experiment626 0:5552a00c7c9b 181
Experiment626 0:5552a00c7c9b 182 void displayHighestLevel()
Experiment626 0:5552a00c7c9b 183 {
Experiment626 0:5552a00c7c9b 184 sprintf (debugString, "H Lev %d",highestLevel);
Experiment626 0:5552a00c7c9b 185 printToLCD(debugString);
Experiment626 0:5552a00c7c9b 186 wait(2.5);
Experiment626 0:5552a00c7c9b 187 sprintf (debugString, "Level %d",level);
Experiment626 0:5552a00c7c9b 188 printToLCD(debugString);
Experiment626 0:5552a00c7c9b 189 }
Experiment626 0:5552a00c7c9b 190
Experiment626 0:5552a00c7c9b 191 void score()
Experiment626 0:5552a00c7c9b 192 {
Experiment626 0:5552a00c7c9b 193 int target = checkTargetHit(LEDBitmap);
Experiment626 0:5552a00c7c9b 194
Experiment626 0:5552a00c7c9b 195 switch (target) {
Experiment626 0:5552a00c7c9b 196 case 3:
Experiment626 0:5552a00c7c9b 197 level += 3;
Experiment626 0:5552a00c7c9b 198 break;
Experiment626 0:5552a00c7c9b 199 case 2:
Experiment626 0:5552a00c7c9b 200 if(level < 10) {
Experiment626 0:5552a00c7c9b 201 level += 2;
Experiment626 0:5552a00c7c9b 202 } else {
Experiment626 0:5552a00c7c9b 203 level -= 2;
Experiment626 0:5552a00c7c9b 204 }
Experiment626 0:5552a00c7c9b 205 break;
Experiment626 0:5552a00c7c9b 206 case 1:
Experiment626 0:5552a00c7c9b 207 level += 1;
Experiment626 0:5552a00c7c9b 208 break;
Experiment626 0:5552a00c7c9b 209 default:
Experiment626 0:5552a00c7c9b 210 level--;
Experiment626 0:5552a00c7c9b 211 if (level <= 1) {
Experiment626 0:5552a00c7c9b 212 level = 1;
Experiment626 0:5552a00c7c9b 213 }
Experiment626 0:5552a00c7c9b 214 }
Experiment626 0:5552a00c7c9b 215
Experiment626 0:5552a00c7c9b 216 if (level > highestLevel) {
Experiment626 0:5552a00c7c9b 217 highestLevel = level;
Experiment626 0:5552a00c7c9b 218 }
Experiment626 0:5552a00c7c9b 219 }
Experiment626 0:5552a00c7c9b 220
Experiment626 0:5552a00c7c9b 221 void winner()
Experiment626 0:5552a00c7c9b 222 {
Experiment626 0:5552a00c7c9b 223 int winCounter = 1;
Experiment626 0:5552a00c7c9b 224 while (winCounter++ <= 5) {
Experiment626 0:5552a00c7c9b 225 printToLCD("Winner!!");
Experiment626 0:5552a00c7c9b 226 SetLED(0xFFFFF);
Experiment626 0:5552a00c7c9b 227 wait(.5);
Experiment626 0:5552a00c7c9b 228 printToLCD("");
Experiment626 0:5552a00c7c9b 229 SetLED(0x0);
Experiment626 0:5552a00c7c9b 230
Experiment626 0:5552a00c7c9b 231 for (int x = 1; x <= 10; x++) {
Experiment626 0:5552a00c7c9b 232 soundBuzzer((x * 100) + 500);
Experiment626 0:5552a00c7c9b 233 wait(0.0078125);
Experiment626 0:5552a00c7c9b 234 }
Experiment626 0:5552a00c7c9b 235
Experiment626 0:5552a00c7c9b 236 }
Experiment626 0:5552a00c7c9b 237
Experiment626 0:5552a00c7c9b 238 while (true) {
Experiment626 0:5552a00c7c9b 239 printToLCD("Winner!!");
Experiment626 0:5552a00c7c9b 240 SetLED(0xFFFFF);
Experiment626 0:5552a00c7c9b 241 wait(.5);
Experiment626 0:5552a00c7c9b 242 }
Experiment626 0:5552a00c7c9b 243
Experiment626 0:5552a00c7c9b 244 }
Experiment626 0:5552a00c7c9b 245
Experiment626 0:5552a00c7c9b 246 void gameLoop()
Experiment626 0:5552a00c7c9b 247 {
Experiment626 0:5552a00c7c9b 248 while (true) {
Experiment626 0:5552a00c7c9b 249 sprintf (debugString, "Level %d", level);
Experiment626 0:5552a00c7c9b 250 printToLCD(debugString);
Experiment626 0:5552a00c7c9b 251
Experiment626 0:5552a00c7c9b 252 while (!ReadPlayerButton()) {
Experiment626 0:5552a00c7c9b 253 RotateLEDs(1/(((float)level * rotateFactor) + 19));
Experiment626 0:5552a00c7c9b 254 }
Experiment626 0:5552a00c7c9b 255
Experiment626 0:5552a00c7c9b 256 score();
Experiment626 0:5552a00c7c9b 257
Experiment626 0:5552a00c7c9b 258 if (level > 99) {
Experiment626 0:5552a00c7c9b 259 winner();
Experiment626 0:5552a00c7c9b 260 }
Experiment626 0:5552a00c7c9b 261
Experiment626 0:5552a00c7c9b 262 while (ReadPlayerButton()) { // Will hold game if hold on to button to prevent cheating
Experiment626 0:5552a00c7c9b 263 }
Experiment626 0:5552a00c7c9b 264 }
Experiment626 0:5552a00c7c9b 265 }
Experiment626 0:5552a00c7c9b 266
Experiment626 0:5552a00c7c9b 267 int main()
Experiment626 0:5552a00c7c9b 268 {
Experiment626 0:5552a00c7c9b 269 initilize();
Experiment626 0:5552a00c7c9b 270 splash();
Experiment626 0:5552a00c7c9b 271 gameLoop();
Experiment626 0:5552a00c7c9b 272 }