From 32382264a54a96f1b990515175635fee70106ffc Mon Sep 17 00:00:00 2001
From: koalo <koalo@koalo.de>
Date: Thu, 22 Aug 2019 17:58:03 +0200
Subject: [PATCH] feat(bhi160): Use centralized return

---
 epicardium/modules/bhi.c | 155 +++++++++++++++++++--------------------
 1 file changed, 76 insertions(+), 79 deletions(-)

diff --git a/epicardium/modules/bhi.c b/epicardium/modules/bhi.c
index 16021494..7d368950 100644
--- a/epicardium/modules/bhi.c
+++ b/epicardium/modules/bhi.c
@@ -123,105 +123,101 @@ int epic_bhi160_enable_sensor(
 	enum bhi160_sensor_type sensor_type,
 	struct bhi160_sensor_config *config
 ) {
+	int result = 0;
+
 	bhy_virtual_sensor_t vs_id = bhi160_lookup_vs_id(sensor_type);
 	if (vs_id < 0) {
 		return -ENODEV;
 	}
 
-	int lockret = hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(100));
-	if (lockret < 0) {
-		return lockret;
+	result = hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(100));
+	if (result < 0) {
+		return result;
 	}
 
-	if (xSemaphoreTake(bhi160_mutex, LOCK_WAIT) == pdTRUE) {
-		struct stream_info *stream = &bhi160_streams[sensor_type];
-		stream->item_size = bhi160_lookup_data_size(sensor_type);
-		/* TODO: Sanity check length */
-		stream->queue = xQueueCreate(
-			config->sample_buffer_len, stream->item_size
-		);
-		if (stream->queue == NULL) {
-			xSemaphoreGive(bhi160_mutex);
-			hwlock_release(HWLOCK_I2C);
-			return -ENOMEM;
-		}
-
-		int streamret =
-			stream_register(bhi160_lookup_sd(sensor_type), stream);
-		if (streamret < 0) {
-			xSemaphoreGive(bhi160_mutex);
-			hwlock_release(HWLOCK_I2C);
-			return streamret;
-		}
+	if (xSemaphoreTake(bhi160_mutex, LOCK_WAIT) != pdTRUE) {
+		result = -EBUSY;
+		goto out_free_i2c;
+	}
 
-		int bhyret = bhy_enable_virtual_sensor(
-			vs_id,
-			VS_WAKEUP,
-			config->sample_rate,
-			0,
-			VS_FLUSH_NONE,
-			0,
-			config->dynamic_range /* dynamic range is sensor dependent */
-		);
-		if (bhyret != BHY_SUCCESS) {
-			xSemaphoreGive(bhi160_mutex);
-			hwlock_release(HWLOCK_I2C);
-			return bhyret;
-		}
+	struct stream_info *stream = &bhi160_streams[sensor_type];
+	stream->item_size          = bhi160_lookup_data_size(sensor_type);
+	/* TODO: Sanity check length */
+	stream->queue =
+		xQueueCreate(config->sample_buffer_len, stream->item_size);
+	if (stream->queue == NULL) {
+		result = -ENOMEM;
+		goto out_free_both;
+	}
 
-		bhi160_sensor_active[sensor_type] = true;
+	result = stream_register(bhi160_lookup_sd(sensor_type), stream);
+	if (result < 0) {
+		goto out_free_both;
+	}
 
-		xSemaphoreGive(bhi160_mutex);
-	} else {
-		hwlock_release(HWLOCK_I2C);
-		return -EBUSY;
+	result = bhy_enable_virtual_sensor(
+		vs_id,
+		VS_WAKEUP,
+		config->sample_rate,
+		0,
+		VS_FLUSH_NONE,
+		0,
+		config->dynamic_range /* dynamic range is sensor dependent */
+	);
+	if (result != BHY_SUCCESS) {
+		goto out_free_both;
 	}
 
+	bhi160_sensor_active[sensor_type] = true;
+	result                            = bhi160_lookup_sd(sensor_type);
+
+out_free_both:
+	xSemaphoreGive(bhi160_mutex);
+out_free_i2c:
 	hwlock_release(HWLOCK_I2C);
-	return bhi160_lookup_sd(sensor_type);
+	return result;
 }
 
 int epic_bhi160_disable_sensor(enum bhi160_sensor_type sensor_type)
 {
+	int result = 0;
+
 	bhy_virtual_sensor_t vs_id = bhi160_lookup_vs_id(sensor_type);
 	if (vs_id < 0) {
 		return -ENODEV;
 	}
 
-	int lockret = hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(100));
-	if (lockret < 0) {
-		return lockret;
+	result = hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(100));
+	if (result < 0) {
+		return result;
 	}
 
