From d974cd2f46a4eec038947a25abc477a6a6a4ede2 Mon Sep 17 00:00:00 2001 From: Rahix <rahix@rahix.de> Date: Sun, 22 Sep 2019 11:12:32 +0200 Subject: [PATCH] hack(streams): Discard overflowing samples As discussed in card10/firmware!316, this commit prevents I2C lockup by discarding overflowing samples instead of blocking until they have been read. This is not ideal as the samples read will not be the most recent ones. A deeper refactor of the sensor-stream internal API can fix this in the future. Cc: @flo_h Signed-off-by: Rahix <rahix@rahix.de> --- epicardium/modules/bhi.c | 14 +++++++++----- epicardium/modules/max30001.c | 11 ++++------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/epicardium/modules/bhi.c b/epicardium/modules/bhi.c index 81196141..a40a73eb 100644 --- a/epicardium/modules/bhi.c +++ b/epicardium/modules/bhi.c @@ -312,11 +312,15 @@ bhi160_handle_packet(bhy_data_type_t data_type, bhy_data_generic_t *sensor_data) data_vector.y = sensor_data->data_vector.y; data_vector.z = sensor_data->data_vector.z; data_vector.status = sensor_data->data_vector.status; - xQueueSend( - bhi160_streams[sensor_type].queue, - &data_vector, - BHI160_MUTEX_WAIT_MS - ); + + /* Discard overflow. See discussion in !316. */ + if (xQueueSend( + bhi160_streams[sensor_type].queue, + &data_vector, + 0) != pdTRUE) { + LOG_WARN("bhi160", "queue full for %d", sensor_type); + } + if (wakeup) { api_interrupt_trigger(epic_int); } diff --git a/epicardium/modules/max30001.c b/epicardium/modules/max30001.c index 811af4bf..e3ad57da 100644 --- a/epicardium/modules/max30001.c +++ b/epicardium/modules/max30001.c @@ -155,13 +155,10 @@ static void max30001_handle_samples(int16_t *sensor_data, int16_t n) while (n--) { uint16_t data = -*sensor_data++; - if (xQueueSend( - max30001_stream.queue, - &data, - MAX30001_MUTEX_WAIT_MS) != pdTRUE) { - LOG_WARN( - "max30001", - "queue full"); // TODO; handle queue full + + /* Discard overflow. See discussion in !316. */ + if (xQueueSend(max30001_stream.queue, &data, 0) != pdTRUE) { + LOG_WARN("max30001", "queue full"); } } api_interrupt_trigger(EPIC_INT_MAX30001_ECG); -- GitLab