// Autogenerated C++ message buffer code.
// Source: clad/vizInterface/messageViz.clad
// Full command line: victor-clad/tools/message-buffers/emitters/CPP_emitter.py --output-union-helper-constructors --output-json -C vizSrc -I clad/src lib/util/source/anki/clad robot/clad/src coretech/vision/clad_src coretech/common/clad_src -o generated/clad/engine clad/vizInterface/messageViz.clad

#ifndef __CLAD_VIZ_INTERFACE_MESSAGE_VIZ_H__
#define __CLAD_VIZ_INTERFACE_MESSAGE_VIZ_H__

#include <CLAD/SafeMessageBuffer.h>
#include <array>
#include <cassert>
#include <cstdint>
#include <string>
#include <vector>

#include "clad/vizInterface/messageVizTag.h"
#include "json/json.h"

#include "clad/robotInterface/messageFromAnimProcess.h"
#include "clad/types/robotStatusAndActions.h"
#include "clad/types/cameraParams.h"
#include "clad/types/imageTypes.h"
#include "clad/types/objectTypes.h"
#include "clad/types/offTreadsStates.h"
#include "clad/types/vizTypes.h"
#include "clad/types/globalVizOrigin.h"
#include "clad/types/activeObjectAccel.h"
#include "clad/types/memoryMap.h"
#include "clad/types/visionModes.h"

namespace Anki {

namespace Vector {

namespace VizInterface {

// MESSAGE RobotStateMessage
struct RobotStateMessage
{
  Anki::Vector::RobotState state;
  float imuTemperature_degC;
  std::array<uint16_t, 4> cliffThresholds;
  uint16_t videoFramePeriodMs;
  uint16_t imageProcPeriodMs;
  uint8_t lockedAnimTracks;
  uint8_t animTracksInUse;
  float batteryVolts;
  Anki::Vector::OffTreadsState offTreadsState;
  Anki::Vector::OffTreadsState awaitingConfirmationTreadState;
  
  /**** Constructors ****/
  RobotStateMessage() = default;
  RobotStateMessage(const RobotStateMessage& other) = default;
  RobotStateMessage(RobotStateMessage& other) = default;
  RobotStateMessage(RobotStateMessage&& other) noexcept = default;
  RobotStateMessage& operator=(const RobotStateMessage& other) = default;
  RobotStateMessage& operator=(RobotStateMessage&& other) = default;
  
  explicit RobotStateMessage(const Anki::Vector::RobotState& state,
    float imuTemperature_degC,
    const std::array<uint16_t, 4>& cliffThresholds,
    uint16_t videoFramePeriodMs,
    uint16_t imageProcPeriodMs,
    uint8_t lockedAnimTracks,
    uint8_t animTracksInUse,
    float batteryVolts,
    Anki::Vector::OffTreadsState offTreadsState,
    Anki::Vector::OffTreadsState awaitingConfirmationTreadState)
  : state(state)
  , imuTemperature_degC(imuTemperature_degC)
  , cliffThresholds(cliffThresholds)
  , videoFramePeriodMs(videoFramePeriodMs)
  , imageProcPeriodMs(imageProcPeriodMs)
  , lockedAnimTracks(lockedAnimTracks)
  , animTracksInUse(animTracksInUse)
  , batteryVolts(batteryVolts)
  , offTreadsState(offTreadsState)
  , awaitingConfirmationTreadState(awaitingConfirmationTreadState)
  {}
  
  explicit RobotStateMessage(const uint8_t* buff, size_t len);
  explicit RobotStateMessage(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const RobotStateMessage& other) const;
  bool operator!=(const RobotStateMessage& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(state, imuTemperature_degC, cliffThresholds, videoFramePeriodMs, imageProcPeriodMs, lockedAnimTracks, animTracksInUse, batteryVolts, offTreadsState, awaitingConfirmationTreadState);
  }
};

extern const char* RobotStateMessageVersionHashStr;
extern const uint8_t RobotStateMessageVersionHash[16];

// MESSAGE CurrentAnimation
struct CurrentAnimation
{
  uint8_t tag;
  std::string animName;
  
  /**** Constructors ****/
  CurrentAnimation() = default;
  CurrentAnimation(const CurrentAnimation& other) = default;
  CurrentAnimation(CurrentAnimation& other) = default;
  CurrentAnimation(CurrentAnimation&& other) noexcept = default;
  CurrentAnimation& operator=(const CurrentAnimation& other) = default;
  CurrentAnimation& operator=(CurrentAnimation&& other) = default;
  
  explicit CurrentAnimation(uint8_t tag,
    const std::string& animName)
  : tag(tag)
  , animName(animName)
  {}
  
  explicit CurrentAnimation(const uint8_t* buff, size_t len);
  explicit CurrentAnimation(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const CurrentAnimation& other) const;
  bool operator!=(const CurrentAnimation& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(tag, animName);
  }
};

extern const char* CurrentAnimationVersionHashStr;
extern const uint8_t CurrentAnimationVersionHash[16];

// MESSAGE Object
struct Object
{
  uint32_t objectID;
  Anki::Vector::VizObjectType objectTypeID;
  uint32_t color;
  float x_size_m;
  float y_size_m;
  float z_size_m;
  float x_trans_m;
  float y_trans_m;
  float z_trans_m;
  float rot_deg;
  float rot_axis_x;
  float rot_axis_y;
  float rot_axis_z;
  std::array<float, 4> objParameters;
  std::string text;
  
  /**** Constructors ****/
  Object() = default;
  Object(const Object& other) = default;
  Object(Object& other) = default;
  Object(Object&& other) noexcept = default;
  Object& operator=(const Object& other) = default;
  Object& operator=(Object&& other) = default;
  
  explicit Object(uint32_t objectID,
    Anki::Vector::VizObjectType objectTypeID,
    uint32_t color,
    float x_size_m,
    float y_size_m,
    float z_size_m,
    float x_trans_m,
    float y_trans_m,
    float z_trans_m,
    float rot_deg,
    float rot_axis_x,
    float rot_axis_y,
    float rot_axis_z,
    const std::array<float, 4>& objParameters,
    const std::string& text)
  : objectID(objectID)
  , objectTypeID(objectTypeID)
  , color(color)
  , x_size_m(x_size_m)
  , y_size_m(y_size_m)
  , z_size_m(z_size_m)
  , x_trans_m(x_trans_m)
  , y_trans_m(y_trans_m)
  , z_trans_m(z_trans_m)
  , rot_deg(rot_deg)
  , rot_axis_x(rot_axis_x)
  , rot_axis_y(rot_axis_y)
  , rot_axis_z(rot_axis_z)
  , objParameters(objParameters)
  , text(text)
  {}
  
  explicit Object(const uint8_t* buff, size_t len);
  explicit Object(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const Object& other) const;
  bool operator!=(const Object& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(objectID, objectTypeID, color, x_size_m, y_size_m, z_size_m, x_trans_m, y_trans_m, z_trans_m, rot_deg, rot_axis_x, rot_axis_y, rot_axis_z, objParameters, text);
  }
};

extern const char* ObjectVersionHashStr;
extern const uint8_t ObjectVersionHash[16];

// MESSAGE LineSegment
struct LineSegment
{
  std::string identifier;
  uint32_t color;
  std::array<float, 3> origin;
  std::array<float, 3> dest;
  bool clearPrevious;
  
  /**** Constructors ****/
  LineSegment() = default;
  LineSegment(const LineSegment& other) = default;
  LineSegment(LineSegment& other) = default;
  LineSegment(LineSegment&& other) noexcept = default;
  LineSegment& operator=(const LineSegment& other) = default;
  LineSegment& operator=(LineSegment&& other) = default;
  
  explicit LineSegment(const std::string& identifier,
    uint32_t color,
    const std::array<float, 3>& origin,
    const std::array<float, 3>& dest,
    bool clearPrevious)
  : identifier(identifier)
  , color(color)
  , origin(origin)
  , dest(dest)
  , clearPrevious(clearPrevious)
  {}
  
  explicit LineSegment(const uint8_t* buff, size_t len);
  explicit LineSegment(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const LineSegment& other) const;
  bool operator!=(const LineSegment& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(identifier, color, origin, dest, clearPrevious);
  }
};

extern const char* LineSegmentVersionHashStr;
extern const uint8_t LineSegmentVersionHash[16];

// MESSAGE Quad
struct Quad
{
  Anki::Vector::VizQuadType quadType;
  uint32_t quadID;
  uint32_t color;
  float xUpperLeft;
  float yUpperLeft;
  float zUpperLeft;
  float xLowerLeft;
  float yLowerLeft;
  float zLowerLeft;
  float xUpperRight;
  float yUpperRight;
  float zUpperRight;
  float xLowerRight;
  float yLowerRight;
  float zLowerRight;
  
  /**** Constructors ****/
  Quad() = default;
  Quad(const Quad& other) = default;
  Quad(Quad& other) = default;
  Quad(Quad&& other) noexcept = default;
  Quad& operator=(const Quad& other) = default;
  Quad& operator=(Quad&& other) = default;
  
  explicit Quad(Anki::Vector::VizQuadType quadType,
    uint32_t quadID,
    uint32_t color,
    float xUpperLeft,
    float yUpperLeft,
    float zUpperLeft,
    float xLowerLeft,
    float yLowerLeft,
    float zLowerLeft,
    float xUpperRight,
    float yUpperRight,
    float zUpperRight,
    float xLowerRight,
    float yLowerRight,
    float zLowerRight)
  : quadType(quadType)
  , quadID(quadID)
  , color(color)
  , xUpperLeft(xUpperLeft)
  , yUpperLeft(yUpperLeft)
  , zUpperLeft(zUpperLeft)
  , xLowerLeft(xLowerLeft)
  , yLowerLeft(yLowerLeft)
  , zLowerLeft(zLowerLeft)
  , xUpperRight(xUpperRight)
  , yUpperRight(yUpperRight)
  , zUpperRight(zUpperRight)
  , xLowerRight(xLowerRight)
  , yLowerRight(yLowerRight)
  , zLowerRight(zLowerRight)
  {}
  
  explicit Quad(const uint8_t* buff, size_t len);
  explicit Quad(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const Quad& other) const;
  bool operator!=(const Quad& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(quadType, quadID, color, xUpperLeft, yUpperLeft, zUpperLeft, xLowerLeft, yLowerLeft, zLowerLeft, xUpperRight, yUpperRight, zUpperRight, xLowerRight, yLowerRight, zLowerRight);
  }
};

extern const char* QuadVersionHashStr;
extern const uint8_t QuadVersionHash[16];

// MESSAGE MemoryMapMessageVizBegin
struct MemoryMapMessageVizBegin
{
  uint32_t originId;
  Anki::Vector::ExternalInterface::MemoryMapInfo info;
  
  /**** Constructors ****/
  MemoryMapMessageVizBegin() = default;
  MemoryMapMessageVizBegin(const MemoryMapMessageVizBegin& other) = default;
  MemoryMapMessageVizBegin(MemoryMapMessageVizBegin& other) = default;
  MemoryMapMessageVizBegin(MemoryMapMessageVizBegin&& other) noexcept = default;
  MemoryMapMessageVizBegin& operator=(const MemoryMapMessageVizBegin& other) = default;
  MemoryMapMessageVizBegin& operator=(MemoryMapMessageVizBegin&& other) = default;
  
