
the complete model of the heart model
Dependencies: TextLCD mbed-rtos mbed
Fork of heart by
main.cpp@2:b4551e56cd1c, 2016-11-30 (annotated)
- Committer:
- shengtiz
- Date:
- Wed Nov 30 03:45:47 2016 +0000
- Revision:
- 2:b4551e56cd1c
- Parent:
- 1:6ad7b5bf9c27
- Child:
- 3:5941bb3c4fc2
3rd commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
williamrchr | 0:08412491e70f | 1 | #include "mbed.h" |
williamrchr | 0:08412491e70f | 2 | #include "rtos.h" |
williamrchr | 0:08412491e70f | 3 | #include "TextLCD.h" |
shengtiz | 1:6ad7b5bf9c27 | 4 | #include <time.h> |
shengtiz | 1:6ad7b5bf9c27 | 5 | #include <stdlib.h> |
williamrchr | 0:08412491e70f | 6 | |
shengtiz | 2:b4551e56cd1c | 7 | //use screen /dev/tty.. on mac in terminal to receive input |
shengtiz | 2:b4551e56cd1c | 8 | |
williamrchr | 0:08412491e70f | 9 | TextLCD lcd(p15,p16,p17,p18,p19,p20,TextLCD::LCD16x2); |
williamrchr | 0:08412491e70f | 10 | Serial pc(USBTX, USBRX); //set up serial |
williamrchr | 0:08412491e70f | 11 | DigitalOut natAPace(LED1); //leds for pacing |
williamrchr | 0:08412491e70f | 12 | DigitalOut natVPace(LED2); |
williamrchr | 0:08412491e70f | 13 | DigitalOut aPace(LED3); |
williamrchr | 0:08412491e70f | 14 | DigitalOut vPace(LED4); |
williamrchr | 0:08412491e70f | 15 | DigitalOut alarm(p5); //pin for alarm |
williamrchr | 0:08412491e70f | 16 | |
williamrchr | 0:08412491e70f | 17 | DigitalOut a_signal(p6); //connected to pm |
williamrchr | 0:08412491e70f | 18 | DigitalOut v_signal(p7); //connected to pm |
williamrchr | 0:08412491e70f | 19 | |
williamrchr | 0:08412491e70f | 20 | unsigned int a_time = 0; |
williamrchr | 0:08412491e70f | 21 | unsigned int v_time = 0; |
williamrchr | 0:08412491e70f | 22 | |
williamrchr | 0:08412491e70f | 23 | int mode = 0; //0 = random, 1 = manual, 2 = test |
shengtiz | 2:b4551e56cd1c | 24 | int modeInManul = -1; //0 = manualmode apace, 1 = manualmode vpace |
shengtiz | 2:b4551e56cd1c | 25 | bool modeSwitch = false; |
williamrchr | 0:08412491e70f | 26 | //constants |
williamrchr | 0:08412491e70f | 27 | |
shengtiz | 2:b4551e56cd1c | 28 | const int minwait_A = 100; |
shengtiz | 2:b4551e56cd1c | 29 | const int minwait_V = 200; |
shengtiz | 2:b4551e56cd1c | 30 | |
shengtiz | 2:b4551e56cd1c | 31 | /* |
williamrchr | 0:08412491e70f | 32 | const int LRI = 1000; |
williamrchr | 0:08412491e70f | 33 | const int VRP = 400; |
williamrchr | 0:08412491e70f | 34 | const int PVARP = 500; |
williamrchr | 0:08412491e70f | 35 | const int URI = 1000; |
williamrchr | 0:08412491e70f | 36 | const int AVI = 100; |
shengtiz | 2:b4551e56cd1c | 37 | */ |
williamrchr | 0:08412491e70f | 38 | |
williamrchr | 0:08412491e70f | 39 | void switch_modes() { |
williamrchr | 0:08412491e70f | 40 | switch(mode) { |
williamrchr | 0:08412491e70f | 41 | case 0: |
williamrchr | 0:08412491e70f | 42 | break; |
williamrchr | 0:08412491e70f | 43 | case 1: |
williamrchr | 0:08412491e70f | 44 | break; |
williamrchr | 0:08412491e70f | 45 | case 2: |
williamrchr | 0:08412491e70f | 46 | break; |
williamrchr | 0:08412491e70f | 47 | |
williamrchr | 0:08412491e70f | 48 | } |
williamrchr | 0:08412491e70f | 49 | } |
williamrchr | 0:08412491e70f | 50 | |
williamrchr | 0:08412491e70f | 51 | |
williamrchr | 0:08412491e70f | 52 | void received_apace() { |
williamrchr | 0:08412491e70f | 53 | //TODO: DO |
williamrchr | 0:08412491e70f | 54 | aPace = 1; |
williamrchr | 0:08412491e70f | 55 | |
williamrchr | 0:08412491e70f | 56 | } |
williamrchr | 0:08412491e70f | 57 | |
williamrchr | 0:08412491e70f | 58 | void received_vpace() { |
williamrchr | 0:08412491e70f | 59 | //TODO: DO |
williamrchr | 0:08412491e70f | 60 | vPace = 1; |
williamrchr | 0:08412491e70f | 61 | |
williamrchr | 0:08412491e70f | 62 | } |
williamrchr | 0:08412491e70f | 63 | |
shengtiz | 2:b4551e56cd1c | 64 | |
shengtiz | 2:b4551e56cd1c | 65 | |
williamrchr | 0:08412491e70f | 66 | void send_signal(int type) { //type=0 a_signal, type=1 v_signal |
williamrchr | 0:08412491e70f | 67 | |
williamrchr | 0:08412491e70f | 68 | switch(type) { |
williamrchr | 0:08412491e70f | 69 | case 0: |
williamrchr | 0:08412491e70f | 70 | a_signal = 1; |
williamrchr | 0:08412491e70f | 71 | case 1: |
williamrchr | 0:08412491e70f | 72 | v_signal = 1; |
williamrchr | 0:08412491e70f | 73 | } |
williamrchr | 0:08412491e70f | 74 | //TODO: Determine if time is right (is this supposed to be minWait?) |
williamrchr | 0:08412491e70f | 75 | wait(1); |
shengtiz | 1:6ad7b5bf9c27 | 76 | //a_sense = 0; |
shengtiz | 1:6ad7b5bf9c27 | 77 | //v_sense = 0; |
williamrchr | 0:08412491e70f | 78 | } |
williamrchr | 0:08412491e70f | 79 | |
shengtiz | 2:b4551e56cd1c | 80 | void modeSwitchDelay(){ |
shengtiz | 2:b4551e56cd1c | 81 | //srand(time(NULL)); |
shengtiz | 2:b4551e56cd1c | 82 | //int time = rand()%9700 + 300; |
shengtiz | 2:b4551e56cd1c | 83 | Thread::wait(1000); |
shengtiz | 2:b4551e56cd1c | 84 | } |
shengtiz | 2:b4551e56cd1c | 85 | |
williamrchr | 0:08412491e70f | 86 | void heart_keyboard() { |
williamrchr | 0:08412491e70f | 87 | while(true) { //thread is continuously running |
williamrchr | 0:08412491e70f | 88 | if(pc.readable()) { |
williamrchr | 0:08412491e70f | 89 | char c = pc.getc(); |
williamrchr | 0:08412491e70f | 90 | |
williamrchr | 0:08412491e70f | 91 | switch(c) { |
williamrchr | 0:08412491e70f | 92 | case 'r': //set to random mode |
williamrchr | 0:08412491e70f | 93 | mode = 0; |
shengtiz | 2:b4551e56cd1c | 94 | modeSwitch = true; |
williamrchr | 0:08412491e70f | 95 | break; |
shengtiz | 2:b4551e56cd1c | 96 | case 'm': //mset to manual mode |
williamrchr | 0:08412491e70f | 97 | mode = 1; |
shengtiz | 2:b4551e56cd1c | 98 | modeSwitch = true; |
williamrchr | 0:08412491e70f | 99 | break; |
williamrchr | 0:08412491e70f | 100 | case 't': //set to test mode |
williamrchr | 0:08412491e70f | 101 | mode = 2; |
shengtiz | 2:b4551e56cd1c | 102 | modeSwitch = true; |
williamrchr | 0:08412491e70f | 103 | break; |
williamrchr | 0:08412491e70f | 104 | case 'a': //asignal |
shengtiz | 2:b4551e56cd1c | 105 | if(mode == 1) { //only if in manual (heart_mode == 1) |
shengtiz | 2:b4551e56cd1c | 106 | modeInManul = 0; |
williamrchr | 0:08412491e70f | 107 | } |
williamrchr | 0:08412491e70f | 108 | break; |
williamrchr | 0:08412491e70f | 109 | case 'v': //vsignal |
shengtiz | 2:b4551e56cd1c | 110 | if(mode == 1) { //only if in manual (heart_mode == 1) |
shengtiz | 2:b4551e56cd1c | 111 | modeInManul = 1; |
williamrchr | 0:08412491e70f | 112 | } |
williamrchr | 0:08412491e70f | 113 | break; |
williamrchr | 0:08412491e70f | 114 | default: //erroneous key get rid of it |
williamrchr | 0:08412491e70f | 115 | break; |
williamrchr | 0:08412491e70f | 116 | } |
williamrchr | 0:08412491e70f | 117 | } |
williamrchr | 0:08412491e70f | 118 | } |
williamrchr | 0:08412491e70f | 119 | } |
williamrchr | 0:08412491e70f | 120 | |
williamrchr | 0:08412491e70f | 121 | void tick() { |
williamrchr | 0:08412491e70f | 122 | a_time++; |
williamrchr | 0:08412491e70f | 123 | v_time++; |
williamrchr | 0:08412491e70f | 124 | } |
shengtiz | 1:6ad7b5bf9c27 | 125 | // Blink functions gets called when there is an Atrial/V entricular event. |
shengtiz | 1:6ad7b5bf9c27 | 126 | void natApaceBlink(){ |
shengtiz | 1:6ad7b5bf9c27 | 127 | natAPace = 1; |
shengtiz | 1:6ad7b5bf9c27 | 128 | Thread::wait(500); |
shengtiz | 1:6ad7b5bf9c27 | 129 | natAPace = 0; |
shengtiz | 1:6ad7b5bf9c27 | 130 | Thread::wait(500); |
shengtiz | 1:6ad7b5bf9c27 | 131 | } |
shengtiz | 1:6ad7b5bf9c27 | 132 | |
shengtiz | 1:6ad7b5bf9c27 | 133 | void natVpaceBlink(){ |
shengtiz | 1:6ad7b5bf9c27 | 134 | natVPace = 1; |
shengtiz | 1:6ad7b5bf9c27 | 135 | Thread::wait(500); |
shengtiz | 1:6ad7b5bf9c27 | 136 | natVPace = 0; |
shengtiz | 1:6ad7b5bf9c27 | 137 | Thread::wait(500); |
shengtiz | 1:6ad7b5bf9c27 | 138 | } |
shengtiz | 1:6ad7b5bf9c27 | 139 | |
shengtiz | 1:6ad7b5bf9c27 | 140 | void ApaceBlink(){ |
shengtiz | 1:6ad7b5bf9c27 | 141 | aPace = 1; |
shengtiz | 1:6ad7b5bf9c27 | 142 | Thread::wait(500); |
shengtiz | 1:6ad7b5bf9c27 | 143 | aPace = 0; |
shengtiz | 1:6ad7b5bf9c27 | 144 | Thread::wait(500); |
shengtiz | 1:6ad7b5bf9c27 | 145 | } |
shengtiz | 1:6ad7b5bf9c27 | 146 | |
shengtiz | 1:6ad7b5bf9c27 | 147 | void VpaceBlink(){ |
shengtiz | 1:6ad7b5bf9c27 | 148 | vPace = 1; |
shengtiz | 1:6ad7b5bf9c27 | 149 | Thread::wait(500); |
shengtiz | 1:6ad7b5bf9c27 | 150 | vPace = 0; |
shengtiz | 1:6ad7b5bf9c27 | 151 | Thread::wait(500); |
shengtiz | 1:6ad7b5bf9c27 | 152 | } |
shengtiz | 1:6ad7b5bf9c27 | 153 | |
shengtiz | 2:b4551e56cd1c | 154 | void performModeDelay(){ |
shengtiz | 2:b4551e56cd1c | 155 | if(modeSwitch == true){ |
shengtiz | 2:b4551e56cd1c | 156 | modeSwitchDelay(); |
shengtiz | 2:b4551e56cd1c | 157 | modeSwitch = false; |
shengtiz | 2:b4551e56cd1c | 158 | } |
shengtiz | 2:b4551e56cd1c | 159 | } |
shengtiz | 2:b4551e56cd1c | 160 | |
shengtiz | 1:6ad7b5bf9c27 | 161 | void Random(){ |
shengtiz | 1:6ad7b5bf9c27 | 162 | //TODO: heart behaviour in random mode |
shengtiz | 2:b4551e56cd1c | 163 | while(1){ |
shengtiz | 2:b4551e56cd1c | 164 | if(mode == 0){ |
shengtiz | 2:b4551e56cd1c | 165 | performModeDelay(); |
shengtiz | 2:b4551e56cd1c | 166 | //natApaceBlink(); |
shengtiz | 2:b4551e56cd1c | 167 | } |
shengtiz | 1:6ad7b5bf9c27 | 168 | } |
shengtiz | 1:6ad7b5bf9c27 | 169 | } |
shengtiz | 1:6ad7b5bf9c27 | 170 | |
shengtiz | 1:6ad7b5bf9c27 | 171 | void Manual(){ |
shengtiz | 1:6ad7b5bf9c27 | 172 | //TODO: heart behaviour in manual mode |
shengtiz | 2:b4551e56cd1c | 173 | while(1){ |
shengtiz | 2:b4551e56cd1c | 174 | if(mode == 1){ |
shengtiz | 2:b4551e56cd1c | 175 | performModeDelay(); |
shengtiz | 2:b4551e56cd1c | 176 | //natVpaceBlink(); |
shengtiz | 2:b4551e56cd1c | 177 | if(modeInManul == 0){ |
shengtiz | 2:b4551e56cd1c | 178 | ApaceBlink(); |
shengtiz | 2:b4551e56cd1c | 179 | modeInManul = -1; |
shengtiz | 2:b4551e56cd1c | 180 | } |
shengtiz | 2:b4551e56cd1c | 181 | |
shengtiz | 2:b4551e56cd1c | 182 | if(modeInManul == 1){ |
shengtiz | 2:b4551e56cd1c | 183 | VpaceBlink(); |
shengtiz | 2:b4551e56cd1c | 184 | modeInManul = -1; |
shengtiz | 2:b4551e56cd1c | 185 | } |
shengtiz | 2:b4551e56cd1c | 186 | } |
shengtiz | 1:6ad7b5bf9c27 | 187 | } |
shengtiz | 1:6ad7b5bf9c27 | 188 | } |
shengtiz | 1:6ad7b5bf9c27 | 189 | |
shengtiz | 1:6ad7b5bf9c27 | 190 | void Test(){ |
shengtiz | 1:6ad7b5bf9c27 | 191 | //TODO: heart behaviour in test mode |
shengtiz | 2:b4551e56cd1c | 192 | while(1){ |
shengtiz | 2:b4551e56cd1c | 193 | if(mode == 2){ |
shengtiz | 2:b4551e56cd1c | 194 | performModeDelay(); |
shengtiz | 2:b4551e56cd1c | 195 | //ApaceBlink(); |
shengtiz | 2:b4551e56cd1c | 196 | } |
shengtiz | 1:6ad7b5bf9c27 | 197 | } |
shengtiz | 1:6ad7b5bf9c27 | 198 | } |
shengtiz | 1:6ad7b5bf9c27 | 199 | |
williamrchr | 0:08412491e70f | 200 | int main() { |
williamrchr | 0:08412491e70f | 201 | //TODO: Set up threads |
shengtiz | 1:6ad7b5bf9c27 | 202 | Thread keyboard(heart_keyboard); |
shengtiz | 1:6ad7b5bf9c27 | 203 | //Note: only one of the following threads will be on duty when heart runs |
shengtiz | 1:6ad7b5bf9c27 | 204 | //and it is done through checking the mode the heart is in. |
shengtiz | 2:b4551e56cd1c | 205 | Thread random_(Random); |
shengtiz | 2:b4551e56cd1c | 206 | Thread manual_(Manual); |
shengtiz | 2:b4551e56cd1c | 207 | Thread test_(Test); |
shengtiz | 2:b4551e56cd1c | 208 | while(1); |
williamrchr | 0:08412491e70f | 209 | } |