From d386d05fb7ae7981081e4beee390b239a2afe16c Mon Sep 17 00:00:00 2001
From: mj <mj370@protonmail.com>
Date: Sun, 27 Mar 2022 14:51:52 +0200
Subject: [PATCH] Re-order MODBUS registers; add Fahrenheit

---
 fw/Core/Inc/main.h  |  1 +
 fw/Core/Src/main.c  | 90 +++++++++++++++++++++++----------------------
 fw/Core/Src/scd4x.c |  7 +++-
 3 files changed, 54 insertions(+), 44 deletions(-)

diff --git a/fw/Core/Inc/main.h b/fw/Core/Inc/main.h
index 5e2126d..20ac803 100644
--- a/fw/Core/Inc/main.h
+++ b/fw/Core/Inc/main.h
@@ -102,6 +102,7 @@ int8_t uart_enable_interrupts(void);
 #define MEASUREMENT_PERIOD_S		6
 #define RESET_MAGIC_NUMBER 			0xABCD
 #define MODBUS_ASSERT(x)				if (x == 0) return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED
+#define CELSIUS_TO_FAHRENHEIT(x)		(x * 9 / 5 + 320)
 
 extern uint16_t usart2_rx_message_index;
 extern uint16_t usart2_rx_message_len;
diff --git a/fw/Core/Src/main.c b/fw/Core/Src/main.c
index 030cfc0..387c409 100644
--- a/fw/Core/Src/main.c
+++ b/fw/Core/Src/main.c
@@ -72,25 +72,28 @@ const uint16_t tim21_period = MEASUREMENT_PERIOD_S * (SYSTEM_CLOCK_HZ / tim21_pr
 /* Input registers memory map implementation */
 enum
 {
-	REGISTER_NUM_CO2 = 30010, /* ppm */
-	REGISTER_NUM_T_SHT4x = 30011, /* deg C */
-	REGISTER_NUM_RH_SHT4x = 30012, /* % */
-	REGISTER_NUM_T_SCD4x = 30013, /* deg C */
-	REGISTER_NUM_RH_SCD4x = 30014, /* % */
-	REGISTER_NUM_T_SHT4x_SIGNED = 30015, /* deg C */
-	REGISTER_NUM_T_SCD4x_SIGNED = 30016, /* deg C */
-	REGISTER_NUM_PMC_MASS_1_0 = 30017, /* ug / m^3 */
-	REGISTER_NUM_PMC_MASS_2_5 = 30018, /* ug / m^3 */
-	REGISTER_NUM_PMC_MASS_4_0 = 30019, /* ug / m^3 */
-	REGISTER_NUM_PMC_MASS_10_0 = 30020, /* ug / m^3 */
-	REGISTER_NUM_PMC_NUMBER_0_5 = 30021, /* 1 / m^3 */
-	REGISTER_NUM_PMC_NUMBER_1_0 = 30022, /* 1 / m^3 */
-	REGISTER_NUM_PMC_NUMBER_2_5 = 30023, /* 1 / m^3 */
-	REGISTER_NUM_PMC_NUMBER_4_0 = 30024, /* 1 / m^3 */
-	REGISTER_NUM_PMC_NUMBER_10_0 = 30025, /* 1 / m^3 */
-	REGISTER_NUM_TYPICAL_PARTICLE_SIZE = 30026, /* nm */
-	REGISTER_NUM_VOC_RAW = 30027, /* raw VOC ticks */
-	REGISTER_NUM_VOC_INDEX = 30028 /* VOC index as calculated by Sensirion library (1 to 500, average 100) */
+	REGISTER_NUM_T = 30010, /* deg C */
+	REGISTER_NUM_T_F = 30011, /* deg F */
+	REGISTER_NUM_RH = 30012, /* %, from SHT4x */
+	REGISTER_NUM_CO2 = 30013, /* ppm */
+	REGISTER_NUM_VOC_INDEX = 30014, /* VOC index as calculated by Sensirion library (1 to 500, average 100) */
+	REGISTER_NUM_VOC_TICKS = 30015, /* raw VOC ticks */
+	REGISTER_NUM_NOX_INDEX = 30016,
+	REGISTER_NUM_NOX_TICKS = 30017,
+	REGISTER_NUM_PMC_MASS_1_0 = 30018, /* ug / m^3 */
+	REGISTER_NUM_PMC_MASS_2_5 = 30019, /* ug / m^3 */
+	REGISTER_NUM_PMC_MASS_4_0 = 30020, /* ug / m^3 */
+	REGISTER_NUM_PMC_MASS_10_0 = 30021, /* ug / m^3 */
+	REGISTER_NUM_PMC_NUMBER_0_5 = 30022, /* 1 / m^3 */
+	REGISTER_NUM_PMC_NUMBER_1_0 = 30023, /* 1 / m^3 */
+	REGISTER_NUM_PMC_NUMBER_2_5 = 30024, /* 1 / m^3 */
+	REGISTER_NUM_PMC_NUMBER_4_0 = 30025, /* 1 / m^3 */
+	REGISTER_NUM_PMC_NUMBER_10_0 = 30026, /* 1 / m^3 */
+	REGISTER_NUM_TYPICAL_PARTICLE_SIZE = 30027, /* nm */
+	REGISTER_NUM_T_SCD4x = 30028, /* deg C */
+	REGISTER_NUM_T_SCD4x_F = 30029, /* deg F */
+	REGISTER_NUM_RH_SCD4x = 30030 /* % */
+
 	/* VOC Index has initial blackout beriod, when the data is not ready. VOC index is 0 during this period */
 } data_registers_numbers;
 
@@ -117,7 +120,7 @@ enum
 } identification_registers_numbers;
 
 /* Variables to store the measured data */
