finished

Dependencies:   C12832 DebouncedInterrupt MMA7660 mbed-rtos mbed

main.cpp

Committer:
cathal66
Date:
2015-03-03
Revision:
2:ff8262f6a385
Parent:
1:57407e283b03
Child:
3:c31a01f2c064

File content as of revision 2:ff8262f6a385:

#include "mbed.h"
#include "rtos.h"
#include "C12832.h"
#include "MMA7660.h"




//FINITE STATE MACHINE EVENTS
#define NO_EVENT 0
#define TIME_OUT 1
#define BUTTON_PRESS 2
#define TILT 3
#define PUSH 4

//STATES
#define STATE_0 0
#define STATE_1 1
#define STATE_2 2

//Mutex
Mutex LED_RGB;

//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;

//Digital input
//DigitalIn coin(p14);
InterruptIn button(p14);

//Analog input
AnalogIn push(p19);

//Setup hardware
MMA7660 MMA(p28, p27);
C12832 lcd(p5, p7, p6, p8, p11);

//RGB LEDs
DigitalOut led_R(p23); //LED RGB red
DigitalOut led_G(p24); //LED RGB green
DigitalOut led_B(p25); //LED RGB Blue

//leds for debug
DigitalOut led4(LED4); //LED 
DigitalOut led3(LED3); //LED
DigitalOut led2(LED2); //LED
        
//Global varible
int button_press=0;

    
void timeout_event(void const *n) 
{
       
        //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) {
        
        if (button_press == 1)
            {
           
            //event via a message queue
            message_t *message = mpool.alloc();
            message->event = BUTTON_PRESS; 
            queue.put(message);
            
            led3 = !led3;
            button_press = 0;
            Thread::wait(500);
            }
            
            
          
    }
}


void tilt_event_thread(void const *argument) {
    float tilt_value_Y = MMA.y();
    float tilt_value_X = MMA.x();
    while (true) 
        {
     
        //debouce delay for switch
        

        if (tilt_value_Y <= MMA.y()-0.2 ^ tilt_value_Y >= MMA.y()+0.2 )
            {

            //event via a message queue
            message_t *message = mpool.alloc();
            message->event = TILT; 
            queue.put(message);
            
            led3 = !led3;
            Thread::wait(1500);
            tilt_value_Y = MMA.y();
            }
            
        
        }
        
    
}
 
void push_event_thread(void const *argument) {
    float push_value = push.read();
    while (true) 
        {
     
        //debouce delay for switch
        
        if (push_value >= push.read()- 0.15 ^ push_value <= push.read()+ 0.15 )
            {
            //event via a message queue
            message_t *message = mpool.alloc();
            message->event = PUSH; 
            queue.put(message);
            led3 = !led3;
            Thread::wait(1000);
            push_value = push.read();
            }
        }
        
    
}
void flash_led_thread(void const *argument) {
    while (true) 
        {
        Thread::signal_wait(0x1);
    
        for (int i=0;i<=20;i++)
            {
            LED_RGB.lock();
            led_R = !led_R; 
            LED_RGB.unlock(); 
            Thread::wait(100);
            }
        LED_RGB.lock();
        led_R = 1; 
        LED_RGB.unlock();             
        }
     
}      



void Button_Inter() {
//Flash_LED_Thread.signal_set(0x1);  

button_press=1;
    
} 
    
int main (void) {
    
//Thread fsm(fsm_thread); 
Thread button_event(button_event_thread);
Thread tilt_event(tilt_event_thread);
Thread push_event(push_event_thread);
Thread Flash_LED_Thread(flash_led_thread); 
RtosTimer timer(timeout_event, osTimerPeriodic, (void *)0);

//Interrupts
button.rise(&Button_Inter);

int state = STATE_0;

LED_RGB.lock();
led_R=1;
led_G=1;
led_B=1;
LED_RGB.unlock();

if (MMA.testConnection())   //setup accler

    //start timer with a 2 sec timeout 
    timer.start(2000); 
    
    while (true) {
     
        
        switch(state)
            {
            case STATE_0:            
                osEvent evt = queue.get();
                if (evt.status == osEventMessage) 
                    {
                    message_t *message = (message_t*)evt.value.p;
                
                       
                    if(message->event == BUTTON_PRESS) 
                        {
                        LED_RGB.lock();
                        led_G=0;
                        led_R=1;
                        LED_RGB.unlock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Enter");
                        state = STATE_1;
                        }
                    if(message->event == PUSH) 
                        {
                        LED_RGB.lock();
                        led_G=1;    //off
                        led_R=0;    //on
                        LED_RGB.unlock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Insert Coin push");
                        state = STATE_0;
                        }
                    if(message->event == TILT) 
                        {
                        LED_RGB.lock();
                        led_G=1;
                        led_R=1;
                        LED_RGB.unlock();
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("STOP");
                        lcd.locate(0,10);
                        lcd.printf("Please Insert Coin");  
                        Flash_LED_Thread.signal_set(0x1);                 
                        state = STATE_2;
                        }                        
                    if(message->event == TIME_OUT) 
                        {
                        LED_RGB.lock();
                        led_G=1;
                        led_R=0;
                        LED_RGB.unlock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Hello");
                        state = STATE_0;
                        }
                    mpool.free(message);
                    }
                
                timer.start(2000);
            
            break;
            
            case STATE_1:
               
                evt = queue.get();
                if (evt.status == osEventMessage) 
                    {
                    message_t *message = (message_t*)evt.value.p;
                
                       
                    if(message->event == BUTTON_PRESS) 
                        {
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Thanks");
                        state = STATE_1;
                        }
                    if(message->event == PUSH)
                        {
                        LED_RGB.lock();
                        led_R=0;
                        led_G=1;
                        LED_RGB.unlock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Hello");
                        state = STATE_0;
                        }
                                        
                    mpool.free(message);
                    }
                 
            timer.start(2000);
                
            
            break;
            
            case STATE_2:

               evt = queue.get();
               if (evt.status == osEventMessage) 
                    {
                    message_t *message = (message_t*)evt.value.p;
                
                    if(message->event == BUTTON_PRESS) 
                        {
                        LED_RGB.lock();
                        led_G=0;
                        led_R=1;
                        LED_RGB.unlock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Enter");
                        state = STATE_1;
                        
                        }   
                    if(message->event == TILT) 
                        {
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("STOP");
                        lcd.locate(0,10);
                        lcd.printf("Please Insert Coin");  
                        state = STATE_2;
                        Flash_LED_Thread.signal_set(0x1);                        
                        }
                    if(message->event == TIME_OUT)
                        {
                        LED_RGB.lock();
                        led_R=0;
                        led_G=1;
                        LED_RGB.unlock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Insert Coin");
                        state = STATE_0;
                        }
                    mpool.free(message);
                    }

                timer.start(2000);
            
            break;          
            
          
       
        }//End of switch
        
    //toggle led for local testing    
    //led2= !led2;
                                       
    }//end of while(1)
    
    
}