fsm

Dependencies:   C12832 LM75B MMA7660

main.cpp

Committer:
jasonberry
Date:
2020-10-11
Revision:
0:e516e94e1c63

File content as of revision 0:e516e94e1c63:

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

//#jtb#002 firedoor
#include "LM75B.h"



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

//##jtb001: timeout 10secs on enter
#define TIME_OUT_10 5

//#jtb#002 firedoor
#define TEMPERATURE_HIGH 6
#define TEMPERATURE_LOW 7


//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
#define STATE_6 6


//#jtb#002 firedoor
#define TEMPERAURE_SETPOINT 29


//Mutex
Mutex LED_RGB;
//#jtb#002 firedoor
Mutex LCD_MUTEX;



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

//#jtb#002 firedoor
LM75B sensor(p28,p27);
        
//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;
        
}

//##jtb001: timeout 10secs on enter
void timeout_event_10(void const *n) 
{
       
        //event via a message queue
        message_t *message = mpool.alloc();
        message->event = TIME_OUT_10; 
        queue.put(message);
        
        led3 =  !led3;
        
}


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);
    
        LED_RGB.lock();
        led_R=0;
        led_G=1;
        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();             
        }
     
}      


 
//#jtb#002 firedoor 
void temperature_event_thread(void const *argument) {
int first_time_high = true;      
int first_time_low = true;

while (1) 
    {
    
    LCD_MUTEX.lock();
    lcd.locate(0,10);
    lcd.printf("Temp = %.3f\n", sensor.read());
    LCD_MUTEX.unlock();
    
            
    if ((sensor.read() > TEMPERAURE_SETPOINT) && first_time_high == true )
        {
        //event via a message queue
        message_t *message = mpool.alloc();
        message->event = TEMPERATURE_HIGH; 
        queue.put(message);
        led3 = !led3;
        first_time_high = false; //latch
        first_time_low = true; //latch
        //Thread::wait(1000);
        }
    else if ((sensor.read() < TEMPERAURE_SETPOINT) && first_time_low == true )
        {
        //event via a message queue
        message_t *message = mpool.alloc();
        message->event = TEMPERATURE_LOW; 
        queue.put(message);
        led3 = !led3;
        first_time_high = true; //latch
        first_time_low = false; //latch
        //Thread::wait(1000);
        
        }
    else
        {
        first_time_high = true; //latch
        first_time_low = true; //latch    
        Thread::wait(1000);
        }
        
                    

    }//end of while
   
}

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

//#jtb#002 firedoor
Thread temperature_event(temperature_event_thread);

RtosTimer timer(timeout_event, osTimerPeriodic, (void *)0);

//##jtb001: timeout 10secs on enter
RtosTimer timer_10(timeout_event_10, 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); 


//start up screen
//#jtb#002 firedoor
LCD_MUTEX.lock();
lcd.cls();
lcd.locate(0,2);
lcd.printf("Insert Coin");   
LCD_MUTEX.unlock();

