Channel_ID

Dependencies:   MAX30003 max32630fthr DS1307

Committer:
kidecha_rahul
Date:
Tue May 18 23:43:34 2021 +0000
Revision:
16:8fc65c8fa0e8
Parent:
15:0356e9454a60
Channel_ID

Who changed what in which revision?

UserRevisionLine numberNew contents of line
coreyharris 6:86ac850c718d 1
parthsagar2010 8:6b9359f81cc0 2 #include "MAX30003.h"
coreyharris 0:38c49bc37c7c 3 #include "mbed.h"
coreyharris 0:38c49bc37c7c 4 #include "max32630fthr.h"
parthsagar2010 9:24ecf16eab0f 5 #include "ds1307.h"
parthsagar2010 11:300afaf2696b 6 //#include <BufferedSerial.h>
parthsagar2010 10:54aa50490b15 7 #include <string>
parthsagar2010 10:54aa50490b15 8 //#include <Serial.h>
parthsagar2010 11:300afaf2696b 9
parthsagar2010 11:300afaf2696b 10 #define TARGET_TX_PIN P3_1
parthsagar2010 11:300afaf2696b 11 #define TARGET_RX_PIN P3_0
parthsagar2010 11:300afaf2696b 12
parthsagar2010 9:24ecf16eab0f 13 Timer timer_fast;
parthsagar2010 10:54aa50490b15 14 Timer t;
coreyharris 0:38c49bc37c7c 15 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
coreyharris 0:38c49bc37c7c 16
parthsagar2010 9:24ecf16eab0f 17 void task_fast(void);
parthsagar2010 9:24ecf16eab0f 18 DigitalOut ledA(LED2);
parthsagar2010 13:0e7bbc06083f 19
coreyharris 0:38c49bc37c7c 20 void ecg_config(MAX30003 &ecgAFE);
parthsagar2010 11:300afaf2696b 21 //BufferedSerial pc(P3_1,P3_0); // Use USB debug probe for serial link static Unbuffered
kidecha_rahul 16:8fc65c8fa0e8 22 BufferedSerial pc(P0_1,P0_0);
kidecha_rahul 16:8fc65c8fa0e8 23
kidecha_rahul 16:8fc65c8fa0e8 24 //atic BufferedSerial pc(TARGET_TX_PIN, TARGET_RX_PIN, 230400); // 230400 works well
parthsagar2010 11:300afaf2696b 25
parthsagar2010 10:54aa50490b15 26 //Serial uart_1(USBTX, USBRX); // Use USB debug probe for serial link static Unbuffered
parthsagar2010 10:54aa50490b15 27 //
kidecha_rahul 16:8fc65c8fa0e8 28 //rial pc(P0_1,P0_0);
coreyharris 0:38c49bc37c7c 29 volatile bool ecgFIFOIntFlag = 0;
parthsagar2010 9:24ecf16eab0f 30 volatile bool timerflag = 0;
parthsagar2010 11:300afaf2696b 31
parthsagar2010 11:300afaf2696b 32 FileHandle *mbed::mbed_override_console(int fd)
parthsagar2010 11:300afaf2696b 33 {
parthsagar2010 11:300afaf2696b 34 return &pc;
parthsagar2010 11:300afaf2696b 35 }
parthsagar2010 11:300afaf2696b 36
parthsagar2010 8:6b9359f81cc0 37 void ecgFIFO_callback_1() { // Triggered when the ECG FIFO is about to be full
coreyharris 0:38c49bc37c7c 38
coreyharris 0:38c49bc37c7c 39 ecgFIFOIntFlag = 1;
coreyharris 0:38c49bc37c7c 40 }
coreyharris 0:38c49bc37c7c 41
parthsagar2010 12:10b49ad3c492 42 time_t asUnixTime(int year, int mon, int mday, int hour, int min, int sec) {
parthsagar2010 12:10b49ad3c492 43 struct tm t;
parthsagar2010 12:10b49ad3c492 44 t.tm_year = year - 1900;
parthsagar2010 12:10b49ad3c492 45 t.tm_mon = mon - 1; // convert to 0 based month
parthsagar2010 12:10b49ad3c492 46 t.tm_mday = mday;
parthsagar2010 12:10b49ad3c492 47 t.tm_hour = hour;
parthsagar2010 12:10b49ad3c492 48 t.tm_min = min;
parthsagar2010 12:10b49ad3c492 49 t.tm_sec = sec;
parthsagar2010 12:10b49ad3c492 50 t.tm_isdst = -1; // Is Daylight saving time on? 1 = yes, 0 = no, -1 = unknown
parthsagar2010 12:10b49ad3c492 51
parthsagar2010 12:10b49ad3c492 52 return mktime(&t); // returns seconds elapsed since January 1, 1970 (begin of the Epoch)
parthsagar2010 12:10b49ad3c492 53 }
parthsagar2010 11:300afaf2696b 54 int main(void)
coreyharris 3:420d5efbd967 55 {
parthsagar2010 11:300afaf2696b 56 // Constants
coreyharris 4:06e258ff0b97 57 const int EINT_STATUS_MASK = 1 << 23;
coreyharris 6:86ac850c718d 58 const int FIFO_OVF_MASK = 0x7;
coreyharris 6:86ac850c718d 59 const int FIFO_VALID_SAMPLE_MASK = 0x0;
coreyharris 6:86ac850c718d 60 const int FIFO_FAST_SAMPLE_MASK = 0x1;
coreyharris 6:86ac850c718d 61 const int ETAG_BITS_MASK = 0x7;
kidecha_rahul 16:8fc65c8fa0e8 62
parthsagar2010 9:24ecf16eab0f 63 timer_fast.start();
parthsagar2010 15:0356e9454a60 64 DigitalOut rLed(LED2, LED_ON);
kidecha_rahul 16:8fc65c8fa0e8 65
parthsagar2010 10:54aa50490b15 66 // pc.baud(9600);
coreyharris 3:420d5efbd967 67
parthsagar2010 11:300afaf2696b 68 //pc.set_baud(115200); // Baud rate = 115200
parthsagar2010 11:300afaf2696b 69 //pc.set_format(
parthsagar2010 11:300afaf2696b 70 // /* bits */ 8,
parthsagar2010 11:300afaf2696b 71 // /* parity */ BufferedSerial::None,
parthsagar2010 11:300afaf2696b 72 // /* stop bit */ 1 //1
parthsagar2010 11:300afaf2696b 73 //);
parthsagar2010 10:54aa50490b15 74 //uart_1.baud(115200);
coreyharris 1:86843c27cc81 75 InterruptIn ecgFIFO_int(P5_4); // Config P5_4 as int. in for the
parthsagar2010 8:6b9359f81cc0 76 ecgFIFO_int.fall(&ecgFIFO_callback_1); // ecg FIFO interrupt at falling edge
coreyharris 0:38c49bc37c7c 77
coreyharris 1:86843c27cc81 78 SPI spiBus(SPI2_MOSI, SPI2_MISO, SPI2_SCK); // SPI bus, P5_1 = MOSI,
coreyharris 1:86843c27cc81 79 // P5_2 = MISO, P5_0 = SCK
parthsagar2010 10:54aa50490b15 80
coreyharris 4:06e258ff0b97 81 MAX30003 ecgAFE(spiBus, P5_3); // New MAX30003 on spiBus, CS = P5_3
parthsagar2010 8:6b9359f81cc0 82
coreyharris 4:06e258ff0b97 83 ecg_config(ecgAFE); // Config ECG
parthsagar2010 12:10b49ad3c492 84
coreyharris 0:38c49bc37c7c 85
coreyharris 4:06e258ff0b97 86 ecgAFE.writeRegister( MAX30003::SYNCH , 0);
coreyharris 0:38c49bc37c7c 87
coreyharris 4:06e258ff0b97 88 uint32_t ecgFIFO, readECGSamples, idx, ETAG[32], status;
coreyharris 1:86843c27cc81 89 int16_t ecgSample[32];
kidecha_rahul 16:8fc65c8fa0e8 90 //-----------------------------------------------------------------------------------------------//
kidecha_rahul 16:8fc65c8fa0e8 91
parthsagar2010 9:24ecf16eab0f 92 //bool timerflag = false;
parthsagar2010 10:54aa50490b15 93 int16_t ecgSample_1sec[200];
kidecha_rahul 16:8fc65c8fa0e8 94 //uint8_t ecg_1 = 0;
kidecha_rahul 16:8fc65c8fa0e8 95 // uint8_t ecg_2 = 0;
parthsagar2010 10:54aa50490b15 96 uint16_t onesec_counter = 0;
parthsagar2010 10:54aa50490b15 97 uint16_t onesec_counter_temp = 0;
parthsagar2010 10:54aa50490b15 98
kidecha_rahul 16:8fc65c8fa0e8 99 uint8_t channel_ID[3]= {1,2,3};
kidecha_rahul 16:8fc65c8fa0e8 100 uint8_t ecg_1 = 0;
kidecha_rahul 16:8fc65c8fa0e8 101 uint8_t ecg_2 = 0;
kidecha_rahul 16:8fc65c8fa0e8 102 uint8_t ecg_3 = 0;
kidecha_rahul 16:8fc65c8fa0e8 103
parthsagar2010 9:24ecf16eab0f 104 int16_t sample = 300;
parthsagar2010 10:54aa50490b15 105 uint8_t final[10];
parthsagar2010 12:10b49ad3c492 106
parthsagar2010 10:54aa50490b15 107 uint16_t checksum_ = 0;
parthsagar2010 10:54aa50490b15 108 uint16_t mod_checksum = 0;
parthsagar2010 10:54aa50490b15 109
parthsagar2010 10:54aa50490b15 110 uint8_t p_1 = 0;
parthsagar2010 10:54aa50490b15 111 uint8_t p_2 = 0;
parthsagar2010 10:54aa50490b15 112 uint8_t p_3 = 0;
parthsagar2010 10:54aa50490b15 113 uint8_t p_4 = 0;
parthsagar2010 10:54aa50490b15 114
parthsagar2010 10:54aa50490b15 115 uint8_t data_len_1 = 0;
parthsagar2010 10:54aa50490b15 116 uint8_t data_len_2 = 0;
parthsagar2010 12:10b49ad3c492 117 uint32_t packet_1 = 0;
parthsagar2010 10:54aa50490b15 118 uint8_t cksm_1 = 0;
parthsagar2010 10:54aa50490b15 119 uint8_t cksm_2 = 0;
parthsagar2010 10:54aa50490b15 120 uint8_t header_device_id[3] = {0,0,210};
parthsagar2010 10:54aa50490b15 121 uint8_t header_packet_type[2] = {0,2};
parthsagar2010 10:54aa50490b15 122
parthsagar2010 10:54aa50490b15 123 uint8_t ending[5] = {'@','#','%','!','7'};
parthsagar2010 10:54aa50490b15 124
parthsagar2010 15:0356e9454a60 125 bool flip = true;
parthsagar2010 15:0356e9454a60 126 int sampleps = 0;
parthsagar2010 15:0356e9454a60 127
parthsagar2010 11:300afaf2696b 128 char buf[20];
kidecha_rahul 16:8fc65c8fa0e8 129
kidecha_rahul 16:8fc65c8fa0e8 130
kidecha_rahul 16:8fc65c8fa0e8 131
parthsagar2010 15:0356e9454a60 132 // pc.write("Welcome",8*sizeof(char));
parthsagar2010 15:0356e9454a60 133 // printf("In the main loop"); //printf("In the main loop");
parthsagar2010 11:300afaf2696b 134 bool flag_first = false;
kidecha_rahul 16:8fc65c8fa0e8 135 bool timestamp_reader = false;
parthsagar2010 11:300afaf2696b 136 do
parthsagar2010 11:300afaf2696b 137 {
kidecha_rahul 16:8fc65c8fa0e8 138 if (pc.readable()) // For nordic - Readiing time
parthsagar2010 12:10b49ad3c492 139 {
parthsagar2010 11:300afaf2696b 140 scanf("%s",buf);
parthsagar2010 15:0356e9454a60 141 //printf("The entered string is %s : \n ",buf);
parthsagar2010 12:10b49ad3c492 142
kidecha_rahul 16:8fc65c8fa0e8 143 packet_1 = atoi(buf); // converting ascii to integer
kidecha_rahul 16:8fc65c8fa0e8 144 set_time(packet_1); // check unit in packet_1 ??
parthsagar2010 12:10b49ad3c492 145
kidecha_rahul 16:8fc65c8fa0e8 146 if ((packet_1 % 60) == 0) // tim stamp at the beginning of time
parthsagar2010 15:0356e9454a60 147 {
parthsagar2010 15:0356e9454a60 148 /* for (int u = 0;u<3;u++)
parthsagar2010 15:0356e9454a60 149 {
parthsagar2010 15:0356e9454a60 150 if (pc.readable())
parthsagar2010 15:0356e9454a60 151 {
parthsagar2010 15:0356e9454a60 152 scanf("%s",buf);
parthsagar2010 15:0356e9454a60 153 printf("Entered the minute string %s : \n ",buf);
parthsagar2010 15:0356e9454a60 154
parthsagar2010 15:0356e9454a60 155 packet_1 = atoi(buf);
parthsagar2010 15:0356e9454a60 156 set_time(packet_1);
parthsagar2010 15:0356e9454a60 157 }
parthsagar2010 15:0356e9454a60 158 }*/
parthsagar2010 15:0356e9454a60 159 timestamp_reader = true;
parthsagar2010 15:0356e9454a60 160 }
parthsagar2010 15:0356e9454a60 161 else
parthsagar2010 15:0356e9454a60 162 {
parthsagar2010 15:0356e9454a60 163 //printf("The timestamp is not divisible by 60 \n");
parthsagar2010 15:0356e9454a60 164 }
parthsagar2010 12:10b49ad3c492 165 //flag_first = true;
coreyharris 2:812d40f1853d 166
parthsagar2010 11:300afaf2696b 167 }
parthsagar2010 11:300afaf2696b 168
parthsagar2010 15:0356e9454a60 169 }while (timestamp_reader==false); // take the third timestamp
kidecha_rahul 16:8fc65c8fa0e8 170
kidecha_rahul 16:8fc65c8fa0e8 171
kidecha_rahul 16:8fc65c8fa0e8 172
kidecha_rahul 16:8fc65c8fa0e8 173 while(1)
parthsagar2010 9:24ecf16eab0f 174 {
parthsagar2010 10:54aa50490b15 175
kidecha_rahul 16:8fc65c8fa0e8 176 if ((onesec_counter>=125)) //125 sample rate
parthsagar2010 9:24ecf16eab0f 177 {
parthsagar2010 11:300afaf2696b 178 //t.start();
parthsagar2010 10:54aa50490b15 179 //ledA = !ledA;
parthsagar2010 12:10b49ad3c492 180
kidecha_rahul 16:8fc65c8fa0e8 181 //pc.write((uint8_t *)header_device_id, sizeof(header_device_id)); // sensor ID
parthsagar2010 10:54aa50490b15 182
kidecha_rahul 16:8fc65c8fa0e8 183 // pc.write((uint8_t *)header_packet_type, sizeof(header_packet_type)); // packet type
kidecha_rahul 16:8fc65c8fa0e8 184
kidecha_rahul 16:8fc65c8fa0e8 185 time_t seconds = time(NULL); // setting zero
parthsagar2010 12:10b49ad3c492 186 packet_1 = seconds;
parthsagar2010 12:10b49ad3c492 187 //packet_1 ++;
parthsagar2010 15:0356e9454a60 188 // printf("Time as seconds since January 1, 1970 = %d\n", packet_1);
kidecha_rahul 16:8fc65c8fa0e8 189 p_1 = packet_1 & 0xff;
parthsagar2010 10:54aa50490b15 190 p_2 = (packet_1 >> 8) & 0xff;
parthsagar2010 10:54aa50490b15 191 p_3 = (packet_1 >> 16) & 0xff;
parthsagar2010 10:54aa50490b15 192 p_4 = (packet_1 >> 24) & 0xff;
parthsagar2010 10:54aa50490b15 193 // checksum_ = checksum_ + (packet_1 & 0xffff) + ((packet_1 >> 16) & 0xffff) ;
parthsagar2010 10:54aa50490b15 194 checksum_ = checksum_ + p_1 + p_2 + p_3 + p_4 ;
parthsagar2010 10:54aa50490b15 195 uint8_t header_packet_id[4] = {p_4,p_3,p_2,p_1};
kidecha_rahul 16:8fc65c8fa0e8 196 //pc.write((uint8_t *)header_packet_id, sizeof(header_packet_id)); //packet ID
kidecha_rahul 16:8fc65c8fa0e8 197
kidecha_rahul 16:8fc65c8fa0e8 198
kidecha_rahul 16:8fc65c8fa0e8 199 uint8_t Channel_Num = 0;
kidecha_rahul 16:8fc65c8fa0e8 200 if(ecg_1 == 1)
kidecha_rahul 16:8fc65c8fa0e8 201 Channel_Num = channel_ID[0];
kidecha_rahul 16:8fc65c8fa0e8 202 else if (ecg_2 == 1)
kidecha_rahul 16:8fc65c8fa0e8 203 Channel_Num = channel_ID[1];
kidecha_rahul 16:8fc65c8fa0e8 204 else if (ecg_3 == 1)
kidecha_rahul 16:8fc65c8fa0e8 205 Channel_Num = channel_ID[2];
kidecha_rahul 16:8fc65c8fa0e8 206 else
kidecha_rahul 16:8fc65c8fa0e8 207 Channel_Num = 0;
kidecha_rahul 16:8fc65c8fa0e8 208 //pc.write((uint8_t *)Channel_Num, sizeof(Channel_Num));
kidecha_rahul 16:8fc65c8fa0e8 209 printf("%6d\r\n", Channel_Num); //Channel no
kidecha_rahul 16:8fc65c8fa0e8 210
parthsagar2010 10:54aa50490b15 211 onesec_counter_temp = onesec_counter * 2;
parthsagar2010 10:54aa50490b15 212 data_len_1 = onesec_counter_temp & 0xff;
parthsagar2010 10:54aa50490b15 213 data_len_2 = (onesec_counter_temp >> 8) & 0xff;
kidecha_rahul 16:8fc65c8fa0e8 214 checksum_ = checksum_ + data_len_1 + data_len_2;
parthsagar2010 10:54aa50490b15 215 //pc.write((uint32_t *)packet_1, sizeof(packet_1));
parthsagar2010 10:54aa50490b15 216 uint8_t header_ecg_datalen[2] = {data_len_2,data_len_1};
kidecha_rahul 16:8fc65c8fa0e8 217 // pc.write((uint8_t *)header_ecg_datalen, sizeof(header_ecg_datalen)); // Data length
kidecha_rahul 16:8fc65c8fa0e8 218
kidecha_rahul 16:8fc65c8fa0e8 219
parthsagar2010 10:54aa50490b15 220 mod_checksum = checksum_ % 65536 ;
parthsagar2010 10:54aa50490b15 221 cksm_1 = mod_checksum & 0xff;
parthsagar2010 10:54aa50490b15 222 cksm_2 = (mod_checksum >> 8) & 0xff;
parthsagar2010 10:54aa50490b15 223 uint8_t header_ecg_checksum[2] = {cksm_2,cksm_1};
kidecha_rahul 16:8fc65c8fa0e8 224 //pc.write((uint8_t *)header_ecg_checksum, sizeof(header_ecg_checksum)); // checksum
parthsagar2010 10:54aa50490b15 225
kidecha_rahul 16:8fc65c8fa0e8 226 // pc.write((int16_t *)ecgSample_1sec,onesec_counter * sizeof(int16_t)); // ECG Data
kidecha_rahul 16:8fc65c8fa0e8 227 printf("Samples per second %d \n", (onesec_counter));
kidecha_rahul 16:8fc65c8fa0e8 228
kidecha_rahul 16:8fc65c8fa0e8 229
parthsagar2010 10:54aa50490b15 230 onesec_counter = 0;
parthsagar2010 10:54aa50490b15 231 // memset(ecgSample_1sec, 0, sizeof(ecgSample_1sec));
parthsagar2010 10:54aa50490b15 232
kidecha_rahul 16:8fc65c8fa0e8 233 // pc.write((uint8_t *)ending, sizeof(ending)); // Ending of data
kidecha_rahul 16:8fc65c8fa0e8 234
parthsagar2010 10:54aa50490b15 235 checksum_ = 0;
parthsagar2010 15:0356e9454a60 236 //t.stop();
parthsagar2010 11:300afaf2696b 237 // auto us = t.elapsed_time().count();
parthsagar2010 15:0356e9454a60 238 // float time_taken = us/1000000;
parthsagar2010 15:0356e9454a60 239 // printf("Timer time: %lu ms \n", (time_taken*100));
parthsagar2010 15:0356e9454a60 240 // t.reset();
parthsagar2010 15:0356e9454a60 241 // timer_fast.reset();
parthsagar2010 9:24ecf16eab0f 242 }
kidecha_rahul 16:8fc65c8fa0e8 243
kidecha_rahul 16:8fc65c8fa0e8 244
kidecha_rahul 16:8fc65c8fa0e8 245 // Read back ECG samples from the FIFO
kidecha_rahul 16:8fc65c8fa0e8 246 else if((ecgFIFOIntFlag==1))// && (timerflag == 0))
parthsagar2010 9:24ecf16eab0f 247 {
kidecha_rahul 16:8fc65c8fa0e8 248 ecg_1 = 1;
coreyharris 5:f8d1f651bef5 249 ecgFIFOIntFlag = 0;
coreyharris 4:06e258ff0b97 250 status = ecgAFE.readRegister( MAX30003::STATUS ); // Read the STATUS register
coreyharris 2:812d40f1853d 251
coreyharris 3:420d5efbd967 252 // Check if EINT interrupt asserted
parthsagar2010 9:24ecf16eab0f 253 if ( ( status & EINT_STATUS_MASK ) == EINT_STATUS_MASK )
parthsagar2010 9:24ecf16eab0f 254 {
coreyharris 3:420d5efbd967 255
coreyharris 4:06e258ff0b97 256 readECGSamples = 0; // Reset sample counter
coreyharris 3:420d5efbd967 257
coreyharris 2:812d40f1853d 258 do {
coreyharris 6:86ac850c718d 259 ecgFIFO = ecgAFE.readRegister( MAX30003::ECG_FIFO ); // Read FIFO
coreyharris 4:06e258ff0b97 260 ecgSample[readECGSamples] = ecgFIFO >> 8; // Isolate voltage data
parthsagar2010 10:54aa50490b15 261 ecgSample[readECGSamples] = ((ecgSample[readECGSamples]<<8)&0xFF00)|((ecgSample[readECGSamples]>>8)&0x00FF);
coreyharris 6:86ac850c718d 262 ETAG[readECGSamples] = ( ecgFIFO >> 3 ) & ETAG_BITS_MASK; // Isolate ETAG
coreyharris 4:06e258ff0b97 263 readECGSamples++; // Increment sample counter
coreyharris 3:420d5efbd967 264
coreyharris 3:420d5efbd967 265 // Check that sample is not last sample in FIFO
coreyharris 6:86ac850c718d 266 } while ( ETAG[readECGSamples-1] == FIFO_VALID_SAMPLE_MASK ||
coreyharris 6:86ac850c718d 267 ETAG[readECGSamples-1] == FIFO_FAST_SAMPLE_MASK );
coreyharris 2:812d40f1853d 268
coreyharris 3:420d5efbd967 269 // Check if FIFO has overflowed
parthsagar2010 9:24ecf16eab0f 270 if( ETAG[readECGSamples - 1] == FIFO_OVF_MASK )
parthsagar2010 9:24ecf16eab0f 271 {
coreyharris 3:420d5efbd967 272 ecgAFE.writeRegister( MAX30003::FIFO_RST , 0); // Reset FIFO
johnGreeneMaxim 7:cf0855a0450a 273 rLed = 1;//notifies the user that an over flow occured
coreyharris 3:420d5efbd967 274 }
parthsagar2010 10:54aa50490b15 275 //uint8_t header_ecg_checksum[2] = {'%','%'};
parthsagar2010 10:54aa50490b15 276 //pc.write((uint8_t *)header_ecg_checksum, sizeof(header_ecg_checksum));
coreyharris 3:420d5efbd967 277
parthsagar2010 10:54aa50490b15 278 //pc.write((int16_t *)ecgSample,readECGSamples * sizeof(int16_t ));
parthsagar2010 10:54aa50490b15 279 //memcpy(ecgSample_1sec , ecgSample, sizeof(ecgSample));
parthsagar2010 10:54aa50490b15 280
parthsagar2010 10:54aa50490b15 281 //memcpy(ecgSample_1sec + (onesec_counter * sizeof(int16_t)), ecgSample, sizeof(ecgSample));
parthsagar2010 15:0356e9454a60 282
parthsagar2010 15:0356e9454a60 283 if (flip)
parthsagar2010 15:0356e9454a60 284 {
parthsagar2010 15:0356e9454a60 285 sampleps = 12;
parthsagar2010 15:0356e9454a60 286 //printf("Flipped 12\r\n");
parthsagar2010 15:0356e9454a60 287 }
parthsagar2010 15:0356e9454a60 288 else
parthsagar2010 15:0356e9454a60 289 {
parthsagar2010 15:0356e9454a60 290 sampleps = 13;
parthsagar2010 15:0356e9454a60 291 // printf("Flipped 13\r\n");
parthsagar2010 15:0356e9454a60 292 }
parthsagar2010 15:0356e9454a60 293
parthsagar2010 15:0356e9454a60 294 for( idx = 0; idx < sampleps; idx++ )
parthsagar2010 9:24ecf16eab0f 295 {
parthsagar2010 9:24ecf16eab0f 296 //pc.printf("%6d\r\n", ecgSample[idx]);
parthsagar2010 9:24ecf16eab0f 297 ecgSample_1sec[onesec_counter] = ecgSample[idx];
parthsagar2010 10:54aa50490b15 298
parthsagar2010 10:54aa50490b15 299 cksm_1 = ecgSample[idx] & 0xff;
parthsagar2010 10:54aa50490b15 300 cksm_2 = (ecgSample[idx] >> 8) & 0xff;
parthsagar2010 10:54aa50490b15 301 checksum_ += cksm_1 + cksm_2;
parthsagar2010 9:24ecf16eab0f 302 onesec_counter++;
coreyharris 6:86ac850c718d 303 }
parthsagar2010 15:0356e9454a60 304 flip =!flip;
parthsagar2010 15:0356e9454a60 305 rLed = ! rLed;
coreyharris 0:38c49bc37c7c 306 }
parthsagar2010 10:54aa50490b15 307
coreyharris 0:38c49bc37c7c 308 }
coreyharris 0:38c49bc37c7c 309 }
coreyharris 0:38c49bc37c7c 310 }
coreyharris 0:38c49bc37c7c 311
coreyharris 0:38c49bc37c7c 312
coreyharris 0:38c49bc37c7c 313
coreyharris 0:38c49bc37c7c 314
coreyharris 0:38c49bc37c7c 315 void ecg_config(MAX30003& ecgAFE) {
coreyharris 0:38c49bc37c7c 316
coreyharris 1:86843c27cc81 317 // Reset ECG to clear registers
coreyharris 1:86843c27cc81 318 ecgAFE.writeRegister( MAX30003::SW_RST , 0);
coreyharris 0:38c49bc37c7c 319
coreyharris 1:86843c27cc81 320 // General config register setting
coreyharris 1:86843c27cc81 321 MAX30003::GeneralConfiguration_u CNFG_GEN_r;
coreyharris 3:420d5efbd967 322 CNFG_GEN_r.bits.en_ecg = 1; // Enable ECG channel
coreyharris 3:420d5efbd967 323 CNFG_GEN_r.bits.rbiasn = 1; // Enable resistive bias on negative input
coreyharris 3:420d5efbd967 324 CNFG_GEN_r.bits.rbiasp = 1; // Enable resistive bias on positive input
coreyharris 3:420d5efbd967 325 CNFG_GEN_r.bits.en_rbias = 1; // Enable resistive bias
coreyharris 3:420d5efbd967 326 CNFG_GEN_r.bits.imag = 2; // Current magnitude = 10nA
coreyharris 3:420d5efbd967 327 CNFG_GEN_r.bits.en_dcloff = 1; // Enable DC lead-off detection
parthsagar2010 12:10b49ad3c492 328 //CNFG_GEN_r.bits.fmstr = 1; //125 sps FMSTR 1
coreyharris 1:86843c27cc81 329 ecgAFE.writeRegister( MAX30003::CNFG_GEN , CNFG_GEN_r.all);
coreyharris 1:86843c27cc81 330
coreyharris 1:86843c27cc81 331
coreyharris 1:86843c27cc81 332 // ECG Config register setting
coreyharris 1:86843c27cc81 333 MAX30003::ECGConfiguration_u CNFG_ECG_r;
coreyharris 3:420d5efbd967 334 CNFG_ECG_r.bits.dlpf = 1; // Digital LPF cutoff = 40Hz
coreyharris 3:420d5efbd967 335 CNFG_ECG_r.bits.dhpf = 1; // Digital HPF cutoff = 0.5Hz
coreyharris 3:420d5efbd967 336 CNFG_ECG_r.bits.gain = 3; // ECG gain = 160V/V
coreyharris 3:420d5efbd967 337 CNFG_ECG_r.bits.rate = 2; // Sample rate = 128 sps
coreyharris 1:86843c27cc81 338 ecgAFE.writeRegister( MAX30003::CNFG_ECG , CNFG_ECG_r.all);
coreyharris 1:86843c27cc81 339
coreyharris 1:86843c27cc81 340
coreyharris 1:86843c27cc81 341 //R-to-R configuration
coreyharris 1:86843c27cc81 342 MAX30003::RtoR1Configuration_u CNFG_RTOR_r;
coreyharris 3:420d5efbd967 343 CNFG_RTOR_r.bits.en_rtor = 1; // Enable R-to-R detection
coreyharris 1:86843c27cc81 344 ecgAFE.writeRegister( MAX30003::CNFG_RTOR1 , CNFG_RTOR_r.all);
coreyharris 1:86843c27cc81 345
coreyharris 1:86843c27cc81 346
coreyharris 1:86843c27cc81 347 //Manage interrupts register setting
coreyharris 1:86843c27cc81 348 MAX30003::ManageInterrupts_u MNG_INT_r;
coreyharris 3:420d5efbd967 349 MNG_INT_r.bits.efit = 0b00011; // Assert EINT w/ 4 unread samples
coreyharris 3:420d5efbd967 350 MNG_INT_r.bits.clr_rrint = 0b01; // Clear R-to-R on RTOR reg. read back
coreyharris 1:86843c27cc81 351 ecgAFE.writeRegister( MAX30003::MNGR_INT , MNG_INT_r.all);
coreyharris 0:38c49bc37c7c 352
coreyharris 0:38c49bc37c7c 353
coreyharris 1:86843c27cc81 354 //Enable interrupts register setting
coreyharris 1:86843c27cc81 355 MAX30003::EnableInterrupts_u EN_INT_r;
coreyharris 5:f8d1f651bef5 356 EN_INT_r.all = 0;
coreyharris 3:420d5efbd967 357 EN_INT_r.bits.en_eint = 1; // Enable EINT interrupt
coreyharris 4:06e258ff0b97 358 EN_INT_r.bits.en_rrint = 0; // Disable R-to-R interrupt
coreyharris 3:420d5efbd967 359 EN_INT_r.bits.intb_type = 3; // Open-drain NMOS with internal pullup
coreyharris 1:86843c27cc81 360 ecgAFE.writeRegister( MAX30003::EN_INT , EN_INT_r.all);
coreyharris 1:86843c27cc81 361
coreyharris 1:86843c27cc81 362
coreyharris 1:86843c27cc81 363 //Dyanmic modes config
coreyharris 1:86843c27cc81 364 MAX30003::ManageDynamicModes_u MNG_DYN_r;
coreyharris 3:420d5efbd967 365 MNG_DYN_r.bits.fast = 0; // Fast recovery mode disabled
coreyharris 1:86843c27cc81 366 ecgAFE.writeRegister( MAX30003::MNGR_DYN , MNG_DYN_r.all);
coreyharris 5:f8d1f651bef5 367
coreyharris 5:f8d1f651bef5 368 // MUX Config
coreyharris 5:f8d1f651bef5 369 MAX30003::MuxConfiguration_u CNFG_MUX_r;
coreyharris 5:f8d1f651bef5 370 CNFG_MUX_r.bits.openn = 0; // Connect ECGN to AFE channel
coreyharris 5:f8d1f651bef5 371 CNFG_MUX_r.bits.openp = 0; // Connect ECGP to AFE channel
coreyharris 5:f8d1f651bef5 372 ecgAFE.writeRegister( MAX30003::CNFG_EMUX , CNFG_MUX_r.all);
coreyharris 1:86843c27cc81 373
coreyharris 1:86843c27cc81 374 return;
coreyharris 0:38c49bc37c7c 375 }
coreyharris 0:38c49bc37c7c 376