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