single global timer

Dependencies:   TextLCD mbed-rtos mbed

Fork of pacemaker_v8 by Pacemaker

Files at this revision

API Documentation at this revision

Comitter:
jfields
Date:
Thu Dec 04 03:03:56 2014 +0000
Parent:
3:c60266d9ce0b
Commit message:
single global timer

Changed in this revision

constants.h 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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/constants.h	Thu Dec 04 03:03:56 2014 +0000
@@ -0,0 +1,72 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "TextLCD.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define RUN 0x1
+
+TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
+Serial pc (USBTX, USBRX);
+
+// ports
+DigitalIn VGet(p11);
+DigitalIn AGet(p12);
+DigitalOut VPace(p13);
+DigitalOut APace(p14);
+PwmOut speaker(p21);
+
+// LEDs
+DigitalOut leds[] = {LED1, LED2, LED3, LED4};
+// 1 = VP
+// 2 = AP
+// 3 = VS
+// 4 = AS
+
+// input stuff
+char input;
+
+// heart rate global vars
+int HR = 0;
+int beats = 0;
+int sampleRate = 10000; // default 10 seconds
+int firstSample = 1;
+int Omode = 0;
+
+// Normal Values
+const int N_PVARP = 325;    // ms
+const int N_VRP   = 300;    // ms
+const int N_LRI   = 857;    // ms (= about 70ppm)
+const int N_AVI   = 65;     // ms
+const int N_UB    = 100;    // 100ppm
+const int N_LB    = 40;     // 40ppm
+
+// Exercise Values
+const int E_PVARP = 175;    // ms
+const int E_VRP   = 150;    // ms
+const int E_LRI   = 428;    // ms (= about 140ppm)
+const int E_AVI   = 30;     // ms
+const int E_UB    = 175;    // 175ppm
+const int E_LB    = 100;    // 100ppm
+
+// Sleep Values
+const int S_PVARP = 500;    // ms
+const int S_VRP   = 475;    // ms
+const int S_LRI   = 1333;   // ms (= about 45ppm)
+const int S_AVI   = 100;    // ms
+const int S_UB    = 60;     // 60ppm
+const int S_LB    = 30;     // 30ppm
+
+// Heart Values - Normal Mode is default
+int PVARP = N_PVARP;
+int VRP = N_VRP;
+int LRI = N_LRI;
+int AVI = N_AVI;
+int UB = N_UB;
+int LB = N_LB;
+
+// status flags
+int isVRP = 0;
+int isPVARP = 0;
+int inManual = 0;
+
--- a/main.cpp	Thu Dec 04 01:02:18 2014 +0000
+++ b/main.cpp	Thu Dec 04 03:03:56 2014 +0000
@@ -1,83 +1,15 @@
-#include "mbed.h"
-#include "rtos.h"
-#include "TextLCD.h"
-#include <stdio.h>
-#include <stdlib.h>
-
-#define RUN 0x1
-
-TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
-Serial pc (USBTX, USBRX);
+#include "constants.h"
 
-// ports
-DigitalIn VGet(p11);
-DigitalIn AGet(p12);
-DigitalOut VPace(p13);
-DigitalOut APace(p14);
-
-// LEDs
-DigitalOut leds[] = {LED1, LED2, LED3, LED4};
-// 1 = VP
-// 2 = AP
-// 3 = VS
-// 4 = AS
 
 // global clocks
-Timer ta;   // time since a event
-Timer tv;   // time since v event
+Timer t;   // global time
+int waitingForV = 1;
 
 // mutexes
-Mutex t_mutex;          // protect reading of ta, tv
 Mutex status_mutex;     // protect reading of
 Mutex input_mutex;      // protects reading input
