...

Dependencies:   mbed-rtos mbed

Revision:
1:92ebe0707661
Parent:
0:a68d724119d5
Child:
2:e5e49d27768a
--- a/main.cpp	Mon Jan 27 15:40:32 2014 +0000
+++ b/main.cpp	Mon Jan 27 21:46:01 2014 +0000
@@ -1,47 +1,177 @@
 #include "mbed.h"
 #include "rtos.h"
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-AnalogIn evenAnn1(p19);
-AnalogIn evenAnn1(p20);
+
+#define NUM_DELAY 100
+#define ANN_DELAY 250
+#define ANN_THRESOLD 125
+
+#define SWITCH_1 0
+#define SWITCH_2 1
+#define POT_1 2
+#define POT_2 3
+
+const char* eventType[4] = {"Switch 1", "Switch 2", "Pot 1", "Pot 2 "};
+
+Serial pc(USBTX, USBRX);
 DigitalIn evenNum1(p15);
 DigitalIn evenNum2(p16);
+AnalogIn evenAnn1(p19);
+AnalogIn evenAnn2(p20);
 
-void even1_thread(void const *args)
+struct Event
+{
+       short type;
+       int time;
+};
+
+typedef Event Event_t;
+
+Queue<Event_t, 16> eventQueue;
+
+Mutex queue_mutex; 
+
+void RTC_Init()
+{
+     set_time(1391097600);  // Set RTC time to Thursday, 30 Jan 2014 16:00:00   
+}
+
+short Average(short values[5])
+{
+    return ((values[0] + values[1] + values[2] + values[3] + values[4]) /5);
+}
+
+void samplingNum(void const *n)
 {
-    while (true) 
+    static bool stateChanged[2] = {false, false};
+    static bool value[2] = {1, 1};
+    
+    stateChanged[0] = (value[0] != evenNum1.read());
+    stateChanged[1] = (value[1] != evenNum2.read());
+    
+    if((stateChanged[0] == true) || (stateChanged[1] == true))
     {
+        wait_ms(50);
+        stateChanged[0] = (value[0] != evenNum1.read());
+        stateChanged[1] = (value[1] != evenNum2.read());
+        
+        if(stateChanged[0])
+        {
+            Event_t *event1 = new Event_t();
+            event1->type = SWITCH_1;
+            event1->time = time(NULL);
+            queue_mutex.lock();
+            eventQueue.put(event1);
+            queue_mutex.unlock();
+            value[0] = !value[0];
+        }
+        if(stateChanged[1])
+        {
+            Event_t *event2 = new Event_t();
+            event2->type = SWITCH_2;
+            event2->time = time(NULL);
+            queue_mutex.lock();
+            eventQueue.put(event2);
+            queue_mutex.unlock();
+            value[1] = !value[1];
+        }
     }
 }
 
-void even2_thread(void const *args)
-{
-    while (true) 
-    {
-    }
-}
-
-void even3_thread(void const *args)
+void samplingAnn(void const *n)
 {
-    while (true) 
+    static short tabPot1[5] = {0, 0, 0, 0, 0};
+    static short tabPot2[5] = {0, 0, 0, 0, 0};
+    static short currentValue[2] = {0, 0};
+    short avg[2]= {0, 0};
+    static short tabPtr = 0;
+    static bool ready = false;
+    
+    currentValue[0] = evenAnn1.read() * 1000;
+    avg[0] = Average(tabPot1);
+    
+    currentValue[1] = evenAnn2.read() * 1000;
+    avg[1] = Average(tabPot2);
+            
+    if(ready)
     {
+        if((currentValue[0] < (avg[0] - ANN_THRESOLD)) || (currentValue[0] > (avg[0] + ANN_THRESOLD)))
+        {
+            Event_t *event1 = new Event_t();
+            event1->type = POT_1;
+            event1->time = time(NULL);
+            queue_mutex.lock();
+            eventQueue.put(event1);
+            queue_mutex.unlock();
+        }
+        
+        if((currentValue[1] < (avg[1] - ANN_THRESOLD)) || (currentValue[1] > (avg[1] + ANN_THRESOLD)))
+        {
+            Event_t *event2 = new Event_t();
+            event2->type = POT_2;
+            event2->time = time(NULL);
+            queue_mutex.lock();
+            eventQueue.put(event2);
+            queue_mutex.unlock();
+        }
     }
-}
-
-void even4_thread(void const *args)
-{
-    while (true) 
+    
+    tabPot1[tabPtr] = currentValue[0];
+    tabPot2[tabPtr] = currentValue[1];
+    
+    tabPtr++;
+    if(tabPtr == 5)
     {
+        tabPtr = 0;
+        ready = true;
     }
 }
 
 
+void NumEvent_thread(void const *args)
+{
+    RtosTimer samplingTimer(samplingNum, osTimerPeriodic, (void *)0);
+    samplingTimer.start(NUM_DELAY);
+    while (true){}
+}
 
-int main() {
-Thread thread1(even1_thread);
-Thread thread2(even2_thread);
-Thread thread3(even3_thread);
-Thread thread4(even4_thread);
-while (true) {
-             }
- }
\ No newline at end of file
+void AnnEvent_thread(void const *args)
+{
+    RtosTimer samplingTimer(samplingAnn, osTimerPeriodic, (void *)0);
+    samplingTimer.start(ANN_DELAY);
+    while (true){}
+}
+
+void Collector_thread(void const *args)
+{    
+    Event_t *event;
+    osEvent evt;
+    
+    while(true)
+    {
+        evt = eventQueue.get();
+        if (evt.status == osEventMessage) 
+        {
+            event = (Event_t*)evt.value.p;
+        }
+        pc.printf("Event Type = %s    Time = %d \n\r", eventType[event->type], event->time);
+        
+        delete event;   
+    }
+}
+
+int main() 
+{
+    RTC_Init();
+    Thread thread1(NumEvent_thread);
+    Thread thread2(AnnEvent_thread);
+    Thread thread3(Collector_thread);
+    
+    /*
+    thread1.set_priority(osPriorityRealtime);
+    thread2.set_priority(osPriorityRealtime);
+    thread3.set_priority(osPriorityNormal);
+    */
+    
+    while (true){} 
+ }
+ 
\ No newline at end of file