Anurag Muglikar / Mbed OS pacemaker_new

Dependencies:   MQTT

Committer:
ncshy
Date:
Wed Dec 12 08:53:05 2018 +0000
Revision:
7:37476d579b53
Parent:
6:69ce22d142d6
Child:
8:1c786926bb66
Added test case conditions and input/output integration

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
anuragmuglikar 3:dd4c984a642b 152 client.yield(50);
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;
anuragmuglikar 3:dd4c984a642b 198 //printf("calc...\n");
anuragmuglikar 2:c115d926cd17 199 // I want to check the heart rate in bpm for the alarm,
anuragmuglikar 2:c115d926cd17 200 // so if my window time is smaller than 60 seconds I want to have
anuragmuglikar 2:c115d926cd17 201 // this window factor to scale it
anuragmuglikar 2:c115d926cd17 202 int window_factor = 60 / AVG_WINDOW;
anuragmuglikar 2:c115d926cd17 203
anuragmuglikar 2:c115d926cd17 204 // The monitor needs to wait for at least one full AVG_WINDOW
anuragmuglikar 2:c115d926cd17 205 // before it starts to monitor the average heartrate or else
anuragmuglikar 2:c115d926cd17 206 // it is going to give spurious low heartrate alarms
anuragmuglikar 2:c115d926cd17 207 while (difftime(time(NULL),wait_start) < AVG_WINDOW);
anuragmuglikar 2:c115d926cd17 208
anuragmuglikar 2:c115d926cd17 209
anuragmuglikar 2:c115d926cd17 210 message.qos = MQTT::QOS0;
anuragmuglikar 2:c115d926cd17 211 while(1) {
anuragmuglikar 2:c115d926cd17 212 //pc.printf("In monitor calc loop\r\n");
anuragmuglikar 2:c115d926cd17 213 // Get the current time and see if you need to prune any elements from
anuragmuglikar 2:c115d926cd17 214 // your lists
anuragmuglikar 2:c115d926cd17 215 current_time = time(NULL);
anuragmuglikar 2:c115d926cd17 216 prune_lists(current_time);
anuragmuglikar 2:c115d926cd17 217
anuragmuglikar 2:c115d926cd17 218
anuragmuglikar 2:c115d926cd17 219 // Find average heart rate and number of paces if it is time to,
anuragmuglikar 2:c115d926cd17 220 // then set any necessary alarms
anuragmuglikar 2:c115d926cd17 221 heart_rate = beat_times.size() * window_factor;
anuragmuglikar 2:c115d926cd17 222 num_paces = pace_times.size();
anuragmuglikar 2:c115d926cd17 223 pc.printf("H.R = %d\r\n", heart_rate);
anuragmuglikar 2:c115d926cd17 224 pc.printf("N.P = %d\r\n", num_paces);
anuragmuglikar 3:dd4c984a642b 225 sprintf(buf, "BPM :%d", heart_rate);
ncshy 7:37476d579b53 226 LcdControl.cls();
ncshy 7:37476d579b53 227 LcdControl.printf("BPM: %03d TC:%d", heart_rate, case_count);
anuragmuglikar 2:c115d926cd17 228 message.retained = true;
anuragmuglikar 2:c115d926cd17 229 message.dup = false;
anuragmuglikar 2:c115d926cd17 230 message.payload = (void*)buf;
anuragmuglikar 2:c115d926cd17 231 message.payloadlen = strlen(buf);
anuragmuglikar 2:c115d926cd17 232 int rc = client.publish(topic, message);
ncshy 7:37476d579b53 233 int rate_flag = 0;
ncshy 7:37476d579b53 234 int pace_flag = 0;
anuragmuglikar 2:c115d926cd17 235
anuragmuglikar 2:c115d926cd17 236 client.yield(50);
anuragmuglikar 2:c115d926cd17 237 if(rc == 0){
anuragmuglikar 2:c115d926cd17 238 printf("Success PUB%d\n", rc);
anuragmuglikar 2:c115d926cd17 239 }else{
anuragmuglikar 2:c115d926cd17 240 printf("Failed PUB%d\n", rc);
anuragmuglikar 3:dd4c984a642b 241 client.connect(data);
anuragmuglikar 2:c115d926cd17 242 }
anuragmuglikar 3:dd4c984a642b 243 //printf("About to alarm\r\n");
anuragmuglikar 2:c115d926cd17 244 if (heart_rate > URL) {
anuragmuglikar 2:c115d926cd17 245 monitor_alarm(RATE_ALARM);
ncshy 7:37476d579b53 246 rate_flag = 1;
anuragmuglikar 2:c115d926cd17 247 } else if (num_paces > PACE_THRESH) {
ncshy 7:37476d579b53 248 monitor_alarm(PACE_ALARM);
ncshy 7:37476d579b53 249 pace_flag = 1;
anuragmuglikar 3:dd4c984a642b 250 }else{
anuragmuglikar 3:dd4c984a642b 251 sprintf(buf, "Normal :%d", 1);
anuragmuglikar 2:c115d926cd17 252 }
ncshy 7:37476d579b53 253 LcdControl.locate(0, 1);
ncshy 7:37476d579b53 254 LcdControl.printf("AF: %d AS: %d", rate_flag, pace_flag);
ncshy 7:37476d579b53 255 rate_flag=0;
ncshy 7:37476d579b53 256 pace_flag=0;
anuragmuglikar 3:dd4c984a642b 257 message.qos = MQTT::QOS0;
anuragmuglikar 3:dd4c984a642b 258 message.retained = true;
anuragmuglikar 3:dd4c984a642b 259 message.dup = false;
anuragmuglikar 3:dd4c984a642b 260 message.payload = (void*)buf;
anuragmuglikar 3:dd4c984a642b 261 message.payloadlen = strlen(buf);
anuragmuglikar 3:dd4c984a642b 262 rc = client.publish(topic, message);
anuragmuglikar 3:dd4c984a642b 263
anuragmuglikar 3:dd4c984a642b 264 client.yield(50);
anuragmuglikar 3:dd4c984a642b 265 if(rc == 0){
anuragmuglikar 3:dd4c984a642b 266 printf("Success PUB%d\n", rc);
anuragmuglikar 3:dd4c984a642b 267 }else{
anuragmuglikar 3:dd4c984a642b 268 printf("Failed PUB%d\n", rc);
anuragmuglikar 3:dd4c984a642b 269 client.connect(data);
anuragmuglikar 3:dd4c984a642b 270 }
anuragmuglikar 3:dd4c984a642b 271 //printf("Alarm done\r\n");
anuragmuglikar 2:c115d926cd17 272 wait_start = time(NULL);
anuragmuglikar 2:c115d926cd17 273 // Wait until you need to calculate averages again
anuragmuglikar 2:c115d926cd17 274 while (difftime(time(NULL),wait_start) < AVG_INTERVAL);
anuragmuglikar 2:c115d926cd17 275 }
anuragmuglikar 2:c115d926cd17 276 }
anuragmuglikar 3:dd4c984a642b 277
anuragmuglikar 3:dd4c984a642b 278 void flip(){
anuragmuglikar 4:6da938edcb81 279 senseBeatLED = 0;
anuragmuglikar 3:dd4c984a642b 280 indicator.detach();
anuragmuglikar 3:dd4c984a642b 281 }
anuragmuglikar 2:c115d926cd17 282
anuragmuglikar 2:c115d926cd17 283 // ISR to receive sense signals
anuragmuglikar 2:c115d926cd17 284 void receive_sense_ISR()
anuragmuglikar 2:c115d926cd17 285 {
anuragmuglikar 2:c115d926cd17 286 sense_received = 1;
anuragmuglikar 3:dd4c984a642b 287 }
anuragmuglikar 3:dd4c984a642b 288
ncshy 7:37476d579b53 289 void case1_sense_ISR()
ncshy 7:37476d579b53 290 {
ncshy 7:37476d579b53 291 case_count = 1;
ncshy 7:37476d579b53 292 }
ncshy 7:37476d579b53 293
ncshy 7:37476d579b53 294 void case2_sense_ISR()
ncshy 7:37476d579b53 295 {
ncshy 7:37476d579b53 296 case_count = 2;
ncshy 7:37476d579b53 297 }
ncshy 7:37476d579b53 298
ncshy 7:37476d579b53 299 void case3_sense_ISR()
ncshy 7:37476d579b53 300 {
ncshy 7:37476d579b53 301 case_count = 3;
ncshy 7:37476d579b53 302 }
ncshy 7:37476d579b53 303
anuragmuglikar 3:dd4c984a642b 304 void pIndicate(){
anuragmuglikar 4:6da938edcb81 305 sendPaceLED = 0;
anuragmuglikar 3:dd4c984a642b 306 paceIndicator.detach();
anuragmuglikar 2:c115d926cd17 307 }
anuragmuglikar 2:c115d926cd17 308
anuragmuglikar 2:c115d926cd17 309 void pace()
anuragmuglikar 2:c115d926cd17 310 {
anuragmuglikar 4:6da938edcb81 311 sendPaceLED = 1;
anuragmuglikar 3:dd4c984a642b 312 paceIndicator.attach(&pIndicate, 0.1);
anuragmuglikar 2:c115d926cd17 313 pace_signal = 1;
anuragmuglikar 2:c115d926cd17 314 pace_signal = 0;
anuragmuglikar 2:c115d926cd17 315 }
anuragmuglikar 2:c115d926cd17 316
anuragmuglikar 2:c115d926cd17 317 void pacemaker()
anuragmuglikar 2:c115d926cd17 318 {
anuragmuglikar 2:c115d926cd17 319 //start_time = timer.read_ms();
anuragmuglikar 2:c115d926cd17 320 timer.reset();
anuragmuglikar 2:c115d926cd17 321 timer.start();
anuragmuglikar 2:c115d926cd17 322 while(true)
anuragmuglikar 2:c115d926cd17 323 {
ncshy 7:37476d579b53 324 switch(case_count)
ncshy 7:37476d579b53 325 {
ncshy 7:37476d579b53 326 case 1:
ncshy 7:37476d579b53 327 LRI = 300;
ncshy 7:37476d579b53 328 HRI = 1500;
ncshy 7:37476d579b53 329 break;
ncshy 7:37476d579b53 330 case 2:
ncshy 7:37476d579b53 331 LRI = 1100;
ncshy 7:37476d579b53 332 HRI = 2000;
ncshy 7:37476d579b53 333 break;
ncshy 7:37476d579b53 334 case 3:
ncshy 7:37476d579b53 335 LRI = 300;
ncshy 7:37476d579b53 336 HRI = 500;
ncshy 7:37476d579b53 337 break;
ncshy 7:37476d579b53 338 default:
ncshy 7:37476d579b53 339 LRI = 1100;
ncshy 7:37476d579b53 340 HRI = 1500;
ncshy 7:37476d579b53 341 break;
ncshy 7:37476d579b53 342 }
lklang 5:95dd571550d3 343
anuragmuglikar 3:dd4c984a642b 344 while(!sense_received && ((timer.read_ms()) < RI));
anuragmuglikar 2:c115d926cd17 345 if (sense_received)
anuragmuglikar 2:c115d926cd17 346 {
anuragmuglikar 3:dd4c984a642b 347 //pc.printf("sense received\n");
anuragmuglikar 2:c115d926cd17 348 sense_received = 0;
anuragmuglikar 2:c115d926cd17 349 // Let monitor know there was a heartbeaat
anuragmuglikar 2:c115d926cd17 350 sense_flag = 1;
anuragmuglikar 2:c115d926cd17 351 RI = HRI;
anuragmuglikar 2:c115d926cd17 352 hp = true;
anuragmuglikar 2:c115d926cd17 353 timer.reset();
anuragmuglikar 4:6da938edcb81 354 senseBeatLED = 1;
anuragmuglikar 4:6da938edcb81 355 indicator.attach(&flip, 0.01);
anuragmuglikar 2:c115d926cd17 356 }
anuragmuglikar 2:c115d926cd17 357 else
anuragmuglikar 2:c115d926cd17 358 {
anuragmuglikar 2:c115d926cd17 359 // Send pace signal to heart
anuragmuglikar 2:c115d926cd17 360 pace();
anuragmuglikar 2:c115d926cd17 361 // Indicate oace was sent for monitor
anuragmuglikar 2:c115d926cd17 362 pace_sent = 1;
anuragmuglikar 3:dd4c984a642b 363 //pc.printf("paced - %d\n", (timer.read_ms() - start_time));
anuragmuglikar 2:c115d926cd17 364 RI = LRI;
anuragmuglikar 2:c115d926cd17 365 hp = false;
anuragmuglikar 2:c115d926cd17 366 //start_time = timer.read_ms();
anuragmuglikar 2:c115d926cd17 367 timer.reset();
anuragmuglikar 2:c115d926cd17 368 }
anuragmuglikar 2:c115d926cd17 369 // Wait for VRP
lklang 5:95dd571550d3 370 receive_sense.disable_irq();
anuragmuglikar 2:c115d926cd17 371 while((timer.read_ms()) < VRP);
lklang 5:95dd571550d3 372 receive_sense.enable_irq();
anuragmuglikar 2:c115d926cd17 373 hp_enable = hp;
anuragmuglikar 2:c115d926cd17 374 }
anuragmuglikar 2:c115d926cd17 375 }
anuragmuglikar 2:c115d926cd17 376
anuragmuglikar 2:c115d926cd17 377 int main()
anuragmuglikar 2:c115d926cd17 378 {
anuragmuglikar 4:6da938edcb81 379
anuragmuglikar 3:dd4c984a642b 380 led_slow_alarm = 0;
anuragmuglikar 3:dd4c984a642b 381 led_fast_alarm = 0;
anuragmuglikar 2:c115d926cd17 382 pc.baud(9600);
ncshy 7:37476d579b53 383 LcdControl.cls();
ncshy 7:37476d579b53 384 LcdControl.printf("Hello");
anuragmuglikar 2:c115d926cd17 385 // Enable the ISR to receive snse signals from heart simulator
anuragmuglikar 2:c115d926cd17 386 wifi.set_credentials(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD);
anuragmuglikar 2:c115d926cd17 387 wifi.connect();
anuragmuglikar 2:c115d926cd17 388 int rc = network.connect(hostname, port);
anuragmuglikar 2:c115d926cd17 389 pc.printf("Connecting to %s:%d\r\n", hostname, port);
anuragmuglikar 2:c115d926cd17 390 rc = mqttNetwork.connect(hostname, port);
anuragmuglikar 2:c115d926cd17 391 data.MQTTVersion = 3;
anuragmuglikar 2:c115d926cd17 392 data.clientID.cstring = "26013f37-13006018ae2a8ca752c368e3f5001e81";
anuragmuglikar 2:c115d926cd17 393 data.username.cstring = "mbed";
anuragmuglikar 2:c115d926cd17 394 data.password.cstring = "homework";
anuragmuglikar 2:c115d926cd17 395 if ((rc = client.connect(data)) != 0)
anuragmuglikar 2:c115d926cd17 396 pc.printf("rc from MQTT connect is %d\r\n", rc);
anuragmuglikar 2:c115d926cd17 397 receive_sense.rise(&receive_sense_ISR);
ncshy 7:37476d579b53 398 case1_sense.rise(&case1_sense_ISR);
ncshy 7:37476d579b53 399 case2_sense.rise(&case2_sense_ISR);
ncshy 7:37476d579b53 400 case3_sense.rise(&case3_sense_ISR);
anuragmuglikar 2:c115d926cd17 401
anuragmuglikar 2:c115d926cd17 402 // Start both the threads - pacemaker and observer
anuragmuglikar 2:c115d926cd17 403 monitor_observe.start(monitor_obs);
anuragmuglikar 2:c115d926cd17 404 monitor_calculate.start(monitor_calc);
anuragmuglikar 2:c115d926cd17 405 pacemaker_thread.start(pacemaker);
ncshy 7:37476d579b53 406 }