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
Diff: main.cpp
- Revision:
- 3:1498846197ee
- Parent:
- 2:18b496a20413
- Child:
- 4:cf40000fdac1
--- a/main.cpp Mon Dec 05 03:11:53 2016 +0000
+++ b/main.cpp Wed Dec 07 15:09:32 2016 +0000
@@ -2,79 +2,95 @@
#include "rtos.h"
#include "TextLCD.h"
-
LocalFileSystem local("local");
-
InterruptIn vpace(p5);
InterruptIn apace(p6);
DigitalOut vsignal(p7);
DigitalOut asignal(p8);
-
DigitalOut asignal_led(LED1);
DigitalOut vsignal_led(LED2);
DigitalOut apace_led(LED3);
DigitalOut vpace_led(LED4);
-
Thread *heartmodeThread;
osThreadId heartmodeTid;
+osThreadId beats;
+osThreadId displayTid;
+osThreadId HeartSenseTid;
+Timer vClock;
-
Queue<char,256> mode_q;
Queue<char,256> signal_q;
-
+Queue<char,256> obsint_q;
-Queue<char,256> obsint_q;
-
FILE * testresults;
-
-/////////////////
TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
RawSerial pc(USBTX, USBRX);
char key = 'n';
int manual_mode;
-
-int observation_interval = 10;
-/////////////////
volatile char c;
volatile int mm = 0;
-volatile int om = 0;
+volatile int om = 0;
int lri = 1000;
int uri = 700;
int avi = 150;
int pvarp = 300;
-int vrp = 200;
+int vrp = 100;
int arp = 50;
-
+
int twait = 10;
int thrsh = 1000;
int heartmode = 0;
+int v_flag = 0;
+int observation_interval = 10000; // In miliseconds
int heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval
Mutex hr_mutex; //hr_mutex.lock()/unlock()
-
-
+void HeartSense(void const *args)
+{
+ while(1) {
+ osEvent ext_signal = osSignalWait(0, osWaitForever);
+ int evt2 = ext_signal.value.signals;
+
+ switch(evt2) {
+ case(0x1):
+ vpace_led = 1;
+ v_flag = 1;
+ Thread::wait(twait);
+ vpace_led = 0;
+ v_flag = 0;
+ break;
+
+ case(0x10):
+ apace_led = 1;
+ Thread::wait(twait);
+ apace_led = 0;
+ break;
+ }
+ }
+}
+
void vpace_irq()
{
//heartmodeThread->signal_set(0x1);
- osSignalSet(heartmodeTid, 0x1);
+ osSignalSet(HeartSenseTid, 0x1);
}
-
+
void apace_irq()
{
//heartmodeThread->signal_set(0x10);
- osSignalSet(heartmodeTid, 0x10);
+ osSignalSet(HeartSenseTid, 0x10);
}
-
+
void Rx_interrupt()
{
while(pc.readable()) {
@@ -101,24 +117,38 @@
void displayThread(void const *args)
{
- ///////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////
- //////////////////////////////need to implement heart_beats counts in code
- ///////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////
+
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");
}
}
-
+
+void h_beats(void const *args)
+{
+ vClock.start();
+ while(1) {
+ if(vsignal == 1 && vClock.read_ms() >= vrp) {
+ v_flag = 1;
+ }
+
+ if(v_flag == 1) { //osSignalWait(0x1, osWaitForever); when vpace happens, v_flag is set and beats++
+ hr_mutex.lock();
+ heart_beats++;
+ hr_mutex.unlock();
+ vClock.reset();
+ v_flag = 0;
+ }
+ }
+}
+
void test_vrp_vv(FILE * results, Timer * ti)
{
int vrpwait = vrp/2;
@@ -130,11 +160,13 @@
apace_led = 0;
osSignalWait(0x1, osWaitForever);
ti->reset();
+ v_flag = 1;
vpace_led = 1;
Thread::wait(twait);
+ v_flag = 0;
vpace_led = 0;
-
+
Thread::wait(vrpwait);
vsignal = 1;
vsignal_led = 1;
@@ -143,7 +175,7 @@
vsignal_led = 0;
vsignal = 0;
-
+
Thread::wait(vrpwait);
vsignal = 1;
difl = ti->read_us();
@@ -153,7 +185,7 @@
vsignal = 0;
vsignal_led = 0;
-
+
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
@@ -161,15 +193,17 @@
Thread::wait(twait);
apace_led = 0;
-
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
+ v_flag = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
int adif = adifu-difl;
int vdif = vdifu-difl;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -177,10 +211,10 @@
(vdif >= (lri*1000 - thrsh)) &&
(vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
-
+
fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
-
+
}
void test_pvarp_aa(FILE * results, Timer * ti)
{
@@ -194,10 +228,12 @@
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
+ v_flag = 1;
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
Thread::wait(pvarpwait);
asignal = 1;
asignal_led = 1;
@@ -206,7 +242,7 @@
asignal_led = 0;
asignal = 0;
-
+
Thread::wait(pvarpwait);
asignal = 1;
//difl = ti->read_us();
@@ -216,24 +252,26 @@
asignal_led = 0;
asignal = 0;
-
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
+ v_flag = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
int vdif = vdifu;
const char * res = ((vdif >= (uri*1000 - thrsh)) &&
(vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
-
+
fprintf(results, "\nResult: %s %d\n\n", res, vdif);
}
-
+
void test_pvarp_arp_aaa(FILE * results, Timer * ti)
{
int arpwait = arp/2;
@@ -246,10 +284,12 @@
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
+ v_flag = 1;
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
@@ -258,7 +298,7 @@
asignal_led = 0;
asignal = 0;
-
+
Thread::wait(arpwait);
asignal = 1;
asignal_led = 1;
@@ -267,7 +307,7 @@
asignal_led = 0;
asignal = 0;
-
+
Thread::wait(arpwait);
asignal = 1;
asignal_led = 1;
@@ -276,24 +316,26 @@
asignal_led = 0;
asignal = 0;
-
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
+ v_flag = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
int vdif = vdifu;
const char * res = ((vdif >= (uri*1000 - thrsh)) &&
(vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
-
+
fprintf(results, "\nResult: %s %d\n\n", res, vdif);
}
-
+
void test_pvarp_arp_aav(FILE * results, Timer * ti)
{
int adifu,vdifu,difl = 0;
@@ -305,10 +347,12 @@
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
+ v_flag = 1;
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
@@ -317,7 +361,7 @@
asignal_led = 0;
asignal = 0;
-
+
Thread::wait(arp);
asignal = 1;
asignal_led = 1;
@@ -326,7 +370,7 @@
asignal_led = 0;
asignal = 0;
-
+
Thread::wait(20);
vsignal = 1;
difl = ti->read_us();
@@ -336,7 +380,7 @@
vsignal = 0;
vsignal_led = 0;
-
+
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
@@ -344,15 +388,17 @@
Thread::wait(twait);
apace_led = 0;
-
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
+ v_flag = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
int adif = adifu-difl;
int vdif = vdifu-difl;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -360,13 +406,13 @@
(vdif >= (lri*1000 - thrsh)) &&
(vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
-
+
fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
-
+
}
-
+
void test_vpace_after_a(FILE * results, Timer * ti)
{
int vdifu = 0;
@@ -378,10 +424,12 @@
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
+ v_flag = 1;
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
@@ -390,24 +438,26 @@
asignal_led = 0;
asignal = 0;
-
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
+ v_flag = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
int vdif = vdifu;
const char * res = ((vdif >= (uri*1000 - thrsh)) &&
(vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
-
+
fprintf(results, "\nResult: %s %d\n\n", res, vdif);
}
-
+
void test_apace_vpace_av(FILE * results, Timer * ti)
{
fprintf(results, "Test APACE After V\n\n Time Action\n");
@@ -419,10 +469,11 @@
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
+ v_flag = 1;
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
@@ -430,15 +481,17 @@
Thread::wait(twait);
apace_led = 0;
-
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
+ v_flag = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
int adif = adifu;
int vdif = vdifu;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -446,11 +499,11 @@
(vdif >= (lri*1000 - thrsh)) &&
(vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
-
+
fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
}
-
+
void test_avi_a(FILE * results, Timer * ti)
{
int vdifu,difl = 0;
@@ -462,10 +515,12 @@
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
+ v_flag = 1;
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
Thread::wait(uri);
asignal = 1;
difl = ti->read_us();
@@ -475,26 +530,28 @@
asignal_led = 0;
asignal = 0;
-
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
+ v_flag = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
int vpc = (avi*1000) + difl;
const char * res = ((vpc >= (vdifu - thrsh)) &&
(vpc < (vdifu + thrsh))) ? "Passed": "Failed";
-
+
fprintf(results, "\nResult: %s %d\n\n", res, vpc);
-
+
}
-
+
void test_uri_a(FILE * results, Timer * ti)
{
int vdifu = 0;
@@ -506,10 +563,12 @@
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
+ v_flag = 1;
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
@@ -518,26 +577,28 @@
asignal_led = 0;
asignal = 0;
-
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
+ v_flag = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
int vdif = vdifu;
const char * res = ((vdif >= (uri*1000 - thrsh)) &&
(vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
-
+
fprintf(results, "\nResult: %s %d\n\n", res, vdif);
-
+
}
-
+
void test_normal_10(FILE * results, Timer * ti)
{
fprintf(results, " Test Normal x10\n\n Time Action\n");
@@ -549,10 +610,12 @@
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
+ v_flag = 1;
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
while(i < 10) {
Thread::wait(pvarp);
asignal = 1;
@@ -562,7 +625,7 @@
asignal_led = 0;
asignal = 0;
-
+
Thread::wait(75);
vsignal = 1;
difl = ti->read_us();
@@ -574,7 +637,7 @@
i = i+1;
}
-
+
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
@@ -582,15 +645,17 @@
Thread::wait(twait);
apace_led = 0;
-
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
+ v_flag = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
+ v_flag = 0;
-
+
int adif = adifu - difl;
int vdif = vdifu - difl;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -598,19 +663,19 @@
(vdif >= (lri*1000 - thrsh)) &&
(vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
-
+
fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
}
-
+
void testmode(void const *args)
{
Timer *t;
- testresults = fopen("/local/testreport.txt", "w"); // Open "out.txt" on the local file system for writing
+ testresults = fopen("/local/test.txt", "w"); // Open "out.txt" on the local file system for writing
t = new Timer();
t->start();
-
+
test_vrp_vv(testresults, t);
test_pvarp_aa(testresults, t);
test_pvarp_arp_aaa(testresults, t);
@@ -624,31 +689,27 @@
}
-
-
+
+
void randommode(void const *args)
{
int aorv,sig = 0;
Timer at,vt;
-
at.start();
vt.start();
-
//osEvent ext_signal = osSignalWait(0, 1);
//int evt = ext_signal.value.signals;
//osSignalSet(heartmodeTid, 0x1);
//osSignalWait(0, osWaitForever);
while(heartmode == 0) {
aorv = (float)(rand()%2);
- sig = aorv ? rand()%(lri - avi - at.read_ms()) : rand()%(lri - vt.read_ms());
+ sig = aorv ? rand()%(lri - avi) : rand()%(lri);
-
osEvent ext_signal = osSignalWait(0, sig);
int evt = ext_signal.value.signals;
-
switch(evt) {
case(0x0):
if(aorv) {
@@ -668,29 +729,31 @@
vsignal = 0;
break;
}
- case(0x1):
- at.reset();
- vt.reset();
- vpace_led = 1;
- Thread::wait(twait);
- vpace_led = 0;
- break;
+// case(0x1):
+// at.reset();
+// vt.reset();
+// vpace_led = 1;
+// v_flag = 1;
+// Thread::wait(twait);
+// vpace_led = 0;
+// v_flag = 0;
+// break;
+//
+//
+// case(0x10):
+// apace_led = 1;
+// Thread::wait(twait);
+// apace_led = 0;
+// break;
-
- case(0x10):
- apace_led = 1;
- Thread::wait(twait);
- apace_led = 0;
- break;
-
// case(0x100):
//
}
}
}
-
+
void manualmode(void const *args)
{
while(1) {
@@ -713,7 +776,6 @@
}
}
-
void obsinterval()
{
char newObsInt[8];
@@ -723,55 +785,59 @@
osEvent evt = obsint_q.get();
if(evt.status == osEventMessage) {
key = (char)evt.value.p;
- if(key != '\r' && i < 7 ){
+ if(key != '\r' && i < 7 ) {
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(randommode, osPriorityNormal, DEFAULT_STACK_SIZE);
osThreadDef(testmode, osPriorityNormal, DEFAULT_STACK_SIZE);
osThreadDef(manualmode, osPriorityNormal, DEFAULT_STACK_SIZE);
+osThreadDef(h_beats, osPriorityNormal, DEFAULT_STACK_SIZE);
+osThreadDef(displayThread, osPriorityNormal, DEFAULT_STACK_SIZE);
+osThreadDef(HeartSense, osPriorityNormal, DEFAULT_STACK_SIZE);
-
int main()
{
vpace.rise(&vpace_irq);
apace.rise(&apace_irq);
-
pc.attach(&Rx_interrupt, RawSerial::RxIrq);
-
//heartmodeThread = new Thread();
-
+
//Callback<void()> testmodeTask((void*)NULL,(void (*)(void *))&testmode);
-
+ HeartSenseTid = osThreadCreate(osThread(HeartSense), NULL);
heartmodeTid = osThreadCreate(osThread(randommode), NULL);
+ beats = osThreadCreate(osThread(h_beats), NULL);
+ displayTid = osThreadCreate(osThread(displayThread), NULL);
// heartmodeTid = osThreadCreate(osThread(testmode), NULL);
// heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
-// lcd.printf();
while(true) {
-// while(pc.readable()) {
-// key = pc.getc();
osEvent evt = mode_q.get();
if(evt.status == osEventMessage) {
switch((char)evt.value.p) {
//pvarp = 0.3s
case('r'):
lcd.printf("R");
-// randommode.terminate();
osThreadTerminate (heartmodeTid);
+ osThreadTerminate (displayTid);
if (testresults != NULL) {
fclose(testresults);
}
@@ -780,13 +846,14 @@
apace_led = 0;
vpace_led = 0;
-
+ displayTid = osThreadCreate(osThread(displayThread), NULL);
heartmodeTid = osThreadCreate(osThread(randommode), NULL);
// Thread::wait(100);
break;
case('t'):
lcd.printf("T");
osThreadTerminate (heartmodeTid);
+ osThreadTerminate (displayTid);
if (testresults != NULL) {
fclose(testresults);
}
@@ -795,12 +862,13 @@
apace_led = 0;
vpace_led = 0;
-
+ displayTid = osThreadCreate(osThread(displayThread), NULL);
heartmodeTid = osThreadCreate(osThread(testmode), NULL);
break;
case('m'):
lcd.printf("M");
osThreadTerminate (heartmodeTid);
+ osThreadTerminate (displayTid);
if (testresults != NULL) {
fclose(testresults);
}
@@ -809,15 +877,17 @@
apace_led = 0;
vpace_led = 0;
-
+ displayTid = osThreadCreate(osThread(displayThread), NULL);
heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
manual_mode = 1;
-
+
break;
case('o'):
lcd.printf("modeO");
obsinterval();
+ osThreadTerminate (displayTid);
+ displayTid = osThreadCreate(osThread(displayThread), NULL);
break;
}
}