  explicit MemoryMapMessageVizBegin(uint32_t originId,
    const Anki::Vector::ExternalInterface::MemoryMapInfo& info)
  : originId(originId)
  , info(info)
  {}
  
  explicit MemoryMapMessageVizBegin(const uint8_t* buff, size_t len);
  explicit MemoryMapMessageVizBegin(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const MemoryMapMessageVizBegin& other) const;
  bool operator!=(const MemoryMapMessageVizBegin& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(originId, info);
  }
};

extern const char* MemoryMapMessageVizBeginVersionHashStr;
extern const uint8_t MemoryMapMessageVizBeginVersionHash[16];

// MESSAGE MemoryMapMessageViz
struct MemoryMapMessageViz
{
  uint32_t originId;
  std::vector<Anki::Vector::ExternalInterface::MemoryMapQuadInfoFull> quadInfos;
  
  /**** Constructors ****/
  MemoryMapMessageViz() = default;
  MemoryMapMessageViz(const MemoryMapMessageViz& other) = default;
  MemoryMapMessageViz(MemoryMapMessageViz& other) = default;
  MemoryMapMessageViz(MemoryMapMessageViz&& other) noexcept = default;
  MemoryMapMessageViz& operator=(const MemoryMapMessageViz& other) = default;
  MemoryMapMessageViz& operator=(MemoryMapMessageViz&& other) = default;
  
  explicit MemoryMapMessageViz(uint32_t originId,
    const std::vector<Anki::Vector::ExternalInterface::MemoryMapQuadInfoFull>& quadInfos)
  : originId(originId)
  , quadInfos(quadInfos)
  {}
  
  explicit MemoryMapMessageViz(const uint8_t* buff, size_t len);
  explicit MemoryMapMessageViz(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const MemoryMapMessageViz& other) const;
  bool operator!=(const MemoryMapMessageViz& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(originId, quadInfos);
  }
};

extern const char* MemoryMapMessageVizVersionHashStr;
extern const uint8_t MemoryMapMessageVizVersionHash[16];

// MESSAGE MemoryMapMessageVizEnd
struct MemoryMapMessageVizEnd
{
  uint32_t originId;
  
  /**** Constructors ****/
  MemoryMapMessageVizEnd() = default;
  MemoryMapMessageVizEnd(const MemoryMapMessageVizEnd& other) = default;
  MemoryMapMessageVizEnd(MemoryMapMessageVizEnd& other) = default;
  MemoryMapMessageVizEnd(MemoryMapMessageVizEnd&& other) noexcept = default;
  MemoryMapMessageVizEnd& operator=(const MemoryMapMessageVizEnd& other) = default;
  MemoryMapMessageVizEnd& operator=(MemoryMapMessageVizEnd&& other) = default;
  
  explicit MemoryMapMessageVizEnd(uint32_t originId)
  : originId(originId)
  {}
  
  explicit MemoryMapMessageVizEnd(const uint8_t* buff, size_t len);
  explicit MemoryMapMessageVizEnd(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const MemoryMapMessageVizEnd& other) const;
  bool operator!=(const MemoryMapMessageVizEnd& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(originId);
  }
};

extern const char* MemoryMapMessageVizEndVersionHashStr;
extern const uint8_t MemoryMapMessageVizEndVersionHash[16];

// MESSAGE EnabledVisionModes
struct EnabledVisionModes
{
  std::vector<Anki::Vector::VisionMode> modes;
  
  /**** Constructors ****/
  EnabledVisionModes() = default;
  EnabledVisionModes(const EnabledVisionModes& other) = default;
  EnabledVisionModes(EnabledVisionModes& other) = default;
  EnabledVisionModes(EnabledVisionModes&& other) noexcept = default;
  EnabledVisionModes& operator=(const EnabledVisionModes& other) = default;
  EnabledVisionModes& operator=(EnabledVisionModes&& other) = default;
  
  explicit EnabledVisionModes(const std::vector<Anki::Vector::VisionMode>& modes)
  : modes(modes)
  {}
  
  explicit EnabledVisionModes(const uint8_t* buff, size_t len);
  explicit EnabledVisionModes(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const EnabledVisionModes& other) const;
  bool operator!=(const EnabledVisionModes& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(modes);
  }
};

extern const char* EnabledVisionModesVersionHashStr;
extern const uint8_t EnabledVisionModesVersionHash[16];

// MESSAGE CameraQuad
struct CameraQuad
{
  uint32_t color;
  uint32_t topColor;
  float xUpperLeft;
  float yUpperLeft;
  float xLowerLeft;
  float yLowerLeft;
  float xUpperRight;
  float yUpperRight;
  float xLowerRight;
  float yLowerRight;
  
  /**** Constructors ****/
  CameraQuad() = default;
  CameraQuad(const CameraQuad& other) = default;
  CameraQuad(CameraQuad& other) = default;
  CameraQuad(CameraQuad&& other) noexcept = default;
  CameraQuad& operator=(const CameraQuad& other) = default;
  CameraQuad& operator=(CameraQuad&& other) = default;
  
  explicit CameraQuad(uint32_t color,
    uint32_t topColor,
    float xUpperLeft,
    float yUpperLeft,
    float xLowerLeft,
    float yLowerLeft,
    float xUpperRight,
    float yUpperRight,
    float xLowerRight,
    float yLowerRight)
  : color(color)
  , topColor(topColor)
  , xUpperLeft(xUpperLeft)
  , yUpperLeft(yUpperLeft)
  , xLowerLeft(xLowerLeft)
  , yLowerLeft(yLowerLeft)
  , xUpperRight(xUpperRight)
  , yUpperRight(yUpperRight)
  , xLowerRight(xLowerRight)
  , yLowerRight(yLowerRight)
  {}
  
  explicit CameraQuad(const uint8_t* buff, size_t len);
  explicit CameraQuad(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const CameraQuad& other) const;
  bool operator!=(const CameraQuad& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(color, topColor, xUpperLeft, yUpperLeft, xLowerLeft, yLowerLeft, xUpperRight, yUpperRight, xLowerRight, yLowerRight);
  }
};

extern const char* CameraQuadVersionHashStr;
extern const uint8_t CameraQuadVersionHash[16];

// MESSAGE CameraRect
struct CameraRect
{
  uint32_t color;
  float x;
  float y;
  float width;
  float height;
  bool filled;
  
  /**** Constructors ****/
  CameraRect() = default;
  CameraRect(const CameraRect& other) = default;
  CameraRect(CameraRect& other) = default;
  CameraRect(CameraRect&& other) noexcept = default;
  CameraRect& operator=(const CameraRect& other) = default;
  CameraRect& operator=(CameraRect&& other) = default;
  
  explicit CameraRect(uint32_t color,
    float x,
    float y,
    float width,
    float height,
    bool filled)
  : color(color)
  , x(x)
  , y(y)
  , width(width)
  , height(height)
  , filled(filled)
  {}
  
  explicit CameraRect(const uint8_t* buff, size_t len);
  explicit CameraRect(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const CameraRect& other) const;
  bool operator!=(const CameraRect& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(color, x, y, width, height, filled);
  }
};

extern const char* CameraRectVersionHashStr;
extern const uint8_t CameraRectVersionHash[16];

// MESSAGE CameraLine
struct CameraLine
{
  uint32_t color;
  float xStart;
  float yStart;
  float xEnd;
  float yEnd;
  
  /**** Constructors ****/
  CameraLine() = default;
  CameraLine(const CameraLine& other) = default;
  CameraLine(CameraLine& other) = default;
  CameraLine(CameraLine&& other) noexcept = default;
  CameraLine& operator=(const CameraLine& other) = default;
  CameraLine& operator=(CameraLine&& other) = default;
  
  explicit CameraLine(uint32_t color,
    float xStart,
    float yStart,
    float xEnd,
    float yEnd)
  : color(color)
  , xStart(xStart)
  , yStart(yStart)
  , xEnd(xEnd)
  , yEnd(yEnd)
  {}
  
  explicit CameraLine(const uint8_t* buff, size_t len);
  explicit CameraLine(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const CameraLine& other) const;
  bool operator!=(const CameraLine& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(color, xStart, yStart, xEnd, yEnd);
  }
};

extern const char* CameraLineVersionHashStr;
extern const uint8_t CameraLineVersionHash[16];

// MESSAGE CameraOval
struct CameraOval
{
  uint32_t color;
  float xCen;
  float yCen;
  float xRad;
  float yRad;
  
  /**** Constructors ****/
  CameraOval() = default;
  CameraOval(const CameraOval& other) = default;
  CameraOval(CameraOval& other) = default;
  CameraOval(CameraOval&& other) noexcept = default;
  CameraOval& operator=(const CameraOval& other) = default;
  CameraOval& operator=(CameraOval&& other) = default;
  
  explicit CameraOval(uint32_t color,
    float xCen,
    float yCen,
    float xRad,
    float yRad)
  : color(color)
  , xCen(xCen)
  , yCen(yCen)
  , xRad(xRad)
  , yRad(yRad)
  {}
  
  explicit CameraOval(const uint8_t* buff, size_t len);
  explicit CameraOval(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const CameraOval& other) const;
  bool operator!=(const CameraOval& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(color, xCen, yCen, xRad, yRad);
  }
};

extern const char* CameraOvalVersionHashStr;
extern const uint8_t CameraOvalVersionHash[16];

// MESSAGE CameraText
struct CameraText
{
  uint32_t color;
  int32_t x;
  int32_t y;
  std::string text;
  
  /**** Constructors ****/
  CameraText() = default;
  CameraText(const CameraText& other) = default;
  CameraText(CameraText& other) = default;
  CameraText(CameraText&& other) noexcept = default;
  CameraText& operator=(const CameraText& other) = default;
  CameraText& operator=(CameraText&& other) = default;
  
  explicit CameraText(uint32_t color,
    int32_t x,
    int32_t y,
    const std::string& text)
  : color(color)
  , x(x)
  , y(y)
  , text(text)
  {}
  
  explicit CameraText(const uint8_t* buff, size_t len);
  explicit CameraText(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const CameraText& other) const;
  bool operator!=(const CameraText& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(color, x, y, text);
  }
};

extern const char* CameraTextVersionHashStr;
extern const uint8_t CameraTextVersionHash[16];

// MESSAGE EraseObject
struct EraseObject
{
  uint32_t objectID;
  uint32_t lower_bound_id;
  uint32_t upper_bound_id;
  
  /**** Constructors ****/
  EraseObject() = default;
  EraseObject(const EraseObject& other) = default;
  EraseObject(EraseObject& other) = default;
  EraseObject(EraseObject&& other) noexcept = default;
  EraseObject& operator=(const EraseObject& other) = default;
  EraseObject& operator=(EraseObject&& other) = default;
  
  explicit EraseObject(uint32_t objectID,
    uint32_t lower_bound_id,
    uint32_t upper_bound_id)
  : objectID(objectID)
  , lower_bound_id(lower_bound_id)
  , upper_bound_id(upper_bound_id)
  {}
  
  explicit EraseObject(const uint8_t* buff, size_t len);
  explicit EraseObject(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const EraseObject& other) const;
  bool operator!=(const EraseObject& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(objectID, lower_bound_id, upper_bound_id);
  }
};

extern const char* EraseObjectVersionHashStr;
extern const uint8_t EraseObjectVersionHash[16];

// MESSAGE EraseLineSegments
struct EraseLineSegments
{
  std::string identifier;
  
