Jan Waclawek
/
Simon
would be Simon game, as a demonstrator for buttons debouncing and \"collecting\" ---
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 #include "mbed.h" 00002 #include "DebounceIn_.h" 00003 #include <stdlib.h> 00004 #include <stdbool.h> 00005 00006 00007 DebounceIn button1(p15); 00008 DebounceIn button2(p16); 00009 DebounceIn button3(p17); 00010 DebounceIn button4(p21); 00011 00012 class CSimonButton { 00013 _Bool pressed; 00014 int button; 00015 public: 00016 CSimonButton(); 00017 _Bool IsPressed(void); 00018 int GetButton(void) {return button;}; 00019 void Handle(void); 00020 void Reset(void); // {pressed = 0;}; 00021 }; 00022 00023 void CSimonButton::Reset(void) { 00024 pressed = 0; 00025 button1.pressed = 0; 00026 button2.pressed = 0; 00027 button3.pressed = 0; 00028 button4.pressed = 0; 00029 } 00030 00031 CSimonButton::CSimonButton() { 00032 button1.mode(PullUp); 00033 button2.mode(PullUp); 00034 button3.mode(PullUp); 00035 button4.mode(PullUp); 00036 Reset(); // pressed = 0; 00037 } 00038 00039 _Bool CSimonButton::IsPressed(void) { 00040 _Bool tmp; 00041 00042 tmp = pressed; 00043 pressed = 0; 00044 return tmp; 00045 } 00046 00047 void CSimonButton::Handle(void) { 00048 if (button1.pressed) { 00049 button1.pressed = 0; 00050 pressed = 1; 00051 button = 1; 00052 } 00053 if (button2.pressed) { 00054 button2.pressed = 0; 00055 pressed = 1; 00056 button = 2; 00057 } 00058 if (button3.pressed) { 00059 button3.pressed = 0; 00060 pressed = 1; 00061 button = 3; 00062 } 00063 if (button4.pressed) { 00064 button4.pressed = 0; 00065 pressed = 1; 00066 button = 4; 00067 } 00068 00069 } 00070 00071 CSimonButton simonButton; 00072 00073 BusOut leds(LED1, LED2, LED3, LED4); 00074 00075 #define SIMON_MIN_SEQUENCE 3 00076 #define SIMON_MAX_SEQUENCE 10 00077 int simonPuzzle[SIMON_MAX_SEQUENCE]; // storage for the current puzzle 00078 int simonLevel; // current level 00079 00080 00081 int Random(int bound) { 00082 return rand() % bound; 00083 } 00084 00085 void InitSimon(void) { 00086 // prepare puzzle array 00087 for (int i = 0; i < SIMON_MAX_SEQUENCE; i++) { 00088 simonPuzzle[i] = Random(4); 00089 } 00090 simonLevel = SIMON_MIN_SEQUENCE; 00091 // visual: rapid blinking 00092 for (int i = 0; i < 10; i++) { 00093 leds.write(0x0F); 00094 wait(0.1); 00095 leds.write(0); 00096 wait(0.1); 00097 } 00098 wait(1.0); 00099 } 00100 00101 void PresentSimon(void) { // present the puzzle up to current simonLevel 00102 for (int i = 0; i < simonLevel; i++) { 00103 leds.write(1 << simonPuzzle[i]); 00104 wait(0.3); 00105 leds.write(0); 00106 wait(0.3); 00107 } 00108 } 00109 00110 _Bool AnswerSimon(void) { 00111 int i = 0; 00112 int button; 00113 simonButton.Reset(); 00114 while (i < simonLevel) { 00115 simonButton.Handle(); 00116 if (simonButton.IsPressed()) { 00117 button = simonButton.GetButton() - 1; 00118 leds.write(1 << button); 00119 wait(0.3); 00120 leds.write(0); 00121 if (button != simonPuzzle[i]) { 00122 return 0; 00123 } else { 00124 i++; 00125 } 00126 } 00127 } 00128 wait(0.5); 00129 return 1; 00130 } 00131 00132 void WinCeremony(void) { 00133 for (int i = 0; i < 200; i++) { 00134 leds.write(Random(0x10)); 00135 wait(0.03); 00136 } 00137 leds.write(0); 00138 wait(2.0); 00139 } 00140 00141 void YesCeremony(void) { 00142 for (int i = 0; i < 3; i++) { 00143 leds.write(0x0F); 00144 wait(0.2); 00145 leds.write(0); 00146 wait(0.1); 00147 } 00148 wait(1.0); 00149 } 00150 00151 00152 void NoCeremony(void) { 00153 for (int i = 0; i < 3; i++) { 00154 leds.write(0x01); wait(0.1); 00155 leds.write(0x02); wait(0.1); 00156 leds.write(0x04); wait(0.1); 00157 leds.write(0x08); wait(0.1); 00158 leds.write(0x04); wait(0.1); 00159 leds.write(0x02); wait(0.1); 00160 } 00161 wait(1.0); 00162 } 00163 int main() { 00164 _Bool answer; 00165 00166 while (1) { 00167 00168 InitSimon(); 00169 do { 00170 PresentSimon(); 00171 answer = AnswerSimon(); 00172 if (answer) { 00173 simonLevel++; 00174 if (simonLevel == SIMON_MAX_SEQUENCE) { 00175 WinCeremony(); 00176 answer = 0; 00177 } else { 00178 YesCeremony(); 00179 } 00180 } else { 00181 NoCeremony(); 00182 } 00183 } while (answer); 00184 } 00185 } 00186
Generated on Sun Sep 11 2022 18:35:40 by 1.7.2