practical / Mbed 2 deprecated updatedPatient2

Dependencies:   mbed

Committer:
tatsuyanah
Date:
Sun Apr 14 02:10:11 2019 +0000
Revision:
2:4513f2dd207d
Parent:
1:417090fd8386
LIBRARY ADDED

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tatsuyanah 0:c837d6abadc5 1 // ESP8266 Static page WEB server to control Mbed
tatsuyanah 0:c837d6abadc5 2
tatsuyanah 0:c837d6abadc5 3 #include "mbed.h"
tatsuyanah 0:c837d6abadc5 4 #include "algorithm.h"
tatsuyanah 0:c837d6abadc5 5 #include "MAX30102.h"
tatsuyanah 1:417090fd8386 6 #include "MAX30101.h"
tatsuyanah 0:c837d6abadc5 7
tatsuyanah 0:c837d6abadc5 8 #define MAX_BRIGHTNESS 255
tatsuyanah 0:c837d6abadc5 9 Serial pc(USBTX, USBRX);
tatsuyanah 1:417090fd8386 10 Serial esp(p13, p14);
tatsuyanah 0:c837d6abadc5 11 //Serial esp(p28, p27); // tx, rx
tatsuyanah 0:c837d6abadc5 12
tatsuyanah 0:c837d6abadc5 13
tatsuyanah 0:c837d6abadc5 14 // Standard Mbed LED definitions
tatsuyanah 0:c837d6abadc5 15 DigitalOut led1(LED1);
tatsuyanah 0:c837d6abadc5 16 DigitalOut led2(LED2);
tatsuyanah 0:c837d6abadc5 17 DigitalOut led3(LED3);
tatsuyanah 0:c837d6abadc5 18 DigitalOut led4(LED4);
tatsuyanah 0:c837d6abadc5 19
tatsuyanah 0:c837d6abadc5 20 // some test values to show on web page
tatsuyanah 0:c837d6abadc5 21 AnalogIn Ain1(p18);
tatsuyanah 1:417090fd8386 22 AnalogIn LM35B(p19);
tatsuyanah 1:417090fd8386 23 AnalogIn LM35A(p20);
tatsuyanah 1:417090fd8386 24 DigitalIn INT(p8);
tatsuyanah 1:417090fd8386 25 DigitalIn INT1(p7);
tatsuyanah 0:c837d6abadc5 26 /*
tatsuyanah 0:c837d6abadc5 27 char ssid[32] = "hsd"; // enter WiFi router ssid inside the quotes
tatsuyanah 0:c837d6abadc5 28 char pwd [32] = "austin123"; // enter WiFi router password inside the quotes
tatsuyanah 0:c837d6abadc5 29 */
tatsuyanah 0:c837d6abadc5 30
tatsuyanah 0:c837d6abadc5 31 uint32_t aun_ir_buffer[500]; //IR LED sensor data
tatsuyanah 0:c837d6abadc5 32 int32_t n_ir_buffer_length; //data length
tatsuyanah 0:c837d6abadc5 33 uint32_t aun_red_buffer[500]; //Red LED sensor data
tatsuyanah 0:c837d6abadc5 34 int32_t n_sp02; //SPO2 value
tatsuyanah 0:c837d6abadc5 35 int8_t ch_spo2_valid; //indicator to show if the SP02 calculation is valid
tatsuyanah 0:c837d6abadc5 36 int32_t n_heart_rate; //heart rate value
tatsuyanah 0:c837d6abadc5 37 int8_t ch_hr_valid; //indicator to show if the heart rate calculation is valid
tatsuyanah 0:c837d6abadc5 38 uint8_t uch_dummy;
tatsuyanah 1:417090fd8386 39
tatsuyanah 1:417090fd8386 40 uint32_t aun_ir_buffer1[500]; //IR LED sensor data
tatsuyanah 1:417090fd8386 41 int32_t n_ir_buffer_length1; //data length
tatsuyanah 1:417090fd8386 42 uint32_t aun_red_buffer1[500]; //Red LED sensor data
tatsuyanah 1:417090fd8386 43 int32_t n_sp021; //SPO2 value
tatsuyanah 1:417090fd8386 44 int8_t ch_spo2_valid1; //indicator to show if the SP02 calculation is valid
tatsuyanah 1:417090fd8386 45 int32_t n_heart_rate1; //heart rate value
tatsuyanah 1:417090fd8386 46 int8_t ch_hr_valid1; //indicator to show if the heart rate calculation is valid
tatsuyanah 1:417090fd8386 47 uint8_t uch_dummy1;
tatsuyanah 1:417090fd8386 48
tatsuyanah 1:417090fd8386 49
tatsuyanah 0:c837d6abadc5 50 char uploadTimeOut=1;
tatsuyanah 0:c837d6abadc5 51 Timer timer1second;
tatsuyanah 0:c837d6abadc5 52
tatsuyanah 0:c837d6abadc5 53 float temperature, AdcIn, Ht;
tatsuyanah 0:c837d6abadc5 54 float R1=100000, R2=10000; // resistor values to give a 10:1 reduction of measured AnalogIn voltage
tatsuyanah 0:c837d6abadc5 55 char Vcc[10];
tatsuyanah 1:417090fd8386 56 char TempA[10];
tatsuyanah 1:417090fd8386 57 char TempB[10];
tatsuyanah 0:c837d6abadc5 58 char Null[10];
tatsuyanah 0:c837d6abadc5 59
tatsuyanah 1:417090fd8386 60 float f_temp;
tatsuyanah 1:417090fd8386 61 uint32_t un_min, un_max, un_prev_data; //variables to calculate the on-board LED brightness that reflects the heartbeats
tatsuyanah 1:417090fd8386 62
tatsuyanah 1:417090fd8386 63 float f_temp1;
tatsuyanah 1:417090fd8386 64 uint32_t un_min1, un_max1, un_prev_data1; //variables to calculate the on-board LED brightness that reflects the heartbeats
tatsuyanah 1:417090fd8386 65 int i1;
tatsuyanah 1:417090fd8386 66 int32_t n_brightness1;
tatsuyanah 1:417090fd8386 67
tatsuyanah 1:417090fd8386 68 int i;
tatsuyanah 1:417090fd8386 69 int32_t n_brightness;
tatsuyanah 1:417090fd8386 70
tatsuyanah 0:c837d6abadc5 71 // things for sending/receiving data over serial
tatsuyanah 0:c837d6abadc5 72 volatile int tx_in=0;
tatsuyanah 0:c837d6abadc5 73 volatile int tx_out=0;
tatsuyanah 0:c837d6abadc5 74 volatile int rx_in=0;
tatsuyanah 0:c837d6abadc5 75 volatile int rx_out=0;
tatsuyanah 0:c837d6abadc5 76 const int buffer_size = 4095;
tatsuyanah 0:c837d6abadc5 77 char tx_buffer[buffer_size+1];
tatsuyanah 0:c837d6abadc5 78 char rx_buffer[buffer_size+1];
tatsuyanah 0:c837d6abadc5 79 void Tx_interrupt();
tatsuyanah 0:c837d6abadc5 80 void Rx_interrupt();
tatsuyanah 0:c837d6abadc5 81 void send_line();
tatsuyanah 0:c837d6abadc5 82 void read_line();
tatsuyanah 0:c837d6abadc5 83
tatsuyanah 0:c837d6abadc5 84 int DataRX;
tatsuyanah 0:c837d6abadc5 85 int update;
tatsuyanah 0:c837d6abadc5 86 int count;
tatsuyanah 0:c837d6abadc5 87 char cmdbuff[1024];
tatsuyanah 0:c837d6abadc5 88 char replybuff[4096];
tatsuyanah 0:c837d6abadc5 89 char webdata[4096]; // This may need to be bigger depending on WEB browser used
tatsuyanah 0:c837d6abadc5 90 char webbuff[4096]; // Currently using 1986 characters, Increase this if more web page data added
tatsuyanah 0:c837d6abadc5 91 char timebuf[30];
tatsuyanah 0:c837d6abadc5 92 void SendCMD(),getreply(),ReadWebData(),startserver();
tatsuyanah 0:c837d6abadc5 93 void gettime(),setRTC(),gettemp(),getbattery();
tatsuyanah 0:c837d6abadc5 94 char rx_line[1024];
tatsuyanah 0:c837d6abadc5 95 int port =80; // set server port
tatsuyanah 0:c837d6abadc5 96 int SERVtimeout =5; // set server timeout in seconds in case link breaks.
tatsuyanah 0:c837d6abadc5 97 struct tm t;
tatsuyanah 0:c837d6abadc5 98 // manual set RTC values
tatsuyanah 0:c837d6abadc5 99 int minute =20; // 0-59
tatsuyanah 0:c837d6abadc5 100 int hour =11; // 2-23
tatsuyanah 0:c837d6abadc5 101 int dayofmonth =13; // 1-31
tatsuyanah 0:c837d6abadc5 102 int month =4; // 1-12
tatsuyanah 0:c837d6abadc5 103 int year =19; // last 2 digits
tatsuyanah 0:c837d6abadc5 104
tatsuyanah 1:417090fd8386 105 void gettemp()
tatsuyanah 0:c837d6abadc5 106 {
tatsuyanah 1:417090fd8386 107 float temp_C , temp_F, average[10], averageTemp;
tatsuyanah 1:417090fd8386 108 float tempB_C , tempB_F, averageB[10], averageTempB;
tatsuyanah 1:417090fd8386 109 int index;
tatsuyanah 0:c837d6abadc5 110
tatsuyanah 1:417090fd8386 111 averageTemp=0;
tatsuyanah 1:417090fd8386 112 for(index=0; index<10; index++)
tatsuyanah 1:417090fd8386 113 {
tatsuyanah 1:417090fd8386 114 average[index]=LM35A.read();
tatsuyanah 1:417090fd8386 115 //wait(0.02);
tatsuyanah 1:417090fd8386 116 }
tatsuyanah 1:417090fd8386 117 for(index=0; index<10; index++)
tatsuyanah 1:417090fd8386 118 {
tatsuyanah 1:417090fd8386 119 averageTemp = (averageTemp +(average[index]/10));
tatsuyanah 1:417090fd8386 120 }
tatsuyanah 1:417090fd8386 121 temp_C=(averageTemp*3.685*100);
tatsuyanah 1:417090fd8386 122 temp_F=(((9.0*temp_C)/5.0) + 32.0);
tatsuyanah 1:417090fd8386 123 sprintf(TempA,"%2.3f",temp_C);
tatsuyanah 1:417090fd8386 124
tatsuyanah 1:417090fd8386 125 averageTempB=0;
tatsuyanah 1:417090fd8386 126 for(index=0; index<10; index++)
tatsuyanah 1:417090fd8386 127 {
tatsuyanah 1:417090fd8386 128 average[index]=LM35B.read();
tatsuyanah 1:417090fd8386 129 //wait(0.02);
tatsuyanah 1:417090fd8386 130 }
tatsuyanah 1:417090fd8386 131 for(index=0; index<10; index++)
tatsuyanah 1:417090fd8386 132 {
tatsuyanah 1:417090fd8386 133 averageTempB = (averageTempB +(averageB[index]/10));
tatsuyanah 1:417090fd8386 134 }
tatsuyanah 1:417090fd8386 135 tempB_C=(averageTempB*3.685*100);
tatsuyanah 1:417090fd8386 136 tempB_F=(((9.0*tempB_C)/5.0) + 32.0);
tatsuyanah 1:417090fd8386 137 sprintf(TempB,"%2.3f",tempB_C);
tatsuyanah 1:417090fd8386 138
tatsuyanah 1:417090fd8386 139 pc.printf("Temperature of Patient 1 is %.2f C, %.2f F \n\r ", temp_C,temp_F);
tatsuyanah 1:417090fd8386 140 pc.printf("Temperature of Patient 1 is %.2f C, %.2f F \n\r ", tempB_C,tempB_F);
tatsuyanah 1:417090fd8386 141 }
tatsuyanah 0:c837d6abadc5 142
tatsuyanah 1:417090fd8386 143
tatsuyanah 1:417090fd8386 144 void heartbeatInitA()
tatsuyanah 1:417090fd8386 145 {
tatsuyanah 0:c837d6abadc5 146 maxim_max30102_reset(); //resets the MAX30102
tatsuyanah 0:c837d6abadc5 147 wait(1);
tatsuyanah 0:c837d6abadc5 148 //read and clear status register
tatsuyanah 0:c837d6abadc5 149 maxim_max30102_read_reg(0,&uch_dummy);
tatsuyanah 0:c837d6abadc5 150
tatsuyanah 0:c837d6abadc5 151 //while(pc.readable()==0)
tatsuyanah 0:c837d6abadc5 152 {
tatsuyanah 0:c837d6abadc5 153 // pc.printf("\x1B[2J"); //clear terminal program screen
tatsuyanah 0:c837d6abadc5 154 pc.printf("Press any key to start conversion\n\r");
tatsuyanah 0:c837d6abadc5 155 wait(1);
tatsuyanah 0:c837d6abadc5 156 }
tatsuyanah 0:c837d6abadc5 157 uch_dummy=getchar();
tatsuyanah 0:c837d6abadc5 158
tatsuyanah 0:c837d6abadc5 159 maxim_max30102_init(); //initializes the MAX30102
tatsuyanah 0:c837d6abadc5 160
tatsuyanah 0:c837d6abadc5 161 n_brightness=0;
tatsuyanah 0:c837d6abadc5 162 un_min=0x3FFFF;
tatsuyanah 0:c837d6abadc5 163 un_max=0;
tatsuyanah 0:c837d6abadc5 164
tatsuyanah 0:c837d6abadc5 165 n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps
tatsuyanah 0:c837d6abadc5 166
tatsuyanah 0:c837d6abadc5 167 //read the first 500 samples, and determine the signal range
tatsuyanah 0:c837d6abadc5 168 for(i=0;i<n_ir_buffer_length;i++)
tatsuyanah 0:c837d6abadc5 169 {
tatsuyanah 1:417090fd8386 170 while(INT.read()==1); //wait until the interrupt pin asserts
tatsuyanah 0:c837d6abadc5 171
tatsuyanah 0:c837d6abadc5 172 maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); //read from MAX30102 FIFO
tatsuyanah 0:c837d6abadc5 173
tatsuyanah 0:c837d6abadc5 174 if(un_min>aun_red_buffer[i])
tatsuyanah 0:c837d6abadc5 175 un_min=aun_red_buffer[i]; //update signal min
tatsuyanah 0:c837d6abadc5 176 if(un_max<aun_red_buffer[i])
tatsuyanah 0:c837d6abadc5 177 un_max=aun_red_buffer[i]; //update signal max
tatsuyanah 0:c837d6abadc5 178 pc.printf("red=");
tatsuyanah 0:c837d6abadc5 179 pc.printf("%i", aun_red_buffer[i]);
tatsuyanah 0:c837d6abadc5 180 pc.printf(", ir=");
tatsuyanah 0:c837d6abadc5 181 pc.printf("%i\n\r", aun_ir_buffer[i]);
tatsuyanah 0:c837d6abadc5 182 }
tatsuyanah 0:c837d6abadc5 183 un_prev_data=aun_red_buffer[i];
tatsuyanah 0:c837d6abadc5 184
tatsuyanah 0:c837d6abadc5 185 //calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples)
tatsuyanah 1:417090fd8386 186 maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);
tatsuyanah 0:c837d6abadc5 187
tatsuyanah 1:417090fd8386 188 }
tatsuyanah 1:417090fd8386 189
tatsuyanah 1:417090fd8386 190
tatsuyanah 1:417090fd8386 191 void heartbeatInitB()
tatsuyanah 1:417090fd8386 192 {
tatsuyanah 1:417090fd8386 193 maxim_max30101_reset(); //resets the MAX30102
tatsuyanah 1:417090fd8386 194 wait(1);
tatsuyanah 1:417090fd8386 195 //read and clear status register
tatsuyanah 1:417090fd8386 196
tatsuyanah 1:417090fd8386 197
tatsuyanah 1:417090fd8386 198 maxim_max30101_init(); //initializes the MAX30102
tatsuyanah 0:c837d6abadc5 199
tatsuyanah 1:417090fd8386 200 n_brightness1=0;
tatsuyanah 1:417090fd8386 201 un_min1=0x3FFFF;
tatsuyanah 1:417090fd8386 202 un_max1=0;
tatsuyanah 0:c837d6abadc5 203
tatsuyanah 1:417090fd8386 204 n_ir_buffer_length1=500; //buffer length of 100 stores 5 seconds of samples running at 100sps
tatsuyanah 0:c837d6abadc5 205
tatsuyanah 0:c837d6abadc5 206 //read the first 500 samples, and determine the signal range
tatsuyanah 1:417090fd8386 207 for(i=0;i<n_ir_buffer_length1;i++)
tatsuyanah 0:c837d6abadc5 208 {
tatsuyanah 1:417090fd8386 209 while(INT1.read()==1); //wait until the interrupt pin asserts
tatsuyanah 0:c837d6abadc5 210
tatsuyanah 1:417090fd8386 211 maxim_max30101_read_fifo(((aun_red_buffer1)+i), ((aun_ir_buffer1)+i)); //read from MAX30102 FIFO
tatsuyanah 0:c837d6abadc5 212
tatsuyanah 1:417090fd8386 213 if(un_min1>aun_red_buffer1[i])
tatsuyanah 1:417090fd8386 214 un_min1=aun_red_buffer1[i]; //update signal min
tatsuyanah 1:417090fd8386 215 if(un_max1<aun_red_buffer1[i])
tatsuyanah 1:417090fd8386 216 un_max1=aun_red_buffer1[i]; //update signal max
tatsuyanah 0:c837d6abadc5 217 pc.printf("red=");
tatsuyanah 1:417090fd8386 218 pc.printf("%i", aun_red_buffer1[i]);
tatsuyanah 0:c837d6abadc5 219 pc.printf(", ir=");
tatsuyanah 1:417090fd8386 220 pc.printf("%i\n\r", aun_ir_buffer1[i]);
tatsuyanah 0:c837d6abadc5 221 }
tatsuyanah 1:417090fd8386 222 un_prev_data1=aun_red_buffer1[i];
tatsuyanah 0:c837d6abadc5 223
tatsuyanah 0:c837d6abadc5 224 //calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples)
tatsuyanah 1:417090fd8386 225 maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer1, n_ir_buffer_length1, aun_red_buffer1, &n_sp021, &ch_spo2_valid1, &n_heart_rate1, &ch_hr_valid1);
tatsuyanah 1:417090fd8386 226 }
tatsuyanah 1:417090fd8386 227
tatsuyanah 1:417090fd8386 228 void heartbeatUpdateA()
tatsuyanah 1:417090fd8386 229 {
tatsuyanah 0:c837d6abadc5 230 i=0;
tatsuyanah 0:c837d6abadc5 231 un_min=0x3FFFF;
tatsuyanah 0:c837d6abadc5 232 un_max=0;
tatsuyanah 0:c837d6abadc5 233
tatsuyanah 0:c837d6abadc5 234 //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top
tatsuyanah 0:c837d6abadc5 235 for(i=100;i<500;i++)
tatsuyanah 0:c837d6abadc5 236 {
tatsuyanah 0:c837d6abadc5 237 aun_red_buffer[i-100]=aun_red_buffer[i];
tatsuyanah 0:c837d6abadc5 238 aun_ir_buffer[i-100]=aun_ir_buffer[i];
tatsuyanah 0:c837d6abadc5 239
tatsuyanah 0:c837d6abadc5 240 //update the signal min and max
tatsuyanah 0:c837d6abadc5 241 if(un_min>aun_red_buffer[i])
tatsuyanah 0:c837d6abadc5 242 un_min=aun_red_buffer[i];
tatsuyanah 0:c837d6abadc5 243 if(un_max<aun_red_buffer[i])
tatsuyanah 0:c837d6abadc5 244 un_max=aun_red_buffer[i];
tatsuyanah 1:417090fd8386 245
tatsuyanah 0:c837d6abadc5 246 }
tatsuyanah 0:c837d6abadc5 247
tatsuyanah 0:c837d6abadc5 248 //take 100 sets of samples before calculating the heart rate.
tatsuyanah 0:c837d6abadc5 249 for(i=400;i<500;i++)
tatsuyanah 0:c837d6abadc5 250 {
tatsuyanah 0:c837d6abadc5 251 un_prev_data=aun_red_buffer[i-1];
tatsuyanah 0:c837d6abadc5 252 while(INT.read()==1);
tatsuyanah 0:c837d6abadc5 253 maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i));
tatsuyanah 0:c837d6abadc5 254
tatsuyanah 0:c837d6abadc5 255 if(aun_red_buffer[i]>un_prev_data)
tatsuyanah 0:c837d6abadc5 256 {
tatsuyanah 0:c837d6abadc5 257 f_temp=aun_red_buffer[i]-un_prev_data;
tatsuyanah 0:c837d6abadc5 258 f_temp/=(un_max-un_min);
tatsuyanah 0:c837d6abadc5 259 f_temp*=MAX_BRIGHTNESS;
tatsuyanah 0:c837d6abadc5 260 n_brightness-=(int)f_temp;
tatsuyanah 0:c837d6abadc5 261 if(n_brightness<0)
tatsuyanah 0:c837d6abadc5 262 n_brightness=0;
tatsuyanah 0:c837d6abadc5 263 }
tatsuyanah 0:c837d6abadc5 264 else
tatsuyanah 0:c837d6abadc5 265 {
tatsuyanah 0:c837d6abadc5 266 f_temp=un_prev_data-aun_red_buffer[i];
tatsuyanah 0:c837d6abadc5 267 f_temp/=(un_max-un_min);
tatsuyanah 0:c837d6abadc5 268 f_temp*=MAX_BRIGHTNESS;
tatsuyanah 0:c837d6abadc5 269 n_brightness+=(int)f_temp;
tatsuyanah 0:c837d6abadc5 270 if(n_brightness>MAX_BRIGHTNESS)
tatsuyanah 0:c837d6abadc5 271 n_brightness=MAX_BRIGHTNESS;
tatsuyanah 0:c837d6abadc5 272 }
tatsuyanah 0:c837d6abadc5 273 //pc.printf("red=%i, ir=%i, HR=%i,HRvalid=%i,SpO2=%i,SPO2Valid=%i\n\r",aun_red_buffer[i],aun_ir_buffer[i],n_heart_rate, ch_hr_valid, n_sp02, ch_spo2_valid);
tatsuyanah 0:c837d6abadc5 274
tatsuyanah 0:c837d6abadc5 275 }
tatsuyanah 0:c837d6abadc5 276 maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);
tatsuyanah 0:c837d6abadc5 277 sprintf(Vcc,"%i",n_heart_rate);
tatsuyanah 1:417090fd8386 278
tatsuyanah 1:417090fd8386 279 }
tatsuyanah 1:417090fd8386 280
tatsuyanah 1:417090fd8386 281 void heartbeatUpdateB()
tatsuyanah 1:417090fd8386 282 {
tatsuyanah 1:417090fd8386 283 i=0;
tatsuyanah 1:417090fd8386 284 un_min1=0x3FFFF;
tatsuyanah 1:417090fd8386 285 un_max1=0;
tatsuyanah 1:417090fd8386 286
tatsuyanah 1:417090fd8386 287 //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top
tatsuyanah 1:417090fd8386 288 for(i=100;i<500;i++)
tatsuyanah 1:417090fd8386 289 {
tatsuyanah 1:417090fd8386 290 aun_red_buffer1[i-100]=aun_red_buffer1[i];
tatsuyanah 1:417090fd8386 291 aun_ir_buffer1[i-100]=aun_ir_buffer1[i];
tatsuyanah 1:417090fd8386 292
tatsuyanah 1:417090fd8386 293 //update the signal min and max
tatsuyanah 1:417090fd8386 294 if(un_min1>aun_red_buffer1[i])
tatsuyanah 1:417090fd8386 295 un_min1=aun_red_buffer1[i];
tatsuyanah 1:417090fd8386 296 if(un_max1<aun_red_buffer1[i])
tatsuyanah 1:417090fd8386 297 un_max1=aun_red_buffer1[i];
tatsuyanah 1:417090fd8386 298 }
tatsuyanah 1:417090fd8386 299
tatsuyanah 1:417090fd8386 300 //take 100 sets of samples before calculating the heart rate.
tatsuyanah 1:417090fd8386 301 for(i=400;i<500;i++)
tatsuyanah 1:417090fd8386 302 {
tatsuyanah 1:417090fd8386 303 un_prev_data1=aun_red_buffer1[i-1];
tatsuyanah 1:417090fd8386 304 while(INT1.read()==1);
tatsuyanah 1:417090fd8386 305 maxim_max30101_read_fifo((aun_red_buffer1+i), (aun_ir_buffer1+i));
tatsuyanah 1:417090fd8386 306
tatsuyanah 1:417090fd8386 307 if(aun_red_buffer1[i]>un_prev_data1)
tatsuyanah 1:417090fd8386 308 {
tatsuyanah 1:417090fd8386 309 f_temp1=aun_red_buffer1[i]-un_prev_data1;
tatsuyanah 1:417090fd8386 310 f_temp1/=(un_max1-un_min1);
tatsuyanah 1:417090fd8386 311 f_temp1*=MAX_BRIGHTNESS;
tatsuyanah 1:417090fd8386 312 n_brightness1-=(int)f_temp1;
tatsuyanah 1:417090fd8386 313 if(n_brightness1<0)
tatsuyanah 1:417090fd8386 314 n_brightness1=0;
tatsuyanah 1:417090fd8386 315 }
tatsuyanah 1:417090fd8386 316 else
tatsuyanah 1:417090fd8386 317 {
tatsuyanah 1:417090fd8386 318 f_temp1=un_prev_data1-aun_red_buffer1[i];
tatsuyanah 1:417090fd8386 319 f_temp1/=(un_max1-un_min1);
tatsuyanah 1:417090fd8386 320 f_temp1*=MAX_BRIGHTNESS;
tatsuyanah 1:417090fd8386 321 n_brightness1+=(int)f_temp1;
tatsuyanah 1:417090fd8386 322 if(n_brightness1>MAX_BRIGHTNESS)
tatsuyanah 1:417090fd8386 323 n_brightness1=MAX_BRIGHTNESS;
tatsuyanah 1:417090fd8386 324 }
tatsuyanah 1:417090fd8386 325 //pc.printf("red=%i, ir=%i, HR=%i,HRvalid=%i,SpO2=%i,SPO2Valid=%i\n\r",aun_red_buffer[i],aun_ir_buffer[i],n_heart_rate, ch_hr_valid, n_sp02, ch_spo2_valid);
tatsuyanah 1:417090fd8386 326
tatsuyanah 1:417090fd8386 327 }
tatsuyanah 1:417090fd8386 328 maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer1, n_ir_buffer_length1, aun_red_buffer1, &n_sp021, &ch_spo2_valid1, &n_heart_rate1, &ch_hr_valid1);
tatsuyanah 1:417090fd8386 329 sprintf(Vcc,"%i",n_heart_rate1);
tatsuyanah 1:417090fd8386 330
tatsuyanah 1:417090fd8386 331 }
tatsuyanah 1:417090fd8386 332
tatsuyanah 1:417090fd8386 333 int main()
tatsuyanah 1:417090fd8386 334 {
tatsuyanah 1:417090fd8386 335 pc.baud(115200);
tatsuyanah 1:417090fd8386 336 esp.baud(9600);
tatsuyanah 1:417090fd8386 337 led1=1,led2=0,led3=0, led4=0;
tatsuyanah 1:417090fd8386 338 // Setup a serial interrupt function to receive data
tatsuyanah 1:417090fd8386 339 esp.attach(&Rx_interrupt, Serial::RxIrq);
tatsuyanah 1:417090fd8386 340 // Setup a serial interrupt function to transmit data
tatsuyanah 1:417090fd8386 341 esp.attach(&Tx_interrupt, Serial::TxIrq);
tatsuyanah 1:417090fd8386 342 if (time(NULL) < 1420070400) {
tatsuyanah 1:417090fd8386 343 setRTC();
tatsuyanah 1:417090fd8386 344 }
tatsuyanah 1:417090fd8386 345 startserver();
tatsuyanah 1:417090fd8386 346 DataRX=0;
tatsuyanah 1:417090fd8386 347 count=0;
tatsuyanah 1:417090fd8386 348 heartbeatInitB();
tatsuyanah 1:417090fd8386 349 heartbeatInitA();
tatsuyanah 1:417090fd8386 350 timer1second.start();
tatsuyanah 1:417090fd8386 351 while(1) {
tatsuyanah 1:417090fd8386 352 if(DataRX==1)
tatsuyanah 1:417090fd8386 353 {
tatsuyanah 1:417090fd8386 354 ReadWebData();
tatsuyanah 1:417090fd8386 355 esp.attach(&Rx_interrupt, Serial::RxIrq);
tatsuyanah 1:417090fd8386 356 }
tatsuyanah 1:417090fd8386 357
tatsuyanah 1:417090fd8386 358 heartbeatUpdateB();
tatsuyanah 1:417090fd8386 359 heartbeatUpdateA();
tatsuyanah 0:c837d6abadc5 360
tatsuyanah 0:c837d6abadc5 361 if(timer1second.read()>2)
tatsuyanah 0:c837d6abadc5 362 {
tatsuyanah 0:c837d6abadc5 363 timer1second.reset();
tatsuyanah 1:417090fd8386 364
tatsuyanah 0:c837d6abadc5 365 gettime();
tatsuyanah 0:c837d6abadc5 366 gettemp();
tatsuyanah 0:c837d6abadc5 367 // getbattery();
tatsuyanah 0:c837d6abadc5 368
tatsuyanah 1:417090fd8386 369 count++;
tatsuyanah 1:417090fd8386 370 sprintf(cmdbuff, "count,time,analog1,analog2=%d,\"%s\",\"%s\",\"%s\"\r\n",count,timebuf,TempA,Vcc);
tatsuyanah 1:417090fd8386 371
tatsuyanah 0:c837d6abadc5 372 SendCMD();
tatsuyanah 0:c837d6abadc5 373 getreply();
tatsuyanah 0:c837d6abadc5 374
tatsuyanah 0:c837d6abadc5 375 update=0;
tatsuyanah 0:c837d6abadc5 376
tatsuyanah 0:c837d6abadc5 377 }
tatsuyanah 0:c837d6abadc5 378 }
tatsuyanah 0:c837d6abadc5 379 }
tatsuyanah 0:c837d6abadc5 380
tatsuyanah 0:c837d6abadc5 381 // Reads and processes GET and POST web data
tatsuyanah 0:c837d6abadc5 382 void ReadWebData()
tatsuyanah 0:c837d6abadc5 383 {
tatsuyanah 0:c837d6abadc5 384 wait_ms(200);
tatsuyanah 0:c837d6abadc5 385 esp.attach(NULL,Serial::RxIrq);
tatsuyanah 0:c837d6abadc5 386 DataRX=0;
tatsuyanah 0:c837d6abadc5 387 memset(webdata, '\0', sizeof(webdata));
tatsuyanah 0:c837d6abadc5 388 strcpy(webdata, rx_buffer);
tatsuyanah 0:c837d6abadc5 389 memset(rx_buffer, '\0', sizeof(rx_buffer));
tatsuyanah 0:c837d6abadc5 390 rx_in = 0;
tatsuyanah 0:c837d6abadc5 391 rx_out = 0;
tatsuyanah 0:c837d6abadc5 392 // check web data for form information
tatsuyanah 0:c837d6abadc5 393 if( strstr(webdata, "check=led1v") != NULL ) {
tatsuyanah 0:c837d6abadc5 394 led1=!led1;
tatsuyanah 0:c837d6abadc5 395 }
tatsuyanah 0:c837d6abadc5 396 if( strstr(webdata, "check=led2v") != NULL ) {
tatsuyanah 0:c837d6abadc5 397 led2=!led2;
tatsuyanah 0:c837d6abadc5 398 }
tatsuyanah 0:c837d6abadc5 399 if( strstr(webdata, "check=led3v") != NULL ) {
tatsuyanah 0:c837d6abadc5 400 led3=!led3;
tatsuyanah 0:c837d6abadc5 401 }
tatsuyanah 0:c837d6abadc5 402 if( strstr(webdata, "check=led4v") != NULL ) {
tatsuyanah 0:c837d6abadc5 403 led4=!led4;
tatsuyanah 0:c837d6abadc5 404 }
tatsuyanah 0:c837d6abadc5 405 if( strstr(webdata, "POST") != NULL ) { // set update flag if POST request
tatsuyanah 0:c837d6abadc5 406 update=1;
tatsuyanah 0:c837d6abadc5 407 }
tatsuyanah 0:c837d6abadc5 408 if( strstr(webdata, "GET") != NULL && strstr(webdata, "favicon") == NULL ) { // set update flag for GET request but do not want to update for favicon requests
tatsuyanah 0:c837d6abadc5 409 update=1;
tatsuyanah 0:c837d6abadc5 410 }
tatsuyanah 0:c837d6abadc5 411 }
tatsuyanah 0:c837d6abadc5 412 // Starts webserver
tatsuyanah 0:c837d6abadc5 413 void startserver()
tatsuyanah 0:c837d6abadc5 414 {
tatsuyanah 0:c837d6abadc5 415 gettime();
tatsuyanah 0:c837d6abadc5 416 gettemp();
tatsuyanah 0:c837d6abadc5 417 getbattery();
tatsuyanah 0:c837d6abadc5 418 pc.printf("++++++++++ Resetting ESP ++++++++++\r\n");
tatsuyanah 0:c837d6abadc5 419 strcpy(cmdbuff,"node.restart()\r\n");
tatsuyanah 0:c837d6abadc5 420 SendCMD();
tatsuyanah 0:c837d6abadc5 421 wait(2);
tatsuyanah 0:c837d6abadc5 422 getreply();
tatsuyanah 0:c837d6abadc5 423
tatsuyanah 0:c837d6abadc5 424 pc.printf("\n++++++++++ Starting Server ++++++++++\r\n> ");
tatsuyanah 0:c837d6abadc5 425
tatsuyanah 0:c837d6abadc5 426 // initial values
tatsuyanah 1:417090fd8386 427 sprintf(cmdbuff, "count,time,analog1,analog2=0,\"%s\",\"%s\",\"%s\"\r\n",timebuf,TempA,Vcc);
tatsuyanah 0:c837d6abadc5 428 SendCMD();
tatsuyanah 0:c837d6abadc5 429 getreply();
tatsuyanah 0:c837d6abadc5 430 wait(0.5);
tatsuyanah 0:c837d6abadc5 431
tatsuyanah 0:c837d6abadc5 432 //create server
tatsuyanah 0:c837d6abadc5 433 sprintf(cmdbuff, "srv=net.createServer(net.TCP,%d)\r\n",SERVtimeout);
tatsuyanah 0:c837d6abadc5 434 SendCMD();
tatsuyanah 0:c837d6abadc5 435 getreply();
tatsuyanah 0:c837d6abadc5 436 wait(0.5);
tatsuyanah 0:c837d6abadc5 437 strcpy(cmdbuff,"srv:listen(80,function(conn)\r\n");
tatsuyanah 0:c837d6abadc5 438 SendCMD();
tatsuyanah 0:c837d6abadc5 439 getreply();
tatsuyanah 0:c837d6abadc5 440 wait(0.3);
tatsuyanah 0:c837d6abadc5 441 strcpy(cmdbuff,"conn:on(\"receive\",function(conn,payload) \r\n");
tatsuyanah 0:c837d6abadc5 442 SendCMD();
tatsuyanah 0:c837d6abadc5 443 getreply();
tatsuyanah 0:c837d6abadc5 444 wait(0.3);
tatsuyanah 0:c837d6abadc5 445
tatsuyanah 0:c837d6abadc5 446 //print data to mbed
tatsuyanah 0:c837d6abadc5 447 strcpy(cmdbuff,"print(payload)\r\n");
tatsuyanah 0:c837d6abadc5 448 SendCMD();
tatsuyanah 0:c837d6abadc5 449 getreply();
tatsuyanah 0:c837d6abadc5 450 wait(0.2);
tatsuyanah 0:c837d6abadc5 451
tatsuyanah 0:c837d6abadc5 452 //web page data
tatsuyanah 0:c837d6abadc5 453 strcpy(cmdbuff,"conn:send('<!DOCTYPE html><html><meta http-equiv=\"refresh\" content=\"2\"><body><h1>Meditek Web Monitor</h1>')\r\n");
tatsuyanah 0:c837d6abadc5 454 SendCMD();
tatsuyanah 0:c837d6abadc5 455 getreply();
tatsuyanah 0:c837d6abadc5 456 wait(0.4);
tatsuyanah 0:c837d6abadc5 457 strcpy(cmdbuff,"conn:send('Hit count: '..count..'')\r\n");
tatsuyanah 0:c837d6abadc5 458 SendCMD();
tatsuyanah 0:c837d6abadc5 459 getreply();
tatsuyanah 0:c837d6abadc5 460 wait(0.2);
tatsuyanah 0:c837d6abadc5 461 strcpy(cmdbuff,"conn:send('<br>Last hit (based on mbed RTC time): '..time..'<br><hr>')\r\n");
tatsuyanah 0:c837d6abadc5 462 SendCMD();
tatsuyanah 0:c837d6abadc5 463 getreply();
tatsuyanah 0:c837d6abadc5 464 wait(0.4);
tatsuyanah 0:c837d6abadc5 465
tatsuyanah 0:c837d6abadc5 466 strcpy(cmdbuff,"conn:send('Current Temp is : '..analog1..' C<br>Current HeartRate is : '..analog2..' count/min<br><hr>')\r\n");
tatsuyanah 0:c837d6abadc5 467 SendCMD();
tatsuyanah 0:c837d6abadc5 468 getreply();
tatsuyanah 0:c837d6abadc5 469 wait(0.3);
tatsuyanah 0:c837d6abadc5 470 strcpy(cmdbuff,"conn:send('<form method=\"POST\"')\r\n");
tatsuyanah 0:c837d6abadc5 471 SendCMD();
tatsuyanah 0:c837d6abadc5 472 getreply();
tatsuyanah 0:c837d6abadc5 473 wait(0.3);
tatsuyanah 0:c837d6abadc5 474 strcpy(cmdbuff, "conn:send('<p><input type=\"checkbox\" name=\"check\" value=\"led1v\"> flip LED1')\r\n");
tatsuyanah 0:c837d6abadc5 475 SendCMD();
tatsuyanah 0:c837d6abadc5 476 getreply();
tatsuyanah 0:c837d6abadc5 477 wait(0.3);
tatsuyanah 0:c837d6abadc5 478 strcpy(cmdbuff, "conn:send('<p><input type=\"checkbox\" name=\"check\" value=\"led2v\"> flip LED2')\r\n");
tatsuyanah 0:c837d6abadc5 479 SendCMD();
tatsuyanah 0:c837d6abadc5 480 getreply();
tatsuyanah 0:c837d6abadc5 481 wait(0.3);
tatsuyanah 0:c837d6abadc5 482 strcpy(cmdbuff, "conn:send('<p><input type=\"checkbox\" name=\"check\" value=\"led3v\"> flip LED3')\r\n");
tatsuyanah 0:c837d6abadc5 483 SendCMD();
tatsuyanah 0:c837d6abadc5 484 getreply();
tatsuyanah 0:c837d6abadc5 485 wait(0.3);
tatsuyanah 0:c837d6abadc5 486 strcpy(cmdbuff, "conn:send('<p><input type=\"checkbox\" name=\"check\" value=\"led4v\"> flip LED4')\r\n");
tatsuyanah 0:c837d6abadc5 487 SendCMD();
tatsuyanah 0:c837d6abadc5 488 getreply();
tatsuyanah 0:c837d6abadc5 489 wait(0.3);
tatsuyanah 0:c837d6abadc5 490 strcpy(cmdbuff,"conn:send('<p><input type=\"submit\" value=\"send-refresh\"></form>')\r\n");
tatsuyanah 0:c837d6abadc5 491 SendCMD();
tatsuyanah 0:c837d6abadc5 492 getreply();
tatsuyanah 0:c837d6abadc5 493 wait(0.3);
tatsuyanah 0:c837d6abadc5 494 strcpy(cmdbuff, "conn:send('<p><h2>How to use:</h2><ul><li>Select a checkbox to flip on/off</li><li>Click Send-Refresh to send data and refresh values</li></ul></body></html>')\r\n");
tatsuyanah 0:c837d6abadc5 495 SendCMD();
tatsuyanah 0:c837d6abadc5 496 getreply();
tatsuyanah 0:c837d6abadc5 497 wait(0.5);
tatsuyanah 0:c837d6abadc5 498 // end web page data
tatsuyanah 0:c837d6abadc5 499 strcpy(cmdbuff, "conn:on(\"sent\",function(conn) conn:close() end)\r\n"); // close current connection
tatsuyanah 0:c837d6abadc5 500 SendCMD();
tatsuyanah 0:c837d6abadc5 501 getreply();
tatsuyanah 0:c837d6abadc5 502 wait(0.3);
tatsuyanah 0:c837d6abadc5 503 strcpy(cmdbuff, "end)\r\n");
tatsuyanah 0:c837d6abadc5 504 SendCMD();
tatsuyanah 0:c837d6abadc5 505 getreply();
tatsuyanah 0:c837d6abadc5 506 wait(0.2);
tatsuyanah 0:c837d6abadc5 507 strcpy(cmdbuff, "end)\r\n");
tatsuyanah 0:c837d6abadc5 508 SendCMD();
tatsuyanah 0:c837d6abadc5 509 getreply();
tatsuyanah 0:c837d6abadc5 510 wait(0.2);
tatsuyanah 0:c837d6abadc5 511
tatsuyanah 0:c837d6abadc5 512 strcpy(cmdbuff, "tmr.alarm(0, 1000, 1, function()\r\n");
tatsuyanah 0:c837d6abadc5 513 SendCMD();
tatsuyanah 0:c837d6abadc5 514 getreply();
tatsuyanah 0:c837d6abadc5 515 wait(0.2);
tatsuyanah 0:c837d6abadc5 516 strcpy(cmdbuff, "if wifi.sta.getip() == nil then\r\n");
tatsuyanah 0:c837d6abadc5 517 SendCMD();
tatsuyanah 0:c837d6abadc5 518 getreply();
tatsuyanah 0:c837d6abadc5 519 wait(0.2);
tatsuyanah 0:c837d6abadc5 520 strcpy(cmdbuff, "print(\"Connecting to AP...\\n\")\r\n");
tatsuyanah 0:c837d6abadc5 521 SendCMD();
tatsuyanah 0:c837d6abadc5 522 getreply();
tatsuyanah 0:c837d6abadc5 523 wait(0.2);
tatsuyanah 0:c837d6abadc5 524 strcpy(cmdbuff, "else\r\n");
tatsuyanah 0:c837d6abadc5 525 SendCMD();
tatsuyanah 0:c837d6abadc5 526 getreply();
tatsuyanah 0:c837d6abadc5 527 wait(0.2);
tatsuyanah 0:c837d6abadc5 528 strcpy(cmdbuff, "ip, nm, gw=wifi.sta.getip()\r\n");
tatsuyanah 0:c837d6abadc5 529 SendCMD();
tatsuyanah 0:c837d6abadc5 530 getreply();
tatsuyanah 0:c837d6abadc5 531 wait(0.2);
tatsuyanah 0:c837d6abadc5 532 strcpy(cmdbuff,"print(\"IP Address: \",ip)\r\n");
tatsuyanah 0:c837d6abadc5 533 SendCMD();
tatsuyanah 0:c837d6abadc5 534 getreply();
tatsuyanah 0:c837d6abadc5 535 wait(0.2);
tatsuyanah 0:c837d6abadc5 536 strcpy(cmdbuff,"tmr.stop(0)\r\n");
tatsuyanah 0:c837d6abadc5 537 SendCMD();
tatsuyanah 0:c837d6abadc5 538 getreply();
tatsuyanah 0:c837d6abadc5 539 wait(0.2);
tatsuyanah 0:c837d6abadc5 540 strcpy(cmdbuff,"end\r\n");
tatsuyanah 0:c837d6abadc5 541 SendCMD();
tatsuyanah 0:c837d6abadc5 542 getreply();
tatsuyanah 0:c837d6abadc5 543 wait(0.2);
tatsuyanah 0:c837d6abadc5 544 strcpy(cmdbuff,"end)\r\n");
tatsuyanah 0:c837d6abadc5 545 SendCMD();
tatsuyanah 0:c837d6abadc5 546 getreply();
tatsuyanah 0:c837d6abadc5 547 wait(0.2);
tatsuyanah 0:c837d6abadc5 548
tatsuyanah 0:c837d6abadc5 549 pc.printf("\n\n++++++++++ Ready ++++++++++\r\n\n");
tatsuyanah 0:c837d6abadc5 550 }
tatsuyanah 0:c837d6abadc5 551
tatsuyanah 0:c837d6abadc5 552
tatsuyanah 0:c837d6abadc5 553 // ESP Command data send
tatsuyanah 0:c837d6abadc5 554 void SendCMD()
tatsuyanah 0:c837d6abadc5 555 {
tatsuyanah 0:c837d6abadc5 556 int i;
tatsuyanah 0:c837d6abadc5 557 char temp_char;
tatsuyanah 0:c837d6abadc5 558 bool empty;
tatsuyanah 0:c837d6abadc5 559 i = 0;
tatsuyanah 0:c837d6abadc5 560 // Start Critical Section - don't interrupt while changing global buffer variables
tatsuyanah 0:c837d6abadc5 561 NVIC_DisableIRQ(UART1_IRQn);
tatsuyanah 0:c837d6abadc5 562 empty = (tx_in == tx_out);
tatsuyanah 0:c837d6abadc5 563 while ((i==0) || (cmdbuff[i-1] != '\n')) {
tatsuyanah 0:c837d6abadc5 564 // Wait if buffer full
tatsuyanah 0:c837d6abadc5 565 if (((tx_in + 1) % buffer_size) == tx_out) {
tatsuyanah 0:c837d6abadc5 566 // End Critical Section - need to let interrupt routine empty buffer by sending
tatsuyanah 0:c837d6abadc5 567 NVIC_EnableIRQ(UART1_IRQn);
tatsuyanah 0:c837d6abadc5 568 while (((tx_in + 1) % buffer_size) == tx_out) {
tatsuyanah 0:c837d6abadc5 569 }
tatsuyanah 0:c837d6abadc5 570 // Start Critical Section - don't interrupt while changing global buffer variables
tatsuyanah 0:c837d6abadc5 571 NVIC_DisableIRQ(UART1_IRQn);
tatsuyanah 0:c837d6abadc5 572 }
tatsuyanah 0:c837d6abadc5 573 tx_buffer[tx_in] = cmdbuff[i];
tatsuyanah 0:c837d6abadc5 574 i++;
tatsuyanah 0:c837d6abadc5 575 tx_in = (tx_in + 1) % buffer_size;
tatsuyanah 0:c837d6abadc5 576 }
tatsuyanah 0:c837d6abadc5 577 if (esp.writeable() && (empty)) {
tatsuyanah 0:c837d6abadc5 578 temp_char = tx_buffer[tx_out];
tatsuyanah 0:c837d6abadc5 579 tx_out = (tx_out + 1) % buffer_size;
tatsuyanah 0:c837d6abadc5 580 // Send first character to start tx interrupts, if stopped
tatsuyanah 0:c837d6abadc5 581 esp.putc(temp_char);
tatsuyanah 0:c837d6abadc5 582 }
tatsuyanah 0:c837d6abadc5 583 // End Critical Section
tatsuyanah 0:c837d6abadc5 584 NVIC_EnableIRQ(UART1_IRQn);
tatsuyanah 0:c837d6abadc5 585 return;
tatsuyanah 0:c837d6abadc5 586 }
tatsuyanah 0:c837d6abadc5 587
tatsuyanah 0:c837d6abadc5 588 // Get Command and ESP status replies
tatsuyanah 0:c837d6abadc5 589 void getreply()
tatsuyanah 0:c837d6abadc5 590 {
tatsuyanah 0:c837d6abadc5 591 read_line();
tatsuyanah 0:c837d6abadc5 592 sscanf(rx_line,replybuff);
tatsuyanah 0:c837d6abadc5 593 }
tatsuyanah 0:c837d6abadc5 594
tatsuyanah 0:c837d6abadc5 595 // Read a line from the large rx buffer from rx interrupt routine
tatsuyanah 0:c837d6abadc5 596 void read_line() {
tatsuyanah 0:c837d6abadc5 597 int i;
tatsuyanah 0:c837d6abadc5 598 i = 0;
tatsuyanah 0:c837d6abadc5 599 // Start Critical Section - don't interrupt while changing global buffer variables
tatsuyanah 0:c837d6abadc5 600 NVIC_DisableIRQ(UART1_IRQn);
tatsuyanah 0:c837d6abadc5 601 // Loop reading rx buffer characters until end of line character
tatsuyanah 0:c837d6abadc5 602 while ((i==0) || (rx_line[i-1] != '\r')) {
tatsuyanah 0:c837d6abadc5 603 // Wait if buffer empty
tatsuyanah 0:c837d6abadc5 604 if (rx_in == rx_out) {
tatsuyanah 0:c837d6abadc5 605 // End Critical Section - need to allow rx interrupt to get new characters for buffer
tatsuyanah 0:c837d6abadc5 606 NVIC_EnableIRQ(UART1_IRQn);
tatsuyanah 0:c837d6abadc5 607 while (rx_in == rx_out) {
tatsuyanah 0:c837d6abadc5 608 }
tatsuyanah 0:c837d6abadc5 609 // Start Critical Section - don't interrupt while changing global buffer variables
tatsuyanah 0:c837d6abadc5 610 NVIC_DisableIRQ(UART1_IRQn);
tatsuyanah 0:c837d6abadc5 611 }
tatsuyanah 0:c837d6abadc5 612 rx_line[i] = rx_buffer[rx_out];
tatsuyanah 0:c837d6abadc5 613 i++;
tatsuyanah 0:c837d6abadc5 614 rx_out = (rx_out + 1) % buffer_size;
tatsuyanah 0:c837d6abadc5 615 }
tatsuyanah 0:c837d6abadc5 616 // End Critical Section
tatsuyanah 0:c837d6abadc5 617 NVIC_EnableIRQ(UART1_IRQn);
tatsuyanah 0:c837d6abadc5 618 rx_line[i-1] = 0;
tatsuyanah 0:c837d6abadc5 619 return;
tatsuyanah 0:c837d6abadc5 620 }
tatsuyanah 0:c837d6abadc5 621
tatsuyanah 0:c837d6abadc5 622
tatsuyanah 0:c837d6abadc5 623 // Interupt Routine to read in data from serial port
tatsuyanah 0:c837d6abadc5 624 void Rx_interrupt() {
tatsuyanah 0:c837d6abadc5 625 DataRX=1;
tatsuyanah 0:c837d6abadc5 626 //led3=1;
tatsuyanah 0:c837d6abadc5 627 // Loop just in case more than one character is in UART's receive FIFO buffer
tatsuyanah 0:c837d6abadc5 628 // Stop if buffer full
tatsuyanah 0:c837d6abadc5 629 while ((esp.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
tatsuyanah 0:c837d6abadc5 630 rx_buffer[rx_in] = esp.getc();
tatsuyanah 0:c837d6abadc5 631 // Uncomment to Echo to USB serial to watch data flow
tatsuyanah 0:c837d6abadc5 632 pc.putc(rx_buffer[rx_in]);
tatsuyanah 0:c837d6abadc5 633 rx_in = (rx_in + 1) % buffer_size;
tatsuyanah 0:c837d6abadc5 634 }
tatsuyanah 0:c837d6abadc5 635 //led3=0;
tatsuyanah 0:c837d6abadc5 636 return;
tatsuyanah 0:c837d6abadc5 637 }
tatsuyanah 0:c837d6abadc5 638
tatsuyanah 0:c837d6abadc5 639
tatsuyanah 0:c837d6abadc5 640 // Interupt Routine to write out data to serial port
tatsuyanah 0:c837d6abadc5 641 void Tx_interrupt() {
tatsuyanah 0:c837d6abadc5 642 //led2=1;
tatsuyanah 0:c837d6abadc5 643 // Loop to fill more than one character in UART's transmit FIFO buffer
tatsuyanah 0:c837d6abadc5 644 // Stop if buffer empty
tatsuyanah 0:c837d6abadc5 645 while ((esp.writeable()) && (tx_in != tx_out)) {
tatsuyanah 0:c837d6abadc5 646 esp.putc(tx_buffer[tx_out]);
tatsuyanah 0:c837d6abadc5 647 tx_out = (tx_out + 1) % buffer_size;
tatsuyanah 0:c837d6abadc5 648 }
tatsuyanah 0:c837d6abadc5 649 //led2=0;
tatsuyanah 0:c837d6abadc5 650 return;
tatsuyanah 0:c837d6abadc5 651 }
tatsuyanah 0:c837d6abadc5 652
tatsuyanah 0:c837d6abadc5 653 void gettime()
tatsuyanah 0:c837d6abadc5 654 {
tatsuyanah 0:c837d6abadc5 655 time_t seconds = time(NULL);
tatsuyanah 0:c837d6abadc5 656 strftime(timebuf,50,"%H:%M:%S %a %d %b %y", localtime(&seconds));
tatsuyanah 0:c837d6abadc5 657 }
tatsuyanah 0:c837d6abadc5 658
tatsuyanah 0:c837d6abadc5 659 void setRTC()
tatsuyanah 0:c837d6abadc5 660 {
tatsuyanah 0:c837d6abadc5 661 t.tm_sec = (0); // 0-59
tatsuyanah 0:c837d6abadc5 662 t.tm_min = (minute); // 0-59
tatsuyanah 0:c837d6abadc5 663 t.tm_hour = (hour); // 0-23
tatsuyanah 0:c837d6abadc5 664 t.tm_mday = (dayofmonth); // 1-31
tatsuyanah 0:c837d6abadc5 665 t.tm_mon = (month-1); // 0-11 "0" = Jan, -1 added for Mbed RCT clock format
tatsuyanah 0:c837d6abadc5 666 t.tm_year = ((year)+100); // year since 1900, current DCF year + 100 + 1900 = correct year
tatsuyanah 0:c837d6abadc5 667 set_time(mktime(&t)); // set RTC clock
tatsuyanah 0:c837d6abadc5 668 }
tatsuyanah 0:c837d6abadc5 669 // Analog in example
tatsuyanah 0:c837d6abadc5 670 void getbattery()
tatsuyanah 0:c837d6abadc5 671 {
tatsuyanah 0:c837d6abadc5 672
tatsuyanah 0:c837d6abadc5 673 }
tatsuyanah 0:c837d6abadc5 674 // Temperature example
tatsuyanah 0:c837d6abadc5 675