RTOS timer usage

Dependencies:   mbed-rtos mbed

Revision:
0:95dae97a932f
Child:
1:10da8ca3d1cd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Feb 23 13:34:02 2016 +0000
@@ -0,0 +1,56 @@
+/** 10_rtos_queue
+ *
+ * Simple example to use a Queue object to send integer data
+ * from thread1 to thread2. Note that Queue's put() method is
+ * intended to send a pointer, therefore typecasting
+ * should be appliedin in order to avoid compiler error messages.
+ */
+
+#include "mbed.h"
+#include "rtos.h"
+
+AnalogIn potmeter(A0);
+PwmOut myled(LED_BLUE);
+
+typedef uint32_t message_t;
+Queue<message_t, 16> queue;
+
+void led_thread(void const *argument)
+{
+    myled.period_us(16384);                                       //Set period to 16.384 ms
+    myled.pulsewidth_us(8192);                                    //Initialize to 50% duty cycle
+    while (true) {
+        osEvent evt = queue.get();                                //Wait for a message
+        switch(evt.status) {
+            case osOK:
+                printf("osOK\n");                                 //no error, no message arrived
+                break;
+            case osEventMessage:
+                printf("osEventMessage = %#05x\n",evt.value.v);  //message arrived
+                //Note that evt.value is a union.
+                //Read as value.v to get a data, or value.p to get a pointer...
+                myled.pulsewidth_us((int)(evt.value.v>>2));      //roughly 0..16 ms
+                break;
+            case osEventTimeout:
+                printf("osEventTimeout\n");                      //timeout occurred
+                break;
+            case osErrorParameter:
+                printf("osErrorParameter\n");
+                break;                                           //invalid parameter or is out of range.
+            default:
+                printf("Unknown error flag: %#08x\n",(uint32_t)evt.status);
+                break;
+        };
+    }
+}
+
+int main (void)
+{
+    Thread thread2(led_thread);
+
+    while (true) {
+        Thread::wait(1000);
+        uint16_t raw = potmeter.read_u16();                     // read raw 16-bit data
+        queue.put((message_t*)raw);
+    }
+}