Pacemaker models

Dependencies:   MQTT

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?

UserRevisionLine numberNew 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 }