The preloaded firmware shipped on the Roulette.

Dependencies:   TextLCD mbed

Committer:
Experiment626
Date:
Mon Sep 15 16:09:16 2014 +0000
Revision:
1:d5d57d6ba20a
Parent:
0:5552a00c7c9b
Added Apache 2 license text

Who changed what in which revision?

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