CIS541 Xueli Jon / Mbed 2 deprecated myStopwatch_threads

Dependencies:   TextLCD mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 #include "TextLCD.h"
00004 
00005 #define RUN 0x1 
00006 #define STOP 0x0
00007 
00008 TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
00009 Serial pc (USBTX, USBRX);
00010 DigitalOut myled(LED1);
00011 
00012  
00013 
00014 // global vars 
00015 int mm [] = {0, 0};
00016 int ss [] = {0, 0};
00017 int MM [] = {0, 0};
00018 int mm_stop [] = {0, 0};
00019 int ss_stop [] = {0, 0};
00020 int MM_stop [] = {0, 0};
00021 
00022 int run_status = STOP;
00023 
00024 // functions
00025 void update_display(void const *args);
00026 void update_mm(void const *args);
00027 void update_ss(void const *args);
00028 void update_MM(void const *args);
00029 
00030 int main() {
00031     
00032     Thread thread_display(update_display);
00033     Thread thread_mm(update_mm);
00034     Thread thread_ss(update_ss);
00035     Thread thread_MM(update_MM);
00036     char input = 'z';
00037 
00038     while(1) {
00039         if ( input == 's') { 
00040             if (run_status==STOP) {
00041                 run_status = RUN;
00042                 thread_mm.signal_set(RUN);
00043                 thread_ss.signal_set(RUN);
00044                 thread_MM.signal_set(RUN);
00045                 thread_display.signal_set(RUN);
00046 
00047             }
00048         }
00049         if ( input == 'p') {
00050             if (run_status==RUN) {
00051                 run_status = STOP;
00052             }
00053         }
00054         if ( input == 'r') {
00055             if (run_status == STOP) {
00056                 mm[0] = mm[1] = 0;
00057                 ss[0] = ss[1] = 0;
00058                 MM[0] = MM[1] = 0;
00059                 mm_stop[0] = mm_stop[1] = 0;
00060                 ss_stop[0] = ss_stop[1] = 0;
00061                 MM_stop[0] = MM_stop[1] = 0;
00062                 thread_display.signal_set(RUN);
00063             }
00064         }
00065         
00066         input = pc.getc();
00067     }
00068 
00069 }
00070 
00071 void update_display(void const *args) {
00072     while (1) {
00073         lcd.printf("%d%d:%d%d:%d%d\n\n", MM[1], MM[0],ss[1],ss[0],mm[1],mm[0]);
00074         Thread::signal_wait(RUN);
00075         while (run_status) {        
00076             lcd.printf("%d%d:%d%d:%d%d\n\n", MM[1], MM[0],ss[1],ss[0],mm[1],mm[0]);
00077             Thread::wait(10);
00078         }
00079     }
00080 }
00081 
00082 void update_mm(void const *args) {
00083     while(1){
00084         Thread::signal_wait(RUN);
00085         Thread::wait(10-mm_stop[0]);
00086         mm[0]++;
00087         if (mm[0] >= 10) {
00088             mm[0] = 0;
00089             mm[1]++;
00090         }
00091         if (mm[1] >= 10) {
00092             mm[0] = 0;
00093             mm[1] = 0;
00094         }   
00095         while (run_status) {
00096             Thread::wait(10);
00097             mm[0]++;
00098             if (mm[0] >= 10) {
00099                 mm[0] = 0;
00100                 mm[1]++;
00101             }
00102             if (mm[1] >= 10) {
00103                 mm[0] = 0;
00104                 mm[1] = 0;
00105             }   
00106         }
00107         mm_stop[1] = mm[1];
00108         mm_stop[0] = mm[0];
00109     }
00110 }
00111 
00112 void update_ss(void const *args) {
00113      while(1) {
00114         Thread::signal_wait(RUN);
00115         Thread::wait(1000-100*mm_stop[1]-10*mm_stop[0]);
00116         ss[0]++;
00117         if (ss[0] >= 10) {
00118             ss[0] = 0;
00119             ss[1]++;
00120         }
00121         if (ss[1] >= 6) {
00122             ss[0] = 0;
00123             ss[1] = 0;
00124         }
00125         while (run_status) {
00126             Thread::wait(1000);
00127             ss[0]++;
00128             if (ss[0] >= 10) {
00129                 ss[0] = 0;
00130                 ss[1]++;
00131             }
00132             if (ss[1] >= 6) {
00133                 ss[0] = 0;
00134                 ss[1] = 0;
00135             }
00136         }
00137         ss_stop[1] = ss[1];
00138         ss_stop[0] = ss[0];
00139     }
00140 }
00141 
00142 void update_MM(void const *args) {
00143      while(1) {
00144         Thread::signal_wait(RUN);
00145         Thread::wait(60000-10000*ss_stop[1]-1000*ss_stop[0]-100*mm_stop[1]-10*mm_stop[0]);
00146         MM[0]++;
00147         if (MM[0] >= 10) {
00148             MM[0] = 0;
00149             MM[1]++;
00150         }
00151         if (MM[1] >= 6) {
00152             MM[0] = 0;
00153             MM[1] = 0;
00154         }
00155         while (run_status) {
00156             Thread::wait(60000);
00157             MM[0]++;
00158             if (MM[0] >= 10) {
00159                 MM[0] = 0;
00160                 MM[1]++;
00161             }
00162             if (MM[1] >= 6) {
00163                 MM[0] = 0;
00164                 MM[1] = 0;
00165             }
00166         }
00167         MM_stop[1] = MM[1];
00168         MM_stop[0] = MM[0];
00169     }
00170 }