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:
- 2:18b496a20413
- Parent:
- 1:57cd3ae5f44a
- Child:
- 3:1498846197ee
--- a/main.cpp Fri Dec 02 21:39:47 2016 +0000
+++ b/main.cpp Mon Dec 05 03:11:53 2016 +0000
@@ -2,37 +2,48 @@
#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;
+
Queue<char,256> mode_q;
Queue<char,256> signal_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 isChangingObsInt;
+
+
+int observation_interval = 10;
/////////////////
volatile char c;
volatile int mm = 0;
+volatile int om = 0;
int lri = 1000;
int uri = 700;
int avi = 150;
@@ -40,45 +51,74 @@
int vrp = 200;
int arp = 50;
+
int twait = 10;
int thrsh = 1000;
int heartmode = 0;
+int heart_beats = 0; // Heart-Beats (sensed or paced) since the last observation interval
+Mutex hr_mutex; //hr_mutex.lock()/unlock()
+
+
void vpace_irq()
{
//heartmodeThread->signal_set(0x1);
osSignalSet(heartmodeTid, 0x1);
}
+
void apace_irq()
{
//heartmodeThread->signal_set(0x10);
osSignalSet(heartmodeTid, 0x10);
}
-
-
+
void Rx_interrupt()
{
while(pc.readable()) {
c = pc.getc();
- if(c == 'm') {
+ if(c == 'm' && om != 1) {
mode_q.put((char*)c);
mm = 1;
- } else if(c == 'r' || c == 't') {
+ } else if((c == 'r' || c == 't') && om != 1) {
mode_q.put((char*)c);
mm = 0;
} else if((c == 'a' || c == 'v') && mm) {
signal_q.put((char*)c);
+ } else if(c == 'o' && om != 1) {
+ mode_q.put((char*)c);
+ om = 1;
+ } else if (c == '\r' && om) {
+ obsint_q.put((char*)c);
+ om = 0;
+ } else if ((int)c > 47 && (int)c < 58 && om) {
+ obsint_q.put((char*)c);
}
}
}
-
-
-
-
+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 test_vrp_vv(FILE * results, Timer * ti)
{
int vrpwait = vrp/2;
@@ -94,6 +134,7 @@
Thread::wait(twait);
vpace_led = 0;
+
Thread::wait(vrpwait);
vsignal = 1;
vsignal_led = 1;
@@ -102,6 +143,7 @@
vsignal_led = 0;
vsignal = 0;
+
Thread::wait(vrpwait);
vsignal = 1;
difl = ti->read_us();
@@ -111,6 +153,7 @@
vsignal = 0;
vsignal_led = 0;
+
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
@@ -118,6 +161,7 @@
Thread::wait(twait);
apace_led = 0;
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
@@ -125,6 +169,7 @@
Thread::wait(twait);
vpace_led = 0;
+
int adif = adifu-difl;
int vdif = vdifu-difl;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -132,8 +177,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)
{
@@ -150,6 +197,7 @@
Thread::wait(twait);
vpace_led = 0;
+
Thread::wait(pvarpwait);
asignal = 1;
asignal_led = 1;
@@ -158,6 +206,7 @@
asignal_led = 0;
asignal = 0;
+
Thread::wait(pvarpwait);
asignal = 1;
//difl = ti->read_us();
@@ -167,6 +216,7 @@
asignal_led = 0;
asignal = 0;
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
@@ -174,13 +224,16 @@
Thread::wait(twait);
vpace_led = 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;
@@ -196,6 +249,7 @@
Thread::wait(twait);
vpace_led = 0;
+
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
@@ -204,6 +258,7 @@
asignal_led = 0;
asignal = 0;
+
Thread::wait(arpwait);
asignal = 1;
asignal_led = 1;
@@ -212,6 +267,7 @@
asignal_led = 0;
asignal = 0;
+
Thread::wait(arpwait);
asignal = 1;
asignal_led = 1;
@@ -220,6 +276,7 @@
asignal_led = 0;
asignal = 0;
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
@@ -227,13 +284,16 @@
Thread::wait(twait);
vpace_led = 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;
@@ -248,6 +308,7 @@
Thread::wait(twait);
vpace_led = 0;
+
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
@@ -256,6 +317,7 @@
asignal_led = 0;
asignal = 0;
+
Thread::wait(arp);
asignal = 1;
asignal_led = 1;
@@ -264,6 +326,7 @@
asignal_led = 0;
asignal = 0;
+
Thread::wait(20);
vsignal = 1;
difl = ti->read_us();
@@ -273,6 +336,7 @@
vsignal = 0;
vsignal_led = 0;
+
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
@@ -280,6 +344,7 @@
Thread::wait(twait);
apace_led = 0;
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
@@ -287,6 +352,7 @@
Thread::wait(twait);
vpace_led = 0;
+
int adif = adifu-difl;
int vdif = vdifu-difl;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -294,10 +360,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;
@@ -312,6 +381,7 @@
Thread::wait(twait);
vpace_led = 0;
+
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
@@ -320,6 +390,7 @@
asignal_led = 0;
asignal = 0;
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
@@ -327,13 +398,16 @@
Thread::wait(twait);
vpace_led = 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");
@@ -348,6 +422,7 @@
Thread::wait(twait);
vpace_led = 0;
+
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
@@ -355,6 +430,7 @@
Thread::wait(twait);
apace_led = 0;
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
@@ -362,6 +438,7 @@
Thread::wait(twait);
vpace_led = 0;
+
int adif = adifu;
int vdif = vdifu;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -369,9 +446,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;
@@ -386,6 +465,7 @@
Thread::wait(twait);
vpace_led = 0;
+
Thread::wait(uri);
asignal = 1;
difl = ti->read_us();
@@ -395,6 +475,7 @@
asignal_led = 0;
asignal = 0;
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
@@ -402,14 +483,18 @@
Thread::wait(twait);
vpace_led = 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;
@@ -424,6 +509,7 @@
Thread::wait(twait);
vpace_led = 0;
+
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
@@ -432,6 +518,7 @@
asignal_led = 0;
asignal = 0;
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
@@ -439,14 +526,18 @@
Thread::wait(twait);
vpace_led = 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");
@@ -461,6 +552,7 @@
Thread::wait(twait);
vpace_led = 0;
+
while(i < 10) {
Thread::wait(pvarp);
asignal = 1;
@@ -470,6 +562,7 @@
asignal_led = 0;
asignal = 0;
+
Thread::wait(75);
vsignal = 1;
difl = ti->read_us();
@@ -481,6 +574,7 @@
i = i+1;
}
+
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
@@ -488,6 +582,7 @@
Thread::wait(twait);
apace_led = 0;
+
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
@@ -495,6 +590,7 @@
Thread::wait(twait);
vpace_led = 0;
+
int adif = adifu - difl;
int vdif = vdifu - difl;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
@@ -502,9 +598,11 @@
(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;
@@ -512,6 +610,7 @@
t = new Timer();
t->start();
+
test_vrp_vv(testresults, t);
test_pvarp_aa(testresults, t);
test_pvarp_arp_aaa(testresults, t);
@@ -525,14 +624,18 @@
}
+
+
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);
@@ -541,9 +644,11 @@
aorv = (float)(rand()%2);
sig = aorv ? rand()%(lri - avi - at.read_ms()) : rand()%(lri - vt.read_ms());
+
osEvent ext_signal = osSignalWait(0, sig);
int evt = ext_signal.value.signals;
+
switch(evt) {
case(0x0):
if(aorv) {
@@ -571,18 +676,21 @@
vpace_led = 0;
break;
+
case(0x10):
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
break;
+
// case(0x100):
//
}
}
}
+
void manualmode(void const *args)
{
while(1) {
@@ -606,23 +714,52 @@
}
+void obsinterval()
+{
+ char newObsInt[8];
+ int isChangingObsInt = 1;
+ int i = 0;
+ while(isChangingObsInt) {
+ osEvent evt = obsint_q.get();
+ if(evt.status == osEventMessage) {
+ key = (char)evt.value.p;
+ if(key != '\r' && i < 7 ){
+ newObsInt[i] = key;
+ i++;
+ } else if((key == '\r') && (i > 0)) {
+ int obsint;
+ newObsInt[i] = '\0';
+ sscanf(newObsInt, "%d", &obsint);
+ observation_interval = (obsint > 0 ) ? obsint: 1;
+ 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);
+
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);
+
heartmodeTid = osThreadCreate(osThread(randommode), NULL);
// heartmodeTid = osThreadCreate(osThread(testmode), NULL);
// heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
+
// lcd.printf();
while(true) {
// while(pc.readable()) {
@@ -643,6 +780,7 @@
apace_led = 0;
vpace_led = 0;
+
heartmodeTid = osThreadCreate(osThread(randommode), NULL);
// Thread::wait(100);
break;
@@ -657,6 +795,7 @@
apace_led = 0;
vpace_led = 0;
+
heartmodeTid = osThreadCreate(osThread(testmode), NULL);
break;
case('m'):
@@ -670,13 +809,15 @@
apace_led = 0;
vpace_led = 0;
+
heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
manual_mode = 1;
+
break;
case('o'):
- isChangingObsInt = 1;
- lcd.printf("O");
+ lcd.printf("modeO");
+ obsinterval();
break;
}
}