Program Listing for File SafeVisionaryData.h

Return to documentation for file (include/sick_safevisionary_base/SafeVisionaryData.h)

// -- BEGIN LICENSE BLOCK ----------------------------------------------
// -- END LICENSE BLOCK ------------------------------------------------

#pragma once

#include <string>
#include <vector>

#include "VisionaryData.h"

#define DEPTHMAP_SEGMENT 1
#define DEVICESTATUS_SEGMENT 2
#define ROI_SEGMENT 3
#define LOCALIOS_SEGMENT 4
#define FIELDINFORMATION_SEGMENT 5
#define LOGICSIGNALS_SEGMENT 6
#define IMU_SEGMENT 7

namespace visionary {
enum class DEVICE_STATUS : std::uint8_t
{
  DEVICE_STATUS_CONFIGURATION       = 0U,
  DEVICE_STATUS_WAIT_FOR_INPUTS     = 1U,
  DEVICE_STATUS_APPLICATION_STOPPED = 2U,
  DEVICE_STATUS_NORMAL_OPERATION =
    3U,
  DEVICE_STATUS_INVALID = 255U
};

/*
 * Segment 1  DepthMap
 */
#pragma pack(push, 1)

struct DEPTHMAP_FLAGS
{
  uint16_t filteredDepthMap : 1;
  uint16_t intrusionData : 1;
  uint16_t dataStream : 1;
  uint16_t reserved : 13;
};

struct DEPTHMAP_ELEMENT
{
  uint32_t frameNumber;
  DEVICE_STATUS deviceStatus;
  DEPTHMAP_FLAGS flags;
  uint16_t distance;
  uint16_t intensity;
  uint16_t confidence;
};

#pragma pack(pop)

/*
 * Segment 2  Device Status
 */
#pragma pack(push, 1)

struct DEVICESTATUS_DATA_GENERALSTATUS
{
  uint8_t runModeActive : 1;
  uint8_t deviceError : 1;
  uint8_t applicationError : 1;
  uint8_t sleepMode : 1;
  uint8_t waitForInput : 1;
  uint8_t waitForCluster : 1;
  uint8_t contaminationWarning : 1;
  uint8_t contaminationError : 1;
  uint8_t deadZoneDetection : 1;
  uint8_t temperatureWarning : 1;
  uint8_t reserved : 6;
};

struct DEVICESTATUS_DATA_ACTIVE_MONITORING_CASE
{
  uint8_t currentCaseNumberMonitoringCase1 : 8;
  uint8_t currentCaseNumberMonitoringCase2 : 8;
  uint8_t currentCaseNumberMonitoringCase3 : 8;
  uint8_t currentCaseNumberMonitoringCase4 : 8;
};

struct DEVICE_STATUS_ELEMENT
{
  DEVICESTATUS_DATA_GENERALSTATUS generalStatus;
  uint32_t COPSaftyRelated;    // Cut-Off-Path (safety related)
  uint32_t COPNonSaftyRelated; // Cut-Off-Path non safety related
  uint32_t COPResetRequired;   // Cut-Off-Path Reset Required
  DEVICESTATUS_DATA_ACTIVE_MONITORING_CASE activeMonitoringCase;
  uint8_t contaminationLevel;
};

#pragma pack(pop)

/*
 * Segment 3  ROI
 */
#pragma pack(push, 1)

struct ROI_DATA_RESULT
{
  uint8_t taskResult : 1;
  uint8_t resultSafe : 1;
  uint8_t resultValid : 1;
  uint8_t distanceValid : 1;
  uint8_t distanceSafe : 1;
  uint8_t reserved : 3;
};

enum ROI_QUALITY_CLASS
{

