![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
Fork of mbed_blinky by
Revision 8:96112047d7f3, committed 2014-08-07
- 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); + } + } + } }