diff options
-rw-r--r-- | shared/bin.c | 11 | ||||
-rw-r--r-- | shared/bin.h | 17 | ||||
-rw-r--r-- | shared/consts.h | 1 | ||||
-rw-r--r-- | shared/pclient.c | 97 | ||||
-rw-r--r-- | shared/pclient.h | 24 | ||||
-rw-r--r-- | shared/protocol.c | 23 | ||||
-rw-r--r-- | shared/protocol.h | 116 | ||||
-rw-r--r-- | shared/serial_parse.c | 7 | ||||
-rw-r--r-- | shared/serial_parse.h | 3 |
9 files changed, 136 insertions, 163 deletions
diff --git a/shared/bin.c b/shared/bin.c index 22873b6..83395e3 100644 --- a/shared/bin.c +++ b/shared/bin.c @@ -55,8 +55,7 @@ cd_s_bin *cd_bin_from_uint32_t(uint32_t data) { uint32_t cd_bin_hton32(uint32_t h32) { if (g_cd_endianness == CD_ENDIAN_BIG) return h32; - return ((h32 & _BYTE_0) << _SHIFT_3B) | ((h32 & _BYTE_1) << _SHIFT_1B) | - ((h32 & _BYTE_2) >> _SHIFT_1B) | ((h32 & _BYTE_3) >> _SHIFT_3B); + return ((h32 & _BYTE_0) << _SHIFT_3B) | ((h32 & _BYTE_1) << _SHIFT_1B) | ((h32 & _BYTE_2) >> _SHIFT_1B) | ((h32 & _BYTE_3) >> _SHIFT_3B); } #pragma GCC diagnostic pop @@ -67,12 +66,12 @@ 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_ntohd(uint8_t *n, size_t s) { return cd_bin_htond(n, s); } -uint32_t cd_bin_htond(uint8_t* h, size_t 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 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; } diff --git a/shared/bin.h b/shared/bin.h index 4a932c2..8aab08f 100644 --- a/shared/bin.h +++ b/shared/bin.h @@ -10,6 +10,7 @@ */ #include <stdint.h> +#include <stdlib.h> #include "memory.h" @@ -22,11 +23,12 @@ extern uint8_t g_cd_endianness; /** @brief cast `in.data` to `type out` */ #define CD_CAST_BIN(type, in, out) type *out = (type *)&in->data; #define CD_CREATE_MSG_BIN(type, normal, bin) CD_CREATE_MSG_SIZE_BIN(type, sizeof(type), normal, bin) -/** @brief */ -#define CD_CREATE_MSG_SIZE_BIN(type, size, normal, bin) \ - cd_s_bin *bin = CD_MALLOC(sizeof(cd_s_bin) + size); \ - bin->bytes = size; \ +/** @brief create cd_s_bin struct with space for struct and cast data field of cd_s_bin to struct pointer */ +#define CD_CREATE_MSG_SIZE_BIN(type, size, normal, bin) \ + cd_s_bin *bin = CD_MALLOC(sizeof(cd_s_bin) + size); \ + bin->bytes = size; \ type *normal = (type *)&bin->data; +// TODO: document above macro but better /** @brief hold binary data with fixed size */ typedef struct { @@ -58,14 +60,14 @@ uint16_t cd_bin_ntoh16(uint16_t n16); * * @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); +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); @@ -79,4 +81,3 @@ void cd_bin_repl_ntoh16(uint16_t *n16); #ifdef __cplusplus } #endif - diff --git a/shared/consts.h b/shared/consts.h index 57426bf..b68c1a0 100644 --- a/shared/consts.h +++ b/shared/consts.h @@ -8,4 +8,3 @@ #define CD_ERROR_BUFFER_SIZE 16 /** @brief size of the serial communication buffer (in messages, not bytes) */ #define CD_SERCOMM_BUFFER_SIZE 16 - diff --git a/shared/pclient.c b/shared/pclient.c index a7d9b00..6dc431c 100644 --- a/shared/pclient.c +++ b/shared/pclient.c @@ -1,51 +1,51 @@ #include <string.h> -#include "protocol.h" -#include "pclient.h" #include "bin.h" +#include "pclient.h" +#include "protocol.h" #ifdef __cplusplus extern "C" { #endif -cd_s_bin* cd_cmd_gen_ping() { +cd_s_bin *cd_cmd_gen_ping() { CD_CREATE_MSG_BIN(cd_s_cmd_ping, msg, bin); msg->opcode = CD_CMD_PING; - msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); + msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); return bin; } -cd_s_bin* cd_cmd_gen_get_node(bool all, cd_uuid_t uuid) { +cd_s_bin *cd_cmd_gen_get_node(bool all, cd_uuid_t uuid) { CD_CREATE_MSG_BIN(cd_s_cmd_get_node, msg, bin); msg->opcode = CD_CMD_GET_NODE; - msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); - msg->all = all; + msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); + msg->all = all; if (uuid != NULL) memcpy(msg->uuid, uuid, sizeof(cd_uuid_t)); else memset(msg->uuid, 0, sizeof(cd_uuid_t)); return bin; } -cd_s_bin* cd_cmd_gen_post_led(bool on, cd_uuid_t uuid) { +cd_s_bin *cd_cmd_gen_post_led(bool on, cd_uuid_t uuid) { CD_CREATE_MSG_BIN(cd_s_cmd_post_led, msg, bin); msg->opcode = CD_CMD_POST_LED; - msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); - msg->on = on; + msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); + msg->on = on; memcpy(msg->uuid, uuid, sizeof(cd_uuid_t)); return bin; } -cd_s_bin* cd_cmd_gen_post_link_add(cd_uuid_t button, cd_uuid_t light, cd_e_cmd_link_type type) { +cd_s_bin *cd_cmd_gen_post_link_add(cd_uuid_t button, cd_uuid_t light, cd_e_cmd_link_type type) { CD_CREATE_MSG_BIN(cd_s_cmd_post_link, msg, bin); msg->opcode = CD_CMD_POST_LINK; - msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); - msg->add = true; + msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); + msg->add = true; memcpy(msg->button, button, sizeof(cd_uuid_t)); memcpy(msg->led, light, sizeof(cd_uuid_t)); msg->type = type; @@ -53,12 +53,12 @@ cd_s_bin* cd_cmd_gen_post_link_add(cd_uuid_t button, cd_uuid_t light, cd_e_cmd_l return bin; } -cd_s_bin* cd_cmd_gen_post_link_rm(cd_uuid_t button, cd_uuid_t light) { +cd_s_bin *cd_cmd_gen_post_link_rm(cd_uuid_t button, cd_uuid_t light) { CD_CREATE_MSG_BIN(cd_s_cmd_post_link, msg, bin); msg->opcode = CD_CMD_POST_LINK; - msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); - msg->add = false; + msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); + msg->add = false; memcpy(msg->button, button, sizeof(cd_uuid_t)); memcpy(msg->led, light, sizeof(cd_uuid_t)); msg->type = 0; @@ -66,70 +66,70 @@ cd_s_bin* cd_cmd_gen_post_link_rm(cd_uuid_t button, cd_uuid_t light) { return bin; } -cd_s_bin* cd_cmd_gen_post_net_add(cd_uuid_t uuid) { +cd_s_bin *cd_cmd_gen_post_net_add(cd_uuid_t uuid) { CD_CREATE_MSG_BIN(cd_s_cmd_post_net, msg, bin); msg->opcode = CD_CMD_POST_NET; - msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); - msg->join = true; + msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); + msg->join = true; memcpy(msg->uuid, uuid, sizeof(cd_uuid_t)); return bin; } -cd_s_bin* cd_cmd_gen_post_net_rm(cd_uuid_t uuid) { +cd_s_bin *cd_cmd_gen_post_net_rm(cd_uuid_t uuid) { CD_CREATE_MSG_BIN(cd_s_cmd_post_net, msg, bin); msg->opcode = CD_CMD_POST_NET; - msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); - msg->join = false; + msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); + msg->join = false; memcpy(msg->uuid, uuid, sizeof(cd_uuid_t)); return bin; } -cd_s_bin* cd_cmd_res_status(cd_e_scmds cmd, cd_cmd_id_t id, bool error) { +cd_s_bin *cd_cmd_res_status(cd_e_scmds cmd, cd_cmd_id_t id, bool error) { CD_CREATE_MSG_BIN(cd_s_cmd_response, msg, bin); - msg->opcode = CD_CMD_RESPONSE; - msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); + msg->opcode = CD_CMD_RESPONSE; + msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); msg->response_type = cmd; - msg->response_id = id; - msg->error = error; + msg->response_id = id; + msg->error = error; msg->response_size = 0; return bin; } -cd_s_bin* cd_cmd_res(cd_e_scmds cmd, cd_cmd_id_t id, uint16_t len, uint8_t* data) { +cd_s_bin *cd_cmd_res(cd_e_scmds cmd, cd_cmd_id_t id, uint16_t len, uint8_t *data) { CD_CREATE_MSG_SIZE_BIN(cd_s_cmd_response, sizeof(cd_s_cmd_response) + len, msg, bin); - msg->opcode = CD_CMD_RESPONSE; - msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); + msg->opcode = CD_CMD_RESPONSE; + msg->id = cd_bin_hton16(cd_protocol_fresh_message_id()); msg->response_type = cmd; - msg->response_id = id; - msg->error = false; + msg->response_id = id; + msg->error = false; msg->response_size = cd_bin_hton16(len); memcpy(msg->response_info, data, len); return bin; } -cd_s_cmd_node* cd_cmd_node_alloc(const char* name, cd_s_cmd_node base, uint16_t link_count, cd_uuid_t* links) { - size_t name_len = strlen(name); - size_t links_size = sizeof(cd_uuid_t) * link_count; +cd_s_cmd_node *cd_cmd_node_alloc(const char *name, cd_s_cmd_node base, uint16_t link_count, cd_uuid_t *links) { + size_t name_len = strlen(name); + size_t links_size = sizeof(cd_uuid_t) * link_count; size_t remaining_size = sizeof(char) * name_len + links_size; - cd_s_cmd_node* node = CD_MALLOC(sizeof(cd_s_cmd_node) + remaining_size); - + cd_s_cmd_node *node = CD_MALLOC(sizeof(cd_s_cmd_node) + remaining_size); + memcpy(node->uuid, base.uuid, sizeof(cd_uuid_t)); memcpy(node->address, base.address, sizeof(cd_mac_addr_t)); - node->name_len = name_len; - node->light_on = base.light_on; - node->provisioned = base.provisioned; - node->button_pub = cd_bin_hton32(base.button_pub); - node->link_count = cd_bin_hton16(link_count); + node->name_len = name_len; + node->light_on = base.light_on; + node->provisioned = base.provisioned; + node->button_pub = cd_bin_hton32(base.button_pub); + node->link_count = cd_bin_hton16(link_count); node->remaining_size = cd_bin_hton16(remaining_size); - void* cursor = (void*) &node->remaining_data[0]; + void *cursor = (void *)&node->remaining_data[0]; memcpy(cursor, name, name_len); // copy name cursor += name_len; memcpy(cursor, links, links_size); // copy links @@ -137,18 +137,18 @@ 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[]) { +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 = CD_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); + cd_s_cmd_response_get_node *response = CD_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; + 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); @@ -161,4 +161,3 @@ cd_s_cmd_response_get_node* cd_cmd_get_node_res_from_node_arr(uint16_t size, cd_ #ifdef __cplusplus } #endif - diff --git a/shared/pclient.h b/shared/pclient.h index 03a8a25..f53ff39 100644 --- a/shared/pclient.h +++ b/shared/pclient.h @@ -11,45 +11,45 @@ extern "C" { #endif /** @brief send data over platform standard serial out (doesn't free `data`) */ -void cd_pclient_send(cd_s_bin* data); +void cd_pclient_send(cd_s_bin *data); /** @brief generate PING command */ -cd_s_bin* cd_cmd_gen_ping(); +cd_s_bin *cd_cmd_gen_ping(); /** * @brief generate GET_NODE command * @param all get all nodes * @param uuid get specific node by uuid */ -cd_s_bin* cd_cmd_gen_get_node(bool all, cd_uuid_t uuid); +cd_s_bin *cd_cmd_gen_get_node(bool all, cd_uuid_t uuid); /** * @brief generate POST_LED command * @param on light status * @param uuid node to set light of */ -cd_s_bin* cd_cmd_gen_post_led(bool on, cd_uuid_t uuid); +cd_s_bin *cd_cmd_gen_post_led(bool on, cd_uuid_t uuid); /** * @brief generate POST_LINK command to add or update link * @param button button node uuid * @param light light node uuid * @param type type of link to set */ -cd_s_bin* cd_cmd_gen_post_link_add(cd_uuid_t button, cd_uuid_t light, cd_e_cmd_link_type type); +cd_s_bin *cd_cmd_gen_post_link_add(cd_uuid_t button, cd_uuid_t light, cd_e_cmd_link_type type); /** * @brief generate POST_LINK command to remove link * @param button button node uuid * @param light light node uuid */ -cd_s_bin* cd_cmd_gen_post_link_rm(cd_uuid_t button, cd_uuid_t light); +cd_s_bin *cd_cmd_gen_post_link_rm(cd_uuid_t button, cd_uuid_t light); /** * @brief generate POST_NET command to provision node into network * @param uuid node uuid */ -cd_s_bin* cd_cmd_gen_post_net_add(cd_uuid_t uuid); +cd_s_bin *cd_cmd_gen_post_net_add(cd_uuid_t uuid); /** * @brief generate POST_NET command to provision node out of network * @param uuid node uuid */ -cd_s_bin* cd_cmd_gen_post_net_rm(cd_uuid_t uuid); +cd_s_bin *cd_cmd_gen_post_net_rm(cd_uuid_t uuid); /** * @brief generate generic RESPONSE command with error field and no response_info @@ -57,7 +57,7 @@ cd_s_bin* cd_cmd_gen_post_net_rm(cd_uuid_t uuid); * @param id original command id * @param error `true` if some error occurred */ -cd_s_bin* cd_cmd_res_status(cd_e_scmds cmd, cd_cmd_id_t id, bool error); +cd_s_bin *cd_cmd_res_status(cd_e_scmds cmd, cd_cmd_id_t id, bool error); /** * @brief generate RESPONSE command with response_info * @param cmd original command opcode @@ -65,13 +65,13 @@ cd_s_bin* cd_cmd_res_status(cd_e_scmds cmd, cd_cmd_id_t id, bool error); * @param len size of `data` in bytes * @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); +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[]); +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 * @@ -80,7 +80,7 @@ cd_s_cmd_response_get_node* cd_cmd_get_node_res_from_node_arr(uint16_t size, cd_ * @param link_count amount of lights this node controls * @param links array of light node uuids */ -cd_s_cmd_node* cd_cmd_node_alloc(const char* name, cd_s_cmd_node base, uint16_t link_count, cd_uuid_t* links); +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_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 */) diff --git a/shared/protocol.c b/shared/protocol.c index 943604c..c1217b2 100644 --- a/shared/protocol.c +++ b/shared/protocol.c @@ -6,14 +6,14 @@ extern "C" { #endif -cd_cmd_id_t g_cd_protocol_fresh_message_id = 0; +cd_cmd_id_t g_cd_protocol_fresh_message_id = 0; size_t cd_cmd_sizeof(uint8_t data[CD_SERIAL_READ_BUFFER_SIZE], uint8_t data_length) { cd_cmd_opcode_t opcode = data[0]; if (CD_CMD_HANDLERS_SIZE[opcode] > 0) return CD_CMD_HANDLERS_SIZE[opcode]; cd_s_bin *copy = cd_bin_s_alloc(data_length, data); - size_t length = (*CD_CMD_HANDLERS_SIZEOF[opcode])(copy); + size_t length = (*CD_CMD_HANDLERS_SIZEOF[opcode])(copy); CD_FREE(copy); @@ -39,19 +39,14 @@ size_t cd_cmd_sizeof(uint8_t data[CD_SERIAL_READ_BUFFER_SIZE], uint8_t data_leng * 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) { - return CD_DYN_MEMBER_SIZEOF(data, cd_s_cmd_response, response_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); -cd_cmd_id_t cd_protocol_fresh_message_id() { - return g_cd_protocol_fresh_message_id++; -} +size_t cd_cmd_response_sizeof(cd_s_bin *data) { return CD_DYN_MEMBER_SIZEOF(data, cd_s_cmd_response, response_size); } + +cd_cmd_id_t cd_protocol_fresh_message_id() { return g_cd_protocol_fresh_message_id++; } #ifdef __cplusplus } diff --git a/shared/protocol.h b/shared/protocol.h index b9a2c93..5f2370f 100644 --- a/shared/protocol.h +++ b/shared/protocol.h @@ -30,7 +30,7 @@ typedef uint16_t cd_cmd_id_t; typedef uint8_t cd_cmd_bool_t; /** @brief cmd handler function signature */ -typedef void (cd_cmd_handler_t)(cd_s_bin *data); +typedef void(cd_cmd_handler_t)(cd_s_bin *data); /** @brief used for numbering messages */ extern cd_cmd_id_t g_cd_protocol_fresh_message_id; @@ -42,81 +42,81 @@ cd_cmd_id_t cd_protocol_fresh_message_id(); typedef struct { cd_cmd_opcode_t opcode; /** @brief cmd opcode */ - cd_cmd_id_t id; /** @brief message id */ + cd_cmd_id_t id; /** @brief message id */ } cd_s_cmd_ping; typedef struct { cd_cmd_opcode_t opcode; /** @brief cmd opcode */ - cd_cmd_id_t id; /** @brief message id */ - cd_cmd_bool_t all; /** @brief get all known nodes */ - cd_uuid_t uuid; /** @brief node uuid to get details from, ignored if `all` = `true` */ + cd_cmd_id_t id; /** @brief message id */ + cd_cmd_bool_t all; /** @brief get all known nodes */ + cd_uuid_t uuid; /** @brief node uuid to get details from, ignored if `all` = `true` */ } cd_s_cmd_get_node; typedef struct { cd_cmd_opcode_t opcode; /** @brief cmd opcode */ - cd_cmd_id_t id; /** @brief message id */ - cd_cmd_bool_t on; /** @brief new led status */ - cd_uuid_t uuid; /** @brief node uuid to set */ + cd_cmd_id_t id; /** @brief message id */ + cd_cmd_bool_t on; /** @brief new led status */ + cd_uuid_t uuid; /** @brief node uuid to set */ } cd_s_cmd_post_led; typedef enum { - CD_CMD_LINK_TYPE_TOGGLE = 0x00, /** @brief button toggles light */ - CD_CMD_LINK_TYPE_TURN_ON = 0x01, /** @brief button always turns on light (regardless of previous state) */ + CD_CMD_LINK_TYPE_TOGGLE = 0x00, /** @brief button toggles light */ + CD_CMD_LINK_TYPE_TURN_ON = 0x01, /** @brief button always turns on light (regardless of previous state) */ CD_CMD_LINK_TYPE_TURN_OFF = 0x02, /** @brief button always turns off light (regardless of previous state) */ } cd_e_cmd_link_type; typedef struct { cd_cmd_opcode_t opcode; /** @brief cmd opcode */ - cd_cmd_id_t id; /** @brief message id */ - cd_uuid_t button; /** @brief uuid of button node */ - cd_uuid_t led; /** @brief uuid of led node */ - cd_cmd_bool_t add; /** @brief `true` to create/overwrite link, `false` to remove link */ - uint8_t type; /** @brief link type cd_e_cmd_link_type */ + cd_cmd_id_t id; /** @brief message id */ + cd_uuid_t button; /** @brief uuid of button node */ + cd_uuid_t led; /** @brief uuid of led node */ + cd_cmd_bool_t add; /** @brief `true` to create/overwrite link, `false` to remove link */ + uint8_t type; /** @brief link type cd_e_cmd_link_type */ } cd_s_cmd_post_link; typedef struct { cd_cmd_opcode_t opcode; /** @brief cmd opcode */ - cd_cmd_id_t id; /** @brief message id */ - cd_uuid_t uuid; /** @brief node uuid */ - cd_cmd_bool_t join; /** @brief `true` to join network, `false` to leave network */ + cd_cmd_id_t id; /** @brief message id */ + cd_uuid_t uuid; /** @brief node uuid */ + cd_cmd_bool_t join; /** @brief `true` to join network, `false` to leave network */ } cd_s_cmd_post_net; /** @brief protocol node */ typedef struct { - cd_uuid_t uuid; /** @brief node network uuid */ - cd_mac_addr_t address; /** @brief node bluetooth mac address */ - uint8_t name_len; /** @brief name length in bytes */ - cd_cmd_bool_t light_on; /** @brief state of light on node */ - cd_cmd_bool_t provisioned; /** @brief whether the node is provisioned into the network */ - cd_mesh_psub_addr button_pub; /** @brief button publish address */ - uint16_t link_count; /** @brief amount of addresses to publish button press to */ - uint16_t remaining_size; /** @brief calculated size of remaining_data for convenience */ + cd_uuid_t uuid; /** @brief node network uuid */ + cd_mac_addr_t address; /** @brief node bluetooth mac address */ + uint8_t name_len; /** @brief name length in bytes */ + cd_cmd_bool_t light_on; /** @brief state of light on node */ + cd_cmd_bool_t provisioned; /** @brief whether the node is provisioned into the network */ + cd_mesh_psub_addr button_pub; /** @brief button publish address */ + uint16_t link_count; /** @brief amount of addresses to publish button press to */ + uint16_t remaining_size; /** @brief calculated size of remaining_data for convenience */ const uint8_t remaining_data[]; /** * @brief remaining data (name and link array) * * this data is stored adjacently in memory * and is cast when reading/writing this * struct - * + * * 1. char[] name * 2. cd_uuid_t[] light_publish_addresses; */ } cd_s_cmd_node; typedef struct { - uint16_t node_count; /** amount of nodes in 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_node nodes[]; /** nodes adjacent in memory (should be accessed using pointer arithmetic) */ } cd_s_cmd_response_get_node; typedef struct { - cd_cmd_opcode_t opcode; /** @brief cmd opcode */ - cd_cmd_id_t id; /** @brief response message id */ - cd_cmd_bool_t error; /** @brief `true` if some error occurred */ + cd_cmd_opcode_t opcode; /** @brief cmd opcode */ + cd_cmd_id_t id; /** @brief response message id */ + cd_cmd_bool_t error; /** @brief `true` if some error occurred */ cd_cmd_opcode_t response_type; /** @brief response type, used to cast type of `response_info` */ - cd_cmd_id_t response_id; /** @brief original message id */ - uint16_t response_size; /** @brief size of remaining response */ - uint8_t response_info[]; /** @brief (CAST) remaining response struct, not read if `response_size`=`0` */ + cd_cmd_id_t response_id; /** @brief original message id */ + uint16_t response_size; /** @brief size of remaining response */ + uint8_t response_info[]; /** @brief (CAST) remaining response struct, not read if `response_size`=`0` */ } cd_s_cmd_response; #pragma pack(pop) @@ -127,55 +127,37 @@ void cd_cmd_handle(uint8_t data[CD_SERIAL_READ_BUFFER_SIZE], uint8_t length); size_t cd_cmd_sizeof(uint8_t data[CD_SERIAL_READ_BUFFER_SIZE], uint8_t length); /** @brief calculate dynamic size of response message */ -size_t cd_cmd_response_sizeof(cd_s_bin* data); +size_t cd_cmd_response_sizeof(cd_s_bin *data); // down here is the garbage manual duplicate code section for constants #define CD_CMD_COUNT 6 typedef enum { - CD_CMD_PING = 0x00, /** @brief send ping */ - CD_CMD_GET_NODE = 0x01, /** @brief get node(s) */ - CD_CMD_POST_LED = 0x02, /** @brief set led */ + CD_CMD_PING = 0x00, /** @brief send ping */ + CD_CMD_GET_NODE = 0x01, /** @brief get node(s) */ + CD_CMD_POST_LED = 0x02, /** @brief set led */ CD_CMD_POST_LINK = 0x03, /** @brief set/remove link */ - CD_CMD_POST_NET = 0x04, /** @brief (un)register node with network */ - CD_CMD_RESPONSE = 0x05, /** @brief response message */ + CD_CMD_POST_NET = 0x04, /** @brief (un)register node with network */ + CD_CMD_RESPONSE = 0x05, /** @brief response message */ } cd_e_scmds; -cd_cmd_handler_t cd_cmd_ping, - cd_cmd_get_node, - cd_cmd_post_led, - cd_cmd_post_link, - cd_cmd_post_net, - cd_cmd_response; +cd_cmd_handler_t cd_cmd_ping, cd_cmd_get_node, cd_cmd_post_led, cd_cmd_post_link, cd_cmd_post_net, cd_cmd_response; /** @brief constant message sizes, 0 for dynamic size */ static const size_t CD_CMD_HANDLERS_SIZE[CD_CMD_COUNT] = { - [CD_CMD_PING] = sizeof(cd_s_cmd_ping), - [CD_CMD_GET_NODE] = sizeof(cd_s_cmd_get_node), - [CD_CMD_POST_LED] = sizeof(cd_s_cmd_post_led), - [CD_CMD_POST_LINK] = sizeof(cd_s_cmd_post_link), - [CD_CMD_POST_NET] = sizeof(cd_s_cmd_post_net), - [CD_CMD_RESPONSE] = 0, + [CD_CMD_PING] = sizeof(cd_s_cmd_ping), [CD_CMD_GET_NODE] = sizeof(cd_s_cmd_get_node), [CD_CMD_POST_LED] = sizeof(cd_s_cmd_post_led), + [CD_CMD_POST_LINK] = sizeof(cd_s_cmd_post_link), [CD_CMD_POST_NET] = sizeof(cd_s_cmd_post_net), [CD_CMD_RESPONSE] = 0, }; /** @brief constant message sizes, 0 for dynamic size */ -static size_t (* const CD_CMD_HANDLERS_SIZEOF[CD_CMD_COUNT])(cd_s_bin*) = { - [CD_CMD_PING] = NULL, - [CD_CMD_GET_NODE] = NULL, - [CD_CMD_POST_LED] = NULL, - [CD_CMD_POST_LINK] = NULL, - [CD_CMD_POST_NET] = NULL, - [CD_CMD_RESPONSE] = &cd_cmd_response_sizeof, +static size_t (*const CD_CMD_HANDLERS_SIZEOF[CD_CMD_COUNT])(cd_s_bin *) = { + [CD_CMD_PING] = NULL, [CD_CMD_GET_NODE] = NULL, [CD_CMD_POST_LED] = NULL, [CD_CMD_POST_LINK] = NULL, [CD_CMD_POST_NET] = NULL, [CD_CMD_RESPONSE] = &cd_cmd_response_sizeof, }; /** @brief stores message handlers in array with opcode as index */ -static cd_cmd_handler_t* const CD_CMD_HANDLERS[CD_CMD_COUNT] = { - [CD_CMD_PING] = &cd_cmd_ping, - [CD_CMD_GET_NODE] = &cd_cmd_get_node, - [CD_CMD_POST_LED] = &cd_cmd_post_led, - [CD_CMD_POST_LINK] = &cd_cmd_post_link, - [CD_CMD_POST_NET] = &cd_cmd_post_net, - [CD_CMD_RESPONSE] = &cd_cmd_response, +static cd_cmd_handler_t *const CD_CMD_HANDLERS[CD_CMD_COUNT] = { + [CD_CMD_PING] = &cd_cmd_ping, [CD_CMD_GET_NODE] = &cd_cmd_get_node, [CD_CMD_POST_LED] = &cd_cmd_post_led, + [CD_CMD_POST_LINK] = &cd_cmd_post_link, [CD_CMD_POST_NET] = &cd_cmd_post_net, [CD_CMD_RESPONSE] = &cd_cmd_response, }; #ifdef __cplusplus diff --git a/shared/serial_parse.c b/shared/serial_parse.c index 1397918..f580fee 100644 --- a/shared/serial_parse.c +++ b/shared/serial_parse.c @@ -1,5 +1,5 @@ -#include <string.h> #include <memory.h> +#include <string.h> #include "consts.h" #include "serial_parse.h" @@ -45,10 +45,10 @@ bool cd_serial_parse(uint8_t byte) { } void cd_cmd_handle(uint8_t data[CD_SERIAL_READ_BUFFER_SIZE], uint8_t data_length) { - cd_s_bin *copy = cd_bin_s_alloc(data_length, data); + cd_s_bin *copy = cd_bin_s_alloc(data_length, data); if (data[0] >= CD_CMD_COUNT) return; - cd_cmd_handler_t* handler = CD_CMD_HANDLERS[data[0]]; + cd_cmd_handler_t *handler = CD_CMD_HANDLERS[data[0]]; if (handler == NULL) return; (*handler)(copy); @@ -59,4 +59,3 @@ void cd_cmd_handle(uint8_t data[CD_SERIAL_READ_BUFFER_SIZE], uint8_t data_length #ifdef __cplusplus } #endif - diff --git a/shared/serial_parse.h b/shared/serial_parse.h index 1e9c404..2174436 100644 --- a/shared/serial_parse.h +++ b/shared/serial_parse.h @@ -2,8 +2,8 @@ /** @file serial_parse.h */ -#include <stdint.h> #include <stdbool.h> +#include <stdint.h> #include "protocol.h" @@ -23,4 +23,3 @@ bool cd_serial_parse(uint8_t byte); #ifdef __cplusplus } #endif - |