fsm

Dependencies:   C12832 LM75B MMA7660

Files at this revision

API Documentation at this revision

Comitter:
jasonberry
Date:
Sun Oct 11 22:48:58 2020 +0000
Commit message:
version 1

Changed in this revision

C12832.lib Show annotated file Show diff for this revision Revisions of this file
LM75B.lib Show annotated file Show diff for this revision Revisions of this file
MMA7660.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r e516e94e1c63 C12832.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/C12832.lib	Sun Oct 11 22:48:58 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/askksa12543/code/C12832/#990d5eec2ef6
diff -r 000000000000 -r e516e94e1c63 LM75B.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LM75B.lib	Sun Oct 11 22:48:58 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/chris/code/LM75B/#6a70c9303bbe
diff -r 000000000000 -r e516e94e1c63 MMA7660.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA7660.lib	Sun Oct 11 22:48:58 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/Sissors/code/MMA7660/#36a163511e34
diff -r 000000000000 -r e516e94e1c63 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Oct 11 22:48:58 2020 +0000
@@ -0,0 +1,639 @@
+#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)
+    
+    
+}
\ No newline at end of file
diff -r 000000000000 -r e516e94e1c63 mbed-os.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-os.lib	Sun Oct 11 22:48:58 2020 +0000
@@ -0,0 +1,1 @@
+https://github.com/ARMmbed/mbed-os/#2885c1b41e63158cb6faf5f107cd821ae06ef26c