
uses Rtostimer separate threads check for reset
Dependencies: TextLCD mbed-rtos mbed
Revision 0:486f8caec6c8, committed 2014-10-07
- Comitter:
- jfields
- Date:
- Tue Oct 07 21:15:30 2014 +0000
- Commit message:
- working version of threaded timer
Changed in this revision
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