  ROI_QUALITY_CLASS_INVALID  = 0,
  ROI_QUALITY_CLASS_HIGH     = 1,
  ROI_QUALITY_CLASS_MODERATE = 2,
  ROI_QUALITY_CLASS_LOW      = 3

};

union ROI_DATA_SAFETY_DATA
{
  struct
  {
    uint8_t invalidDueToInvalidPixels : 1;
    uint8_t invalidDueToVariance : 1;
    uint8_t invalidDueToOverexposure : 1;
    uint8_t invalidDueToUnderexposure : 1;
    uint8_t invalidDueToTemporalVariance : 1;
    uint8_t invalidDueToOutsideOfMeasurementRange : 1;
    uint8_t invalidDueToRetroReflectorInterference : 1;
    uint8_t contaminationError : 1;
    uint8_t qualityClass : 2;
    uint8_t slotActive : 1;
    uint8_t reserved : 5;

  } tMembers;
  uint16_t u16All;
};

struct ROI_ELEMENT
{
  uint8_t id;
  ROI_DATA_RESULT result;
  ROI_DATA_SAFETY_DATA safetyRelatedData;
  uint16_t distanceValue;
};

enum class DataHandlerError
{
  OK,
  PARSE_XML_ERROR,
  INVALID_CRC_SEGMENT_DEPTHMAP,
  INVALID_LENGTH_SEGMENT_DEPTHMAP,
  INVALID_VERSION_SEGMENT_DEPTHMAP,
  INVALID_CRC_SEGMENT_DEVICESTATUS,
  INVALID_LENGTH_SEGMENT_DEVICESTATUS,
  INVALID_VERSION_SEGMENT_DEVICESTATUS,
  INVALID_CRC_SEGMENT_ROI,
  INVALID_LENGTH_SEGMENT_ROI,
  INVALID_VERSION_SEGMENT_ROI,
  INVALID_CRC_SEGMENT_LOCALIOS,
  INVALID_LENGTH_SEGMENT_LOCALIOS,
  INVALID_VERSION_SEGMENT_LOCALIOS,
  INVALID_CRC_SEGMENT_FIELDINFORMATION,
  INVALID_LENGTH_SEGMENT_FIELDINFORMATION,
  INVALID_VERSION_SEGMENT_FIELDINFORMATION,
  INVALID_CRC_SEGMENT_LOGICSIGNALS,
  INVALID_LENGTH_SEGMENT_LOGICSIGNALS,
  INVALID_VERSION_SEGMENT_LOGICSIGNALS,
  INVALID_CRC_SEGMENT_IMU,
  INVALID_LENGTH_SEGMENT_IMU,
  INVALID_VERSION_SEGMENT_IMU
};

constexpr std::uint32_t MAX_ROI_VALUES = 5u;

struct ROI_DATA
{
  ROI_ELEMENT roiData[MAX_ROI_VALUES];
};
#pragma pack(pop)

/*
 * Segment 4  Local I/Os
 */
#pragma pack(push, 1)

struct LOCALIOS_UNIVERSALIO_CONFIGURED
{
  uint16_t configuredUniIOPin5 : 1;
  uint16_t configuredUniIOPin6 : 1;
  uint16_t configuredUniIOPin7 : 1;
  uint16_t configuredUniIOPin8 : 1;
  uint16_t reserved : 12;
};

struct LOCALIOS_UNIVERSALIO_DIRECTION
{
  uint16_t directionValueUniIOPin5 : 1;
  uint16_t directionValueUniIOPin6 : 1;
  uint16_t directionValueUniIOPin7 : 1;
  uint16_t directionValueUniIOPin8 : 1;
  uint16_t reserved : 12;
};

struct LOCALIOS_UNIVERSALIO_INPUTVALUES
{
  uint16_t logicalValueUniIOPin5 : 1;
  uint16_t logicalValueUniIOPin6 : 1;
  uint16_t logicalValueUniIOPin7 : 1;
  uint16_t logicalValueUniIOPin8 : 1;
  uint16_t reserved : 12;
};
struct LOCALIOS_UNIVERSALIO_OUTPUTVALUES
{
  uint8_t localOutput1Pin5;
  uint8_t localOutput2Pin6;
  uint8_t localOutput3Pin7;
  uint8_t localOutput4Pin8;
  uint8_t reserved[12]; // Byte 4 bis 15 are reserved
};

struct LOCALIOS_OSSDS_STATE
{
  uint8_t stateOSSD1A : 1;
  uint8_t stateOSSD1B : 1;
  uint8_t stateOSSD2A : 1;
  uint8_t stateOSSD2B : 1;
  uint8_t reserved : 4;
};

struct LOCALIOS_ELEMENT
{
  LOCALIOS_UNIVERSALIO_CONFIGURED universalIOConfigured;
  LOCALIOS_UNIVERSALIO_DIRECTION universalIODirection;
  LOCALIOS_UNIVERSALIO_INPUTVALUES universalIOInputValue;
  LOCALIOS_UNIVERSALIO_OUTPUTVALUES universalIOOutputValue;
  LOCALIOS_OSSDS_STATE ossdsState;
  uint8_t ossdsDynCount;      // reserved
  uint8_t ossdsCRC;           // reserved
  uint8_t ossdsIOStatus;      // reserved
  uint16_t dynamicSpeedA;     // reserved
  uint16_t dynamicSpeedB;     // reserved
  uint16_t DynamicValidFlags; // reserved
  uint16_t flags;             // reserved
};

#pragma pack(pop)

/*
 * Segment 5 Field Information
 */
#pragma pack(push, 1)

struct FIELDINFORMATION_ELEMENT
{
  uint8_t fieldID;
  uint8_t fieldSetID;
  uint8_t fieldResult;
  uint8_t evalMethod;
  uint8_t fieldActive;
};
constexpr std::uint32_t MAX_FIELDINFORMATION_VALUES = 16u;

struct FIELDINFORMATION_DATA
{
  FIELDINFORMATION_ELEMENT fieldInformation[MAX_FIELDINFORMATION_VALUES];
};
#pragma pack(pop)

/*
 * Segment 6 Logic Signals
 */
#pragma pack(push, 1)

struct LOGICSIGNALS_INSTANCESTATE
{
  uint8_t instanceOSSD1 : 1;
  uint8_t instanceOSSD2 : 1;
  uint8_t reserved : 6;
};

struct LOGICSIGNALS_ELEMENT
{
  uint8_t signalType;
  uint8_t instance;
  uint16_t configured : 1;
  uint16_t signalDirection : 1;
  uint16_t reserved : 14;
  uint16_t value;
};

constexpr std::uint32_t MAX_LOGICSIGNALS_VALUES = 20u;

struct LOGICSIGNALS_DATA
{
  LOGICSIGNALS_ELEMENT logicSignals[MAX_LOGICSIGNALS_VALUES];
};

#pragma pack(pop)

/*
 * Segment 7  IMU
 */
#pragma pack(push, 1)

struct IMU_VECTOR
{
  float X;
  float Y;
  float Z;
  uint8_t accuracy;
};

struct IMU_QUATERNION
{
  float X;
  float Y;
  float Z;
  float W;
  float accuracy;
};

struct IMU_ELEMENT
{
  IMU_VECTOR acceleration;
  IMU_VECTOR angularVelocity;
  IMU_QUATERNION orientation;
};

#pragma pack(pop)

class SafeVisionaryData : public VisionaryData
{
public:
  SafeVisionaryData();
  virtual ~SafeVisionaryData();

