From 8c21a929d06ed108b0e64f3892d036cd4cd67e51 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Mon, 12 Dec 2022 12:52:30 +0100 Subject: serial parser working on qt client side --- shared/protocol-tests/ping.bin | Bin 0 -> 4 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 shared/protocol-tests/ping.bin (limited to 'shared/protocol-tests') diff --git a/shared/protocol-tests/ping.bin b/shared/protocol-tests/ping.bin new file mode 100644 index 0000000..2b8491c Binary files /dev/null and b/shared/protocol-tests/ping.bin differ -- cgit v1.2.3 From 61dd8a5ee66734dfd53ee9be725c9e71fd8d5414 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Mon, 12 Dec 2022 13:57:33 +0100 Subject: implement DYN_MEMBER_SIZEOF macro correctly and implement cd_cmd_response_sizeof --- confui/mainwindow.cpp | 5 ++++- confui/serial.h | 2 +- shared/bin.c | 8 ++++++++ shared/bin.h | 16 ++++++++++++++++ shared/protocol-tests/ping-response.bin | Bin 0 -> 10 bytes shared/protocol.c | 32 +++++++++++++++++++++++++++----- 6 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 shared/protocol-tests/ping-response.bin (limited to 'shared/protocol-tests') diff --git a/confui/mainwindow.cpp b/confui/mainwindow.cpp index 1fd34c4..b5bbdf0 100644 --- a/confui/mainwindow.cpp +++ b/confui/mainwindow.cpp @@ -13,7 +13,10 @@ CDMeshConnector *g_cd_mesh_connector = nullptr; CDSerialConnector *g_cd_serial = nullptr; QApplication* g_cd_app = nullptr; -CDMainWindow::~CDMainWindow() { delete this->mesh_connector; } +CDMainWindow::~CDMainWindow() { + delete g_cd_mesh_connector; + delete g_cd_serial; +} CDMainWindow::CDMainWindow(QWidget *parent) : QMainWindow(parent) { g_cd_mesh_connector = new CDMeshConnector(); diff --git a/confui/serial.h b/confui/serial.h index 22f2542..aa0508f 100644 --- a/confui/serial.h +++ b/confui/serial.h @@ -11,7 +11,7 @@ using std::vector; class CDSerialConnector { public: CDSerialConnector(); - ~CDSerialConnector(); + virtual ~CDSerialConnector(); /** @brief get list of available serial ports */ static vector get_ports(); diff --git a/shared/bin.c b/shared/bin.c index fdceb30..875d013 100644 --- a/shared/bin.c +++ b/shared/bin.c @@ -65,6 +65,14 @@ uint16_t cd_bin_hton16(uint16_t h16) { uint32_t cd_bin_ntoh32(uint32_t n32) { return cd_bin_hton32(n32); } uint16_t cd_bin_ntoh16(uint16_t n16) { return cd_bin_hton16(n16); } +uint32_t cd_bin_ntohd(uint8_t* n, size_t s) { return cd_bin_htond(n, s); } + +uint32_t cd_bin_htond(uint8_t* h, size_t s) { + if (s == sizeof(uint8_t)) return *h; + else if (s == sizeof(uint16_t)) return cd_bin_hton16(*(uint16_t*) h); + else if (s == sizeof(uint32_t)) return cd_bin_hton32(*(uint32_t*) h); + else return 0; +} cd_s_bin *cd_bin_s_alloc(uint16_t bytes, uint8_t *data) { cd_s_bin *temp = malloc(sizeof(cd_s_bin) + sizeof(uint8_t) * bytes); diff --git a/shared/bin.h b/shared/bin.h index 35d2bc4..0e16ec0 100644 --- a/shared/bin.h +++ b/shared/bin.h @@ -10,6 +10,7 @@ */ #include +#include #ifdef __cplusplus extern "C" { @@ -50,6 +51,21 @@ uint32_t cd_bin_ntoh32(uint32_t n32); /** @brief convert 16-bit value from network (big-endian) to host endian */ uint16_t cd_bin_ntoh16(uint16_t n16); +/** + * @brief convert (8*s)-bit value from network (big-endian) to host endian + * (dynamic size) + * + * @param n pointer to number + * @param s size of number in bytes + * + * @return 32-bit integer regardless of `s` + * + * this function is exclusively used by the CD_DYN_MEMBER_SIZEOF macro in + * shared/protocol.c + */ +uint32_t cd_bin_ntohd(uint8_t* n, size_t s); +uint32_t cd_bin_htond(uint8_t* h, size_t s); + /** @brief replace 32-bit value from host endian to network (big-endian) */ void cd_bin_repl_hton32(uint32_t *h32); /** @brief replace 16-bit value from host endian to network (big-endian) */ diff --git a/shared/protocol-tests/ping-response.bin b/shared/protocol-tests/ping-response.bin new file mode 100644 index 0000000..6067349 Binary files /dev/null and b/shared/protocol-tests/ping-response.bin differ diff --git a/shared/protocol.c b/shared/protocol.c index 474398a..1d66f17 100644 --- a/shared/protocol.c +++ b/shared/protocol.c @@ -1,3 +1,5 @@ +#include + #include "protocol.h" #ifdef __cplusplus @@ -16,13 +18,33 @@ size_t cd_cmd_sizeof(uint8_t data[CD_SERIAL_READ_BUFFER_SIZE], uint8_t data_leng return length; } -#define CD_DYN_MEMBER_SIZEOF(struct_t, length_byte, trailing_type) \ - sizeof(struct_t) + \ - (data->bytes > length_byte ? (sizeof(trailing_type) * data->data[length_byte]) : 0) +/** + * @brief macro to calculate size of message based on struct with member to + * indicate length of dynamic (last) field + * + * @param data cd_s_bin pointer to currently received data + * @param struct_t message struct + * @param length_field struct field with dynamic length + * + * @return size_t with calculated size + * + * equivalent c code: + * + * size_t size = sizeof(struct_t); + * size_t dyn_member_offset = offsetof(struct_t, length_field); + * size_t dyn_member_size = sizeof(((struct_t*)0)->length_field); + * if (data->bytes >= (dyn_member_offset + dyn_member_size)) + * size += cd_bin_ntohd(&data->data[dyn_member_offset], dyn_member_size); + * return size; + */ +#define CD_DYN_MEMBER_SIZEOF(data, struct_t, length_field) \ + sizeof(struct_t) + ( \ + (data->bytes >= (offsetof(struct_t, length_field) + sizeof(((struct_t*)0)->length_field))) ? \ + (cd_bin_ntohd(&data->data[offsetof(struct_t, length_field)], sizeof(((struct_t*)0)->length_field))) :\ + 0); size_t cd_cmd_response_sizeof(cd_s_bin* data) { - (void) data; // unused variable TODO: implement this - return 0; + return CD_DYN_MEMBER_SIZEOF(data, cd_s_cmd_response, response_size); } #ifdef __cplusplus -- cgit v1.2.3 From f24da35b75c46df8af41514aa4c11e0b9b7ed162 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Tue, 13 Dec 2022 21:50:03 +0100 Subject: add binary files as text with comments and makefile --- shared/protocol-tests/.gitignore | 1 + shared/protocol-tests/makefile | 15 +++++++++++++++ shared/protocol-tests/ping-response.bin | Bin 10 -> 0 bytes shared/protocol-tests/ping-response.src | 10 ++++++++++ shared/protocol-tests/ping.bin | Bin 4 -> 0 bytes shared/protocol-tests/ping.src | 4 ++++ 6 files changed, 30 insertions(+) create mode 100644 shared/protocol-tests/.gitignore create mode 100644 shared/protocol-tests/makefile delete mode 100644 shared/protocol-tests/ping-response.bin create mode 100644 shared/protocol-tests/ping-response.src delete mode 100644 shared/protocol-tests/ping.bin create mode 100644 shared/protocol-tests/ping.src (limited to 'shared/protocol-tests') diff --git a/shared/protocol-tests/.gitignore b/shared/protocol-tests/.gitignore new file mode 100644 index 0000000..a8a0dce --- /dev/null +++ b/shared/protocol-tests/.gitignore @@ -0,0 +1 @@ +*.bin diff --git a/shared/protocol-tests/makefile b/shared/protocol-tests/makefile new file mode 100644 index 0000000..f8ac490 --- /dev/null +++ b/shared/protocol-tests/makefile @@ -0,0 +1,15 @@ +XXD := xxd +RM := rm -f + +SRCS := $(wildcard *.src) +TARGET := $(SRCS:.src=.bin) + +.PHONY: all clean + +all: $(TARGET) + +%.bin: %.src + $(XXD) -r -c1 $< $@ + +clean: + $(RM) $(TARGET) diff --git a/shared/protocol-tests/ping-response.bin b/shared/protocol-tests/ping-response.bin deleted file mode 100644 index 6067349..0000000 Binary files a/shared/protocol-tests/ping-response.bin and /dev/null differ diff --git a/shared/protocol-tests/ping-response.src b/shared/protocol-tests/ping-response.src new file mode 100644 index 0000000..57418d5 --- /dev/null +++ b/shared/protocol-tests/ping-response.src @@ -0,0 +1,10 @@ +00: ff ; start byte +01: 05 ; response opcode +02: 00 ; message id (0x0001) +03: 01 ; ^ +04: 01 ; error (true) +05: 00 ; response type (0x00 = ping) +06: 00 ; original message id (0x0000) +07: 00 ; ^ +08: 00 ; remainder size (0x0000) +09: 00 ; ^ diff --git a/shared/protocol-tests/ping.bin b/shared/protocol-tests/ping.bin deleted file mode 100644 index 2b8491c..0000000 Binary files a/shared/protocol-tests/ping.bin and /dev/null differ diff --git a/shared/protocol-tests/ping.src b/shared/protocol-tests/ping.src new file mode 100644 index 0000000..beec10a --- /dev/null +++ b/shared/protocol-tests/ping.src @@ -0,0 +1,4 @@ +00: ff ; start byte +01: 00 ; ping opcode +02: f8 ; message id (used as ping identifier) +03: 8f ; ^ -- cgit v1.2.3 From 3fc0e63e43c0de9ecbc084e7f7710716ac88cf51 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Thu, 5 Jan 2023 14:10:38 +0100 Subject: get-node-response v1 added --- shared/protocol-tests/get-node-response.src | 76 +++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 shared/protocol-tests/get-node-response.src (limited to 'shared/protocol-tests') diff --git a/shared/protocol-tests/get-node-response.src b/shared/protocol-tests/get-node-response.src new file mode 100644 index 0000000..a8fa695 --- /dev/null +++ b/shared/protocol-tests/get-node-response.src @@ -0,0 +1,76 @@ +00: ff ; start byte +01: 05 ; opcode (0x05 = response) +02: 00 ; message id (0x0000) +03: 00 ; ^ +04: 00 ; error byte (0x00 = false) +05: 01 ; response type (0x01 = get node) +06: 8f ; original message id (0x8ff8) +07: f8 ; ^ +08: 00 ; remaining response size (0x35 = 53 bytes) +09: 35 ; ^ +-------; |- remaining response (cd_s_cmd_node) +0a: ff ; | [esc] +0b: ff ; | uuid (ffffffff-0000-0000-dead-beef00000000) +0c: ff ; | [esc] +0d: ff ; | ^ +0e: ff ; | [esc] +0f: ff ; | ^ +10: ff ; | [esc] +11: ff ; | ^ +12: 00 ; | ^ +13: 00 ; | ^ +14: 00 ; | ^ +15: 00 ; | ^ +16: de ; | ^ +17: ad ; | ^ +18: be ; | ^ +19: ef ; | ^ +1a: 00 ; | ^ +1b: 00 ; | ^ +1c: 00 ; | ^ +1d: 00 ; | ^ +1e: ff ; | [esc] +1f: ff ; | mac address (ff:00:ff:00:ff:00) +20: 00 ; | ^ +21: ff ; | [esc] +22: ff ; | ^ +23: 00 ; | ^ +24: ff ; | [esc] +25: ff ; | ^ +26: 00 ; | ^ +27: 04 ; | name length (0x04 = 4) +28: 00 ; | light on (0x00 = false) +29: 00 ; | provisioned (0x00 = false) +2a: de ; | button publish address (0xdeadbeef) +2b: ad ; | ^ +2c: be ; | ^ +2d: ef ; | ^ +2e: 00 ; | link count (0x0001 = 1) +2f: 01 ; | ^ +30: 00 ; | remaining size (0x14 = 20 bytes) +31: 14 ; | ^ +-------; | |- remaining response (char[4], cd_uuid_t[1]) +32: 67 ; | | node name ("gert") +33: 65 ; | | ^ +34: 72 ; | | ^ +35: 74 ; | | ^ +36: ff ; | | [esc] +37: ff ; | | link[0] uuid (ffffffff-0000-0000-dead-beef00000000) +38: ff ; | | [esc] +39: ff ; | | ^ +3a: ff ; | | [esc] +3b: ff ; | | ^ +3c: ff ; | | [esc] +3d: ff ; | | ^ +3e: 00 ; | | ^ +3f: 00 ; | | ^ +40: 00 ; | | ^ +41: 00 ; | | ^ +42: de ; | | ^ +43: ad ; | | ^ +44: be ; | | ^ +45: ef ; | | ^ +46: 00 ; | | ^ +47: 00 ; | | ^ +48: 00 ; | | ^ +49: 00 ; | | ^ -- cgit v1.2.3 From 8294ed270bce6b563efc1859a8049e018818e1be Mon Sep 17 00:00:00 2001 From: lonkaars Date: Thu, 5 Jan 2023 14:30:24 +0100 Subject: proper protocol spec get-node response --- shared/protocol-tests/get-node-response.src | 135 ++++++++++++++-------------- 1 file changed, 69 insertions(+), 66 deletions(-) (limited to 'shared/protocol-tests') diff --git a/shared/protocol-tests/get-node-response.src b/shared/protocol-tests/get-node-response.src index a8fa695..f10ffe0 100644 --- a/shared/protocol-tests/get-node-response.src +++ b/shared/protocol-tests/get-node-response.src @@ -8,69 +8,72 @@ 07: f8 ; ^ 08: 00 ; remaining response size (0x35 = 53 bytes) 09: 35 ; ^ --------; |- remaining response (cd_s_cmd_node) -0a: ff ; | [esc] -0b: ff ; | uuid (ffffffff-0000-0000-dead-beef00000000) -0c: ff ; | [esc] -0d: ff ; | ^ -0e: ff ; | [esc] -0f: ff ; | ^ -10: ff ; | [esc] -11: ff ; | ^ -12: 00 ; | ^ -13: 00 ; | ^ -14: 00 ; | ^ -15: 00 ; | ^ -16: de ; | ^ -17: ad ; | ^ -18: be ; | ^ -19: ef ; | ^ -1a: 00 ; | ^ -1b: 00 ; | ^ -1c: 00 ; | ^ -1d: 00 ; | ^ -1e: ff ; | [esc] -1f: ff ; | mac address (ff:00:ff:00:ff:00) -20: 00 ; | ^ -21: ff ; | [esc] -22: ff ; | ^ -23: 00 ; | ^ -24: ff ; | [esc] -25: ff ; | ^ -26: 00 ; | ^ -27: 04 ; | name length (0x04 = 4) -28: 00 ; | light on (0x00 = false) -29: 00 ; | provisioned (0x00 = false) -2a: de ; | button publish address (0xdeadbeef) -2b: ad ; | ^ -2c: be ; | ^ -2d: ef ; | ^ -2e: 00 ; | link count (0x0001 = 1) -2f: 01 ; | ^ -30: 00 ; | remaining size (0x14 = 20 bytes) -31: 14 ; | ^ --------; | |- remaining response (char[4], cd_uuid_t[1]) -32: 67 ; | | node name ("gert") -33: 65 ; | | ^ -34: 72 ; | | ^ -35: 74 ; | | ^ -36: ff ; | | [esc] -37: ff ; | | link[0] uuid (ffffffff-0000-0000-dead-beef00000000) -38: ff ; | | [esc] -39: ff ; | | ^ -3a: ff ; | | [esc] -3b: ff ; | | ^ -3c: ff ; | | [esc] -3d: ff ; | | ^ -3e: 00 ; | | ^ -3f: 00 ; | | ^ -40: 00 ; | | ^ -41: 00 ; | | ^ -42: de ; | | ^ -43: ad ; | | ^ -44: be ; | | ^ -45: ef ; | | ^ -46: 00 ; | | ^ -47: 00 ; | | ^ -48: 00 ; | | ^ -49: 00 ; | | ^ +-------; |- remaining response (cd_s_cmd_response_get_node) +0a: 00 ; | node count (0x0001 = 1) +0b: 01 ; | ^ +-------; | |- remaining response (cd_s_cmd_node[1]) +0c: ff ; | | [esc] +0d: ff ; | | uuid (ffffffff-0000-0000-dead-beef00000000) +0e: ff ; | | [esc] +0f: ff ; | | ^ +10: ff ; | | [esc] +11: ff ; | | ^ +12: ff ; | | [esc] +13: ff ; | | ^ +14: 00 ; | | ^ +15: 00 ; | | ^ +16: 00 ; | | ^ +17: 00 ; | | ^ +18: de ; | | ^ +19: ad ; | | ^ +1a: be ; | | ^ +1b: ef ; | | ^ +1c: 00 ; | | ^ +1d: 00 ; | | ^ +1e: 00 ; | | ^ +1f: 00 ; | | ^ +20: ff ; | | [esc] +21: ff ; | | mac address (ff:00:ff:00:ff:00) +22: 00 ; | | ^ +23: ff ; | | [esc] +24: ff ; | | ^ +25: 00 ; | | ^ +26: ff ; | | [esc] +27: ff ; | | ^ +28: 00 ; | | ^ +29: 04 ; | | name length (0x04 = 4) +2a: 00 ; | | light on (0x00 = false) +2b: 00 ; | | provisioned (0x00 = false) +2c: de ; | | button publish address (0xdeadbeef) +2d: ad ; | | ^ +2e: be ; | | ^ +2f: ef ; | | ^ +30: 00 ; | | link count (0x0001 = 1) +31: 01 ; | | ^ +32: 00 ; | | remaining size (0x14 = 20 bytes) +33: 14 ; | | ^ +-------; | | |- remaining response (char[4], cd_uuid_t[1]) +34: 67 ; | | | node name ("gert") +35: 65 ; | | | ^ +36: 72 ; | | | ^ +37: 74 ; | | | ^ +38: ff ; | | | [esc] +39: ff ; | | | link[0] uuid (ffffffff-0000-0000-dead-beef00000000) +3a: ff ; | | | [esc] +3b: ff ; | | | ^ +3c: ff ; | | | [esc] +3d: ff ; | | | ^ +3e: ff ; | | | [esc] +3f: ff ; | | | ^ +40: 00 ; | | | ^ +41: 00 ; | | | ^ +42: 00 ; | | | ^ +43: 00 ; | | | ^ +44: de ; | | | ^ +45: ad ; | | | ^ +46: be ; | | | ^ +47: ef ; | | | ^ +48: 00 ; | | | ^ +49: 00 ; | | | ^ +4a: 00 ; | | | ^ +4b: 00 ; | | | ^ -- cgit v1.2.3 From 759d73e4ef0167c654535637488bdfcd423015a0 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Thu, 5 Jan 2023 15:03:58 +0100 Subject: improve parseability of get-nodes response --- confui/serial.cpp | 19 +++--- shared/pclient.c | 21 +++++++ shared/pclient.h | 10 ++- shared/protocol-tests/get-node-response.src | 98 +++++++++++++++-------------- shared/protocol.h | 5 +- 5 files changed, 95 insertions(+), 58 deletions(-) (limited to 'shared/protocol-tests') diff --git a/confui/serial.cpp b/confui/serial.cpp index c0e686b..dd2a702 100644 --- a/confui/serial.cpp +++ b/confui/serial.cpp @@ -97,21 +97,26 @@ void cd_cmd_ping(cd_s_bin* data) { // free(response); // response = nullptr; - cd_uuid_t light_addrs[] = { + cd_uuid_t test_node_light_addrs[] = { { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xde, 0xad, 0xbe, 0xef, 0x00, 0x00, 0x00, 0x00 }, }; - cd_s_cmd_node* test = cd_cmd_node_alloc("gert", { + cd_s_cmd_node* test_node = cd_cmd_node_alloc("gert", { .uuid = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xde, 0xad, 0xbe, 0xef, 0x00, 0x00, 0x00, 0x00 }, .address = { 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, }, .light_on = false, .provisioned = false, .button_pub = 0xdeadbeef, - }, 1, light_addrs); - cd_s_bin* testres = cd_cmd_res(CD_CMD_GET_NODE, 0xf88f, cd_cmd_node_sizeof(test), (uint8_t*) test); - free(test); + }, 1, test_node_light_addrs); - cd_pclient_send(testres); - free(testres); + cd_s_cmd_node* nodes[] = { test_node }; + cd_s_cmd_response_get_node* response_get_nodes = cd_cmd_get_node_res_from_node_arr(1, nodes); + free(test_node); + + cd_s_bin* response = cd_cmd_res(CD_CMD_GET_NODE, 0xf88f, cd_cmd_response_get_node_sizeof(response_get_nodes), (uint8_t*) response_get_nodes); + free(response_get_nodes); + + cd_pclient_send(response); + free(response); } void cd_cmd_response(cd_s_bin* data) { diff --git a/shared/pclient.c b/shared/pclient.c index be0e0a7..728bfa0 100644 --- a/shared/pclient.c +++ b/shared/pclient.c @@ -135,6 +135,27 @@ cd_s_cmd_node* cd_cmd_node_alloc(const char* name, cd_s_cmd_node base, uint16_t return node; } +cd_s_cmd_response_get_node* cd_cmd_get_node_res_from_node_arr(uint16_t size, cd_s_cmd_node* arr[]) { + size_t remaining_size = 0; + + for (unsigned int i = 0; i < size; i++) { + remaining_size += sizeof(cd_s_cmd_node) + cd_bin_ntoh16(arr[i]->remaining_size); + } + + cd_s_cmd_response_get_node* response = malloc(sizeof(cd_s_cmd_response_get_node) + remaining_size); + response->node_count = cd_bin_hton16(size); + response->remaining_size = cd_bin_hton16(remaining_size); + + void* cursor = response->nodes; + for (unsigned int i = 0; i < size; i++) { + size_t size = sizeof(cd_s_cmd_node) + cd_bin_ntoh16(arr[i]->remaining_size); + memcpy(cursor, arr[i], size); + cursor += size; + } + + return response; +} + #ifdef __cplusplus } #endif diff --git a/shared/pclient.h b/shared/pclient.h index e1bb7e7..03a8a25 100644 --- a/shared/pclient.h +++ b/shared/pclient.h @@ -66,6 +66,12 @@ cd_s_bin* cd_cmd_res_status(cd_e_scmds cmd, cd_cmd_id_t id, bool error); * @param data pointer to data */ cd_s_bin* cd_cmd_res(cd_e_scmds cmd, cd_cmd_id_t id, uint16_t len, uint8_t* data); +/** + * @brief generate cd_s_cmd_response_get_node struct from array of cd_s_cmd_node pointers + * @param size length of array + * @param arr array of pointer to cd_s_cmd_node + */ +cd_s_cmd_response_get_node* cd_cmd_get_node_res_from_node_arr(uint16_t size, cd_s_cmd_node* arr[]); /** * @brief allocate and fill cd_s_cmd_node struct * @@ -76,7 +82,9 @@ cd_s_bin* cd_cmd_res(cd_e_scmds cmd, cd_cmd_id_t id, uint16_t len, uint8_t* data */ cd_s_cmd_node* cd_cmd_node_alloc(const char* name, cd_s_cmd_node base, uint16_t link_count, cd_uuid_t* links); -#define cd_cmd_node_sizeof(node) ((sizeof(cd_s_cmd_node) + cd_bin_ntoh16(node->remaining_size)) /* NOLINT */) +#define cd_remaining_sizeof(type, input_struct) ((sizeof(type) + cd_bin_ntoh16(input_struct->remaining_size)) /* NOLINT */) +#define cd_cmd_node_sizeof(node) (cd_remaining_sizeof(cd_s_cmd_node, node) /* NOLINT */) +#define cd_cmd_response_get_node_sizeof(res) (cd_remaining_sizeof(cd_s_cmd_response_get_node, res) /* NOLINT */) #ifdef __cplusplus } diff --git a/shared/protocol-tests/get-node-response.src b/shared/protocol-tests/get-node-response.src index f10ffe0..31bf1ff 100644 --- a/shared/protocol-tests/get-node-response.src +++ b/shared/protocol-tests/get-node-response.src @@ -6,74 +6,76 @@ 05: 01 ; response type (0x01 = get node) 06: 8f ; original message id (0x8ff8) 07: f8 ; ^ -08: 00 ; remaining response size (0x35 = 53 bytes) -09: 35 ; ^ +08: 00 ; remaining response size (0x39 = 57 bytes) +09: 39 ; ^ -------; |- remaining response (cd_s_cmd_response_get_node) 0a: 00 ; | node count (0x0001 = 1) 0b: 01 ; | ^ +0c: 00 ; | remaining response size (0x35 = 53 bytes) +0d: 35 ; | ^ -------; | |- remaining response (cd_s_cmd_node[1]) -0c: ff ; | | [esc] -0d: ff ; | | uuid (ffffffff-0000-0000-dead-beef00000000) 0e: ff ; | | [esc] -0f: ff ; | | ^ +0f: ff ; | | uuid (ffffffff-0000-0000-dead-beef00000000) 10: ff ; | | [esc] 11: ff ; | | ^ 12: ff ; | | [esc] 13: ff ; | | ^ -14: 00 ; | | ^ -15: 00 ; | | ^ +14: ff ; | | [esc] +15: ff ; | | ^ 16: 00 ; | | ^ 17: 00 ; | | ^ -18: de ; | | ^ -19: ad ; | | ^ -1a: be ; | | ^ -1b: ef ; | | ^ -1c: 00 ; | | ^ -1d: 00 ; | | ^ +18: 00 ; | | ^ +19: 00 ; | | ^ +1a: de ; | | ^ +1b: ad ; | | ^ +1c: be ; | | ^ +1d: ef ; | | ^ 1e: 00 ; | | ^ 1f: 00 ; | | ^ -20: ff ; | | [esc] -21: ff ; | | mac address (ff:00:ff:00:ff:00) -22: 00 ; | | ^ -23: ff ; | | [esc] -24: ff ; | | ^ -25: 00 ; | | ^ -26: ff ; | | [esc] -27: ff ; | | ^ -28: 00 ; | | ^ -29: 04 ; | | name length (0x04 = 4) -2a: 00 ; | | light on (0x00 = false) -2b: 00 ; | | provisioned (0x00 = false) -2c: de ; | | button publish address (0xdeadbeef) -2d: ad ; | | ^ -2e: be ; | | ^ -2f: ef ; | | ^ -30: 00 ; | | link count (0x0001 = 1) -31: 01 ; | | ^ -32: 00 ; | | remaining size (0x14 = 20 bytes) -33: 14 ; | | ^ +20: 00 ; | | ^ +21: 00 ; | | ^ +22: ff ; | | [esc] +23: ff ; | | mac address (ff:00:ff:00:ff:00) +24: 00 ; | | ^ +25: ff ; | | [esc] +26: ff ; | | ^ +27: 00 ; | | ^ +28: ff ; | | [esc] +29: ff ; | | ^ +2a: 00 ; | | ^ +2b: 04 ; | | name length (0x04 = 4) +2c: 00 ; | | light on (0x00 = false) +2d: 00 ; | | provisioned (0x00 = false) +2e: de ; | | button publish address (0xdeadbeef) +2f: ad ; | | ^ +30: be ; | | ^ +31: ef ; | | ^ +32: 00 ; | | link count (0x0001 = 1) +33: 01 ; | | ^ +34: 00 ; | | remaining size (0x14 = 20 bytes) +35: 14 ; | | ^ -------; | | |- remaining response (char[4], cd_uuid_t[1]) -34: 67 ; | | | node name ("gert") -35: 65 ; | | | ^ -36: 72 ; | | | ^ -37: 74 ; | | | ^ -38: ff ; | | | [esc] -39: ff ; | | | link[0] uuid (ffffffff-0000-0000-dead-beef00000000) +36: 67 ; | | | node name ("gert") +37: 65 ; | | | ^ +38: 72 ; | | | ^ +39: 74 ; | | | ^ 3a: ff ; | | | [esc] -3b: ff ; | | | ^ +3b: ff ; | | | link[0] uuid (ffffffff-0000-0000-dead-beef00000000) 3c: ff ; | | | [esc] 3d: ff ; | | | ^ 3e: ff ; | | | [esc] 3f: ff ; | | | ^ -40: 00 ; | | | ^ -41: 00 ; | | | ^ +40: ff ; | | | [esc] +41: ff ; | | | ^ 42: 00 ; | | | ^ 43: 00 ; | | | ^ -44: de ; | | | ^ -45: ad ; | | | ^ -46: be ; | | | ^ -47: ef ; | | | ^ -48: 00 ; | | | ^ -49: 00 ; | | | ^ +44: 00 ; | | | ^ +45: 00 ; | | | ^ +46: de ; | | | ^ +47: ad ; | | | ^ +48: be ; | | | ^ +49: ef ; | | | ^ 4a: 00 ; | | | ^ 4b: 00 ; | | | ^ +4c: 00 ; | | | ^ +4d: 00 ; | | | ^ diff --git a/shared/protocol.h b/shared/protocol.h index dd5bcc6..cad9a1c 100644 --- a/shared/protocol.h +++ b/shared/protocol.h @@ -104,8 +104,9 @@ typedef struct { } cd_s_cmd_node; typedef struct { - uint16_t node_count; - cd_s_cmd_node nodes[]; + uint16_t node_count; /** amount of nodes in nodes[] */ + uint16_t remaining_size; /** remaining size (for convenience) */ + cd_s_cmd_node nodes[]; /** nodes adjacent in memory (should be accessed using pointer arithmetic) */ } cd_s_cmd_response_get_node; typedef struct { -- cgit v1.2.3