initial commit, reads dev id

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_ */