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.
main.cpp@7:37476d579b53, 2018-12-12 (annotated)
- 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?
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 | |
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 | } |