Beispiel #1
0
/* 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;
}
Beispiel #2
0
/* 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;
}
Beispiel #3
0
/*
 * 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;
}
Beispiel #4
0
/* 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;
}
Beispiel #5
0
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);
}
Beispiel #6
0
/* 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;
}