-	if (xSemaphoreTake(bhi160_mutex, LOCK_WAIT) == pdTRUE) {
-		struct stream_info *stream = &bhi160_streams[sensor_type];
-		int streamret              = stream_deregister(
-                        bhi160_lookup_sd(sensor_type), stream
-		);
-		if (streamret < 0) {
-			xSemaphoreGive(bhi160_mutex);
-			hwlock_release(HWLOCK_I2C);
-			return streamret;
-		}
-		vQueueDelete(stream->queue);
-		stream->queue = NULL;
-		int bhyret    = bhy_disable_virtual_sensor(vs_id, VS_WAKEUP);
-		if (bhyret < 0) {
-			xSemaphoreGive(bhi160_mutex);
-			hwlock_release(HWLOCK_I2C);
-			return bhyret;
-		}
+	if (xSemaphoreTake(bhi160_mutex, LOCK_WAIT) != pdTRUE) {
+		result = -EBUSY;
+		goto out_free_i2c;
+	}
 
-		bhi160_sensor_active[sensor_type] = false;
+	struct stream_info *stream = &bhi160_streams[sensor_type];
+	result = stream_deregister(bhi160_lookup_sd(sensor_type), stream);
+	if (result < 0) {
+		goto out_free_both;
+	}
 
-		xSemaphoreGive(bhi160_mutex);
-	} else {
-		hwlock_release(HWLOCK_I2C);
-		return -EBUSY;
+	vQueueDelete(stream->queue);
+	stream->queue = NULL;
+	result        = bhy_disable_virtual_sensor(vs_id, VS_WAKEUP);
+	if (result < 0) {
+		goto out_free_both;
 	}
 
+	bhi160_sensor_active[sensor_type] = false;
+
+	result = 0;
+out_free_both:
+	xSemaphoreGive(bhi160_mutex);
+out_free_i2c:
 	hwlock_release(HWLOCK_I2C);
-	return 0;
+	return result;
 }
 
 void epic_bhi160_disable_all_sensors()
@@ -331,18 +327,18 @@ static int bhi160_fetch_fifo(void)
 	 * You'll probably be best of leaving it as it is ...
 	 */
 
-	int ret = BHY_SUCCESS;
+	int result = 0;
 	/* Number of bytes left in BHI160's FIFO buffer */
 	uint16_t bytes_left_in_fifo = 1;
 
-	int lockret = hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(100));
-	if (lockret < 0) {
-		return lockret;
+	result = hwlock_acquire(HWLOCK_I2C, pdMS_TO_TICKS(100));
+	if (result < 0) {
+		return result;
 	}
 
 	if (xSemaphoreTake(bhi160_mutex, LOCK_WAIT) != pdTRUE) {
-		hwlock_release(HWLOCK_I2C);
-		return -EBUSY;
+		result = -EBUSY;
+		goto out_free_i2c;
 	}
 
 	while (bytes_left_in_fifo) {
@@ -364,14 +360,14 @@ static int bhi160_fetch_fifo(void)
 		while (bytes_left > 0) {
 			bhy_data_generic_t sensor_data;
 			bhy_data_type_t data_type;
-			ret = bhy_parse_next_fifo_packet(
+			result = bhy_parse_next_fifo_packet(
 				&fifo_ptr,
 				&bytes_left,
 				&sensor_data,
 				&data_type
 			);
 
-			if (ret == BHY_SUCCESS) {
+			if (result == BHY_SUCCESS) {
 				bhi160_handle_packet(data_type, &sensor_data);
 			} else {
 				break;
@@ -387,8 +383,9 @@ static int bhi160_fetch_fifo(void)
 	}
 
 	xSemaphoreGive(bhi160_mutex);
+out_free_i2c:
 	hwlock_release(HWLOCK_I2C);
-	return 0;
+	return result;
 }
 
 /*
-- 
GitLab