Chanel's edits

Dependencies:   max32630fthr USBDevice

Committer:
saleiferis
Date:
Sat Mar 07 04:57:26 2020 +0000
Revision:
11:cbd9182d14d2
Parent:
10:28b8729cf5dc
Child:
12:ad628acddbf7
real-time bandpass filter -- no BT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
saleiferis 0:89ec48e52250 1 #include "mbed.h"
saleiferis 0:89ec48e52250 2 #include "math.h"
saleiferis 0:89ec48e52250 3 #include "max32630fthr.h"
saleiferis 0:89ec48e52250 4 #include "max86150.h"
saleiferis 0:89ec48e52250 5 #include "I2C.h"
saleiferis 0:89ec48e52250 6 #include "ble/BLE.h"
saleiferis 0:89ec48e52250 7 #include "ble/Gap.h"
saleiferis 7:4debec043316 8 //#include "ble/services/HeartRateService.h"
saleiferis 7:4debec043316 9 #include "ECGService.h"
saleiferis 1:6e6f7e3cc1e1 10 #include <events/mbed_events.h>
saleiferis 1:6e6f7e3cc1e1 11 #include "bt32630.h"
saleiferis 11:cbd9182d14d2 12 #include "filters.h"
saleiferis 0:89ec48e52250 13
saleiferis 0:89ec48e52250 14 //Register definitions
saleiferis 0:89ec48e52250 15 #define MAX86150_Addr 0xBC //updated per I2Cscanner, 8 bit version of 7 bit code 0x5E
saleiferis 0:89ec48e52250 16 #define maxi2cFreq 1000000
saleiferis 0:89ec48e52250 17 #define recommendedi2cFreq 400000
saleiferis 10:28b8729cf5dc 18
saleiferis 10:28b8729cf5dc 19 #define BaudRate 115200
saleiferis 0:89ec48e52250 20
saleiferis 0:89ec48e52250 21
saleiferis 10:28b8729cf5dc 22 Serial pc(USBTX,USBRX,NULL,BaudRate);
saleiferis 10:28b8729cf5dc 23 InterruptIn intPin(P5_5); // interrupts currently not used
saleiferis 0:89ec48e52250 24 I2C i2c(I2C2_SDA, I2C2_SCL);
saleiferis 8:2005014df05c 25 MAX86150 max86150Sensor;
saleiferis 0:89ec48e52250 26
saleiferis 10:28b8729cf5dc 27 ECGService *hrServicePtr;
saleiferis 10:28b8729cf5dc 28
saleiferis 10:28b8729cf5dc 29 //Variables modified in inerrupt routine
saleiferis 10:28b8729cf5dc 30 volatile uint32_t intCount = 0;
saleiferis 8:2005014df05c 31 volatile bool intFlag = false;
saleiferis 9:171171516ebd 32 volatile uint8_t writePointer;
saleiferis 9:171171516ebd 33 volatile uint8_t readPointer;
saleiferis 9:171171516ebd 34 volatile uint32_t curr_time;
saleiferis 9:171171516ebd 35 volatile uint32_t prev_time;
saleiferis 9:171171516ebd 36 volatile int16_t samplesToRead;
saleiferis 9:171171516ebd 37
saleiferis 10:28b8729cf5dc 38 Timer timer;
saleiferis 9:171171516ebd 39
saleiferis 1:6e6f7e3cc1e1 40 static events::EventQueue event_queue(/* event count */ 16 * EVENTS_EVENT_SIZE);
saleiferis 1:6e6f7e3cc1e1 41
saleiferis 10:28b8729cf5dc 42 /*
saleiferis 8:2005014df05c 43 void ISR_AFULL()
saleiferis 8:2005014df05c 44 {
saleiferis 9:171171516ebd 45 intPin.disable_irq();
saleiferis 8:2005014df05c 46 intFlag = true;
saleiferis 9:171171516ebd 47 readPointer = max86150Sensor.getReadPointer();
saleiferis 9:171171516ebd 48 writePointer = max86150Sensor.getWritePointer();
saleiferis 10:28b8729cf5dc 49 samplesToRead = (int8_t)writePointer - (int8_t)readPointer;
saleiferis 10:28b8729cf5dc 50 //if (samplesToRead < 0) samplesToRead+=32;
saleiferis 10:28b8729cf5dc 51 intCount++;
saleiferis 10:28b8729cf5dc 52 //intPin.enable_irq();
saleiferis 10:28b8729cf5dc 53
saleiferis 10:28b8729cf5dc 54 }*/
saleiferis 9:171171516ebd 55
saleiferis 10:28b8729cf5dc 56 /*
saleiferis 10:28b8729cf5dc 57 void ISR_DATA_READY()
saleiferis 10:28b8729cf5dc 58 {
saleiferis 10:28b8729cf5dc 59 intPin.disable_irq();
saleiferis 10:28b8729cf5dc 60 readPointer = max86150Sensor.getReadPointer();
saleiferis 10:28b8729cf5dc 61 writePointer = max86150Sensor.getWritePointer();
saleiferis 10:28b8729cf5dc 62 samplesToRead = (int8_t)writePointer - (int8_t)readPointer;
saleiferis 10:28b8729cf5dc 63 //if (samplesToRead < 0) samplesToRead+=32;
saleiferis 10:28b8729cf5dc 64 intCount++;
saleiferis 10:28b8729cf5dc 65 char data[3];
saleiferis 10:28b8729cf5dc 66 //char *p = data;
saleiferis 10:28b8729cf5dc 67 max86150Sensor.writeRegister8(MAX86150_Addr,0x07,0x01);
saleiferis 10:28b8729cf5dc 68 i2c.write(MAX86150_Addr,command, 1);
saleiferis 10:28b8729cf5dc 69 i2c.read(MAX86150_Addr, data, 3, false);
saleiferis 10:28b8729cf5dc 70 uint8_t temp[sizeof(int32_t)]; //Array of 4 bytes that we will convert into long
saleiferis 10:28b8729cf5dc 71 int32_t tempLong;
saleiferis 10:28b8729cf5dc 72 temp[1] = data[0];
saleiferis 10:28b8729cf5dc 73 temp[2] = data[1];
saleiferis 10:28b8729cf5dc 74 temp[3] = data[2];
saleiferis 10:28b8729cf5dc 75 temp[0] = 0;
saleiferis 10:28b8729cf5dc 76 //Convert array to long
saleiferis 10:28b8729cf5dc 77 memcpy(&tempLong, temp, sizeof(tempLong));
saleiferis 10:28b8729cf5dc 78 pc.printf("%d\n",tempLong);
saleiferis 10:28b8729cf5dc 79 intPin.enable_irq();
saleiferis 10:28b8729cf5dc 80 }*/
saleiferis 10:28b8729cf5dc 81
saleiferis 0:89ec48e52250 82 //////////
saleiferis 10:28b8729cf5dc 83 int main(){
saleiferis 0:89ec48e52250 84 max86150Sensor.begin(i2c, recommendedi2cFreq, MAX86150_Addr);
saleiferis 0:89ec48e52250 85 wait_ms(300);
saleiferis 4:4233f5538abf 86
saleiferis 0:89ec48e52250 87 //unsigned char partID = max86150Sensor.readPartID();
saleiferis 0:89ec48e52250 88 unsigned char partID = max86150Sensor.readRegister8(MAX86150_Addr,0xFF);
saleiferis 0:89ec48e52250 89 pc.printf("Part ID is: %X\n",partID);
saleiferis 10:28b8729cf5dc 90 while (partID != 0x1E) {/* Connection to sensor is not established */ }
saleiferis 2:a96a53e6c6a3 91
saleiferis 2:a96a53e6c6a3 92
saleiferis 10:28b8729cf5dc 93 //***** SETUP SENSOR */
saleiferis 10:28b8729cf5dc 94 max86150Sensor.setup(); //Configure sensor
saleiferis 10:28b8729cf5dc 95 wait_ms(300);
saleiferis 10:28b8729cf5dc 96 pc.printf("SYSCONTOL REG: %x\n", max86150Sensor.readRegister8(MAX86150_Addr,0x0D));
saleiferis 10:28b8729cf5dc 97 pc.printf("FIFO CONFIG: %X\n",max86150Sensor.readRegister8(MAX86150_Addr,0x08));
saleiferis 10:28b8729cf5dc 98 pc.printf("INT_EN1: %X\n", max86150Sensor.readRegister8(MAX86150_Addr,0x02));
saleiferis 10:28b8729cf5dc 99 pc.printf("INT_EN2: %X\n", max86150Sensor.readRegister8(MAX86150_Addr,0x03));
saleiferis 10:28b8729cf5dc 100 pc.printf("INT STATUS1: %X\n",max86150Sensor.readRegister8(MAX86150_Addr,0x00));
saleiferis 10:28b8729cf5dc 101 pc.printf("INT STATUS2: %X\n",max86150Sensor.readRegister8(MAX86150_Addr,0x01));
saleiferis 10:28b8729cf5dc 102
saleiferis 10:28b8729cf5dc 103 //*************************************************************//
saleiferis 10:28b8729cf5dc 104
saleiferis 10:28b8729cf5dc 105 max86150Sensor.clearFIFO();
saleiferis 10:28b8729cf5dc 106 max86150Sensor.writeRegister8(MAX86150_Addr,0x0D,0x04); //start FIFO
saleiferis 10:28b8729cf5dc 107
saleiferis 10:28b8729cf5dc 108 //******* SETUP BLUETOOTH *********
saleiferis 10:28b8729cf5dc 109 eventQueue.call_every(1, periodicCallback); // poll sensor every 1ms. New samples come every 5ms, so polling freq can potentially be decreased
saleiferis 1:6e6f7e3cc1e1 110 BLE &ble = BLE::Instance();
saleiferis 10:28b8729cf5dc 111 ble.onEventsToProcess(scheduleBleEventsProcessing);
saleiferis 10:28b8729cf5dc 112 //ble.init(bleInitComplete);
saleiferis 8:2005014df05c 113 //eventQueue.dispatch_forever();
saleiferis 4:4233f5538abf 114
saleiferis 10:28b8729cf5dc 115 // Below code is for testing interrupts and sensor polling without involving bluetooth API
saleiferis 10:28b8729cf5dc 116 // max86150Sensor.clearFIFO();
saleiferis 10:28b8729cf5dc 117 //intPin.fall(&ISR_DATA_READY);
saleiferis 10:28b8729cf5dc 118 // max86150Sensor.writeRegister8(MAX86150_Addr,0x0D,0x04);
saleiferis 10:28b8729cf5dc 119 int16_t ecgsigned16;
saleiferis 11:cbd9182d14d2 120 int i; // loop iteration
saleiferis 11:cbd9182d14d2 121 uint8_t filter_length = 136;
saleiferis 11:cbd9182d14d2 122 uint8_t BUFF_SIZE = filter_length;
saleiferis 11:cbd9182d14d2 123 int32_t sample_idx = 0;
saleiferis 11:cbd9182d14d2 124 uint8_t curr;
saleiferis 11:cbd9182d14d2 125 float signal[BUFF_SIZE]; //store signal segment to be filtered
saleiferis 11:cbd9182d14d2 126 float y = 0.0; //filtered sample to be displayed
saleiferis 9:171171516ebd 127
saleiferis 8:2005014df05c 128 while(1){
saleiferis 10:28b8729cf5dc 129 if(max86150Sensor.check()>0){
saleiferis 10:28b8729cf5dc 130
saleiferis 11:cbd9182d14d2 131 //ecgsigned16 = (int16_t) (max86150Sensor.getFIFOECG()>>2);
saleiferis 11:cbd9182d14d2 132 //max86150Sensor.nextSample();
saleiferis 11:cbd9182d14d2 133 //pc.printf("%f\n",(float)ecgsigned16);
saleiferis 11:cbd9182d14d2 134
saleiferis 11:cbd9182d14d2 135 if (sample_idx >= BUFF_SIZE){
saleiferis 11:cbd9182d14d2 136 for (i=0; i<BUFF_SIZE-1; i++){ //discard oldest sample, shift samples in buffer
saleiferis 11:cbd9182d14d2 137 signal[i] = signal[i+1];
saleiferis 11:cbd9182d14d2 138 }
saleiferis 11:cbd9182d14d2 139 curr = BUFF_SIZE-1; // indicates that buffer is full
saleiferis 11:cbd9182d14d2 140 y = 0.0; // reset filter output for current sample
saleiferis 11:cbd9182d14d2 141 }else{ //Buffer is not full yet
saleiferis 11:cbd9182d14d2 142 curr = (uint8_t)sample_idx;
saleiferis 11:cbd9182d14d2 143 }
saleiferis 11:cbd9182d14d2 144 ecgsigned16 = (int16_t) (max86150Sensor.getFIFOECG()>>2); //read a sample
saleiferis 11:cbd9182d14d2 145 max86150Sensor.nextSample(); // advance tail to get sample in next iteration
saleiferis 11:cbd9182d14d2 146 signal[curr] = (float)ecgsigned16;
saleiferis 11:cbd9182d14d2 147 sample_idx++;
saleiferis 11:cbd9182d14d2 148
saleiferis 11:cbd9182d14d2 149 if (curr< BUFF_SIZE-1){
saleiferis 11:cbd9182d14d2 150 // buffer is not full yet
saleiferis 11:cbd9182d14d2 151 }else{ //buffer is full, filter current sample
saleiferis 11:cbd9182d14d2 152 for(i = 0; i < BUFF_SIZE; i++){ //FIR bandpass filter
saleiferis 11:cbd9182d14d2 153 y = y + FIR_BP[i] * signal[BUFF_SIZE-1-i];
saleiferis 11:cbd9182d14d2 154 }
saleiferis 11:cbd9182d14d2 155 pc.printf("%f\n",y);
saleiferis 11:cbd9182d14d2 156 }
saleiferis 10:28b8729cf5dc 157 }
saleiferis 10:28b8729cf5dc 158 }
saleiferis 10:28b8729cf5dc 159
saleiferis 0:89ec48e52250 160 }