diff --git a/fw/.cproject b/fw/.cproject
index ad8564f..0fe3c15 100644
--- a/fw/.cproject
+++ b/fw/.cproject
@@ -32,6 +32,7 @@
@@ -61,6 +62,7 @@
+
@@ -90,6 +92,7 @@
+
@@ -124,6 +127,7 @@
@@ -152,6 +156,7 @@
+
diff --git a/fw/Core/Inc/sgp40.h b/fw/Core/Inc/sgp40.h
deleted file mode 100644
index e4faf01..0000000
--- a/fw/Core/Inc/sgp40.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * sgp4x.h
- *
- * Created on: Jan 9, 2022
- * Author: david
- */
-
-#ifndef INC_SGP40_H_
-#define INC_SGP40_H_
-
-
-#include "stdint.h"
-#include "stm32l0xx_ll_i2c.h"
-#include "stm32l0xx_ll_utils.h"
-#include "i2c.h"
-#include "crc8.h"
-
-/*
- * Defines & macros
- */
-
-#define SGP40_I2C_ADDRESS 0x59
-#define SGP40_MAX_MEAS_DURATION_MS 50
-
-/*
- * Return values
- */
-
-#define SGP40_OK 0
-#define SGP40_ERROR -1 // generic error
-#define SGP40_CRC8_ERROR -2 // checksum failed
-
-typedef enum {
- SGP40_MEASURE_RAW_SIGNAL = 0x260F,
- SGP40_EXECUTE_SELF_TEST = 0x280E,
- SGP40_TURN_HEATER_OFF = 0x3615,
- SGP40_GET_SERIAL_NUMBER = 0x3682,
- SGP40_SOFT_RESET = 0x0006
-} sgp40_cmd_t;
-
-int8_t sgp40_send_cmd(sgp40_cmd_t cmd);
-
-int8_t sgp40_measure_raw_signal (uint16_t * voc_ticks);
-int8_t sgp40_measure_raw_signal_compensated (uint16_t * voc_ticks, uint16_t relative_humidity, int16_t temperature);
-int8_t sgp40_execute_self_test ( uint8_t * test_result);
-int8_t sgp40_get_serial_number ( uint8_t serial[6]);
-int8_t sgp40_turn_heater_off ( void );
-int8_t sgp40_soft_reset ( void );
-
-#endif /* INC_SGP40_H_ */
diff --git a/fw/Core/Src/main.c b/fw/Core/Src/main.c
index 768820d..7854de1 100644
--- a/fw/Core/Src/main.c
+++ b/fw/Core/Src/main.c
@@ -198,6 +198,26 @@ int8_t sht4x_enable_interrupts(void)
uart_enable_interrupts();
}
+int8_t sgp40_i2c_transmit(uint8_t address, uint8_t *buffer, int len)
+{
+ i2c_transmit(address, buffer, len);
+}
+
+int8_t sgp40_i2c_receive(uint8_t address, uint8_t *buffer, int len)
+{
+ i2c_receive(address, buffer, len);
+}
+
+int8_t sgp40_disable_interrupts(void)
+{
+ uart_disable_interrupts();
+}
+
+int8_t sgp40_enable_interrupts(void)
+{
+ uart_enable_interrupts();
+}
+
void delay_ms(int delay_ms)
{
LL_mDelay(delay_ms);
diff --git a/fw/Core/Src/sgp40.c b/fw/Core/Src/sgp40.c
deleted file mode 100644
index d5c65d0..0000000
--- a/fw/Core/Src/sgp40.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * SGP40.c
- *
- * Created on: Jan 9, 2022
- * Author: david
- */
-
-#include
-#include "main.h" /* for uart_disable_interrupts() */
-
-int8_t sgp40_send_cmd(sgp40_cmd_t cmd)
-{
- uint8_t buffer[32];
- int result;
-
- // start measurement
- buffer[0] = cmd >> 8;
- buffer[1] = cmd & 0x00ff;
- uart_disable_interrupts();
- result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 2);
- uart_enable_interrupts();
- if (result == I2C_ERROR_TX_INCOMPLETE) {
- return SGP40_ERROR;
- }
-
- /* Sensirion sensors return NACK after last byte (so NACK at the end is ok) */
- return SGP40_OK;
-}
-
-int8_t sgp40_measure_raw_signal(uint16_t * voc_ticks)
-{
- uint8_t buffer[32];
- int result;
-
- /* Start measurement */
- buffer[0] = 0x26;
- buffer[1] = 0x0F;
- buffer[2] = 0x80;
- buffer[3] = 0x00;
- buffer[4] = 0xA2;
- buffer[5] = 0x66;
- buffer[6] = 0x66;
- buffer[7] = 0x93;
-
- /* Returns NACK if CRC is wrong */
- uart_disable_interrupts();
- result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 8);
- uart_enable_interrupts();
- if (result != I2C_OK) {
- return SGP40_ERROR;
- }
-
- LL_mDelay(SGP40_MAX_MEAS_DURATION_MS); // 30ms
-
- uart_disable_interrupts();
- result = i2c_receive(SGP40_I2C_ADDRESS<<1, buffer, 3);
- uart_enable_interrupts();
- if (result != I2C_OK)
- {
- return SGP40_ERROR;
- }
-
- *voc_ticks = (buffer[0] << 8) + buffer[1];
- uint8_t voc_ticks_crc = buffer[2];
- uint8_t crc_correct = crc8_calculate(buffer, 2) == voc_ticks_crc;
- if (!crc_correct) {
- return SGP40_CRC8_ERROR;
- }
- return SGP40_OK;
-
-}
-
-int8_t sgp40_measure_raw_signal_compensated(uint16_t * voc_ticks, uint16_t relative_humidity, int16_t temperature)
-{
- uint8_t buffer[32];
- int result;
-
- uint16_t rh_ticks = (uint16_t)((uint32_t)relative_humidity * 65535 / 100);
- uint16_t t_ticks = (uint16_t)(((uint32_t)temperature/10 + 45) * 65535 / 175);
-
- buffer[0] = SGP40_MEASURE_RAW_SIGNAL >> 8;
- buffer[1] = SGP40_MEASURE_RAW_SIGNAL & 0x00ff;
- buffer[2] = (uint8_t)(rh_ticks >> 8);
- buffer[3] = (uint8_t)rh_ticks;
- buffer[4] = crc8_calculate(buffer+2, 2);
- buffer[5] = (uint8_t)(t_ticks >> 8);
- buffer[6] = (uint8_t)t_ticks;
- buffer[7] = crc8_calculate(buffer+5, 2);
-
- /* Returns NACK if CRC is wrong */
- uart_disable_interrupts();
- result = i2c_transmit(SGP40_I2C_ADDRESS<<1, buffer, 8);
- uart_enable_interrupts();
- if (result != I2C_OK) {
- return SGP40_ERROR;
- }
-
- LL_mDelay(SGP40_MAX_MEAS_DURATION_MS); // 30ms
-
- uart_disable_interrupts();
- result = i2c_receive(SGP40_I2C_ADDRESS<<1, buffer, 3);
- uart_enable_interrupts();
- if (result != I2C_OK)
- {
- return SGP40_ERROR;
- }
-
- *voc_ticks = (buffer[0] << 8) + buffer[1];
- uint8_t voc_ticks_crc = buffer[2];
- uint8_t crc_correct = crc8_calculate(buffer, 2) == voc_ticks_crc;
- if (!crc_correct) {
- return SGP40_CRC8_ERROR;
- }
- return SGP40_OK;
-}
-
-int8_t SGP40_execute_self_test ( uint8_t * test_result)
-{
- uint8_t buffer[16];
- int8_t result;
-
- result = sgp40_send_cmd(SGP40_EXECUTE_SELF_TEST);
- if (result != I2C_OK) {
- return SGP40_ERROR;
- }
-
- LL_mDelay(350);
-
- uart_disable_interrupts();
- result = i2c_receive(SGP40_I2C_ADDRESS << 1, buffer, 3);
- uart_enable_interrupts();
- if (result != I2C_OK) {
- return SGP40_ERROR;
- }
-
- test_result = buffer[0];
- uint8_t test_result_crc = buffer[2];
-
- uint8_t crc_correct = crc8_calculate(buffer, 2) == test_result_crc;
- if (!crc_correct) {
- return SGP40_CRC8_ERROR;
- }
- return SGP40_OK;
-}
-
-int8_t SGP40_get_serial_number(uint8_t serial[6])
-{
- uint8_t buffer[16];
-
- uart_disable_interrupts();
- sgp40_send_cmd(SGP40_GET_SERIAL_NUMBER);
- uart_enable_interrupts();
-
- LL_mDelay(5);
-
- uart_disable_interrupts();
- i2c_receive(SGP40_I2C_ADDRESS << 1, buffer, 9);
- uart_enable_interrupts();
-
- serial[0] = buffer[0];
- serial[1] = buffer[1];
- uint8_t crc_ser01 = buffer[3];
- serial[2] = buffer[4];
- serial[3] = buffer[5];
- uint8_t crc_ser23 = buffer[6];
- serial[4] = buffer[7];
- serial[5] = buffer[8];
- uint8_t crc_ser45 = buffer[9];
-
- uint8_t crc_correct = crc8_calculate(buffer, 2) == crc_ser01;
- crc_correct &= crc8_calculate(buffer + 3, 2) == crc_ser23;
- crc_correct &= crc8_calculate(buffer + 6, 2) == crc_ser45;
- if (!crc_correct) {
- return SGP40_CRC8_ERROR;
- }
- return SGP40_OK;
-}
-
-int8_t SGP40_turn_heater_off(void)
-{
- return sgp40_send_cmd(SGP40_TURN_HEATER_OFF);
-}
-int8_t SGP40_soft_reset(void)
-{
- return sgp40_send_cmd(SGP40_SOFT_RESET);
-}
diff --git a/fw/Libs/sgp40 b/fw/Libs/sgp40
index a0ed612..cd15bbf 160000
--- a/fw/Libs/sgp40
+++ b/fw/Libs/sgp40
@@ -1 +1 @@
-Subproject commit a0ed61200d27028b93251ef5f8d4d04f96860c4f
+Subproject commit cd15bbfa2496a10240519b4a6cd13bee875fd130