/**@brief Populate simulated running speed and cadence measurement. */ static void rsc_sim_measurement(ble_rscs_meas_t * p_measurement) { p_measurement->is_inst_stride_len_present = false; p_measurement->is_total_distance_present = false; p_measurement->is_running = false; p_measurement->inst_speed = ble_sensorsim_measure(&m_speed_mps_sim_state, &m_speed_mps_sim_cfg); p_measurement->inst_cadence = ble_sensorsim_measure(&m_cadence_rpm_sim_state, &m_cadence_rpm_sim_cfg); }
/**@brief Heart rate measurement timer timeout handler. * * @details This function will be called each time the heart rate measurement timer expires. * It will exclude RR Interval data from every third measurement. * * @param[in] p_context Pointer used for passing some arbitrary information (context) from the * app_start_timer() call to the timeout handler. */ static void heart_rate_meas_timeout_handler(void * p_context) { static uint32_t cnt = 0; uint32_t err_code; uint16_t heart_rate; UNUSED_PARAMETER(p_context); heart_rate = (uint16_t)ble_sensorsim_measure(&m_heart_rate_sim_state, &m_heart_rate_sim_cfg); cnt++; err_code = ble_hrs_heart_rate_measurement_send(&m_hrs, 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); } // Disable RR Interval recording every third heart rate measurement. // NOTE: An application will normally not do this. It is done here just for testing generation // of messages without RR Interval measurements. m_rr_interval_enabled = ((cnt % 3) != 0); }
/**@brief Function for populating simulated health thermometer measurement. */ static void hts_sim_measurement(ble_hts_meas_t * p_meas) { static ble_date_time_t time_stamp = { 2012, 12, 5, 11, 50, 0 }; uint32_t celciusX100; p_meas->temp_in_fahr_units = false; p_meas->time_stamp_present = true; p_meas->temp_type_present = TEMP_TYPE_AS_CHARACTERISTIC ? false : true; celciusX100 = ble_sensorsim_measure(&m_temp_celcius_sim_state, &m_temp_celcius_sim_cfg); p_meas->temp_in_celcius.exponent = -2; p_meas->temp_in_celcius.mantissa = celciusX100; p_meas->temp_in_fahr.exponent = -2; p_meas->temp_in_fahr.mantissa = (32 * 100) + ((celciusX100 * 9) / 5); p_meas->time_stamp = time_stamp; p_meas->temp_type = BLE_HTS_TEMP_TYPE_FINGER; // update simulated time stamp time_stamp.seconds += 27; if (time_stamp.seconds > 59) { time_stamp.seconds -= 60; time_stamp.minutes++; if (time_stamp.minutes > 59) { time_stamp.minutes = 0; } } }
/**@brief Populate simulated cycling speed and cadence measurement. */ static void csc_sim_measurement(ble_cscs_meas_t * p_measurement) { static uint32_t cumulative_wheel_revs = 0; static uint16_t cumulative_crank_revs = 0; static uint16_t event_time = 0; static uint16_t wheel_revolution_mm = 0; static uint16_t crank_rev_degrees = 0; uint16_t mm_per_sec; uint16_t degrees_per_sec; uint16_t event_time_inc; // Per specification event time is in 1/1024th's of a second event_time_inc = (1024 * SPEED_AND_CADENCE_MEAS_INTERVAL) / 1000; // Calculate simulated wheel revolution values p_measurement->is_wheel_rev_data_present = true; mm_per_sec = KPH_TO_MM_PER_SEC * ble_sensorsim_measure(&m_speed_kph_sim_state, &m_speed_kph_sim_cfg); wheel_revolution_mm += mm_per_sec * SPEED_AND_CADENCE_MEAS_INTERVAL / 1000; cumulative_wheel_revs += wheel_revolution_mm / WHEEL_CIRCUMFERENCE_MM; wheel_revolution_mm %= WHEEL_CIRCUMFERENCE_MM; p_measurement->cumulative_wheel_revs = cumulative_wheel_revs; p_measurement->last_wheel_event_time = event_time + (event_time_inc * (mm_per_sec - wheel_revolution_mm) / mm_per_sec); // Calculate simulated cadence values p_measurement->is_crank_rev_data_present = true; degrees_per_sec = RPM_TO_DEGREES_PER_SEC * ble_sensorsim_measure(&m_crank_rpm_sim_state, &m_crank_rpm_sim_cfg); crank_rev_degrees += degrees_per_sec * SPEED_AND_CADENCE_MEAS_INTERVAL / 1000; cumulative_crank_revs += crank_rev_degrees / DEGREES_PER_REVOLUTION; crank_rev_degrees %= DEGREES_PER_REVOLUTION; p_measurement->cumulative_crank_revs = cumulative_crank_revs; p_measurement->last_crank_event_time = event_time + (event_time_inc * (degrees_per_sec - crank_rev_degrees) / degrees_per_sec); event_time += event_time_inc; }
/**@brief Function for populating simulated running speed and cadence measurement. */ static void rsc_sim_measurement(ble_rscs_meas_t * p_measurement) { p_measurement->is_inst_stride_len_present = true; p_measurement->is_total_distance_present = false; p_measurement->is_running = false; p_measurement->inst_speed = ble_sensorsim_measure(&m_speed_mps_sim_state, &m_speed_mps_sim_cfg); p_measurement->inst_cadence = ble_sensorsim_measure(&m_cadence_rpm_sim_state, &m_cadence_rpm_sim_cfg); p_measurement->inst_stride_length = ble_sensorsim_measure(&m_cadence_stl_sim_state, &m_cadence_stl_sim_cfg); if (p_measurement->inst_speed > (uint32_t)(MIN_RUNNING_SPEED * 256)) { p_measurement->is_running = true; } }
/**@brief RR interval timer timeout handler. * * @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)ble_sensorsim_measure(&m_rr_interval_sim_state, &m_rr_interval_sim_cfg); ble_hrs_rr_interval_add(&m_hrs, rr_interval); } }
/**@brief Function for performing a battery measurement, and update the Battery Level characteristic in the Battery Service. */ static void battery_level_update(void) { uint32_t err_code; uint8_t battery_level; battery_level = (uint8_t)ble_sensorsim_measure(&m_battery_sim_state, &m_battery_sim_cfg); err_code = ble_bas_battery_level_update(&m_bas, battery_level); 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); } }