  /**** Constructors ****/
  EraseLineSegments() = default;
  EraseLineSegments(const EraseLineSegments& other) = default;
  EraseLineSegments(EraseLineSegments& other) = default;
  EraseLineSegments(EraseLineSegments&& other) noexcept = default;
  EraseLineSegments& operator=(const EraseLineSegments& other) = default;
  EraseLineSegments& operator=(EraseLineSegments&& other) = default;
  
  explicit EraseLineSegments(const std::string& identifier)
  : identifier(identifier)
  {}
  
  explicit EraseLineSegments(const uint8_t* buff, size_t len);
  explicit EraseLineSegments(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const EraseLineSegments& other) const;
  bool operator!=(const EraseLineSegments& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(identifier);
  }
};

extern const char* EraseLineSegmentsVersionHashStr;
extern const uint8_t EraseLineSegmentsVersionHash[16];

// MESSAGE EraseQuad
struct EraseQuad
{
  uint32_t quadType;
  uint32_t quadID;
  
  /**** Constructors ****/
  EraseQuad() = default;
  EraseQuad(const EraseQuad& other) = default;
  EraseQuad(EraseQuad& other) = default;
  EraseQuad(EraseQuad&& other) noexcept = default;
  EraseQuad& operator=(const EraseQuad& other) = default;
  EraseQuad& operator=(EraseQuad&& other) = default;
  
  explicit EraseQuad(uint32_t quadType,
    uint32_t quadID)
  : quadType(quadType)
  , quadID(quadID)
  {}
  
  explicit EraseQuad(const uint8_t* buff, size_t len);
  explicit EraseQuad(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const EraseQuad& other) const;
  bool operator!=(const EraseQuad& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(quadType, quadID);
  }
};

extern const char* EraseQuadVersionHashStr;
extern const uint8_t EraseQuadVersionHash[16];

// MESSAGE SetRobot
struct SetRobot
{
  float x_trans_m;
  float y_trans_m;
  float z_trans_m;
  float rot_rad;
  float rot_axis_x;
  float rot_axis_y;
  float rot_axis_z;
  float head_angle;
  float lift_angle;
  
  /**** Constructors ****/
  SetRobot() = default;
  SetRobot(const SetRobot& other) = default;
  SetRobot(SetRobot& other) = default;
  SetRobot(SetRobot&& other) noexcept = default;
  SetRobot& operator=(const SetRobot& other) = default;
  SetRobot& operator=(SetRobot&& other) = default;
  
  explicit SetRobot(float x_trans_m,
    float y_trans_m,
    float z_trans_m,
    float rot_rad,
    float rot_axis_x,
    float rot_axis_y,
    float rot_axis_z,
    float head_angle,
    float lift_angle)
  : x_trans_m(x_trans_m)
  , y_trans_m(y_trans_m)
  , z_trans_m(z_trans_m)
  , rot_rad(rot_rad)
  , rot_axis_x(rot_axis_x)
  , rot_axis_y(rot_axis_y)
  , rot_axis_z(rot_axis_z)
  , head_angle(head_angle)
  , lift_angle(lift_angle)
  {}
  
  explicit SetRobot(const uint8_t* buff, size_t len);
  explicit SetRobot(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const SetRobot& other) const;
  bool operator!=(const SetRobot& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(x_trans_m, y_trans_m, z_trans_m, rot_rad, rot_axis_x, rot_axis_y, rot_axis_z, head_angle, lift_angle);
  }
};

extern const char* SetRobotVersionHashStr;
extern const uint8_t SetRobotVersionHash[16];

// MESSAGE AppendPathSegmentLine
struct AppendPathSegmentLine
{
  uint32_t pathID;
  float x_start_m;
  float y_start_m;
  float z_start_m;
  float x_end_m;
  float y_end_m;
  float z_end_m;
  
  /**** Constructors ****/
  AppendPathSegmentLine() = default;
  AppendPathSegmentLine(const AppendPathSegmentLine& other) = default;
  AppendPathSegmentLine(AppendPathSegmentLine& other) = default;
  AppendPathSegmentLine(AppendPathSegmentLine&& other) noexcept = default;
  AppendPathSegmentLine& operator=(const AppendPathSegmentLine& other) = default;
  AppendPathSegmentLine& operator=(AppendPathSegmentLine&& other) = default;
  
  explicit AppendPathSegmentLine(uint32_t pathID,
    float x_start_m,
    float y_start_m,
    float z_start_m,
    float x_end_m,
    float y_end_m,
    float z_end_m)
  : pathID(pathID)
  , x_start_m(x_start_m)
  , y_start_m(y_start_m)
  , z_start_m(z_start_m)
  , x_end_m(x_end_m)
  , y_end_m(y_end_m)
  , z_end_m(z_end_m)
  {}
  
  explicit AppendPathSegmentLine(const uint8_t* buff, size_t len);
  explicit AppendPathSegmentLine(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const AppendPathSegmentLine& other) const;
  bool operator!=(const AppendPathSegmentLine& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(pathID, x_start_m, y_start_m, z_start_m, x_end_m, y_end_m, z_end_m);
  }
};

extern const char* AppendPathSegmentLineVersionHashStr;
extern const uint8_t AppendPathSegmentLineVersionHash[16];

// MESSAGE AppendPathSegmentArc
struct AppendPathSegmentArc
{
  uint32_t pathID;
  float x_center_m;
  float y_center_m;
  float radius_m;
  float start_rad;
  float sweep_rad;
  
  /**** Constructors ****/
  AppendPathSegmentArc() = default;
  AppendPathSegmentArc(const AppendPathSegmentArc& other) = default;
  AppendPathSegmentArc(AppendPathSegmentArc& other) = default;
  AppendPathSegmentArc(AppendPathSegmentArc&& other) noexcept = default;
  AppendPathSegmentArc& operator=(const AppendPathSegmentArc& other) = default;
  AppendPathSegmentArc& operator=(AppendPathSegmentArc&& other) = default;
  
  explicit AppendPathSegmentArc(uint32_t pathID,
    float x_center_m,
    float y_center_m,
    float radius_m,
    float start_rad,
    float sweep_rad)
  : pathID(pathID)
  , x_center_m(x_center_m)
  , y_center_m(y_center_m)
  , radius_m(radius_m)
  , start_rad(start_rad)
  , sweep_rad(sweep_rad)
  {}
  
  explicit AppendPathSegmentArc(const uint8_t* buff, size_t len);
  explicit AppendPathSegmentArc(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const AppendPathSegmentArc& other) const;
  bool operator!=(const AppendPathSegmentArc& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(pathID, x_center_m, y_center_m, radius_m, start_rad, sweep_rad);
  }
};

extern const char* AppendPathSegmentArcVersionHashStr;
extern const uint8_t AppendPathSegmentArcVersionHash[16];

// MESSAGE SetPathColor
struct SetPathColor
{
  uint32_t pathID;
  uint32_t colorID;
  
  /**** Constructors ****/
  SetPathColor() = default;
  SetPathColor(const SetPathColor& other) = default;
  SetPathColor(SetPathColor& other) = default;
  SetPathColor(SetPathColor&& other) noexcept = default;
  SetPathColor& operator=(const SetPathColor& other) = default;
  SetPathColor& operator=(SetPathColor&& other) = default;
  
  explicit SetPathColor(uint32_t pathID,
    uint32_t colorID)
  : pathID(pathID)
  , colorID(colorID)
  {}
  
  explicit SetPathColor(const uint8_t* buff, size_t len);
  explicit SetPathColor(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const SetPathColor& other) const;
  bool operator!=(const SetPathColor& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(pathID, colorID);
  }
};

extern const char* SetPathColorVersionHashStr;
extern const uint8_t SetPathColorVersionHash[16];

// MESSAGE ErasePath
struct ErasePath
{
  uint32_t pathID;
  
  /**** Constructors ****/
  ErasePath() = default;
  ErasePath(const ErasePath& other) = default;
  ErasePath(ErasePath& other) = default;
  ErasePath(ErasePath&& other) noexcept = default;
  ErasePath& operator=(const ErasePath& other) = default;
  ErasePath& operator=(ErasePath&& other) = default;
  
  explicit ErasePath(uint32_t pathID)
  : pathID(pathID)
  {}
  
  explicit ErasePath(const uint8_t* buff, size_t len);
  explicit ErasePath(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const ErasePath& other) const;
  bool operator!=(const ErasePath& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(pathID);
  }
};

extern const char* ErasePathVersionHashStr;
extern const uint8_t ErasePathVersionHash[16];

// MESSAGE SetLabel
struct SetLabel
{
  uint32_t labelID;
  uint32_t colorID;
  std::string text;
  
  /**** Constructors ****/
  SetLabel() = default;
  SetLabel(const SetLabel& other) = default;
  SetLabel(SetLabel& other) = default;
  SetLabel(SetLabel&& other) noexcept = default;
  SetLabel& operator=(const SetLabel& other) = default;
  SetLabel& operator=(SetLabel&& other) = default;
  
  explicit SetLabel(uint32_t labelID,
    uint32_t colorID,
    const std::string& text)
  : labelID(labelID)
  , colorID(colorID)
  , text(text)
  {}
  
  explicit SetLabel(const uint8_t* buff, size_t len);
  explicit SetLabel(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const SetLabel& other) const;
  bool operator!=(const SetLabel& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(labelID, colorID, text);
  }
};

extern const char* SetLabelVersionHashStr;
extern const uint8_t SetLabelVersionHash[16];

// MESSAGE DockingErrorSignal
struct DockingErrorSignal
{
  float x_dist;
  float y_dist;
  float z_dist;
  float angle;
  
  /**** Constructors ****/
  DockingErrorSignal() = default;
  DockingErrorSignal(const DockingErrorSignal& other) = default;
  DockingErrorSignal(DockingErrorSignal& other) = default;
  DockingErrorSignal(DockingErrorSignal&& other) noexcept = default;
  DockingErrorSignal& operator=(const DockingErrorSignal& other) = default;
  DockingErrorSignal& operator=(DockingErrorSignal&& other) = default;
  
  explicit DockingErrorSignal(float x_dist,
    float y_dist,
    float z_dist,
    float angle)
  : x_dist(x_dist)
  , y_dist(y_dist)
  , z_dist(z_dist)
  , angle(angle)
  {}
  
  explicit DockingErrorSignal(const uint8_t* buff, size_t len);
  explicit DockingErrorSignal(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const DockingErrorSignal& other) const;
  bool operator!=(const DockingErrorSignal& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(x_dist, y_dist, z_dist, angle);
  }
};

extern const char* DockingErrorSignalVersionHashStr;
extern const uint8_t DockingErrorSignalVersionHash[16];

// MESSAGE CameraParams
struct CameraParams
{
  Anki::Vision::CameraParams cameraParams;
  
  /**** Constructors ****/
  CameraParams() = default;
  CameraParams(const CameraParams& other) = default;
  CameraParams(CameraParams& other) = default;
  CameraParams(CameraParams&& other) noexcept = default;
  CameraParams& operator=(const CameraParams& other) = default;
  CameraParams& operator=(CameraParams&& other) = default;
  
  explicit CameraParams(const Anki::Vision::CameraParams& cameraParams)
  : cameraParams(cameraParams)
  {}
  
