finished

Dependencies:   C12832 DebouncedInterrupt MMA7660 mbed-rtos mbed

main.cpp

Committer:
cathal66
Date:
2015-02-26
Revision:
0:151f0dbf3ca8
Child:
1:57407e283b03

File content as of revision 0:151f0dbf3ca8:

#include "mbed.h"
#include "rtos.h"
#include "C12832.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 coin(p14);

C12832 lcd(p5, p7, p6, p8, p11);

//leds for debug
DigitalOut led_R(p23); //LED RGB red
DigitalOut led_G(p24); //LED RGB green

DigitalOut led4(LED4); //LED RGB green
DigitalOut led3(LED3); //LED RGB green

    
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) {
    int button_press=0;
    while (true) {
     
        //debouce delay for switch
        
        if (coin)
            {
                button_press = 1;
            if (button_press == 1 & coin == 0)
                {
             
                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);
                
                led3 = !led3;
                button_press = 0;
                }
            }
        else 
            {
                //button_press = coin;
                //Thread::wait(100);
            }
    }
}

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