Hi,
There is something I don't understand and I request your help to answer my interrogation. What I want to do is a SAADC conversion then send the result of this conversion over BLE.
So basically my first working version looks something like (simplified for readability) :
#define SAMPLES_IN_BUFFER 1
static nrf_saadc_value_t m_buffer[SAMPLES_IN_BUFFER];
static int16_t value_to_send = 0;
void send_value()
{
ble_custom_on_sensor_change(m_conn_handle, &m_ble, value_to_send); // Same as ble_lbs_on_button_change
if (err_code != NRF_SUCCESS &&
err_code != BLE_ERROR_INVALID_CONN_HANDLE &&
err_code != NRF_ERROR_INVALID_STATE &&
err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
{
APP_ERROR_CHECK(err_code);
}
}
void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
{
nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
/* Send the value */
value_to_send = p_event->data.done.p_buffer[0];
}
}
void saadc_init(void)
{
...
}
int main(void)
{
...
saadc_init();
// Enter main loop.
for (;;)
{
nrf_delay_ms(500);
nrf_drv_saadc_sample();
send_value();
if (NRF_LOG_PROCESS() == false)
{
power_manage();
}
}
}
But with this version, I am afraid that send_value() could be called before nrf_drv_saadc_sample() has updated the value_to_send.
So now I want to call the function send_value() within the saadc_callback but it doesn't work and I can't find a way to Debug it. It looks like it failed during the sd_ble_gatts_hvx() call (from the ble_lbs_on_button_change function (or ble_custom_on_sensor_change in my case).
So basically, this doesn't work, doesn't even succeed to establish a connection in BLE :
#define SAMPLES_IN_BUFFER 1
static nrf_saadc_value_t m_buffer[SAMPLES_IN_BUFFER];
void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
{
nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
/* Send the value */
ble_custom_on_sensor_change(m_conn_handle, &m_ble, p_event->data.done.p_buffer[0]); // Same as ble_lbs_on_button_change
if (err_code != NRF_SUCCESS &&
err_code != BLE_ERROR_INVALID_CONN_HANDLE &&
err_code != NRF_ERROR_INVALID_STATE &&
err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
{
APP_ERROR_CHECK(err_code);
}
}
}
void saadc_init(void)
{
...
}
int main(void)
{
...
saadc_init();
// Enter main loop.
for (;;)
{
nrf_delay_ms(500);
nrf_drv_saadc_sample();
if (NRF_LOG_PROCESS() == false)
{
power_manage();
}
}
}
Any idea why ?
Thanks