up down counter fsm

Dependencies:   C12832_lcd

main.cpp

Committer:
jasonberry
Date:
2020-10-11
Revision:
0:8964cd6e2cd3

File content as of revision 0:8964cd6e2cd3:

#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)
    
    
}