-
-// input stuff
-char input;
-
-// heart rate global vars
-int HR = 0;
-int beats = 0;
-int sampleRate = 10000; // default 10 seconds
-int firstSample = 1;
-int Omode = 0;
-
-// Normal Values
-const int N_PVARP = 325;    // ms
-const int N_VRP   = 300;    // ms
-const int N_LRI   = 857;    // ms (= about 70ppm)
-const int N_AVI   = 65;     // ms
-const int N_UB    = 100;    // 100ppm
-const int N_LB    = 40;     // 40ppm
-
-// Exercise Values
-const int E_PVARP = 175;    // ms
-const int E_VRP   = 150;    // ms
-const int E_LRI   = 428;    // ms (= about 140ppm)
-const int E_AVI   = 30;     // ms
-const int E_UB    = 175;    // 175ppm
-const int E_LB    = 100;    // 100ppm
-
-// Sleep Values
-const int S_PVARP = 500;    // ms
-const int S_VRP   = 475;    // ms
-const int S_LRI   = 1333;   // ms (= about 45ppm)
-const int S_AVI   = 100;    // ms
-const int S_UB    = 60;     // 60ppm
-const int S_LB    = 30;     // 30ppm
-
-// Heart Values - Normal Mode is default
-int PVARP = N_PVARP;
-int VRP = N_VRP;
-int LRI = N_LRI;
-int AVI = N_AVI;
-int UB = N_UB;
-int LB = N_LB;
-
-// status flags
-int isVRP = 0;
-int isPVARP = 0;
-int waitingForV = 1;
-int inManual = 0;
+Mutex man_mutex;        // protects manual
+Mutex state_mutex;      // protects waitingForV
 
 // functions
 void A_func(void const *args);
@@ -91,6 +23,7 @@
 void makeManual();
 void blind();
 void get_listener(void const *args);
+void updateSR();
 
 // threads
 Thread * A_thread;
