Program Listing for File sh2.h
↰ Return to documentation for file (include/sh2/sh2.h)
/*
* Copyright 2015-2018 Hillcrest Laboratories, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License and
* any applicable agreements you may have with Hillcrest Laboratories, Inc.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef SH2_H
#define SH2_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
#include "sh2_hal.h"
/***************************************************************************************
* Public type definitions
***************************************************************************************/
#define SH2_MAX_SENSOR_EVENT_LEN (16)
typedef struct sh2_SensorEvent {
uint64_t timestamp_uS;
uint8_t len;
uint8_t reportId;
uint8_t report[SH2_MAX_SENSOR_EVENT_LEN];
} sh2_SensorEvent_t;
typedef void (sh2_SensorCallback_t)(void * cookie, sh2_SensorEvent_t *pEvent);
typedef struct sh2_ProductId_s {
uint8_t resetCause;
uint8_t swVersionMajor;
uint8_t swVersionMinor;
uint32_t swPartNumber;
uint32_t swBuildNumber;
uint16_t swVersionPatch;
uint8_t reserved0;
uint8_t reserved1;
} sh2_ProductId_t;
#define SH2_MAX_PROD_ID_ENTRIES (5)
typedef struct sh2_ProductIds_s {
sh2_ProductId_t entry[SH2_MAX_PROD_ID_ENTRIES];
uint8_t numEntries;
} sh2_ProductIds_t;
enum sh2_SensorId_e {
SH2_RAW_ACCELEROMETER = 0x14,
SH2_ACCELEROMETER = 0x01,
SH2_LINEAR_ACCELERATION = 0x04,
SH2_GRAVITY = 0x06,
SH2_RAW_GYROSCOPE = 0x15,
SH2_GYROSCOPE_CALIBRATED = 0x02,
SH2_GYROSCOPE_UNCALIBRATED = 0x07,
SH2_RAW_MAGNETOMETER = 0x16,
SH2_MAGNETIC_FIELD_CALIBRATED = 0x03,
SH2_MAGNETIC_FIELD_UNCALIBRATED = 0x0f,
SH2_ROTATION_VECTOR = 0x05,
SH2_GAME_ROTATION_VECTOR = 0x08,
SH2_GEOMAGNETIC_ROTATION_VECTOR = 0x09,
SH2_PRESSURE = 0x0a,
SH2_AMBIENT_LIGHT = 0x0b,
SH2_HUMIDITY = 0x0c,
SH2_PROXIMITY = 0x0d,
SH2_TEMPERATURE = 0x0e,
SH2_RESERVED = 0x17,
SH2_TAP_DETECTOR = 0x10,
SH2_STEP_DETECTOR = 0x18,
SH2_STEP_COUNTER = 0x11,
SH2_SIGNIFICANT_MOTION = 0x12,
SH2_STABILITY_CLASSIFIER = 0x13,
SH2_SHAKE_DETECTOR = 0x19,
SH2_FLIP_DETECTOR = 0x1a,
SH2_PICKUP_DETECTOR = 0x1b,
SH2_STABILITY_DETECTOR = 0x1c,
SH2_PERSONAL_ACTIVITY_CLASSIFIER = 0x1e,
SH2_SLEEP_DETECTOR = 0x1f,
SH2_TILT_DETECTOR = 0x20,
SH2_POCKET_DETECTOR = 0x21,
SH2_CIRCLE_DETECTOR = 0x22,
SH2_HEART_RATE_MONITOR = 0x23,
SH2_ARVR_STABILIZED_RV = 0x28,
SH2_ARVR_STABILIZED_GRV = 0x29,
SH2_GYRO_INTEGRATED_RV = 0x2A,
SH2_IZRO_MOTION_REQUEST = 0x2B,
// UPDATE to reflect greatest sensor id
SH2_MAX_SENSOR_ID = 0x2B,
};
typedef uint8_t sh2_SensorId_t;
typedef struct sh2_SensorConfig {
/* Change sensitivity enabled */
bool changeSensitivityEnabled;
/* Change sensitivity - true if relative; false if absolute */
bool changeSensitivityRelative;
/* Wake-up enabled */
bool wakeupEnabled;
/* Always on enabled */
bool alwaysOnEnabled;
/* 16-bit signed fixed point integer representing the value a
* sensor output must exceed in order to trigger another input
* report. A setting of 0 causes all reports to be sent.
*/
uint16_t changeSensitivity;
/* Interval in microseconds between asynchronous input reports. */
uint32_t reportInterval_us;
/* Reserved field, not used. */
uint32_t batchInterval_us;
/* Meaning is sensor specific */
uint32_t sensorSpecific;
} sh2_SensorConfig_t;
typedef struct sh2_SensorMetadata {
uint8_t meVersion;
uint8_t mhVersion;
uint8_t shVersion;
uint32_t range;
uint32_t resolution;
uint16_t revision;
uint16_t power_mA;
uint32_t minPeriod_uS;
uint32_t maxPeriod_uS;
uint32_t fifoReserved;
uint32_t fifoMax;
uint32_t batchBufferBytes;
uint16_t qPoint1;
uint16_t qPoint2;
uint16_t qPoint3;
uint32_t vendorIdLen;
char vendorId[48];
uint32_t sensorSpecificLen;
uint8_t sensorSpecific[48];
} sh2_SensorMetadata_t;
typedef struct sh2_ErrorRecord {
uint8_t severity;
uint8_t sequence;
uint8_t source;
uint8_t error;
uint8_t module;
uint8_t code;
} sh2_ErrorRecord_t;
typedef struct sh2_Counts {
uint32_t offered;
uint32_t accepted;
uint32_t on;
uint32_t attempted;
} sh2_Counts_t;
typedef enum sh2_TareBasis {
SH2_TARE_BASIS_ROTATION_VECTOR = 0,
SH2_TARE_BASIS_GAMING_ROTATION_VECTOR = 1,
SH2_TARE_BASIS_GEOMAGNETIC_ROTATION_VECTOR = 2,
} sh2_TareBasis_t;
typedef enum sh2_TareAxis {
SH2_TARE_X = 1,
SH2_TARE_Y = 2,
SH2_TARE_Z = 4,
} sh2_TareAxis_t;
typedef struct sh2_Quaternion {
double x;
double y;
double z;
double w;
} sh2_Quaternion_t;
typedef enum {
SH2_OSC_INTERNAL = 0,
SH2_OSC_EXT_CRYSTAL = 1,
SH2_OSC_EXT_CLOCK = 2,
} sh2_OscType_t;
typedef enum {
SH2_CAL_SUCCESS = 0,
SH2_CAL_NO_ZRO,
SH2_CAL_NO_STATIONARY_DETECTION,
SH2_CAL_ROTATION_OUTSIDE_SPEC,
SH2_CAL_ZRO_OUTSIDE_SPEC,
SH2_CAL_ZGO_OUTSIDE_SPEC,
SH2_CAL_GYRO_GAIN_OUTSIDE_SPEC,
SH2_CAL_GYRO_PERIOD_OUTSIDE_SPEC,
SH2_CAL_GYRO_DROPS_OUTSIDE_SPEC,
} sh2_CalStatus_t;
// FRS Record Ids
#define STATIC_CALIBRATION_AGM (0x7979)
#define NOMINAL_CALIBRATION (0x4D4D)
#define STATIC_CALIBRATION_SRA (0x8A8A)
#define NOMINAL_CALIBRATION_SRA (0x4E4E)
#define DYNAMIC_CALIBRATION (0x1F1F)
#define ME_POWER_MGMT (0xD3E2)
#define SYSTEM_ORIENTATION (0x2D3E)
#define ACCEL_ORIENTATION (0x2D41)
#define SCREEN_ACCEL_ORIENTATION (0x2D43)
#define GYROSCOPE_ORIENTATION (0x2D46)
#define MAGNETOMETER_ORIENTATION (0x2D4C)
#define ARVR_STABILIZATION_RV (0x3E2D)
#define ARVR_STABILIZATION_GRV (0x3E2E)
#define TAP_DETECT_CONFIG (0xC269)
#define SIG_MOTION_DETECT_CONFIG (0xC274)
#define SHAKE_DETECT_CONFIG (0x7D7D)
#define MAX_FUSION_PERIOD (0xD7D7)
#define SERIAL_NUMBER (0x4B4B)
#define ES_PRESSURE_CAL (0x39AF)
#define ES_TEMPERATURE_CAL (0x4D20)
#define ES_HUMIDITY_CAL (0x1AC9)
#define ES_AMBIENT_LIGHT_CAL (0x39B1)
#define ES_PROXIMITY_CAL (0x4DA2)
#define ALS_CAL (0xD401)
#define PROXIMITY_SENSOR_CAL (0xD402)
#define PICKUP_DETECTOR_CONFIG (0x1B2A)
#define FLIP_DETECTOR_CONFIG (0xFC94)
#define STABILITY_DETECTOR_CONFIG (0xED85)
#define ACTIVITY_TRACKER_CONFIG (0xED88)
#define SLEEP_DETECTOR_CONFIG (0xED87)
#define TILT_DETECTOR_CONFIG (0xED89)
#define POCKET_DETECTOR_CONFIG (0xEF27)
#define CIRCLE_DETECTOR_CONFIG (0xEE51)
#define USER_RECORD (0x74B4)
#define ME_TIME_SOURCE_SELECT (0xD403)
#define UART_FORMAT (0xA1A1)
#define GYRO_INTEGRATED_RV_CONFIG (0xA1A2)
#define FRS_ID_META_RAW_ACCELEROMETER (0xE301)
#define FRS_ID_META_ACCELEROMETER (0xE302)
#define FRS_ID_META_LINEAR_ACCELERATION (0xE303)
#define FRS_ID_META_GRAVITY (0xE304)
#define FRS_ID_META_RAW_GYROSCOPE (0xE305)
#define FRS_ID_META_GYROSCOPE_CALIBRATED (0xE306)
#define FRS_ID_META_GYROSCOPE_UNCALIBRATED (0xE307)
#define FRS_ID_META_RAW_MAGNETOMETER (0xE308)
#define FRS_ID_META_MAGNETIC_FIELD_CALIBRATED (0xE309)
#define FRS_ID_META_MAGNETIC_FIELD_UNCALIBRATED (0xE30A)
#define FRS_ID_META_ROTATION_VECTOR (0xE30B)
#define FRS_ID_META_GAME_ROTATION_VECTOR (0xE30C)
#define FRS_ID_META_GEOMAGNETIC_ROTATION_VECTOR (0xE30D)
#define FRS_ID_META_PRESSURE (0xE30E)
#define FRS_ID_META_AMBIENT_LIGHT (0xE30F)
#define FRS_ID_META_HUMIDITY (0xE310)
#define FRS_ID_META_PROXIMITY (0xE311)
#define FRS_ID_META_TEMPERATURE (0xE312)
#define FRS_ID_META_TAP_DETECTOR (0xE313)
#define FRS_ID_META_STEP_DETECTOR (0xE314)
#define FRS_ID_META_STEP_COUNTER (0xE315)
#define FRS_ID_META_SIGNIFICANT_MOTION (0xE316)
#define FRS_ID_META_STABILITY_CLASSIFIER (0xE317)
#define FRS_ID_META_SHAKE_DETECTOR (0xE318)
#define FRS_ID_META_FLIP_DETECTOR (0xE319)
#define FRS_ID_META_PICKUP_DETECTOR (0xE31A)
#define FRS_ID_META_STABILITY_DETECTOR (0xE31B)
#define FRS_ID_META_PERSONAL_ACTIVITY_CLASSIFIER (0xE31C)
#define FRS_ID_META_SLEEP_DETECTOR (0xE31D)
#define FRS_ID_META_TILT_DETECTOR (0xE31E)
#define FRS_ID_META_POCKET_DETECTOR (0xE31F)
#define FRS_ID_META_CIRCLE_DETECTOR (0xE320)
#define FRS_ID_META_HEART_RATE_MONITOR (0xE321)
#define FRS_ID_META_ARVR_STABILIZED_RV (0xE322)
#define FRS_ID_META_ARVR_STABILIZED_GRV (0xE323)
#define FRS_ID_META_GYRO_INTEGRATED_RV (0xE324)
typedef enum {
SH2_IZRO_MI_UNKNOWN = 0,
SH2_IZRO_MI_STATIONARY_NO_VIBRATION,
SH2_IZRO_MI_STATIONARY_WITH_VIBRATION,
SH2_IZRO_MI_IN_MOTION,
} sh2_IZroMotionIntent_t;
typedef enum {
SH2_IZRO_MR_NO_REQUEST = 0,
SH2_IZRO_MR_STAY_STATIONARY,
SH2_IZRO_MR_STATIONARY_NON_URGENT,
SH2_IZRO_MR_STATIONARY_URGENT,
} sh2_IZroMotionRequest_t;
enum sh2_AsyncEventId_e {
SH2_RESET,
SH2_SHTP_EVENT,
SH2_GET_FEATURE_RESP,
};
typedef enum sh2_AsyncEventId_e sh2_AsyncEventId_t;
enum sh2_ShtpEvent_e {
SH2_SHTP_TX_DISCARD = 0,
SH2_SHTP_SHORT_FRAGMENT = 1,
SH2_SHTP_TOO_LARGE_PAYLOADS = 2,
SH2_SHTP_BAD_RX_CHAN = 3,
SH2_SHTP_BAD_TX_CHAN = 4,
};
typedef uint8_t sh2_ShtpEvent_t;
typedef struct sh2_SensorConfigResp_e {
sh2_SensorId_t sensorId;
sh2_SensorConfig_t sensorConfig;
} sh2_SensorConfigResp_t;
typedef struct sh2_AsyncEvent {
uint32_t eventId;
union {
sh2_ShtpEvent_t shtpEvent;
sh2_SensorConfigResp_t sh2SensorConfigResp;
};
} sh2_AsyncEvent_t;
typedef void (sh2_EventCallback_t)(void * cookie, sh2_AsyncEvent_t *pEvent);
/***************************************************************************************
* Public API
**************************************************************************************/
int sh2_open(sh2_Hal_t *pHal,
sh2_EventCallback_t *eventCallback, void *eventCookie);
void sh2_close(void);
void sh2_service(void);
int sh2_setSensorCallback(sh2_SensorCallback_t *callback, void *cookie);
int sh2_devReset(void);
int sh2_devOn(void);
int sh2_devSleep(void);
int sh2_getProdIds(sh2_ProductIds_t *prodIds);
int sh2_getSensorConfig(sh2_SensorId_t sensorId, sh2_SensorConfig_t *config);
int sh2_setSensorConfig(sh2_SensorId_t sensorId, const sh2_SensorConfig_t *pConfig);
int sh2_getMetadata(sh2_SensorId_t sensorId, sh2_SensorMetadata_t *pData);
int sh2_getFrs(uint16_t recordId, uint32_t *pData, uint16_t *words);
int sh2_setFrs(uint16_t recordId, uint32_t *pData, uint16_t words);
int sh2_getErrors(uint8_t severity, sh2_ErrorRecord_t *pErrors, uint16_t *numErrors);
int sh2_getCounts(sh2_SensorId_t sensorId, sh2_Counts_t *pCounts);
int sh2_clearCounts(sh2_SensorId_t sensorId);
int sh2_setTareNow(uint8_t axes, // SH2_TARE_X | SH2_TARE_Y | SH2_TARE_Z
sh2_TareBasis_t basis);
int sh2_clearTare(void);
int sh2_persistTare(void);
int sh2_setReorientation(sh2_Quaternion_t *orientation);
int sh2_reinitialize(void);
int sh2_saveDcdNow(void);
int sh2_getOscType(sh2_OscType_t *pOscType);
// Flags for sensors field of sh_calConfig
#define SH2_CAL_ACCEL (0x01)
#define SH2_CAL_GYRO (0x02)
#define SH2_CAL_MAG (0x04)
#define SH2_CAL_PLANAR (0x08)
int sh2_setCalConfig(uint8_t sensors);
int sh2_getCalConfig(uint8_t *pSensors);
int sh2_setDcdAutoSave(bool enabled);
int sh2_flush(sh2_SensorId_t sensorId);
int sh2_clearDcdAndReset(void);
int sh2_startCal(uint32_t interval_us);
int sh2_finishCal(sh2_CalStatus_t *status);
int sh2_setIZro(sh2_IZroMotionIntent_t intent);
#ifdef __cplusplus
} // extern "C"
#endif
#endif