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 PacemakerController by
Revision 23:08456978fb78, committed 2015-11-30
- Comitter:
- lucastai
- Date:
- Mon Nov 30 21:47:20 2015 +0000
- Parent:
- 20:dc272bfaa276
- Child:
- 24:81cd9ef5c4f6
- Commit message:
- testing random heart;
Changed in this revision
| PMTest.cpp | Show annotated file Show diff for this revision Revisions of this file |
| PacemakerController.cpp.orig | Show annotated file Show diff for this revision Revisions of this file |
--- a/PMTest.cpp Mon Nov 30 21:38:54 2015 +0000
+++ b/PMTest.cpp Mon Nov 30 21:47:20 2015 +0000
@@ -11,30 +11,67 @@
int timer_count;
int curr_test;
+int minwaitV;
+int minwaitA;
+
+int needs_num_input = 0;
+
+struct mode{RANDOM,MANUAL,TEST};
+mode curr_mode = RANDOM;
+Timer t;
int[][] testfunc;
-// hardware interrupt handler, adapted from code in piazza post by Dagaen
-extern "C" void TIMER0_IRQHandler (void)
-{
-if((LPC_TIM0->IR & 0x01) == 0x01) // if MR0 interrupt, proceed
- {
- LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag
- timer_count++; //increment timer_count
+
+
+
+void random_heart(){
+ t.reset();
+ t.start();
+
+ while(curr_mode == RANDOM){
+ int r = rand();
+
+ if(r%2 == 0){
+ if(t.read() > minwaitA){
+ asense = 1;
+ Thread::wait(10);
+ asense = 0;
+ }
+ }else{
+ if(t.read() > minwaitV){
+ vsense = 1;
+ Thread::wait(10);
+ vsense = 0;
+ }
+ }
+
+
+ t.reset();
+
}
}
-
-// init the hardware interrupt (timer0), adapted same as above
-void timer0_init(int n)
-{
- LPC_SC->PCONP |=1<1; //timer0 power on
- LPC_SC-> PCLKSEL0 |= 1 << 2; // set timer clock to CCLCK nondivided (1 clock cycle = 1 increment)
- LPC_TIM0->MR0 = n; //100mhz clock cycle, 1 cycle = 10ns, 10ms = 10 000 000 ns = 1M cycles
- LPC_TIM0->MCR = 3; //interrupt and reset control
- //3 = Interrupt & reset timer0 on match (111) sets all three bits
- NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt
+
+
+void kbd_intrp(){
+ char a = pc.getc();
+
+ if(needs_num_input){
+ // DO O handling
+ needs_num_input = 0;
+ return;
+ }
+
+ if(a = 'R'){
+ curr_mode = RANDOM;
+ }
+
+
+
}
+
+
// interrupt function
void interrupt_and_run_test(){
// zero timer, set for 1ms interrupt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PacemakerController.cpp.orig Mon Nov 30 21:47:20 2015 +0000
@@ -0,0 +1,242 @@
+#include "mbed.h"
+#include "LPC17xx.h"
+#include "TextLCD.h"
+#include "rtos.h"
+#include "Thread.h"
+using namespace rtos;
+
+
+// This is for the pacemaker
+volatile unsigned short timer_count;
+Serial pc(USBTX, USBRX);
+TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD20x4); // rs, e, d4-d7
+
+int keyboard_needs_numeric = 0; // boolean - is in middle of interval input?
+
+int h_clock;
+int pm_clock;
+Timer avi_clock;
+
+int LRI = 1000;
+int AVI = 150;
+int PVARP = 300;
+int VRP = 200;
+
+// constants
+int MAX_PM_RT = 180;
+int MIN_PM_RT = 40;
+enum mode {NORMAL, SLEEP, EXERCISE, MANUAL};
+
+// counters
+int beats = 0;
+
+// state variables
+int upper_bound = 100;
+int lower_bound = 40;
+int obs_int = 10;
+mode curr_mode = NORMAL;
+
+// alarms
+DigitalOut led_apace(LED1);
+DigitalOut led_vpace(LED2);
+DigitalOut Asense(LED3);
+DigitalOut Vsense(LED4);
+
+DigitalOut apace(p22):
+ DigitalOut vpace(p21):
+
+// hardware interrupt handler, adapted from code in piazza post by Dagaen
+ extern "C" void TIMER0_IRQHandler (void)
+{
+ if((LPC_TIM0->IR & 0x01) == 0x01) { // if MR0 interrupt, proceed
+ LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag
+ timer_count++; //increment timer_count
+ }
+}
+
+// init the hardware interrupt (timer0), adapted same as above
+void timer0_init(void)
+{
+ LPC_SC->PCONP |=1<1; //timer0 power on
+ LPC_SC-> PCLKSEL0 |= 1 << 2; // set timer clock to CCLCK nondivided (1 clock cycle = 1 increment)
+ LPC_TIM0->MR0 = 1000000; //100mhz clock cycle, 1 cycle = 10ns, 10ms = 10 000 000 ns = 1M cycles
+ LPC_TIM0->MCR = 3; //interrupt and reset control
+ //3 = Interrupt & reset timer0 on match (111) sets all three bits
+ NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt
+}
+
+
+void PM_ALARM(void const *argument)
+{
+
+ // min hr alarm
+ if( beats < MIN_PM_RT) {
+ lcd.locate(0,1);
+ lcd.printf("!<");
+ }
+
+ // max hr alarm
+ if(beats > MAX_PM_RT) {
+ lcd.locate(0,1);
+ lcd.printf("!>");
+ }
+
+}
+
+// hw interrupt callback, deal with the keyboard input from PC
+void keyboard_handler()
+{
+
+ // get the char, put it on the PC command line
+ char a = pc.getc();
+
+ if (keyboard_needs_numeric) {
+ if (a >= '0' && a <= '9') {
+ // update observation interval
+ obs_int = (a - '0' + 1) * 5;
+ } else {
+ pc.printf("Expected numeric key\n");
+ }
+ } else if(a == 'N') {
+ // if the char is N, update bounds to normal mode
+ curr_mode = NORMAL;
+ upper_bound = 100;
+ lower_bound = 40;
+ pc.printf("MODE IS N\n");
+ // if the char is S, set bounds to sleep
+ } else if (a == 'S') {
+ curr_mode = SLEEP;
+ upper_bound = 60;
+ lower_bound = 30;
+ pc.printf("MODE IS S\n");
+ // if the char is E, set bounds to exercise
+ } else if (a == 'E') {
+ curr_mode = EXERCISE;
+ upper_bound = 175;
+ lower_bound = 100;
+ pc.printf("MODE IS E\n");
+ beats = 2;
+ // if the char is M, set to manual
+ } else if (a == 'M') {
+ curr_mode = MANUAL;
+ upper_bound = 175;
+ lower_bound = 30;
+ beats = 300;
+ pc.printf("MODE IS MANUAL\n");
+ // check for A if mode is manual
+ } else if (a == 'A') {
+ if(curr_mode == MANUAL) {
+ pc.printf("MODE IS MANUAL GOT APACE\n");
+ }
+ // check for V is mode is manual
+ } else if (a == 'V') {
+ if(curr_mode == MANUAL) {
+ pc.printf("MODE IS MANUAL GOT VPACE\n");
+ }
+ } else if (a == 'O') {
+ keyboard_needs_numeric = 1;
+ } else {
+ // do nothing for invalid char
+ }
+
+
+}
+
+void pm_sense()
+{
+
+ while(1) {
+
+ if (timer_count >= VRP) {
+ //wait for Vget;
+ timer_count = 0;
+ // do something with Vsense!
+ } else if (timer_count < VRP) {
+ // wait for Vget
+ }
+
+ if (timer_count < PVARP) {
+ // wait for Aget?
+ } else if (timer_count >= PVARP) {
+ // wait for Aget?
+ // do something with Asense!
+ }
+
+ }
+}
+
+void pm_response()
+{
+
+ while(1) {
+ if (timer_count >= LRI-AVI) {
+
+ // PM_A! sets the LED high
+ led_apace = 1;
+
+ // avi_clk = 0
+ avi_clk.reset();
+
+ apace();
+ // At Atrial Event State
+ while (avi_clk.read() < AVI);
+
+ // Ventricular Event
+ timer_count = 0;
+
+ // PM_V! sets the LED high
+ led_vpace = 1;
+
+ timer_count = 0;
+ vpace();
+ } else if (timer_count < LRI - AVI) {
+
+ // avi_clk = 0
+ avi_clk.reset();
+
+ // wait for Asense? naaah
+ }
+ }
+}
+
+void apace()
+{
+
+ apace = 1;
+ led_apace = 1;
+ Thread::wait(10);
+ apace = 0;
+
+}
+
+void vpace()
+{
+
+ vpace = 1;
+ led_vpace = 1;
+ Thread::wait(10);
+ vpace = 0;
+
+}
+
+
+int main()
+{
+ // https://developer.mbed.org/users/chadnach1/code/PacemakerController/
+ // connect the serial device (PC keybd) to the interrupt
+ pc.attach(&keyboard_handler);
+
+ // Start LED's Off
+ led_apace = 0;
+ led_vpace = 0;
+
+ // Start the avi_clock
+ avi_clk.start();
+
+ Thread t3(pm_sense);
+ Thread t4(pm_response);
+
+ Thread t2(PM_ALARM);
+ Thread t5();
+
+}
\ No newline at end of file
