UEBUNG - Statemachine - SERIAL DEBUG Einzelne Schritte - SERIAL Ausgabe

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 
00002 // Mit H-Term connecten 
00003 // Debug über Konsole
00004 
00005 #include "mbed.h"
00006 
00007 class StateMachine
00008 {
00009 private:
00010     InterruptIn _sw1, _sw2, _sw3, _sw4;
00011     DigitalOut _led1, _led2, _led3, _led4;
00012     enum _State {ST_IDLE=0, ST_Blinken, ST_TimeOut};
00013     Timer _getTime;
00014     bool volatile _sw1Pressed;  // rechnet zu schnell als das cache korrekt ausgelesen wird
00015     bool volatile _sw2Pressed;
00016 public:
00017     StateMachine(PinName sw1, PinName sw2, PinName sw3, PinName sw4, PinName led1, PinName led2, PinName led3, PinName led4):
00018     _sw1(sw1), _sw2(sw2), _sw3(sw3), _sw4(sw4), _led1(led1), _led2(led2), _led3(led3), _led4(led4)
00019     {
00020         _led1=0; _led2=0; _led3=0; _led4=0;
00021         _sw1.rise(callback(this, &StateMachine::sw1Rise));
00022         _sw2.rise(callback(this, &StateMachine::sw2Rise));
00023     }
00024 public:
00025     _State state;
00026 public:
00027     void init(void);
00028     void sw1Rise(void); void sw2Rise(void);
00029     void getTime(void);
00030     void statemachine(void);
00031     void idle(void); void blinken(void); void timeOut(void);
00032     bool sw1CheckFlag(void); bool sw2CheckFlag(void);
00033 };
00034 
00035 void StateMachine::init(void)
00036 {
00037     printf("state - init \n");
00038     _sw1Pressed = false;
00039     _sw2Pressed = false;
00040     state = ST_IDLE;
00041 }
00042 
00043 bool StateMachine::sw2CheckFlag(void)
00044 {
00045     if(_sw2Pressed == true) // Erweitern das es nicht im IDLE status gedrück werden kann
00046     {
00047         printf("state - sw2CheckFlag \n");
00048         _sw2Pressed = false;
00049         return true;
00050     } 
00051     return false;
00052 }
00053 
00054 void StateMachine::sw2Rise(void)
00055 {
00056     printf("state - sw2Rise \n");
00057     _sw2Pressed = true;
00058     wait(0.2);
00059 }
00060 
00061 void StateMachine::timeOut(void)
00062 {
00063     printf("state - timeOut \n \n");
00064     printf("TimeOut in Sekunden: ");
00065     int counter = 0;
00066     while(true)         // mit counter hängt Terminal immer 10 sekunden, eventuell mit TIcker machen
00067     {
00068         printf("%i ", counter++);
00069         wait(1);
00070         
00071         if(sw2CheckFlag())
00072         {
00073             state = ST_Blinken;
00074             return;
00075         }
00076         
00077     }
00078 }
00079 
00080 bool StateMachine::sw1CheckFlag(void)
00081 {
00082     if(_sw1Pressed == true)
00083     {
00084         printf("state - sw1CheckFlag \n");
00085         _sw1Pressed = false;
00086         getTime();
00087         return true;
00088     }
00089     return false;
00090 }
00091 
00092 void StateMachine::sw1Rise(void)
00093 {
00094     printf("state - sw1Rise \n");
00095     _sw1Pressed = true;
00096     wait(0.2);
00097 }
00098 
00099 void StateMachine::getTime(void)
00100 {
00101     printf("state - getTime \n");
00102     if(_getTime.read() > 0)
00103     {
00104         printf("----------------------------\n");
00105         printf("Time passed: %.2f Sekunden  \n", _getTime.read());
00106         printf("----------------------------\n");
00107         printf("Timer - reset \n");
00108         _getTime.reset();
00109     }
00110     else
00111     {
00112         printf("Timer - start \n");
00113         _getTime.start();
00114     }
00115 }
00116 
00117 void StateMachine::statemachine(void)
00118 {
00119     printf("state - menu \n");
00120     while(true)
00121     {
00122         switch(state)
00123         {
00124             case ST_IDLE:       idle();     break;   
00125             case ST_Blinken:    blinken();  break;
00126             case ST_TimeOut:    timeOut();  break;
00127             default: printf("ERROR \n");    break;
00128         }
00129     
00130     }
00131 
00132 }
00133 
00134 void StateMachine::idle(void)
00135 {
00136     printf("state - idle \n \n");
00137     while(true)
00138     {
00139         if(sw1CheckFlag())
00140         {
00141             state = ST_Blinken;
00142             return;
00143         }
00144     }
00145     
00146 }
00147 
00148 void StateMachine::blinken(void)
00149 {
00150     printf("state - blinken \n \n");
00151     _led1 = true;
00152     while(true)
00153     {
00154         _led4 = !_led4;
00155         wait(0.250);
00156         
00157         if(sw1CheckFlag())
00158         {
00159             state = ST_IDLE;
00160             _led1 = false;
00161             _led4 = false;
00162             return;
00163         }
00164         else if(sw2CheckFlag())
00165         {
00166             state = ST_TimeOut;
00167             return;
00168         }
00169     }
00170 }
00171 
00172 
00173 
00174 StateMachine statemachine(p14, p15, p12, p16, LED1, LED2, LED3, LED4);
00175 
00176 int main() 
00177 {
00178     printf("-------------------------------- \n");
00179     printf("| SERIAL - DEBUG  | PWR - 2019 | \n");
00180     printf("-------------------------------- \n");
00181     printf("main - 1 \n");
00182     statemachine.init();
00183     printf("main - 2 \n");
00184     statemachine.statemachine();
00185     printf("main - 3 \n");
00186 
00187 }