ME11B Sample Code in Maxim Integrated Team

Dependencies:   BMI160 max32630hsp3 MemoryLCD USBDevice

Fork of Host_Software_MAX32664GWEB_HR_EXTENDED by Seyhmus Cacina

SHMAX8614X/SH_Max8614x_BareMetal.h

Committer:
seyhmuscacina
Date:
2019-03-25
Revision:
3:b8989dab0f88
Parent:
0:ac4dea3e2894

File content as of revision 3:b8989dab0f88:

/*******************************************************************************
 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
 *
 * 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 MAXIM INTEGRATED 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.
 *
 * Except as contained in this notice, the name of Maxim Integrated
 * Products, Inc. shall not be used except as stated in the Maxim Integrated
 * Products, Inc. Branding Policy.
 *
 * The mere transfer of this software does not imply any licenses
 * of trade secrets, proprietary technology, copyrights, patents,
 * trademarks, maskwork rights, or any other form of intellectual
 * property whatsoever. Maxim Integrated Products, Inc. retains all
 * ownership rights.
 *******************************************************************************
 */
#ifndef SH_Max8614x_BareMetal_H_
#define SH_Max8614x_BareMetal_H_

#include <stdint.h>
#include <stdio.h>
#include "demoDefinitions.h"


#define COMM_SUCCESS        0
#define COMM_GENERAL_ERROR  -1
#define COMM_INVALID_PARAM  -254
#define COMM_NOT_RECOGNIZED -255

enum enAlgoMode{
	kAlgoModeHeartRate = 0,
	reinitHeartRate    = 1,
};

/**
 * @brief	Get the value of register at addr
 *
 * @param[in]	addr - adress of the register
 * @param[out]	val - value at the register

 */
void SH_Max8614x_get_reg(uint8_t addr, uint32_t *val);

/**
* @brief	Write a value to the register at address addr
*
* @param[in]	addr - adress of the register to write
* @param[in]	val - value of the register to write
*/
void SH_Max8614x_set_reg(uint8_t addr, uint32_t val);

/**
* @brief	Initialize Max86140 with default configuration
*
* @param[in] paramAlgoMode - the mode of the algorithm to initialize
*
* @return 0 on SUCCESS
*/
int SH_Max8614x_default_init(enum enAlgoMode paramAlgoMode);

/**
* @brief	Check the data stored in the Sensor Hub. Reads and prints
* 			the data if available
*
*/
int SH_Max8614x_data_report_execute(void);

/**
* @brief	Stops the active sensors and algorithms
*
*/
void SH_Max8614x_stop(void);


extern uint16_t HrmResult;
extern uint8_t  HrmConfidence;


/* define to see debug messages*/
//#define DEBUG_INFO

/**
* @brief	gets the data format of reported whrm algo result sample , in form of struct fields with number of bits they are represented.
*
* @param[in] null_arg : NULL string, just to match the form of command table function pointer type
*
* @return 0
*/
int SH_Max8614x_get_whrm_dataformat(const char *null_arg);


/**
* @brief	sets the register value of ppg sensor (8614x is connected to ME11 SENSOR HUB for this demo but can be used for all sensors physically
*           connected to ME11 SENSOR HUB).
*
* @param[in] addr_value_args : byte string including command followed by register address in hex and register value in hex
*                              "set_reg ppgsensor 0xAB 0xCD" or "set_reg ppgsensor AB CD"
*
* @return 0x00 on success and prints on command console
*/
int SH_Max8614x_set_ppgreg(const char *addr_value_args);

/**
* @brief	gets the register value of ppg sensor (8614x is connected to ME11 SENSOR HUB for this demo but can be used for all sensors physically
*           connected to ME11 SENSOR HUB).
*
* @param[in] addr_arg: byte string including command followed by register address in hex
*                      "set_reg ppgsensor 0xAB" or "set_reg ppgsensor AB"
*
* @return 0x00 on success and prints register value on command console
*/
int SH_Max8614x_get_ppgreg(const char *addr_arg);

