Hello! I am trying to modify the ble_app_hrs_freertos example to send actual heart rate sensor value to the nRF Toolbox app over BLE. I am able to read values from my sensor through TWI, and I am also able to run the ble_app_hrs_freertos example and send the simulated data through BLE. Now, I would like to combine the two, and send the actual reading from the sensor to the app through BLE.
I tried modifying the heart_rate_meas_timeout_handler function of the code to take value from the sensor instead of sensorsim_measure(). However when I do this, I am not able to the device anymore. After trying different things, I realized that the nrf_drv_twi_tx() and nrf_drv_twi_rx() function is the issue. My I wrong to call nrf_drv_twi_tx() and nrf_drv_twi_rx() in the handler? How then, can I get the sensor reading through TWI?
static void heart_rate_meas_timeout_handler(TimerHandle_t xTimer) { static uint32_t cnt = 0; ret_code_t err_code; uint8_t heart_rate; UNUSED_PARAMETER(xTimer); //heart_rate = (uint16_t)sensorsim_measure(&m_heart_rate_sim_state, &m_heart_rate_sim_cfg); heart_rate = readHRS(); 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 != NRF_ERROR_RESOURCES) && (err_code != NRF_ERROR_BUSY) && (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); } void readHRS(uint8_t * read_long_data){ ret_code_t err_code; err_code = nrf_drv_twi_tx(&m_twi_nrf52, HRS_ADDR, (uint8_t *) HRS_FIFO_DATA, sizeof(HRS_FIFO_DATA), true); if (NRF_SUCCESS == err_code){ err_code = nrf_drv_twi_rx(&m_twi_nrf52, HRS_ADDR, (uint8_t *) read_long_data, 6); } APP_ERROR_CHECK(err_code); nrf_delay_ms(10); }
THANK YOU!