aboutsummaryrefslogtreecommitdiff
path: root/lib/pbdrv/pb-msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pbdrv/pb-msg.c')
-rw-r--r--lib/pbdrv/pb-msg.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/pbdrv/pb-msg.c b/lib/pbdrv/pb-msg.c
new file mode 100644
index 0000000..7fd6662
--- /dev/null
+++ b/lib/pbdrv/pb-msg.c
@@ -0,0 +1,46 @@
+#include "mpack-config.h"
+
+#include <mpack.h>
+
+#include "pb-msg.h"
+#include "pb-serial.h"
+#include "pb-mem.h"
+
+pb_buf_t pb_msg_write(const pb_msg_t * msg) {
+ pb_buf_t buf = { 0 };
+ if (msg == NULL) return buf;
+
+ buf.data = pb_malloc(MPACK_BUFFER_SIZE);
+ if (buf.data == NULL) return buf;
+ buf.size = MPACK_BUFFER_SIZE;
+
+ mpack_writer_t writer;
+ mpack_writer_init(&writer, buf.data, buf.size);
+
+ pb_ser_w(&writer, msg);
+
+ buf.size = mpack_writer_buffer_used(&writer);
+ mpack_writer_destroy(&writer);
+ return buf;
+}
+
+pb_msg_t * pb_msg_read(const pb_buf_t * buf) {
+ mpack_reader_t reader;
+ mpack_reader_init_data(&reader, buf->data, buf->size);
+
+ pb_msg_t * msg = pb_malloc(sizeof(pb_msg_t));
+
+ pb_ser_r(&reader, msg);
+
+ mpack_reader_destroy(&reader);
+ return msg;
+}
+
+void pb_msg_free(pb_msg_t * msg) {
+ // free message fields recursively
+ pb_ser_free(msg);
+
+ // free message container that was created in \p pb_msg_read
+ pb_free(msg);
+}
+