/**
* @brief	  initalizes and starts whrm measurement from ME11 SENSOR HUB.
*             It default initilizes datatype(to BOTH) input fifo lenght(to 5 , this is FIFO used by accel data from host)
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
** @return 0x00 on success and prints status on command console
*/
int SH_Max8614x_measure_whrm(const char *null_arg);


/**
* @brief	  starts self test of ppg sensor
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
** @return 0x00 on success and prints status on command console
*/
int SH_Max8614x_self_test_ppg(const char *null_arg);

/**
* @brief	  starts self test of accelerometer sensor physically connected to ME11 SENSOR HUB
*             NOTE:Not supported within this demo as Customer is assumed to feed accel data from HOST.
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
** @return 0x00 on success and prints status on command console
*/
int SH_Max8614x_self_test_acc(const char *null_arg);

/**
* @brief	  sets the aec algo usage of SPO2 algorithm
*
* @param[in]  onoff_arg : byte string including command followed by mode value in HEX uo to 1 hexadecimal digits.
*                         "set_cfg whrm aecenable 0/1"  0:off 1: On
*
*@return  status info, 0x00 on success
*
**/
int SH_Max8614x_set_whrm_aecusage(const char *onoff_arg);

/**
* @brief	  gets the aec algo usage of SPO2 algorithm
*             prints aec algo usage usage on/off value commnad console. 0 : Off 1: On
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
* @return status info, 0x00 on success.
**/
int SH_Max8614x_get_whrm_aecusage(const char *null_arg);

/**
* @brief	  sets the skin contact detection usage of SPO2 algorithm
*
* @param[in]  onoff_arg : byte string including command followed by mode value in HEX uo to 1 hexadecimal digits.
*                         "set_cfg whrm aecenable 0/1"  0:off 1: On
*
*@return  status info, 0x00 on success
*
**/
int SH_Max8614x_set_whrm_scdusage(const char *onoff_arg);

/**
* @brief	  gets the skin contact detection usage  of SPO2 algorithm
*             prints skin contact detection usage on/off value commnad console. 0 : Off 1: On
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
* @return status info, 0x00 on success.
**/
int SH_Max8614x_get_whrm_scdusage(const char *null_arg);

/**
* @brief	  sets the adjustment period parameter for skin contact detection for SPO2 algorithm.
*
* @param[in]  period_arg : byte string including command followed by period value in HEX up to 4 hexadecimal digits.
*                          "set_cfg whrm scdadjperiod 0xABCD"
*
* @return status info, 0x00 on success.
**/
int SH_Max8614x_set_whrm_scdadjperiod(const char *period_arg);

/**
* @brief	  Gets the adjustment period parameter for skin contact detection for SPO2 algorithm.
*             prints SPo2 period value on command console
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
* @return status info, 0x00 on success.
*
**/
int SH_Max8614x_get_whrm_scdadjperiod(const char *null_arg);

/**
* @brief	  sets the  debounce window parameter for skin contact detection for SPO2 algorithm.
*
* @param[in]  dwindow_arg : byte string including command followed by debounce window value in HEX up to 4 hexadecimal digits.
*                          "set_cfg whrm scddebouncewin 0xABCD"
*
* @return status info, 0x00 on success.
**/
int SH_Max8614x_set_whrm_scddebouncewin(const char *dwindow_arg);

/**
* @brief	  gets the  debounce window parameter for skin contact detection for SPO2 algorithm.
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
* @return status info, 0x00 on success.
**/
int SH_Max8614x_get_whrm_scddebouncewin(const char *null_arg);


/**
* @brief	  sets the motion threshold parameter for WHRM algorithm.
*
* @param[in]  timeout_arg : byte string including command followed by motion threshold value in HEX up to 4 hexadecimal digits.
*                           "set_cfg whrm motionthreshold 0xABCD"
*
* @return status info, 0x00 on success.
*
**/
int SH_Max8614x_set_whrm_motionthresh(const char *motion_arg);

