#ifndef _GLP_COMMON_H_ #define _GLP_COMMON_H_ /** **************************************************************************************** * @addtogroup GLP Glucose Profile * @ingroup PROFILE * @brief Glucose Profile * * The GLP module is the responsible block for implementing the Glucose Profile * functionalities in the BLE Host. * * The Glucose Profile defines the functionality required in a device that allows * the user (Collector device) to configure and recover Glucose measurements from * a Glucose device. ***************************************************************************************** */ /* * INCLUDE FILES **************************************************************************************** */ #include "prf_types.h" #include /* * DEFINES **************************************************************************************** */ /// Glucose measurement packet max length #define GLP_MEAS_MAX_LEN (17) /// Glucose measurement context packet max length #define GLP_MEAS_CTX_MAX_LEN (17) /// Record Access Control Point packet max length #define GLP_REC_ACCESS_CTRL_MAX_LEN (21) /// Glucose Service Error Code enum glp_error_code { /// RACP Procedure already in progress GLP_ERR_PROC_ALREADY_IN_PROGRESS = (0x80), /// Client Characteristic Configuration Descriptor Improperly Configured GLP_ERR_IMPROPER_CLI_CHAR_CFG = (0x81), }; /// Glucose Measurement Flags field bit values enum glp_meas_flag { /// Time Offset Present Bit /// Time Offset Present GLP_MEAS_TIME_OFF_PRES = (1 << 0), /// Time Offset Not Present GLP_MEAS_TIME_OFF_NOT_PRES = (0 << 0), /// Glucose Concentration, Type and Sample Location Present Bit /// Glucose Concentration, Type and Sample Location Present GLP_MEAS_GL_CTR_TYPE_AND_SPL_LOC_PRES = (1 << 1), /// Glucose Concentration, Type and Sample Location Not Present GLP_MEAS_GL_CTR_TYPE_AND_SPL_LOC_NOT_PRES = (0 << 1), /// Glucose Concentration Units (kg/L, mol/L) GLP_MEAS_GL_CTR_UNITS_KG_L = (0 << 2), GLP_MEAS_GL_CTR_UNITS_MOL_L = (1 << 2), /// Sensor Status Annunciation Present Bit /// Sensor Status Annunciation Present GLP_MEAS_SENS_STAT_ANNUN_PRES = (1 << 3), /// Sensor Status Annunciation Not Present GLP_MEAS_SENS_STAT_ANNUN_NOT_PRES = (0 << 3), /// Context Information Follow Bit /// Context Information Follows GLP_MEAS_CTX_INF_FOLW = (1 << 4), /// Context Information Not Follows GLP_MEAS_CTX_INF_NOT_FOLW = (0 << 4), }; /// Glucose Measurement Context Flags field bit values enum glp_meas_ctx_flag { /// Carbohydrate ID And Carbohydrate Present Bit /// Carbohydrate ID And Carbohydrate Present GLP_CTX_CRBH_ID_AND_CRBH_PRES = (1 << 0), /// Carbohydrate ID And Carbohydrate Not Present GLP_CTX_CRBH_ID_AND_CRBH_NOT_PRES = (0 << 0), /// Meal Present Bit /// Meal Present GLP_CTX_MEAL_PRES = (1 << 1), /// Meal Not Present GLP_CTX_MEAL_NOT_PRES = (0 << 1), /// Tester-Health Present Bit /// Tester-Health Present GLP_CTX_TESTER_HEALTH_PRES = (1 << 2), /// Tester-Health Not Present GLP_CTX_TESTER_HEALTH_NOT_PRES = (0 << 2), /// Exercise Duration And Exercise Intensity Present Bit /// Exercise Duration And Exercise Intensity Present GLP_CTX_EXE_DUR_AND_EXE_INTENS_PRES = (1 << 3), /// Exercise Duration And Exercise Intensity Not Present GLP_CTX_EXE_DUR_AND_EXE_INTENS_NOT_PRES = (0 << 3), /// Medication ID And Medication Present Bit /// Medication ID And Medication Present GLP_CTX_MEDIC_ID_AND_MEDIC_PRES = (1 << 4), /// Medication ID And Medication Not Present GLP_CTX_MEDIC_ID_AND_MEDIC_NOT_PRES = (0 << 4), /// Medication Value Units (kilograms, liters) GLP_CTX_MEDIC_VAL_UNITS_KG = (0 << 5), GLP_CTX_MEDIC_VAL_UNITS_L = (1 << 5), /// HbA1c Present Bit /// HbA1c Present GLP_CTX_HBA1C_PRES = (1 << 6), /// HbA1c Not Present GLP_CTX_HBA1C_NOT_PRES = (0 << 6), /// Extended Flags Present Bit /// Extended Flags Present GLP_CTX_EXTD_F_PRES = (1 << 7), /// Extended Flags Not Present GLP_CTX_EXTD_F_NOT_PRES = (0 << 7), }; /// Glucose Service Feature Flags field bit values enum glp_srv_feature_flag { /// Low Battery Detection During Measurement Support Bit /// Low Battery Detection During Measurement Supported GLP_FET_LOW_BAT_DET_DUR_MEAS_SUPP = (1 << 0), /// Low Battery Detection During Measurement Not Supported GLP_FET_LOW_BAT_DET_DUR_MEAS_NOT_SUPP = (0 << 0), /// Sensor Malfunction Detection Support Bit /// Sensor Malfunction Detection Supported GLP_FET_SENS_MFNC_DET_SUPP = (1 << 1), /// Sensor Malfunction Detection Not Supported GLP_FET_SENS_MFNC_DET_NOT_SUPP = (0 << 1), /// Sensor Sample Size Support Bit /// Sensor Sample Size Supported GLP_FET_SENS_SPL_SIZE_SUPP = (1 << 2), /// Sensor Sample Size Not Supported GLP_FET_SENS_SPL_SIZE_NOT_SUPP = (0 << 2), /// Sensor Strip Insertion Error Detection Support Bit /// Sensor Strip Insertion Error Detection Supported GLP_FET_SENS_STRIP_INSERT_ERR_DET_SUPP = (1 << 3), /// Sensor Strip Insertion Error Detection Not Supported GLP_FET_SENS_STRIP_INSERT_ERR_DET_NOT_SUPP = (0 << 3), /// Sensor Strip Type Error Detection Support Bit /// Sensor Strip Type Error Detection Supported GLP_FET_SENS_STRIP_TYPE_ERR_DET_SUPP = (1 << 4), /// Sensor Strip Type Error Detection Not Supported GLP_FET_SENS_STRIP_TYPE_ERR_DET_NOT_SUPP = (0 << 4), /// Sensor Result High-Low Detection Support Bit /// Sensor Result High-Low Detection Supported GLP_FET_SENS_RES_HIGH_LOW_DET_SUPP = (1 << 5), /// Sensor Result High-Low Detection Not Supported GLP_FET_SENS_RES_HIGH_LOW_DET_NOT_SUPP = (0 << 5), /// Sensor Temperature High-Low Detection Support Bit /// Sensor Temperature High-Low Detection Supported GLP_FET_SENS_TEMP_HIGH_LOW_DET_SUPP = (1 << 6), /// Sensor Temperature High-Low Detection Not Supported GLP_FET_SENS_TEMP_HIGH_LOW_DET_NOT_SUPP = (0 << 6), /// Sensor Read Interrupt Detection Support Bit /// Sensor Read Interrupt Detection Supported GLP_FET_SENS_RD_INT_DET_SUPP = (1 << 7), /// Sensor Read Interrupt Detection Not Supported GLP_FET_SENS_RD_INT_DET_NOT_SUPP = (0 << 7), /// General Device Fault Support Bit /// General Device Fault Supported GLP_FET_GEN_DEV_FLT_SUPP = (1 << 8), /// General Device Fault Not Supported GLP_FET_GEN_DEV_FLT_NOT_SUPP = (0 << 8), /// Time Fault Support Bit /// Time Fault Supported GLP_FET_TIME_FLT_SUPP = (1 << 9), /// Time Fault Not Supported GLP_FET_TIME_FLT_NOT_SUPP = (0 << 9), /// Multiple Bond Support Bit /// Multiple Bond Supported GLP_FET_MUL_BOND_SUPP = (1 << 10), /// Multiple Bond Not Supported GLP_FET_MUL_BOND_NOT_SUPP = (0 << 10), }; /// Glucose measurement type enum glp_meas_type { /// Capillary Whole blood GLP_TYPE_CAPILLARY_WHOLE_BLOOD = (1), /// Capillary Plasma GLP_TYPE_CAPILLARY_PLASMA = (2), /// Venous Whole blood GLP_TYPE_VENOUS_WHOLE_BLOOD = (3), /// Venous Plasma GLP_TYPE_VENOUS_PLASMA = (4), /// Arterial Whole blood GLP_TYPE_ARTERIAL_WHOLE_BLOOD = (5), /// Arterial Plasma GLP_TYPE_ARTERIAL_PLASMA = (6), /// Undetermined Whole blood GLP_TYPE_UNDETERMINED_WHOLE_BLOOD = (7), /// Undetermined Plasma GLP_TYPE_UNDETERMINED_PLASMA = (8), /// Interstitial Fluid (ISF) GLP_TYPE_INTERSTITIAL_FLUID = (9), /// Control Solution GLP_TYPE_CTRL_SOLUTION = (10), }; /// Glucose measurement Sample Location enum glp_meas_loc { /// Finger GLP_LOC_FINGER = (1), /// Alternate Site Test (AST) GLP_LOC_ALT_SITE_TEST = (2), /// Earlobe GLP_LOC_EARLOBE = (3), /// Control solution GLP_LOC_CTRL_SOLUTION = (4), /// Sample Location value not available GLP_LOC_SPL_LOC_VAL_NOT_AVA = (15), }; /// Glucose measurement Sensor Status Annunciation enum glp_meas_state { /// Device battery low at time of measurement GLP_MEAS_STATE_DEV_BAT_LOW = (1 << 0), /// Sensor malfunction or faulting at time of measurement GLP_MEAS_STATE_SENS_MFNC_OR_FLTING = (1 << 1), /// Sample size for blood or control solution insufficient at time of measurement GLP_MEAS_STATE_SPL_SIZE_INSUFF = (1 << 2), /// Strip insertion error GLP_MEAS_STATE_STRIP_INSERT_ERR = (1 << 3), /// Strip type incorrect for device GLP_MEAS_STATE_STRIP_TYPE_INCOR_FOR_DEV = (1 << 4), /// Sensor result higher than the device can process GLP_MEAS_STATE_SENS_RES_HIGHER = (1 << 5), /// Sensor result lower than the device can process GLP_MEAS_STATE_SENS_RES_LOWER = (1 << 6), /// Sensor temperature too high for valid test/result at time of measurement GLP_MEAS_STATE_SENS_TEMP_TOO_HIGH = (1 << 7), /// Sensor temperature too low for valid test/result at time of measurement GLP_MEAS_STATE_SENS_TEMP_TOO_LOW = (1 << 8), /// Sensor read interrupted because strip was pulled too soon at time of measurement GLP_MEAS_STATE_SENS_RD_INTED = (1 << 9), /// General device fault has occurred in the sensor GLP_MEAS_STATE_GEN_DEV_FLT = (1 << 10), /// Time fault has occurred in the sensor and time may be inaccurate GLP_MEAS_STATE_TIME_FLT = (1 << 11), }; /// Glucose measurement context Carbohydrate ID enum glp_meas_ctx_carbo { /// Breakfast GLP_CID_BREAKFAST = (1), /// Lunch GLP_CID_LUNCH = (2), /// Dinner GLP_CID_DINNER = (3), /// Snack GLP_CID_SNACK = (4), /// Drink GLP_CID_DRINK = (5), /// Supper GLP_CID_SUPPER = (6), /// Brunch GLP_CID_BRUNCH = (7), }; /// Glucose measurement context Meal enum glp_meas_ctx_meal { /// Preprandial (before meal) GLP_MEAL_PREPRANDIAL = (1), /// Postprandial (after meal) GLP_MEAL_POSTPRANDIAL = (2), /// Fasting GLP_MEAL_FASTING = (3), /// Casual (snacks, drinks, etc.) GLP_MEAL_CASUAL = (4), /// Bedtime GLP_MEAL_BEDTIME = (5), }; /// Glucose measurement context tester type enum glp_meas_ctx_tester_type { /// Self GLP_TESTER_SELF = (1), /// Health Care Professional GLP_TESTER_HEALTH_CARE_PROFESSIONAL = (2), /// Lab test GLP_TESTER_LAB_TEST = (3), /// Tester value not available GLP_TESTER_TESTER_VAL_NOT_AVA = (15), }; /// Glucose measurement context personal health feeling enum glp_meas_ctx_feeling { /// Minor health issues GLP_HEALTH_MINOR_HEALTH_ISSUES = (1), /// Major health issues GLP_HEALTH_MAJOR_HEALTH_ISSUES = (2), /// During menses GLP_HEALTH_DUR_MENSES = (3), /// Under stress GLP_HEALTH_UNDER_STRESS = (4), /// No health issues GLP_HEALTH_NO_HEALTH_ISSUES = (5), /// Health value not available GLP_HEALTH_HEALTH_VAL_NOT_AVA = (15), }; /// Glucose measurement context medication identification enum glp_meas_ctx_med_id { /// Rapid acting insulin GLP_MEDID_RAPID_ACTING_INSULIN = (1), /// Short acting insulin GLP_MEDID_SHORT_ACTING_INSULIN = (2), /// Intermediate acting insulin GLP_MEDID_INTER_ACTING_INSULIN = (3), /// Long acting insulin GLP_MEDID_LONG_ACTING_INSULIN = (4), /// Pre-mixed insulin GLP_MEDID_PRE_MIXED_INSULIN = (5), }; /// Glucose access control OP Code enum glp_racp_op_code { /// Report stored records (Operator: Value from Operator Table) GLP_REQ_REP_STRD_RECS = (1), /// Delete stored records (Operator: Value from Operator Table) GLP_REQ_DEL_STRD_RECS = (2), /// Abort operation (Operator: Null 'value of 0x00 from Operator Table') GLP_REQ_ABORT_OP = (3), /// Report number of stored records (Operator: Value from Operator Table) GLP_REQ_REP_NUM_OF_STRD_RECS = (4), /// Number of stored records response (Operator: Null 'value of 0x00 from Operator Table') GLP_REQ_NUM_OF_STRD_RECS_RSP = (5), /// Response Code (Operator: Null 'value of 0x00 from Operator Table') GLP_REQ_RSP_CODE = (6), }; /// Glucose access control Operator enum glp_racp_operator { /// All records GLP_OP_ALL_RECS = (1), /// Less than or equal to GLP_OP_LT_OR_EQ = (2), /// Greater than or equal to GLP_OP_GT_OR_EQ = (3), /// Within range of (inclusive) GLP_OP_WITHIN_RANGE_OF = (4), /// First record(i.e. oldest record) GLP_OP_FIRST_REC = (5), /// Last record (i.e. most recent record) GLP_OP_LAST_REC = (6), }; /// Glucose access control response code enum glp_racp_status { /// Success GLP_RSP_SUCCESS = (1), /// Op Code not supported GLP_RSP_OP_CODE_NOT_SUP = (2), /// Invalid Operator GLP_RSP_INVALID_OPERATOR = (3), /// Operator not supported GLP_RSP_OPERATOR_NOT_SUP = (4), /// Invalid Operand GLP_RSP_INVALID_OPERAND = (5), /// No records found GLP_RSP_NO_RECS_FOUND = (6), /// Abort unsuccessful GLP_RSP_ABORT_UNSUCCESSFUL = (7), /// Procedure not completed GLP_RSP_PROCEDURE_NOT_COMPLETED = (8), /// Operand not supported GLP_RSP_OPERAND_NOT_SUP = (9), }; /// record access control filter type enum glp_racp_filter { /// Filter using Sequence number GLP_FILTER_SEQ_NUMBER = (1), /// Filter using Facing time GLP_FILTER_USER_FACING_TIME = (2), }; /* * TYPE DEFINITIONS **************************************************************************************** */ /// Glucose measurement struct glp_meas { /// Base Time struct prf_date_time base_time; /// Time Offset int16_t time_offset; /// Glucose Concentration - units of kg/L or mol/L prf_sfloat concentration; ///Sensor Status Annunciation uint16_t status; /// Type uint8_t type; /// Sample Location uint8_t location; /// Flags uint8_t flags; }; /// Glucose measurement context struct glp_meas_ctx { /// Carbohydrate - units of kilograms prf_sfloat carbo_val; /// Exercise Duration uint16_t exercise_dur; /// Medication value (units of kilograms or liters) prf_sfloat med_val; /// HbA1c value prf_sfloat hba1c_val; /// Carbohydrate ID uint8_t carbo_id; /// Meal uint8_t meal; /// Tester uint8_t tester; /// Health uint8_t health; /// Exercise Intensity uint8_t exercise_intens; /// Medication ID uint8_t med_id; /// Flag uint8_t flags; /// Extended Flags uint8_t ext_flags; }; /// Record access control point operation filter struct glp_filter { /// function operator uint8_t operator; /// filter type uint8_t filter_type; /// filter union union { /// Sequence number filtering (filter_type = GLP_FILTER_SEQ_NUMBER) struct { /// Min sequence number uint16_t min; /// Max sequence number uint16_t max; }seq_num; /// User facing time filtering (filter_type = GLP_FILTER_USER_FACING_TIME) struct { /// Min base time struct prf_date_time facetime_min; /// Max base time struct prf_date_time facetime_max; } time; } val; }; /// Record access control point request struct glp_racp_req { /// operation code uint8_t op_code; /// operation filter struct glp_filter filter; }; /// Record access control point response struct glp_racp_rsp { /// operation code uint8_t op_code; /// operator (ignored, always set to null) uint8_t operator; /// response operand union { /// Number of record (if op_code = GLP_REQ_NUM_OF_STRD_RECS_RSP) uint16_t num_of_record; /// Command Status (if op_code = GLP_REQ_RSP_CODE) struct { /// Request Op Code uint8_t op_code_req; /// Response Code status uint8_t status; } rsp; } operand; }; /// @} glp_common #endif /* _GLP_COMMON_H_ */