comm with heart
Dependencies: TextLCD mbed-rtos mbed
Fork of pacemaker_v3 by
Revision 2:1e42b5fdf9e9, committed 2014-12-03
- Comitter:
- jfields
- Date:
- Wed Dec 03 02:32:50 2014 +0000
- Parent:
- 1:9d463bc2b7b9
- Commit message:
- code for dual mbed mode
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Tue Dec 02 22:20:46 2014 +0000
+++ b/main.cpp Wed Dec 03 02:32:50 2014 +0000
@@ -6,12 +6,15 @@
#define RUN 0x1
-// pins 5,6 for AGet
-// pins 7,8 for Vpace
-
TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
Serial pc (USBTX, USBRX);
+// ports
+DigitalIn VGet(p11);
+DigitalIn AGet(p12);
+DigitalOut VPace(p13);
+DigitalOut APace(p14);
+
// LEDs
DigitalOut leds[] = {LED1, LED2, LED3, LED4}; // 1 = VP, 2 = AP, 3 = AS, 4 = VS
@@ -25,6 +28,12 @@
int AG = 0;
int VG = 0;
+// heart rate global vars
+int HR = 0;
+int beats = 0;
+int sampleRate = 10000; // default 10 seconds
+int firstSample = 1;
+
// Normal Values
const int N_PVARP = 325; // ms
const int N_VRP = 300; // ms
@@ -58,19 +67,25 @@
void flashLED(int i);
void event_out(char *s, int between_t);
void blind();
-void rand_heart_func(void const *args);
+//void rand_heart_func(void const *args);
+void calcHR(void const *args);
+void disp(void const *args);
+void send_Apace();
+void send_Vpace();
// threads
Thread * VS_thread;
Thread * AS_thread;
Thread * PM_monitor_thread;
-Thread * rand_heart_thread; // just for testing until mbed connection is made
+Thread * disp_thread;
+//Thread * rand_heart_thread; // just for testing until mbed connection is made
// rtos timers
RtosTimer * VP_timer;
RtosTimer * AP_timer;
RtosTimer * VRP_timer;
RtosTimer * PVARP_timer;
+RtosTimer * HR_timer;
//RtosTimer * exit_timer; // for log file
int main() {
@@ -81,18 +96,22 @@
// init threads
VS_thread = new Thread(VS_func);
AS_thread = new Thread(AS_func);
+ disp_thread = new Thread(disp);
PM_monitor_thread = new Thread(PM_monitor_func);
- rand_heart_thread = new Thread(rand_heart_func); // just for testing until mbed connection is made
+ //rand_heart_thread = new Thread(rand_heart_func); // just for testing until mbed connection is made
// init timers
VP_timer = new RtosTimer(VP_func, osTimerOnce, (void *)0);
AP_timer = new RtosTimer(AP_func, osTimerOnce, (void *)0);
+ HR_timer = new RtosTimer(calcHR, osTimerPeriodic, (void *)0);
VRP_timer = new RtosTimer(manage_signals, osTimerOnce, (void *)1);
PVARP_timer = new RtosTimer(manage_signals, osTimerOnce, (void *)2);
//exit_timer = new RtosTimer(manage_signals, osTimerOnce, (void *)99);
- // init global time, VP thread, exit thread
+ // init VP thread, HR timer, display timer
VP_timer->start(AVI);
+ HR_timer->start(sampleRate);
+ disp_thread->signal_set(RUN);
//exit_timer->start(60000);
// main thread
@@ -101,6 +120,21 @@
}
}
+void calcHR(void const *args) {
+
+ // calc
+ if (firstSample == 1) {
+ HR = beats*(60000/sampleRate);
+ firstSample = 0;
+ }
+ else {
+ HR = (beats*60000/sampleRate+HR)/2;
+ }
+
+ // display
+ disp_thread->signal_set(RUN);
+}
+
void manage_signals(void const *i) {
if ((int)i==1) isVRP = 0;
if ((int)i==2) isPVARP = 0;
@@ -117,6 +151,9 @@
// start VP timer
VP_timer->start(AVI);
+ // send Apace
+ send_Apace();
+
// update state
waitingForV = 1;
@@ -133,10 +170,13 @@
// start AP timer
AP_timer->start(LRI-AVI);
+ // send Vpace
+ send_Vpace();
+
// update state
waitingForV = 0;
- // set VRP, PVARP
+ // set VRP, PVARP, update beats
blind();
// output
@@ -194,31 +234,36 @@
}
}
+/*
void rand_heart_func(void const *args) {
- int interval;
- srand(time(NULL));
- while (1) {
- interval = rand()%5000+10;
- //fprintf(fp,"interval = %d\n",interval);
- Thread::wait(interval);
- if (interval%2) AG = 1;
- else
- VG = 1;
- }
+ int interval;
+ srand(time(NULL));
+ while (1) {
+ interval = rand()%5000+10;
+ //fprintf(fp,"interval = %d\n",interval);
+ Thread::wait(interval);
+ if (interval%2) AG = 1;
+ else
+ VG = 1;
}
-
+ }
+ */
void PM_monitor_func(void const *args) {
while (1) {
- if (AG == 1) {
+ if (AGet == 1) {
//fprintf(fp,"%f\tAget\t%d\n",global_t.read_ms(),isPVARP);
- AG = 0;
+ //AG = 0;
if (!isPVARP && !waitingForV) AS_thread->signal_set(RUN);
+ wait(0.1);
+ while(AGet == 1);
}
- if (VG == 1) {
+ if (VGet == 1) {
//fprintf(fp,"%f\tVget\t%d\n",global_t.read_ms(),isVRP);
- VG = 0;
+ //VG = 0;
if (!isVRP && waitingForV) VS_thread->signal_set(RUN);
+ wait(0.1);
+ while(VGet == 1);
}
}
}
@@ -230,13 +275,34 @@
}
void event_out(char *s, int between_t) {
- lcd.printf("%d\t%s\t%d\n",global_t.read_ms(),s,global_t.read_ms()-between_t);
+ //lcd.printf("%d\t%s\t%d\n",global_t.read_ms(),s,global_t.read_ms()-between_t);
//fprintf(fp, "%f\t%s\t%f\n",global_t.read_ms(),s,global_t.read_ms()-between_t);
}
void blind() {
+ beats++;
isVRP = 1;
isPVARP = 1;
VRP_timer->start(VRP);
PVARP_timer->start(PVARP);
}
+
+void disp(void const *args) {
+ while (1) {
+ Thread::signal_wait(RUN,osWaitForever);
+ lcd.printf("HR = %d ppm\nCyle = %d s\n",HR,sampleRate/1000);
+ beats = 0;
+ }
+}
+
+void send_Apace() {
+ APace = 1;
+ Thread::wait(50);
+ APace = 0;
+}
+
+void send_Vpace() {
+ VPace = 1;
+ Thread::wait(50);
+ VPace = 0;
+}