  explicit CameraParams(const uint8_t* buff, size_t len);
  explicit CameraParams(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const CameraParams& other) const;
  bool operator!=(const CameraParams& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(cameraParams);
  }
};

extern const char* CameraParamsVersionHashStr;
extern const uint8_t CameraParamsVersionHash[16];

// MESSAGE VisionMarker
struct VisionMarker
{
  int16_t topLeft_x;
  int16_t topLeft_y;
  int16_t topRight_x;
  int16_t topRight_y;
  int16_t bottomRight_x;
  int16_t bottomRight_y;
  int16_t bottomLeft_x;
  int16_t bottomLeft_y;
  int8_t verified;
  
  /**** Constructors ****/
  VisionMarker() = default;
  VisionMarker(const VisionMarker& other) = default;
  VisionMarker(VisionMarker& other) = default;
  VisionMarker(VisionMarker&& other) noexcept = default;
  VisionMarker& operator=(const VisionMarker& other) = default;
  VisionMarker& operator=(VisionMarker&& other) = default;
  
  explicit VisionMarker(int16_t topLeft_x,
    int16_t topLeft_y,
    int16_t topRight_x,
    int16_t topRight_y,
    int16_t bottomRight_x,
    int16_t bottomRight_y,
    int16_t bottomLeft_x,
    int16_t bottomLeft_y,
    int8_t verified)
  : topLeft_x(topLeft_x)
  , topLeft_y(topLeft_y)
  , topRight_x(topRight_x)
  , topRight_y(topRight_y)
  , bottomRight_x(bottomRight_x)
  , bottomRight_y(bottomRight_y)
  , bottomLeft_x(bottomLeft_x)
  , bottomLeft_y(bottomLeft_y)
  , verified(verified)
  {}
  
  explicit VisionMarker(const uint8_t* buff, size_t len);
  explicit VisionMarker(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const VisionMarker& other) const;
  bool operator!=(const VisionMarker& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(topLeft_x, topLeft_y, topRight_x, topRight_y, bottomRight_x, bottomRight_y, bottomLeft_x, bottomLeft_y, verified);
  }
};

extern const char* VisionMarkerVersionHashStr;
extern const uint8_t VisionMarkerVersionHash[16];

// MESSAGE ShowObjects
struct ShowObjects
{
  int8_t show;
  
  /**** Constructors ****/
  ShowObjects() = default;
  ShowObjects(const ShowObjects& other) = default;
  ShowObjects(ShowObjects& other) = default;
  ShowObjects(ShowObjects&& other) noexcept = default;
  ShowObjects& operator=(const ShowObjects& other) = default;
  ShowObjects& operator=(ShowObjects&& other) = default;
  
  explicit ShowObjects(int8_t show)
  : show(show)
  {}
  
  explicit ShowObjects(const uint8_t* buff, size_t len);
  explicit ShowObjects(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const ShowObjects& other) const;
  bool operator!=(const ShowObjects& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(show);
  }
};

extern const char* ShowObjectsVersionHashStr;
extern const uint8_t ShowObjectsVersionHash[16];

// MESSAGE TrackerQuad
struct TrackerQuad
{
  int16_t topLeft_x;
  int16_t topLeft_y;
  int16_t topRight_x;
  int16_t topRight_y;
  int16_t bottomRight_x;
  int16_t bottomRight_y;
  int16_t bottomLeft_x;
  int16_t bottomLeft_y;
  
  /**** Constructors ****/
  TrackerQuad() = default;
  TrackerQuad(const TrackerQuad& other) = default;
  TrackerQuad(TrackerQuad& other) = default;
  TrackerQuad(TrackerQuad&& other) noexcept = default;
  TrackerQuad& operator=(const TrackerQuad& other) = default;
  TrackerQuad& operator=(TrackerQuad&& other) = default;
  
  explicit TrackerQuad(int16_t topLeft_x,
    int16_t topLeft_y,
    int16_t topRight_x,
    int16_t topRight_y,
    int16_t bottomRight_x,
    int16_t bottomRight_y,
    int16_t bottomLeft_x,
    int16_t bottomLeft_y)
  : topLeft_x(topLeft_x)
  , topLeft_y(topLeft_y)
  , topRight_x(topRight_x)
  , topRight_y(topRight_y)
  , bottomRight_x(bottomRight_x)
  , bottomRight_y(bottomRight_y)
  , bottomLeft_x(bottomLeft_x)
  , bottomLeft_y(bottomLeft_y)
  {}
  
  explicit TrackerQuad(const uint8_t* buff, size_t len);
  explicit TrackerQuad(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const TrackerQuad& other) const;
  bool operator!=(const TrackerQuad& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(topLeft_x, topLeft_y, topRight_x, topRight_y, bottomRight_x, bottomRight_y, bottomLeft_x, bottomLeft_y);
  }
};

extern const char* TrackerQuadVersionHashStr;
extern const uint8_t TrackerQuadVersionHash[16];

// MESSAGE FaceDetection
struct FaceDetection
{
  uint16_t x_upperLeft;
  uint16_t y_upperLeft;
  uint16_t width;
  uint16_t height;
  bool visualize;
  
  /**** Constructors ****/
  FaceDetection() = default;
  FaceDetection(const FaceDetection& other) = default;
  FaceDetection(FaceDetection& other) = default;
  FaceDetection(FaceDetection&& other) noexcept = default;
  FaceDetection& operator=(const FaceDetection& other) = default;
  FaceDetection& operator=(FaceDetection&& other) = default;
  
  explicit FaceDetection(uint16_t x_upperLeft,
    uint16_t y_upperLeft,
    uint16_t width,
    uint16_t height,
    bool visualize)
  : x_upperLeft(x_upperLeft)
  , y_upperLeft(y_upperLeft)
  , width(width)
  , height(height)
  , visualize(visualize)
  {}
  
  explicit FaceDetection(const uint8_t* buff, size_t len);
  explicit FaceDetection(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const FaceDetection& other) const;
  bool operator!=(const FaceDetection& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(x_upperLeft, y_upperLeft, width, height, visualize);
  }
};

extern const char* FaceDetectionVersionHashStr;
extern const uint8_t FaceDetectionVersionHash[16];

// MESSAGE BehaviorStackDebug
struct BehaviorStackDebug
{
  std::vector<std::string> debugStrings;
  
  /**** Constructors ****/
  BehaviorStackDebug() = default;
  BehaviorStackDebug(const BehaviorStackDebug& other) = default;
  BehaviorStackDebug(BehaviorStackDebug& other) = default;
  BehaviorStackDebug(BehaviorStackDebug&& other) noexcept = default;
  BehaviorStackDebug& operator=(const BehaviorStackDebug& other) = default;
  BehaviorStackDebug& operator=(BehaviorStackDebug&& other) = default;
  
  explicit BehaviorStackDebug(const std::vector<std::string>& debugStrings)
  : debugStrings(debugStrings)
  {}
  
  explicit BehaviorStackDebug(const uint8_t* buff, size_t len);
  explicit BehaviorStackDebug(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const BehaviorStackDebug& other) const;
  bool operator!=(const BehaviorStackDebug& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(debugStrings);
  }
};

extern const char* BehaviorStackDebugVersionHashStr;
extern const uint8_t BehaviorStackDebugVersionHash[16];

// MESSAGE VisionModeDebug
struct VisionModeDebug
{
  std::vector<std::string> debugStrings;
  
  /**** Constructors ****/
  VisionModeDebug() = default;
  VisionModeDebug(const VisionModeDebug& other) = default;
  VisionModeDebug(VisionModeDebug& other) = default;
  VisionModeDebug(VisionModeDebug&& other) noexcept = default;
  VisionModeDebug& operator=(const VisionModeDebug& other) = default;
  VisionModeDebug& operator=(VisionModeDebug&& other) = default;
  
  explicit VisionModeDebug(const std::vector<std::string>& debugStrings)
  : debugStrings(debugStrings)
  {}
  
  explicit VisionModeDebug(const uint8_t* buff, size_t len);
  explicit VisionModeDebug(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const VisionModeDebug& other) const;
  bool operator!=(const VisionModeDebug& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(debugStrings);
  }
};

extern const char* VisionModeDebugVersionHashStr;
extern const uint8_t VisionModeDebugVersionHash[16];

// MESSAGE SaveImages
struct SaveImages
{
  Anki::Vector::ImageSendMode mode;
  std::string path;
  
  /**** Constructors ****/
  SaveImages() = default;
  SaveImages(const SaveImages& other) = default;
  SaveImages(SaveImages& other) = default;
  SaveImages(SaveImages&& other) noexcept = default;
  SaveImages& operator=(const SaveImages& other) = default;
  SaveImages& operator=(SaveImages&& other) = default;
  
  explicit SaveImages(Anki::Vector::ImageSendMode mode,
    const std::string& path)
  : mode(mode)
  , path(path)
  {}
  
  explicit SaveImages(const uint8_t* buff, size_t len);
  explicit SaveImages(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const SaveImages& other) const;
  bool operator!=(const SaveImages& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(mode, path);
  }
};

extern const char* SaveImagesVersionHashStr;
extern const uint8_t SaveImagesVersionHash[16];

// MESSAGE SaveState
struct SaveState
{
  bool enabled;
  std::string path;
  
  /**** Constructors ****/
  SaveState() = default;
  SaveState(const SaveState& other) = default;
  SaveState(SaveState& other) = default;
  SaveState(SaveState&& other) noexcept = default;
  SaveState& operator=(const SaveState& other) = default;
  SaveState& operator=(SaveState&& other) = default;
  
  explicit SaveState(bool enabled,
    const std::string& path)
  : enabled(enabled)
  , path(path)
  {}
  
  explicit SaveState(const uint8_t* buff, size_t len);
  explicit SaveState(const CLAD::SafeMessageBuffer& buffer);
  
  /**** Pack ****/
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  /**** Unpack ****/
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Size() const;
  
  bool operator==(const SaveState& other) const;
  bool operator!=(const SaveState& other) const;
  
