summaryrefslogtreecommitdiff
path: root/src/stream_i2c.c
diff options
context:
space:
mode:
authorAditya Naik2020-07-30 14:16:20 -0400
committerAditya Naik2020-07-30 14:16:20 -0400
commitc8c06aea5199e555235f71acc8547ed2ef0706cf (patch)
treee1d72f836873c9fc99dd200dd8829c6f0046b96f /src/stream_i2c.c
parent70f623d66439a826927b7d2fc9d64ae0cb631b92 (diff)
Stream abstraction
Diffstat (limited to 'src/stream_i2c.c')
-rw-r--r--src/stream_i2c.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/stream_i2c.c b/src/stream_i2c.c
new file mode 100644
index 0000000..b149756
--- /dev/null
+++ b/src/stream_i2c.c
@@ -0,0 +1,37 @@
+#include "stream_i2c.h"
+#include "port.h"
+#include "stream.h"
+
+int i2c_read(uint8_t* buf, size_t count, void **vptr, void *sptr)
+{
+ p_stream_t *stream = (p_stream_t*)sptr;
+ I2C_HandleTypeDef dev = *(I2C_HandleTypeDef*)stream->props[DEVICE];
+
+ uint16_t addr = *(uint16_t*)vptr[0];
+ uint32_t timeout = *(uint32_t*)vptr[1];
+ uint16_t AF_limit = *(uint32_t*)vptr[2];
+
+ int error, AF_counter = 0;
+ while (HAL_I2C_Master_Receive(&dev, addr, buf, count, timeout) != HAL_OK) {
+ if ((error = HAL_I2C_GetError(&dev)) != HAL_I2C_ERROR_AF) {
+ return error;
+ }
+ else if (++AF_counter > AF_limit) {
+ return HAL_I2C_ERROR_AF;
+ }
+ }
+ return 0;
+}
+
+int i2c_write(uint8_t* buf, size_t count, void **vptr, void *sptr)
+{
+ p_stream_t *stream = (p_stream_t*)sptr;
+ I2C_HandleTypeDef dev = *(I2C_HandleTypeDef*)stream->props[DEVICE];
+ uint16_t addr = *(uint16_t*)vptr[1];
+ uint32_t timeout = *(uint32_t*)vptr[2];
+
+ while (HAL_I2C_Master_Transmit(&dev, addr, buf, count, timeout) != HAL_OK) {
+ return HAL_I2C_GetError(&dev);
+ }
+ return 0;
+}