static uint8_t onRWAuthReq_datetime_char(uint8_t *p_buffer, uint16_t length) { ble_date_time_t date_time; memset(&date_time, 0, sizeof(ble_date_time_t)); metaDataLogReadDateTime(context.target_log_id, &date_time); return ble_date_time_encode(&date_time, p_buffer); }
/**@brief Function for encoding a Glucose measurement. * * @param[in] p_meas Measurement to be encoded. * @param[out] p_encoded_buffer Pointer to buffer where the encoded measurement is to be stored. * * @return Size of encoded measurement. */ static uint8_t gls_meas_encode(const ble_gls_meas_t * p_meas, uint8_t * p_encoded_buffer) { uint8_t len = 0; p_encoded_buffer[len++] = p_meas->flags; len += uint16_encode(p_meas->sequence_number, &p_encoded_buffer[len]); len += ble_date_time_encode(&p_meas->base_time, &p_encoded_buffer[len]); if (p_meas->flags & BLE_GLS_MEAS_FLAG_TIME_OFFSET) { len += uint16_encode(p_meas->time_offset, &p_encoded_buffer[len]); } if (p_meas->flags & BLE_GLS_MEAS_FLAG_CONC_TYPE_LOC) { uint16_t encoded_concentration; encoded_concentration = ((p_meas->glucose_concentration.exponent << 12) & 0xF000) | ((p_meas->glucose_concentration.mantissa << 0) & 0x0FFF); p_encoded_buffer[len++] = (uint8_t)(encoded_concentration); p_encoded_buffer[len++] = (uint8_t)(encoded_concentration >> 8); p_encoded_buffer[len++] = (p_meas->sample_location << 4) | (p_meas->type & 0x0F); }
static uint8_t sst_encode(ble_cgms_sst_t * p_sst, uint8_t * p_encoded_sst) { uint8_t len; len = ble_date_time_encode(&p_sst->date_time, p_encoded_sst); p_encoded_sst[len++] = p_sst->time_zone; p_encoded_sst[len++] = p_sst->dst; return len; }
/**@brief Encode a Health Thermometer Measurement. * * @param[in] p_hts Health Thermometer Service structure. * @param[in] p_hts_meas Measurement to be encoded. * @param[out] p_encoded_buffer Buffer where the encoded data will be written. * * @return Size of encoded data. */ static uint8_t hts_measurement_encode(ble_hts_t * p_hts, ble_hts_meas_t * p_hts_meas, uint8_t * p_encoded_buffer) { uint8_t flags = 0; uint8_t len = 1; uint32_t encoded_temp; // Flags field if (p_hts_meas->temp_in_fahr_units) { flags |= HTS_MEAS_FLAG_TEMP_UNITS_BIT; } if (p_hts_meas->time_stamp_present) { flags |= HTS_MEAS_FLAG_TIME_STAMP_BIT; } // Temperature Measurement Value field if (p_hts_meas->temp_in_fahr_units) { flags |= HTS_MEAS_FLAG_TEMP_UNITS_BIT; encoded_temp = ((p_hts_meas->temp_in_fahr.exponent << 24) & 0xFF000000) | ((p_hts_meas->temp_in_fahr.mantissa << 0) & 0x00FFFFFF); } else { encoded_temp = ((p_hts_meas->temp_in_celcius.exponent << 24) & 0xFF000000) | ((p_hts_meas->temp_in_celcius.mantissa << 0) & 0x00FFFFFF); } len += uint32_encode(encoded_temp, &p_encoded_buffer[len]); // Time Stamp field if (p_hts_meas->time_stamp_present) { flags |= HTS_MEAS_FLAG_TIME_STAMP_BIT; len += ble_date_time_encode(&p_hts_meas->time_stamp, &p_encoded_buffer[len]); } // Temperature Type field if (p_hts_meas->temp_type_present) { flags |= HTS_MEAS_FLAG_TEMP_TYPE_BIT; p_encoded_buffer[len++] = p_hts_meas->temp_type; } // Flags field p_encoded_buffer[0] = flags; return len; }
/**@brief Function for encoding a Blood Pressure Measurement. * * @param[in] p_bps Blood Pressure Service structure. * @param[in] p_bps_meas Measurement to be encoded. * @param[out] p_encoded_buffer Buffer where the encoded data will be written. * * @return Size of encoded data. */ static uint8_t bps_measurement_encode(ble_bps_t * p_bps, ble_bps_meas_t * p_bps_meas, uint8_t * p_encoded_buffer) { uint8_t flags = 0; uint8_t len = 1; uint16_t encoded_sfloat; // Set measurement units flag if (p_bps_meas->blood_pressure_units_in_kpa) { flags |= BPS_MEAS_BLOOD_PRESSURE_UNITS_FLAG_BIT; } // Blood Pressure Measurement - Systolic encoded_sfloat = ((p_bps_meas->blood_pressure_systolic.exponent << 12) & 0xF000) | ((p_bps_meas->blood_pressure_systolic.mantissa << 0) & 0x0FFF); len += uint16_encode(encoded_sfloat, &p_encoded_buffer[len]); // Blood Pressure Measurement - Diastolic encoded_sfloat = ((p_bps_meas->blood_pressure_diastolic.exponent << 12) & 0xF000) | ((p_bps_meas->blood_pressure_diastolic.mantissa << 0) & 0x0FFF); len += uint16_encode(encoded_sfloat, &p_encoded_buffer[len]); // Blood Pressure Measurement - Mean Arterial Pressure encoded_sfloat = ((p_bps_meas->mean_arterial_pressure.exponent << 12) & 0xF000) | ((p_bps_meas->mean_arterial_pressure.mantissa << 0) & 0x0FFF); len += uint16_encode(encoded_sfloat, &p_encoded_buffer[len]); // Time Stamp field if (p_bps_meas->time_stamp_present) { flags |= BPS_MEAS_TIME_STAMP_FLAG_BIT; len += ble_date_time_encode(&p_bps_meas->time_stamp, &p_encoded_buffer[len]); } // Pulse Rate if (p_bps_meas->pulse_rate_present) { flags |= BPS_MEAS_PULSE_RATE_FLAG_BIT; encoded_sfloat = ((p_bps_meas->pulse_rate.exponent << 12) & 0xF000) | ((p_bps_meas->pulse_rate.mantissa << 0) & 0x0FFF); len += uint16_encode(encoded_sfloat, &p_encoded_buffer[len]); } // User ID if (p_bps_meas->user_id_present) { flags |= BPS_MEAS_USER_ID_FLAG_BIT; p_encoded_buffer[len++] = p_bps_meas->user_id; } // Measurement Status if (p_bps_meas->measurement_status_present) { flags |= BPS_MEAS_MEASUREMENT_STATUS_FLAG_BIT; len += uint16_encode(p_bps_meas->measurement_status, &p_encoded_buffer[len]); } // Flags field p_encoded_buffer[0] = flags; return len; }