Chanel's edits
Dependencies: max32630fthr USBDevice
main.cpp@11:cbd9182d14d2, 2020-03-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |