jason berry
/
state_machine_with_ipc
Revision 0:8964cd6e2cd3, committed 2020-10-11
- Comitter:
- jasonberry
- Date:
- Sun Oct 11 22:51:20 2020 +0000
- Commit message:
- up down counter with fsm and ipc
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/C12832_lcd.lib Sun Oct 11 22:51:20 2020 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/dreschpe/code/C12832_lcd/#8f86576007d6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Oct 11 22:51:20 2020 +0000 @@ -0,0 +1,239 @@ +#include "mbed.h" +#include "rtos.h" +#include "C12832_lcd.h" + +//FINITE STATE MACHINE EVENTS +#define NO_EVENT 0 +#define TIME_OUT 1 +#define BUTTON_PRESS 2 + +//STATES +#define STATE_0 0 +#define STATE_1 1 +#define STATE_2 2 +#define STATE_3 3 +#define STATE_4 4 +#define STATE_5 5 + + + +//pass event via message queue +typedef struct { + int event; /* AD result of measured voltage */ +} message_t; + +MemoryPool<message_t, 16> mpool; +Queue<message_t, 16> queue; + +//button plus local display +DigitalIn fire(p14); +C12832_LCD lcd; //On board LCD display + +//leds for debug +DigitalOut led(LED1); //button press +DigitalOut led2(LED2); //fsm thread +DigitalOut led3(LED3); +DigitalOut led4(LED4); //timeout thread + + + +void timeout_event(void const *n) +{ + //generate local display info + lcd.cls(); + lcd.locate(40,5); + lcd.printf("timeout event"); + + + //event via a message queue + message_t *message = mpool.alloc(); + message->event = TIME_OUT; + queue.put(message); + + led4 = !led4; + +} + + +void button_event_thread(void const *argument) { + while (true) { + + //debouce delay for switch + Thread::wait(250); + + if (fire) + { + + lcd.cls(); + lcd.locate(0,1); + lcd.printf("button event"); + + + //event via a message queue + message_t *message = mpool.alloc(); + message->event = BUTTON_PRESS; + queue.put(message); + + led = !led; + } + } +} + + +int main (void) { + +//Thread fsm(fsm_thread); +Thread button_event(button_event_thread); +RtosTimer timer(timeout_event, osTimerPeriodic, (void *)0); + +int state = STATE_0; + + + //start timer with a 2 sec timeout + timer.start(2000); + + while (true) { + switch(state) + { + case STATE_0: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM START"); + + osEvent evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_1; + if(message->event == TIME_OUT) state = STATE_0; + + mpool.free(message); + } + + timer.start(2000); + + break; + + case STATE_1: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM COUNTER 1"); + + evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_2; + if(message->event == TIME_OUT) state = STATE_0; + + mpool.free(message); + } + + + timer.start(2000); + + break; + + case STATE_2: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM COUNTER 2"); + + evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_3; + if(message->event == TIME_OUT) state = STATE_1; + + mpool.free(message); + } + + timer.start(2000); + + break; + + case STATE_3: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM COUNTER 3"); + + evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_4; + if(message->event == TIME_OUT) state = STATE_2; + + mpool.free(message); + } + + + timer.start(2000); + + break; + + case STATE_4: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM COUNTER 4"); + + evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_5; + if(message->event == TIME_OUT) state = STATE_3; + + mpool.free(message); + } + + timer.start(2000); + + break; + + case STATE_5: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM COUNTER 5"); + + evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_5; + if(message->event == TIME_OUT) state = STATE_4; + + mpool.free(message); + } + + + + timer.start(2000); + + break; + + + + + }//End of switch + + //toggle led for local testing + led2= !led2; + + }//end of while(1) + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Sun Oct 11 22:51:20 2020 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-os/#2885c1b41e63158cb6faf5f107cd821ae06ef26c