-int16_t T_SCD4x, T_SHT4x;
+int16_t T_SCD4x, T_SHT4x, TF_SCD4x, TF_SHT4x;
 uint16_t CO2, RH_SCD4x, RH_SHT4x;
 sps30_data_t PM_SPS30;
 /* VOC related varibles */
@@ -354,7 +357,7 @@ int main(void)
 		  /* TODO: Check the data */
 		  /* Read SHT4x data (always connected) */
 		  sht4x_measure(&T_SHT4x, &RH_SHT4x);
-
+		  TF_SHT4x = CELSIUS_TO_FAHRENHEIT(T_SHT4x);
 		  /* Read SCD4x data (if connected) */
 		  if (scd4x_is_connected == 1)
 		  {
@@ -362,6 +365,7 @@ int main(void)
 				  /* read failed, either I2C fail or CRC error */
 				  // TODO something
 			  }
+			  TF_SCD4x = CELSIUS_TO_FAHRENHEIT(T_SCD4x);
 			  if (CO2 > 0) {
 				  co2_valid = 1;
 			  } else {
@@ -871,26 +875,25 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction)
 			{
 				switch (register_number)
 				{
+					case REGISTER_NUM_T:
+						transaction->input_registers_signed[i] = (int16_t)T_SHT4x;
+						break;
+					case REGISTER_NUM_T_F:
+						transaction->input_registers_signed[i] = (int16_t)TF_SHT4x;
+						break;
+					case REGISTER_NUM_RH:
+						transaction->input_registers[i] = (uint16_t)RH_SHT4x;
+						break;
 					case REGISTER_NUM_CO2:
 						transaction->input_registers[i] = (uint16_t)CO2;
 						break;
-					case REGISTER_NUM_T_SHT4x:
-						transaction->input_registers[i] = (uint16_t)T_SHT4x;
+					case REGISTER_NUM_VOC_INDEX:
+						MODBUS_ASSERT(sgp40_is_connected);
+						transaction->input_registers[i] = (uint16_t)voc_index;
 						break;
-					case REGISTER_NUM_RH_SHT4x:
-						transaction->input_registers[i] = (uint16_t)RH_SHT4x;
-						break;
-					case REGISTER_NUM_T_SCD4x:
-						transaction->input_registers[i] = (uint16_t)T_SCD4x;
-						break;
-					case REGISTER_NUM_RH_SCD4x:
-						transaction->input_registers[i] = (uint16_t)RH_SCD4x;
-						break;
-					case REGISTER_NUM_T_SHT4x_SIGNED:
-						transaction->input_registers_signed[i] = (int16_t)T_SHT4x;
-						break;
-					case REGISTER_NUM_T_SCD4x_SIGNED:
-						transaction->input_registers_signed[i] = (int16_t)T_SCD4x;
+					case REGISTER_NUM_VOC_TICKS:
+						MODBUS_ASSERT(sgp40_is_connected);
+						transaction->input_registers[i] = (uint16_t)voc_ticks_compensated;
 						break;
 					case REGISTER_NUM_PMC_MASS_1_0:
 						MODBUS_ASSERT(sps30_is_connected);
@@ -932,13 +935,14 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction)
 						MODBUS_ASSERT(sps30_is_connected);
 						transaction->input_registers[i] = (uint16_t)PM_SPS30.typical_particle_size;
 						break;
-					case REGISTER_NUM_VOC_RAW:
-						MODBUS_ASSERT(sgp40_is_connected);
-						transaction->input_registers[i] = (uint16_t)voc_ticks_compensated;
+					case REGISTER_NUM_T_SCD4x:
+						transaction->input_registers_signed[i] = (int16_t)T_SCD4x;
 						break;
-					case REGISTER_NUM_VOC_INDEX:
-						MODBUS_ASSERT(sgp40_is_connected);
-						transaction->input_registers[i] = (uint16_t)voc_index;
+					case REGISTER_NUM_T_SCD4x_F:
+						transaction->input_registers_signed[i] = (int16_t)TF_SCD4x;
+						break;
+					case REGISTER_NUM_RH_SCD4x:
+						transaction->input_registers[i] = (uint16_t)RH_SCD4x;
 						break;
 					default:
 						return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED;
diff --git a/fw/Core/Src/scd4x.c b/fw/Core/Src/scd4x.c
index 958d35c..7c9bb9e 100644
--- a/fw/Core/Src/scd4x.c
+++ b/fw/Core/Src/scd4x.c
@@ -28,9 +28,14 @@ int8_t scd4x_send_cmd(scd4x_cmd_t cmd)
 int8_t scd4x_get_serial(uint8_t serial[6])
 {
 	uint8_t buffer[16];
+	int result;
 
 	scd4x_send_cmd(SCD4X_GET_SERIAL_NUMBER);
-	i2c_receive(SCD4X_I2C_ADDRESS << 1, buffer, 9);
+	result = i2c_receive(SCD4X_I2C_ADDRESS << 1, buffer, 9);
+	if (result != I2C_OK) {
+		return SCD4X_ERROR;
+	}
+	return SCD4X_OK;
 }
 
 int8_t scd4x_read_data(uint8_t *buffer, int len)