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 2:5e9c4d83d038, committed 2015-11-28
- Comitter:
- lucastai
- Date:
- Sat Nov 28 19:34:39 2015 +0000
- Parent:
- 1:979e9e785549
- Child:
- 3:44d132582373
- Commit message:
- Alarm, Mode working
Changed in this revision
--- a/PMTest.cpp Tue Nov 24 23:19:34 2015 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#include "mbed.h"
-
-// This represents the heart
-DigitalOut myled(LED1);
-int p_clock;
-
-
-
-void timer0_init(void)
-{
- LPC_SC->PCONP |=1<1; //timer0 power on
- LPC_TIM0->MR0 = 239800; //10 msec
- LPC_TIM0->MCR = 3; //interrupt and reset control
- //3 = Interrupt & reset timer0 on match
- //1 = Interrupt only, no reset of timer0
- NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt
- LPC_TIM0->TCR = 1; //enable Timer0
-}
-
-int main() {
- while(1) {
- myled = 1;
- wait(0.2);
- myled = 0;
- wait(0.2);
- }
-}
--- a/PacemakerController.cpp Tue Nov 24 23:19:34 2015 +0000
+++ b/PacemakerController.cpp Sat Nov 28 19:34:39 2015 +0000
@@ -1,34 +1,142 @@
#include "mbed.h"
+#include "LPC17xx.h"
+#include "TextLCD.h"
+#include "rtos.h"
+#include "Thread.h"
+using namespace rtos;
+
// This is for the pacemaker
-TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
+volatile unsigned short timer_count;
+Serial pc(USBTX, USBRX);
+TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD20x4); // rs, e, d4-d7
+
int h_clock;
-void A_Pace() {
-
+
+// 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 Apace(LED1);
+DigitalOut Vpace(LED2);
+DigitalOut Asense(LED3);
+DigitalOut Vsense(LED4);
+
+// 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 A_Pace() {
+
+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("!>");
+ }
}
-void timer0_init(void)
-{
- LPC_SC->PCONP |=1<1; //timer0 power on
- LPC_TIM0->MR0 = 239800; //10 msec
- LPC_TIM0->MCR = 3; //interrupt and reset control
- //3 = Interrupt & reset timer0 on match
- //1 = Interrupt only, no reset of timer0
- NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt
- LPC_TIM0->TCR = 1; //enable Timer0
+// hw interrupt callback, deal with the keyboard input from PC
+void MODE_SWITCH() {
+
+ // get the char, put it on the PC command line
+ char a = pc.getc();
+
+ // if the char is N, update bounds to normal mode
+ if(a == 'N'){
+ 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{
+ // do nothing for invalid char
+ }
+
+
+}
+
+
+
+void apace() {
+
+}
+
+void vpace() {
+
}
int main() {
- while(1) {
- myled = 1;
- wait(0.2);
- myled = 0;
- wait(0.2);
- }
+ // connect the serial device (PC keybd) to the interrupt
+ pc.attach(&MODE_SWITCH);
+
+ //Thread t3(PM_ALARM);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD.lib Sat Nov 28 19:34:39 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/TextLCD/#308d188a2d3a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Sat Nov 28 19:34:39 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#6c35e082773a