  template <typename Callable>
  void Invoke(Callable&& func) const {
     func(enabled, path);
  }
};

extern const char* SaveStateVersionHashStr;
extern const uint8_t SaveStateVersionHash[16];

// "Lookup Tables" for getting type by tag using template specializations
template<MessageVizTag tag>
struct MessageViz_TagToType;

template<>
struct MessageViz_TagToType<MessageVizTag::ReportCloudConnectivity> {
  using type = Anki::Vector::ReportCloudConnectivity;
};
template<>
struct MessageViz_TagToType<MessageVizTag::StartShutdownAnim> {
  using type = Anki::Vector::StartShutdownAnim;
};
template<>
struct MessageViz_TagToType<MessageVizTag::AnimationState> {
  using type = Anki::Vector::AnimationState;
};
template<>
struct MessageViz_TagToType<MessageVizTag::AnimationAdded> {
  using type = Anki::Vector::AnimationAdded;
};
template<>
struct MessageViz_TagToType<MessageVizTag::AnimationStarted> {
  using type = Anki::Vector::AnimationStarted;
};
template<>
struct MessageViz_TagToType<MessageVizTag::AnimationEnded> {
  using type = Anki::Vector::AnimationEnded;
};
template<>
struct MessageViz_TagToType<MessageVizTag::AnimationEvent> {
  using type = Anki::Vector::AnimationEvent;
};
template<>
struct MessageViz_TagToType<MessageVizTag::TextToSpeechEvent> {
  using type = Anki::Vector::TextToSpeechEvent;
};
template<>
struct MessageViz_TagToType<MessageVizTag::StreamCameraImages> {
  using type = Anki::Vector::StreamCameraImages;
};
template<>
struct MessageViz_TagToType<MessageVizTag::DebugScreenMode> {
  using type = Anki::Vector::DebugScreenMode;
};
template<>
struct MessageViz_TagToType<MessageVizTag::RobotAvailable> {
  using type = Anki::Vector::RobotAvailable;
};
template<>
struct MessageViz_TagToType<MessageVizTag::AudioStreamStatusEvent> {
  using type = Anki::Vector::AudioStreamStatusEvent;
};
template<>
struct MessageViz_TagToType<MessageVizTag::IMURequest> {
  using type = Anki::Vector::IMURequest;
};
template<>
struct MessageViz_TagToType<MessageVizTag::IMUTemperature> {
  using type = Anki::Vector::RobotInterface::IMUTemperature;
};
template<>
struct MessageViz_TagToType<MessageVizTag::CliffEvent> {
  using type = Anki::Vector::CliffEvent;
};
template<>
struct MessageViz_TagToType<MessageVizTag::PotentialCliff> {
  using type = Anki::Vector::PotentialCliff;
};
template<>
struct MessageViz_TagToType<MessageVizTag::SetCliffDetectThresholds> {
  using type = Anki::Vector::SetCliffDetectThresholds;
};
template<>
struct MessageViz_TagToType<MessageVizTag::SetWhiteDetectThresholds> {
  using type = Anki::Vector::SetWhiteDetectThresholds;
};
template<>
struct MessageViz_TagToType<MessageVizTag::CarryStateUpdate> {
  using type = Anki::Vector::CarryStateUpdate;
};
template<>
struct MessageViz_TagToType<MessageVizTag::ImageChunk> {
  using type = Anki::Vector::ImageChunk;
};
template<>
struct MessageViz_TagToType<MessageVizTag::CameraCalibration> {
  using type = Anki::Vector::CameraCalibration;
};
template<>
struct MessageViz_TagToType<MessageVizTag::SetVizOrigin> {
  using type = Anki::Vector::SetVizOrigin;
};
template<>
struct MessageViz_TagToType<MessageVizTag::RobotStateMessage> {
  using type = Anki::Vector::VizInterface::RobotStateMessage;
};
template<>
struct MessageViz_TagToType<MessageVizTag::CurrentAnimation> {
  using type = Anki::Vector::VizInterface::CurrentAnimation;
};
template<>
struct MessageViz_TagToType<MessageVizTag::Object> {
  using type = Anki::Vector::VizInterface::Object;
};
template<>
struct MessageViz_TagToType<MessageVizTag::LineSegment> {
  using type = Anki::Vector::VizInterface::LineSegment;
};
template<>
struct MessageViz_TagToType<MessageVizTag::Quad> {
  using type = Anki::Vector::VizInterface::Quad;
};
template<>
struct MessageViz_TagToType<MessageVizTag::MemoryMapMessageVizBegin> {
  using type = Anki::Vector::VizInterface::MemoryMapMessageVizBegin;
};
template<>
struct MessageViz_TagToType<MessageVizTag::MemoryMapMessageViz> {
  using type = Anki::Vector::VizInterface::MemoryMapMessageViz;
};
template<>
struct MessageViz_TagToType<MessageVizTag::MemoryMapMessageVizEnd> {
  using type = Anki::Vector::VizInterface::MemoryMapMessageVizEnd;
};
template<>
struct MessageViz_TagToType<MessageVizTag::EnabledVisionModes> {
  using type = Anki::Vector::VizInterface::EnabledVisionModes;
};
template<>
struct MessageViz_TagToType<MessageVizTag::CameraQuad> {
  using type = Anki::Vector::VizInterface::CameraQuad;
};
template<>
struct MessageViz_TagToType<MessageVizTag::CameraRect> {
  using type = Anki::Vector::VizInterface::CameraRect;
};
template<>
struct MessageViz_TagToType<MessageVizTag::CameraLine> {
  using type = Anki::Vector::VizInterface::CameraLine;
};
template<>
struct MessageViz_TagToType<MessageVizTag::CameraOval> {
  using type = Anki::Vector::VizInterface::CameraOval;
};
template<>
struct MessageViz_TagToType<MessageVizTag::CameraText> {
  using type = Anki::Vector::VizInterface::CameraText;
};
template<>
struct MessageViz_TagToType<MessageVizTag::EraseObject> {
  using type = Anki::Vector::VizInterface::EraseObject;
};
template<>
struct MessageViz_TagToType<MessageVizTag::EraseLineSegments> {
  using type = Anki::Vector::VizInterface::EraseLineSegments;
};
template<>
struct MessageViz_TagToType<MessageVizTag::EraseQuad> {
  using type = Anki::Vector::VizInterface::EraseQuad;
};
template<>
struct MessageViz_TagToType<MessageVizTag::SetRobot> {
  using type = Anki::Vector::VizInterface::SetRobot;
};
template<>
struct MessageViz_TagToType<MessageVizTag::AppendPathSegmentLine> {
  using type = Anki::Vector::VizInterface::AppendPathSegmentLine;
};
template<>
struct MessageViz_TagToType<MessageVizTag::AppendPathSegmentArc> {
  using type = Anki::Vector::VizInterface::AppendPathSegmentArc;
};
template<>
struct MessageViz_TagToType<MessageVizTag::SetPathColor> {
  using type = Anki::Vector::VizInterface::SetPathColor;
};
template<>
struct MessageViz_TagToType<MessageVizTag::ErasePath> {
  using type = Anki::Vector::VizInterface::ErasePath;
};
template<>
struct MessageViz_TagToType<MessageVizTag::SetLabel> {
  using type = Anki::Vector::VizInterface::SetLabel;
};
template<>
struct MessageViz_TagToType<MessageVizTag::DockingErrorSignal> {
  using type = Anki::Vector::VizInterface::DockingErrorSignal;
};
template<>
struct MessageViz_TagToType<MessageVizTag::CameraParams> {
  using type = Anki::Vector::VizInterface::CameraParams;
};
template<>
struct MessageViz_TagToType<MessageVizTag::VisionMarker> {
  using type = Anki::Vector::VizInterface::VisionMarker;
};
template<>
struct MessageViz_TagToType<MessageVizTag::ShowObjects> {
  using type = Anki::Vector::VizInterface::ShowObjects;
};
template<>
struct MessageViz_TagToType<MessageVizTag::TrackerQuad> {
  using type = Anki::Vector::VizInterface::TrackerQuad;
};
template<>
struct MessageViz_TagToType<MessageVizTag::FaceDetection> {
  using type = Anki::Vector::VizInterface::FaceDetection;
};
template<>
struct MessageViz_TagToType<MessageVizTag::BehaviorStackDebug> {
  using type = Anki::Vector::VizInterface::BehaviorStackDebug;
};
template<>
struct MessageViz_TagToType<MessageVizTag::VisionModeDebug> {
  using type = Anki::Vector::VizInterface::VisionModeDebug;
};
template<>
struct MessageViz_TagToType<MessageVizTag::SaveImages> {
  using type = Anki::Vector::VizInterface::SaveImages;
};
template<>
struct MessageViz_TagToType<MessageVizTag::SaveState> {
  using type = Anki::Vector::VizInterface::SaveState;
};

// UNION MessageViz
class MessageViz
{
public:
  using Tag = MessageVizTag;
  /**** Constructors ****/
  MessageViz() :_tag(Tag::INVALID) { }
  explicit MessageViz(const CLAD::SafeMessageBuffer& buff);
  explicit MessageViz(const uint8_t* buffer, size_t length);
  MessageViz(const MessageViz& other);
  MessageViz(MessageViz&& other) noexcept;
  MessageViz& operator=(const MessageViz& other);
  MessageViz& operator=(MessageViz&& other) noexcept;
  
  ~MessageViz() { ClearCurrent(); }
  Tag GetTag() const { return _tag; }
  
  // Templated getter for union members by type
  // NOTE: Always returns a reference, even for trivial types, unlike untemplated version
  template<Tag tag>
  const typename MessageViz_TagToType<tag>::type & Get_() const;
  
  // Templated creator for making a union object out of one if its members
  template <Tag tag>
  static MessageViz Create_(typename MessageViz_TagToType<tag>::type member);
  
  /** ReportCloudConnectivity **/
  static MessageViz CreateReportCloudConnectivity(Anki::Vector::ReportCloudConnectivity&& new_ReportCloudConnectivity);
  explicit MessageViz(Anki::Vector::ReportCloudConnectivity&& new_ReportCloudConnectivity);
  const Anki::Vector::ReportCloudConnectivity& Get_ReportCloudConnectivity() const;
  void Set_ReportCloudConnectivity(const Anki::Vector::ReportCloudConnectivity& new_ReportCloudConnectivity);
  void Set_ReportCloudConnectivity(Anki::Vector::ReportCloudConnectivity&& new_ReportCloudConnectivity);
  
  /** StartShutdownAnim **/
  static MessageViz CreateStartShutdownAnim(Anki::Vector::StartShutdownAnim&& new_StartShutdownAnim);
  explicit MessageViz(Anki::Vector::StartShutdownAnim&& new_StartShutdownAnim);
  const Anki::Vector::StartShutdownAnim& Get_StartShutdownAnim() const;
  void Set_StartShutdownAnim(const Anki::Vector::StartShutdownAnim& new_StartShutdownAnim);
  void Set_StartShutdownAnim(Anki::Vector::StartShutdownAnim&& new_StartShutdownAnim);
  
  /** AnimationState **/
  static MessageViz CreateAnimationState(Anki::Vector::AnimationState&& new_AnimationState);
  explicit MessageViz(Anki::Vector::AnimationState&& new_AnimationState);
  const Anki::Vector::AnimationState& Get_AnimationState() const;
  void Set_AnimationState(const Anki::Vector::AnimationState& new_AnimationState);
  void Set_AnimationState(Anki::Vector::AnimationState&& new_AnimationState);
  
  /** AnimationAdded **/
  static MessageViz CreateAnimationAdded(Anki::Vector::AnimationAdded&& new_AnimationAdded);
  explicit MessageViz(Anki::Vector::AnimationAdded&& new_AnimationAdded);
  const Anki::Vector::AnimationAdded& Get_AnimationAdded() const;
  void Set_AnimationAdded(const Anki::Vector::AnimationAdded& new_AnimationAdded);
  void Set_AnimationAdded(Anki::Vector::AnimationAdded&& new_AnimationAdded);
  
  /** AnimationStarted **/
  static MessageViz CreateAnimationStarted(Anki::Vector::AnimationStarted&& new_AnimationStarted);
  explicit MessageViz(Anki::Vector::AnimationStarted&& new_AnimationStarted);
  const Anki::Vector::AnimationStarted& Get_AnimationStarted() const;
  void Set_AnimationStarted(const Anki::Vector::AnimationStarted& new_AnimationStarted);
  void Set_AnimationStarted(Anki::Vector::AnimationStarted&& new_AnimationStarted);
  
  /** AnimationEnded **/
  static MessageViz CreateAnimationEnded(Anki::Vector::AnimationEnded&& new_AnimationEnded);
  explicit MessageViz(Anki::Vector::AnimationEnded&& new_AnimationEnded);
  const Anki::Vector::AnimationEnded& Get_AnimationEnded() const;
  void Set_AnimationEnded(const Anki::Vector::AnimationEnded& new_AnimationEnded);
  void Set_AnimationEnded(Anki::Vector::AnimationEnded&& new_AnimationEnded);
  
