Chanel's edits

Dependencies:   max32630fthr USBDevice

main.cpp

Committer:
saleiferis
Date:
2020-03-07
Revision:
11:cbd9182d14d2
Parent:
10:28b8729cf5dc
Child:
12:ad628acddbf7

File content as of revision 11:cbd9182d14d2:

#include "mbed.h"
#include "math.h"
#include "max32630fthr.h"
#include "max86150.h"
#include "I2C.h"
#include "ble/BLE.h"
#include "ble/Gap.h"
//#include "ble/services/HeartRateService.h"
#include "ECGService.h"
#include <events/mbed_events.h>
#include "bt32630.h"
#include "filters.h"

//Register definitions
#define MAX86150_Addr 0xBC //updated per I2Cscanner, 8 bit version of 7 bit code 0x5E
#define maxi2cFreq 1000000
#define recommendedi2cFreq 400000
 
#define BaudRate 115200


Serial pc(USBTX,USBRX,NULL,BaudRate); 
InterruptIn intPin(P5_5);   // interrupts currently not used
I2C i2c(I2C2_SDA, I2C2_SCL);
MAX86150 max86150Sensor;

ECGService *hrServicePtr;

//Variables modified in inerrupt routine
volatile uint32_t intCount = 0;
volatile bool intFlag = false;
volatile uint8_t writePointer;
volatile uint8_t readPointer;
volatile uint32_t curr_time;
volatile uint32_t prev_time;
volatile int16_t samplesToRead;

Timer timer; 

static events::EventQueue event_queue(/* event count */ 16 * EVENTS_EVENT_SIZE);

/*
void ISR_AFULL()
{
    intPin.disable_irq();
    intFlag = true;
    readPointer = max86150Sensor.getReadPointer();
    writePointer = max86150Sensor.getWritePointer();
    samplesToRead = (int8_t)writePointer - (int8_t)readPointer;
    //if (samplesToRead < 0) samplesToRead+=32;
    intCount++;
    //intPin.enable_irq();
    
}*/   

/*
void ISR_DATA_READY()
{
    intPin.disable_irq();
    readPointer = max86150Sensor.getReadPointer();
    writePointer = max86150Sensor.getWritePointer();
    samplesToRead = (int8_t)writePointer - (int8_t)readPointer;
    //if (samplesToRead < 0) samplesToRead+=32;
    intCount++;
    char data[3];
    //char *p = data;
    max86150Sensor.writeRegister8(MAX86150_Addr,0x07,0x01);
    i2c.write(MAX86150_Addr,command, 1);
    i2c.read(MAX86150_Addr, data, 3, false);
    uint8_t temp[sizeof(int32_t)]; //Array of 4 bytes that we will convert into long
    int32_t tempLong;
    temp[1] = data[0];
    temp[2] = data[1];
    temp[3] = data[2];
    temp[0] = 0;
    //Convert array to long
    memcpy(&tempLong, temp, sizeof(tempLong));
    pc.printf("%d\n",tempLong);
    intPin.enable_irq();
}*/
    
//////////
int main(){  
    max86150Sensor.begin(i2c, recommendedi2cFreq, MAX86150_Addr); 
    wait_ms(300);
   
    //unsigned char partID = max86150Sensor.readPartID();
    unsigned char partID = max86150Sensor.readRegister8(MAX86150_Addr,0xFF);
    pc.printf("Part ID is: %X\n",partID);
    while (partID != 0x1E) {/* Connection to sensor is not established */ }
    
    
    //***** SETUP SENSOR */
    max86150Sensor.setup(); //Configure sensor
    wait_ms(300);
    pc.printf("SYSCONTOL REG: %x\n", max86150Sensor.readRegister8(MAX86150_Addr,0x0D));
    pc.printf("FIFO CONFIG: %X\n",max86150Sensor.readRegister8(MAX86150_Addr,0x08));
    pc.printf("INT_EN1: %X\n", max86150Sensor.readRegister8(MAX86150_Addr,0x02));
    pc.printf("INT_EN2: %X\n", max86150Sensor.readRegister8(MAX86150_Addr,0x03));
    pc.printf("INT STATUS1: %X\n",max86150Sensor.readRegister8(MAX86150_Addr,0x00));
    pc.printf("INT STATUS2: %X\n",max86150Sensor.readRegister8(MAX86150_Addr,0x01));
    
    //*************************************************************//
    
    max86150Sensor.clearFIFO();
    max86150Sensor.writeRegister8(MAX86150_Addr,0x0D,0x04); //start FIFO
    
    //******* SETUP BLUETOOTH *********   
    eventQueue.call_every(1, periodicCallback); // poll sensor every 1ms. New samples come every 5ms, so polling freq can potentially be decreased
    BLE &ble = BLE::Instance();
    ble.onEventsToProcess(scheduleBleEventsProcessing);
    //ble.init(bleInitComplete);
    //eventQueue.dispatch_forever();
    
    // Below code is for testing interrupts and sensor polling without involving bluetooth API
   // max86150Sensor.clearFIFO();
    //intPin.fall(&ISR_DATA_READY);
   // max86150Sensor.writeRegister8(MAX86150_Addr,0x0D,0x04);
    int16_t ecgsigned16;
    int i; // loop iteration
    uint8_t filter_length = 136;
    uint8_t BUFF_SIZE = filter_length;
    int32_t sample_idx = 0;
    uint8_t curr;
    float signal[BUFF_SIZE]; //store signal segment to be filtered
    float y = 0.0; //filtered sample to be displayed
    
    while(1){
        if(max86150Sensor.check()>0){
            
            //ecgsigned16 = (int16_t) (max86150Sensor.getFIFOECG()>>2);
            //max86150Sensor.nextSample();
            //pc.printf("%f\n",(float)ecgsigned16);
            
            if (sample_idx >= BUFF_SIZE){
                for (i=0; i<BUFF_SIZE-1; i++){  //discard oldest sample, shift samples in buffer
                    signal[i] = signal[i+1];
                }
                curr = BUFF_SIZE-1;   // indicates that buffer is full
                y = 0.0;  // reset filter output for current sample
            }else{ //Buffer is not full yet
                curr = (uint8_t)sample_idx;
            }
            ecgsigned16 = (int16_t) (max86150Sensor.getFIFOECG()>>2); //read a sample
            max86150Sensor.nextSample();    // advance tail to get sample in next iteration
            signal[curr] = (float)ecgsigned16;
            sample_idx++;
            
            if (curr< BUFF_SIZE-1){
                // buffer is not full yet
            }else{ //buffer is full, filter current sample
                for(i = 0; i < BUFF_SIZE; i++){ //FIR bandpass filter
                    y = y + FIR_BP[i] * signal[BUFF_SIZE-1-i];
                }
                pc.printf("%f\n",y);
            }
        }  
    }
      
}