Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion general/include/mcp23008.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#include <stdint.h>

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;
Expand Down
12 changes: 8 additions & 4 deletions general/include/p3t1755.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down
98 changes: 63 additions & 35 deletions general/src/p3t1755.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -13,34 +14,38 @@ 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;
}

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;
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -126,75 +139,90 @@ 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;
}

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;
}

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));
}
6 changes: 2 additions & 4 deletions general/src/sht30.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "sht30.h"
#include <stdbool.h>
#include <stdio.h>
#include "c_utils.h"

//ner flash --ftdi for msb
static int sht30_write_reg(sht30_t *sht30, uint16_t command)
Expand Down Expand Up @@ -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)
{
Expand Down
21 changes: 21 additions & 0 deletions middleware/include/c_utils.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#ifndef C_UTILS
#define C_UTILS

#include <stdint.h>

/*
* Will retrieve the container of a certain pointer given the container type and
* its pointer Trick pulled from Linux Kernel
Expand Down Expand Up @@ -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 */
11 changes: 11 additions & 0 deletions middleware/src/c_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}