would be Simon game, as a demonstrator for buttons debouncing and \"collecting\" ---

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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