MAX32620HSP (MAXREFDES100) RPC Example for Graphical User Interface

Dependencies:   USBDevice

Fork of HSP_Release by Jerry Bradshaw

This is an example program for the MAX32620HSP (MAXREFDES100 Health Sensor Platform). It demonstrates all the features of the platform and works with a companion graphical user interface (GUI) to help evaluate/configure/monitor the board. Go to the MAXREFDES100 product page and click on "design resources" to download the companion software. The GUI connects to the board through an RPC interface on a virtual serial port over the USB interface.

The RPC interface provides access to all the features of the board and is available to interface with other development environments such Matlab. This firmware provides realtime data streaming through the RPC interface over USB, and also provides the ability to log the data to flash for untethered battery operation. The data logging settings are configured through the GUI, and the GUI also provides the interface to download logged data.

Details on the RPC interface can be found here: HSP RPC Interface Documentation

Windows

With this program loaded, the MAX32620HSP will appear on your computer as a serial port. On Mac and Linux, this will happen by default. For Windows, you need to install a driver: HSP serial port windows driver

For more details about this platform and how to use it, see the MAXREFDES100 product page.

Committer:
jbradshaw
Date:
Tue Oct 25 15:22:11 2016 +0000
Revision:
0:e4a10ed6eb92
Child:
1:9490836294ea
tewt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jbradshaw 0:e4a10ed6eb92 1 /*******************************************************************************
jbradshaw 0:e4a10ed6eb92 2 / * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
jbradshaw 0:e4a10ed6eb92 3 *
jbradshaw 0:e4a10ed6eb92 4 * Permission is hereby granted, free of charge, to any person obtaining a
jbradshaw 0:e4a10ed6eb92 5 * copy of this software and associated documentation files (the "Software"),
jbradshaw 0:e4a10ed6eb92 6 * to deal in the Software without restriction, including without limitation
jbradshaw 0:e4a10ed6eb92 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
jbradshaw 0:e4a10ed6eb92 8 * and/or sell copies of the Software, and to permit persons to whom the
jbradshaw 0:e4a10ed6eb92 9 * Software is furnished to do so, subject to the following conditions:
jbradshaw 0:e4a10ed6eb92 10 *
jbradshaw 0:e4a10ed6eb92 11 * The above copyright notice and this permission notice shall be included
jbradshaw 0:e4a10ed6eb92 12 * in all copies or substantial portions of the Software.
jbradshaw 0:e4a10ed6eb92 13 *
jbradshaw 0:e4a10ed6eb92 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
jbradshaw 0:e4a10ed6eb92 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
jbradshaw 0:e4a10ed6eb92 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
jbradshaw 0:e4a10ed6eb92 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
jbradshaw 0:e4a10ed6eb92 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
jbradshaw 0:e4a10ed6eb92 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
jbradshaw 0:e4a10ed6eb92 20 * OTHER DEALINGS IN THE SOFTWARE.
jbradshaw 0:e4a10ed6eb92 21 *
jbradshaw 0:e4a10ed6eb92 22 * Except as contained in this notice, the name of Maxim Integrated
jbradshaw 0:e4a10ed6eb92 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
jbradshaw 0:e4a10ed6eb92 24 * Products, Inc. Branding Policy.
jbradshaw 0:e4a10ed6eb92 25 *
jbradshaw 0:e4a10ed6eb92 26 * The mere transfer of this software does not imply any licenses
jbradshaw 0:e4a10ed6eb92 27 * of trade secrets, proprietary technology, copyrights, patents,
jbradshaw 0:e4a10ed6eb92 28 * trademarks, maskwork rights, or any other form of intellectual
jbradshaw 0:e4a10ed6eb92 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
jbradshaw 0:e4a10ed6eb92 30 * ownership rights.
jbradshaw 0:e4a10ed6eb92 31 *******************************************************************************/
jbradshaw 0:e4a10ed6eb92 32 /*
jbradshaw 0:e4a10ed6eb92 33 * max30101.h
jbradshaw 0:e4a10ed6eb92 34 *
jbradshaw 0:e4a10ed6eb92 35 * Created on: Aug 26, 2015
jbradshaw 0:e4a10ed6eb92 36 * Author: faisal.tariq
jbradshaw 0:e4a10ed6eb92 37 */
jbradshaw 0:e4a10ed6eb92 38
jbradshaw 0:e4a10ed6eb92 39 #ifndef _MAX30101_H_
jbradshaw 0:e4a10ed6eb92 40 #define _MAX30101_H_
jbradshaw 0:e4a10ed6eb92 41
jbradshaw 0:e4a10ed6eb92 42 #include "mbed.h"
jbradshaw 0:e4a10ed6eb92 43
jbradshaw 0:e4a10ed6eb92 44 #define MAX30101_RAW_DATA_SIZE 3 * 4 * 32
jbradshaw 0:e4a10ed6eb92 45 #define MAX30101_PROC_DATA_SIZE 4 * 32
jbradshaw 0:e4a10ed6eb92 46
jbradshaw 0:e4a10ed6eb92 47 #define MAX30101_OXIMETER_DATA 0x10
jbradshaw 0:e4a10ed6eb92 48
jbradshaw 0:e4a10ed6eb92 49 #define CHUNK_SIZE 252
jbradshaw 0:e4a10ed6eb92 50
jbradshaw 0:e4a10ed6eb92 51 // MAX30101 Register addresses
jbradshaw 0:e4a10ed6eb92 52
jbradshaw 0:e4a10ed6eb92 53 #define MAX30101_INT_PORT 4
jbradshaw 0:e4a10ed6eb92 54 #define MAX30101_INT_PIN 0
jbradshaw 0:e4a10ed6eb92 55 #define MAX30101_MASTER_NUM 2
jbradshaw 0:e4a10ed6eb92 56
jbradshaw 0:e4a10ed6eb92 57 /**
jbradshaw 0:e4a10ed6eb92 58 * Maxim Integrated MAX30101 Oximeter chip
jbradshaw 0:e4a10ed6eb92 59 */
jbradshaw 0:e4a10ed6eb92 60 class MAX30101 {
jbradshaw 0:e4a10ed6eb92 61 public:
jbradshaw 0:e4a10ed6eb92 62 float max30101_final_temp; // Global declaration
jbradshaw 0:e4a10ed6eb92 63 uint32_t max30101_buffer[MAX30101_PROC_DATA_SIZE]; // final Processed data
jbradshaw 0:e4a10ed6eb92 64 char max30101_rawData[MAX30101_RAW_DATA_SIZE]; // raw data from the chip
jbradshaw 0:e4a10ed6eb92 65
jbradshaw 0:e4a10ed6eb92 66 typedef enum { // MAX30101 Register addresses
jbradshaw 0:e4a10ed6eb92 67
jbradshaw 0:e4a10ed6eb92 68 /*Status */
jbradshaw 0:e4a10ed6eb92 69 REG_INT_STAT_1 = 0x00,
jbradshaw 0:e4a10ed6eb92 70 REG_INT_STAT_2 = 0x01,
jbradshaw 0:e4a10ed6eb92 71 REG_INT_EN_1 = 0x02,
jbradshaw 0:e4a10ed6eb92 72 REG_INT_EN_2 = 0x03,
jbradshaw 0:e4a10ed6eb92 73
jbradshaw 0:e4a10ed6eb92 74 REG_FIFO_W_PTR = 0x04,
jbradshaw 0:e4a10ed6eb92 75 REG_FIFO_OVF_CNT = 0x05,
jbradshaw 0:e4a10ed6eb92 76 REG_FIFO_R_PTR = 0x06,
jbradshaw 0:e4a10ed6eb92 77 REG_FIFO_DATA = 0x07,
jbradshaw 0:e4a10ed6eb92 78 /* Configuration */
jbradshaw 0:e4a10ed6eb92 79 REG_FIFO_CFG = 0x08,
jbradshaw 0:e4a10ed6eb92 80 REG_MODE_CFG = 0x09,
jbradshaw 0:e4a10ed6eb92 81 REG_SPO2_CFG = 0x0A,
jbradshaw 0:e4a10ed6eb92 82 REG_LED1_PA = 0x0C,
jbradshaw 0:e4a10ed6eb92 83 REG_LED2_PA = 0x0D,
jbradshaw 0:e4a10ed6eb92 84 REG_LED3_PA = 0x0E,
jbradshaw 0:e4a10ed6eb92 85 REG_PILOT_PA = 0x10,
jbradshaw 0:e4a10ed6eb92 86 REG_SLT2_SLT1 = 0x11,
jbradshaw 0:e4a10ed6eb92 87 REG_SLT4_SLT3 = 0x12,
jbradshaw 0:e4a10ed6eb92 88 /* Die Temp */
jbradshaw 0:e4a10ed6eb92 89 REG_TINT = 0x1F,
jbradshaw 0:e4a10ed6eb92 90 REG_TFRAC = 0x20,
jbradshaw 0:e4a10ed6eb92 91 REG_TEMP_EN = 0x21,
jbradshaw 0:e4a10ed6eb92 92 /* Proximity Func */
jbradshaw 0:e4a10ed6eb92 93 REG_PROX_INT_THR = 0x30,
jbradshaw 0:e4a10ed6eb92 94 /* Part ID */
jbradshaw 0:e4a10ed6eb92 95 REG_REV_ID = 0xFE,
jbradshaw 0:e4a10ed6eb92 96 REG_ID = 0xFF,
jbradshaw 0:e4a10ed6eb92 97 } MAX30101_REG_map_t;
jbradshaw 0:e4a10ed6eb92 98
jbradshaw 0:e4a10ed6eb92 99 /**********/
jbradshaw 0:e4a10ed6eb92 100 /* STATUS */
jbradshaw 0:e4a10ed6eb92 101 /**********/
jbradshaw 0:e4a10ed6eb92 102 /// @brief STATUS1 (0x00)
jbradshaw 0:e4a10ed6eb92 103 union max30101_Interrupt_Status_1_reg {
jbradshaw 0:e4a10ed6eb92 104 char all;
jbradshaw 0:e4a10ed6eb92 105 struct {
jbradshaw 0:e4a10ed6eb92 106 char pwr_rdy : 1;
jbradshaw 0:e4a10ed6eb92 107 char reserved : 3;
jbradshaw 0:e4a10ed6eb92 108 char prox_int : 1;
jbradshaw 0:e4a10ed6eb92 109 char alc_ovf : 1;
jbradshaw 0:e4a10ed6eb92 110 char ppg_rdy : 1;
jbradshaw 0:e4a10ed6eb92 111 char a_full : 1;
jbradshaw 0:e4a10ed6eb92 112 } bit;
jbradshaw 0:e4a10ed6eb92 113 } max30101_Interrupt_Status_1;
jbradshaw 0:e4a10ed6eb92 114
jbradshaw 0:e4a10ed6eb92 115 /// @brief STATUS2 (0x01)
jbradshaw 0:e4a10ed6eb92 116 union max30101_Interrupt_Status_2_reg {
jbradshaw 0:e4a10ed6eb92 117 char all;
jbradshaw 0:e4a10ed6eb92 118 struct {
jbradshaw 0:e4a10ed6eb92 119 char reserved1 : 1;
jbradshaw 0:e4a10ed6eb92 120 char die_temp_rdy : 1;
jbradshaw 0:e4a10ed6eb92 121 char reserved2 : 6;
jbradshaw 0:e4a10ed6eb92 122 } bit;
jbradshaw 0:e4a10ed6eb92 123 } max30101_Interrupt_Status_2;
jbradshaw 0:e4a10ed6eb92 124
jbradshaw 0:e4a10ed6eb92 125 /// @brief INTERRUPT_ENABLE1 (0x02)
jbradshaw 0:e4a10ed6eb92 126 volatile union max30101_Interrupt_Enable_1_reg {
jbradshaw 0:e4a10ed6eb92 127 uint8_t all;
jbradshaw 0:e4a10ed6eb92 128 struct {
jbradshaw 0:e4a10ed6eb92 129 uint8_t reserved1 : 4;
jbradshaw 0:e4a10ed6eb92 130 uint8_t prox_int_en : 1;
jbradshaw 0:e4a10ed6eb92 131 uint8_t alc_ovf_en : 1;
jbradshaw 0:e4a10ed6eb92 132 uint8_t ppg_rdy_en : 1;
jbradshaw 0:e4a10ed6eb92 133 uint8_t a_full_en : 1;
jbradshaw 0:e4a10ed6eb92 134 } bit;
jbradshaw 0:e4a10ed6eb92 135 } max30101_Interrupt_Enable_1;
jbradshaw 0:e4a10ed6eb92 136
jbradshaw 0:e4a10ed6eb92 137 /// @brief INTERRUPT_ENABLE2 (0x03)
jbradshaw 0:e4a10ed6eb92 138 volatile union max30101_Interrupt_Enable_2_reg {
jbradshaw 0:e4a10ed6eb92 139 uint8_t all;
jbradshaw 0:e4a10ed6eb92 140 struct {
jbradshaw 0:e4a10ed6eb92 141 uint8_t reserved1 : 1;
jbradshaw 0:e4a10ed6eb92 142 uint8_t die_temp_rdy_en : 1;
jbradshaw 0:e4a10ed6eb92 143 uint8_t reserved2 : 6;
jbradshaw 0:e4a10ed6eb92 144 } bit;
jbradshaw 0:e4a10ed6eb92 145 } max30101_Interrupt_Enable_2;
jbradshaw 0:e4a10ed6eb92 146
jbradshaw 0:e4a10ed6eb92 147 /*********/
jbradshaw 0:e4a10ed6eb92 148 /* FIFO */
jbradshaw 0:e4a10ed6eb92 149 /*********/
jbradshaw 0:e4a10ed6eb92 150 // 0x04
jbradshaw 0:e4a10ed6eb92 151 /// @brief FIFO_WR_PTR (0x04)
jbradshaw 0:e4a10ed6eb92 152 volatile union max30101_fifo_wr_ptr_reg {
jbradshaw 0:e4a10ed6eb92 153 uint8_t all;
jbradshaw 0:e4a10ed6eb92 154 struct {
jbradshaw 0:e4a10ed6eb92 155 uint8_t fifo_wr_ptr : 5;
jbradshaw 0:e4a10ed6eb92 156 uint8_t reserved1 : 3;
jbradshaw 0:e4a10ed6eb92 157 } bit;
jbradshaw 0:e4a10ed6eb92 158 } max30101_fifo_wr_ptr;
jbradshaw 0:e4a10ed6eb92 159
jbradshaw 0:e4a10ed6eb92 160 /// @brief OVF_COUNTER (0x05)
jbradshaw 0:e4a10ed6eb92 161 volatile union max30101_ovf_counter_reg {
jbradshaw 0:e4a10ed6eb92 162 uint8_t all;
jbradshaw 0:e4a10ed6eb92 163 struct {
jbradshaw 0:e4a10ed6eb92 164 uint8_t fifo_ovf_counter : 5;
jbradshaw 0:e4a10ed6eb92 165 uint8_t reserved1 : 3;
jbradshaw 0:e4a10ed6eb92 166 } bit;
jbradshaw 0:e4a10ed6eb92 167 } max30101_ovf_counter_reg;
jbradshaw 0:e4a10ed6eb92 168
jbradshaw 0:e4a10ed6eb92 169 /// @brief FIFO_READ_PTR (0x06)
jbradshaw 0:e4a10ed6eb92 170 volatile union max30101_fifo_rd_ptr_reg {
jbradshaw 0:e4a10ed6eb92 171 uint8_t all;
jbradshaw 0:e4a10ed6eb92 172 struct {
jbradshaw 0:e4a10ed6eb92 173 uint8_t fifo_rd_ptr : 5;
jbradshaw 0:e4a10ed6eb92 174 uint8_t reserved1 : 3;
jbradshaw 0:e4a10ed6eb92 175 } bit;
jbradshaw 0:e4a10ed6eb92 176 } max30101_fifo_rd_ptr;
jbradshaw 0:e4a10ed6eb92 177
jbradshaw 0:e4a10ed6eb92 178 // 0x07
jbradshaw 0:e4a10ed6eb92 179 uint8_t max30101_fifo_data;
jbradshaw 0:e4a10ed6eb92 180
jbradshaw 0:e4a10ed6eb92 181 /********************/
jbradshaw 0:e4a10ed6eb92 182 /* Configuration */
jbradshaw 0:e4a10ed6eb92 183 /********************/
jbradshaw 0:e4a10ed6eb92 184 // 0x08
jbradshaw 0:e4a10ed6eb92 185 /// @brief FIFO_CONFIGURATION (0x08)
jbradshaw 0:e4a10ed6eb92 186 volatile union max30101_fifo_configuration_reg {
jbradshaw 0:e4a10ed6eb92 187 uint8_t all;
jbradshaw 0:e4a10ed6eb92 188 struct {
jbradshaw 0:e4a10ed6eb92 189 uint8_t fifo_a_full : 4;
jbradshaw 0:e4a10ed6eb92 190 uint8_t fifo_roll_over_en : 1;
jbradshaw 0:e4a10ed6eb92 191 uint8_t smp_ave : 3;
jbradshaw 0:e4a10ed6eb92 192 } bit;
jbradshaw 0:e4a10ed6eb92 193 } max30101_fifo_configuration;
jbradshaw 0:e4a10ed6eb92 194
jbradshaw 0:e4a10ed6eb92 195 /// @brief MODE_CONFIGURATION (0x09)
jbradshaw 0:e4a10ed6eb92 196 volatile union max30101_mode_configuration_reg {
jbradshaw 0:e4a10ed6eb92 197 uint8_t all;
jbradshaw 0:e4a10ed6eb92 198 struct {
jbradshaw 0:e4a10ed6eb92 199 uint8_t mode : 3;
jbradshaw 0:e4a10ed6eb92 200 uint8_t reserved1 : 3;
jbradshaw 0:e4a10ed6eb92 201 uint8_t reset : 1;
jbradshaw 0:e4a10ed6eb92 202 uint8_t shdn : 1;
jbradshaw 0:e4a10ed6eb92 203 } bit;
jbradshaw 0:e4a10ed6eb92 204 } max30101_mode_configuration;
jbradshaw 0:e4a10ed6eb92 205
jbradshaw 0:e4a10ed6eb92 206 /// @brief SPO2_CONGIGURATION (0x0A)
jbradshaw 0:e4a10ed6eb92 207 volatile union max30101_spo2_configuration_reg {
jbradshaw 0:e4a10ed6eb92 208 uint8_t all;
jbradshaw 0:e4a10ed6eb92 209 struct {
jbradshaw 0:e4a10ed6eb92 210 uint8_t led_pw : 2;
jbradshaw 0:e4a10ed6eb92 211 uint8_t spo2_sr : 3;
jbradshaw 0:e4a10ed6eb92 212 uint8_t spo2_adc_rge : 2;
jbradshaw 0:e4a10ed6eb92 213 uint8_t reserved1 : 1;
jbradshaw 0:e4a10ed6eb92 214 } bit;
jbradshaw 0:e4a10ed6eb92 215 } max30101_spo2_configuration;
jbradshaw 0:e4a10ed6eb92 216
jbradshaw 0:e4a10ed6eb92 217 /// @brief LED1_PA (0x0C)
jbradshaw 0:e4a10ed6eb92 218 uint8_t max30101_led1_pa;
jbradshaw 0:e4a10ed6eb92 219
jbradshaw 0:e4a10ed6eb92 220 /// @brief LED2_PA (0x0D)
jbradshaw 0:e4a10ed6eb92 221 uint8_t max30101_led2_pa;
jbradshaw 0:e4a10ed6eb92 222
jbradshaw 0:e4a10ed6eb92 223 /// @brief LED3_PA (0x0E)
jbradshaw 0:e4a10ed6eb92 224 uint8_t max30101_led3_pa;
jbradshaw 0:e4a10ed6eb92 225
jbradshaw 0:e4a10ed6eb92 226 /// @brief PILOT_PA (0x10)
jbradshaw 0:e4a10ed6eb92 227 uint8_t max30101_pilot_pa;
jbradshaw 0:e4a10ed6eb92 228
jbradshaw 0:e4a10ed6eb92 229 volatile union max30101_multiLED_mode_ctrl_1_reg {
jbradshaw 0:e4a10ed6eb92 230 uint8_t all;
jbradshaw 0:e4a10ed6eb92 231 struct {
jbradshaw 0:e4a10ed6eb92 232 uint8_t slot1 : 3;
jbradshaw 0:e4a10ed6eb92 233 uint8_t reserved : 1;
jbradshaw 0:e4a10ed6eb92 234 uint8_t slot2 : 3;
jbradshaw 0:e4a10ed6eb92 235 uint8_t reserved1 : 1;
jbradshaw 0:e4a10ed6eb92 236 } bit;
jbradshaw 0:e4a10ed6eb92 237 } max30101_multiLED_mode_ctrl_1;
jbradshaw 0:e4a10ed6eb92 238
jbradshaw 0:e4a10ed6eb92 239 volatile union max30101_multiLED_mode_ctrl_2_reg {
jbradshaw 0:e4a10ed6eb92 240 uint8_t all;
jbradshaw 0:e4a10ed6eb92 241 struct {
jbradshaw 0:e4a10ed6eb92 242 uint8_t slot3 : 3;
jbradshaw 0:e4a10ed6eb92 243 uint8_t reserved : 1;
jbradshaw 0:e4a10ed6eb92 244 uint8_t slot4 : 3;
jbradshaw 0:e4a10ed6eb92 245 uint8_t reserved1 : 1;
jbradshaw 0:e4a10ed6eb92 246 } bit;
jbradshaw 0:e4a10ed6eb92 247 } max30101_multiLED_mode_ctrl_2;
jbradshaw 0:e4a10ed6eb92 248
jbradshaw 0:e4a10ed6eb92 249 /********************/
jbradshaw 0:e4a10ed6eb92 250 /* Die Temperature */
jbradshaw 0:e4a10ed6eb92 251 /********************/
jbradshaw 0:e4a10ed6eb92 252
jbradshaw 0:e4a10ed6eb92 253 uint8_t max30101_tinit;
jbradshaw 0:e4a10ed6eb92 254
jbradshaw 0:e4a10ed6eb92 255 uint8_t max30101_tfrac;
jbradshaw 0:e4a10ed6eb92 256
jbradshaw 0:e4a10ed6eb92 257 volatile union max30101_die_temp_config {
jbradshaw 0:e4a10ed6eb92 258 uint8_t all;
jbradshaw 0:e4a10ed6eb92 259 struct {
jbradshaw 0:e4a10ed6eb92 260 uint8_t temp_en : 1;
jbradshaw 0:e4a10ed6eb92 261 uint8_t reserved : 7;
jbradshaw 0:e4a10ed6eb92 262 } bit;
jbradshaw 0:e4a10ed6eb92 263 } max30101_die_temp_config;
jbradshaw 0:e4a10ed6eb92 264 /*******************************/
jbradshaw 0:e4a10ed6eb92 265 /***** Function Prototypes *****/
jbradshaw 0:e4a10ed6eb92 266 /*******************************/
jbradshaw 0:e4a10ed6eb92 267
jbradshaw 0:e4a10ed6eb92 268 uint8_t max30101_prox_int_thresh;
jbradshaw 0:e4a10ed6eb92 269
jbradshaw 0:e4a10ed6eb92 270 /**
jbradshaw 0:e4a10ed6eb92 271 * MAX30101 constructor.
jbradshaw 0:e4a10ed6eb92 272 *
jbradshaw 0:e4a10ed6eb92 273 * @param sda mbed pin to use for SDA line of I2C interface.
jbradshaw 0:e4a10ed6eb92 274 * @param scl mbed pin to use for SCL line of I2C interface.
jbradshaw 0:e4a10ed6eb92 275 */
jbradshaw 0:e4a10ed6eb92 276 MAX30101(PinName sda, PinName scl, int slaveAddress);
jbradshaw 0:e4a10ed6eb92 277
jbradshaw 0:e4a10ed6eb92 278 /**
jbradshaw 0:e4a10ed6eb92 279 * MAX30101 constructor.
jbradshaw 0:e4a10ed6eb92 280 *
jbradshaw 0:e4a10ed6eb92 281 * @param i2c I2C object to use.
jbradshaw 0:e4a10ed6eb92 282 */
jbradshaw 0:e4a10ed6eb92 283 MAX30101(I2C *i2c, int slaveAddress);
jbradshaw 0:e4a10ed6eb92 284
jbradshaw 0:e4a10ed6eb92 285 /**
jbradshaw 0:e4a10ed6eb92 286 * MAX30101 destructor.
jbradshaw 0:e4a10ed6eb92 287 */
jbradshaw 0:e4a10ed6eb92 288 ~MAX30101(void);
jbradshaw 0:e4a10ed6eb92 289
jbradshaw 0:e4a10ed6eb92 290 /**
jbradshaw 0:e4a10ed6eb92 291 * @brief Allows reading from MAX30101 register
jbradshaw 0:e4a10ed6eb92 292 * @param reg: is the register address, to read from (look at max30101.h and the
jbradshaw 0:e4a10ed6eb92 293 * data sheet for details)
jbradshaw 0:e4a10ed6eb92 294 * @param value: is the pointer to the value read from the register
jbradshaw 0:e4a10ed6eb92 295 * @returns 0-if no error. A non-zero value indicates an error.
jbradshaw 0:e4a10ed6eb92 296 */
jbradshaw 0:e4a10ed6eb92 297 int i2c_reg_read(MAX30101_REG_map_t reg, char *value);
jbradshaw 0:e4a10ed6eb92 298
jbradshaw 0:e4a10ed6eb92 299 /**
jbradshaw 0:e4a10ed6eb92 300 * @brief Allows writing to MAX30101 register
jbradshaw 0:e4a10ed6eb92 301 * @param reg: is the register address, to read from (look at max30101.h and
jbradshaw 0:e4a10ed6eb92 302 * the
jbradshaw 0:e4a10ed6eb92 303 * data sheet for details)
jbradshaw 0:e4a10ed6eb92 304 * @param value: is the value to write to the register
jbradshaw 0:e4a10ed6eb92 305 * @returns 0-if if no error. A non-zero value indicates an error.
jbradshaw 0:e4a10ed6eb92 306 */
jbradshaw 0:e4a10ed6eb92 307 int i2c_reg_write(MAX30101_REG_map_t reg, char value);
jbradshaw 0:e4a10ed6eb92 308
jbradshaw 0:e4a10ed6eb92 309 /**
jbradshaw 0:e4a10ed6eb92 310 * @brief This function sets up for the SpO2 mode. The data is returned in
jbradshaw 0:e4a10ed6eb92 311 * the callback function
jbradshaw 0:e4a10ed6eb92 312 * @brief max30101_int_handler in global array: buffer[]. SP mode handles two LED (Red,IR) data. Hence it
jbradshaw 0:e4a10ed6eb92 313 * @brief can fill up the FIFO up to a maximum of 3bytes/sample x 32 x 2 = 192bytes.
jbradshaw 0:e4a10ed6eb92 314 * @param fifo_waterlevel_mark: corresponds to FIFO_A_FULL, In FIFO Configuration Register (0x08)
jbradshaw 0:e4a10ed6eb92 315 * @param sample_avg: corresponds to SMP_AVE, in FIFO Configuration Register (0x08)
jbradshaw 0:e4a10ed6eb92 316 * @param sample_rate: corresponds to SPO2_SR, IN SpO2 Configuration Register (0x0A)
jbradshaw 0:e4a10ed6eb92 317 * @param pulse_width: corresponds to LED_PW in SpO2 Configuration register(0x0A)
jbradshaw 0:e4a10ed6eb92 318 * @param red_led_current: corresponds to LED1_PA register (0x0C). Please see data sheet for values
jbradshaw 0:e4a10ed6eb92 319 * @param ir_led_current: corresponds to LED2_PA register (0x0D). Please see data sheet for values
jbradshaw 0:e4a10ed6eb92 320 * @returns 0-if everything is good. A non-zero value indicates an error.
jbradshaw 0:e4a10ed6eb92 321 */
jbradshaw 0:e4a10ed6eb92 322 int SpO2mode_init(uint8_t fifo_waterlevel_mark, uint8_t sample_avg,
jbradshaw 0:e4a10ed6eb92 323 uint8_t sample_rate, uint8_t pulse_width,
jbradshaw 0:e4a10ed6eb92 324 uint8_t red_led_current, uint8_t ir_led_current);
jbradshaw 0:e4a10ed6eb92 325
jbradshaw 0:e4a10ed6eb92 326 /**
jbradshaw 0:e4a10ed6eb92 327 * @brief This function will stop the SpO2 mode and turn off all operating LEDâs.
jbradshaw 0:e4a10ed6eb92 328 * @return 0-if if no error. A non-zero value indicates an error.
jbradshaw 0:e4a10ed6eb92 329 */
jbradshaw 0:e4a10ed6eb92 330 int SpO2mode_stop(void);
jbradshaw 0:e4a10ed6eb92 331
jbradshaw 0:e4a10ed6eb92 332 /**
jbradshaw 0:e4a10ed6eb92 333 * @brief This function sets up for the HR mode. The data is returned in thecallback function
jbradshaw 0:e4a10ed6eb92 334 * @brief max30101_int_handler in global array: buffer[].HR mode handles one LED (Red) data. Hence it can fill
jbradshaw 0:e4a10ed6eb92 335 * @brief up the FIFO up to a maximum of 3bytes/sample x 32 = 96bytes.
jbradshaw 0:e4a10ed6eb92 336 * @brief fifo_waterlevel_mark: corresponds to FIFO_A_FULL, In FIFO Configuration Register (0x08)
jbradshaw 0:e4a10ed6eb92 337 * @param sample_avg: corresponds to SMP_AVE, in FIFO Configuration Register (0x08)
jbradshaw 0:e4a10ed6eb92 338 * @param sample_rate:corresponds to SPO2_SR, IN SpO2 Configuration Register (0x0A)
jbradshaw 0:e4a10ed6eb92 339 * @param pulse_width: corresponds to LED_PW in SpO2 Configuration Register(0x0A)
jbradshaw 0:e4a10ed6eb92 340 * @param red_led_current: corresponds to LED1_PA register (0x0C). Please see data sheet for values
jbradshaw 0:e4a10ed6eb92 341 * @returns 0-if if no error. A non-zero value indicates an error.
jbradshaw 0:e4a10ed6eb92 342 */
jbradshaw 0:e4a10ed6eb92 343 int HRmode_init(uint8_t fifo_waterlevel_mark, uint8_t sample_avg,
jbradshaw 0:e4a10ed6eb92 344 uint8_t sample_rate, uint8_t pulse_width,
jbradshaw 0:e4a10ed6eb92 345 uint8_t red_led_current);
jbradshaw 0:e4a10ed6eb92 346
jbradshaw 0:e4a10ed6eb92 347 /**
jbradshaw 0:e4a10ed6eb92 348 * @brief This function will stop the HR mode and turn off all operating
jbradshaw 0:e4a10ed6eb92 349 * LED’s.
jbradshaw 0:e4a10ed6eb92 350 * @return 0-if if no error. A non-zero value indicates an error.
jbradshaw 0:e4a10ed6eb92 351 */
jbradshaw 0:e4a10ed6eb92 352 int HRmode_stop(void);
jbradshaw 0:e4a10ed6eb92 353
jbradshaw 0:e4a10ed6eb92 354 /**
jbradshaw 0:e4a10ed6eb92 355 *@brief This function sets up for the Multi-mode. The data is returned in the callback function max30101_int_handler in global array:
jbradshaw 0:e4a10ed6eb92 356 *@brief buffer[]. Multi-LED mode can handle 1 to 4 LED combinations. Hence it can fill up the FIFO up to a maximum of
jbradshaw 0:e4a10ed6eb92 357 *@brief 3bytes/sample x 32 x 4 = 384bytes.
jbradshaw 0:e4a10ed6eb92 358 *@param fifo_waterlevel_mark: corresponds to FIFO_A_FULL, In FIFO Configuration Register (0x08)
jbradshaw 0:e4a10ed6eb92 359 *@param sample_avg: corresponds to SMP_AVE, in FIFO Configuration Register (0x08)
jbradshaw 0:e4a10ed6eb92 360 *@param sample_rate:corresponds to SPO2_SR, IN SpO2 Configuration Register (0x0A)
jbradshaw 0:e4a10ed6eb92 361 *@param pulse_width: corresponds to LED_PW in SpO2 Configuration register(0x0A)
jbradshaw 0:e4a10ed6eb92 362 *@param red_led_current: corresponds to LED1_PA register (0x0C). Please see data sheet for values
jbradshaw 0:e4a10ed6eb92 363 *@param ir_led_current: corresponds to LED2_PA register (0x0D). Please see data sheet for values
jbradshaw 0:e4a10ed6eb92 364 *@param green_led_current: corresponds to LED3_PA register (0x0E). Please see data sheet for values
jbradshaw 0:e4a10ed6eb92 365 *@param slot_1,…,slot_4: corresponds to Multi-LED Mode control Registers (0x11-0x12).
jbradshaw 0:e4a10ed6eb92 366 *@returns 0-if if no error. A non-zero value indicates an error.
jbradshaw 0:e4a10ed6eb92 367 */
jbradshaw 0:e4a10ed6eb92 368 int Multimode_init(uint8_t fifo_waterlevel_mark, uint8_t sample_avg,
jbradshaw 0:e4a10ed6eb92 369 uint8_t sample_rate, uint8_t pulse_width,
jbradshaw 0:e4a10ed6eb92 370 uint8_t red_led_current, uint8_t ir_led_current,
jbradshaw 0:e4a10ed6eb92 371 uint8_t green_led_current, uint8_t slot_1, uint8_t slot_2,
jbradshaw 0:e4a10ed6eb92 372 uint8_t slot_3, uint8_t slot_4);
jbradshaw 0:e4a10ed6eb92 373
jbradshaw 0:e4a10ed6eb92 374 /**
jbradshaw 0:e4a10ed6eb92 375 * @brief This function will stop the Multi-mode and turn off all operating LED’s.
jbradshaw 0:e4a10ed6eb92 376 * @returns 0-if if no error. A non-zero value indicates an error.
jbradshaw 0:e4a10ed6eb92 377 */
jbradshaw 0:e4a10ed6eb92 378 int Multimode_stop(void);
jbradshaw 0:e4a10ed6eb92 379
jbradshaw 0:e4a10ed6eb92 380 /**
jbradshaw 0:e4a10ed6eb92 381 * @brief This is a function that sets up for temperature read and should be called after one of the mode
jbradshaw 0:e4a10ed6eb92 382 * @brief has been setup. The data is returned in the callback function max30101_int_handler. This
jbradshaw 0:e4a10ed6eb92 383 * @brief function needs to be called every time temperature reading is required.
jbradshaw 0:e4a10ed6eb92 384 * @brief Call the temp function after one of the MODES have been started
jbradshaw 0:e4a10ed6eb92 385 * @brief Note that the temp is disabled after one read... also, it is not necessary
jbradshaw 0:e4a10ed6eb92 386 * @brief to read the temp frequently...
jbradshaw 0:e4a10ed6eb92 387 * @returns 0-if if no error. A non-zero value indicates an error.
jbradshaw 0:e4a10ed6eb92 388 */
jbradshaw 0:e4a10ed6eb92 389 int tempread(void);
jbradshaw 0:e4a10ed6eb92 390
jbradshaw 0:e4a10ed6eb92 391 /**
jbradshaw 0:e4a10ed6eb92 392 *@brief This is a callback function which collects the data from the FIFO of the MAX30101 in a 32-bit
jbradshaw 0:e4a10ed6eb92 393 *@brief unsigned global array called max30101_buffer[]. Upon every interrupt from the MAX30101, this
jbradshaw 0:e4a10ed6eb92 394 *@brief function is called to service the FIFO of the MAX30101. This callback function also services the
jbradshaw 0:e4a10ed6eb92 395 *@brief interrupt for the temp data. The temp data is collected in a floating point global variable
jbradshaw 0:e4a10ed6eb92 396 *@brief final_temp.
jbradshaw 0:e4a10ed6eb92 397 *@param max30101_buffer[], global uint32_t
jbradshaw 0:e4a10ed6eb92 398 *@returns 0-if everything is good. A non-zero value indicates an error.
jbradshaw 0:e4a10ed6eb92 399 */
jbradshaw 0:e4a10ed6eb92 400 int int_handler(void);
jbradshaw 0:e4a10ed6eb92 401 /**
jbradshaw 0:e4a10ed6eb92 402 * @brief type definition for data interrupt
jbradshaw 0:e4a10ed6eb92 403 */
jbradshaw 0:e4a10ed6eb92 404 typedef void (*DataCallbackFunction)(uint32_t id, uint32_t *buffer,
jbradshaw 0:e4a10ed6eb92 405 uint32_t length);
jbradshaw 0:e4a10ed6eb92 406 /**
jbradshaw 0:e4a10ed6eb92 407 * @brief type definition for general interrupt
jbradshaw 0:e4a10ed6eb92 408 */
jbradshaw 0:e4a10ed6eb92 409 typedef void (*InterruptFunction)();
jbradshaw 0:e4a10ed6eb92 410
jbradshaw 0:e4a10ed6eb92 411 /**
jbradshaw 0:e4a10ed6eb92 412 * @brief Used to connect a callback for when interrupt data is available
jbradshaw 0:e4a10ed6eb92 413 */
jbradshaw 0:e4a10ed6eb92 414 void onInterrupt(InterruptFunction _onInterrupt);
jbradshaw 0:e4a10ed6eb92 415
jbradshaw 0:e4a10ed6eb92 416 /**
jbradshaw 0:e4a10ed6eb92 417 * @brief Used to connect a callback for when interrupt data is available
jbradshaw 0:e4a10ed6eb92 418 */
jbradshaw 0:e4a10ed6eb92 419 void onDataAvailable(DataCallbackFunction _onDataAvailable);
jbradshaw 0:e4a10ed6eb92 420
jbradshaw 0:e4a10ed6eb92 421 static MAX30101 *instance;
jbradshaw 0:e4a10ed6eb92 422
jbradshaw 0:e4a10ed6eb92 423 private:
jbradshaw 0:e4a10ed6eb92 424 /// called when interrupt data is available
jbradshaw 0:e4a10ed6eb92 425 void dataAvailable(uint32_t id, uint32_t *buffer, uint32_t length);
jbradshaw 0:e4a10ed6eb92 426 /// callback function at the end of the interrupt
jbradshaw 0:e4a10ed6eb92 427 void interruptPostCallback(void);
jbradshaw 0:e4a10ed6eb92 428 /// callback function when interrupt data is available
jbradshaw 0:e4a10ed6eb92 429 DataCallbackFunction onDataAvailableCallback;
jbradshaw 0:e4a10ed6eb92 430 /// callback function when interrupt data is available
jbradshaw 0:e4a10ed6eb92 431 InterruptFunction onInterruptCallback;
jbradshaw 0:e4a10ed6eb92 432 /// Read I2c wrapper method
jbradshaw 0:e4a10ed6eb92 433 int I2CM_Read(int slaveAddress, char *writeData, char writeCount, char *readData, char readCount);
jbradshaw 0:e4a10ed6eb92 434 /// Write I2c wrapper method
jbradshaw 0:e4a10ed6eb92 435 int I2CM_Write(int slaveAddress, char *writeData1, char writeCount1, char *writeData2, char writeCount2);
jbradshaw 0:e4a10ed6eb92 436 /// pointer to I2C object
jbradshaw 0:e4a10ed6eb92 437 I2C *i2c;
jbradshaw 0:e4a10ed6eb92 438 /// flag to track if this object is the owner (created) the I2C object
jbradshaw 0:e4a10ed6eb92 439 bool i2c_owner;
jbradshaw 0:e4a10ed6eb92 440 /// Device slave address
jbradshaw 0:e4a10ed6eb92 441 int slaveAddress;
jbradshaw 0:e4a10ed6eb92 442 };
jbradshaw 0:e4a10ed6eb92 443
jbradshaw 0:e4a10ed6eb92 444 /**
jbradshaw 0:e4a10ed6eb92 445 * @brief Resets the I2C block, when needed
jbradshaw 0:e4a10ed6eb92 446 */
jbradshaw 0:e4a10ed6eb92 447 extern void I2CM_Init_Reset(uint8_t index, int speed);
jbradshaw 0:e4a10ed6eb92 448
jbradshaw 0:e4a10ed6eb92 449 /**
jbradshaw 0:e4a10ed6eb92 450 * @brief Used for debugging, if needed
jbradshaw 0:e4a10ed6eb92 451 */
jbradshaw 0:e4a10ed6eb92 452 void MAX30101MidIntHandler(void);
jbradshaw 0:e4a10ed6eb92 453
jbradshaw 0:e4a10ed6eb92 454 #endif /* _MAX30101_H_ */