State machines are commonly used to implement decision making algorithms. State machines are used in applications where distinguishable states exist. A finite state machine (FSM) is based on the idea that a given system has a finite number of states. In Summary States: 5 1.Error 2.Configuration 3.Ready 4.Assigned 5.Locked Transitions: 2 1.GO 2.OUT

Dependencies:   mbed

Fork of mbed_blinky by Mbed

Files at this revision

API Documentation at this revision

Comitter:
mnikolaos
Date:
Thu Aug 07 14:54:26 2014 +0000
Parent:
7:5d25743fac86
Commit message:
fsm finished

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 5d25743fac86 -r 96112047d7f3 main.cpp
--- a/main.cpp	Wed Aug 06 18:39:59 2014 +0000
+++ b/main.cpp	Thu Aug 07 14:54:26 2014 +0000
@@ -2,10 +2,14 @@
  
 Serial pc(USBTX, USBRX);
  
-DigitalOut gpo(D0);
-DigitalOut led(LED_BLUE);
+DigitalOut gpo1(D1);
+DigitalOut gpo2(D2);
+DigitalOut gpo3(D3);
+DigitalOut ledB(LED_BLUE);
+DigitalOut ledG(LED_GREEN);
+DigitalOut ledR(LED_RED);
 
-
+Ticker tick;
  
 typedef struct EventTag {
     uint16_t sig;                                    /* signal of the event */
@@ -103,59 +107,59 @@
 {
      (void)e;
      
-    printf("State --> Initial\n");
+    pc.printf("State --> Initial\n");
     TRAN(SETTING_FSM_STATE);
  }
 
 static void FSM_setting_GO    (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Setting - GO Event was caught\n");
+    pc.printf("State --> Setting - GO Event was caught\n");
     TRAN(READY_FSM_STATE);
 }
 
 static void FSM_setting_OUT   (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Setting - OUT Event was caught\n");
+    pc.printf("State --> Setting - OUT Event was caught\n");
 }
 
 static void FSM_setting_ERR   (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Setting - ERR Event was caught\n");
+    pc.printf("State --> Setting - ERR Event was caught\n");
     TRAN(ERROR_STATE);
 }
 
 static void FSM_setting_TRAN  (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Setting - TRAN ADMIN Event was caught\n");
+    pc.printf("State --> Setting - TRAN ADMIN Event was caught\n");
 }
 
 static void FSM_ready_GO      (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Ready - GO Event was caught\n");
+    pc.printf("State --> Ready - GO Event was caught\n");
     TRAN(ASSIGNED_FSM_STATE);
 }
 
 static void FSM_ready_OUT     (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Ready - OUT Event was caught\n");
+    pc.printf("State --> Ready - OUT Event was caught\n");
 }
 
 static void FSM_ready_TICK    (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Ready - TICK Event was caught\n");
+    pc.printf("State --> Ready - TICK Event was caught\n");
 }
 
 static void FSM_ready_ERR     (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Ready - ERR Event was caught\n");
+    pc.printf("State --> Ready - ERR Event was caught\n");
     TRAN(ERROR_STATE);
     
 }
@@ -163,7 +167,7 @@
 static void FSM_ready_CONF    (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Ready - CONF Event was caught\n");
+    pc.printf("State --> Ready - CONF Event was caught\n");
     TRAN(SETTING_FSM_STATE); 
     
 }
@@ -171,34 +175,34 @@
 static void FSM_ready_TRAN    (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Ready - TRAN ADMIN Event was caught\n");
+    pc.printf("State --> Ready - TRAN ADMIN Event was caught\n");
 }
 
 static void FSM_assigned_GO   (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Assigned - GO Event was caught\n");
+    pc.printf("State --> Assigned - GO Event was caught\n");
     TRAN(LOCKED_FSM_STATE);
 }
 
 static void FSM_assigned_OUT  (FSM1 *me, Event const *e)
 {
     (void)e;    
-    printf("State --> Assigned - OUT Event was caught\n");
+    pc.printf("State --> Assigned - OUT Event was caught\n");
     TRAN(READY_FSM_STATE);
 }
 
 static void FSM_assigned_TICK (FSM1 *me, Event const *e)
 {
     (void)e;    
-    printf("State --> Assigned - TICK Event was caught\n");
+    pc.printf("State --> Assigned - TICK Event was caught\n");
 
 }
 
 static void FSM_assigned_ERR  (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Assigned - ERR Event was caught\n");
+    pc.printf("State --> Assigned - ERR Event was caught\n");
     TRAN(ERROR_STATE);
     
 }
@@ -206,7 +210,7 @@
 static void FSM_assigned_CONF (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Assigned - CONF Event was caught\n");
+    pc.printf("State --> Assigned - CONF Event was caught\n");
     TRAN(SETTING_FSM_STATE);
     
 }
@@ -214,21 +218,21 @@
 static void FSM_assigned_TRAN (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Assigned - TRAN ADMIN Event was caught\n");
+    pc.printf("State --> Assigned - TRAN ADMIN Event was caught\n");
     
 }
 
 static void FSM_locked_GO     (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Locked - GO Event was caught\n");
+    pc.printf("State --> Locked - GO Event was caught\n");
     
 }
 
 static void FSM_locked_OUT    (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Locked - OUT Event was caught\n");
+    pc.printf("State --> Locked - OUT Event was caught\n");
     TRAN(ASSIGNED_FSM_STATE);
 
 }
@@ -236,14 +240,14 @@
 static void FSM_locked_TICK   (FSM1 *me, Event const *e)
 {
     (void)e;    
-    printf("State --> Locked - TICK Event was caught\n");
+    pc.printf("State --> Locked - TICK Event was caught\n");
 
 }
 
 static void FSM_locked_ERR    (FSM1 *me, Event const *e)
 {
     (void)e;    
-    printf("State --> Locked - ERR Event was caught\n");
+    pc.printf("State --> Locked - ERR Event was caught\n");
     TRAN(ERROR_STATE);
 
 }
@@ -251,7 +255,7 @@
 static void FSM_locked_CONF   (FSM1 *me, Event const *e)
 {
     (void)e;
-    printf("State --> Locked - CONF Event was caught\n");
+    pc.printf("State --> Locked - CONF Event was caught\n");
     TRAN(SETTING_FSM_STATE);
     
 }
@@ -259,7 +263,7 @@
 static void FSM_locked_TRAN   (FSM1 *me, Event const *e)
 {
     (void)e;    
-    printf("State --> Locked - TRAN ADMIN Event was caught\n");
+    pc.printf("State --> Locked - TRAN ADMIN Event was caught\n");
     
 }
  
@@ -278,10 +282,28 @@
     
     me->defuse = defuse;
 }
