diff --git a/general/include/mcp23008.h b/general/include/mcp23008.h index ec1110b8..5ecbf909 100644 --- a/general/include/mcp23008.h +++ b/general/include/mcp23008.h @@ -3,7 +3,7 @@ #include -typedef int (*write_ptr)(uint8_t addr, const uint8_t *data, uint8_t len); +typedef int (*write_ptr)(uint8_t addr, uint8_t *data, uint8_t len); typedef int (*read_ptr)(uint8_t addr, uint8_t *data, uint8_t len); typedef struct { write_ptr write; diff --git a/general/include/p3t1755.h b/general/include/p3t1755.h index e79041e9..7ecf3b3f 100644 --- a/general/include/p3t1755.h +++ b/general/include/p3t1755.h @@ -50,8 +50,10 @@ #define p3t1755_220MS_CONVERSION_TIME 0x60 // Function Pointers -typedef int (*WritePtr)(uint16_t dev_addr, uint16_t reg, uint16_t *data); -typedef int (*ReadPtr)(uint16_t dev_addr, uint16_t reg, uint16_t *data); +typedef int32_t (*WritePtr)(uint16_t dev_addr, uint16_t reg, uint8_t *data, + uint8_t length); +typedef int32_t (*ReadPtr)(uint16_t dev_addr, uint16_t reg, uint8_t *data, + uint8_t length); typedef struct { uint16_t dev_addr; @@ -62,8 +64,10 @@ typedef struct { void p3t1755_init(p3t1755_t *p3t, WritePtr write, ReadPtr read, uint16_t dev_addr); -int p3t1755_read_reg(p3t1755_t *p3t, uint16_t reg, uint16_t *data); -int p3t1755_write_reg(p3t1755_t *p3t, uint16_t reg, uint16_t *data); +int p3t1755_read_reg(p3t1755_t *p3t, uint16_t reg, uint8_t *data, + uint8_t length); +int p3t1755_write_reg(p3t1755_t *p3t, uint16_t reg, uint8_t *data, + uint8_t length); // Reads current temp in celcius int p3t1755_read_temperature(p3t1755_t *p3t, float *temp_c); diff --git a/general/src/p3t1755.c b/general/src/p3t1755.c index e43c33f3..3dbccf1e 100644 --- a/general/src/p3t1755.c +++ b/general/src/p3t1755.c @@ -4,6 +4,7 @@ */ #include "p3t1755.h" +#include "c_utils.h" void p3t1755_init(p3t1755_t *p3t, WritePtr write, ReadPtr read, uint16_t dev_addr) @@ -13,26 +14,30 @@ void p3t1755_init(p3t1755_t *p3t, WritePtr write, ReadPtr read, p3t->dev_addr = dev_addr; } -int p3t1755_write_reg(p3t1755_t *p3t, uint16_t reg, uint16_t *data) +int p3t1755_write_reg(p3t1755_t *p3t, uint16_t reg, uint8_t *data, + uint8_t length) { - return p3t->write(p3t->dev_addr, reg, data); + return p3t->write(p3t->dev_addr, reg, data, length); } -int p3t1755_read_reg(p3t1755_t *p3t, uint16_t reg, uint16_t *data) +int p3t1755_read_reg(p3t1755_t *p3t, uint16_t reg, uint8_t *data, + uint8_t length) { - return p3t->read(p3t->dev_addr, reg, data); + return p3t->read(p3t->dev_addr, reg, data, length); } int p3t1755_read_temperature(p3t1755_t *p3t, float *temp_c) { - uint16_t temp_reg; + uint8_t temp_reg[2]; - int status = p3t1755_read_reg(p3t, p3t1755_TEMPERATURE, &temp_reg); + int status = p3t1755_read_reg(p3t, p3t1755_TEMPERATURE, temp_reg, + sizeof(temp_reg)); if (status != 0) { return status; } - *temp_c = p3t1755_RAW_TO_CELSIUS(temp_reg); + *temp_c = p3t1755_RAW_TO_CELSIUS( + uint8_to_uint16(temp_reg[0], temp_reg[1])); return status; } @@ -40,7 +45,7 @@ int p3t1755_configure(p3t1755_t *p3t, uint8_t shutdown, uint8_t thermostat, uint8_t polarity, uint8_t fault_queue, uint8_t conversion_time) { - uint16_t config = 0; + uint8_t config = 0; if (shutdown) { config |= p3t1755_SHUTDOWN_MODE_MASK; @@ -54,14 +59,16 @@ int p3t1755_configure(p3t1755_t *p3t, uint8_t shutdown, uint8_t thermostat, config |= (fault_queue & p3t1755_FAULT_QUEUE_MASK); config |= (conversion_time & p3t1755_CONVERSION_TIME_MASK); - return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config); + return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); } int p3t1755_set_shutdown_mode(p3t1755_t *p3t, uint8_t enable) { - uint16_t config; + uint8_t config; - int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config); + int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); if (status != 0) { return status; } @@ -72,14 +79,16 @@ int p3t1755_set_shutdown_mode(p3t1755_t *p3t, uint8_t enable) config &= ~p3t1755_SHUTDOWN_MODE_MASK; } - return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config); + return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); } int p3t1755_set_thermostat_mode(p3t1755_t *p3t, uint8_t enable) { - uint16_t config; + uint8_t config; - int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config); + int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); if (status != 0) { return status; } @@ -90,14 +99,16 @@ int p3t1755_set_thermostat_mode(p3t1755_t *p3t, uint8_t enable) config &= ~p3t1755_THERMOSTAT_MODE_MASK; } - return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config); + return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); } int p3t1755_set_one_shot_mode(p3t1755_t *p3t, uint8_t enable) { - uint16_t config; + uint8_t config; - int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config); + int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); if (status != 0) { return status; } @@ -108,14 +119,16 @@ int p3t1755_set_one_shot_mode(p3t1755_t *p3t, uint8_t enable) config &= ~p3t1755_ONE_SHOT_MASK; } - return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config); + return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); } int p3t1755_set_polarity(p3t1755_t *p3t, uint8_t setting) { - uint16_t config; + uint8_t config; - int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config); + int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); if (status != 0) { return status; } @@ -126,14 +139,16 @@ int p3t1755_set_polarity(p3t1755_t *p3t, uint8_t setting) config &= ~p3t1755_POLARITY_MASK; } - return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config); + return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); } int p3t1755_set_fault_queue(p3t1755_t *p3t, uint8_t data) { - uint16_t config; + uint8_t config; - int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config); + int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); if (status != 0) { return status; } @@ -141,14 +156,16 @@ int p3t1755_set_fault_queue(p3t1755_t *p3t, uint8_t data) config &= ~p3t1755_FAULT_QUEUE_MASK; config |= (data & p3t1755_FAULT_QUEUE_MASK); - return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config); + return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); } int p3t1755_set_conversion_time(p3t1755_t *p3t, uint8_t data) { - uint16_t config; + uint8_t config; - int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config); + int status = p3t1755_read_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); if (status != 0) { return status; } @@ -156,45 +173,56 @@ int p3t1755_set_conversion_time(p3t1755_t *p3t, uint8_t data) config &= ~p3t1755_CONVERSION_TIME_MASK; config |= (data & p3t1755_CONVERSION_TIME_MASK); - return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config); + return p3t1755_write_reg(p3t, p3t1755_CONFIGURATION, &config, + sizeof(config)); } int p3t1755_read_high_temp(p3t1755_t *p3t, float *temp_c) { - uint16_t high_temp_reg; + uint8_t high_temp_reg[2]; - int status = p3t1755_read_reg(p3t, p3t1755_T_HIGH, &high_temp_reg); + int status = p3t1755_read_reg(p3t, p3t1755_T_HIGH, high_temp_reg, + sizeof(high_temp_reg)); if (status != 0) { return status; } - *temp_c = p3t1755_RAW_TO_CELSIUS(high_temp_reg); + *temp_c = p3t1755_RAW_TO_CELSIUS( + uint8_to_uint16(high_temp_reg[0], high_temp_reg[1])); return status; } int p3t1755_read_low_temp(p3t1755_t *p3t, float *temp_c) { - uint16_t low_temp_reg; + uint8_t low_temp_reg[2]; - int status = p3t1755_read_reg(p3t, p3t1755_T_LOW, &low_temp_reg); + int status = p3t1755_read_reg(p3t, p3t1755_T_LOW, low_temp_reg, + sizeof(low_temp_reg)); if (status != 0) { return status; } - *temp_c = p3t1755_RAW_TO_CELSIUS(low_temp_reg); + *temp_c = p3t1755_RAW_TO_CELSIUS( + uint8_to_uint16(low_temp_reg[0], low_temp_reg[1])); return status; } int p3t1755_set_high_temp(p3t1755_t *p3t, float temp_c) { uint16_t raw_temp = p3t1755_CELSIUS_TO_RAW(temp_c); + uint8_t temp_data[2]; + uint16_to_uint8(raw_temp, temp_data); - return p3t1755_write_reg(p3t, p3t1755_T_HIGH, &raw_temp); + return p3t1755_write_reg(p3t, p3t1755_T_HIGH, temp_data, + sizeof(temp_data)); } int p3t1755_set_low_temp(p3t1755_t *p3t, float temp_c) { uint16_t raw_temp = p3t1755_CELSIUS_TO_RAW(temp_c); + uint8_t temp_data[2]; + uint16_to_uint8(raw_temp, temp_data); - return p3t1755_write_reg(p3t, p3t1755_T_LOW, &raw_temp); + return p3t1755_write_reg(p3t, p3t1755_T_LOW, temp_data, + sizeof(temp_data)); } \ No newline at end of file diff --git a/general/src/sht30.c b/general/src/sht30.c index 390a25c9..98a98fb6 100644 --- a/general/src/sht30.c +++ b/general/src/sht30.c @@ -1,6 +1,7 @@ #include "sht30.h" #include #include +#include "c_utils.h" //ner flash --ftdi for msb static int sht30_write_reg(sht30_t *sht30, uint16_t command) @@ -40,10 +41,7 @@ static uint8_t calculate_crc(const uint8_t *data, size_t length) } return crc; } -static uint16_t uint8_to_uint16(uint8_t msb, uint8_t lsb) -{ - return ((uint16_t)msb << 8) | ((uint16_t)lsb); -} + uint8_t sht30_init(sht30_t *sht30, Write_ptr write_reg, Read_ptr read_reg, Read_ptr blocking_read_reg, uint8_t dev_address) { diff --git a/middleware/include/c_utils.h b/middleware/include/c_utils.h index 10c62cd2..ac357404 100644 --- a/middleware/include/c_utils.h +++ b/middleware/include/c_utils.h @@ -1,6 +1,8 @@ #ifndef C_UTILS #define C_UTILS +#include + /* * Will retrieve the container of a certain pointer given the container type and * its pointer Trick pulled from Linux Kernel @@ -68,4 +70,23 @@ unsigned char reverse_bits(unsigned char b); */ float linear_interpolate(float x, float x1, float x2, float y1, float y2); +/** + * combines two uint8_t into a uint16_t + * + * @param msb most significant byte + * @param lsb least significant byte + * + * @return combined uint16_t + */ +uint16_t uint8_to_uint16(uint8_t msb, uint8_t lsb); + +/** + * sseparates a uint16_t into two uint8_t + * + * @param value uint16_t to separate + * @param arr resulting array of 2 uint8_t (MSB is first) + * + */ +void uint16_to_uint8(uint16_t value, uint8_t arr[2]); + #endif /* C_UTILS */ \ No newline at end of file diff --git a/middleware/src/c_utils.c b/middleware/src/c_utils.c index 1afcc5f0..c64df63a 100644 --- a/middleware/src/c_utils.c +++ b/middleware/src/c_utils.c @@ -29,4 +29,15 @@ float linear_interpolate(float x, float x1, float x2, float y1, float y2) assert(fabs(x2 - x1) > FLOAT_EPSILON); return y1 + ((x - x1) * (y2 - y1) / (x2 - x1)); +} + +uint16_t uint8_to_uint16(uint8_t msb, uint8_t lsb) +{ + return ((uint16_t)msb << 8) | ((uint16_t)lsb); +} + +void uint16_to_uint8(uint16_t value, uint8_t arr[2]) +{ + arr[1] = (uint8_t)value; + arr[0] = (uint8_t)(value >> 8); } \ No newline at end of file