
here it is
Dependencies: TextLCD mbed-rtos mbed
Fork of 541-pacemaker by
Diff: main.cpp
- Revision:
- 2:682a3ac9d7a3
- Parent:
- 1:e6f6471e2c00
- Child:
- 3:77efff091ef1
--- a/main.cpp Mon Dec 05 03:14:51 2016 +0000 +++ b/main.cpp Wed Dec 07 15:10:36 2016 +0000 @@ -2,35 +2,36 @@ #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; //RtosTimer *vpace_timer2; - + double LRI = 1000; double URI = 700; double VRP = 200; // V noise interval @@ -39,7 +40,7 @@ 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 @@ -49,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; int mm_flag = 0; - + void initialize_intervals() { LRI = 1000; @@ -68,7 +69,7 @@ // AVI = 150; // PVARP = 300; } - + void Rx_interrupt() { while(pc.readable()) { @@ -92,41 +93,49 @@ } } } + -// Function to toggle the LEDs 1,2,3,4 -void toggleLed(int led) +// Thread signals 1=0x5, 2=0x6, 3=0x7, 4=0x8 +void ledThread(void const *args) { - switch (led) { - case (1): + 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; - break; - case (2): + } + else if (evt == 0x6) + { vsense_led = 1; Thread::wait(wait_period); vsense_led = 0; - break; - case (3): + } + else if (evt == 0x7) + { apace_led = 1; Thread::wait(wait_period); apace_led = 0; - break; - case (4): + } + else if (evt == 0x8) + { 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 == 0xb){ lcd.printf("%s", "\nALARM HIGH"); } @@ -135,7 +144,7 @@ } } } - + void displayThread(void const *args) { while (1) { @@ -159,54 +168,53 @@ } } } - - - + + + // 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(); - toggleLed(3); + osSignalSet(ledTid, 0x7); Apace = 0; osSignalSet(signalTid, 0x3); } - + // 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); - - toggleLed(4); + osSignalSet(ledTid, 0x8); Vpace = 0; osSignalSet(signalTid, 0x4); - + hr_mutex.lock(); heart_beats++; hr_mutex.unlock(); } - - - + + + void PaceSignal(void const *args) { int pFlag1 = 0; @@ -222,9 +230,7 @@ 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); aClock.reset(); @@ -235,30 +241,34 @@ } 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); } - + } 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); - + if (evt == 0x1 && aClock.read_ms() >= ARP) { //aSignal osSignalSet(senseTid, 0x1); aClock.reset(); } else if(evt == 0x2) { //vSignal + hr_mutex.lock(); + heart_beats++; + hr_mutex.unlock(); osSignalSet(senseTid, 0x2); vClock.reset(); if(!mm_flag) { @@ -273,8 +283,8 @@ pFlag2 = 0; } } - - + + void PaceSense(void const *args) { int pFlag1 = 0; @@ -283,36 +293,26 @@ while (!pFlag1) { osEvent ext_signal = osSignalWait(0, osWaitForever); int evt = ext_signal.value.signals; - - //lcd.printf("%d",evt); - + if (evt == 0x1) { //aSense - toggleLed(evt); + osSignalSet(ledTid, 0x5); pFlag1 = 1; } else if(evt == 0x2) { //vSense - toggleLed(evt); - hr_mutex.lock(); - heart_beats++; - hr_mutex.unlock(); + osSignalSet(ledTid, 0x6); } 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); + osSignalSet(ledTid, 0x5); } else if(evt == 0x2) { //vSignal - toggleLed(evt); - hr_mutex.lock(); - heart_beats++; - hr_mutex.unlock(); + osSignalSet(ledTid, 0x6); pFlag2 = 1; } else if (evt == 0x4) { //vPace pFlag2 = 1; @@ -321,7 +321,7 @@ pFlag2 = 0; } } - + void normalmode(void const *args) { initialize_intervals(); @@ -333,11 +333,11 @@ hr_mutex.lock(); heart_beats = 0; hr_mutex.unlock(); - + vpace_timer->start(LRI); apace_timer->start(LRI-AVI); } - + void exercisemode(void const *args) { initialize_intervals(); @@ -352,11 +352,11 @@ hr_mutex.lock(); heart_beats = 0; hr_mutex.unlock(); - + vpace_timer->start(LRI); apace_timer->start(LRI-AVI); } - + void sleepmode(void const *args) { initialize_intervals(); @@ -371,32 +371,32 @@ hr_mutex.lock(); heart_beats = 0; hr_mutex.unlock(); - + vpace_timer->start(LRI); apace_timer->start(LRI-AVI); } - + void m_vpace() { vClock.reset(); Vpace = 1; - toggleLed(4); + osSignalSet(ledTid, 0x8); Vpace = 0; osSignalSet(signalTid, 0x4); hr_mutex.lock(); heart_beats++; hr_mutex.unlock(); } - + void m_apace() { aClock.reset(); Apace = 1; - toggleLed(3); + osSignalSet(ledTid, 0x7); Apace = 0; osSignalSet(signalTid, 0x3); } - + void manualmode(void const *args) { upperBound = 175; //beats per msecond @@ -405,7 +405,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 +417,7 @@ } } } - + void obsinterval() { char newObsInt[8]; @@ -431,35 +431,40 @@ 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); - - + + //////////////////////////////////////////// //////////////////////////////////////////// //////////////////////////////////////////// - + int main() { + ledTid = osThreadCreate(osThread(ledThread), NULL); alarmTid = osThreadCreate(osThread(alarmThread), NULL); senseTid = osThreadCreate(osThread(PaceSense), NULL); signalTid = osThreadCreate(osThread(PaceSignal), NULL); @@ -468,16 +473,16 @@ 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(); - + pc.attach(&Rx_interrupt, RawSerial::RxIrq); - + while(true) { osEvent evt = mode_q.get(); if(evt.status == osEventMessage) { @@ -519,13 +524,11 @@ break; case('o'): lcd.printf("modeO"); - hr_mutex.lock(); - obsinterval(); - hr_mutex.unlock(); + obsinterval();; osThreadTerminate (displayTid); displayTid = osThreadCreate(osThread(displayThread), NULL); break; } } } -} +} \ No newline at end of file