/* Format a poll response message */ uint16_t hmtl_poll_fmt(byte *buffer, uint16_t buffsize, uint16_t address, byte flags, uint16_t object_type, config_hdr_t *config, output_hdr_t *outputs[], uint16_t recv_buffer_size) { msg_hdr_t *msg_hdr = (msg_hdr_t *)buffer; msg_poll_response_t *msg_poll = (msg_poll_response_t *)(msg_hdr + 1); if (buffsize < HMTL_MSG_POLL_MIN_LEN) { DEBUG_ERR("hmtl_poll_fmt: too small size"); DEBUG_ERR_STATE(1); } // Construct the primary data uint16_t len = HMTL_MSG_POLL_MIN_LEN; memcpy(&msg_poll->config, config, sizeof (config_hdr_t)); msg_poll->object_type = object_type; msg_poll->recv_buffer_size = recv_buffer_size; msg_poll->msg_version = HMTL_MSG_VERSION; // TODO: Add outputs XXX hmtl_msg_fmt(msg_hdr, address, len, MSG_TYPE_POLL); msg_hdr->flags |= flags | MSG_FLAG_ACK; return len; }
/* Format an address setting message */ uint16_t hmtl_set_addr_fmt(byte *buffer, uint16_t buffsize, uint16_t address, uint16_t device_id, uint16_t new_address) { msg_hdr_t *msg_hdr = (msg_hdr_t *)buffer; msg_set_addr_t *msg_addr = (msg_set_addr_t *)(msg_hdr + 1); if (buffsize < HMTL_MSG_SET_ADDR_LEN) { DEBUG_ERR("too small size"); DEBUG_ERR_STATE(1); } msg_addr->device_id = device_id; msg_addr->address = new_address; hmtl_msg_fmt(msg_hdr, address, HMTL_MSG_SET_ADDR_LEN, MSG_TYPE_SET_ADDR); return HMTL_MSG_SET_ADDR_LEN; }
/* * Format a sensor response message. The caller will fill in the actual sensor * data after the header. */ uint16_t hmtl_sensor_fmt(byte *buffer, uint16_t buffsize, uint16_t address, uint8_t datalen, uint8_t **data_ptr) { msg_hdr_t *msg_hdr = (msg_hdr_t *)buffer; msg_sensor_response_t *msg_sense = (msg_sensor_response_t *)(msg_hdr + 1); uint16_t len = HMTL_MSG_SENSOR_MIN_LEN + datalen; /* Format the message header */ hmtl_msg_fmt(msg_hdr, address, len, MSG_TYPE_SENSOR); msg_hdr->flags |= MSG_FLAG_ACK; /* Set the data ptr to be returned */ *data_ptr = (uint8_t *)&msg_sense->data; return len; }
/* Format a value message */ uint16_t hmtl_value_fmt(byte *buffer, uint16_t buffsize, uint16_t address, uint8_t output, int value) { msg_hdr_t *msg_hdr = (msg_hdr_t *)buffer; msg_value_t *msg_value = (msg_value_t *)(msg_hdr + 1); if (buffsize < HMTL_MSG_VALUE_LEN) { DEBUG_ERR("hmtl_value_fmt: too small size"); DEBUG_ERR_STATE(1); } msg_value->hdr.type = HMTL_OUTPUT_VALUE; msg_value->hdr.output = output; msg_value->value = value; hmtl_msg_fmt(msg_hdr, address, HMTL_MSG_VALUE_LEN, MSG_TYPE_OUTPUT); return HMTL_MSG_VALUE_LEN; }
void TimeSync::sendSyncMsg(Socket *socket, socket_addr_t target, byte phase, int adjustment = 0) { if (socket->send_data_size < HMTL_MSG_SIZE(msg_time_sync_t)) { DEBUG1_VALUELN("sync buf too small: ", socket->send_data_size); // DEBUG_ERR("startsync to small"); return; } msg_hdr_t *msg_hdr = (msg_hdr_t *)socket->send_buffer; msg_time_sync_t *msg_time = (msg_time_sync_t *)(msg_hdr + 1); msg_time->sync_phase = phase; msg_time->timestamp = ms() + adjustment; hmtl_msg_fmt(msg_hdr, target, HMTL_MSG_SIZE(msg_time_sync_t), MSG_TYPE_TIMESYNC); socket->sendMsgTo(target, socket->send_buffer, HMTL_MSG_SIZE(msg_time_sync_t)); DEBUG3_VALUE(" phase:", phase); DEBUG3_VALUE(" time:", msg_time->timestamp); }
/* Format an RGB message */ uint16_t hmtl_rgb_fmt(byte *buffer, uint16_t buffsize, uint16_t address, uint8_t output, uint8_t r, uint8_t g, uint8_t b) { msg_hdr_t *msg_hdr = (msg_hdr_t *)buffer; msg_rgb_t *msg_rgb = (msg_rgb_t *)(msg_hdr + 1); if (buffsize < HMTL_MSG_RGB_LEN) { DEBUG_ERR("hmtl_rgb_fmt: too small size"); DEBUG_ERR_STATE(1); } msg_rgb->hdr.type = HMTL_OUTPUT_RGB; msg_rgb->hdr.output = output; msg_rgb->values[0] = r; msg_rgb->values[1] = g; msg_rgb->values[2] = b; hmtl_msg_fmt(msg_hdr, address, HMTL_MSG_RGB_LEN, MSG_TYPE_OUTPUT); return HMTL_MSG_VALUE_LEN; }