  /** AnimationEvent **/
  static MessageViz CreateAnimationEvent(Anki::Vector::AnimationEvent&& new_AnimationEvent);
  explicit MessageViz(Anki::Vector::AnimationEvent&& new_AnimationEvent);
  const Anki::Vector::AnimationEvent& Get_AnimationEvent() const;
  void Set_AnimationEvent(const Anki::Vector::AnimationEvent& new_AnimationEvent);
  void Set_AnimationEvent(Anki::Vector::AnimationEvent&& new_AnimationEvent);
  
  /** TextToSpeechEvent **/
  static MessageViz CreateTextToSpeechEvent(Anki::Vector::TextToSpeechEvent&& new_TextToSpeechEvent);
  explicit MessageViz(Anki::Vector::TextToSpeechEvent&& new_TextToSpeechEvent);
  const Anki::Vector::TextToSpeechEvent& Get_TextToSpeechEvent() const;
  void Set_TextToSpeechEvent(const Anki::Vector::TextToSpeechEvent& new_TextToSpeechEvent);
  void Set_TextToSpeechEvent(Anki::Vector::TextToSpeechEvent&& new_TextToSpeechEvent);
  
  /** StreamCameraImages **/
  static MessageViz CreateStreamCameraImages(Anki::Vector::StreamCameraImages&& new_StreamCameraImages);
  explicit MessageViz(Anki::Vector::StreamCameraImages&& new_StreamCameraImages);
  const Anki::Vector::StreamCameraImages& Get_StreamCameraImages() const;
  void Set_StreamCameraImages(const Anki::Vector::StreamCameraImages& new_StreamCameraImages);
  void Set_StreamCameraImages(Anki::Vector::StreamCameraImages&& new_StreamCameraImages);
  
  /** DebugScreenMode **/
  static MessageViz CreateDebugScreenMode(Anki::Vector::DebugScreenMode&& new_DebugScreenMode);
  explicit MessageViz(Anki::Vector::DebugScreenMode&& new_DebugScreenMode);
  const Anki::Vector::DebugScreenMode& Get_DebugScreenMode() const;
  void Set_DebugScreenMode(const Anki::Vector::DebugScreenMode& new_DebugScreenMode);
  void Set_DebugScreenMode(Anki::Vector::DebugScreenMode&& new_DebugScreenMode);
  
  /** RobotAvailable **/
  static MessageViz CreateRobotAvailable(Anki::Vector::RobotAvailable&& new_RobotAvailable);
  explicit MessageViz(Anki::Vector::RobotAvailable&& new_RobotAvailable);
  const Anki::Vector::RobotAvailable& Get_RobotAvailable() const;
  void Set_RobotAvailable(const Anki::Vector::RobotAvailable& new_RobotAvailable);
  void Set_RobotAvailable(Anki::Vector::RobotAvailable&& new_RobotAvailable);
  
  /** AudioStreamStatusEvent **/
  static MessageViz CreateAudioStreamStatusEvent(Anki::Vector::AudioStreamStatusEvent&& new_AudioStreamStatusEvent);
  explicit MessageViz(Anki::Vector::AudioStreamStatusEvent&& new_AudioStreamStatusEvent);
  const Anki::Vector::AudioStreamStatusEvent& Get_AudioStreamStatusEvent() const;
  void Set_AudioStreamStatusEvent(const Anki::Vector::AudioStreamStatusEvent& new_AudioStreamStatusEvent);
  void Set_AudioStreamStatusEvent(Anki::Vector::AudioStreamStatusEvent&& new_AudioStreamStatusEvent);
  
  /** IMURequest **/
  static MessageViz CreateIMURequest(Anki::Vector::IMURequest&& new_IMURequest);
  explicit MessageViz(Anki::Vector::IMURequest&& new_IMURequest);
  const Anki::Vector::IMURequest& Get_IMURequest() const;
  void Set_IMURequest(const Anki::Vector::IMURequest& new_IMURequest);
  void Set_IMURequest(Anki::Vector::IMURequest&& new_IMURequest);
  
  /** IMUTemperature **/
  static MessageViz CreateIMUTemperature(Anki::Vector::RobotInterface::IMUTemperature&& new_IMUTemperature);
  explicit MessageViz(Anki::Vector::RobotInterface::IMUTemperature&& new_IMUTemperature);
  const Anki::Vector::RobotInterface::IMUTemperature& Get_IMUTemperature() const;
  void Set_IMUTemperature(const Anki::Vector::RobotInterface::IMUTemperature& new_IMUTemperature);
  void Set_IMUTemperature(Anki::Vector::RobotInterface::IMUTemperature&& new_IMUTemperature);
  
  /** CliffEvent **/
  static MessageViz CreateCliffEvent(Anki::Vector::CliffEvent&& new_CliffEvent);
  explicit MessageViz(Anki::Vector::CliffEvent&& new_CliffEvent);
  const Anki::Vector::CliffEvent& Get_CliffEvent() const;
  void Set_CliffEvent(const Anki::Vector::CliffEvent& new_CliffEvent);
  void Set_CliffEvent(Anki::Vector::CliffEvent&& new_CliffEvent);
  
  /** PotentialCliff **/
  static MessageViz CreatePotentialCliff(Anki::Vector::PotentialCliff&& new_PotentialCliff);
  explicit MessageViz(Anki::Vector::PotentialCliff&& new_PotentialCliff);
  const Anki::Vector::PotentialCliff& Get_PotentialCliff() const;
  void Set_PotentialCliff(const Anki::Vector::PotentialCliff& new_PotentialCliff);
  void Set_PotentialCliff(Anki::Vector::PotentialCliff&& new_PotentialCliff);
  
  /** SetCliffDetectThresholds **/
  static MessageViz CreateSetCliffDetectThresholds(Anki::Vector::SetCliffDetectThresholds&& new_SetCliffDetectThresholds);
  explicit MessageViz(Anki::Vector::SetCliffDetectThresholds&& new_SetCliffDetectThresholds);
  const Anki::Vector::SetCliffDetectThresholds& Get_SetCliffDetectThresholds() const;
  void Set_SetCliffDetectThresholds(const Anki::Vector::SetCliffDetectThresholds& new_SetCliffDetectThresholds);
  void Set_SetCliffDetectThresholds(Anki::Vector::SetCliffDetectThresholds&& new_SetCliffDetectThresholds);
  
  /** SetWhiteDetectThresholds **/
  static MessageViz CreateSetWhiteDetectThresholds(Anki::Vector::SetWhiteDetectThresholds&& new_SetWhiteDetectThresholds);
  explicit MessageViz(Anki::Vector::SetWhiteDetectThresholds&& new_SetWhiteDetectThresholds);
  const Anki::Vector::SetWhiteDetectThresholds& Get_SetWhiteDetectThresholds() const;
  void Set_SetWhiteDetectThresholds(const Anki::Vector::SetWhiteDetectThresholds& new_SetWhiteDetectThresholds);
  void Set_SetWhiteDetectThresholds(Anki::Vector::SetWhiteDetectThresholds&& new_SetWhiteDetectThresholds);
  
  /** CarryStateUpdate **/
  static MessageViz CreateCarryStateUpdate(Anki::Vector::CarryStateUpdate&& new_CarryStateUpdate);
  explicit MessageViz(Anki::Vector::CarryStateUpdate&& new_CarryStateUpdate);
  const Anki::Vector::CarryStateUpdate& Get_CarryStateUpdate() const;
  void Set_CarryStateUpdate(const Anki::Vector::CarryStateUpdate& new_CarryStateUpdate);
  void Set_CarryStateUpdate(Anki::Vector::CarryStateUpdate&& new_CarryStateUpdate);
  
  /** ImageChunk **/
  static MessageViz CreateImageChunk(Anki::Vector::ImageChunk&& new_ImageChunk);
  explicit MessageViz(Anki::Vector::ImageChunk&& new_ImageChunk);
  const Anki::Vector::ImageChunk& Get_ImageChunk() const;
  void Set_ImageChunk(const Anki::Vector::ImageChunk& new_ImageChunk);
  void Set_ImageChunk(Anki::Vector::ImageChunk&& new_ImageChunk);
  
  /** CameraCalibration **/
  static MessageViz CreateCameraCalibration(Anki::Vector::CameraCalibration&& new_CameraCalibration);
  explicit MessageViz(Anki::Vector::CameraCalibration&& new_CameraCalibration);
  const Anki::Vector::CameraCalibration& Get_CameraCalibration() const;
  void Set_CameraCalibration(const Anki::Vector::CameraCalibration& new_CameraCalibration);
  void Set_CameraCalibration(Anki::Vector::CameraCalibration&& new_CameraCalibration);
  
  /** SetVizOrigin **/
  static MessageViz CreateSetVizOrigin(Anki::Vector::SetVizOrigin&& new_SetVizOrigin);
  explicit MessageViz(Anki::Vector::SetVizOrigin&& new_SetVizOrigin);
  const Anki::Vector::SetVizOrigin& Get_SetVizOrigin() const;
  void Set_SetVizOrigin(const Anki::Vector::SetVizOrigin& new_SetVizOrigin);
  void Set_SetVizOrigin(Anki::Vector::SetVizOrigin&& new_SetVizOrigin);
  
  /** RobotStateMessage **/
  static MessageViz CreateRobotStateMessage(Anki::Vector::VizInterface::RobotStateMessage&& new_RobotStateMessage);
  explicit MessageViz(Anki::Vector::VizInterface::RobotStateMessage&& new_RobotStateMessage);
  const Anki::Vector::VizInterface::RobotStateMessage& Get_RobotStateMessage() const;
  void Set_RobotStateMessage(const Anki::Vector::VizInterface::RobotStateMessage& new_RobotStateMessage);
  void Set_RobotStateMessage(Anki::Vector::VizInterface::RobotStateMessage&& new_RobotStateMessage);
  
  /** CurrentAnimation **/
  static MessageViz CreateCurrentAnimation(Anki::Vector::VizInterface::CurrentAnimation&& new_CurrentAnimation);
  explicit MessageViz(Anki::Vector::VizInterface::CurrentAnimation&& new_CurrentAnimation);
  const Anki::Vector::VizInterface::CurrentAnimation& Get_CurrentAnimation() const;
  void Set_CurrentAnimation(const Anki::Vector::VizInterface::CurrentAnimation& new_CurrentAnimation);
  void Set_CurrentAnimation(Anki::Vector::VizInterface::CurrentAnimation&& new_CurrentAnimation);
  
  /** Object **/
  static MessageViz CreateObject(Anki::Vector::VizInterface::Object&& new_Object);
  explicit MessageViz(Anki::Vector::VizInterface::Object&& new_Object);
  const Anki::Vector::VizInterface::Object& Get_Object() const;
  void Set_Object(const Anki::Vector::VizInterface::Object& new_Object);
  void Set_Object(Anki::Vector::VizInterface::Object&& new_Object);
  
