mirror of
https://github.com/eclipse/upm.git
synced 2025-03-24 01:10:22 +03:00

* c/c++ source * java/js/python/c/c++ examples * Doc image (png) * Tested on Intel Edison * TODO: Tuning for SpO2 reading Signed-off-by: Noel Eck <noel.eck@intel.com>
171 lines
5.7 KiB
C
171 lines
5.7 KiB
C
/*
|
|
* Author: Noel Eck <noel.eck@intel.com>
|
|
* Copyright (c) 2015 Intel Corporation.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the
|
|
* "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
* the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be
|
|
* included in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define MAX30100_I2C_ADDRESS 0x57
|
|
|
|
/* Single IR/R sample */
|
|
typedef struct {
|
|
/* Raw IR (pulse) read value */
|
|
uint16_t IR;
|
|
/* Raw R (O2) read value */
|
|
uint16_t R;
|
|
} max30100_value;
|
|
|
|
/* Function pointer for returning 1 IR/R sample */
|
|
typedef void (*func_sample_ready_handler)(max30100_value sample, void* arg);
|
|
|
|
/* Sample state */
|
|
typedef enum {
|
|
/* NOT sampling */
|
|
MAX30100_SAMPLE_STATE_IDLE,
|
|
/* Take one sample/currently taking one sample */
|
|
MAX30100_SAMPLE_STATE_ONE_SHOT,
|
|
/* Sample continuously/currently sampling continuously */
|
|
MAX30100_SAMPLE_STATE_CONTINUOUS,
|
|
/* Sample continuously using buffer/currently sampling continuously using buffer*/
|
|
MAX30100_SAMPLE_STATE_CONTINUOUS_BUFFERED
|
|
} MAX30100_SAMPLE_STATE;
|
|
|
|
/* Pulse oximeter and heart-rate sensor I2C registers */
|
|
typedef enum {
|
|
/* Interrupt status (RO) */
|
|
MAX30100_REG_INTERRUPT_STATUS = 0x00,
|
|
/* Interrupt enable */
|
|
MAX30100_REG_INTERRUPT_ENABLE = 0x01,
|
|
/* FIFO write pointer */
|
|
MAX30100_REG_FIFO_WR_PTR = 0x02,
|
|
/* FIFO overflow counter */
|
|
MAX30100_REG_FIFO_OVF_COUNTER = 0x03,
|
|
/* FIFO read pointer */
|
|
MAX30100_REG_FIFO_RD_PTR = 0x04,
|
|
/* FIFO data */
|
|
MAX30100_REG_FIFO_DATA = 0x05,
|
|
/* Mode configuration */
|
|
MAX30100_REG_MODE_CONFIG = 0x06,
|
|
/* SPO2 configuration */
|
|
MAX30100_REG_SPO2_CONFIG = 0x07,
|
|
/* LED configuration */
|
|
MAX30100_REG_LED_CONFIG = 0x09,
|
|
/* Temperature integer (2's compliment) */
|
|
MAX30100_REG_TEMP_INTEGER = 0x16,
|
|
/* Temperature fraction) */
|
|
MAX30100_REG_TEMP_FRACTION = 0x17,
|
|
/* Revision ID (RO)*/
|
|
MAX30100_REG_REV_ID = 0xFE,
|
|
/* Part ID */
|
|
MAX30100_REG_PART_ID = 0xFF
|
|
} MAX30100_REG;
|
|
|
|
/* MAX30100_REG_INTERRUPT_STATUS register fields */
|
|
/* FIFO almost full, set to 1 when WR_PTR == RD_PTR - 1 */
|
|
#define MAX30100_A_FULL (1 << 7)
|
|
/* Temperature date ready flag */
|
|
#define MAX30100_TEMP_RDY (1 << 6)
|
|
/* Heartrate data ready flag */
|
|
#define MAX30100_HR_RDY (1 << 5)
|
|
/* HR and O2 data ready flag */
|
|
#define MAX30100_SPO2_RDY (1 << 4)
|
|
/* Power ready after brownout flag */
|
|
#define MAX30100_PWR_RDY (1 << 0)
|
|
|
|
/* MAX30100_REG_INTERRUPT_ENABLE register fields */
|
|
/* Enable interrupt on FIFO almost full */
|
|
#define MAX30100_EN_A_FULL (1 << 7)
|
|
/* Enable interrupt on temperature date ready */
|
|
#define MAX30100_EN_TEMP_RDY (1 << 6)
|
|
/* Enable interrupt on HR data ready */
|
|
#define MAX30100_EN_HR_RDY (1 << 5)
|
|
/* Enable interrupt on HR and O2 data ready */
|
|
#define MAX30100_EN_SPO2_RDY (1 << 4)
|
|
|
|
/* MAX30100_REG_MODE_CONFIG register fields */
|
|
/* Enable power-save mode */
|
|
#define MAX30100_SHDN (1 << 7)
|
|
/* Reset device */
|
|
#define MAX30100_RESET (1 << 6)
|
|
/* Initiate temperature reading */
|
|
#define MAX30100_TEMP_EN (1 << 3)
|
|
/* Device sample mode (HR, vs SpO2) */
|
|
typedef enum _MAX30100_MODE {
|
|
/* Turn off sampling */
|
|
MAX30100_MODE_DISABLED = 0x00,
|
|
/* Enable heartrate ONLY sampling */
|
|
MAX30100_MODE_HR_EN = 0x02,
|
|
/* Enable SpO2 sampling */
|
|
MAX30100_MODE_SPO2_EN = 0x03
|
|
} MAX30100_MODE;
|
|
|
|
/* MAX30100_REG_SPO2_CONFIG register fields */
|
|
#define MAX30100_SPO2_HI_RES_EN (1 << 6)
|
|
typedef enum _MAX30100_SR {
|
|
MAX30100_SR_50_HZ = 0x00,
|
|
MAX30100_SR_100_HZ = 0x01,
|
|
MAX30100_SR_167_HZ = 0x02,
|
|
MAX30100_SR_200_HZ = 0x03,
|
|
MAX30100_SR_400_HZ = 0x04,
|
|
MAX30100_SR_600_HZ = 0x05,
|
|
MAX30100_SR_900_HZ = 0x06,
|
|
MAX30100_SR_1000_HZ = 0x07
|
|
} MAX30100_SR;
|
|
/* LED pulse width (microseconds) */
|
|
typedef enum _MAX30100_LED_PW {
|
|
MAX30100_LED_PW_200_US_13_BITS = 0x00,
|
|
MAX30100_LED_PW_400_US_14_BITS = 0x01,
|
|
MAX30100_LED_PW_800_US_15_BITS = 0x02,
|
|
MAX30100_LED_PW_1600_US_16_BITS = 0x03
|
|
} MAX30100_LED_PW;
|
|
|
|
/* MAX30100_REG_LED_CONFIG register fields */
|
|
/* LED (IR and R) current (milliamps) */
|
|
typedef enum _MAX30100_LED_CURRENT {
|
|
MAX30100_LED_CURRENT_0_0_MA = 0x00,
|
|
MAX30100_LED_CURRENT_4_4_MA = 0x01,
|
|
MAX30100_LED_CURRENT_7_6_MA = 0x02,
|
|
MAX30100_LED_CURRENT_11_0_MA = 0x03,
|
|
MAX30100_LED_CURRENT_14_2_MA = 0x04,
|
|
MAX30100_LED_CURRENT_17_4_MA = 0x05,
|
|
MAX30100_LED_CURRENT_20_8_MA = 0x06,
|
|
MAX30100_LED_CURRENT_24_0_MA = 0x07,
|
|
MAX30100_LED_CURRENT_27_1_MA = 0x08,
|
|
MAX30100_LED_CURRENT_30_6_MA = 0x09,
|
|
MAX30100_LED_CURRENT_33_8_MA = 0x0a,
|
|
MAX30100_LED_CURRENT_37_0_MA = 0x0b,
|
|
MAX30100_LED_CURRENT_40_2_MA = 0x0c,
|
|
MAX30100_LED_CURRENT_43_6_MA = 0x0d,
|
|
MAX30100_LED_CURRENT_46_8_MA = 0x0e,
|
|
MAX30100_LED_CURRENT_50_0_MA = 0x0f
|
|
} MAX30100_LED_CURRENT;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|