Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: TextLCD mbed-rtos mbed
Fork of 541-pacemaker by
Revision 2:682a3ac9d7a3, committed 2016-12-07
- Comitter:
- terryfan
- Date:
- Wed Dec 07 15:10:36 2016 +0000
- Parent:
- 1:e6f6471e2c00
- Child:
- 3:77efff091ef1
- Commit message:
- latest pacemaker.
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- 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
