initial commit, reads dev id
Diff: MAX8614X.h
- Revision:
- 5:1f7b8cb07e26
- Parent:
- 4:6ec3bc44f055
--- a/MAX8614X.h Thu Aug 16 19:53:01 2018 +0000
+++ b/MAX8614X.h Fri Aug 17 05:35:58 2018 +0000
@@ -36,8 +36,8 @@
#define _MAX8614X_H_
#include "mbed.h"
-//#include "queue.h"
-//#include "MaximSensor.h"
+#include "queue.h"
+#include "MaximSensor.h"
/**
@brief The MAX8614X
@@ -46,7 +46,7 @@
/**
@brief MAX8614X - supports MAX8614X object with SPI interface
*/
-class MAX8614X
+class MAX8614X: public MaximSensor
{
public:
/* PUBLIC CONST VARIABLES */
@@ -194,13 +194,153 @@
static const uint8_t MAX8614X_MEMCNTRL_WR_EN_MASK = (0x01 << 1);
static const uint8_t MAX8614X_SHACMD_MAC_ROM_ID = (0x35);
static const uint8_t MAX8614X_SHACMD_MAC_NO_ROM_ID = (0x36);
+
/* PUBLIC TYPE DEFINITIONS */
typedef struct RegisterMap {
uint8_t addr;
uint8_t val;
} RegisterMap_t;
-
- typedef union {
+
+ /* PUBLIC FUNCTION DECLARATIONS */
+
+ MAX8614X(SPI &spiBus, DigitalOut &cs, PinName intPin);
+
+ int readRegister(uint8_t reg, uint8_t *data, int len);
+
+ int writeRegister(uint8_t reg, const uint8_t data);
+
+ int writeBlock(const RegisterMap reg_block[], unsigned int size);
+
+ int dequeue_from_fifo_queue(uint32_t *ir, uint32_t *red, uint32_t *green);
+
+ int get_part_info(uint8_t *part_id, uint8_t *rev_id);
+
+ int init();
+
+ const char *get_sensor_part_name();
+
+ const char *get_sensor_name();
+
+ int sensor_enable(int enable);
+
+ int agc_enable(int agc_enable);
+
+ int dump_registers();
+ bool isShaComplete(void);
+ void clearShaComplete(void);
+
+ /* PUBLIC VARIABLES */
+ InterruptIn m_ir;
+
+private:
+ /* PRIVATE CONST VARIABLES */
+ static const uint32_t MAX8614X_DATA_WORD_SIZE = 3;
+ static const uint32_t MAX8614X_MAX_FIFO_DEPTH = 128;
+ static const uint32_t MAX8614X_DATA_TYPE_MASK = (0x1F << 19);
+ static const uint32_t MAX8614X_DRIVER_FIFO_SZ = (MAX8614X_MAX_FIFO_DEPTH * 4);
+
+ /* PRIVATE TYPE DEFINITIONS */
+ enum LedSequence
+ {
+ DATA_SEQ_NONE,
+ DATA_SEQ_LED1,
+ DATA_SEQ_LED2,
+ DATA_SEQ_LED3,
+ DATA_SEQ_LED1_LED2,
+ DATA_SEQ_LED1_LED3,
+ DATA_SEQ_LED2_LED3,
+ DATA_SEQ_LED1_LED2_LED3,
+ DATA_SEQ_PILOT_LED1,
+ DATA_SEQ_AMBIENT,
+ DATA_SEQ_LED4_EXT_MUX,
+ DATA_SEQ_LED5_EXT_MUX,
+ DATA_SEQ_LED6_EXT_MUX,
+ };
+
+ enum DataTypes
+ {
+ DATA_TYPE_PPG1_LEDC1 = 0x01,
+ DATA_TYPE_PPG1_LEDC2,
+ DATA_TYPE_PPG1_LEDC3,
+ DATA_TYPE_PPG1_LEDC4,
+ DATA_TYPE_PPG1_LEDC5,
+ DATA_TYPE_PPG1_LEDC6,
+ DATA_TYPE_PPG2_LEDC1,
+ DATA_TYPE_PPG2_LEDC2,
+ DATA_TYPE_PPG2_LEDC3,
+ DATA_TYPE_PPG2_LEDC4,
+ DATA_TYPE_PPG2_LEDC5,
+ DATA_TYPE_PPG2_LEDC6,
+ DATA_TYPE_PPF1_LEDC1,
+ DATA_TYPE_PPF1_LEDC2,
+ DATA_TYPE_PPF1_LEDC3,
+ DATA_TYPE_PPF2_LEDC1 = 0x13,
+ DATA_TYPE_PPF3_LEDC2,
+ DATA_TYPE_PPF3_LEDC3,
+ DATA_TYPE_PROX1 = 0x19,
+ DATA_TYPE_PROX2,
+ DATA_TYPE_INVALID_DATA = 0x1E,
+ DATA_TYPE_TIME_STAMP,
+ };
+
+ enum PartIDs
+ {
+ MAX86140_PART_ID_VAL = 0x24,
+ MAX86141_PART_ID_VAL,
+ MAX86142_PART_ID_VAL,
+ MAX86143_PART_ID_VAL,
+ };
+
+ enum LedRanges
+ {
+ LED_RANGE_0_50,
+ LED_RANGE_50_100,
+ LED_RANGE_100_150,
+ LED_RANGE_150_200,
+ };
+
+ enum LedRangeSteps
+ {
+ LED_RANGE_STEP_25uA = 120,
+ LED_RANGE_STEP_50uA = 240,
+ LED_RANGE_STEP_75uA = 360,
+ LED_RANGE_STEP_100uA = 480,
+ };
+
+ typedef enum {
+ LED_1 = 0,
+ LED_2,
+ LED_3,
+ LED_4,
+ LED_5,
+ LED_6,
+ NUM_OF_LED,
+ } max8614x_led_t;
+
+ enum LED_CTRL_SM {
+ LED_PROX = 1,
+ LED_DATA_ACQ,
+ };
+
+ typedef union {
+ struct {
+ uint32_t val:19;
+ uint32_t type:5;
+ uint32_t:8;
+ };
+ uint32_t raw;
+ } fifo_data_t;
+
+ typedef union {
+ uint16_t val;
+ struct {
+ uint8_t tint;
+ uint8_t frac:4;
+ uint8_t:4;
+ };
+ } die_temp_t;
+
+ typedef union {
struct {
struct {
unsigned char pwr_rdy:1;
@@ -220,32 +360,96 @@
uint8_t val[2];
} int_status_t;
-
- /* PUBLIC FUNCTION DECLARATIONS */
+ union led_range {
+ struct {
+ uint8_t led1:2;
+ uint8_t led2:2;
+ uint8_t led3:2;
+ uint8_t:2;
+ uint8_t led4:2;
+ uint8_t led5:2;
+ uint8_t led6:2;
+ uint8_t:2;
+ };
+ uint8_t val[2];
+ };
- MAX8614X(SPI &spiBus, DigitalOut &cs, PinName intPin);
- ~MAX8614X();
- int init();
-
- int readRegister(uint8_t reg, uint8_t *data, int len);
+ typedef struct {
+ uint32_t green;
+ uint32_t ir;
+ uint32_t red;
+ } ppg_data_t;
- int writeRegister(uint8_t reg, const uint8_t data);
-
- int writeBlock(const RegisterMap reg_block[], unsigned int size);
- void irq_handler(void);
- bool isShaComplete(void);
- void clearShaComplete(void);
- /* PUBLIC VARIABLES */
- InterruptIn m_ir;
-
-private:
+ struct led_control {
+ uint32_t diode_sum[NUM_OF_LED];
+ uint32_t state;
+ uint32_t prox_sum;
+ uint32_t prox_sample_cnt;
+ int32_t led_current[NUM_OF_LED];
+ uint32_t default_current[NUM_OF_LED];
+ int32_t agc_led_out_percent;
+ int32_t agc_corr_coeff;
+ int32_t agc_min_num_samples;
+ int32_t agc_sensitivity_percent;
+ int32_t change_by_percent_of_range[NUM_OF_LED];
+ int32_t change_by_percent_of_current_setting[NUM_OF_LED];
+ int32_t change_led_by_absolute_count[NUM_OF_LED];
+ uint32_t sample_cnt;
+ union led_range led_range_settings;
+ uint8_t led_ranges;
+ uint8_t agc_is_enabled;
+ uint8_t lpm_is_enabled;
+ };
/* PRIVATE VARIABLES */
- SPI &m_spiBus;
- DigitalOut &m_cs;
+ SPI m_spiBus;
+ DigitalOut m_cs;
+ struct queue_t queue;
+ struct led_control led_ctrl;
+ int vdd_oor_cnt;
+ die_temp_t die_temp;
bool shaComplete;
/* PRIVATE FUNCTION DECLARATIONS */
+ int reset();
+
+ int poweroff();
+
+ void irq_handler();
+
+ int enable_die_temp();
+
+ int read_die_temp();
+
+ int get_num_samples_in_fifo();
+
+ void fifo_irq_handler();
+
+ int read_fifo_data(uint8_t *fifo_data, int num_samples);
+
+ /* AGC functions */
+ int max8614x_update_led_range(int new_range, uint8_t led_num,
+ union led_range *led_range_settings);
+
+ int max8614x_update_led_current(union led_range *led_range_settings,
+ int led_new_val, max8614x_led_t led_num);
+
+ void ppg_auto_gain_ctrl(struct led_control *led_ctrl,
+ uint32_t sample_cnt, int diode_data, max8614x_led_t led_num);
+
+ void max8614x_agc_handler(struct led_control *led_ctrl,
+ int *samples);
+
+ int led_control_sm(struct led_control *led_ctrl,
+ int diode_data, char lpm);
+
+ void led_control_reset(struct led_control *led_ctrl);
+
+ int led_prox_init(struct led_control *led_ctrl, char lpm);
+
+ int led_daq_init(struct led_control *led_ctrl, char lpm);
+
+ void led_control_init(struct led_control *led_ctrl);
};
#endif /* _MAX8614X_H_ */