Phil Perilstein / Mbed 2 deprecated pm_pacemaker

Dependencies:   TextLCD mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
haphilip
Date:
Thu Dec 01 03:28:38 2016 +0000
Commit message:
Almost done!

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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Thu Dec 01 03:28:38 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#308d188a2d3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Dec 01 03:28:38 2016 +0000
@@ -0,0 +1,404 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "TextLCD.h"
+
+InterruptIn vsignal(p7);
+InterruptIn asignal(p8);
+DigitalOut Vpace(p5);
+DigitalOut Apace(p6);
+
+DigitalOut asense_led(LED1);
+DigitalOut vsense_led(LED2);
+DigitalOut apace_led(LED3);
+DigitalOut vpace_led(LED4);
+
+Thread *pacemodeThread;
+
+osThreadId signalTid;
+osThreadId senseTid;
+osThreadId displayTid;
+
+TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
+Serial pc(USBTX, USBRX);
+RawSerial pc2(USBTX, USBRX);
+
+Timer vClock;
+Timer aClock;               //PaceSignal model
+
+RtosTimer *apace_timer;
+RtosTimer *vpace_timer;
+
+double LRI = 1000;
+double URI = 700;
+double VRP = 200;                // V noise interval
+double ARP = 50;                // A noise interval
+double AVI = 150;          // A-V max interval
+double PVARP = 300;      // V-A max interval
+double ratio;
+int wait_period = 10;       // 3a requirement in miliseconds
+
+int upperBound; //for mode changes
+int lowerBound; //for mode changes
+
+int observation_interval = 10; // In seconds
+int heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval
+
+int isChangingObsInt = 0;
+char key = 'n';
+char newObsInt[8];
+int manual_mode = 0;
+char mode = 'n';
+
+
+
+void initialize_intervals()
+{
+    LRI = 1000;
+    URI = 700;
+    VRP = 200;
+    ARP = 50;
+    AVI = 150;
+    PVARP = 300;
+}
+
+
+// Function to toggle the LEDs 1,2,3,4
+void toggleLed(int led)
+{
+    switch (led) {
+        case (1):
+            asense_led = 1;
+            Thread::wait(wait_period);
+            asense_led = 0;
+            break;
+        case (2):
+            vsense_led = 1;
+            Thread::wait(wait_period);
+            vsense_led = 0;
+            break;
+        case (3):
+            apace_led = 1;
+            Thread::wait(wait_period);
+            apace_led = 0;
+            break;
+        case (4):
+            vpace_led = 1;
+            Thread::wait(wait_period);
+            vpace_led = 0;
+            break;
+    }
+}
+
+void displayThread(void const *args)
+{
+    while (1) {
+        Thread::wait(observation_interval * 1000);
+        lcd.cls();
+        int hr = (heart_beats*60) / (observation_interval);
+        lcd.printf("%s%d%s","HR: ", hr, " bpm");
+
+        switch(mode) {
+            case('n'):
+                if (hr > 100) {
+                    lcd.printf("%s", "\nALARM HIGH");
+                } else if (hr < 40) {
+                    lcd.printf("%s", "\nALARM LOW");
+                }
+                break;
+            case('e'):
+                if (hr > 175) {
+                    lcd.printf("%s", "\nALARM HIGH");
+                } else if (hr < 100) {
+                    lcd.printf("%s", "\nALARM LOW");
+                }
+                break;
+            case('s'):
+                if (hr > 60) {
+                    lcd.printf("%s", "\nALARM HIGH");
+                } else if (hr < 30) {
+                    lcd.printf("%s", "\nALARM LOW");
+                }
+                break;
+            case('m'):
+                if (hr > 175) {
+                    lcd.printf("%s", "\nALARM HIGH");
+                } else if (hr < 30) {
+                    lcd.printf("%s", "\nALARM LOW");
+                }
+                break;
+        }
+
+        heart_beats = 0;
+    }
+}
+
+
+// Incoming a signal from the heart
+void asignal_irq()
+{
+    osSignalSet(signalTid, 0x1);
+}
+
+// Incoming v signal from the heart
+void vsignal_irq()
+{
+    osSignalSet(signalTid, 0x2);
+}
+
+
+// Timer-driven function to pace the Atria
+void a_pace(void const*)
+{
+    Apace = 1;
+    aClock.reset();
+    apace_timer->stop();
+    toggleLed(3);
+    Apace = 0;
+    osSignalSet(signalTid, 0x3);
+}
+
+// Timer-driven function to pace the ventricle
+void v_pace(void const*)
+{
+    Vpace = 1;
+    vClock.reset();
+    vpace_timer->start(LRI);
+    apace_timer->start(LRI-AVI);
+    toggleLed(4);
+    Vpace = 0;
+    osSignalSet(signalTid, 0x4);
+    heart_beats++;
+}
+
+
+
+void PaceSignal(void const *args)
+{
+    int pFlag1 = 0;
+    int pFlag2 = 0;
+    vClock.start();
+    aClock.start();
+    vpace_timer->start(LRI);
+    apace_timer->start(LRI-AVI);
+
+    while(1) {
+        while (!pFlag1) {
+            osEvent ext_signal = osSignalWait(0, osWaitForever);
+            int evt = ext_signal.value.signals;
+
+            //lcd.printf("%d",evt); // 4(Vpace), 3(Apace), 2(Vsignal), 1(Asignal)
+
+            if (evt == 0x1 && vClock.read_ms() >= PVARP) { //aSignal
+                osSignalSet(senseTid, 0x1);
+                //pc2.printf("%s%d%s","as ", vClock.read_ms(), "\n");
+                aClock.reset();
+                apace_timer->stop();
+                int interval = (vClock.read_ms() + AVI >= URI) ? AVI : URI - vClock.read_ms();
+                vpace_timer->start(interval);
+                pFlag1 = 1;
+            } else if(evt == 0x2 && vClock.read_ms() >= VRP) { //vSignal
+                osSignalSet(senseTid, 0x2);
+                //pc2.printf("%s%d%s","vs ", vClock.read_ms(), "\n");
+                vClock.reset();
+                vpace_timer->start(LRI);
+                apace_timer->start(LRI-AVI);
+            } else if (evt == 0x3) { //aPace
+                pFlag1 = 1;
+            }
+        }
+        pFlag1 = 0;
+
+        while(!pFlag2) {
+            osEvent ext_signal = osSignalWait(0, osWaitForever);
+            int evt = ext_signal.value.signals;
+
+            if (evt == 0x1 && aClock.read_ms() >= ARP) { //aSignal
+                osSignalSet(senseTid, 0x1);
+                //pc2.printf("%s%d%s","as ", vClock.read_ms(), "\n");
+                aClock.reset();
+            } else if(evt == 0x2) { //vSignal
+                osSignalSet(senseTid, 0x2);
+                //pc2.printf("%s%d%s","vs ", vClock.read_ms(), "\n");
+                vClock.reset();
+                apace_timer->start(LRI-AVI);
+                vpace_timer->start(LRI);
+                pFlag2 = 1;
+            } else if (evt == 0x4) { //vPace
+                pFlag2 = 1;
+            }
+        }
+        pFlag2 = 0;
+    }
+}
+
+
+void PaceSense(void const *args)
+{
+    int pFlag1 = 0;
+    int pFlag2 = 0;
+    while(1) {
+        while (!pFlag1) {
+            osEvent ext_signal = osSignalWait(0, osWaitForever);
+            int evt = ext_signal.value.signals;
+
+            //lcd.printf("%d",evt);
+
+            if (evt == 0x1) { //aSense
+                toggleLed(evt);
+                pFlag1 = 1;
+            } else if(evt == 0x2) { //vSense
+                toggleLed(evt);
+                heart_beats++;
+            } else if (evt == 0x3) { //aPace
+                pFlag1 = 1;
+            }
+
+        }
+        pFlag1 = 0;
+        while(!pFlag2) {
+            osEvent ext_signal = osSignalWait(0, osWaitForever);
+            int evt = ext_signal.value.signals;
+
+            //lcd.printf("%d",evt); // 4096, 256, 16, 1
+
+            if (evt == 0x1) { //aSense
+                toggleLed(evt);
+            } else if(evt == 0x2) { //vSignal
+                toggleLed(evt);
+                heart_beats++;
+                pFlag2 = 1;
+            } else if (evt == 0x4) { //vPace
+                pFlag2 = 1;
+            }
+        }
+        pFlag2 = 0;
+    }
+}
+
+osThreadDef(PaceSignal, osPriorityNormal, DEFAULT_STACK_SIZE);
+osThreadDef(PaceSense, osPriorityNormal, DEFAULT_STACK_SIZE);
+osThreadDef(displayThread, osPriorityNormal, DEFAULT_STACK_SIZE);
+
+int main()
+{
+    senseTid = osThreadCreate(osThread(PaceSense), NULL);
+    signalTid = osThreadCreate(osThread(PaceSignal), NULL);
+    displayTid = osThreadCreate(osThread(displayThread), NULL);
+
+    vsignal.rise(&vsignal_irq); //rising edge of timer
+    asignal.rise(&asignal_irq);
+
+    Callback<void()> apaceTimerTask((void*)NULL, (void (*)(void*))&a_pace);
+    Callback<void()> vpaceTimerTask((void*)NULL, (void (*)(void*))&v_pace);
+    apace_timer = new RtosTimer(apaceTimerTask);
+    vpace_timer = new RtosTimer(vpaceTimerTask);
+
+    lcd.cls();
+
+
+//    'n' for normal mode (default)
+//    's' for sleep mode
+//    'e' for exercise mode
+//    'm' for manual mode
+//    'o' to change the observation interval
+
+    key = 'n';
+
+    while(true) {
+        Thread::wait(100);
+        while(pc.readable()) {
+            key = pc.getc();
+            switch(key) {
+                    //pvarp = 0.3s
+                case('n'):
+                    mode = 'n';
+                    upperBound = 100; //beats per msecond
+                    lowerBound = 40; //beats per msecond
+                    lcd.printf("N");
+                    initialize_intervals();
+                    break;
+                case('s'):
+                    mode = 's';
+                    upperBound = 60; //beats per msecond
+                    lowerBound = 30; //beats per msecond v-v 0.5s
+                    lcd.printf("S");
+                    ratio = (60.00/100.00 + 30.00/40.00) / 2.00;
+                    initialize_intervals();
+                    LRI /= ratio;
+                    URI /= ratio;
+                    VRP /= ratio;
+                    ARP /= ratio;
+                    AVI /= ratio;
+                    PVARP /= ratio;
+//                    lcd.printf("%lf", LRI);
+                    break;
+                case('e'):
+                    mode = 'e';
+                    upperBound = 175; //beats per msecond
+                    lowerBound = 100; //beats per msecond
+                    lcd.printf("E");
+                    ratio = (175.00/100.00 + 100.00/40.00) / 2.00;
+                    initialize_intervals();
+                    LRI /= ratio;
+                    URI /= ratio;
+                    VRP /= ratio;
+                    ARP /= ratio;
+                    AVI /= ratio;
+                    PVARP /= ratio;
+//                    lcd.printf("%lf", LRI);
+                    break;
+                case('m'):
+                    mode = 'm';
+                    upperBound = 175; //beats per msecond
+                    lowerBound = 30; //beats per msecond
+                    lcd.printf("M");
+//                    LRI = 1000;
+//                    URI = 700;
+//                    PVARP = 300;
+                    manual_mode = 1;
+                    break;
+                case('o'):
+
+                    isChangingObsInt = 1;
+                    lcd.printf("O");
+                    break;
+            }
+///////manual pacing
+            if(manual_mode) {
+                key = pc.getc();
+                if(key == 'v') {
+                    v_pace(NULL);
+                } else if(key == 'a') {
+                    a_pace(NULL);
+                } else if(key == 'q') {
+                    manual_mode = 0;
+                }
+            }
+
+
+
+///////observation interval
+            int i = 0;
+            while(isChangingObsInt) {
+                // wait(1);
+                key = pc.getc();
+//                lcd.printf("0");
+                if(key != '\r' && (int)key > 47 && (int)key < 58) {
+                    //use atoi - asci to integer to convert input key to 0 - 10
+                    newObsInt[i] += key;
+                    i++;
+                    lcd.printf("1");
+                } else if(key == '\r') {
+                    newObsInt[i] = '\0';
+                    int obsint;
+                    sscanf(newObsInt, "%d", &obsint);
+                    observation_interval = obsint * 1000;
+                    lcd.printf("%s", obsint);
+                    isChangingObsInt = 0;
+                }
+            }
+        }
+    }
+
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Thu Dec 01 03:28:38 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#58563e6cba1e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Dec 01 03:28:38 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/d75b3fe1f5cb
\ No newline at end of file