  //-----------------------------------------------
  // Getter Functions

  const std::vector<uint16_t>& getDistanceMap() const;

  const std::vector<uint16_t>& getIntensityMap() const;

  const std::vector<uint8_t>& getStateMap() const;

  uint16_t getFlags() const;

  DEVICE_STATUS getDeviceStatus() const;

  DEVICE_STATUS_ELEMENT getDeviceStatusData() const;

  const ROI_DATA& getRoiData() const;

  LOCALIOS_ELEMENT getLocalIOData() const;

  const FIELDINFORMATION_DATA& getFieldInformationData() const;

  const LOGICSIGNALS_DATA& getLogicSignalsData() const;

  const IMU_ELEMENT getIMUData() const;

  bool isDistanceMapFiltered() const;

  bool isIntrudedPixelStateValid() const;

  void generatePointCloud(std::vector<PointXYZ>& pointCloud) override;

  static const float DISTANCE_MAP_UNIT;

  DataHandlerError getLastError();

  DataSetsActive getDataSetsActive();

  void clearData(uint32_t changedCounter);

protected:
  //-----------------------------------------------
  // functions for parsing received blob

  bool parseXML(const std::string& xmlString, uint32_t changeCounter);

  bool parseBinaryData(std::vector<uint8_t>::iterator itBuf, size_t length);

  bool parseRoiData(std::vector<uint8_t>::iterator itBuf, size_t length);

  bool parseDeviceStatusData(std::vector<uint8_t>::iterator itBuf, size_t length);

  bool parseLocalIOsData(std::vector<uint8_t>::iterator itBuf, size_t length);

  bool parseFieldInformationData(std::vector<uint8_t>::iterator itBuf, size_t length);

  bool parseLogicSignalsData(std::vector<uint8_t>::iterator itBuf, size_t length);

  bool parseIMUData(std::vector<uint8_t>::iterator itBuf, size_t length);

private:
  // Indicator for the received data sets
  DataSetsActive m_dataSetsActive;

  uint32_t m_distanceByteDepth;

  uint32_t m_intensityByteDepth;

  uint32_t m_stateByteDepth;

  std::vector<uint16_t> m_distanceMap;

  std::vector<uint16_t> m_intensityMap;

  std::vector<uint8_t> m_stateMap;

  DEVICE_STATUS m_deviceStatus;

  ROI_DATA m_roiData;

  // Contains the Device status data
  DEVICE_STATUS_ELEMENT m_deviceStatusData;

  // Contains the Local I/Os
  LOCALIOS_ELEMENT m_localIOsData;

  // Contains the Field Information data
  FIELDINFORMATION_DATA m_fieldInformationData;

  // Contains the Logic Signal data
  LOGICSIGNALS_DATA m_logicSignalsData;

  // Contains the IMU data
  IMU_ELEMENT m_IMUData;

  uint16_t m_flags;

  DataHandlerError m_lastDataHandlerError;
};

} // namespace visionary