Jan Waclawek
/
Simon
would be Simon game, as a demonstrator for buttons debouncing and \"collecting\" ---
main.cpp@2:fe450a70f8a4, 2010-12-14 (annotated)
- Committer:
- wek
- Date:
- Tue Dec 14 00:45:37 2010 +0000
- Revision:
- 2:fe450a70f8a4
- Parent:
- 1:3acf57259c58
Finally, the real Simon game. Enjoy! ;-)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wek | 2:fe450a70f8a4 | 1 | #include "mbed.h" |
wek | 2:fe450a70f8a4 | 2 | #include "DebounceIn_.h" |
wek | 2:fe450a70f8a4 | 3 | #include <stdlib.h> |
wek | 2:fe450a70f8a4 | 4 | #include <stdbool.h> |
wek | 2:fe450a70f8a4 | 5 | |
wek | 2:fe450a70f8a4 | 6 | |
wek | 2:fe450a70f8a4 | 7 | DebounceIn button1(p15); |
wek | 2:fe450a70f8a4 | 8 | DebounceIn button2(p16); |
wek | 2:fe450a70f8a4 | 9 | DebounceIn button3(p17); |
wek | 2:fe450a70f8a4 | 10 | DebounceIn button4(p21); |
wek | 2:fe450a70f8a4 | 11 | |
wek | 2:fe450a70f8a4 | 12 | class CSimonButton { |
wek | 2:fe450a70f8a4 | 13 | _Bool pressed; |
wek | 2:fe450a70f8a4 | 14 | int button; |
wek | 2:fe450a70f8a4 | 15 | public: |
wek | 2:fe450a70f8a4 | 16 | CSimonButton(); |
wek | 2:fe450a70f8a4 | 17 | _Bool IsPressed(void); |
wek | 2:fe450a70f8a4 | 18 | int GetButton(void) {return button;}; |
wek | 2:fe450a70f8a4 | 19 | void Handle(void); |
wek | 2:fe450a70f8a4 | 20 | void Reset(void); // {pressed = 0;}; |
wek | 2:fe450a70f8a4 | 21 | }; |
wek | 2:fe450a70f8a4 | 22 | |
wek | 2:fe450a70f8a4 | 23 | void CSimonButton::Reset(void) { |
wek | 2:fe450a70f8a4 | 24 | pressed = 0; |
wek | 2:fe450a70f8a4 | 25 | button1.pressed = 0; |
wek | 2:fe450a70f8a4 | 26 | button2.pressed = 0; |
wek | 2:fe450a70f8a4 | 27 | button3.pressed = 0; |
wek | 2:fe450a70f8a4 | 28 | button4.pressed = 0; |
wek | 2:fe450a70f8a4 | 29 | } |
wek | 2:fe450a70f8a4 | 30 | |
wek | 2:fe450a70f8a4 | 31 | CSimonButton::CSimonButton() { |
wek | 2:fe450a70f8a4 | 32 | button1.mode(PullUp); |
wek | 2:fe450a70f8a4 | 33 | button2.mode(PullUp); |
wek | 2:fe450a70f8a4 | 34 | button3.mode(PullUp); |
wek | 2:fe450a70f8a4 | 35 | button4.mode(PullUp); |
wek | 2:fe450a70f8a4 | 36 | Reset(); // pressed = 0; |
wek | 2:fe450a70f8a4 | 37 | } |
wek | 2:fe450a70f8a4 | 38 | |
wek | 2:fe450a70f8a4 | 39 | _Bool CSimonButton::IsPressed(void) { |
wek | 2:fe450a70f8a4 | 40 | _Bool tmp; |
wek | 2:fe450a70f8a4 | 41 | |
wek | 2:fe450a70f8a4 | 42 | tmp = pressed; |
wek | 2:fe450a70f8a4 | 43 | pressed = 0; |
wek | 2:fe450a70f8a4 | 44 | return tmp; |
wek | 2:fe450a70f8a4 | 45 | } |
wek | 2:fe450a70f8a4 | 46 | |
wek | 2:fe450a70f8a4 | 47 | void CSimonButton::Handle(void) { |
wek | 2:fe450a70f8a4 | 48 | if (button1.pressed) { |
wek | 2:fe450a70f8a4 | 49 | button1.pressed = 0; |
wek | 2:fe450a70f8a4 | 50 | pressed = 1; |
wek | 2:fe450a70f8a4 | 51 | button = 1; |
wek | 2:fe450a70f8a4 | 52 | } |
wek | 2:fe450a70f8a4 | 53 | if (button2.pressed) { |
wek | 2:fe450a70f8a4 | 54 | button2.pressed = 0; |
wek | 2:fe450a70f8a4 | 55 | pressed = 1; |
wek | 2:fe450a70f8a4 | 56 | button = 2; |
wek | 2:fe450a70f8a4 | 57 | } |
wek | 2:fe450a70f8a4 | 58 | if (button3.pressed) { |
wek | 2:fe450a70f8a4 | 59 | button3.pressed = 0; |
wek | 2:fe450a70f8a4 | 60 | pressed = 1; |
wek | 2:fe450a70f8a4 | 61 | button = 3; |
wek | 2:fe450a70f8a4 | 62 | } |
wek | 2:fe450a70f8a4 | 63 | if (button4.pressed) { |
wek | 2:fe450a70f8a4 | 64 | button4.pressed = 0; |
wek | 2:fe450a70f8a4 | 65 | pressed = 1; |
wek | 2:fe450a70f8a4 | 66 | button = 4; |
wek | 2:fe450a70f8a4 | 67 | } |
wek | 2:fe450a70f8a4 | 68 | |
wek | 2:fe450a70f8a4 | 69 | } |
wek | 2:fe450a70f8a4 | 70 | |
wek | 2:fe450a70f8a4 | 71 | CSimonButton simonButton; |
wek | 2:fe450a70f8a4 | 72 | |
wek | 2:fe450a70f8a4 | 73 | BusOut leds(LED1, LED2, LED3, LED4); |
wek | 2:fe450a70f8a4 | 74 | |
wek | 2:fe450a70f8a4 | 75 | #define SIMON_MIN_SEQUENCE 3 |
wek | 2:fe450a70f8a4 | 76 | #define SIMON_MAX_SEQUENCE 10 |
wek | 2:fe450a70f8a4 | 77 | int simonPuzzle[SIMON_MAX_SEQUENCE]; // storage for the current puzzle |
wek | 2:fe450a70f8a4 | 78 | int simonLevel; // current level |
wek | 2:fe450a70f8a4 | 79 | |
wek | 2:fe450a70f8a4 | 80 | |
wek | 2:fe450a70f8a4 | 81 | int Random(int bound) { |
wek | 2:fe450a70f8a4 | 82 | return rand() % bound; |
wek | 2:fe450a70f8a4 | 83 | } |
wek | 2:fe450a70f8a4 | 84 | |
wek | 2:fe450a70f8a4 | 85 | void InitSimon(void) { |
wek | 2:fe450a70f8a4 | 86 | // prepare puzzle array |
wek | 2:fe450a70f8a4 | 87 | for (int i = 0; i < SIMON_MAX_SEQUENCE; i++) { |
wek | 2:fe450a70f8a4 | 88 | simonPuzzle[i] = Random(4); |
wek | 2:fe450a70f8a4 | 89 | } |
wek | 2:fe450a70f8a4 | 90 | simonLevel = SIMON_MIN_SEQUENCE; |
wek | 2:fe450a70f8a4 | 91 | // visual: rapid blinking |
wek | 2:fe450a70f8a4 | 92 | for (int i = 0; i < 10; i++) { |
wek | 2:fe450a70f8a4 | 93 | leds.write(0x0F); |
wek | 2:fe450a70f8a4 | 94 | wait(0.1); |
wek | 2:fe450a70f8a4 | 95 | leds.write(0); |
wek | 2:fe450a70f8a4 | 96 | wait(0.1); |
wek | 2:fe450a70f8a4 | 97 | } |
wek | 2:fe450a70f8a4 | 98 | wait(1.0); |
wek | 2:fe450a70f8a4 | 99 | } |
wek | 2:fe450a70f8a4 | 100 | |
wek | 2:fe450a70f8a4 | 101 | void PresentSimon(void) { // present the puzzle up to current simonLevel |
wek | 2:fe450a70f8a4 | 102 | for (int i = 0; i < simonLevel; i++) { |
wek | 2:fe450a70f8a4 | 103 | leds.write(1 << simonPuzzle[i]); |
wek | 2:fe450a70f8a4 | 104 | wait(0.3); |
wek | 2:fe450a70f8a4 | 105 | leds.write(0); |
wek | 2:fe450a70f8a4 | 106 | wait(0.3); |
wek | 2:fe450a70f8a4 | 107 | } |
wek | 2:fe450a70f8a4 | 108 | } |
wek | 2:fe450a70f8a4 | 109 | |
wek | 2:fe450a70f8a4 | 110 | _Bool AnswerSimon(void) { |
wek | 2:fe450a70f8a4 | 111 | int i = 0; |
wek | 2:fe450a70f8a4 | 112 | int button; |
wek | 2:fe450a70f8a4 | 113 | simonButton.Reset(); |
wek | 2:fe450a70f8a4 | 114 | while (i < simonLevel) { |
wek | 2:fe450a70f8a4 | 115 | simonButton.Handle(); |
wek | 2:fe450a70f8a4 | 116 | if (simonButton.IsPressed()) { |
wek | 2:fe450a70f8a4 | 117 | button = simonButton.GetButton() - 1; |
wek | 2:fe450a70f8a4 | 118 | leds.write(1 << button); |
wek | 2:fe450a70f8a4 | 119 | wait(0.3); |
wek | 2:fe450a70f8a4 | 120 | leds.write(0); |
wek | 2:fe450a70f8a4 | 121 | if (button != simonPuzzle[i]) { |
wek | 2:fe450a70f8a4 | 122 | return 0; |
wek | 2:fe450a70f8a4 | 123 | } else { |
wek | 2:fe450a70f8a4 | 124 | i++; |
wek | 2:fe450a70f8a4 | 125 | } |
wek | 2:fe450a70f8a4 | 126 | } |
wek | 2:fe450a70f8a4 | 127 | } |
wek | 2:fe450a70f8a4 | 128 | wait(0.5); |
wek | 2:fe450a70f8a4 | 129 | return 1; |
wek | 2:fe450a70f8a4 | 130 | } |
wek | 2:fe450a70f8a4 | 131 | |
wek | 2:fe450a70f8a4 | 132 | void WinCeremony(void) { |
wek | 2:fe450a70f8a4 | 133 | for (int i = 0; i < 200; i++) { |
wek | 2:fe450a70f8a4 | 134 | leds.write(Random(0x10)); |
wek | 2:fe450a70f8a4 | 135 | wait(0.03); |
wek | 2:fe450a70f8a4 | 136 | } |
wek | 2:fe450a70f8a4 | 137 | leds.write(0); |
wek | 2:fe450a70f8a4 | 138 | wait(2.0); |
wek | 2:fe450a70f8a4 | 139 | } |
wek | 2:fe450a70f8a4 | 140 | |
wek | 2:fe450a70f8a4 | 141 | void YesCeremony(void) { |
wek | 2:fe450a70f8a4 | 142 | for (int i = 0; i < 3; i++) { |
wek | 2:fe450a70f8a4 | 143 | leds.write(0x0F); |
wek | 2:fe450a70f8a4 | 144 | wait(0.2); |
wek | 2:fe450a70f8a4 | 145 | leds.write(0); |
wek | 2:fe450a70f8a4 | 146 | wait(0.1); |
wek | 2:fe450a70f8a4 | 147 | } |
wek | 2:fe450a70f8a4 | 148 | wait(1.0); |
wek | 2:fe450a70f8a4 | 149 | } |
wek | 2:fe450a70f8a4 | 150 | |
wek | 2:fe450a70f8a4 | 151 | |
wek | 2:fe450a70f8a4 | 152 | void NoCeremony(void) { |
wek | 2:fe450a70f8a4 | 153 | for (int i = 0; i < 3; i++) { |
wek | 2:fe450a70f8a4 | 154 | leds.write(0x01); wait(0.1); |
wek | 2:fe450a70f8a4 | 155 | leds.write(0x02); wait(0.1); |
wek | 2:fe450a70f8a4 | 156 | leds.write(0x04); wait(0.1); |
wek | 2:fe450a70f8a4 | 157 | leds.write(0x08); wait(0.1); |
wek | 2:fe450a70f8a4 | 158 | leds.write(0x04); wait(0.1); |
wek | 2:fe450a70f8a4 | 159 | leds.write(0x02); wait(0.1); |
wek | 2:fe450a70f8a4 | 160 | } |
wek | 2:fe450a70f8a4 | 161 | wait(1.0); |
wek | 2:fe450a70f8a4 | 162 | } |
wek | 2:fe450a70f8a4 | 163 | int main() { |
wek | 2:fe450a70f8a4 | 164 | _Bool answer; |
wek | 2:fe450a70f8a4 | 165 | |
wek | 2:fe450a70f8a4 | 166 | while (1) { |
wek | 2:fe450a70f8a4 | 167 | |
wek | 2:fe450a70f8a4 | 168 | InitSimon(); |
wek | 2:fe450a70f8a4 | 169 | do { |
wek | 2:fe450a70f8a4 | 170 | PresentSimon(); |
wek | 2:fe450a70f8a4 | 171 | answer = AnswerSimon(); |
wek | 2:fe450a70f8a4 | 172 | if (answer) { |
wek | 2:fe450a70f8a4 | 173 | simonLevel++; |
wek | 2:fe450a70f8a4 | 174 | if (simonLevel == SIMON_MAX_SEQUENCE) { |
wek | 2:fe450a70f8a4 | 175 | WinCeremony(); |
wek | 2:fe450a70f8a4 | 176 | answer = 0; |
wek | 2:fe450a70f8a4 | 177 | } else { |
wek | 2:fe450a70f8a4 | 178 | YesCeremony(); |
wek | 2:fe450a70f8a4 | 179 | } |
wek | 2:fe450a70f8a4 | 180 | } else { |
wek | 2:fe450a70f8a4 | 181 | NoCeremony(); |
wek | 2:fe450a70f8a4 | 182 | } |
wek | 2:fe450a70f8a4 | 183 | } while (answer); |
wek | 2:fe450a70f8a4 | 184 | } |
wek | 2:fe450a70f8a4 | 185 | } |
wek | 2:fe450a70f8a4 | 186 |