/**
* @brief	  Gets the motion threshold for WHRM algorithm. prints WHRM algorith motion threshold value on command console
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
* @return status info, 0x00 on success.
*
**/
int SH_Max8614x_get_whrm_motionthresh(const char *null_arg);

/**
* @brief	  sets the minimum photodiode current parameter for WHRM algorithm.
*
* @param[in]  curr_arg : byte string including command followed by diode current value in HEX up to 4 hexadecimal digits.
*                           "set_cfg whrm motionthreshold 0xABCD"
*
* @return status info, 0x00 on success.
*
**/
int SH_Max8614x_set_whrm_minpdiodecurr(const char *curr_arg);

/**
* @brief	  Gets the minimum photodiode current parameter for WHRM algorithm. prints WHRM algorithm photodiode current parameter value on command console
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
* @return status info, 0x00 on success.
*
**/
int SH_Max8614x_get_whrm_minpdiodecurr(const char *null_arg);

/**
* @brief	  sets the sensor photodiode configuration for WHRM algorithm.
*
* @param[in]  pdcfg_arg : byte string including command followed by photodiode configuration value in HEX up to 1 hexadecimal digits.
                          "set_cfg whrm pdconfig 0xA" or "set_cfg whrm pdconfig A"
*
* @return status info, 0x00 on success.
**/
int SH_Max8614x_set_whrm_pdiodeconfig(const char *cfg_arg);

/**
* @brief	  Gets the sensor photodiode configuration for WHRM algorithm. prints WHRM algorithm photodiode configuration  on command console
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
* @return status info, 0x00 on success.
*
**/
int SH_Max8614x_get_whrm_pdiodeconfig(const char *null_arg);

/**
* @brief	  Sends raw byte stream to ME11 SENSOR HUB. For debug purposes mainly.
*
* @param[in]  raw_data : byte stream to be send
*
* @return status info, 0x00 on success.
*
**/
//int SH_Max8614x_send_raw(const char *raw_data);



/**
* @brief	  Stops sensor+algorithm data acquisition and operation for all algorithms of ME11 sensor HUB .
*             Mainly for use in this demo code!!
*
* @param[in]  null_arg : NULL string, just to match the form of command table function pointer type
*
* @return status info, 0x00 on success.
*
**/
int SH_Max8614x_stop_acquisition(const char *null_arg);


#if defined(RAW_DATA_ONLY)
	int SH_Max8614x_disable_whrm(const char *onoff_arg);
	int SH_Max8614x_enable_pureraw(const char *onoff_arg);
    #define NUMCMDS8614X (24)
#else
	#define NUMCMDS8614X (22)
#endif

/*Number of commands accosicated with 8614x sesnor command table*/

#define CONSOLE_STR_BUF_SZ  ((int)1024);


typedef int (*cmdExecFunc)( const char*); // typedef void (*cmdExecFunc)( const void*);

typedef struct {
	char const* cmdStr;
	cmdExecFunc execute;
	char const *help;
}cmd_interface_t;


static int command_help(const char *str);


