EventQueue break_dispatch test

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Revision:
67:b82d86fdf0ae
Parent:
29:0b58d21e87d6
Child:
68:3701a2e4ec3d
--- a/main.cpp	Thu May 10 05:15:08 2018 +0100
+++ b/main.cpp	Wed May 16 12:45:17 2018 +0000
@@ -1,12 +1,50 @@
 #include "mbed.h"
 
-DigitalOut led1(LED1);
+InterruptIn _BlueButton(USER_BUTTON);
+DigitalOut  _led1(LED1); 
+
+class myComp {
+public:
+
+Thread      _ISRthread;
+EventQueue  _ISRqueue;
+int         _cnt;
+ 
+void ThreadBodyFunc () {
+      printf ("ThreadBodyFunc tid: %x activated\n\r", (unsigned int)_ISRthread.gettid());
+    _led1 = !_led1;
+    _cnt++;
+}
+void start() {
+      printf ("starting tid: %x ...\n\r", (unsigned int)_ISRthread.gettid());   
+    _cnt=0;
+   _ISRthread.start(callback(&_ISRqueue, &EventQueue::dispatch_forever));   
+   _ISRthread.set_priority(osPriorityRealtime);   // after having called break_dispatch it FAILS with "Thread 00000000 error -4: Parameter error"
+   _BlueButton.fall(_ISRqueue.event(this, &myComp::ThreadBodyFunc )); 
+
+}
+void stop() {
+    printf ("Stopping ...\n\r");  
+   _cnt=0;    
+   _ISRqueue.break_dispatch();
+}
+};
 
 // main() runs in its own thread in the OS
+// pushing the BlueButton 4 times trigger the break_dispatch
+
 int main() {
-    while (true) {
-        led1 = !led1;
-        wait(0.5);
-    }
+ myComp comp;   
+    printf ("Main started\n\r");
+    comp.start(); 
+    
+    while (1) {
+         Thread::yield();
+         if (comp._cnt>3) {
+            comp.stop();
+            Thread::yield();
+            comp.start();     
+         }
+    }   
 }