package VisualServoSolution;

import Carmen.*;

/**
 * <p>Message used to send vision information</p>
 * 
 * @author previous TA's, prentice, vona
 **/
public class VisionImageMessage extends CameraMessage {
  
  private static final String CARMEN_VISION_IMAGE_NAME = "carmen_vision_image";
  private static final String CARMEN_VISION_IMAGE_FMT =  "{int, int, int, int, <char:4>, double, string};";
 
  /**
   * <p>Create a new VisionImageMessage from a CameraMessage.</p>
   *
   * <p>{@link #timestamp} and {@link #host} are set to the current time and
   * host, respectively.  All other instance fields are copied from
   * <code>cameraMsg</code>.</p>
   *
   * <p>Allocates same-sized image array, but does not copy contents of
   * image.</p>
   *
   * @param cameraMsg the CameraMessge to copy
   **/
  public VisionImageMessage(CameraMessage cameraMsg) {
    width = cameraMsg.width;
    height = cameraMsg.height;
    bytes_per_char = cameraMsg.bytes_per_char;
    image_size = cameraMsg.image_size;
    image = new char[cameraMsg.image_size];
    timestamp = Util.getTime();
    host = Util.getHostName();
  }
  
  
  /**
   * <p>Create a new VisionImageMessage.</p>
   *
   */
  public VisionImageMessage() {
    timestamp = Util.getTime();
    host = Util.getHostName();    
  }
  
  
  /**
   * <p>Subscribe a class to VisionImageMessages.</p>
   * 
   * @param a VisionImageHandler
   */
  public static void subscribe(VisionImageHandler handler) {
    subscribe(CARMEN_VISION_IMAGE_NAME, CARMEN_VISION_IMAGE_FMT, handler, 
        VisionImageMessage.class, "handle");
  }
  
  /**
   * <p>Publish VisionImageMessage to subscribers</p>
   */
  public void publish() {
    publish(CARMEN_VISION_IMAGE_NAME, CARMEN_VISION_IMAGE_FMT, this);
  }
  
}
