Sudoku Game using the LCD, joystick, number pad, and speaker.
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player_copy
Fork of rtos_basic by
main.cpp@7:a935e2f5ebd0, 2016-11-03 (annotated)
- Committer:
- decfrv
- Date:
- Thu Nov 03 14:45:00 2016 +0000
- Revision:
- 7:a935e2f5ebd0
- Parent:
- 3:c92e21f305d8
Sudoku Game
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
emilmont | 1:491820ee784d | 1 | #include "mbed.h" |
decfrv | 7:a935e2f5ebd0 | 2 | #include <mpr121.h> |
emilmont | 1:491820ee784d | 3 | #include "rtos.h" |
decfrv | 7:a935e2f5ebd0 | 4 | #include "uLCD_4DGL.h" |
decfrv | 7:a935e2f5ebd0 | 5 | #include "wave_player.h" |
decfrv | 7:a935e2f5ebd0 | 6 | #include "SDFileSystem.h" |
decfrv | 7:a935e2f5ebd0 | 7 | |
decfrv | 7:a935e2f5ebd0 | 8 | class Nav_Switch |
decfrv | 7:a935e2f5ebd0 | 9 | { |
decfrv | 7:a935e2f5ebd0 | 10 | public: |
decfrv | 7:a935e2f5ebd0 | 11 | Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire); |
decfrv | 7:a935e2f5ebd0 | 12 | int read(); |
decfrv | 7:a935e2f5ebd0 | 13 | //boolean functions to test each switch |
decfrv | 7:a935e2f5ebd0 | 14 | bool up(); |
decfrv | 7:a935e2f5ebd0 | 15 | bool down(); |
decfrv | 7:a935e2f5ebd0 | 16 | bool left(); |
decfrv | 7:a935e2f5ebd0 | 17 | bool right(); |
decfrv | 7:a935e2f5ebd0 | 18 | bool fire(); |
decfrv | 7:a935e2f5ebd0 | 19 | //automatic read on RHS |
decfrv | 7:a935e2f5ebd0 | 20 | operator int (); |
decfrv | 7:a935e2f5ebd0 | 21 | //index to any switch array style |
decfrv | 7:a935e2f5ebd0 | 22 | bool operator[](int index) { |
decfrv | 7:a935e2f5ebd0 | 23 | return _pins[index]; |
decfrv | 7:a935e2f5ebd0 | 24 | }; |
decfrv | 7:a935e2f5ebd0 | 25 | private: |
decfrv | 7:a935e2f5ebd0 | 26 | BusIn _pins; |
decfrv | 7:a935e2f5ebd0 | 27 | |
decfrv | 7:a935e2f5ebd0 | 28 | }; |
decfrv | 7:a935e2f5ebd0 | 29 | Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire): |
decfrv | 7:a935e2f5ebd0 | 30 | _pins(up, down, left, right, fire) |
decfrv | 7:a935e2f5ebd0 | 31 | { |
decfrv | 7:a935e2f5ebd0 | 32 | _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise |
decfrv | 7:a935e2f5ebd0 | 33 | wait(0.001); //delays just a bit for pullups to pull inputs high |
decfrv | 7:a935e2f5ebd0 | 34 | } |
decfrv | 7:a935e2f5ebd0 | 35 | inline bool Nav_Switch::up() |
decfrv | 7:a935e2f5ebd0 | 36 | { |
decfrv | 7:a935e2f5ebd0 | 37 | return !(_pins[0]); |
decfrv | 7:a935e2f5ebd0 | 38 | } |
decfrv | 7:a935e2f5ebd0 | 39 | inline bool Nav_Switch::down() |
decfrv | 7:a935e2f5ebd0 | 40 | { |
decfrv | 7:a935e2f5ebd0 | 41 | return !(_pins[1]); |
decfrv | 7:a935e2f5ebd0 | 42 | } |
decfrv | 7:a935e2f5ebd0 | 43 | inline bool Nav_Switch::left() |
decfrv | 7:a935e2f5ebd0 | 44 | { |
decfrv | 7:a935e2f5ebd0 | 45 | return !(_pins[2]); |
decfrv | 7:a935e2f5ebd0 | 46 | } |
decfrv | 7:a935e2f5ebd0 | 47 | inline bool Nav_Switch::right() |
decfrv | 7:a935e2f5ebd0 | 48 | { |
decfrv | 7:a935e2f5ebd0 | 49 | return !(_pins[3]); |
decfrv | 7:a935e2f5ebd0 | 50 | } |
decfrv | 7:a935e2f5ebd0 | 51 | inline bool Nav_Switch::fire() |
decfrv | 7:a935e2f5ebd0 | 52 | { |
decfrv | 7:a935e2f5ebd0 | 53 | return !(_pins[4]); |
decfrv | 7:a935e2f5ebd0 | 54 | } |
decfrv | 7:a935e2f5ebd0 | 55 | inline int Nav_Switch::read() |
decfrv | 7:a935e2f5ebd0 | 56 | { |
decfrv | 7:a935e2f5ebd0 | 57 | return _pins.read(); |
decfrv | 7:a935e2f5ebd0 | 58 | } |
decfrv | 7:a935e2f5ebd0 | 59 | inline Nav_Switch::operator int () |
decfrv | 7:a935e2f5ebd0 | 60 | { |
decfrv | 7:a935e2f5ebd0 | 61 | return _pins.read(); |
decfrv | 7:a935e2f5ebd0 | 62 | } |
emilmont | 1:491820ee784d | 63 | |
emilmont | 1:491820ee784d | 64 | DigitalOut led1(LED1); |
emilmont | 1:491820ee784d | 65 | DigitalOut led2(LED2); |
decfrv | 7:a935e2f5ebd0 | 66 | DigitalOut led3(LED3); |
decfrv | 7:a935e2f5ebd0 | 67 | DigitalOut led4(LED4); |
decfrv | 7:a935e2f5ebd0 | 68 | uLCD_4DGL uLCD(p28,p27,p30); |
decfrv | 7:a935e2f5ebd0 | 69 | Serial pc(USBTX, USBRX); |
decfrv | 7:a935e2f5ebd0 | 70 | |
decfrv | 7:a935e2f5ebd0 | 71 | SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card |
decfrv | 7:a935e2f5ebd0 | 72 | DigitalIn sddetect(p9); |
decfrv | 7:a935e2f5ebd0 | 73 | |
decfrv | 7:a935e2f5ebd0 | 74 | Nav_Switch myNav( p16, p19, p15, p20, p17); //pin order on Sparkfun breakout |
decfrv | 7:a935e2f5ebd0 | 75 | |
decfrv | 7:a935e2f5ebd0 | 76 | //number pad |
decfrv | 7:a935e2f5ebd0 | 77 | InterruptIn interrupt(p21); |
decfrv | 7:a935e2f5ebd0 | 78 | I2C i2c(p9, p10); |
decfrv | 7:a935e2f5ebd0 | 79 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); |
decfrv | 7:a935e2f5ebd0 | 80 | |
decfrv | 7:a935e2f5ebd0 | 81 | AnalogOut DACout(p18); |
decfrv | 7:a935e2f5ebd0 | 82 | wave_player waver(&DACout); |
decfrv | 7:a935e2f5ebd0 | 83 | |
decfrv | 7:a935e2f5ebd0 | 84 | Mutex lcdMutex; |
decfrv | 7:a935e2f5ebd0 | 85 | |
decfrv | 7:a935e2f5ebd0 | 86 | |
decfrv | 7:a935e2f5ebd0 | 87 | |
decfrv | 7:a935e2f5ebd0 | 88 | int xndx; |
decfrv | 7:a935e2f5ebd0 | 89 | int yndx; |
decfrv | 7:a935e2f5ebd0 | 90 | |
decfrv | 7:a935e2f5ebd0 | 91 | static int nums [9][9] = {{0,5,4, 9,3,8, 2,7,6}, |
decfrv | 7:a935e2f5ebd0 | 92 | {6,7,9, 1,4,2, 8,3,5}, |
decfrv | 7:a935e2f5ebd0 | 93 | {8,2,3, 7,5,6, 4,9,1}, |
decfrv | 7:a935e2f5ebd0 | 94 | |
decfrv | 7:a935e2f5ebd0 | 95 | {4,8,5, 2,7,9, 6,1,3}, |
decfrv | 7:a935e2f5ebd0 | 96 | {7,3,1, 6,0,4, 5,2,9}, |
decfrv | 7:a935e2f5ebd0 | 97 | {9,6,2, 3,1,5, 7,8,4}, |
decfrv | 7:a935e2f5ebd0 | 98 | |
decfrv | 7:a935e2f5ebd0 | 99 | {5,1,6, 0,2,3, 9,4,7}, |
decfrv | 7:a935e2f5ebd0 | 100 | {2,9,7, 4,6,1, 3,5,8}, |
decfrv | 7:a935e2f5ebd0 | 101 | {3,4,8, 5,9,7, 1,6,2}}; |
decfrv | 7:a935e2f5ebd0 | 102 | |
decfrv | 7:a935e2f5ebd0 | 103 | |
decfrv | 7:a935e2f5ebd0 | 104 | bool preset[9][9] = {}; |
decfrv | 7:a935e2f5ebd0 | 105 | |
decfrv | 7:a935e2f5ebd0 | 106 | bool interruptChange = false; |
decfrv | 7:a935e2f5ebd0 | 107 | int interruptNum = -1; |
decfrv | 7:a935e2f5ebd0 | 108 | |
decfrv | 7:a935e2f5ebd0 | 109 | // Key hit/release interrupt routine |
decfrv | 7:a935e2f5ebd0 | 110 | void fallInterrupt() { |
decfrv | 7:a935e2f5ebd0 | 111 | |
decfrv | 7:a935e2f5ebd0 | 112 | int value=mpr121.read(0x00); |
decfrv | 7:a935e2f5ebd0 | 113 | value +=mpr121.read(0x01)<<8; |
decfrv | 7:a935e2f5ebd0 | 114 | |
decfrv | 7:a935e2f5ebd0 | 115 | int number = 0; |
decfrv | 7:a935e2f5ebd0 | 116 | if ((value>>9) & 0x01) { |
decfrv | 7:a935e2f5ebd0 | 117 | number = 9; |
decfrv | 7:a935e2f5ebd0 | 118 | } else if ((value>>8) & 0x01) { |
decfrv | 7:a935e2f5ebd0 | 119 | number = 8; |
decfrv | 7:a935e2f5ebd0 | 120 | } else if ((value>>7) & 0x01) { |
decfrv | 7:a935e2f5ebd0 | 121 | number = 7; |
decfrv | 7:a935e2f5ebd0 | 122 | } else if ((value>>6) & 0x01) { |
decfrv | 7:a935e2f5ebd0 | 123 | number = 6; |
decfrv | 7:a935e2f5ebd0 | 124 | } else if ((value>>5) & 0x01) { |
decfrv | 7:a935e2f5ebd0 | 125 | number = 5; |
decfrv | 7:a935e2f5ebd0 | 126 | } else if ((value>>4) & 0x01) { |
decfrv | 7:a935e2f5ebd0 | 127 | number = 4; |
decfrv | 7:a935e2f5ebd0 | 128 | } else if ((value>>3) & 0x01) { |
decfrv | 7:a935e2f5ebd0 | 129 | number = 3; |
decfrv | 7:a935e2f5ebd0 | 130 | } else if ((value>>2) & 0x01) { |
decfrv | 7:a935e2f5ebd0 | 131 | number = 2; |
decfrv | 7:a935e2f5ebd0 | 132 | } else if ((value>>1) & 0x01) { |
decfrv | 7:a935e2f5ebd0 | 133 | number = 1; |
decfrv | 7:a935e2f5ebd0 | 134 | } else if (value & 0x01) { |
decfrv | 7:a935e2f5ebd0 | 135 | number = 0; |
decfrv | 7:a935e2f5ebd0 | 136 | } |
decfrv | 7:a935e2f5ebd0 | 137 | |
decfrv | 7:a935e2f5ebd0 | 138 | if (!preset[yndx][xndx]) { |
decfrv | 7:a935e2f5ebd0 | 139 | interruptNum = number; |
decfrv | 7:a935e2f5ebd0 | 140 | //nums[yndx][xndx] = number; |
decfrv | 7:a935e2f5ebd0 | 141 | interruptChange = true; |
decfrv | 7:a935e2f5ebd0 | 142 | } |
decfrv | 7:a935e2f5ebd0 | 143 | } |
decfrv | 7:a935e2f5ebd0 | 144 | |
decfrv | 7:a935e2f5ebd0 | 145 | int main() { |
decfrv | 7:a935e2f5ebd0 | 146 | nums[0][0] = 1; |
decfrv | 7:a935e2f5ebd0 | 147 | interrupt.fall(&fallInterrupt); |
decfrv | 7:a935e2f5ebd0 | 148 | interrupt.mode(PullUp); |
decfrv | 7:a935e2f5ebd0 | 149 | |
decfrv | 7:a935e2f5ebd0 | 150 | uLCD.background_color(WHITE); |
decfrv | 7:a935e2f5ebd0 | 151 | uLCD.cls(); |
decfrv | 7:a935e2f5ebd0 | 152 | uLCD.color(BLACK); |
decfrv | 7:a935e2f5ebd0 | 153 | uLCD.text_height(1); |
decfrv | 7:a935e2f5ebd0 | 154 | uLCD.text_width(1); |
decfrv | 7:a935e2f5ebd0 | 155 | uLCD.textbackground_color(WHITE); |
decfrv | 7:a935e2f5ebd0 | 156 | //uLCD.printf("1 2 3 4 5 6 7 8 9\n\n1 2 3 4 5 6 7 8 9\n\n1 2 3 4 5 6 7 8 9\n1 2 3 4 5 6 7 8 9\n\n1 2 3 4 5 6 7 8 9\n\n1 2 3 4 5 6 7 8 9\n1 2 3 4 5 6 7 8 9\n\n1 2 3 4 5 6 7 8 9\n\n1 2 3 4 5 6 7 8 9"); |
decfrv | 7:a935e2f5ebd0 | 157 | |
decfrv | 7:a935e2f5ebd0 | 158 | /*uLCD.filled_triangle(30, 61, 13, 81, 51, 112, GREEN); |
decfrv | 7:a935e2f5ebd0 | 159 | uLCD.filled_triangle(30, 61, 51, 112, 66, 92, GREEN); |
decfrv | 7:a935e2f5ebd0 | 160 | uLCD.filled_triangle(51, 112, 104, 11, 120, 24, GREEN); |
decfrv | 7:a935e2f5ebd0 | 161 | uLCD.filled_triangle(51, 112, 31, 96, 104, 11, GREEN);*/ |
decfrv | 7:a935e2f5ebd0 | 162 | |
decfrv | 7:a935e2f5ebd0 | 163 | uLCD.color(BLUE); |
decfrv | 7:a935e2f5ebd0 | 164 | for (int i = 0; i < 9; i++) { |
decfrv | 7:a935e2f5ebd0 | 165 | for (int j = 0; j < 9; j++) { |
decfrv | 7:a935e2f5ebd0 | 166 | if (nums[i][j] == 0) { |
decfrv | 7:a935e2f5ebd0 | 167 | uLCD.printf(" "); |
decfrv | 7:a935e2f5ebd0 | 168 | preset[i][j] = false; |
decfrv | 7:a935e2f5ebd0 | 169 | } else { |
decfrv | 7:a935e2f5ebd0 | 170 | uLCD.printf("%d ", nums[i][j]); |
decfrv | 7:a935e2f5ebd0 | 171 | preset[i][j] = true; |
decfrv | 7:a935e2f5ebd0 | 172 | } |
decfrv | 7:a935e2f5ebd0 | 173 | } |
decfrv | 7:a935e2f5ebd0 | 174 | //uLCD.printf("\n"); |
decfrv | 7:a935e2f5ebd0 | 175 | if (i != 2 && i != 5) { |
decfrv | 7:a935e2f5ebd0 | 176 | uLCD.printf("\n"); |
decfrv | 7:a935e2f5ebd0 | 177 | } |
decfrv | 7:a935e2f5ebd0 | 178 | } |
decfrv | 7:a935e2f5ebd0 | 179 | uLCD.color(BLACK); |
decfrv | 7:a935e2f5ebd0 | 180 | |
decfrv | 7:a935e2f5ebd0 | 181 | |
decfrv | 7:a935e2f5ebd0 | 182 | uLCD.line(40, 0, 40, 128, BLACK); |
decfrv | 7:a935e2f5ebd0 | 183 | uLCD.line(80, 0, 80, 128, BLACK); |
decfrv | 7:a935e2f5ebd0 | 184 | uLCD.line(0, 40, 128, 40, BLACK); |
decfrv | 7:a935e2f5ebd0 | 185 | uLCD.line(0, 80, 128, 80, BLACK); |
decfrv | 7:a935e2f5ebd0 | 186 | |
decfrv | 7:a935e2f5ebd0 | 187 | xndx = 0; |
decfrv | 7:a935e2f5ebd0 | 188 | yndx = 0; |
decfrv | 7:a935e2f5ebd0 | 189 | int oldxndx = 0; |
decfrv | 7:a935e2f5ebd0 | 190 | int oldyndx = 0; |
decfrv | 7:a935e2f5ebd0 | 191 | bool changed = true; |
decfrv | 7:a935e2f5ebd0 | 192 | |
decfrv | 7:a935e2f5ebd0 | 193 | bool up = false; |
decfrv | 7:a935e2f5ebd0 | 194 | bool down = false; |
decfrv | 7:a935e2f5ebd0 | 195 | bool left = false; |
decfrv | 7:a935e2f5ebd0 | 196 | bool right = false; |
decfrv | 7:a935e2f5ebd0 | 197 | bool fire = false; |
decfrv | 7:a935e2f5ebd0 | 198 | //uLCD.rectangle(0,0,7,7, BLUE); |
decfrv | 7:a935e2f5ebd0 | 199 | |
decfrv | 7:a935e2f5ebd0 | 200 | |
decfrv | 7:a935e2f5ebd0 | 201 | bool keepGoing = true; |
decfrv | 7:a935e2f5ebd0 | 202 | while (keepGoing) { |
decfrv | 7:a935e2f5ebd0 | 203 | //led1 = !led1; |
decfrv | 7:a935e2f5ebd0 | 204 | oldyndx = yndx; |
decfrv | 7:a935e2f5ebd0 | 205 | oldxndx = xndx; |
decfrv | 7:a935e2f5ebd0 | 206 | if(myNav.left() && !up) { |
decfrv | 7:a935e2f5ebd0 | 207 | if (yndx > 0) { |
decfrv | 7:a935e2f5ebd0 | 208 | //oldyndx=yndx; |
decfrv | 7:a935e2f5ebd0 | 209 | //do { |
decfrv | 7:a935e2f5ebd0 | 210 | yndx--; |
decfrv | 7:a935e2f5ebd0 | 211 | //} while (preset[yndx][xndx] && yndx != 0); |
decfrv | 7:a935e2f5ebd0 | 212 | changed = true; |
decfrv | 7:a935e2f5ebd0 | 213 | } |
decfrv | 7:a935e2f5ebd0 | 214 | up = true; |
decfrv | 7:a935e2f5ebd0 | 215 | } else if(myNav.right() && !down) { |
decfrv | 7:a935e2f5ebd0 | 216 | if (yndx < 8) { |
decfrv | 7:a935e2f5ebd0 | 217 | //oldyndx=yndx; |
decfrv | 7:a935e2f5ebd0 | 218 | //do { |
decfrv | 7:a935e2f5ebd0 | 219 | yndx++; |
decfrv | 7:a935e2f5ebd0 | 220 | //} while (preset[yndx][xndx] && yndx != 8); |
decfrv | 7:a935e2f5ebd0 | 221 | changed = true; |
decfrv | 7:a935e2f5ebd0 | 222 | } |
decfrv | 7:a935e2f5ebd0 | 223 | down = true; |
decfrv | 7:a935e2f5ebd0 | 224 | } else if(myNav.down() && !left) { |
decfrv | 7:a935e2f5ebd0 | 225 | if (xndx > 0) { |
decfrv | 7:a935e2f5ebd0 | 226 | //oldxndx=xndx; |
decfrv | 7:a935e2f5ebd0 | 227 | //do { |
decfrv | 7:a935e2f5ebd0 | 228 | xndx--; |
decfrv | 7:a935e2f5ebd0 | 229 | //} while (preset[yndx][xndx] && xndx != 0); |
decfrv | 7:a935e2f5ebd0 | 230 | changed = true; |
decfrv | 7:a935e2f5ebd0 | 231 | } |
decfrv | 7:a935e2f5ebd0 | 232 | left= true; |
decfrv | 7:a935e2f5ebd0 | 233 | } else if(myNav.up() && !right) { |
decfrv | 7:a935e2f5ebd0 | 234 | if (xndx < 8) { |
decfrv | 7:a935e2f5ebd0 | 235 | //oldxndx=xndx; |
decfrv | 7:a935e2f5ebd0 | 236 | //do { |
decfrv | 7:a935e2f5ebd0 | 237 | xndx++; |
decfrv | 7:a935e2f5ebd0 | 238 | //} while (preset[yndx][xndx] && xndx != 8); |
decfrv | 7:a935e2f5ebd0 | 239 | changed = true; |
decfrv | 7:a935e2f5ebd0 | 240 | } |
decfrv | 7:a935e2f5ebd0 | 241 | right = true; |
decfrv | 7:a935e2f5ebd0 | 242 | } else if(myNav.fire() && !fire) { |
decfrv | 7:a935e2f5ebd0 | 243 | |
decfrv | 7:a935e2f5ebd0 | 244 | bool test = true; |
decfrv | 7:a935e2f5ebd0 | 245 | /////////////////////////////////////////////// |
decfrv | 7:a935e2f5ebd0 | 246 | pc.printf("5,5: %d\r\n",nums[4][4]); |
decfrv | 7:a935e2f5ebd0 | 247 | for (int i = 0; i < 9; i++) { |
decfrv | 7:a935e2f5ebd0 | 248 | int sum = 0; |
decfrv | 7:a935e2f5ebd0 | 249 | int product = 1; |
decfrv | 7:a935e2f5ebd0 | 250 | for (int j = 0; j < 9; j++) { |
decfrv | 7:a935e2f5ebd0 | 251 | product *= nums[i][j]; |
decfrv | 7:a935e2f5ebd0 | 252 | sum += nums[i][j]; |
decfrv | 7:a935e2f5ebd0 | 253 | } |
decfrv | 7:a935e2f5ebd0 | 254 | if (sum != 45 || product != 362880) { |
decfrv | 7:a935e2f5ebd0 | 255 | test = false; |
decfrv | 7:a935e2f5ebd0 | 256 | pc.printf("Bad Row: %d Sum:%d Product:%d\r\n", i + 1, sum, product); |
decfrv | 7:a935e2f5ebd0 | 257 | } |
decfrv | 7:a935e2f5ebd0 | 258 | } |
decfrv | 7:a935e2f5ebd0 | 259 | |
decfrv | 7:a935e2f5ebd0 | 260 | for (int i = 0; i < 9; i++) { |
decfrv | 7:a935e2f5ebd0 | 261 | int sum = 0; |
decfrv | 7:a935e2f5ebd0 | 262 | int product = 1; |
decfrv | 7:a935e2f5ebd0 | 263 | for (int j = 0; j < 9; j++) { |
decfrv | 7:a935e2f5ebd0 | 264 | product *= nums[j][i]; |
decfrv | 7:a935e2f5ebd0 | 265 | sum += nums[j][i]; |
decfrv | 7:a935e2f5ebd0 | 266 | } |
decfrv | 7:a935e2f5ebd0 | 267 | if (sum != 45 || product != 362880) { |
decfrv | 7:a935e2f5ebd0 | 268 | test = false; |
decfrv | 7:a935e2f5ebd0 | 269 | pc.printf("Bad Column: %d Sum:%d Product:%d\r\n", i + 1, sum, product); |
decfrv | 7:a935e2f5ebd0 | 270 | } |
decfrv | 7:a935e2f5ebd0 | 271 | } |
decfrv | 7:a935e2f5ebd0 | 272 | |
decfrv | 7:a935e2f5ebd0 | 273 | for (int m = 0; m < 3; m++) { |
decfrv | 7:a935e2f5ebd0 | 274 | for (int k = 0; k < 3; k++) { |
decfrv | 7:a935e2f5ebd0 | 275 | int sum = 0; |
decfrv | 7:a935e2f5ebd0 | 276 | int product = 1; |
decfrv | 7:a935e2f5ebd0 | 277 | for (int i = 0; i < 3; i++) { |
decfrv | 7:a935e2f5ebd0 | 278 | for (int j = 0; j < 3; j++) { |
decfrv | 7:a935e2f5ebd0 | 279 | product *= nums[3*k + i][3*m + j]; |
decfrv | 7:a935e2f5ebd0 | 280 | sum += nums[3*k + i][3*m + j]; |
decfrv | 7:a935e2f5ebd0 | 281 | } |
decfrv | 7:a935e2f5ebd0 | 282 | } |
decfrv | 7:a935e2f5ebd0 | 283 | if (sum != 45 || product != 362880) { |
decfrv | 7:a935e2f5ebd0 | 284 | test = false; |
decfrv | 7:a935e2f5ebd0 | 285 | pc.printf("Bad Box: %d Sum:%d Product:%d\r\n", m*3 + k + 1, sum, product); |
decfrv | 7:a935e2f5ebd0 | 286 | } |
decfrv | 7:a935e2f5ebd0 | 287 | } |
decfrv | 7:a935e2f5ebd0 | 288 | } |
decfrv | 7:a935e2f5ebd0 | 289 | if (test) { |
decfrv | 7:a935e2f5ebd0 | 290 | //Play Sound |
decfrv | 7:a935e2f5ebd0 | 291 | for (int i = 0; i < 20; i++) { |
decfrv | 7:a935e2f5ebd0 | 292 | uLCD.line(11+i,81-i, 49+i, 112-i, GREEN); |
decfrv | 7:a935e2f5ebd0 | 293 | uLCD.line(12+i,81-i, 50+i, 112-i, GREEN); |
decfrv | 7:a935e2f5ebd0 | 294 | uLCD.line(51-i,112-i, 120-i,24-i, GREEN); |
decfrv | 7:a935e2f5ebd0 | 295 | uLCD.line(52-i,112-i, 121-i,24-i, GREEN); |
decfrv | 7:a935e2f5ebd0 | 296 | } |
decfrv | 7:a935e2f5ebd0 | 297 | keepGoing = false; |
decfrv | 7:a935e2f5ebd0 | 298 | pc.printf("SUCCESS :)\r\n"); |
decfrv | 7:a935e2f5ebd0 | 299 | |
decfrv | 7:a935e2f5ebd0 | 300 | FILE *wave_file; |
decfrv | 7:a935e2f5ebd0 | 301 | wave_file = fopen("/sd/champs.wav","r"); |
decfrv | 7:a935e2f5ebd0 | 302 | bool playing = true; |
decfrv | 7:a935e2f5ebd0 | 303 | int vol = 5; |
decfrv | 7:a935e2f5ebd0 | 304 | waver.play(wave_file, playing, vol); |
decfrv | 7:a935e2f5ebd0 | 305 | } else { |
decfrv | 7:a935e2f5ebd0 | 306 | for (int i = 0; i < 20; i++) { |
decfrv | 7:a935e2f5ebd0 | 307 | uLCD.line(21+i,15,89+i,118, RED); |
decfrv | 7:a935e2f5ebd0 | 308 | uLCD.line(89+i,15,21+i,118, RED); |
decfrv | 7:a935e2f5ebd0 | 309 | } |
decfrv | 7:a935e2f5ebd0 | 310 | pc.printf("FAILURE :(\r\n"); |
decfrv | 7:a935e2f5ebd0 | 311 | FILE *wave_file; |
decfrv | 7:a935e2f5ebd0 | 312 | wave_file = fopen("/sd/failure.wav","r"); |
decfrv | 7:a935e2f5ebd0 | 313 | bool playing = true; |
decfrv | 7:a935e2f5ebd0 | 314 | int vol = 5; |
decfrv | 7:a935e2f5ebd0 | 315 | waver.play(wave_file, playing, vol); |
decfrv | 7:a935e2f5ebd0 | 316 | //wait(5); |
decfrv | 7:a935e2f5ebd0 | 317 | //redraw |
decfrv | 7:a935e2f5ebd0 | 318 | uLCD.cls(); |
decfrv | 7:a935e2f5ebd0 | 319 | uLCD.color(BLUE); |
decfrv | 7:a935e2f5ebd0 | 320 | for (int i = 0; i < 9; i++) { |
decfrv | 7:a935e2f5ebd0 | 321 | for (int j = 0; j < 9; j++) { |
decfrv | 7:a935e2f5ebd0 | 322 | if (nums[i][j] == 0) { |
decfrv | 7:a935e2f5ebd0 | 323 | uLCD.printf(" "); |
decfrv | 7:a935e2f5ebd0 | 324 | preset[i][j] = false; |
decfrv | 7:a935e2f5ebd0 | 325 | } else { |
decfrv | 7:a935e2f5ebd0 | 326 | uLCD.printf("%d ", nums[i][j]); |
decfrv | 7:a935e2f5ebd0 | 327 | preset[i][j] = true; |
decfrv | 7:a935e2f5ebd0 | 328 | } |
decfrv | 7:a935e2f5ebd0 | 329 | } |
decfrv | 7:a935e2f5ebd0 | 330 | //uLCD.printf("\n"); |
decfrv | 7:a935e2f5ebd0 | 331 | if (i != 2 && i != 5) { |
decfrv | 7:a935e2f5ebd0 | 332 | uLCD.printf("\n"); |
decfrv | 7:a935e2f5ebd0 | 333 | } |
decfrv | 7:a935e2f5ebd0 | 334 | } |
decfrv | 7:a935e2f5ebd0 | 335 | uLCD.color(BLACK); |
decfrv | 7:a935e2f5ebd0 | 336 | |
decfrv | 7:a935e2f5ebd0 | 337 | |
decfrv | 7:a935e2f5ebd0 | 338 | uLCD.line(40, 0, 40, 128, BLACK); |
decfrv | 7:a935e2f5ebd0 | 339 | uLCD.line(80, 0, 80, 128, BLACK); |
decfrv | 7:a935e2f5ebd0 | 340 | uLCD.line(0, 40, 128, 40, BLACK); |
decfrv | 7:a935e2f5ebd0 | 341 | uLCD.line(0, 80, 128, 80, BLACK); |
decfrv | 7:a935e2f5ebd0 | 342 | } |
decfrv | 7:a935e2f5ebd0 | 343 | |
decfrv | 7:a935e2f5ebd0 | 344 | /////////////////////////////////////////////// |
decfrv | 7:a935e2f5ebd0 | 345 | fire = true; |
decfrv | 7:a935e2f5ebd0 | 346 | } else { |
decfrv | 7:a935e2f5ebd0 | 347 | up = false; |
decfrv | 7:a935e2f5ebd0 | 348 | down = false; |
decfrv | 7:a935e2f5ebd0 | 349 | left = false; |
decfrv | 7:a935e2f5ebd0 | 350 | right = false; |
decfrv | 7:a935e2f5ebd0 | 351 | fire = false; |
decfrv | 7:a935e2f5ebd0 | 352 | } |
decfrv | 7:a935e2f5ebd0 | 353 | |
decfrv | 7:a935e2f5ebd0 | 354 | if (changed) { |
decfrv | 7:a935e2f5ebd0 | 355 | int xpoint = xndx * 14; |
decfrv | 7:a935e2f5ebd0 | 356 | int ypoint = yndx * 16 - (yndx/3) * 8; |
decfrv | 7:a935e2f5ebd0 | 357 | int oxpoint = oldxndx * 14; |
decfrv | 7:a935e2f5ebd0 | 358 | int oypoint = oldyndx * 16 - (oldyndx/3) * 8; |
decfrv | 7:a935e2f5ebd0 | 359 | |
decfrv | 7:a935e2f5ebd0 | 360 | uLCD.rectangle(oxpoint,oypoint-1,oxpoint+7,oypoint+7, WHITE); |
decfrv | 7:a935e2f5ebd0 | 361 | uLCD.rectangle(xpoint,ypoint-1,xpoint+7,ypoint+7, BLUE); |
decfrv | 7:a935e2f5ebd0 | 362 | changed = false; |
decfrv | 7:a935e2f5ebd0 | 363 | } |
decfrv | 7:a935e2f5ebd0 | 364 | //pc.printf("Joystick: %d %d %d %d %d\n\r", myNav[0], myNav[1], myNav[2], myNav[3], myNav[4]); |
decfrv | 7:a935e2f5ebd0 | 365 | //int number = -1; |
decfrv | 7:a935e2f5ebd0 | 366 | if (interruptChange && nums[yndx][xndx] != 0 && !preset[yndx][xndx]) { |
decfrv | 7:a935e2f5ebd0 | 367 | //number = nums[yndx][xndx]; |
decfrv | 7:a935e2f5ebd0 | 368 | //pc.printf("Number: %d\r\n", nums[yndx][xndx]); |
decfrv | 7:a935e2f5ebd0 | 369 | uLCD.locate(xndx * 2, yndx *2 - (yndx/3)); |
decfrv | 7:a935e2f5ebd0 | 370 | uLCD.printf("%d", nums[yndx][xndx]); |
decfrv | 7:a935e2f5ebd0 | 371 | interruptChange = false; |
decfrv | 7:a935e2f5ebd0 | 372 | |
decfrv | 7:a935e2f5ebd0 | 373 | //pc.printf("Test: %d\r\n", nums[yndx][xndx]); |
decfrv | 7:a935e2f5ebd0 | 374 | |
decfrv | 7:a935e2f5ebd0 | 375 | int xpoint = xndx * 14; |
decfrv | 7:a935e2f5ebd0 | 376 | int ypoint = yndx * 16 - (yndx/3) * 8; |
decfrv | 7:a935e2f5ebd0 | 377 | uLCD.rectangle(xpoint,ypoint-1,xpoint+7,ypoint+7, BLUE); |
decfrv | 7:a935e2f5ebd0 | 378 | } |
decfrv | 7:a935e2f5ebd0 | 379 | if (interruptNum != -1 && interruptNum != 0) { |
decfrv | 7:a935e2f5ebd0 | 380 | //pc.printf("Setting 5,5 as %d\r\n", interruptNum); |
decfrv | 7:a935e2f5ebd0 | 381 | nums[yndx][xndx] = interruptNum; |
decfrv | 7:a935e2f5ebd0 | 382 | interruptNum = -1; |
decfrv | 7:a935e2f5ebd0 | 383 | FILE *wave_file; |
decfrv | 7:a935e2f5ebd0 | 384 | wave_file = fopen("/sd/beep.wav","r"); |
decfrv | 7:a935e2f5ebd0 | 385 | bool playing = true; |
decfrv | 7:a935e2f5ebd0 | 386 | int vol = 5; |
decfrv | 7:a935e2f5ebd0 | 387 | waver.play(wave_file, playing, vol); |
decfrv | 7:a935e2f5ebd0 | 388 | } |
decfrv | 7:a935e2f5ebd0 | 389 | //pc.printf("Test2: %d\r\n", nums[yndx][xndx]); |
decfrv | 7:a935e2f5ebd0 | 390 | wait(0.1); |
emilmont | 1:491820ee784d | 391 | } |
emilmont | 1:491820ee784d | 392 | } |