const cmd_interface_t CMDTABLE8614x[] = {

		{  "get_format whrmdata"     		, SH_Max8614x_get_whrm_dataformat		,  "returns whrm algo sample format in terms of bit fileds"												},
		{  "enable_measurement whrm" 		, SH_Max8614x_measure_whrm 				,  "start whrm measurement with default settings"  														},
		{  "get_reg ppgsensor"       		, SH_Max8614x_get_ppgreg 				,  "get register value of 8614x sensor, usage:  get_reg ppgsensor rAddr(1byte)" 						},
		{  "set_reg ppgsensor"       		, SH_Max8614x_set_ppgreg 				,  "set register value of 8614x sensor, usage :  set_reg ppgsensor rAddr(1byte) rval(1byte)" 			},
		{  "self_test ppgsensor"     		, SH_Max8614x_self_test_ppg 			,  "starts self test of onboard ppg sensor" 															},
		{  "self_test accel"         		, SH_Max8614x_self_test_acc 			,  "starts self test of onboard accel sensor" 															},
		{  "set_cfg whrm aecenable"         , SH_Max8614x_set_whrm_aecusage       	,  "on/off whrm aec algo,  usage: set_cfg whrm aec X , X: 0 off 1 on" 									},
		{  "get_cfg whrm aecenable"         , SH_Max8614x_get_whrm_aecusage       	,  "check if aec algo for whrm is on/off" 																},
        {  "set_cfg whrm scdenable"         , SH_Max8614x_set_whrm_scdusage      	,  "on/off whrm skin contact detection,  usage: set_cfg whrm scd X , X: 0 off 1 on" 					},
		{  "get_cfg whrm scdenable"         , SH_Max8614x_get_whrm_scdusage       	,  "check if whrm skin contact detection is on/off" 													},
        {  "set_cfg whrm scdadjperiod"      , SH_Max8614x_set_whrm_scdadjperiod     ,  "sets photo diode adj peroiod for whrm scd algo, usage:  set_cfg whrm scdadjperiod period(numeric)" 	},
		{  "get_cfg whrm scdadjperiod"      , SH_Max8614x_get_whrm_scdadjperiod     ,  "gets photo diode adj peroiod for whrm scd algo" 													},
		{  "set_cfg whrm scddebouncewin"    , SH_Max8614x_set_whrm_scddebouncewin   ,  "sets debounce window for whrm scd algo, usage:  set_cfg whrm scddebouncewin window(numeric)" 		},
		{  "get_cfg whrm scddebouncewin"    , SH_Max8614x_get_whrm_scddebouncewin   ,  "gets debounce window for whrm scd algo" 															},
		{  "set_cfg whrm motionthreshold"   , SH_Max8614x_set_whrm_motionthresh 	,  "sets motion threshold for whrm, usage:  set_cfg whrm motionthreshold threshold(numeric)" 			},
		{  "get_cfg whrm motionthreshold"  	, SH_Max8614x_get_whrm_motionthresh 	,  "gets motion threshold for whrm" 																	},
		{  "set_cfg whrm minpdcurrent"      , SH_Max8614x_set_whrm_minpdiodecurr 	,  "sets photodiode current range for whrm, usage:  set_cfg whrm minpdcurrent current(numeric)" 		},
		{  "get_cfg whrm minpdcurrent"  	, SH_Max8614x_get_whrm_minpdiodecurr 	,  "gets photodiode current rangefor whrm" 																},
        {  "set_cfg whrm pdconfig"          , SH_Max8614x_set_whrm_pdiodeconfig 	,  "sets photdiode config for whrm, usage:  set_cfg whrmaecscd pdconfig configstring" 					},
		{  "get_cfg whrm pdconfig"          , SH_Max8614x_get_whrm_pdiodeconfig 	,  "gets photdiode config for whrm" 																	},
		{  "stop"                           , SH_Max8614x_stop_acquisition          ,  "stops raw&algorithm data acquisition within 8614x instance of hub"                            		},
		{  "help"                           , command_help          		        ,  "commnand info" 																						},
#if defined(RAW_DATA_ONLY)
		{  "disable_whrm"                  , SH_Max8614x_disable_whrm               ,  "disable algorithms" 																				},
		{  "enable_raw_only"               , SH_Max8614x_enable_pureraw             ,  "enable just raw ppg data" 																				},
#endif
		//		{  "send_raw"                       , SH_Max8614x_send_raw 					,  "sends raw data to sensor hub, usage: send_raw datastring" 									},
};


static int command_help(const char *str){
	int cmdIdx = 0;

	SERIALOUT("AVAILABLE COMMANDS: \r\n\r\n");
	while( cmdIdx != NUMCMDS8614X){
		SERIALOUT(" %s : \r\n  %s \r\n\r\n", CMDTABLE8614x[cmdIdx].cmdStr , CMDTABLE8614x[cmdIdx].help );
        cmdIdx++;
	};

}


#endif