MrHeisenberg AUG|Wings / Mbed 2 deprecated StateMachine

Dependencies:   mbed

Revision:
0:05d73097e319
Child:
1:c5769cd78933
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Sep 29 12:05:03 2014 +0000
@@ -0,0 +1,153 @@
+#include "mbed.h"
+
+Ticker tick;
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+InterruptIn button(p12);
+
+// Zum Schalten: 1 Taster PINA PA0
+// 1. Funktion
+// Start-Taste 1x betätigen: 
+// Dauerlicht aller 4 LEDs
+// 2. Funktion
+// Start-Taste ein 2.mal betätigen:
+// LEDs blinken im ca. 400 Millisekunden-Takt; 200 msec Ein, 200 msec Aus
+// Ausschalten des Rücklichts
+// Die Start-Taste ein 3.mal betätigen:
+// Alle LEDs aus.
+
+
+//volatile uint8_t count;
+volatile unsigned int count;
+volatile unsigned int newEvent =0; 
+volatile unsigned int event=0, state=0;
+
+/* Prototypen der Funktionen */
+int no_fu();
+int ledsEin();
+int msec300TimerOn();
+int ledsAusTimerOff();
+int ledsTogglen();
+
+unsigned char nextstate_tab[2][3]=
+//present state 0  1  2
+//------------------------
+/* event 0 */{{ 1, 2, 0 },  // next
+/* event 1 */ { 0, 1, 2 }}; // state
+// state=nextstate_tab[event][state]; // gehe auf naechsten Zustand
+
+/*************************************************************/
+/* Tabelle fuer Aktionsroutinen fuer die Zustaende bei Input */ 
+/*************************************************************/
+//                           p r e s e n t    s t a t e 
+int(*action[2][3])()= //  0             1              2
+/* event 0 */       {{ ledsEin, msec300TimerOn, ledsAusTimerOff },        
+/* event 1 */        {  no_fu,       no_fu,       ledsTogglen }};       
+// (*action[event][state])(); // suche in Tabelle nach Funktion
+
+
+/* Aktionsroutinen, functions */
+int no_fu()         // keine function - tue nichts
+{
+  return(0);
+}
+
+int msec300TimerOn()       
+{
+    __enable_irq(); 
+    return(1);
+}
+
+int ledsAusTimerOff()        
+{ 
+    led1 = 0;
+    led2 = 0;
+    led3 = 0;
+    led4 = 0;
+    __disable_irq();
+    return(2);
+}
+
+int ledsTogglen()   
+{ 
+    led1 = !led1;
+    led2 = !led2;
+    led3 = !led3;
+    led4 = !led4;
+    return(3);
+}
+
+int ledsEin()   
+{ 
+    led1 = 1;
+    led2 = 1;
+    led3 = 1;
+    led4 = 1;
+    return(4);
+}
+
+// interrupt SR
+void timertick()
+{
+    ledsTogglen();
+}
+
+// functions
+void initTimer()
+{
+    tick.attach(&timertick, 0.2);
+}
+
+void debounce(PinName name, unsigned char samples)
+{
+    DigitalIn joystick(name);
+    
+    for(unsigned char j = 0; j < samples; j++)
+    {
+        if(joystick == 1)
+            j++;
+        else
+            j = 0;   
+            
+            if(j == samples)
+                break;
+    }    
+}
+
+void buttonpress()
+{
+        debounce(p12, 8);
+        
+        event =0;
+        newEvent =1;
+
+        if (newEvent)
+        {
+            __disable_irq();
+            newEvent =0;
+            (*action[event][state])(); // suche in Tabelle nach Funktion
+            state=nextstate_tab[event][state]; // gehe auf naechsten Zustand
+            __enable_irq();
+        } 
+}
+
+int main()
+{
+
+  button.rise(&buttonpress);
+  led1 = 0;
+  led2 = 0;
+  led3 = 0;
+  led4 = 0;
+  
+    initTimer();
+    
+    newEvent = 0;
+    state=0; 
+    event=0;
+}
+
+