uses Rtostimer separate threads check for reset

Dependencies:   TextLCD mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
jfields
Date:
Tue Oct 07 21:15:30 2014 +0000
Commit message:
working version of threaded timer

Changed in this revision

TextLCD.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-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 486f8caec6c8 TextLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Tue Oct 07 21:15:30 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#308d188a2d3a
diff -r 000000000000 -r 486f8caec6c8 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Oct 07 21:15:30 2014 +0000
@@ -0,0 +1,188 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "TextLCD.h"
+
+#define RUN 0x1 
+
+TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
+Serial pc (USBTX, USBRX);
+DigitalOut myled(LED1);
+
+// mutexes
+Mutex mm_mutex;         // protects mm[]
+Mutex ss_mutex;         // protects ss[]
+Mutex MM_mutex;         // protects MM[]
+Mutex input_mutex;      // protects input
+
+// global vars
+int mm [] = {0, 0};         // protected by mm_mutex
+int ss [] = {0, 0};         // protected by ss_mutex
+int MM [] = {0, 0};         // protected by MM_mutex
+int mm_wait = 10;           // doesn't need mutex
+int ss_wait = 1000;         // doesn't need mutex
+int MM_wait = 60000;        // doesn't need mutex
+int run_status = 0;         // doesn't need mutex
+char input = 'z';           // protected by input_mutex
+int need_reset_ss = 0;
+int need_reset_MM = 0;
+
+// functions
+void update_display(void const *args);
+void update_mm(void const *args);
+void update_ss(void const *args);
+void update_MM(void const *args);
+void process_commands(void const *args);
+void ss_reset_func(void const *args);
+void MM_reset_func(void const *args);
+void disp0();
+
+// init timer threads
+RtosTimer disp_thread(update_display, osTimerPeriodic);
+RtosTimer mm_thread(update_mm, osTimerPeriodic);
+RtosTimer ss_thread(update_ss, osTimerPeriodic);
+RtosTimer MM_thread(update_MM, osTimerPeriodic);
+
+// init threads
+Thread ss_reset_thread(ss_reset_func);
+Thread MM_reset_thread(MM_reset_func);
+Thread cmds(process_commands);              // listen for keyboard inputs
+
+int main() {
+    
+    // set initial time to 00:00:00
+    disp0();    
+    
+    while (1) {
+        
+        input_mutex.lock(); // lock input mutex
+        
+        // start
+        if (input == 's' && !run_status) {
+            run_status = 1;
+            disp_thread.start(10);
+            mm_thread.start(mm_wait);
+            ss_thread.start(ss_wait);
+            MM_thread.start(MM_wait);
+        }
+        
+        // pause
+        if (input == 'p' && run_status) {
+            run_status = 0;
+            disp_thread.stop();
+            mm_thread.stop();
+            ss_thread.stop();
+            MM_thread.stop();
+            ss_wait = ss_wait - 100*mm[1] - 10*mm[0];
+            MM_wait = MM_wait - 10000*ss[1] - 1000*ss[0] - 100*mm[1] - 10*mm[0];
+            need_reset_ss = 1;
+            need_reset_MM = 1;
+        }
+        
+        // reset
+        if (input == 'r' && !run_status) {
+            for (int i=0;i<2;i++) {
+                mm[i] = 0;
+                ss[i] = 0;
+                MM[i] = 0;
+            }
+            disp0();
+            ss_wait = 1000;
+            MM_wait = 60000;
+            need_reset_ss = 0;
+            need_reset_MM = 0;
+        }
+        input_mutex.unlock(); // unlock input mutex
+        cmds.signal_set(RUN);
+    }
+}
+
+void disp0() {
+    lcd.printf("%d%d:%d%d:%d%d\n\n", MM[1], MM[0],ss[1],ss[0],mm[1],mm[0]);
+}
+
+void process_commands(void const *args) {
+    while (1) {
+        input_mutex.lock();
+        input = pc.getc();
+        input_mutex.unlock();
+        Thread::signal_wait(RUN,osWaitForever);
+    }
+}
+
+void update_display(void const *args) {
+    
+    mm_mutex.lock();
+    ss_mutex.lock();
+    MM_mutex.lock();
+    
+    lcd.printf("%d%d:%d%d:%d%d\n\n", MM[1], MM[0],ss[1],ss[0],mm[1],mm[0]);
+    
+    MM_mutex.unlock();
+    ss_mutex.unlock();
+    mm_mutex.unlock();
+
+}
+
+void update_mm(void const *args) {
+    
+    mm_mutex.lock();
+    mm[0]++;
+    if (mm[0] > 9) {
+        mm[0] = 0;
+        mm[1]++;
+    }
+    if (mm[1] > 9) {
+        mm[0] = 0;
+        mm[1] = 0;
+    }
+    mm_mutex.unlock();
+    
+}
+
+void update_ss(void const *args) {
+    
+    ss_mutex.lock();
+    ss[0]++;
+    if (ss[0] > 9) {
+        ss[0] = 0;
+        ss[1]++;
+    }
+    if (ss[1] > 5) {
+        ss[0] = 0;
+        ss[1] = 0;
+    }
+    ss_mutex.unlock();
+    if (need_reset_ss) ss_reset_thread.signal_set(RUN);
+}
+
+void update_MM(void const *args) {
+
+    MM_mutex.lock();
+    MM[0]++;
+    if (MM[0] > 9) {
+        MM[0] = 0;
+        MM[1]++;
+    }
+    if (MM[1] > 5) {
+        MM[0] = 0;
+        MM[1] = 0;
+    }
+    MM_mutex.unlock();
+    if (need_reset_MM) MM_reset_thread.signal_set(RUN);
+}
+
+void ss_reset_func(void const *args) {
+    Thread::signal_wait(RUN,osWaitForever);
+    ss_thread.stop();
+    need_reset_ss = 0;
+    ss_wait = 10000;
+    ss_thread.start(ss_wait);
+}    
+
+void MM_reset_func(void const *args) {
+    Thread::signal_wait(RUN,osWaitForever);
+    MM_thread.stop();
+    need_reset_MM = 0;
+    MM_wait = 60000;
+    MM_thread.start(MM_wait);
+}    
diff -r 000000000000 -r 486f8caec6c8 mbed-rtos.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Tue Oct 07 21:15:30 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#631c0f1008c3
diff -r 000000000000 -r 486f8caec6c8 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Oct 07 21:15:30 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/552587b429a1
\ No newline at end of file