improved accuracy
Dependencies: TextLCD mbed-rtos mbed
Fork of pacemaker_v2 by
Revision 0:cd6f505d57da, committed 2014-12-02
- Comitter:
- jfields
- Date:
- Tue Dec 02 22:01:20 2014 +0000
- Commit message:
- updated pacemaker code (more accurate than v1)
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD.lib Tue Dec 02 22:01:20 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/TextLCD/#308d188a2d3a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Dec 02 22:01:20 2014 +0000
@@ -0,0 +1,238 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "TextLCD.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define RUN 0x1
+
+TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
+Serial pc (USBTX, USBRX);
+
+// LEDs
+DigitalOut leds[] = {LED1, LED2, LED3, LED4}; // 1 = VP, 2 = AP, 3 = AS, 4 = VS
+
+// create log file and debugging vars
+//LocalFileSystem local("local");
+//FILE *fp = fopen("/local/out.txt", "w");
+int between_a = 0;
+int between_v = 0;
+
+// Heart Signals
+int AG = 0;
+int VG = 0;
+
+// Normal Values
+const int N_PVARP = 325; // ms
+const int N_VRP = 300; // ms
+const int N_LRI = 857; // ms (= about 70ppm)
+const int N_AVI = 65; // ms
+const int N_UB = 100; // 100ppm
+const int N_LB = 40; // 40ppm
+
+// Heart Values - Normal Mode is default
+int PVARP = N_PVARP;
+int VRP = N_VRP;
+int LRI = N_LRI;
+int default_LRI = N_LRI;
+int AVI = N_AVI;
+int UB = N_UB;
+int LB = N_LB;
+
+// time vars
+Timer global_t;
+int isVRP = 0;
+int isPVARP = 0;
+int waitingForV = 1;
+
+// functions
+void VP_func(void const *args);
+void AP_func(void const *args);
+void VS_func(void const *args);
+void AS_func(void const *args);
+void PM_monitor_func(void const *args);
+void manage_signals(void const *i);
+void flashLED(int i);
+void event_out(char *s, int between_t);
+void blind();
+//void rand_heart_func(void const *args);
+
+// threads
+Thread * VS_thread;
+Thread * AS_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 * exit_timer; // for log file
+
+int main() {
+
+ // start global timer
+ global_t.start();
+
+ // init threads
+ VS_thread = new Thread(VS_func);
+ AS_thread = new Thread(AS_func);
+ //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);
+ 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
+ VP_timer->start(AVI);
+ //exit_timer->start(60000);
+
+ // main thread
+ while (1) {
+
+ }
+}
+
+void manage_signals(void const *i) {
+ if ((int)i==1) isVRP = 0;
+ if ((int)i==2) isPVARP = 0;
+
+ // for debuggging
+ //if ((int)i==99) {
+ //fclose(fp);
+ //exit(1);
+ //}
+}
+
+void AP_func(void const *args) {
+
+ // start VP timer
+ VP_timer->start(AVI);
+
+ // update state
+ waitingForV = 1;
+
+ // output
+ event_out("AP",between_a);
+ between_a = global_t.read_ms();
+
+ // flash LED
+ flashLED(2);
+}
+
+void VP_func(void const *args) {
+
+ // start AP timer
+ AP_timer->start(LRI-AVI);
+
+ // update state
+ waitingForV = 0;
+
+ // set VRP, PVARP
+ blind();
+
+ // output
+ event_out("VP", between_v);
+ between_v = global_t.read_ms();
+
+ // flash LED
+ flashLED(1);
+}
+
+void AS_func(void const *args) {
+ while (1) {
+
+ // wait for event
+ Thread::signal_wait(RUN,osWaitForever);
+
+ // update state
+ waitingForV = 1;
+
+ // stop AP timer and start VP timer
+ AP_timer->stop();
+ VP_timer->start(AVI);
+
+ // output
+ event_out("AS", between_a);
+ between_a = global_t.read_ms();
+
+ // flash LED
+ flashLED(3);
+ }
+}
+
+void VS_func(void const *args) {
+ while (1) {
+
+ // wait for event
+ Thread::signal_wait(RUN,osWaitForever);
+
+ // update state
+ waitingForV = 0;
+
+ // stop VP timer and start AP timer
+ VP_timer->stop();
+ AP_timer->start(LRI-AVI);
+
+ // set VRP, PVARP
+ blind();
+
+ // output
+ event_out("VS", between_v);
+ between_v = global_t.read_ms();
+
+ // flash LED
+ flashLED(4);
+ }
+}
+
+/*
+ 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;
+ }
+ }
+ */
+
+void PM_monitor_func(void const *args) {
+ while (1) {
+ if (AG == 1) {
+ //fprintf(fp,"%f\tAget\t%d\n",global_t.read_ms(),isPVARP);
+ AG = 0;
+ if (!isPVARP && !waitingForV) AS_thread->signal_set(RUN);
+ }
+ if (VG == 1) {
+ //fprintf(fp,"%f\tVget\t%d\n",global_t.read_ms(),isVRP);
+ VG = 0;
+ if (!isVRP && waitingForV) VS_thread->signal_set(RUN);
+ }
+ }
+}
+
+void flashLED(int i) {
+ leds[i-1] = 1;
+ wait(0.01);
+ leds[i-1] = 0;
+}
+
+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);
+ //fprintf(fp, "%f\t%s\t%f\n",global_t.read_ms(),s,global_t.read_ms()-between_t);
+}
+
+void blind() {
+ isVRP = 1;
+ isPVARP = 1;
+ VRP_timer->start(VRP);
+ PVARP_timer->start(PVARP);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Tue Dec 02 22:01:20 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#f1ef95efa5ad
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Dec 02 22:01:20 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/4fc01daae5a5 \ No newline at end of file