- 
+
+bool _t1_OVRFL = false;
+ // ISR Timer per 1sec
+ void ISR(void) {
+    _t1_OVRFL = true;
+}
+
+char cmd;
+bool _pc_GTCMD = false;
+// ISR when Gets command
+void Serial_ISR(void) {
+    _pc_GTCMD = true;
+    cmd = pc.getc(); //Gets the command
+}
+
 int main()
 {
 
+    pc.baud(9600);
+    pc.attach(&Serial_ISR);
+    tick.attach(&ISR, 1.0);
+
     static FSM1 _frdm_fsm;
     static Event const go_evt     = { GO_SIG   };
     static Event const out_evt    = { OUT_SIG };
@@ -294,12 +316,53 @@
     StTbl_init((StateTable *)&_frdm_fsm);
     
     pc.printf("Frdm K64F FSM App\r\n");
-
+    Event const *e = (Event *)0;
+       
     while (true) {
-        printf("Running\r\n\n");
-        gpo = !gpo; // toggle pin
-        led = !led; // toggle led
+        
+        pc.printf("Running\r\n\n");
+        gpo1 = !gpo1; // toggle pin
+        ledB = !ledB; // toggle led
         wait(0.2f);
+        
+        if(_t1_OVRFL)
+        {
+            _t1_OVRFL = false;
+                StTbl_dispatch((StateTable *)&_frdm_fsm, (Event *)&tick_evt);
+        }
+        
+        switch (cmd) 
+        {
+            case 'G': {
+                pc.printf(" Go received \n");
+                e = &go_evt;
+                break;
+            }
+            case 'O': {
+                pc.printf(" Out Received \n");
+                e = &out_evt;
+                break;
+            }
+            case 'E': {
+                pc.printf(" Error Received \n");
+                e = &err_evt;
+                break;
+            }
+            case 'C': {
+                pc.printf(" Config Received \n");
+                e = &conf_evt;
+                break;
+            }
+        }
+        if(_pc_GTCMD)
+        {
+            _pc_GTCMD = false;
+            if (e != (Event *)0)
+            {
+               StTbl_dispatch((StateTable *)&_frdm_fsm, e);
+            }
+        }
+        
     }
 }