firmware: bosch_bmp280: Free I2cTranfer struct on error
Change-Id: I3b34a3465ebee72081132dbd7de49e7079106452
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
diff --git a/firmware/os/drivers/bosch_bmp280/bosch_bmp280.c b/firmware/os/drivers/bosch_bmp280/bosch_bmp280.c
index 8525a23..eb588f6 100644
--- a/firmware/os/drivers/bosch_bmp280/bosch_bmp280.c
+++ b/firmware/os/drivers/bosch_bmp280/bosch_bmp280.c
@@ -188,6 +188,12 @@
return NULL;
}
+// Helper function to release I2cTransfer structure
+static inline void releaseXfer(struct I2cTransfer *xfer)
+{
+ xfer->inUse = false;
+}
+
// Helper function to write a one byte register. Returns true if we got a
// successful return value from i2cMasterTx().
static bool writeRegister(uint8_t reg, uint8_t value, uint8_t state)
@@ -199,6 +205,8 @@
xfer->txrxBuf[0] = reg;
xfer->txrxBuf[1] = value;
ret = i2cMasterTx(I2C_BUS_ID, I2C_ADDR, xfer->txrxBuf, 2, i2cCallback, xfer);
+ if (ret)
+ releaseXfer(xfer);
}
return (ret == 0);
@@ -472,15 +480,17 @@
{
union EmbeddedDataPoint embeddedSample;
struct SingleAxisDataEvent *baroSample;
-
struct I2cTransfer *newXfer;
+ int ret;
switch (xfer->state) {
case STATE_RESET: {
newXfer = allocXfer(STATE_VERIFY_ID);
if (newXfer != NULL) {
newXfer->txrxBuf[0] = BOSCH_BMP280_REG_ID;
- i2cMasterTxRx(I2C_BUS_ID, I2C_ADDR, newXfer->txrxBuf, 1, newXfer->txrxBuf, 1, i2cCallback, newXfer);
+ ret = i2cMasterTxRx(I2C_BUS_ID, I2C_ADDR, newXfer->txrxBuf, 1, newXfer->txrxBuf, 1, i2cCallback, newXfer);
+ if (ret)
+ releaseXfer(newXfer);
}
break;
}
@@ -496,7 +506,9 @@
newXfer = allocXfer(STATE_AWAITING_COMP_PARAMS);
if (newXfer != NULL) {
newXfer->txrxBuf[0] = BOSCH_BMP280_REG_DIG_T1;
- i2cMasterTxRx(I2C_BUS_ID, I2C_ADDR, newXfer->txrxBuf, 1, (uint8_t*)&mTask.comp, 24, i2cCallback, newXfer);
+ ret = i2cMasterTxRx(I2C_BUS_ID, I2C_ADDR, newXfer->txrxBuf, 1, (uint8_t*)&mTask.comp, 24, i2cCallback, newXfer);
+ if (ret)
+ releaseXfer(newXfer);
}
break;
@@ -533,6 +545,7 @@
}
case STATE_FINISH_INIT: {
+ osLog(LOG_INFO, "[BMP280] detected\n");
sensorRegisterInitComplete(mTask.baroHandle);
sensorRegisterInitComplete(mTask.tempHandle);
break;
@@ -577,12 +590,13 @@
break;
}
- xfer->inUse = false;
+ releaseXfer(xfer);
}
static void handleEvent(uint32_t evtType, const void* evtData)
{
struct I2cTransfer *newXfer;
+ int ret;
switch (evtType) {
case EVT_APP_START:
@@ -608,7 +622,9 @@
newXfer = allocXfer(STATE_SAMPLING);
if (newXfer != NULL) {
newXfer->txrxBuf[0] = BOSCH_BMP280_REG_PRES_MSB;
- i2cMasterTxRx(I2C_BUS_ID, I2C_ADDR, newXfer->txrxBuf, 1, newXfer->txrxBuf, 6, i2cCallback, newXfer);
+ ret = i2cMasterTxRx(I2C_BUS_ID, I2C_ADDR, newXfer->txrxBuf, 1, newXfer->txrxBuf, 6, i2cCallback, newXfer);
+ if (ret)
+ releaseXfer(newXfer);
}
}
@@ -623,7 +639,9 @@
newXfer = allocXfer(STATE_SAMPLING);
if (newXfer != NULL) {
newXfer->txrxBuf[0] = BOSCH_BMP280_REG_PRES_MSB;
- i2cMasterTxRx(I2C_BUS_ID, I2C_ADDR, newXfer->txrxBuf, 1, newXfer->txrxBuf, 6, i2cCallback, newXfer);
+ ret = i2cMasterTxRx(I2C_BUS_ID, I2C_ADDR, newXfer->txrxBuf, 1, newXfer->txrxBuf, 6, i2cCallback, newXfer);
+ if (ret)
+ releaseXfer(newXfer);
}
}