Chanel's edits

Dependencies:   max32630fthr USBDevice

Committer:
saleiferis
Date:
Tue Apr 07 04:57:22 2020 +0000
Revision:
19:f230229cb6f3
Parent:
0:89ec48e52250
HeartRateService

Who changed what in which revision?

UserRevisionLine numberNew contents of line
saleiferis 0:89ec48e52250 1 /***************************************************
saleiferis 0:89ec48e52250 2 Arduino library written for the Maxim MAX86150 ECG and PPG integrated sensor
saleiferis 0:89ec48e52250 3
saleiferis 0:89ec48e52250 4 Written by Ashwin Whitchurch, ProtoCentral Electronics (www.protocentral.com)
saleiferis 0:89ec48e52250 5
saleiferis 0:89ec48e52250 6 https://github.com/protocentral/protocentral_max86150
saleiferis 0:89ec48e52250 7
saleiferis 0:89ec48e52250 8 Based on code written by Peter Jansen and Nathan Seidle (SparkFun) for the MAX30105 sensor
saleiferis 0:89ec48e52250 9 BSD license, all text above must be included in any redistribution.
saleiferis 0:89ec48e52250 10 *****************************************************/
saleiferis 0:89ec48e52250 11
saleiferis 0:89ec48e52250 12 #pragma once
saleiferis 0:89ec48e52250 13 #include "mbed.h"
saleiferis 0:89ec48e52250 14 #include "I2C.h"
saleiferis 0:89ec48e52250 15 //#define MAX86150_ADDRESS 0x5E //7-bit I2C Address
saleiferis 0:89ec48e52250 16 //Note that MAX30102 has the same I2C address and Part ID
saleiferis 0:89ec48e52250 17
saleiferis 0:89ec48e52250 18 #define I2C_SPEED_STANDARD 100000
saleiferis 0:89ec48e52250 19 #define I2C_SPEED_FAST 400000
saleiferis 0:89ec48e52250 20
saleiferis 0:89ec48e52250 21 //Define the size of the I2C buffer based on the platform the user has
saleiferis 0:89ec48e52250 22
saleiferis 0:89ec48e52250 23
saleiferis 0:89ec48e52250 24 //The catch-all default is 32
saleiferis 0:89ec48e52250 25 #define I2C_BUFFER_LENGTH 32
saleiferis 0:89ec48e52250 26
saleiferis 0:89ec48e52250 27
saleiferis 0:89ec48e52250 28 class MAX86150 {
saleiferis 0:89ec48e52250 29 public:
saleiferis 0:89ec48e52250 30 MAX86150(void);
saleiferis 0:89ec48e52250 31
saleiferis 0:89ec48e52250 32 //bool begin(TwoWire &wirePort = Wire, uint32_t i2cSpeed = I2C_SPEED_STANDARD, uint8_t i2caddr = MAX86150_ADDRESS);
saleiferis 0:89ec48e52250 33 bool begin(I2C &wirePort, uint32_t i2cSpeed, uint8_t i2caddr);
saleiferis 0:89ec48e52250 34
saleiferis 0:89ec48e52250 35 uint32_t getRed(void); //Returns immediate red value
saleiferis 0:89ec48e52250 36 uint32_t getIR(void); //Returns immediate IR value
saleiferis 0:89ec48e52250 37 int32_t getECG(void); //Returns immediate ECG value
saleiferis 0:89ec48e52250 38 bool safeCheck(uint8_t maxTimeToCheck); //Given a max amount of time, check for new data
saleiferis 0:89ec48e52250 39
saleiferis 0:89ec48e52250 40 // Configuration
saleiferis 0:89ec48e52250 41 void softReset();
saleiferis 0:89ec48e52250 42 void shutDown();
saleiferis 0:89ec48e52250 43 void wakeUp();
saleiferis 0:89ec48e52250 44
saleiferis 0:89ec48e52250 45 void setLEDMode(uint8_t mode);
saleiferis 0:89ec48e52250 46
saleiferis 0:89ec48e52250 47 void setADCRange(uint8_t adcRange);
saleiferis 0:89ec48e52250 48 void setSampleRate(uint8_t sampleRate);
saleiferis 0:89ec48e52250 49 void setPulseWidth(uint8_t pulseWidth);
saleiferis 0:89ec48e52250 50
saleiferis 0:89ec48e52250 51 void setPulseAmplitudeRed(uint8_t value);
saleiferis 0:89ec48e52250 52 void setPulseAmplitudeIR(uint8_t value);
saleiferis 0:89ec48e52250 53 void setPulseAmplitudeProximity(uint8_t value);
saleiferis 0:89ec48e52250 54
saleiferis 0:89ec48e52250 55 void setProximityThreshold(uint8_t threshMSB);
saleiferis 0:89ec48e52250 56
saleiferis 0:89ec48e52250 57 //Multi-led configuration mode (page 22)
saleiferis 0:89ec48e52250 58 void enableSlot(uint8_t slotNumber, uint8_t device); //Given slot number, assign a device to slot
saleiferis 0:89ec48e52250 59 void disableSlots(void);
saleiferis 0:89ec48e52250 60
saleiferis 0:89ec48e52250 61 // Data Collection
saleiferis 0:89ec48e52250 62
saleiferis 0:89ec48e52250 63 //Interrupts (page 13, 14)
saleiferis 0:89ec48e52250 64 uint8_t getINT1(void); //Returns the main interrupt group
saleiferis 0:89ec48e52250 65 uint8_t getINT2(void); //Returns the temp ready interrupt
saleiferis 0:89ec48e52250 66 void enableAFULL(void); //Enable/disable individual interrupts
saleiferis 0:89ec48e52250 67 void disableAFULL(void);
saleiferis 0:89ec48e52250 68 void enableDATARDY(void);
saleiferis 0:89ec48e52250 69 void disableDATARDY(void);
saleiferis 0:89ec48e52250 70 void enableALCOVF(void);
saleiferis 0:89ec48e52250 71 void disableALCOVF(void);
saleiferis 0:89ec48e52250 72 void enablePROXINT(void);
saleiferis 0:89ec48e52250 73 void disablePROXINT(void);
saleiferis 0:89ec48e52250 74 void enableDIETEMPRDY(void);
saleiferis 0:89ec48e52250 75 void disableDIETEMPRDY(void);
saleiferis 0:89ec48e52250 76
saleiferis 0:89ec48e52250 77 //FIFO Configuration (page 18)
saleiferis 0:89ec48e52250 78 void setFIFOAverage(uint8_t samples);
saleiferis 0:89ec48e52250 79 void enableFIFORollover();
saleiferis 0:89ec48e52250 80 void disableFIFORollover();
saleiferis 0:89ec48e52250 81 void setFIFOAlmostFull(uint8_t samples);
saleiferis 0:89ec48e52250 82
saleiferis 0:89ec48e52250 83 //FIFO Reading
saleiferis 0:89ec48e52250 84 uint16_t check(void); //Checks for new data and fills FIFO
saleiferis 0:89ec48e52250 85 uint8_t available(void); //Tells caller how many new samples are available (head - tail)
saleiferis 0:89ec48e52250 86 void nextSample(void); //Advances the tail of the sense array
saleiferis 0:89ec48e52250 87 uint32_t getFIFORed(void); //Returns the FIFO sample pointed to by tail
saleiferis 0:89ec48e52250 88 uint32_t getFIFOIR(void); //Returns the FIFO sample pointed to by tail
saleiferis 0:89ec48e52250 89 int32_t getFIFOECG(void); //Returns the FIFO sample pointed to by tail
saleiferis 0:89ec48e52250 90
saleiferis 0:89ec48e52250 91 uint8_t getWritePointer(void);
saleiferis 0:89ec48e52250 92 uint8_t getReadPointer(void);
saleiferis 0:89ec48e52250 93 void clearFIFO(void); //Sets the read/write pointers to zero
saleiferis 0:89ec48e52250 94
saleiferis 0:89ec48e52250 95 //Proximity Mode Interrupt Threshold
saleiferis 0:89ec48e52250 96 void setPROXINTTHRESH(uint8_t val);
saleiferis 0:89ec48e52250 97
saleiferis 0:89ec48e52250 98 // Die Temperature
saleiferis 0:89ec48e52250 99 float readTemperature();
saleiferis 0:89ec48e52250 100 float readTemperatureF();
saleiferis 0:89ec48e52250 101
saleiferis 0:89ec48e52250 102 // Detecting ID/Revision
saleiferis 0:89ec48e52250 103 uint8_t getRevisionID();
saleiferis 0:89ec48e52250 104 uint8_t readPartID();
saleiferis 0:89ec48e52250 105 uint8_t readRegLED();
saleiferis 0:89ec48e52250 106
saleiferis 0:89ec48e52250 107 // Setup the IC with user selectable settings
saleiferis 0:89ec48e52250 108 void setup(uint8_t powerLevel = 0x1F, uint8_t sampleAverage = 4, uint8_t ledMode = 3, int sampleRate = 400, int pulseWidth = 411, int adcRange = 4096);
saleiferis 0:89ec48e52250 109
saleiferis 0:89ec48e52250 110 // Low-level I2C communication
saleiferis 0:89ec48e52250 111 uint8_t readRegister8(uint8_t address, uint8_t reg);
saleiferis 0:89ec48e52250 112 void writeRegister8(uint8_t address, uint8_t reg, uint8_t value);
saleiferis 0:89ec48e52250 113
saleiferis 0:89ec48e52250 114 private:
saleiferis 0:89ec48e52250 115 I2C *_i2cPort; //The generic connection to user's chosen I2C hardware
saleiferis 0:89ec48e52250 116 uint8_t _i2caddr;
saleiferis 0:89ec48e52250 117
saleiferis 0:89ec48e52250 118 //activeLEDs is the number of channels turned on, and can be 1 to 3. 2 is common for Red+IR.
saleiferis 0:89ec48e52250 119 uint8_t activeDevices; //Gets set during setup. Allows check() to calculate how many bytes to read from FIFO
saleiferis 0:89ec48e52250 120
saleiferis 0:89ec48e52250 121 uint8_t revisionID;
saleiferis 0:89ec48e52250 122
saleiferis 0:89ec48e52250 123 void readRevisionID();
saleiferis 0:89ec48e52250 124
saleiferis 0:89ec48e52250 125 void bitMask(uint8_t reg, uint8_t mask, uint8_t thing);
saleiferis 0:89ec48e52250 126
saleiferis 0:89ec48e52250 127 #define STORAGE_SIZE 4 //Each long is 4 bytes so limit this to fit on your micro
saleiferis 0:89ec48e52250 128 typedef struct Record
saleiferis 0:89ec48e52250 129 {
saleiferis 0:89ec48e52250 130 uint32_t red[STORAGE_SIZE];
saleiferis 0:89ec48e52250 131 uint32_t IR[STORAGE_SIZE];
saleiferis 0:89ec48e52250 132 int32_t ecg[STORAGE_SIZE];
saleiferis 0:89ec48e52250 133 uint8_t head;
saleiferis 0:89ec48e52250 134 uint8_t tail;
saleiferis 0:89ec48e52250 135 } sense_struct; //This is our circular buffer of readings from the sensor
saleiferis 0:89ec48e52250 136
saleiferis 0:89ec48e52250 137 sense_struct sense;
saleiferis 0:89ec48e52250 138
saleiferis 0:89ec48e52250 139 };