  /** LineSegment **/
  static MessageViz CreateLineSegment(Anki::Vector::VizInterface::LineSegment&& new_LineSegment);
  explicit MessageViz(Anki::Vector::VizInterface::LineSegment&& new_LineSegment);
  const Anki::Vector::VizInterface::LineSegment& Get_LineSegment() const;
  void Set_LineSegment(const Anki::Vector::VizInterface::LineSegment& new_LineSegment);
  void Set_LineSegment(Anki::Vector::VizInterface::LineSegment&& new_LineSegment);
  
  /** Quad **/
  static MessageViz CreateQuad(Anki::Vector::VizInterface::Quad&& new_Quad);
  explicit MessageViz(Anki::Vector::VizInterface::Quad&& new_Quad);
  const Anki::Vector::VizInterface::Quad& Get_Quad() const;
  void Set_Quad(const Anki::Vector::VizInterface::Quad& new_Quad);
  void Set_Quad(Anki::Vector::VizInterface::Quad&& new_Quad);
  
  /** MemoryMapMessageVizBegin **/
  static MessageViz CreateMemoryMapMessageVizBegin(Anki::Vector::VizInterface::MemoryMapMessageVizBegin&& new_MemoryMapMessageVizBegin);
  explicit MessageViz(Anki::Vector::VizInterface::MemoryMapMessageVizBegin&& new_MemoryMapMessageVizBegin);
  const Anki::Vector::VizInterface::MemoryMapMessageVizBegin& Get_MemoryMapMessageVizBegin() const;
  void Set_MemoryMapMessageVizBegin(const Anki::Vector::VizInterface::MemoryMapMessageVizBegin& new_MemoryMapMessageVizBegin);
  void Set_MemoryMapMessageVizBegin(Anki::Vector::VizInterface::MemoryMapMessageVizBegin&& new_MemoryMapMessageVizBegin);
  
  /** MemoryMapMessageViz **/
  static MessageViz CreateMemoryMapMessageViz(Anki::Vector::VizInterface::MemoryMapMessageViz&& new_MemoryMapMessageViz);
  explicit MessageViz(Anki::Vector::VizInterface::MemoryMapMessageViz&& new_MemoryMapMessageViz);
  const Anki::Vector::VizInterface::MemoryMapMessageViz& Get_MemoryMapMessageViz() const;
  void Set_MemoryMapMessageViz(const Anki::Vector::VizInterface::MemoryMapMessageViz& new_MemoryMapMessageViz);
  void Set_MemoryMapMessageViz(Anki::Vector::VizInterface::MemoryMapMessageViz&& new_MemoryMapMessageViz);
  
  /** MemoryMapMessageVizEnd **/
  static MessageViz CreateMemoryMapMessageVizEnd(Anki::Vector::VizInterface::MemoryMapMessageVizEnd&& new_MemoryMapMessageVizEnd);
  explicit MessageViz(Anki::Vector::VizInterface::MemoryMapMessageVizEnd&& new_MemoryMapMessageVizEnd);
  const Anki::Vector::VizInterface::MemoryMapMessageVizEnd& Get_MemoryMapMessageVizEnd() const;
  void Set_MemoryMapMessageVizEnd(const Anki::Vector::VizInterface::MemoryMapMessageVizEnd& new_MemoryMapMessageVizEnd);
  void Set_MemoryMapMessageVizEnd(Anki::Vector::VizInterface::MemoryMapMessageVizEnd&& new_MemoryMapMessageVizEnd);
  
  /** EnabledVisionModes **/
  static MessageViz CreateEnabledVisionModes(Anki::Vector::VizInterface::EnabledVisionModes&& new_EnabledVisionModes);
  explicit MessageViz(Anki::Vector::VizInterface::EnabledVisionModes&& new_EnabledVisionModes);
  const Anki::Vector::VizInterface::EnabledVisionModes& Get_EnabledVisionModes() const;
  void Set_EnabledVisionModes(const Anki::Vector::VizInterface::EnabledVisionModes& new_EnabledVisionModes);
  void Set_EnabledVisionModes(Anki::Vector::VizInterface::EnabledVisionModes&& new_EnabledVisionModes);
  
  /** CameraQuad **/
  static MessageViz CreateCameraQuad(Anki::Vector::VizInterface::CameraQuad&& new_CameraQuad);
  explicit MessageViz(Anki::Vector::VizInterface::CameraQuad&& new_CameraQuad);
  const Anki::Vector::VizInterface::CameraQuad& Get_CameraQuad() const;
  void Set_CameraQuad(const Anki::Vector::VizInterface::CameraQuad& new_CameraQuad);
  void Set_CameraQuad(Anki::Vector::VizInterface::CameraQuad&& new_CameraQuad);
  
  /** CameraRect **/
  static MessageViz CreateCameraRect(Anki::Vector::VizInterface::CameraRect&& new_CameraRect);
  explicit MessageViz(Anki::Vector::VizInterface::CameraRect&& new_CameraRect);
  const Anki::Vector::VizInterface::CameraRect& Get_CameraRect() const;
  void Set_CameraRect(const Anki::Vector::VizInterface::CameraRect& new_CameraRect);
  void Set_CameraRect(Anki::Vector::VizInterface::CameraRect&& new_CameraRect);
  
  /** CameraLine **/
  static MessageViz CreateCameraLine(Anki::Vector::VizInterface::CameraLine&& new_CameraLine);
  explicit MessageViz(Anki::Vector::VizInterface::CameraLine&& new_CameraLine);
  const Anki::Vector::VizInterface::CameraLine& Get_CameraLine() const;
  void Set_CameraLine(const Anki::Vector::VizInterface::CameraLine& new_CameraLine);
  void Set_CameraLine(Anki::Vector::VizInterface::CameraLine&& new_CameraLine);
  
  /** CameraOval **/
  static MessageViz CreateCameraOval(Anki::Vector::VizInterface::CameraOval&& new_CameraOval);
  explicit MessageViz(Anki::Vector::VizInterface::CameraOval&& new_CameraOval);
  const Anki::Vector::VizInterface::CameraOval& Get_CameraOval() const;
  void Set_CameraOval(const Anki::Vector::VizInterface::CameraOval& new_CameraOval);
  void Set_CameraOval(Anki::Vector::VizInterface::CameraOval&& new_CameraOval);
  
  /** CameraText **/
  static MessageViz CreateCameraText(Anki::Vector::VizInterface::CameraText&& new_CameraText);
  explicit MessageViz(Anki::Vector::VizInterface::CameraText&& new_CameraText);
  const Anki::Vector::VizInterface::CameraText& Get_CameraText() const;
  void Set_CameraText(const Anki::Vector::VizInterface::CameraText& new_CameraText);
  void Set_CameraText(Anki::Vector::VizInterface::CameraText&& new_CameraText);
  
  /** EraseObject **/
  static MessageViz CreateEraseObject(Anki::Vector::VizInterface::EraseObject&& new_EraseObject);
  explicit MessageViz(Anki::Vector::VizInterface::EraseObject&& new_EraseObject);
  const Anki::Vector::VizInterface::EraseObject& Get_EraseObject() const;
  void Set_EraseObject(const Anki::Vector::VizInterface::EraseObject& new_EraseObject);
  void Set_EraseObject(Anki::Vector::VizInterface::EraseObject&& new_EraseObject);
  
  /** EraseLineSegments **/
  static MessageViz CreateEraseLineSegments(Anki::Vector::VizInterface::EraseLineSegments&& new_EraseLineSegments);
  explicit MessageViz(Anki::Vector::VizInterface::EraseLineSegments&& new_EraseLineSegments);
  const Anki::Vector::VizInterface::EraseLineSegments& Get_EraseLineSegments() const;
  void Set_EraseLineSegments(const Anki::Vector::VizInterface::EraseLineSegments& new_EraseLineSegments);
  void Set_EraseLineSegments(Anki::Vector::VizInterface::EraseLineSegments&& new_EraseLineSegments);
  
  /** EraseQuad **/
  static MessageViz CreateEraseQuad(Anki::Vector::VizInterface::EraseQuad&& new_EraseQuad);
  explicit MessageViz(Anki::Vector::VizInterface::EraseQuad&& new_EraseQuad);
  const Anki::Vector::VizInterface::EraseQuad& Get_EraseQuad() const;
  void Set_EraseQuad(const Anki::Vector::VizInterface::EraseQuad& new_EraseQuad);
  void Set_EraseQuad(Anki::Vector::VizInterface::EraseQuad&& new_EraseQuad);
  
  /** SetRobot **/
  static MessageViz CreateSetRobot(Anki::Vector::VizInterface::SetRobot&& new_SetRobot);
  explicit MessageViz(Anki::Vector::VizInterface::SetRobot&& new_SetRobot);
  const Anki::Vector::VizInterface::SetRobot& Get_SetRobot() const;
  void Set_SetRobot(const Anki::Vector::VizInterface::SetRobot& new_SetRobot);
  void Set_SetRobot(Anki::Vector::VizInterface::SetRobot&& new_SetRobot);
  
  /** AppendPathSegmentLine **/
  static MessageViz CreateAppendPathSegmentLine(Anki::Vector::VizInterface::AppendPathSegmentLine&& new_AppendPathSegmentLine);
  explicit MessageViz(Anki::Vector::VizInterface::AppendPathSegmentLine&& new_AppendPathSegmentLine);
  const Anki::Vector::VizInterface::AppendPathSegmentLine& Get_AppendPathSegmentLine() const;
  void Set_AppendPathSegmentLine(const Anki::Vector::VizInterface::AppendPathSegmentLine& new_AppendPathSegmentLine);
  void Set_AppendPathSegmentLine(Anki::Vector::VizInterface::AppendPathSegmentLine&& new_AppendPathSegmentLine);
  
  /** AppendPathSegmentArc **/
  static MessageViz CreateAppendPathSegmentArc(Anki::Vector::VizInterface::AppendPathSegmentArc&& new_AppendPathSegmentArc);
  explicit MessageViz(Anki::Vector::VizInterface::AppendPathSegmentArc&& new_AppendPathSegmentArc);
  const Anki::Vector::VizInterface::AppendPathSegmentArc& Get_AppendPathSegmentArc() const;
  void Set_AppendPathSegmentArc(const Anki::Vector::VizInterface::AppendPathSegmentArc& new_AppendPathSegmentArc);
  void Set_AppendPathSegmentArc(Anki::Vector::VizInterface::AppendPathSegmentArc&& new_AppendPathSegmentArc);
  
  /** SetPathColor **/
  static MessageViz CreateSetPathColor(Anki::Vector::VizInterface::SetPathColor&& new_SetPathColor);
  explicit MessageViz(Anki::Vector::VizInterface::SetPathColor&& new_SetPathColor);
  const Anki::Vector::VizInterface::SetPathColor& Get_SetPathColor() const;
  void Set_SetPathColor(const Anki::Vector::VizInterface::SetPathColor& new_SetPathColor);
  void Set_SetPathColor(Anki::Vector::VizInterface::SetPathColor&& new_SetPathColor);
  
  /** ErasePath **/
  static MessageViz CreateErasePath(Anki::Vector::VizInterface::ErasePath&& new_ErasePath);
  explicit MessageViz(Anki::Vector::VizInterface::ErasePath&& new_ErasePath);
  const Anki::Vector::VizInterface::ErasePath& Get_ErasePath() const;
  void Set_ErasePath(const Anki::Vector::VizInterface::ErasePath& new_ErasePath);
  void Set_ErasePath(Anki::Vector::VizInterface::ErasePath&& new_ErasePath);
  
