aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlonkaars <loek@pipeframe.xyz>2024-05-19 15:10:46 +0200
committerlonkaars <loek@pipeframe.xyz>2024-05-19 15:10:46 +0200
commit2d3ba07806517f0d27b118df761675a05ab98fc7 (patch)
treec44655d2ba5ed7f987dec1e95caffda288543382
parentf8595800e8147f6c12d52aef99c4e453ec4ad227 (diff)
add puzzle bus serializer to main controller application
-rw-r--r--main/CMakeLists.txt1
-rw-r--r--main/sock.c52
2 files changed, 48 insertions, 5 deletions
diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt
index cd90499..90ca8e3 100644
--- a/main/CMakeLists.txt
+++ b/main/CMakeLists.txt
@@ -31,6 +31,7 @@ target_link_libraries(main
pico_stdlib
FreeRTOS-Kernel
FreeRTOS-Kernel-Heap4
+ puzbus
mpack
)
diff --git a/main/sock.c b/main/sock.c
index dac62af..705e2eb 100644
--- a/main/sock.c
+++ b/main/sock.c
@@ -3,19 +3,61 @@
#include <lwip/opt.h>
#include <lwip/sys.h>
#include <lwip/api.h>
+#include <string.h>
#include "init.h"
#include "config.h"
+#include "puzbusv1.h"
+#include "sock.h"
struct netconn* current_connection = NULL;
+struct pb_msg recv_msg;
-void recv_handler(struct netconn* conn, struct netbuf* buf) {
- void *data;
- uint16_t len;
+void i2c_send(uint16_t addr, char* data, size_t data_size) {
+ if (current_connection == NULL) return;
+
+ struct pb_msg send_msg = {
+ .addr = addr,
+ .data = data,
+ .length = data_size,
+ };
+
+ char* buf;
+ size_t buf_sz;
+
+ if (!pb_write(&send_msg, &buf, &buf_sz)) return;
+
+ // NOTE: netconn does return an error code, but the data needs to be freed
+ // whether netconn throws an error or not, so it remains unused
+ netconn_write(current_connection, buf, buf_sz, NETCONN_COPY);
+
+ free(buf);
+}
+void i2c_recv(uint16_t addr, char* data, size_t data_size) {
+ printf("address: 0x%02x\n", addr);
+ printf("data: \"%.*s\"\n", data_size, data);
+
+ // send message back
+ char reply[] = "Test message back!";
+ i2c_send(0x69, reply, strlen(reply));
+
+ // TODO: this function should forward the recieved message onto the puzzle
+ // bus instead of printing/replying
+}
+
+void recv_handler(struct netconn* conn, struct netbuf* buf) {
do {
- netbuf_data(buf, &data, &len);
- printf("got %d bytes!\n", len);
+ char* data;
+ uint16_t len;
+ netbuf_data(buf, (void**)&data, &len);
+
+ // continue early if more data is needed to complete message
+ if (!pb_read(&recv_msg, data, len)) continue;
+
+ // forward received message to puzzle bus
+ i2c_recv(recv_msg.addr, recv_msg.data, recv_msg.length);
+ free(recv_msg.data);
} while (netbuf_next(buf) >= 0);
netbuf_delete(buf);