Skip to content

Commit

Permalink
prenode-spifixedfframe
Browse files Browse the repository at this point in the history
  • Loading branch information
endail committed Jan 25, 2025
1 parent 5ff5f49 commit 05a36d2
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 93 deletions.
2 changes: 2 additions & 0 deletions include/hx711_i2c_master.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ typedef struct {
uint8_t addr;
} hx711_i2c_master_config_t;

// TODO: add error codes2

void hx711_i2c_serialise_request(
const hx711_remote_request_t* const req,
uint8_t* const buffer);
Expand Down
59 changes: 28 additions & 31 deletions include/spifixedframe.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ typedef enum {
SPIFIXEDFRAME_ERROR_BYTE_LIMIT_EXCEEDED = -3,
SPIFIXEDFRAME_ERROR_FRAME_LIMIT_EXCEEDED = -4,
SPIFIXEDFRAME_ERROR_CHAIN_NO_FIRST = -5,
SPIFIXEDFRAME_ERROR_CHAIN_MULTIPLE_FIRST = -6,
SPIFIXEDFRAME_ERROR_CHAIN_MULTIPLE_FIRST = -6,
SPIFIXEDFRAME_ERROR_TIMEOUT = -7,
SPIFIXEDFRAME_ERROR_TRY_LIMIT_EXCEEDED = -8,
SPIFIXEDFRAME_ERROR_SPI_GENERIC = -9,
Expand All @@ -69,47 +69,32 @@ typedef enum {
SPIFIXEDFRAME_ERROR_TOO_FEW_BYTES = -14
} spifixedframe_error_t;

typedef struct spifixedframe_buffer_node_t {
struct spifixedframe_buffer_node_t* next;
uint8_t* bytes;
size_t len;
} spifixedframe_buffer_node_t;

#define SPIFIXEDFRAME_CHECK_FRAME_COUNT(COUNT) \
do { \
\
if(COUNT == 0) { \
return SPIFIXEDFRAME_ERROR_TOO_FEW_FRAMES; \
} \
\
if(COUNT > SPIFIXEDFRAME_MAX_FRAMES) { \
return SPIFIXEDFRAME_ERROR_FRAME_LIMIT_EXCEEDED; \
} \
\
UTIL_RETURNIF(COUNT == 0, SPIFIXEDFRAME_ERROR_TOO_FEW_FRAMES); \
UTIL_RETURNIF(COUNT > SPIFIXEDFRAME_MAX_FRAMES, SPIFIXEDFRAME_ERROR_FRAME_LIMIT_EXCEEDED); \
} \
while(0)

#define SPIFIXEDFRAME_CHECK_BYTE_COUNT(COUNT) \
do { \
\
if(COUNT == 0) { \
return SPIFIXEDFRAME_ERROR_TOO_FEW_BYTES; \
} \
\
if(COUNT > SPIFIXEDFRAME_MAX_BYTES) { \
return SPIFIXEDFRAME_ERROR_BYTE_LIMIT_EXCEEDED; \
} \
\
UTIL_RETURNIF(COUNT == 0, SPIFIXEDFRAME_ERROR_TOO_FEW_BYTES); \
UTIL_RETURNIF(COUNT > SPIFIXEDFRAME_MAX_BYTES, SPIFIXEDFRAME_ERROR_BYTE_LIMIT_EXCEEDED); \
} \
while(0)

#define SPIFIXEDFRAME_CHECK_CHAIN(FRAMES, FRAME_LEN) \
do { \
\
if(!FRAMES[0].is_first) { \
return SPIFIXEDFRAME_ERROR_CHAIN_NO_FIRST; \
UTIL_RETURNIF(!FRAMES[0].is_first, SPIFIXEDFRAME_ERROR_CHAIN_NO_FIRST); \
for(size_t _spifixedframe_check_chain_i = 1; _spifixedframe_check_chain_i < FRAME_LEN; ++_spifixedframe_check_chain_i) { \
UTIL_RETURNIF(FRAMES[_spifixedframe_check_chain_i].is_first, SPIFIXEDFRAME_ERROR_CHAIN_MULTIPLE_FIRST); \
} \
\
for(size_t i = 1; i < FRAME_LEN; ++i) { \
if(FRAMES[i].is_first) { \
return SPIFIXEDFRAME_ERROR_CHAIN_MULTIPLE_FIRST; \
} \
} \
\
} \
while(0)

Expand Down Expand Up @@ -177,14 +162,26 @@ void spifixedframe_deserialise(
* @param spi
* @param bytes
* @param byte_len
* @return true
* @return false
* @return spifixedframe_error_t
*/
spifixedframe_error_t spifixedframe_send_bytes(
spi_inst_t* const spi,
const uint8_t* const bytes,
const size_t byte_len);

/**
* @brief Send a fixed number of bytes with error correction.
*
* @param spi
* @param bytes
* @param byte_len
* @return spifixedframe_error_t
*/
spifixedframe_error_t spifixedframe_send_bytes_ec(
spi_inst_t* const spi,
const uint8_t* const bytes,
const size_t byte_len);

/**
* @brief Receive a fixed number of bytes.
*
Expand Down
37 changes: 29 additions & 8 deletions include/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ extern "C" {
#define UTIL_ROUTABLE_PIO_INTERRUPT_NUM_MIN 0u
#define UTIL_ROUTABLE_PIO_INTERRUPT_NUM_MAX 3u

#define UTIL_RETURNIF(COND, VALUE) if(COND) return (VALUE)
#define UTIL_BREAKIF(COND) if(COND) break
#define UTIL_CONTINUEIF(COND) if(COND) continue

/**
* @brief Own a mutex for the duration of this block of
* code.
Expand Down Expand Up @@ -151,6 +155,7 @@ UTIL__DEF_IN_RANGE_FUNC(int32_t)
UTIL__DEF_IN_RANGE_FUNC(uint32_t)
UTIL__DEF_IN_RANGE_FUNC(int)
UTIL__DEF_IN_RANGE_FUNC(uint)
UTIL__DEF_IN_RANGE_FUNC(size_t)

#undef UTIL__DECL_IN_RANGE_FUNC
#undef UTIL__DEF_IN_RANGE_FUNC
Expand Down Expand Up @@ -184,10 +189,14 @@ inline uint8_t util_set_bits8(
const uint8_t len,
const uint8_t bits) {

assert(startbit >= 0 && startbit <= (UINT8_WIDTH - 1));
assert(len >= 1 && len <= UINT8_WIDTH);
assert(util_uint_in_range(startbit, 0, UINT8_WIDTH - 1));
assert(util_uint_in_range(len, 1, UINT8_WIDTH));
assert((startbit + len) <= UINT8_WIDTH);

//assert(startbit >= 0 && startbit <= (UINT8_WIDTH - 1));
//assert(len >= 1 && len <= UINT8_WIDTH);
//assert((startbit + len) <= UINT8_WIDTH);

const uint8_t mask = ((1 << len) - 1) << startbit;
value &= ~mask;
value |= (bits << startbit);
Expand All @@ -208,10 +217,14 @@ inline uint8_t util_get_bits8(
const uint8_t startbit,
const uint8_t len) {

assert(startbit >= 0 && startbit <= (UINT8_WIDTH - 1));
assert(len >= 1 && len <= UINT8_WIDTH);
assert(util_uint_in_range(startbit, 0, UINT8_WIDTH - 1));
assert(util_uint_in_range(len, 1, UINT8_WIDTH));
assert((startbit + len) <= UINT8_WIDTH);

//assert(startbit >= 0 && startbit <= (UINT8_WIDTH - 1));
//assert(len >= 1 && len <= UINT8_WIDTH);
//assert((startbit + len) <= UINT8_WIDTH);

const uint8_t mask = ((1 << len) - 1) << startbit;
const uint8_t extracted = (value & mask) >> startbit;

Expand All @@ -225,10 +238,14 @@ inline uint16_t util_set_bits16(
const uint8_t len,
const uint16_t bits) {

assert(startbit >= 0 && startbit <= (UINT16_WIDTH - 1));
assert(len >= 1 && len <= UINT16_WIDTH);
assert(util_uint_in_range(startbit, 0, UINT16_WIDTH - 1));
assert(util_uint_in_range(len, 1, UINT16_WIDTH));
assert((startbit + len) <= UINT16_WIDTH);

//assert(startbit >= 0 && startbit <= (UINT16_WIDTH - 1));
//assert(len >= 1 && len <= UINT16_WIDTH);
//assert((startbit + len) <= UINT16_WIDTH);

const uint16_t mask = ((1 << len) - 1) << startbit;
value &= ~mask;
value |= (bits << startbit);
Expand All @@ -241,10 +258,14 @@ inline uint16_t util_get_bits16(
const uint8_t startbit,
const uint8_t len) {

assert(startbit >= 0 && startbit <= (UINT16_WIDTH - 1));
assert(len >= 1 && len <= UINT16_WIDTH);
assert(util_uint_in_range(startbit, 0, UINT16_WIDTH - 1));
assert(util_uint_in_range(len, 1, UINT16_WIDTH));
assert((startbit + len) <= UINT16_WIDTH);

//assert(startbit >= 0 && startbit <= (UINT16_WIDTH - 1));
//assert(len >= 1 && len <= UINT16_WIDTH);
//assert((startbit + len) <= UINT16_WIDTH);

const uint16_t mask = ((1 << len) - 1) << startbit;
const uint16_t extracted = (value & mask) >> startbit;

Expand Down
4 changes: 1 addition & 3 deletions src/hx711_spi_master.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,9 +267,7 @@ int hx711_spi_master_get_control(
HX711_SPI_REMOTE_CONTROL_TOTAL_BYTES);
);

if(!success) {
return PICO_ERROR_IO;
}
UTIL_RETURNIF(!success, PICO_ERROR_IO);

success = hx711_spi_deserialise_control(
buffer,
Expand Down
4 changes: 1 addition & 3 deletions src/hx711_spi_slave.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,7 @@ bool hx711_spi_slave_try_get_request(
return false;
}

if(!hx711_spi_deserialise_request(data, req)) {
return false;
}
UTIL_RETURNIF(!hx711_spi_deserialise_request(data, req), false);

return true;

Expand Down
Loading

0 comments on commit 05a36d2

Please sign in to comment.