@@ -107,9 +40,7 @@
 int main() {
     
     // start global timer
-    tv.start();
-    ta.start();
-    tv.stop();
+    t.start();
     
     // init threads
     disp_thread = new Thread(disp);
@@ -135,49 +66,60 @@
 
 void A_func(void const *args) {
     while (1) {
+        man_mutex.lock();
         if (!inManual) {
-            while (tv.read_ms() <= (LRI-AVI)) {
-                t_mutex.unlock();
-                if (AGet==1 && !isPVARP && !waitingForV) {
-                    tv.reset();
-                    tv.stop();
-                    ta.start();
+            
+            state_mutex.lock();
+            if (!waitingForV) {
+            
+                if (t.read_ms() >= LRI-AVI) {
+                    t.reset();
+                    waitingForV = 1;
+                    APace = 1;
+                    Thread::wait(2);
+                    APace = 0;
+                    flashLED(2);
+                }
+                if (AGet == 1 && !isPVARP) {
+                    t.reset();
                     waitingForV = 1;
                     flashLED(4);
-                    while (AGet == 1);
                 }
-                t_mutex.lock();
+
             }
-            APace = 1;
-            Thread::wait(2);
-            APace = 0;
-            tv.reset();
-            tv.stop();
-            ta.start();
-            waitingForV = 1;
-            flashLED(2);
+            state_mutex.unlock();
         }
+        man_mutex.unlock();
     }
 }
 
 void V_func(void const *args) {
     while (1) {
+        man_mutex.lock();
         if (!inManual) {
-            while (ta.read_ms() <= AVI) {
-                t_mutex.unlock();
-                if (VGet==1 && !isVRP && waitingForV) {
+            
+            state_mutex.lock();
+            if (waitingForV) {
+            
+                if (t.read_ms() >= AVI) {
+                    t.reset();
+                    VPace = 1;
+                    Thread::wait(2);
+                    VPace = 0;
+                    blind();
+                    flashLED(1);
+                }
+                if (VGet == 1 && !isVRP) {
+                    t.reset();
                     blind();
                     flashLED(3);
-                    while (VGet == 1);
                 }
-                t_mutex.lock();
+
+                
             }
-            VPace = 1;
-            Thread::wait(2);
-            VPace = 0;
-            blind();
-            flashLED(1);
+            state_mutex.unlock();
         }
+        man_mutex.unlock();
     }
 }
 
@@ -193,22 +135,33 @@
             lcd.printf("Enter\n\n");
             Omode = 1;
             input = pc.getc();
-            if (input == '1') sampleRate = 10000;
-            if (input == '2') sampleRate = 20000;
-            if (input == '3') sampleRate = 30000;
-            if (input == '4') sampleRate = 60000;
-            if (input == '5') sampleRate = 100000;
-            beats = 0;
-            HR = 0;
-            Omode = 0;
-            firstSample = 1;
-            disp_thread->signal_set(RUN);
+            if (input == '1') {
+                sampleRate = 10000;
+                updateSR();
+            }
+            if (input == '2') {
+                sampleRate = 20000;
+                updateSR();
+            }
+            if (input == '3') {
+                sampleRate = 30000;
+                updateSR();
+            }
+            if (input == '4') {
+                sampleRate = 60000;
+                updateSR();
+            }
+            if (input == '5') {
+                sampleRate = 100000;
+                updateSR();
+            }
         }
         input_mutex.unlock();
     }
 }
 
 void calcHR(void const *args) {
+    status_mutex.lock();
     if (firstSample == 1) {
         HR = beats*(60000/sampleRate);
         firstSample = 0;
@@ -216,22 +169,26 @@
     else {
         HR = (beats*60000/sampleRate+HR)/2;
     }
+    if (HR>=UB || HR<=LB) {
+        speaker.period(1.0/500.0); // 500hz period
+        speaker =0.5;
+    }
+    else {
+        speaker=0.0;
+    }
+    status_mutex.unlock();
     disp_thread->signal_set(RUN);
-    
-    if (HR>=UB || HR<=LB) {
-        
-    }
-    
-    
 }
 
 void disp(void const *args) {
     while (1) {
         Thread::signal_wait(RUN,osWaitForever);
+        status_mutex.lock();
         if (!Omode) {
             lcd.printf("HR = %d ppm\nCycle = %d s\n",HR,sampleRate/1000);
         }
         beats = 0;
+        status_mutex.unlock();
     }
 }
 
@@ -249,23 +206,20 @@
 }
 
 void blind() {
-    tv.start();
-    ta.reset();
-    ta.stop();
+    status_mutex.lock();
     isVRP = 1;
     isPVARP = 1;
     waitingForV = 0;
     VRP_timer->start(VRP);
     PVARP_timer->start(PVARP);
     beats++;
+    status_mutex.unlock();
 }
 
 void makeManual() {
+    man_mutex.lock();
     inManual = 1;
-    ta.reset();
-    ta.stop();
-    tv.reset();
-    tv.stop();
+    man_mutex.unlock();
     UB = 175;
     LB = 30;
     int done = 0;
@@ -299,24 +253,34 @@
             lcd.printf("Enter\n\n");
             Omode = 1;
             input = pc.getc();
-            if (input == '1') sampleRate = 10000;
-            if (input == '2') sampleRate = 20000;
-            if (input == '3') sampleRate = 30000;
-            if (input == '4') sampleRate = 60000;
-            if (input == '5') sampleRate = 100000;
-            beats = 0;
-            HR = 0;
-            Omode = 0;
-            firstSample = 1;
-            disp_thread->signal_set(RUN);
-
+            if (input == '1') {
+                sampleRate = 10000;
+                updateSR();
+            }
+            if (input == '2') {
+                sampleRate = 20000;
+                updateSR();
+            }
+            if (input == '3') {
+                sampleRate = 30000;
+                updateSR();
+            }
+            if (input == '4') {
+                sampleRate = 60000;
+                updateSR();
+            }
+            if (input == '5') {
+                sampleRate = 100000;
+                updateSR();
+            }
         }
     }
-    tv.start();
     waitingForV = 1;
     VRP_timer->stop();
     PVARP_timer->stop();
+    man_mutex.lock();
     inManual = 0;
+    man_mutex.unlock();
 }
 
 void get_listener(void const *args) {
@@ -361,9 +325,19 @@
     }
 }
 
+void updateSR() {
+    status_mutex.lock();
+    beats = 0;
+    HR = 0;
+    Omode = 0;
+    firstSample = 1;
+    HR_timer->stop();
+    HR_timer->start(sampleRate);
+    status_mutex.unlock();
+    disp_thread->signal_set(RUN);
+}
 
 
 
 
 
-