//lcd.locate(0,10);
//lcd.printf("Temp = %.3f\n", sensor.read());

    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; // on
                        led_R=1; // off
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Please Enter");
                        LCD_MUTEX.unlock();
                        
                        //##jtb001 start timer2 with a 10 sec timeout 
                        timer_10.start(10000); 
                        
                        state = STATE_1;
                        }

                    if(message->event == TILT) 
                        {
                        LED_RGB.lock();
                        led_G=1;
                        led_R=1;
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("STOP");
                        lcd.locate(0,10);
                        lcd.printf("Please Insert Coin"); 
                        LCD_MUTEX.unlock(); 
                        
                        Flash_LED_Thread.signal_set(0x1);                 
                        state = STATE_3;
                        timer.start(2000);
                        }      
                        
                    if(message->event == TEMPERATURE_HIGH) 
                        {
                        LED_RGB.lock();
                        led_G=0; // on
                        led_R=0; // oN
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Please Exit");
                        LCD_MUTEX.unlock();
                                                                      
                        state = STATE_6;
                        }                  

                    mpool.free(message);
                    }
                
                
            
            break;
            
            case STATE_1:
               
                evt = queue.get();
                if (evt.status == osEventMessage) 
                    {
                    message_t *message = (message_t*)evt.value.p;
                
                       
                    if(message->event == TILT) 
                        {
                        LED_RGB.lock();
                        led_G=1;
                        led_R=1;
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("STOP");
                        lcd.locate(0,10);
                        lcd.printf("Please Enter");  
                        LCD_MUTEX.unlock();
                        
                        Flash_LED_Thread.signal_set(0x1);                 
                        state = STATE_4;
                        timer.start(2000);
                        } 
                    if(message->event == PUSH)
                        {
                        LED_RGB.lock();
                        led_R=1;//off
                        led_G=0;//on
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Have a nice day");
                        LCD_MUTEX.unlock();
                        timer.start(2000);
                        state = STATE_2;
                        }
                    
                    //##jtb001: timeout 10secs on enter
                    if(message->event == TIME_OUT_10)
                        {
                        LED_RGB.lock();
                        led_R=0;
                        led_G=1;
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Insert Coin");
                        LCD_MUTEX.unlock();
                        state = STATE_0;
                        }
                                        
                    mpool.free(message);
                    }
                 
           
                
            
            break;
            
            case STATE_2:

               evt = queue.get();
               if (evt.status == osEventMessage) 
                    {
                    message_t *message = (message_t*)evt.value.p;
                
  
                    if(message->event == TILT) 
                        {
                        //#jtb#002 firedoor    
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("STOP");
                        lcd.locate(0,10);
                        lcd.printf("Please Insert Coin"); 
                        LCD_MUTEX.unlock();
                        
                         
                        state = STATE_5;
                        timer.start(2000);
                        Flash_LED_Thread.signal_set(0x1);                        
                        }
                    if(message->event == TIME_OUT)
                        {
                        LED_RGB.lock();
                        led_R=0;
                        led_G=1;
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Insert Coin");
                        LCD_MUTEX.unlock();
                        state = STATE_0;
                        
                        }
                    mpool.free(message);
                    }

                
            
            break;          
            
          case STATE_3:

               evt = queue.get();
               if (evt.status == osEventMessage) 
                    {
                    message_t *message = (message_t*)evt.value.p;
                

                    if(message->event == TIME_OUT)
                        {
                        LED_RGB.lock();
                        led_R=0;
                        led_G=1;
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Insert Coin");
                        LCD_MUTEX.unlock();
                        
                        state = STATE_0;
                        timer.start(2000);
                        }
                    mpool.free(message);
                    }

                
            
            break;     

 
          case STATE_4:

               evt = queue.get();
               if (evt.status == osEventMessage) 
                    {
                    message_t *message = (message_t*)evt.value.p;
                

                    if(message->event == TIME_OUT)
                        {
                        LED_RGB.lock();
                        led_R=1;
                        led_G=0;
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Please Enter");
                        LCD_MUTEX.unlock();
                        
                        state = STATE_1;
                        
                        }
                    mpool.free(message);
                    }

                
            
            break; 
            
         case STATE_5:

               evt = queue.get();
               if (evt.status == osEventMessage) 
                    {
                    message_t *message = (message_t*)evt.value.p;
                

                    if(message->event == TIME_OUT)
                        {
                        LED_RGB.lock();
                        led_R=1;
                        led_G=0;
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Have a nice day");
                        LCD_MUTEX.unlock();
                        
                        state = STATE_2;
                        timer.start(2000);
                        }
                    mpool.free(message);
                    }

                
            
            break; 
            
            case STATE_6:

               evt = queue.get();
               if (evt.status == osEventMessage) 
                    {
                    message_t *message = (message_t*)evt.value.p;
                

                    if(message->event == TEMPERATURE_LOW)
                        {
                        LED_RGB.lock();
                        led_R=0;
                        led_G=1;
                        LED_RGB.unlock();
                        
                        //#jtb#002 firedoor
                        LCD_MUTEX.lock();
                        lcd.cls();
                        lcd.locate(0,2);
                        lcd.printf("Insert Coin");
                        LCD_MUTEX.unlock();
                        
                        state = STATE_0;
                        
                        }
                    mpool.free(message);
                    }

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