/**@brief Handle received ANT data message. * * @param[in] p_evt_buffer The buffer containing received data. */ static void ant_data_messages_handle(uint8_t * p_evt_buffer) { static uint32_t s_previous_beat_count = 0; // Heart beat count from previously received page uint32_t err_code; uint32_t current_page; uint8_t beat_count; uint8_t computed_heart_rate; uint16_t beat_time; // Decode the default page data present in all pages beat_time = uint16_decode(&p_evt_buffer[ANT_BUFFER_INDEX_MESG_DATA + 4]); beat_count = (uint8_t)p_evt_buffer[ANT_BUFFER_INDEX_MESG_DATA + 6]; computed_heart_rate = (uint8_t)p_evt_buffer[ANT_BUFFER_INDEX_MESG_DATA + 7]; // Decode page specific data current_page = p_evt_buffer[ANT_BUFFER_INDEX_MESG_DATA]; switch (current_page & ~ANT_HRM_TOGGLE_MASK) { case ANT_HRM_PAGE_4: // Ensure that there is only one beat between time intervals. if ((beat_count - s_previous_beat_count) == 1) { uint16_t prev_beat = uint16_decode(&p_evt_buffer[ANT_BUFFER_INDEX_MESG_DATA + 2]); // Subtracting the event time gives the R-R interval ble_hrs_rr_interval_add(&m_hrs, beat_time - prev_beat); } s_previous_beat_count = beat_count; break; case ANT_HRM_PAGE_0: case ANT_HRM_PAGE_1: case ANT_HRM_PAGE_2: case ANT_HRM_PAGE_3: default: // No implementation needed. break; } // Notify the received heart rate measurement err_code = ble_hrs_heart_rate_measurement_send(&m_hrs, computed_heart_rate); if ( (err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE) && (err_code != BLE_ERROR_NO_TX_BUFFERS) && (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING) ) { APP_ERROR_HANDLER(err_code); } }
/**@brief Function for handling the RR interval timer timeout. * * @details This function will be called each time the RR interval timer expires. * * @param[in] p_context Pointer used for passing some arbitrary information (context) from the * app_start_timer() call to the timeout handler. */ static void rr_interval_timeout_handler(void * p_context) { UNUSED_PARAMETER(p_context); if (m_rr_interval_enabled) { uint16_t rr_interval; rr_interval = (uint16_t)sensorsim_measure(&m_rr_interval_sim_state, &m_rr_interval_sim_cfg); ble_hrs_rr_interval_add(&m_hrs, rr_interval); rr_interval = (uint16_t)sensorsim_measure(&m_rr_interval_sim_state, &m_rr_interval_sim_cfg); ble_hrs_rr_interval_add(&m_hrs, rr_interval); rr_interval = (uint16_t)sensorsim_measure(&m_rr_interval_sim_state, &m_rr_interval_sim_cfg); ble_hrs_rr_interval_add(&m_hrs, rr_interval); rr_interval = (uint16_t)sensorsim_measure(&m_rr_interval_sim_state, &m_rr_interval_sim_cfg); ble_hrs_rr_interval_add(&m_hrs, rr_interval); rr_interval = (uint16_t)sensorsim_measure(&m_rr_interval_sim_state, &m_rr_interval_sim_cfg); ble_hrs_rr_interval_add(&m_hrs, rr_interval); rr_interval = (uint16_t)sensorsim_measure(&m_rr_interval_sim_state, &m_rr_interval_sim_cfg); ble_hrs_rr_interval_add(&m_hrs, rr_interval); } }