
here it is
Dependencies: TextLCD mbed-rtos mbed
Fork of 541-pacemaker by
Diff: main.cpp
- Revision:
- 3:77efff091ef1
- Parent:
- 2:682a3ac9d7a3
- Child:
- 4:f887d8169f83
--- a/main.cpp Wed Dec 07 15:10:36 2016 +0000 +++ b/main.cpp Fri Dec 09 06:50:30 2016 +0000 @@ -2,45 +2,45 @@ #include "rtos.h" #include "TextLCD.h" #include <stdio.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; osThreadId pacemodeTid; osThreadId alarmTid; -osThreadId ledTid; TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); RawSerial pc(USBTX, USBRX); - + Timer vClock; Timer aClock; //PaceSignal model - -RtosTimer *apace_timer; -RtosTimer *vpace_timer; +Timer arpClock; + +//RtosTimer *apace_timer; +//RtosTimer *vpace_timer; //RtosTimer *vpace_timer2; - + 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 AVI = 500; // A-V max interval double PVARP = 300; // V-A max interval double ratio; int wait_period = 10; // 3a requirement - + int observation_interval = 10000; // In miliseconds int upperBound; //for mode changes int lowerBound; //for mode changes @@ -50,16 +50,16 @@ char newObsInt[8]; int manual_mode = 0; Mutex hr_mutex; //hr_mutex.lock()/unlock() - + Queue<char,256> mode_q; Queue<char,256> signal_q; Queue<char,256> obsint_q; - + volatile char c; volatile int mm = 0; -volatile int om = 0; +volatile int om = 0; int mm_flag = 0; - + void initialize_intervals() { LRI = 1000; @@ -69,7 +69,7 @@ // AVI = 150; // PVARP = 300; } - + void Rx_interrupt() { while(pc.readable()) { @@ -93,235 +93,261 @@ } } } - -// Thread signals 1=0x5, 2=0x6, 3=0x7, 4=0x8 -void ledThread(void const *args) +// 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 alarmThread(void const *args) { while (1) { osEvent ext_signal = osSignalWait(0, osWaitForever); int evt = ext_signal.value.signals; - - if (evt == 0x5) - { - asense_led = 1; - Thread::wait(wait_period); - asense_led = 0; - } - else if (evt == 0x6) - { - vsense_led = 1; - Thread::wait(wait_period); - vsense_led = 0; - } - else if (evt == 0x7) - { - apace_led = 1; - Thread::wait(wait_period); - apace_led = 0; - } - else if (evt == 0x8) - { - vpace_led = 1; - Thread::wait(wait_period); - vpace_led = 0; - } - } -} - -void alarmThread(void const *args) -{ - while (1) - { - osEvent ext_signal = osSignalWait(0, osWaitForever); - int evt = ext_signal.value.signals; - - if (evt == 0xb){ - lcd.printf("%s", "\nALARM HIGH"); - } - else if (evt == 0xc) { + + if (evt == 0xb) { + lcd.printf("%s", "\nALARM HIGH"); + } else if (evt == 0xc) { lcd.printf("%s", "\nALARM LOW"); } } } - + void displayThread(void const *args) { while (1) { Thread::wait(observation_interval); lcd.cls(); - + hr_mutex.lock(); int hr = (heart_beats*60) / (observation_interval / 1000); heart_beats = 0; hr_mutex.unlock(); - + lcd.printf("%s%d%s","HR: ", hr, " bpm"); - - if (hr > upperBound) - { + + if (hr > upperBound) { osSignalSet(alarmTid, 0xb); - } - else if (hr < lowerBound) - { + } else if (hr < lowerBound) { osSignalSet(alarmTid, 0xc); } } } - - - + + + // Incoming signal from the heart void asignal_irq() { osSignalSet(signalTid, 0x1); } - + // Incoming signal from the heart void vsignal_irq() { osSignalSet(signalTid, 0x2); } - - + + // Timer-driven function to pace the Atrial void a_pace(void const*) { Apace = 1; aClock.reset(); - apace_timer->stop(); - osSignalSet(ledTid, 0x7); +// apace_timer->stop(); Apace = 0; osSignalSet(signalTid, 0x3); + + toggleLed(3); } - + // Timer-driven function to pace the ventrical void v_pace(void const*) { Vpace = 1; - - + vClock.reset(); - vpace_timer->start(LRI); - apace_timer->start(LRI-AVI); - osSignalSet(ledTid, 0x8); +// vpace_timer->start(LRI); +// apace_timer->start(LRI-AVI); Vpace = 0; + + hr_mutex.lock(); osSignalSet(signalTid, 0x4); - - hr_mutex.lock(); heart_beats++; hr_mutex.unlock(); + + toggleLed(4); } - - - + + + void PaceSignal(void const *args) { int pFlag1 = 0; int pFlag2 = 0; vClock.start(); aClock.start(); - if(!mm_flag) { - vpace_timer->start(LRI); - apace_timer->start(LRI-AVI); - } + arpClock.start(); +// if(!mm_flag) { +// vpace_timer->start(LRI); +// apace_timer->start(LRI-AVI); +// } // vpace_timer2->start(AVI); while(1) { while (!pFlag1) { osEvent ext_signal = osSignalWait(0, osWaitForever); int evt = ext_signal.value.signals; - - if (evt == 0x1 && vClock.read_ms() >= PVARP) { //aSignal + + //lcd.printf("%d",evt); // 4(Vpace), 3(Apace), 2(Vsignal), 1(Asignal) + + if (evt == 0x1 && vClock.read_ms() >= PVARP) { //aSense osSignalSet(senseTid, 0x1); aClock.reset(); - if(!mm_flag) { - apace_timer->stop(); - int interval = (vClock.read_ms() + AVI >= URI) ? AVI : URI - vClock.read_ms(); - apace_timer->start(interval); - } + arpClock.reset(); pFlag1 = 1; } else if(evt == 0x2 && vClock.read_ms() >= VRP) { //vSignal - hr_mutex.lock(); - heart_beats++; - hr_mutex.unlock(); osSignalSet(senseTid, 0x2); vClock.reset(); - if(!mm_flag) { - vpace_timer->start(LRI); - apace_timer->start(LRI-AVI); - } - +// if(!mm_flag) { +// vpace_timer->start(LRI); +// apace_timer->start(LRI-AVI); +// } } else if (evt == 0x3) { //aPace pFlag1 = 1; } } pFlag1 = 0; - + lcd.cls(); + lcd.printf("PS1"); while(!pFlag2) { - + osEvent ext_signal = osSignalWait(0, osWaitForever); int evt = ext_signal.value.signals; - - if (evt == 0x1 && aClock.read_ms() >= ARP) { //aSignal + + //lcd.printf("%d",evt); + + if (evt == 0x1 && arpClock.read_ms() >= ARP) { //aSignal osSignalSet(senseTid, 0x1); - aClock.reset(); - } else if(evt == 0x2) { //vSignal + arpClock.reset(); +// aClock.reset(); + } else if(evt == 0x2) { //vSense hr_mutex.lock(); + osSignalSet(senseTid, 0x2); heart_beats++; + vClock.reset(); hr_mutex.unlock(); - osSignalSet(senseTid, 0x2); - vClock.reset(); - if(!mm_flag) { - vpace_timer->start(LRI); - apace_timer->start(LRI-AVI); - } +// if(!mm_flag) { +// vpace_timer->start(LRI); +// apace_timer->start(LRI-AVI); +// } pFlag2 = 1; } else if (evt == 0x4) { //vPace pFlag2 = 1; } } pFlag2 = 0; + lcd.cls(); + lcd.printf("PS2"); } } - - + + void PaceSense(void const *args) { + int interval; int pFlag1 = 0; int pFlag2 = 0; while(1) { while (!pFlag1) { - osEvent ext_signal = osSignalWait(0, osWaitForever); + osEvent ext_signal = osSignalWait(0, (LRI-AVI)); int evt = ext_signal.value.signals; - - if (evt == 0x1) { //aSense - osSignalSet(ledTid, 0x5); - pFlag1 = 1; - } else if(evt == 0x2) { //vSense - osSignalSet(ledTid, 0x6); - } else if (evt == 0x3) { //aPace + + //lcd.printf("%d",evt); + if (evt == 0x3) { //aPace 0x0 + Apace = 1; + Thread::wait(1); + Apace = 0; + osSignalSet(signalTid, 0x3); + aClock.reset(); + arpClock.reset(); + + toggleLed(3); pFlag1 = 1; } - + if (evt == 0x1) { //aSense + if(!mm_flag) { +// vpace_timer->stop(); + interval = (vClock.read_ms() + AVI >= URI) ? AVI : URI - vClock.read_ms(); + } +// if(mm_flag) + toggleLed(evt); + pFlag1 = 1; + } else if(evt == 0x2) { //vSense + toggleLed(evt); + } +// } else if (evt == 0x3) { //aPace +// aClock.reset(); +// arpClock.reset(); +// pFlag1 = 1; +// } } pFlag1 = 0; + lcd.cls(); + lcd.printf("PS3"); while(!pFlag2) { - osEvent ext_signal = osSignalWait(0, osWaitForever); + lcd.printf("%d", interval); + osEvent ext_signal = osSignalWait(0, interval); + int evt = ext_signal.value.signals; - - if (evt == 0x1) { //aSense - osSignalSet(ledTid, 0x5); - } else if(evt == 0x2) { //vSignal - osSignalSet(ledTid, 0x6); + + //lcd.printf("%d",evt); // 4096, 256, 16, 1 + if (evt == 0x4) { //vPace 0x0 + hr_mutex.lock(); + Vpace = 1; + vClock.reset(); + Thread::wait(1); + Vpace = 0; + osSignalSet(signalTid, 0x4); + heart_beats++; + hr_mutex.unlock(); + + toggleLed(4); pFlag2 = 1; - } else if (evt == 0x4) { //vPace + } else if (evt == 0x1) { //aSense + toggleLed(evt); + } else if(evt == 0x2) { //vSense + toggleLed(evt); pFlag2 = 1; } } pFlag2 = 0; + lcd.cls(); + lcd.printf("PS4"); } } - + void normalmode(void const *args) { initialize_intervals(); @@ -333,11 +359,13 @@ hr_mutex.lock(); heart_beats = 0; hr_mutex.unlock(); - - vpace_timer->start(LRI); - apace_timer->start(LRI-AVI); + + vClock.reset(); + aClock.reset(); +// vpace_timer->start(LRI); +// apace_timer->start(LRI-AVI); } - + void exercisemode(void const *args) { initialize_intervals(); @@ -352,11 +380,13 @@ hr_mutex.lock(); heart_beats = 0; hr_mutex.unlock(); - - vpace_timer->start(LRI); - apace_timer->start(LRI-AVI); + + vClock.reset(); + aClock.reset(); +// vpace_timer->start(LRI); +// apace_timer->start(LRI-AVI); } - + void sleepmode(void const *args) { initialize_intervals(); @@ -371,32 +401,38 @@ hr_mutex.lock(); heart_beats = 0; hr_mutex.unlock(); - - vpace_timer->start(LRI); - apace_timer->start(LRI-AVI); + + vClock.reset(); + aClock.reset(); +// vpace_timer->start(LRI); +// apace_timer->start(LRI-AVI); } - + void m_vpace() { vClock.reset(); Vpace = 1; - osSignalSet(ledTid, 0x8); + Thread::wait(1); Vpace = 0; osSignalSet(signalTid, 0x4); hr_mutex.lock(); heart_beats++; hr_mutex.unlock(); + + toggleLed(4); } - + void m_apace() { aClock.reset(); Apace = 1; - osSignalSet(ledTid, 0x7); + Thread::wait(1); Apace = 0; osSignalSet(signalTid, 0x3); + + toggleLed(3); } - + void manualmode(void const *args) { upperBound = 175; //beats per msecond @@ -405,7 +441,7 @@ mode = 'm'; LRI = 2125; // max V-V (LRI) based on exercise mode URI = 675; // min V-V (URI) based on sleep mode - + while(1) { osEvent evt = signal_q.get(); if(evt.status == osEventMessage) { @@ -417,7 +453,7 @@ } } } - + void obsinterval() { char newObsInt[8]; @@ -431,84 +467,84 @@ newObsInt[i] = key; i++; } else if((key == '\r') && (i > 0)) { - hr_mutex.lock(); heart_beats = 0; - hr_mutex.unlock(); int obsint; newObsInt[i] = '\0'; sscanf(newObsInt, "%d", &obsint); - hr_mutex.lock(); observation_interval = (obsint > 0 ) ? obsint: 1; - hr_mutex.unlock(); isChangingObsInt = 0; lcd.printf("%d", observation_interval); } } } } - + osThreadDef(PaceSignal, osPriorityNormal, DEFAULT_STACK_SIZE); osThreadDef(PaceSense, osPriorityNormal, DEFAULT_STACK_SIZE); osThreadDef(alarmThread, osPriorityBelowNormal, DEFAULT_STACK_SIZE); //priority BelowNormal -osThreadDef(ledThread, osPriorityBelowNormal, DEFAULT_STACK_SIZE); //priority BelowNormal + osThreadDef(displayThread, osPriorityLow, DEFAULT_STACK_SIZE); //priority Low osThreadDef(manualmode, osPriorityNormal, DEFAULT_STACK_SIZE); -osThreadDef(normalmode, osPriorityNormal, DEFAULT_STACK_SIZE); -osThreadDef(exercisemode, osPriorityNormal, DEFAULT_STACK_SIZE); -osThreadDef(sleepmode, osPriorityNormal, DEFAULT_STACK_SIZE); - - +//osThreadDef(normalmode, osPriorityNormal, DEFAULT_STACK_SIZE); +//osThreadDef(exercisemode, osPriorityNormal, DEFAULT_STACK_SIZE); +//osThreadDef(sleepmode, osPriorityNormal, DEFAULT_STACK_SIZE); + + //////////////////////////////////////////// //////////////////////////////////////////// //////////////////////////////////////////// - + int main() { - ledTid = osThreadCreate(osThread(ledThread), NULL); alarmTid = osThreadCreate(osThread(alarmThread), NULL); senseTid = osThreadCreate(osThread(PaceSense), NULL); signalTid = osThreadCreate(osThread(PaceSignal), NULL); displayTid = osThreadCreate(osThread(displayThread), NULL); - pacemodeTid = osThreadCreate(osThread(normalmode), NULL); +// pacemodeTid = osThreadCreate(osThread(normalmode), NULL); + normalmode(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); - + +// 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(); - + pc.attach(&Rx_interrupt, RawSerial::RxIrq); - while(true) { +// lcd.printf("test1"); osEvent evt = mode_q.get(); if(evt.status == osEventMessage) { switch((char)evt.value.p) { case('n'): mm_flag = 0; + lcd.printf("paceN"); osThreadTerminate (pacemodeTid); osThreadTerminate (displayTid); - pacemodeTid = osThreadCreate(osThread(normalmode), NULL); +// pacemodeTid = osThreadCreate(osThread(normalmode), NULL); + normalmode(NULL); displayTid = osThreadCreate(osThread(displayThread), NULL); lcd.printf("%d", observation_interval); break; case('s'): mm_flag = 0; -// lcd.printf("testingS"); + lcd.printf("paceS"); osThreadTerminate (pacemodeTid); osThreadTerminate (displayTid); - pacemodeTid = osThreadCreate(osThread(sleepmode), NULL); +// pacemodeTid = osThreadCreate(osThread(sleepmode), NULL); + sleepmode(NULL); displayTid = osThreadCreate(osThread(displayThread), NULL); break; case('e'): mm_flag = 0; -// lcd.printf("testingE"); + lcd.printf("paceE"); osThreadTerminate (pacemodeTid); osThreadTerminate (displayTid); - pacemodeTid = osThreadCreate(osThread(exercisemode), NULL); +// pacemodeTid = osThreadCreate(osThread(exercisemode), NULL); + exercisemode(NULL); displayTid = osThreadCreate(osThread(displayThread), NULL); lcd.printf("%d", observation_interval); break; @@ -516,19 +552,21 @@ mm_flag = 1; osThreadTerminate (pacemodeTid); //osThreadTerminate (displayTid); - apace_timer->stop(); - vpace_timer->stop(); +// apace_timer->stop(); +// vpace_timer->stop(); pacemodeTid = osThreadCreate(osThread(manualmode), NULL); // displayTid = osThreadCreate(osThread(displayThread), NULL); manual_mode = 1; break; case('o'): lcd.printf("modeO"); - obsinterval();; + hr_mutex.lock(); + obsinterval(); + hr_mutex.unlock(); osThreadTerminate (displayTid); displayTid = osThreadCreate(osThread(displayThread), NULL); break; } } } -} \ No newline at end of file +}