#include #include "protocol.h" #include "pclient.h" #include "bin.h" #ifdef __cplusplus extern "C" { #endif 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()); return bin; } 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; memcpy(&msg->uuid, &uuid, sizeof(cd_uuid_t)); return bin; } 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; 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_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; memcpy(&msg->button, &button, sizeof(cd_uuid_t)); memcpy(&msg->led, &light, sizeof(cd_uuid_t)); msg->type = type; return bin; } 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; memcpy(&msg->button, &button, sizeof(cd_uuid_t)); memcpy(&msg->led, &light, sizeof(cd_uuid_t)); return bin; } 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; memcpy(&msg->uuid, &uuid, sizeof(cd_uuid_t)); return bin; } 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; 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_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->response_type = cmd; 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_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->response_type = cmd; msg->response_id = id; msg->error = false; msg->response_size = len; memcpy(msg->response_info, data, len); return bin; } cd_s_cmd_node* cd_cmd_node_alloc(cd_s_cmd_node base, const char* name, uint16_t link_count, cd_uuid_t* links) { size_t name_len = strlen(name); size_t links_len = sizeof(cd_uuid_t) * link_count; size_t size = sizeof(cd_s_cmd_node) + sizeof(char) * name_len + links_len; cd_s_cmd_node* node = malloc(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->size = cd_bin_hton16(size); memcpy((void *)&node->data_remainder, name, name_len); // copy name memcpy((void *)&node->data_remainder + name_len, links, links_len); // copy links return node; } #ifdef __cplusplus } #endif