Anurag Muglikar
/
pacemaker_new
Pacemaker models
main.cpp@9:9d028e2a7c61, 2018-12-12 (annotated)
- Committer:
- ncshy
- Date:
- Wed Dec 12 19:00:49 2018 +0000
- Revision:
- 9:9d028e2a7c61
- Parent:
- 8:1c786926bb66
Made final change for QoS1 and initial PACEMAKER statement
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hungnguyenm | 1:91e33a7fe0b5 | 1 | #define MQTTCLIENT_QOS2 1 |
hungnguyenm | 1:91e33a7fe0b5 | 2 | |
hungnguyenm | 1:91e33a7fe0b5 | 3 | #include "ESP8266Interface.h" |
hungnguyenm | 1:91e33a7fe0b5 | 4 | #include "MQTTNetwork.h" |
hungnguyenm | 1:91e33a7fe0b5 | 5 | #include "MQTTmbed.h" |
hungnguyenm | 1:91e33a7fe0b5 | 6 | #include "MQTTClient.h" |
anuragmuglikar | 2:c115d926cd17 | 7 | #include "TextLCD.h" |
anuragmuglikar | 2:c115d926cd17 | 8 | #include "mbed.h" |
anuragmuglikar | 2:c115d926cd17 | 9 | #include "time.h" |
anuragmuglikar | 2:c115d926cd17 | 10 | |
anuragmuglikar | 2:c115d926cd17 | 11 | #include <string.h> |
anuragmuglikar | 2:c115d926cd17 | 12 | #include <stdlib.h> |
anuragmuglikar | 2:c115d926cd17 | 13 | #include <deque> |
anuragmuglikar | 2:c115d926cd17 | 14 | |
anuragmuglikar | 2:c115d926cd17 | 15 | #define IAP_LOCATION 0x1FFF1FF1 |
anuragmuglikar | 2:c115d926cd17 | 16 | |
anuragmuglikar | 2:c115d926cd17 | 17 | // Serial port for debug |
anuragmuglikar | 2:c115d926cd17 | 18 | Serial pc(USBTX, USBRX); |
ncshy | 7:37476d579b53 | 19 | TextLCD LcdControl(p15,p16,p17,p18,p14,p20, TextLCD::LCD16x2); |
ncshy | 7:37476d579b53 | 20 | int LRI = 1100; |
ncshy | 7:37476d579b53 | 21 | int HRI = 1500; |
ncshy | 7:37476d579b53 | 22 | unsigned int case_count = 0; |
anuragmuglikar | 2:c115d926cd17 | 23 | |
anuragmuglikar | 2:c115d926cd17 | 24 | // Heart monitor window averaging variables |
anuragmuglikar | 2:c115d926cd17 | 25 | #define AVG_WINDOW 20 // Can be 20, 40, or 60 seconds |
anuragmuglikar | 2:c115d926cd17 | 26 | #define AVG_INTERVAL 5 // Can be 5, 10, 15, or 20 seconds |
anuragmuglikar | 2:c115d926cd17 | 27 | |
anuragmuglikar | 2:c115d926cd17 | 28 | |
anuragmuglikar | 3:dd4c984a642b | 29 | DigitalOut led_slow_alarm(LED3); |
anuragmuglikar | 3:dd4c984a642b | 30 | DigitalOut led_fast_alarm(LED4); |
anuragmuglikar | 3:dd4c984a642b | 31 | |
anuragmuglikar | 4:6da938edcb81 | 32 | DigitalOut senseBeatLED(LED1); |
anuragmuglikar | 4:6da938edcb81 | 33 | DigitalOut sendPaceLED(LED2); |
anuragmuglikar | 2:c115d926cd17 | 34 | |
anuragmuglikar | 2:c115d926cd17 | 35 | |
anuragmuglikar | 2:c115d926cd17 | 36 | DigitalOut pace_signal(p19); |
anuragmuglikar | 2:c115d926cd17 | 37 | InterruptIn receive_sense(p5); |
ncshy | 7:37476d579b53 | 38 | InterruptIn case1_sense(p21); |
ncshy | 7:37476d579b53 | 39 | InterruptIn case2_sense(p22); |
ncshy | 7:37476d579b53 | 40 | InterruptIn case3_sense(p23); |
ncshy | 7:37476d579b53 | 41 | |
hungnguyenm | 1:91e33a7fe0b5 | 42 | |
hungnguyenm | 1:91e33a7fe0b5 | 43 | ESP8266Interface wifi(p28, p27); |
hungnguyenm | 1:91e33a7fe0b5 | 44 | |
anuragmuglikar | 2:c115d926cd17 | 45 | // Defines for monitor |
anuragmuglikar | 2:c115d926cd17 | 46 | #define URL 100 //This is in bpm, not ms |
anuragmuglikar | 2:c115d926cd17 | 47 | #define RATE_ALARM 1 |
anuragmuglikar | 2:c115d926cd17 | 48 | #define PACE_ALARM 2 |
anuragmuglikar | 2:c115d926cd17 | 49 | #define PACE_THRESH 10 // Pretty arbitrary number |
anuragmuglikar | 2:c115d926cd17 | 50 | |
anuragmuglikar | 2:c115d926cd17 | 51 | int RI = 1500; |
anuragmuglikar | 2:c115d926cd17 | 52 | int VRP = 240; |
anuragmuglikar | 2:c115d926cd17 | 53 | bool hp_enable, hp; |
anuragmuglikar | 2:c115d926cd17 | 54 | bool sense_received = 0; |
anuragmuglikar | 2:c115d926cd17 | 55 | bool sense_flag = 0; |
anuragmuglikar | 2:c115d926cd17 | 56 | bool pace_sent = 0; |
anuragmuglikar | 2:c115d926cd17 | 57 | time_t start_time; |
anuragmuglikar | 2:c115d926cd17 | 58 | Timer timer; |
anuragmuglikar | 3:dd4c984a642b | 59 | Ticker indicator; |
anuragmuglikar | 3:dd4c984a642b | 60 | Ticker paceIndicator; |
anuragmuglikar | 2:c115d926cd17 | 61 | |
anuragmuglikar | 2:c115d926cd17 | 62 | /* pace_times is a subest of beat_times. I need all beats and paces to |
anuragmuglikar | 2:c115d926cd17 | 63 | * calculate the average heartrate, but only the number of paces to determine |
anuragmuglikar | 2:c115d926cd17 | 64 | * if the too slow alarm needs to go off. |
anuragmuglikar | 2:c115d926cd17 | 65 | */ |
anuragmuglikar | 2:c115d926cd17 | 66 | deque<time_t> beat_times; |
anuragmuglikar | 2:c115d926cd17 | 67 | deque<time_t> pace_times; |
anuragmuglikar | 2:c115d926cd17 | 68 | |
lklang | 6:69ce22d142d6 | 69 | // The number of times each alarm has occured |
lklang | 6:69ce22d142d6 | 70 | unsigned int rate_alarm_count = 0; |
lklang | 6:69ce22d142d6 | 71 | unsigned int pace_alarm_count = 0; |
lklang | 6:69ce22d142d6 | 72 | |
lklang | 6:69ce22d142d6 | 73 | // Threads |
anuragmuglikar | 2:c115d926cd17 | 74 | Thread pacemaker_thread; |
anuragmuglikar | 2:c115d926cd17 | 75 | Thread monitor_observe; |
anuragmuglikar | 2:c115d926cd17 | 76 | Thread monitor_calculate; |
anuragmuglikar | 2:c115d926cd17 | 77 | |
anuragmuglikar | 2:c115d926cd17 | 78 | |
anuragmuglikar | 2:c115d926cd17 | 79 | const char* hostname = "broker.hivemq.com"; |
anuragmuglikar | 2:c115d926cd17 | 80 | int port = 1883; |
anuragmuglikar | 2:c115d926cd17 | 81 | char* topic = "sectopic"; |
anuragmuglikar | 2:c115d926cd17 | 82 | char* rTopic = "sectopic"; |
anuragmuglikar | 2:c115d926cd17 | 83 | MQTTNetwork network(&wifi); |
anuragmuglikar | 2:c115d926cd17 | 84 | MQTTNetwork mqttNetwork(network); |
anuragmuglikar | 2:c115d926cd17 | 85 | MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork); |
anuragmuglikar | 2:c115d926cd17 | 86 | MQTTPacket_connectData data = MQTTPacket_connectData_initializer; |
anuragmuglikar | 2:c115d926cd17 | 87 | MQTT::Message message; |
anuragmuglikar | 2:c115d926cd17 | 88 | char buf[100]; |
anuragmuglikar | 2:c115d926cd17 | 89 | |
anuragmuglikar | 2:c115d926cd17 | 90 | // This looks at the time difference in each element |
anuragmuglikar | 2:c115d926cd17 | 91 | // of both the pace and heartbeat queues and removes |
anuragmuglikar | 2:c115d926cd17 | 92 | // any which are too old, i.e. outside the averaging window time |
anuragmuglikar | 2:c115d926cd17 | 93 | void prune_lists(time_t new_time) |
anuragmuglikar | 2:c115d926cd17 | 94 | { |
anuragmuglikar | 2:c115d926cd17 | 95 | |
anuragmuglikar | 2:c115d926cd17 | 96 | // Only look at the front of the queues because elements are added |
anuragmuglikar | 2:c115d926cd17 | 97 | // already sorted |
anuragmuglikar | 2:c115d926cd17 | 98 | while (difftime(new_time, beat_times.front()) > AVG_WINDOW) |
anuragmuglikar | 2:c115d926cd17 | 99 | { |
anuragmuglikar | 2:c115d926cd17 | 100 | beat_times.pop_front(); |
anuragmuglikar | 2:c115d926cd17 | 101 | } |
anuragmuglikar | 2:c115d926cd17 | 102 | |
anuragmuglikar | 2:c115d926cd17 | 103 | while (difftime(new_time, pace_times.front()) > AVG_WINDOW) |
anuragmuglikar | 2:c115d926cd17 | 104 | { |
anuragmuglikar | 2:c115d926cd17 | 105 | pace_times.pop_front(); |
anuragmuglikar | 2:c115d926cd17 | 106 | } |
anuragmuglikar | 2:c115d926cd17 | 107 | |
anuragmuglikar | 2:c115d926cd17 | 108 | |
anuragmuglikar | 2:c115d926cd17 | 109 | } |
anuragmuglikar | 2:c115d926cd17 | 110 | |
anuragmuglikar | 2:c115d926cd17 | 111 | // Flash an LED for an alarm and send an MQTT message |
anuragmuglikar | 2:c115d926cd17 | 112 | // to the cloud |
anuragmuglikar | 2:c115d926cd17 | 113 | void monitor_alarm(int alarm) |
anuragmuglikar | 2:c115d926cd17 | 114 | { |
anuragmuglikar | 2:c115d926cd17 | 115 | int i; |
anuragmuglikar | 2:c115d926cd17 | 116 | Timer alarm_t; |
anuragmuglikar | 2:c115d926cd17 | 117 | alarm_t.start(); |
anuragmuglikar | 2:c115d926cd17 | 118 | if (alarm == RATE_ALARM) |
anuragmuglikar | 2:c115d926cd17 | 119 | { |
anuragmuglikar | 2:c115d926cd17 | 120 | for (i = 0; i < 3; i++) |
anuragmuglikar | 2:c115d926cd17 | 121 | { |
anuragmuglikar | 2:c115d926cd17 | 122 | |
anuragmuglikar | 2:c115d926cd17 | 123 | led_fast_alarm = 1; |
anuragmuglikar | 3:dd4c984a642b | 124 | while(alarm_t.read_ms() < 200*(i+1)); |
anuragmuglikar | 2:c115d926cd17 | 125 | led_fast_alarm = 0; |
anuragmuglikar | 2:c115d926cd17 | 126 | } |
lklang | 6:69ce22d142d6 | 127 | rate_alarm_count++; |
lklang | 6:69ce22d142d6 | 128 | sprintf(buf, "Fast Alarm :%d", rate_alarm_count); |
anuragmuglikar | 2:c115d926cd17 | 129 | pc.printf("Too fast\r\n"); |
anuragmuglikar | 2:c115d926cd17 | 130 | |
anuragmuglikar | 2:c115d926cd17 | 131 | } else if (alarm == PACE_ALARM) |
anuragmuglikar | 2:c115d926cd17 | 132 | { |
lklang | 6:69ce22d142d6 | 133 | pace_alarm_count++; |
lklang | 6:69ce22d142d6 | 134 | sprintf(buf, "Slow Alarm :%d", pace_alarm_count); |
anuragmuglikar | 2:c115d926cd17 | 135 | for (i = 0; i < 3; i++) |
anuragmuglikar | 2:c115d926cd17 | 136 | { |
anuragmuglikar | 2:c115d926cd17 | 137 | led_slow_alarm = 1; |
anuragmuglikar | 3:dd4c984a642b | 138 | while(alarm_t.read_ms() < 200*(i + 1)) ; |
anuragmuglikar | 2:c115d926cd17 | 139 | led_slow_alarm = 0; |
anuragmuglikar | 2:c115d926cd17 | 140 | } |
anuragmuglikar | 2:c115d926cd17 | 141 | pc.printf("Too slow\r\n"); |
anuragmuglikar | 3:dd4c984a642b | 142 | }else{ |
anuragmuglikar | 3:dd4c984a642b | 143 | sprintf(buf, "Normal :%d", 1); |
anuragmuglikar | 3:dd4c984a642b | 144 | } |
anuragmuglikar | 3:dd4c984a642b | 145 | message.qos = MQTT::QOS0; |
anuragmuglikar | 3:dd4c984a642b | 146 | message.retained = true; |
anuragmuglikar | 3:dd4c984a642b | 147 | message.dup = false; |
anuragmuglikar | 3:dd4c984a642b | 148 | message.payload = (void*)buf; |
anuragmuglikar | 3:dd4c984a642b | 149 | message.payloadlen = strlen(buf); |
anuragmuglikar | 3:dd4c984a642b | 150 | int rc = client.publish(topic, message); |
anuragmuglikar | 3:dd4c984a642b | 151 | |
ncshy | 9:9d028e2a7c61 | 152 | client.yield(100); |
anuragmuglikar | 3:dd4c984a642b | 153 | if(rc == 0){ |
anuragmuglikar | 3:dd4c984a642b | 154 | printf("Success PUB%d\n", rc); |
anuragmuglikar | 3:dd4c984a642b | 155 | }else{ |
anuragmuglikar | 3:dd4c984a642b | 156 | printf("Failed PUB%d\n", rc); |
anuragmuglikar | 3:dd4c984a642b | 157 | client.connect(data); |
anuragmuglikar | 2:c115d926cd17 | 158 | } |
anuragmuglikar | 2:c115d926cd17 | 159 | } |
anuragmuglikar | 2:c115d926cd17 | 160 | |
anuragmuglikar | 2:c115d926cd17 | 161 | |
anuragmuglikar | 2:c115d926cd17 | 162 | // This is a thread for the monitor which simply watches for new beats and |
anuragmuglikar | 2:c115d926cd17 | 163 | // paces and adds them to the queue(s) when they occur |
anuragmuglikar | 2:c115d926cd17 | 164 | void monitor_obs() |
anuragmuglikar | 2:c115d926cd17 | 165 | { |
anuragmuglikar | 2:c115d926cd17 | 166 | |
anuragmuglikar | 2:c115d926cd17 | 167 | time_t new_time; |
anuragmuglikar | 2:c115d926cd17 | 168 | |
anuragmuglikar | 2:c115d926cd17 | 169 | // Monitor just runs forever |
anuragmuglikar | 2:c115d926cd17 | 170 | while (1) { |
anuragmuglikar | 2:c115d926cd17 | 171 | |
anuragmuglikar | 3:dd4c984a642b | 172 | // Wait until you see a sense or pace |
anuragmuglikar | 3:dd4c984a642b | 173 | while (!sense_flag && !pace_sent) ; |
anuragmuglikar | 3:dd4c984a642b | 174 | |
anuragmuglikar | 2:c115d926cd17 | 175 | // Indicate if you saw a sense or a pace, then set the indicator back to |
anuragmuglikar | 2:c115d926cd17 | 176 | // 0 so that the current signal is not counted more than once |
anuragmuglikar | 2:c115d926cd17 | 177 | if (sense_flag) { |
anuragmuglikar | 2:c115d926cd17 | 178 | beat_times.push_back(time(NULL)); |
anuragmuglikar | 2:c115d926cd17 | 179 | sense_flag = 0; |
anuragmuglikar | 2:c115d926cd17 | 180 | } |
anuragmuglikar | 2:c115d926cd17 | 181 | if (pace_sent) { |
anuragmuglikar | 2:c115d926cd17 | 182 | new_time = time(NULL); |
anuragmuglikar | 2:c115d926cd17 | 183 | beat_times.push_back(new_time); |
anuragmuglikar | 2:c115d926cd17 | 184 | pace_times.push_back(new_time); |
anuragmuglikar | 2:c115d926cd17 | 185 | pace_sent = 0; |
anuragmuglikar | 2:c115d926cd17 | 186 | } |
anuragmuglikar | 2:c115d926cd17 | 187 | |
anuragmuglikar | 2:c115d926cd17 | 188 | } |
anuragmuglikar | 2:c115d926cd17 | 189 | } |
anuragmuglikar | 2:c115d926cd17 | 190 | |
anuragmuglikar | 2:c115d926cd17 | 191 | void monitor_calc() |
anuragmuglikar | 2:c115d926cd17 | 192 | { |
anuragmuglikar | 2:c115d926cd17 | 193 | time_t current_time; |
anuragmuglikar | 2:c115d926cd17 | 194 | time_t wait_start = time(NULL); |
anuragmuglikar | 2:c115d926cd17 | 195 | |
anuragmuglikar | 2:c115d926cd17 | 196 | int heart_rate; |
anuragmuglikar | 2:c115d926cd17 | 197 | int num_paces; |
ncshy | 9:9d028e2a7c61 | 198 | int normal_count = 0; |
anuragmuglikar | 3:dd4c984a642b | 199 | //printf("calc...\n"); |
anuragmuglikar | 2:c115d926cd17 | 200 | // I want to check the heart rate in bpm for the alarm, |
anuragmuglikar | 2:c115d926cd17 | 201 | // so if my window time is smaller than 60 seconds I want to have |
anuragmuglikar | 2:c115d926cd17 | 202 | // this window factor to scale it |
anuragmuglikar | 2:c115d926cd17 | 203 | int window_factor = 60 / AVG_WINDOW; |
anuragmuglikar | 2:c115d926cd17 | 204 | |
anuragmuglikar | 2:c115d926cd17 | 205 | // The monitor needs to wait for at least one full AVG_WINDOW |
anuragmuglikar | 2:c115d926cd17 | 206 | // before it starts to monitor the average heartrate or else |
anuragmuglikar | 2:c115d926cd17 | 207 | // it is going to give spurious low heartrate alarms |
anuragmuglikar | 2:c115d926cd17 | 208 | while (difftime(time(NULL),wait_start) < AVG_WINDOW); |
anuragmuglikar | 2:c115d926cd17 | 209 | |
anuragmuglikar | 2:c115d926cd17 | 210 | |
ncshy | 8:1c786926bb66 | 211 | message.qos = MQTT::QOS1; |
anuragmuglikar | 2:c115d926cd17 | 212 | while(1) { |
anuragmuglikar | 2:c115d926cd17 | 213 | //pc.printf("In monitor calc loop\r\n"); |
anuragmuglikar | 2:c115d926cd17 | 214 | // Get the current time and see if you need to prune any elements from |
anuragmuglikar | 2:c115d926cd17 | 215 | // your lists |
anuragmuglikar | 2:c115d926cd17 | 216 | current_time = time(NULL); |
anuragmuglikar | 2:c115d926cd17 | 217 | prune_lists(current_time); |
anuragmuglikar | 2:c115d926cd17 | 218 | |
anuragmuglikar | 2:c115d926cd17 | 219 | |
anuragmuglikar | 2:c115d926cd17 | 220 | // Find average heart rate and number of paces if it is time to, |
anuragmuglikar | 2:c115d926cd17 | 221 | // then set any necessary alarms |
anuragmuglikar | 2:c115d926cd17 | 222 | heart_rate = beat_times.size() * window_factor; |
anuragmuglikar | 2:c115d926cd17 | 223 | num_paces = pace_times.size(); |
anuragmuglikar | 2:c115d926cd17 | 224 | pc.printf("H.R = %d\r\n", heart_rate); |
anuragmuglikar | 2:c115d926cd17 | 225 | pc.printf("N.P = %d\r\n", num_paces); |
anuragmuglikar | 3:dd4c984a642b | 226 | sprintf(buf, "BPM :%d", heart_rate); |
ncshy | 7:37476d579b53 | 227 | LcdControl.cls(); |
ncshy | 7:37476d579b53 | 228 | LcdControl.printf("BPM: %03d TC:%d", heart_rate, case_count); |
anuragmuglikar | 2:c115d926cd17 | 229 | message.retained = true; |
anuragmuglikar | 2:c115d926cd17 | 230 | message.dup = false; |
anuragmuglikar | 2:c115d926cd17 | 231 | message.payload = (void*)buf; |
anuragmuglikar | 2:c115d926cd17 | 232 | message.payloadlen = strlen(buf); |
anuragmuglikar | 2:c115d926cd17 | 233 | int rc = client.publish(topic, message); |
ncshy | 7:37476d579b53 | 234 | int rate_flag = 0; |
ncshy | 7:37476d579b53 | 235 | int pace_flag = 0; |
anuragmuglikar | 2:c115d926cd17 | 236 | |
ncshy | 9:9d028e2a7c61 | 237 | |
ncshy | 8:1c786926bb66 | 238 | client.yield(100); |
anuragmuglikar | 2:c115d926cd17 | 239 | if(rc == 0){ |
anuragmuglikar | 2:c115d926cd17 | 240 | printf("Success PUB%d\n", rc); |
anuragmuglikar | 2:c115d926cd17 | 241 | }else{ |
anuragmuglikar | 2:c115d926cd17 | 242 | printf("Failed PUB%d\n", rc); |
anuragmuglikar | 3:dd4c984a642b | 243 | client.connect(data); |
anuragmuglikar | 2:c115d926cd17 | 244 | } |
anuragmuglikar | 3:dd4c984a642b | 245 | //printf("About to alarm\r\n"); |
anuragmuglikar | 2:c115d926cd17 | 246 | if (heart_rate > URL) { |
anuragmuglikar | 2:c115d926cd17 | 247 | monitor_alarm(RATE_ALARM); |
ncshy | 7:37476d579b53 | 248 | rate_flag = 1; |
ncshy | 9:9d028e2a7c61 | 249 | } |
ncshy | 9:9d028e2a7c61 | 250 | if (num_paces > PACE_THRESH) { |
ncshy | 7:37476d579b53 | 251 | monitor_alarm(PACE_ALARM); |
ncshy | 7:37476d579b53 | 252 | pace_flag = 1; |
ncshy | 9:9d028e2a7c61 | 253 | } |
ncshy | 9:9d028e2a7c61 | 254 | if(heart_rate < URL && num_paces < PACE_THRESH){ |
ncshy | 9:9d028e2a7c61 | 255 | normal_count++; |
ncshy | 9:9d028e2a7c61 | 256 | sprintf(buf, "Normal :%d", normal_count); |
anuragmuglikar | 2:c115d926cd17 | 257 | } |
ncshy | 7:37476d579b53 | 258 | LcdControl.locate(0, 1); |
ncshy | 9:9d028e2a7c61 | 259 | LcdControl.printf("AF:%d AS:%d NC:%03d", rate_flag, pace_flag, normal_count); |
ncshy | 7:37476d579b53 | 260 | rate_flag=0; |
ncshy | 7:37476d579b53 | 261 | pace_flag=0; |
anuragmuglikar | 3:dd4c984a642b | 262 | message.qos = MQTT::QOS0; |
anuragmuglikar | 3:dd4c984a642b | 263 | message.retained = true; |
anuragmuglikar | 3:dd4c984a642b | 264 | message.dup = false; |
anuragmuglikar | 3:dd4c984a642b | 265 | message.payload = (void*)buf; |
anuragmuglikar | 3:dd4c984a642b | 266 | message.payloadlen = strlen(buf); |
anuragmuglikar | 3:dd4c984a642b | 267 | rc = client.publish(topic, message); |
anuragmuglikar | 3:dd4c984a642b | 268 | |
ncshy | 8:1c786926bb66 | 269 | client.yield(100); |
anuragmuglikar | 3:dd4c984a642b | 270 | if(rc == 0){ |
anuragmuglikar | 3:dd4c984a642b | 271 | printf("Success PUB%d\n", rc); |
anuragmuglikar | 3:dd4c984a642b | 272 | }else{ |
anuragmuglikar | 3:dd4c984a642b | 273 | printf("Failed PUB%d\n", rc); |
anuragmuglikar | 3:dd4c984a642b | 274 | client.connect(data); |
anuragmuglikar | 3:dd4c984a642b | 275 | } |
anuragmuglikar | 3:dd4c984a642b | 276 | //printf("Alarm done\r\n"); |
anuragmuglikar | 2:c115d926cd17 | 277 | wait_start = time(NULL); |
anuragmuglikar | 2:c115d926cd17 | 278 | // Wait until you need to calculate averages again |
anuragmuglikar | 2:c115d926cd17 | 279 | while (difftime(time(NULL),wait_start) < AVG_INTERVAL); |
anuragmuglikar | 2:c115d926cd17 | 280 | } |
anuragmuglikar | 2:c115d926cd17 | 281 | } |
anuragmuglikar | 3:dd4c984a642b | 282 | |
anuragmuglikar | 3:dd4c984a642b | 283 | void flip(){ |
anuragmuglikar | 4:6da938edcb81 | 284 | senseBeatLED = 0; |
anuragmuglikar | 3:dd4c984a642b | 285 | indicator.detach(); |
anuragmuglikar | 3:dd4c984a642b | 286 | } |
anuragmuglikar | 2:c115d926cd17 | 287 | |
anuragmuglikar | 2:c115d926cd17 | 288 | // ISR to receive sense signals |
anuragmuglikar | 2:c115d926cd17 | 289 | void receive_sense_ISR() |
anuragmuglikar | 2:c115d926cd17 | 290 | { |
anuragmuglikar | 2:c115d926cd17 | 291 | sense_received = 1; |
anuragmuglikar | 3:dd4c984a642b | 292 | } |
anuragmuglikar | 3:dd4c984a642b | 293 | |
ncshy | 7:37476d579b53 | 294 | void case1_sense_ISR() |
ncshy | 7:37476d579b53 | 295 | { |
ncshy | 7:37476d579b53 | 296 | case_count = 1; |
ncshy | 7:37476d579b53 | 297 | } |
ncshy | 7:37476d579b53 | 298 | |
ncshy | 7:37476d579b53 | 299 | void case2_sense_ISR() |
ncshy | 7:37476d579b53 | 300 | { |
ncshy | 7:37476d579b53 | 301 | case_count = 2; |
ncshy | 7:37476d579b53 | 302 | } |
ncshy | 7:37476d579b53 | 303 | |
ncshy | 7:37476d579b53 | 304 | void case3_sense_ISR() |
ncshy | 7:37476d579b53 | 305 | { |
ncshy | 7:37476d579b53 | 306 | case_count = 3; |
ncshy | 7:37476d579b53 | 307 | } |
ncshy | 7:37476d579b53 | 308 | |
anuragmuglikar | 3:dd4c984a642b | 309 | void pIndicate(){ |
anuragmuglikar | 4:6da938edcb81 | 310 | sendPaceLED = 0; |
anuragmuglikar | 3:dd4c984a642b | 311 | paceIndicator.detach(); |
anuragmuglikar | 2:c115d926cd17 | 312 | } |
anuragmuglikar | 2:c115d926cd17 | 313 | |
anuragmuglikar | 2:c115d926cd17 | 314 | void pace() |
anuragmuglikar | 2:c115d926cd17 | 315 | { |
anuragmuglikar | 4:6da938edcb81 | 316 | sendPaceLED = 1; |
anuragmuglikar | 3:dd4c984a642b | 317 | paceIndicator.attach(&pIndicate, 0.1); |
anuragmuglikar | 2:c115d926cd17 | 318 | pace_signal = 1; |
anuragmuglikar | 2:c115d926cd17 | 319 | pace_signal = 0; |
anuragmuglikar | 2:c115d926cd17 | 320 | } |
anuragmuglikar | 2:c115d926cd17 | 321 | |
anuragmuglikar | 2:c115d926cd17 | 322 | void pacemaker() |
anuragmuglikar | 2:c115d926cd17 | 323 | { |
anuragmuglikar | 2:c115d926cd17 | 324 | //start_time = timer.read_ms(); |
anuragmuglikar | 2:c115d926cd17 | 325 | timer.reset(); |
anuragmuglikar | 2:c115d926cd17 | 326 | timer.start(); |
anuragmuglikar | 2:c115d926cd17 | 327 | while(true) |
anuragmuglikar | 2:c115d926cd17 | 328 | { |
ncshy | 7:37476d579b53 | 329 | switch(case_count) |
ncshy | 7:37476d579b53 | 330 | { |
ncshy | 7:37476d579b53 | 331 | case 1: |
ncshy | 9:9d028e2a7c61 | 332 | LRI = 1100; |
ncshy | 7:37476d579b53 | 333 | HRI = 1500; |
ncshy | 7:37476d579b53 | 334 | break; |
ncshy | 7:37476d579b53 | 335 | case 2: |
ncshy | 7:37476d579b53 | 336 | LRI = 1100; |
ncshy | 7:37476d579b53 | 337 | HRI = 2000; |
ncshy | 7:37476d579b53 | 338 | break; |
ncshy | 7:37476d579b53 | 339 | case 3: |
ncshy | 7:37476d579b53 | 340 | LRI = 300; |
ncshy | 7:37476d579b53 | 341 | HRI = 500; |
ncshy | 7:37476d579b53 | 342 | break; |
ncshy | 7:37476d579b53 | 343 | default: |
ncshy | 7:37476d579b53 | 344 | LRI = 1100; |
ncshy | 7:37476d579b53 | 345 | HRI = 1500; |
ncshy | 7:37476d579b53 | 346 | break; |
ncshy | 7:37476d579b53 | 347 | } |
lklang | 5:95dd571550d3 | 348 | |
anuragmuglikar | 3:dd4c984a642b | 349 | while(!sense_received && ((timer.read_ms()) < RI)); |
anuragmuglikar | 2:c115d926cd17 | 350 | if (sense_received) |
anuragmuglikar | 2:c115d926cd17 | 351 | { |
anuragmuglikar | 3:dd4c984a642b | 352 | //pc.printf("sense received\n"); |
anuragmuglikar | 2:c115d926cd17 | 353 | sense_received = 0; |
anuragmuglikar | 2:c115d926cd17 | 354 | // Let monitor know there was a heartbeaat |
anuragmuglikar | 2:c115d926cd17 | 355 | sense_flag = 1; |
anuragmuglikar | 2:c115d926cd17 | 356 | RI = HRI; |
anuragmuglikar | 2:c115d926cd17 | 357 | hp = true; |
anuragmuglikar | 2:c115d926cd17 | 358 | timer.reset(); |
anuragmuglikar | 4:6da938edcb81 | 359 | senseBeatLED = 1; |
anuragmuglikar | 4:6da938edcb81 | 360 | indicator.attach(&flip, 0.01); |
anuragmuglikar | 2:c115d926cd17 | 361 | } |
anuragmuglikar | 2:c115d926cd17 | 362 | else |
anuragmuglikar | 2:c115d926cd17 | 363 | { |
anuragmuglikar | 2:c115d926cd17 | 364 | // Send pace signal to heart |
anuragmuglikar | 2:c115d926cd17 | 365 | pace(); |
anuragmuglikar | 2:c115d926cd17 | 366 | // Indicate oace was sent for monitor |
anuragmuglikar | 2:c115d926cd17 | 367 | pace_sent = 1; |
anuragmuglikar | 3:dd4c984a642b | 368 | //pc.printf("paced - %d\n", (timer.read_ms() - start_time)); |
anuragmuglikar | 2:c115d926cd17 | 369 | RI = LRI; |
anuragmuglikar | 2:c115d926cd17 | 370 | hp = false; |
anuragmuglikar | 2:c115d926cd17 | 371 | //start_time = timer.read_ms(); |
anuragmuglikar | 2:c115d926cd17 | 372 | timer.reset(); |
anuragmuglikar | 2:c115d926cd17 | 373 | } |
anuragmuglikar | 2:c115d926cd17 | 374 | // Wait for VRP |
lklang | 5:95dd571550d3 | 375 | receive_sense.disable_irq(); |
anuragmuglikar | 2:c115d926cd17 | 376 | while((timer.read_ms()) < VRP); |
lklang | 5:95dd571550d3 | 377 | receive_sense.enable_irq(); |
anuragmuglikar | 2:c115d926cd17 | 378 | hp_enable = hp; |
anuragmuglikar | 2:c115d926cd17 | 379 | } |
anuragmuglikar | 2:c115d926cd17 | 380 | } |
anuragmuglikar | 2:c115d926cd17 | 381 | |
anuragmuglikar | 2:c115d926cd17 | 382 | int main() |
anuragmuglikar | 2:c115d926cd17 | 383 | { |
anuragmuglikar | 4:6da938edcb81 | 384 | |
anuragmuglikar | 3:dd4c984a642b | 385 | led_slow_alarm = 0; |
anuragmuglikar | 3:dd4c984a642b | 386 | led_fast_alarm = 0; |
anuragmuglikar | 2:c115d926cd17 | 387 | pc.baud(9600); |
ncshy | 7:37476d579b53 | 388 | LcdControl.cls(); |
ncshy | 9:9d028e2a7c61 | 389 | LcdControl.printf("PACEMAKER"); |
anuragmuglikar | 2:c115d926cd17 | 390 | // Enable the ISR to receive snse signals from heart simulator |
anuragmuglikar | 2:c115d926cd17 | 391 | wifi.set_credentials(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD); |
anuragmuglikar | 2:c115d926cd17 | 392 | wifi.connect(); |
anuragmuglikar | 2:c115d926cd17 | 393 | int rc = network.connect(hostname, port); |
anuragmuglikar | 2:c115d926cd17 | 394 | pc.printf("Connecting to %s:%d\r\n", hostname, port); |
anuragmuglikar | 2:c115d926cd17 | 395 | rc = mqttNetwork.connect(hostname, port); |
anuragmuglikar | 2:c115d926cd17 | 396 | data.MQTTVersion = 3; |
anuragmuglikar | 2:c115d926cd17 | 397 | data.clientID.cstring = "26013f37-13006018ae2a8ca752c368e3f5001e81"; |
anuragmuglikar | 2:c115d926cd17 | 398 | data.username.cstring = "mbed"; |
anuragmuglikar | 2:c115d926cd17 | 399 | data.password.cstring = "homework"; |
anuragmuglikar | 2:c115d926cd17 | 400 | if ((rc = client.connect(data)) != 0) |
anuragmuglikar | 2:c115d926cd17 | 401 | pc.printf("rc from MQTT connect is %d\r\n", rc); |
anuragmuglikar | 2:c115d926cd17 | 402 | receive_sense.rise(&receive_sense_ISR); |
ncshy | 7:37476d579b53 | 403 | case1_sense.rise(&case1_sense_ISR); |
ncshy | 7:37476d579b53 | 404 | case2_sense.rise(&case2_sense_ISR); |
ncshy | 7:37476d579b53 | 405 | case3_sense.rise(&case3_sense_ISR); |
anuragmuglikar | 2:c115d926cd17 | 406 | |
anuragmuglikar | 2:c115d926cd17 | 407 | // Start both the threads - pacemaker and observer |
anuragmuglikar | 2:c115d926cd17 | 408 | monitor_observe.start(monitor_obs); |
anuragmuglikar | 2:c115d926cd17 | 409 | monitor_calculate.start(monitor_calc); |
anuragmuglikar | 2:c115d926cd17 | 410 | pacemaker_thread.start(pacemaker); |
ncshy | 7:37476d579b53 | 411 | } |