uses Rtostimer separate threads check for reset

Dependencies:   TextLCD mbed-rtos mbed

Committer:
jfields
Date:
Tue Oct 07 21:15:30 2014 +0000
Revision:
0:486f8caec6c8
working version of threaded timer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jfields 0:486f8caec6c8 1 #include "mbed.h"
jfields 0:486f8caec6c8 2 #include "rtos.h"
jfields 0:486f8caec6c8 3 #include "TextLCD.h"
jfields 0:486f8caec6c8 4
jfields 0:486f8caec6c8 5 #define RUN 0x1
jfields 0:486f8caec6c8 6
jfields 0:486f8caec6c8 7 TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
jfields 0:486f8caec6c8 8 Serial pc (USBTX, USBRX);
jfields 0:486f8caec6c8 9 DigitalOut myled(LED1);
jfields 0:486f8caec6c8 10
jfields 0:486f8caec6c8 11 // mutexes
jfields 0:486f8caec6c8 12 Mutex mm_mutex; // protects mm[]
jfields 0:486f8caec6c8 13 Mutex ss_mutex; // protects ss[]
jfields 0:486f8caec6c8 14 Mutex MM_mutex; // protects MM[]
jfields 0:486f8caec6c8 15 Mutex input_mutex; // protects input
jfields 0:486f8caec6c8 16
jfields 0:486f8caec6c8 17 // global vars
jfields 0:486f8caec6c8 18 int mm [] = {0, 0}; // protected by mm_mutex
jfields 0:486f8caec6c8 19 int ss [] = {0, 0}; // protected by ss_mutex
jfields 0:486f8caec6c8 20 int MM [] = {0, 0}; // protected by MM_mutex
jfields 0:486f8caec6c8 21 int mm_wait = 10; // doesn't need mutex
jfields 0:486f8caec6c8 22 int ss_wait = 1000; // doesn't need mutex
jfields 0:486f8caec6c8 23 int MM_wait = 60000; // doesn't need mutex
jfields 0:486f8caec6c8 24 int run_status = 0; // doesn't need mutex
jfields 0:486f8caec6c8 25 char input = 'z'; // protected by input_mutex
jfields 0:486f8caec6c8 26 int need_reset_ss = 0;
jfields 0:486f8caec6c8 27 int need_reset_MM = 0;
jfields 0:486f8caec6c8 28
jfields 0:486f8caec6c8 29 // functions
jfields 0:486f8caec6c8 30 void update_display(void const *args);
jfields 0:486f8caec6c8 31 void update_mm(void const *args);
jfields 0:486f8caec6c8 32 void update_ss(void const *args);
jfields 0:486f8caec6c8 33 void update_MM(void const *args);
jfields 0:486f8caec6c8 34 void process_commands(void const *args);
jfields 0:486f8caec6c8 35 void ss_reset_func(void const *args);
jfields 0:486f8caec6c8 36 void MM_reset_func(void const *args);
jfields 0:486f8caec6c8 37 void disp0();
jfields 0:486f8caec6c8 38
jfields 0:486f8caec6c8 39 // init timer threads
jfields 0:486f8caec6c8 40 RtosTimer disp_thread(update_display, osTimerPeriodic);
jfields 0:486f8caec6c8 41 RtosTimer mm_thread(update_mm, osTimerPeriodic);
jfields 0:486f8caec6c8 42 RtosTimer ss_thread(update_ss, osTimerPeriodic);
jfields 0:486f8caec6c8 43 RtosTimer MM_thread(update_MM, osTimerPeriodic);
jfields 0:486f8caec6c8 44
jfields 0:486f8caec6c8 45 // init threads
jfields 0:486f8caec6c8 46 Thread ss_reset_thread(ss_reset_func);
jfields 0:486f8caec6c8 47 Thread MM_reset_thread(MM_reset_func);
jfields 0:486f8caec6c8 48 Thread cmds(process_commands); // listen for keyboard inputs
jfields 0:486f8caec6c8 49
jfields 0:486f8caec6c8 50 int main() {
jfields 0:486f8caec6c8 51
jfields 0:486f8caec6c8 52 // set initial time to 00:00:00
jfields 0:486f8caec6c8 53 disp0();
jfields 0:486f8caec6c8 54
jfields 0:486f8caec6c8 55 while (1) {
jfields 0:486f8caec6c8 56
jfields 0:486f8caec6c8 57 input_mutex.lock(); // lock input mutex
jfields 0:486f8caec6c8 58
jfields 0:486f8caec6c8 59 // start
jfields 0:486f8caec6c8 60 if (input == 's' && !run_status) {
jfields 0:486f8caec6c8 61 run_status = 1;
jfields 0:486f8caec6c8 62 disp_thread.start(10);
jfields 0:486f8caec6c8 63 mm_thread.start(mm_wait);
jfields 0:486f8caec6c8 64 ss_thread.start(ss_wait);
jfields 0:486f8caec6c8 65 MM_thread.start(MM_wait);
jfields 0:486f8caec6c8 66 }
jfields 0:486f8caec6c8 67
jfields 0:486f8caec6c8 68 // pause
jfields 0:486f8caec6c8 69 if (input == 'p' && run_status) {
jfields 0:486f8caec6c8 70 run_status = 0;
jfields 0:486f8caec6c8 71 disp_thread.stop();
jfields 0:486f8caec6c8 72 mm_thread.stop();
jfields 0:486f8caec6c8 73 ss_thread.stop();
jfields 0:486f8caec6c8 74 MM_thread.stop();
jfields 0:486f8caec6c8 75 ss_wait = ss_wait - 100*mm[1] - 10*mm[0];
jfields 0:486f8caec6c8 76 MM_wait = MM_wait - 10000*ss[1] - 1000*ss[0] - 100*mm[1] - 10*mm[0];
jfields 0:486f8caec6c8 77 need_reset_ss = 1;
jfields 0:486f8caec6c8 78 need_reset_MM = 1;
jfields 0:486f8caec6c8 79 }
jfields 0:486f8caec6c8 80
jfields 0:486f8caec6c8 81 // reset
jfields 0:486f8caec6c8 82 if (input == 'r' && !run_status) {
jfields 0:486f8caec6c8 83 for (int i=0;i<2;i++) {
jfields 0:486f8caec6c8 84 mm[i] = 0;
jfields 0:486f8caec6c8 85 ss[i] = 0;
jfields 0:486f8caec6c8 86 MM[i] = 0;
jfields 0:486f8caec6c8 87 }
jfields 0:486f8caec6c8 88 disp0();
jfields 0:486f8caec6c8 89 ss_wait = 1000;
jfields 0:486f8caec6c8 90 MM_wait = 60000;
jfields 0:486f8caec6c8 91 need_reset_ss = 0;
jfields 0:486f8caec6c8 92 need_reset_MM = 0;
jfields 0:486f8caec6c8 93 }
jfields 0:486f8caec6c8 94 input_mutex.unlock(); // unlock input mutex
jfields 0:486f8caec6c8 95 cmds.signal_set(RUN);
jfields 0:486f8caec6c8 96 }
jfields 0:486f8caec6c8 97 }
jfields 0:486f8caec6c8 98
jfields 0:486f8caec6c8 99 void disp0() {
jfields 0:486f8caec6c8 100 lcd.printf("%d%d:%d%d:%d%d\n\n", MM[1], MM[0],ss[1],ss[0],mm[1],mm[0]);
jfields 0:486f8caec6c8 101 }
jfields 0:486f8caec6c8 102
jfields 0:486f8caec6c8 103 void process_commands(void const *args) {
jfields 0:486f8caec6c8 104 while (1) {
jfields 0:486f8caec6c8 105 input_mutex.lock();
jfields 0:486f8caec6c8 106 input = pc.getc();
jfields 0:486f8caec6c8 107 input_mutex.unlock();
jfields 0:486f8caec6c8 108 Thread::signal_wait(RUN,osWaitForever);
jfields 0:486f8caec6c8 109 }
jfields 0:486f8caec6c8 110 }
jfields 0:486f8caec6c8 111
jfields 0:486f8caec6c8 112 void update_display(void const *args) {
jfields 0:486f8caec6c8 113
jfields 0:486f8caec6c8 114 mm_mutex.lock();
jfields 0:486f8caec6c8 115 ss_mutex.lock();
jfields 0:486f8caec6c8 116 MM_mutex.lock();
jfields 0:486f8caec6c8 117
jfields 0:486f8caec6c8 118 lcd.printf("%d%d:%d%d:%d%d\n\n", MM[1], MM[0],ss[1],ss[0],mm[1],mm[0]);
jfields 0:486f8caec6c8 119
jfields 0:486f8caec6c8 120 MM_mutex.unlock();
jfields 0:486f8caec6c8 121 ss_mutex.unlock();
jfields 0:486f8caec6c8 122 mm_mutex.unlock();
jfields 0:486f8caec6c8 123
jfields 0:486f8caec6c8 124 }
jfields 0:486f8caec6c8 125
jfields 0:486f8caec6c8 126 void update_mm(void const *args) {
jfields 0:486f8caec6c8 127
jfields 0:486f8caec6c8 128 mm_mutex.lock();
jfields 0:486f8caec6c8 129 mm[0]++;
jfields 0:486f8caec6c8 130 if (mm[0] > 9) {
jfields 0:486f8caec6c8 131 mm[0] = 0;
jfields 0:486f8caec6c8 132 mm[1]++;
jfields 0:486f8caec6c8 133 }
jfields 0:486f8caec6c8 134 if (mm[1] > 9) {
jfields 0:486f8caec6c8 135 mm[0] = 0;
jfields 0:486f8caec6c8 136 mm[1] = 0;
jfields 0:486f8caec6c8 137 }
jfields 0:486f8caec6c8 138 mm_mutex.unlock();
jfields 0:486f8caec6c8 139
jfields 0:486f8caec6c8 140 }
jfields 0:486f8caec6c8 141
jfields 0:486f8caec6c8 142 void update_ss(void const *args) {
jfields 0:486f8caec6c8 143
jfields 0:486f8caec6c8 144 ss_mutex.lock();
jfields 0:486f8caec6c8 145 ss[0]++;
jfields 0:486f8caec6c8 146 if (ss[0] > 9) {
jfields 0:486f8caec6c8 147 ss[0] = 0;
jfields 0:486f8caec6c8 148 ss[1]++;
jfields 0:486f8caec6c8 149 }
jfields 0:486f8caec6c8 150 if (ss[1] > 5) {
jfields 0:486f8caec6c8 151 ss[0] = 0;
jfields 0:486f8caec6c8 152 ss[1] = 0;
jfields 0:486f8caec6c8 153 }
jfields 0:486f8caec6c8 154 ss_mutex.unlock();
jfields 0:486f8caec6c8 155 if (need_reset_ss) ss_reset_thread.signal_set(RUN);
jfields 0:486f8caec6c8 156 }
jfields 0:486f8caec6c8 157
jfields 0:486f8caec6c8 158 void update_MM(void const *args) {
jfields 0:486f8caec6c8 159
jfields 0:486f8caec6c8 160 MM_mutex.lock();
jfields 0:486f8caec6c8 161 MM[0]++;
jfields 0:486f8caec6c8 162 if (MM[0] > 9) {
jfields 0:486f8caec6c8 163 MM[0] = 0;
jfields 0:486f8caec6c8 164 MM[1]++;
jfields 0:486f8caec6c8 165 }
jfields 0:486f8caec6c8 166 if (MM[1] > 5) {
jfields 0:486f8caec6c8 167 MM[0] = 0;
jfields 0:486f8caec6c8 168 MM[1] = 0;
jfields 0:486f8caec6c8 169 }
jfields 0:486f8caec6c8 170 MM_mutex.unlock();
jfields 0:486f8caec6c8 171 if (need_reset_MM) MM_reset_thread.signal_set(RUN);
jfields 0:486f8caec6c8 172 }
jfields 0:486f8caec6c8 173
jfields 0:486f8caec6c8 174 void ss_reset_func(void const *args) {
jfields 0:486f8caec6c8 175 Thread::signal_wait(RUN,osWaitForever);
jfields 0:486f8caec6c8 176 ss_thread.stop();
jfields 0:486f8caec6c8 177 need_reset_ss = 0;
jfields 0:486f8caec6c8 178 ss_wait = 10000;
jfields 0:486f8caec6c8 179 ss_thread.start(ss_wait);
jfields 0:486f8caec6c8 180 }
jfields 0:486f8caec6c8 181
jfields 0:486f8caec6c8 182 void MM_reset_func(void const *args) {
jfields 0:486f8caec6c8 183 Thread::signal_wait(RUN,osWaitForever);
jfields 0:486f8caec6c8 184 MM_thread.stop();
jfields 0:486f8caec6c8 185 need_reset_MM = 0;
jfields 0:486f8caec6c8 186 MM_wait = 60000;
jfields 0:486f8caec6c8 187 MM_thread.start(MM_wait);
jfields 0:486f8caec6c8 188 }