  /** SetLabel **/
  static MessageViz CreateSetLabel(Anki::Vector::VizInterface::SetLabel&& new_SetLabel);
  explicit MessageViz(Anki::Vector::VizInterface::SetLabel&& new_SetLabel);
  const Anki::Vector::VizInterface::SetLabel& Get_SetLabel() const;
  void Set_SetLabel(const Anki::Vector::VizInterface::SetLabel& new_SetLabel);
  void Set_SetLabel(Anki::Vector::VizInterface::SetLabel&& new_SetLabel);
  
  /** DockingErrorSignal **/
  static MessageViz CreateDockingErrorSignal(Anki::Vector::VizInterface::DockingErrorSignal&& new_DockingErrorSignal);
  explicit MessageViz(Anki::Vector::VizInterface::DockingErrorSignal&& new_DockingErrorSignal);
  const Anki::Vector::VizInterface::DockingErrorSignal& Get_DockingErrorSignal() const;
  void Set_DockingErrorSignal(const Anki::Vector::VizInterface::DockingErrorSignal& new_DockingErrorSignal);
  void Set_DockingErrorSignal(Anki::Vector::VizInterface::DockingErrorSignal&& new_DockingErrorSignal);
  
  /** CameraParams **/
  static MessageViz CreateCameraParams(Anki::Vector::VizInterface::CameraParams&& new_CameraParams);
  explicit MessageViz(Anki::Vector::VizInterface::CameraParams&& new_CameraParams);
  const Anki::Vector::VizInterface::CameraParams& Get_CameraParams() const;
  void Set_CameraParams(const Anki::Vector::VizInterface::CameraParams& new_CameraParams);
  void Set_CameraParams(Anki::Vector::VizInterface::CameraParams&& new_CameraParams);
  
  /** VisionMarker **/
  static MessageViz CreateVisionMarker(Anki::Vector::VizInterface::VisionMarker&& new_VisionMarker);
  explicit MessageViz(Anki::Vector::VizInterface::VisionMarker&& new_VisionMarker);
  const Anki::Vector::VizInterface::VisionMarker& Get_VisionMarker() const;
  void Set_VisionMarker(const Anki::Vector::VizInterface::VisionMarker& new_VisionMarker);
  void Set_VisionMarker(Anki::Vector::VizInterface::VisionMarker&& new_VisionMarker);
  
  /** ShowObjects **/
  static MessageViz CreateShowObjects(Anki::Vector::VizInterface::ShowObjects&& new_ShowObjects);
  explicit MessageViz(Anki::Vector::VizInterface::ShowObjects&& new_ShowObjects);
  const Anki::Vector::VizInterface::ShowObjects& Get_ShowObjects() const;
  void Set_ShowObjects(const Anki::Vector::VizInterface::ShowObjects& new_ShowObjects);
  void Set_ShowObjects(Anki::Vector::VizInterface::ShowObjects&& new_ShowObjects);
  
  /** TrackerQuad **/
  static MessageViz CreateTrackerQuad(Anki::Vector::VizInterface::TrackerQuad&& new_TrackerQuad);
  explicit MessageViz(Anki::Vector::VizInterface::TrackerQuad&& new_TrackerQuad);
  const Anki::Vector::VizInterface::TrackerQuad& Get_TrackerQuad() const;
  void Set_TrackerQuad(const Anki::Vector::VizInterface::TrackerQuad& new_TrackerQuad);
  void Set_TrackerQuad(Anki::Vector::VizInterface::TrackerQuad&& new_TrackerQuad);
  
  /** FaceDetection **/
  static MessageViz CreateFaceDetection(Anki::Vector::VizInterface::FaceDetection&& new_FaceDetection);
  explicit MessageViz(Anki::Vector::VizInterface::FaceDetection&& new_FaceDetection);
  const Anki::Vector::VizInterface::FaceDetection& Get_FaceDetection() const;
  void Set_FaceDetection(const Anki::Vector::VizInterface::FaceDetection& new_FaceDetection);
  void Set_FaceDetection(Anki::Vector::VizInterface::FaceDetection&& new_FaceDetection);
  
  /** BehaviorStackDebug **/
  static MessageViz CreateBehaviorStackDebug(Anki::Vector::VizInterface::BehaviorStackDebug&& new_BehaviorStackDebug);
  explicit MessageViz(Anki::Vector::VizInterface::BehaviorStackDebug&& new_BehaviorStackDebug);
  const Anki::Vector::VizInterface::BehaviorStackDebug& Get_BehaviorStackDebug() const;
  void Set_BehaviorStackDebug(const Anki::Vector::VizInterface::BehaviorStackDebug& new_BehaviorStackDebug);
  void Set_BehaviorStackDebug(Anki::Vector::VizInterface::BehaviorStackDebug&& new_BehaviorStackDebug);
  
  /** VisionModeDebug **/
  static MessageViz CreateVisionModeDebug(Anki::Vector::VizInterface::VisionModeDebug&& new_VisionModeDebug);
  explicit MessageViz(Anki::Vector::VizInterface::VisionModeDebug&& new_VisionModeDebug);
  const Anki::Vector::VizInterface::VisionModeDebug& Get_VisionModeDebug() const;
  void Set_VisionModeDebug(const Anki::Vector::VizInterface::VisionModeDebug& new_VisionModeDebug);
  void Set_VisionModeDebug(Anki::Vector::VizInterface::VisionModeDebug&& new_VisionModeDebug);
  
  /** SaveImages **/
  static MessageViz CreateSaveImages(Anki::Vector::VizInterface::SaveImages&& new_SaveImages);
  explicit MessageViz(Anki::Vector::VizInterface::SaveImages&& new_SaveImages);
  const Anki::Vector::VizInterface::SaveImages& Get_SaveImages() const;
  void Set_SaveImages(const Anki::Vector::VizInterface::SaveImages& new_SaveImages);
  void Set_SaveImages(Anki::Vector::VizInterface::SaveImages&& new_SaveImages);
  
  /** SaveState **/
  static MessageViz CreateSaveState(Anki::Vector::VizInterface::SaveState&& new_SaveState);
  explicit MessageViz(Anki::Vector::VizInterface::SaveState&& new_SaveState);
  const Anki::Vector::VizInterface::SaveState& Get_SaveState() const;
  void Set_SaveState(const Anki::Vector::VizInterface::SaveState& new_SaveState);
  void Set_SaveState(Anki::Vector::VizInterface::SaveState&& new_SaveState);
  
  size_t Unpack(const uint8_t* buff, const size_t len);
  size_t Unpack(const CLAD::SafeMessageBuffer& buffer);
  
  size_t Pack(uint8_t* buff, size_t len) const;
  size_t Pack(CLAD::SafeMessageBuffer& buffer) const;
  
  size_t Size() const;
  
  bool operator==(const MessageViz& other) const;
  bool operator!=(const MessageViz& other) const;
  /**** JSON ****/
  Json::Value GetJSON() const;
  bool SetFromJSON(const Json::Value& json);
  
private:
  void ClearCurrent();
  Tag _tag;
  
  union {
    Anki::Vector::ReportCloudConnectivity _ReportCloudConnectivity;
    Anki::Vector::StartShutdownAnim _StartShutdownAnim;
    Anki::Vector::AnimationState _AnimationState;
    Anki::Vector::AnimationAdded _AnimationAdded;
    Anki::Vector::AnimationStarted _AnimationStarted;
    Anki::Vector::AnimationEnded _AnimationEnded;
    Anki::Vector::AnimationEvent _AnimationEvent;
    Anki::Vector::TextToSpeechEvent _TextToSpeechEvent;
    Anki::Vector::StreamCameraImages _StreamCameraImages;
    Anki::Vector::DebugScreenMode _DebugScreenMode;
    Anki::Vector::RobotAvailable _RobotAvailable;
    Anki::Vector::AudioStreamStatusEvent _AudioStreamStatusEvent;
    Anki::Vector::IMURequest _IMURequest;
    Anki::Vector::RobotInterface::IMUTemperature _IMUTemperature;
    Anki::Vector::CliffEvent _CliffEvent;
    Anki::Vector::PotentialCliff _PotentialCliff;
    Anki::Vector::SetCliffDetectThresholds _SetCliffDetectThresholds;
    Anki::Vector::SetWhiteDetectThresholds _SetWhiteDetectThresholds;
    Anki::Vector::CarryStateUpdate _CarryStateUpdate;
    Anki::Vector::ImageChunk _ImageChunk;
    Anki::Vector::CameraCalibration _CameraCalibration;
    Anki::Vector::SetVizOrigin _SetVizOrigin;
    Anki::Vector::VizInterface::RobotStateMessage _RobotStateMessage;
    Anki::Vector::VizInterface::CurrentAnimation _CurrentAnimation;
    Anki::Vector::VizInterface::Object _Object;
    Anki::Vector::VizInterface::LineSegment _LineSegment;
    Anki::Vector::VizInterface::Quad _Quad;
    Anki::Vector::VizInterface::MemoryMapMessageVizBegin _MemoryMapMessageVizBegin;
    Anki::Vector::VizInterface::MemoryMapMessageViz _MemoryMapMessageViz;
    Anki::Vector::VizInterface::MemoryMapMessageVizEnd _MemoryMapMessageVizEnd;
    Anki::Vector::VizInterface::EnabledVisionModes _EnabledVisionModes;
    Anki::Vector::VizInterface::CameraQuad _CameraQuad;
    Anki::Vector::VizInterface::CameraRect _CameraRect;
    Anki::Vector::VizInterface::CameraLine _CameraLine;
    Anki::Vector::VizInterface::CameraOval _CameraOval;
    Anki::Vector::VizInterface::CameraText _CameraText;
    Anki::Vector::VizInterface::EraseObject _EraseObject;
    Anki::Vector::VizInterface::EraseLineSegments _EraseLineSegments;
    Anki::Vector::VizInterface::EraseQuad _EraseQuad;
    Anki::Vector::VizInterface::SetRobot _SetRobot;
    Anki::Vector::VizInterface::AppendPathSegmentLine _AppendPathSegmentLine;
    Anki::Vector::VizInterface::AppendPathSegmentArc _AppendPathSegmentArc;
    Anki::Vector::VizInterface::SetPathColor _SetPathColor;
    Anki::Vector::VizInterface::ErasePath _ErasePath;
    Anki::Vector::VizInterface::SetLabel _SetLabel;
    Anki::Vector::VizInterface::DockingErrorSignal _DockingErrorSignal;
    Anki::Vector::VizInterface::CameraParams _CameraParams;
    Anki::Vector::VizInterface::VisionMarker _VisionMarker;
    Anki::Vector::VizInterface::ShowObjects _ShowObjects;
    Anki::Vector::VizInterface::TrackerQuad _TrackerQuad;
    Anki::Vector::VizInterface::FaceDetection _FaceDetection;
    Anki::Vector::VizInterface::BehaviorStackDebug _BehaviorStackDebug;
    Anki::Vector::VizInterface::VisionModeDebug _VisionModeDebug;
    Anki::Vector::VizInterface::SaveImages _SaveImages;
    Anki::Vector::VizInterface::SaveState _SaveState;
  };
};
extern const char* MessageVizVersionHashStr;
extern const uint8_t MessageVizVersionHash[16];

} // namespace VizInterface

} // namespace Vector

} // namespace Anki

#endif // __CLAD_VIZ_INTERFACE_MESSAGE_VIZ_H__
