/********************************************************************* * @fn heartRateMeasNotify * * @brief Prepare and send a heart rate measurement notification * * @return none */ static void heartRateMeasNotify(void) { // Heart rate measurement value stored in this structure attHandleValueNoti_t heartRateMeas; heartRateMeas.pValue = GATT_bm_alloc( gapConnHandle, ATT_HANDLE_VALUE_NOTI, HR_MEAS_LEN, NULL ); if ( heartRateMeas.pValue != NULL ) { uint8 *p = heartRateMeas.pValue; uint8 flags = heartRateFlags[heartRateFlagsIdx]; // build heart rate measurement structure from simulated values *p++ = flags; *p++ = heartRateBpm; if (flags & HEARTRATE_FLAGS_FORMAT_UINT16) { // additional byte for 16 bit format *p++ = 0; } if (flags & HEARTRATE_FLAGS_ENERGY_EXP) { *p++ = LO_UINT16(heartRateEnergy); *p++ = HI_UINT16(heartRateEnergy); } if (flags & HEARTRATE_FLAGS_RR) { *p++ = LO_UINT16(heartRateRrInterval1); *p++ = HI_UINT16(heartRateRrInterval1); *p++ = LO_UINT16(heartRateRrInterval2); *p++ = HI_UINT16(heartRateRrInterval2); } heartRateMeas.len = (uint8) (p - heartRateMeas.pValue); if ( HeartRate_MeasNotify( gapConnHandle, &heartRateMeas ) != SUCCESS ) { GATT_bm_free( (gattMsg_t *)&heartRateMeas, ATT_HANDLE_VALUE_IND ); } // update simulated values heartRateEnergy += ENERGY_INCREMENT; if (++heartRateBpm == BPM_MAX) { heartRateBpm = BPM_DEFAULT; } heartRateRrInterval1 = heartRateRrInterval2 = HEARTRATE_BPM_TO_RR(heartRateBpm); } }
/********************************************************************* * @fn heartRateMeasNotify * * @brief Prepare and send a heart rate measurement notification * * @return none */ static void heartRateMeasNotify(void) { uint8 *p = heartRateMeas.value; uint8 flags = heartRateFlags[heartRateFlagsIdx]; // build heart rate measurement structure from simulated values *p++ = flags; *p++ = heartRateBpm; if (flags & HEARTRATE_FLAGS_FORMAT_UINT16) { // additional byte for 16 bit format *p++ = 0; } if (flags & HEARTRATE_FLAGS_ENERGY_EXP) { *p++ = LO_UINT16(heartRateEnergy); *p++ = HI_UINT16(heartRateEnergy); } if (flags & HEARTRATE_FLAGS_RR) { *p++ = LO_UINT16(heartRateRrInterval1); *p++ = HI_UINT16(heartRateRrInterval1); *p++ = LO_UINT16(heartRateRrInterval2); *p++ = HI_UINT16(heartRateRrInterval2); } heartRateMeas.len = (uint8) (p - heartRateMeas.value); HeartRate_MeasNotify( gapConnHandle, &heartRateMeas ); // update simulated values heartRateEnergy += ENERGY_INCREMENT; if (++heartRateBpm == BPM_MAX) { heartRateBpm = BPM_DEFAULT; } heartRateRrInterval1 = heartRateRrInterval2 = HEARTRATE_BPM_TO_RR(heartRateBpm); }
LO_UINT16(HEARTRATE_SERV_UUID), HI_UINT16(HEARTRATE_SERV_UUID), LO_UINT16(BATT_SERV_UUID), HI_UINT16(BATT_SERV_UUID) }; // Device name attribute value static uint8 attDeviceName[GAP_DEVICE_NAME_LEN] = "Heart Rate Sensor"; // GAP connection handle static uint16 gapConnHandle; // Components of heart rate measurement structure static uint8 heartRateBpm = BPM_DEFAULT; static uint16 heartRateEnergy = 0; static uint16 heartRateRrInterval1 = HEARTRATE_BPM_TO_RR(BPM_DEFAULT); static uint16 heartRateRrInterval2 = HEARTRATE_BPM_TO_RR(BPM_DEFAULT); // flags for simulated measurements static const uint8 heartRateFlags[FLAGS_IDX_MAX] = { HEARTRATE_FLAGS_CONTACT_NOT_SUP, HEARTRATE_FLAGS_CONTACT_NOT_DET, HEARTRATE_FLAGS_CONTACT_DET | HEARTRATE_FLAGS_ENERGY_EXP, HEARTRATE_FLAGS_CONTACT_DET | HEARTRATE_FLAGS_RR, HEARTRATE_FLAGS_CONTACT_DET | HEARTRATE_FLAGS_ENERGY_EXP | HEARTRATE_FLAGS_RR, HEARTRATE_FLAGS_FORMAT_UINT16 | HEARTRATE_FLAGS_CONTACT_DET | HEARTRATE_FLAGS_ENERGY_EXP | HEARTRATE_FLAGS_RR, 0x00 }; static uint8 heartRateFlagsIdx = 0;