Skip to content

File joescan_pinchot.h

File List > api > src > joescan_pinchot.h

Go to the documentation of this file

#ifndef _JOESCAN_PINCHOT_H
#define _JOESCAN_PINCHOT_H

#include <limits.h>
#include <stdbool.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

#pragma once

#define jsProfileIsValid(profile) \
  (((profile).timestamp_ns != 0) && \
   ((profile).format != JS_DATA_FORMAT_INVALID)) ? \
  true : false

#define jsRawProfileIsValid(profile) \
  (((profile).timestamp_ns != 0) && \
   ((profile).format != JS_DATA_FORMAT_INVALID)) ? \
  true : false

typedef int64_t jsScanSystem;

typedef int64_t jsScanHead;

enum jsConstants : int64_t {
  JS_SCAN_HEAD_TYPE_STR_MAX_LEN = 32,
  JS_CLIENT_NAME_STR_MAX_LEN = 128,
  JS_SCAN_HEAD_DATA_COLUMNS_MAX_LEN = 1456,
  JS_PROFILE_DATA_LEN = JS_SCAN_HEAD_DATA_COLUMNS_MAX_LEN,
  JS_RAW_PROFILE_DATA_LEN = JS_SCAN_HEAD_DATA_COLUMNS_MAX_LEN,
  JS_CAMERA_IMAGE_DATA_MAX_WIDTH = JS_SCAN_HEAD_DATA_COLUMNS_MAX_LEN,
  JS_CAMERA_IMAGE_DATA_MAX_HEIGHT = 1088,
  JS_CAMERA_IMAGE_DATA_LEN =
    JS_CAMERA_IMAGE_DATA_MAX_HEIGHT * JS_CAMERA_IMAGE_DATA_MAX_WIDTH,
  JS_PROFILE_DATA_INVALID_XY = INT_MIN,
  JS_PROFILE_DATA_INVALID_BRIGHTNESS = 0,
  JS_SCAN_HEAD_PROFILES_MAX = 1000,
  JS_SCAN_HEAD_INVALID_SERIAL = 0,
  JS_SCANSYNC_INVALID_SERIAL = 0,
  JS_SCANSYNC_INVALID_ENCODER = INT64_MAX,
};

enum jsError {
  JS_ERROR_NONE = 0,
  JS_ERROR_INTERNAL = -1,
  JS_ERROR_NULL_ARGUMENT = -2,
  JS_ERROR_INVALID_ARGUMENT = -3,
  JS_ERROR_NOT_CONNECTED = -4,
  JS_ERROR_CONNECTED = -5,
  JS_ERROR_NOT_SCANNING = -6,
  JS_ERROR_SCANNING = -7,
  JS_ERROR_VERSION_COMPATIBILITY = -8,
  JS_ERROR_ALREADY_EXISTS = -9,
  JS_ERROR_NO_MORE_ROOM = -10,
  JS_ERROR_NETWORK = -11,
  JS_ERROR_NOT_DISCOVERED = -12,
  JS_ERROR_USE_CAMERA_FUNCTION = -13,
  JS_ERROR_USE_LASER_FUNCTION = -14,
  JS_ERROR_FRAME_SCANNING = -15,
  JS_ERROR_NOT_FRAME_SCANNING = -16,
  JS_ERROR_FRAME_SCANNING_INVALID_PHASE_TABLE = -17,
  JS_ERROR_PHASE_TABLE_EMPTY = -18,
  JS_ERROR_DEPRECATED = -19,
  JS_ERROR_INVALID_SCAN_SYSTEM = -20,
  JS_ERROR_INVALID_SCAN_HEAD = -21,
  JS_ERROR_UNKNOWN = -22,

  JS_ERROR_FORCE_INT32_SIZE = INT32_MAX,
};

typedef enum {
  JS_UNITS_INVALID = 0,
  JS_UNITS_INCHES = 1,
  JS_UNITS_MILLIMETER = 2,

  JS_UNITS_FORCE_INT32_SIZE = INT32_MAX,
} jsUnits;

typedef enum {
  JS_CABLE_ORIENTATION_INVALID = 0,
  JS_CABLE_ORIENTATION_DOWNSTREAM = 1,
  JS_CABLE_ORIENTATION_UPSTREAM = 2,

  JS_CABLE_ORIENTATION_FORCE_INT32_SIZE = INT32_MAX,
} jsCableOrientation;

typedef enum {
  JS_SCAN_WINDOW_INVALID = 0,
  JS_SCAN_WINDOW_UNCONSTRAINED = 1,
  JS_SCAN_WINDOW_RECTANGULAR = 2,
  JS_SCAN_WINDOW_POLYGONAL = 3,

  JS_SCAN_WINDOW_FORCE_INT32_SIZE = INT32_MAX,
} jsScanWindowType;

typedef enum {
  JS_SCAN_HEAD_INVALID_TYPE = 0,
  JS_SCAN_HEAD_JS50WX = 1,
  JS_SCAN_HEAD_JS50WSC = 2,
  JS_SCAN_HEAD_JS50X6B20 = 3,
  JS_SCAN_HEAD_JS50X6B30 = 4,
  JS_SCAN_HEAD_JS50MX = 5,
  JS_SCAN_HEAD_JS50Z820 = 6,
  JS_SCAN_HEAD_JS50Z830 = 7,

  JS_SCAN_HEAD_TYPE_FORCE_INT32_SIZE = INT32_MAX,
} jsScanHeadType;

typedef enum {
  JS_CAMERA_INVALID = 0,
  JS_CAMERA_A = 1,
  JS_CAMERA_B,
  JS_CAMERA_MAX,

  JS_CAMERA_FORCE_INT32_SIZE = INT32_MAX,
} jsCamera;

typedef enum {
  JS_LASER_INVALID = 0,
  JS_LASER_1 = 1,
  JS_LASER_2,
  JS_LASER_3,
  JS_LASER_4,
  JS_LASER_5,
  JS_LASER_6,
  JS_LASER_7,
  JS_LASER_8,
  JS_LASER_MAX,

  JS_LASER_FORCE_INT32_SIZE = INT32_MAX,
} jsLaser;

typedef enum {
  JS_ENCODER_MAIN = 0,
  JS_ENCODER_AUX_1,
  JS_ENCODER_AUX_2,
  JS_ENCODER_MAX,

  JS_ENCODER_FORCE_INT32_SIZE = INT32_MAX,
} jsEncoder;

typedef enum {
  JS_PROFILE_FLAG_ENCODER_MAIN_FAULT_A = 1 << 0,
  JS_PROFILE_FLAG_ENCODER_MAIN_FAULT_B = 1 << 1,
  JS_PROFILE_FLAG_ENCODER_MAIN_FAULT_Y = 1 << 2,
  JS_PROFILE_FLAG_ENCODER_MAIN_FAULT_Z = 1 << 3,
  JS_PROFILE_FLAG_ENCODER_MAIN_OVERRUN = 1 << 4,
  JS_PROFILE_FLAG_ENCODER_MAIN_TERMINATION_ENABLE = 1 << 5,
  JS_PROFILE_FLAG_ENCODER_MAIN_INDEX_Z = 1 << 6,
  JS_PROFILE_FLAG_ENCODER_MAIN_SYNC = 1 << 7,
  JS_PROFILE_FLAG_ENCODER_MAIN_AUX_Y = 1 << 8,
  JS_PROFILE_FLAG_ENCODER_MAIN_FAULT_SYNC = 1 << 9,
  JS_PROFILE_FLAG_ENCODER_MAIN_LASER_DISABLE = 1 << 10,
  JS_PROFILE_FLAG_ENCODER_MAIN_FAULT_LASER_DISABLE = 1 << 11,

  JS_PROFILE_FLAGS_FORCE_INT32_SIZE = INT32_MAX,
} jsProfileFlags;

typedef enum {
  JS_DATA_FORMAT_INVALID = 0,
  // Geometry and laser line brightness at combinations of full, 1/2, and 1/4
  // resolution.
  JS_DATA_FORMAT_XY_BRIGHTNESS_FULL,
  JS_DATA_FORMAT_XY_BRIGHTNESS_HALF,
  JS_DATA_FORMAT_XY_BRIGHTNESS_QUARTER,

  // Geometry at full, 1/2 and 1/4 resolution, no laser line brightness.
  JS_DATA_FORMAT_XY_FULL,
  JS_DATA_FORMAT_XY_HALF,
  JS_DATA_FORMAT_XY_QUARTER,

  JS_DATA_FORMAT_FORCE_INT32_SIZE = INT32_MAX,
} jsDataFormat;

typedef enum {
  JS_DIAGNOSTIC_MODE_INVALID = 0,
  JS_DIAGNOSTIC_FIXED_EXPOSURE,
  JS_DIAGNOSTIC_AUTO_EXPOSURE,

  JS_DIAGNOSTIC_FORCE_INT32_SIZE = INT32_MAX,
} jsDiagnosticMode;

#pragma pack(push, 1)

typedef enum {
  JS_SCAN_HEAD_STATE_INVALID = 0,
  JS_SCAN_HEAD_STATE_IDLE [[deprecated]] = 1,
  JS_SCAN_HEAD_STATE_STANDBY = 1,
  JS_SCAN_HEAD_STATE_CONNECTED = 2,
  JS_SCAN_HEAD_STATE_SCANNING = 3,
  JS_SCAN_HEAD_STATE_SCANNING_IDLE = 4,

  JS_SCAN_HEAD_STATE_FORCE_INT32_SIZE = INT32_MAX,
} jsScanHeadState;

typedef struct {
  uint32_t serial_number;
  jsScanHeadType type;
  char type_str[JS_SCAN_HEAD_TYPE_STR_MAX_LEN];
  uint32_t firmware_version_major;
  uint32_t firmware_version_minor;
  uint32_t firmware_version_patch;
  uint32_t ip_addr;
  char client_name_str[JS_CLIENT_NAME_STR_MAX_LEN];
  uint32_t client_ip_addr;
  uint32_t client_netmask;
  uint32_t link_speed_mbps;
  jsScanHeadState state;
} jsDiscovered;

typedef struct {
  uint32_t serial_number;
  uint32_t firmware_version_major;
  uint32_t firmware_version_minor;
  uint32_t firmware_version_patch;
  uint32_t ip_addr;
} jsScanSyncDiscovered;

typedef struct {
  uint32_t camera_brightness_bit_depth;
  uint32_t max_camera_image_height;
  uint32_t max_camera_image_width;
  uint32_t min_scan_period_us;
  uint32_t max_scan_period_us;
  uint32_t num_cameras;
  uint32_t num_encoders;
  uint32_t num_lasers;
} jsScanHeadCapabilities;

typedef struct {
  uint32_t camera_exposure_time_min_us;
  uint32_t camera_exposure_time_max_us;
  uint32_t camera_exposure_time_def_us;
  uint32_t laser_on_time_min_us;
  uint32_t laser_on_time_max_us;
  uint32_t laser_on_time_def_us;
  uint32_t laser_detection_threshold;
  uint32_t saturation_threshold;
  uint32_t saturation_percentage;
} jsScanHeadConfiguration;

typedef struct {
  uint8_t bitmap[JS_CAMERA_IMAGE_DATA_MAX_HEIGHT]
                [JS_CAMERA_IMAGE_DATA_MAX_WIDTH];
} jsExclusionMask;

typedef struct {
  uint8_t offset;
  float scale_factors[JS_SCAN_HEAD_DATA_COLUMNS_MAX_LEN];
} jsBrightnessCorrection_BETA;

typedef struct {
  uint64_t global_time_ns;
  int64_t encoder_values[JS_ENCODER_MAX];
  uint32_t num_encoder_values;
  int32_t camera_a_pixels_in_window;
  int32_t camera_b_pixels_in_window;
  int32_t camera_a_temp;
  int32_t camera_b_temp;
  uint32_t num_profiles_sent;
  jsScanHeadState state;
  bool is_laser_disable;
} jsScanHeadStatus;

typedef struct {
  int64_t encoder;
  uint64_t timestamp_ns;
  uint64_t sync_timestamp_ns;
  uint64_t aux_y_timestamp_ns;
  uint64_t index_z_timestamp_ns;
  uint64_t laser_disable_timestamp_ns;
  uint32_t serial;
  bool is_fault_a;
  bool is_fault_b;
  bool is_sync;
  bool is_aux_y;
  bool is_index_z;
  bool is_laser_disable;
} jsScanSyncStatus;

typedef struct {
  double x;
  double y;
} jsCoordinate;

typedef struct {
  int32_t x;
  int32_t y;
  int32_t brightness;
} jsProfileData;

typedef struct {
  uint32_t scan_head_id;
  jsCamera camera;
  jsLaser laser;
  uint64_t timestamp_ns;
  uint32_t flags;
  uint32_t sequence_number;
  int64_t encoder_values[JS_ENCODER_MAX];
  uint32_t num_encoder_values;
  uint32_t laser_on_time_us;
  jsDataFormat format;
  uint32_t packets_received;
  uint32_t packets_expected;
  uint32_t data_len;
  uint64_t reserved_0;
  uint64_t reserved_1;
  uint64_t reserved_2;
  uint64_t reserved_3;
  uint64_t reserved_4;
  uint64_t reserved_5;
  jsProfileData data[JS_PROFILE_DATA_LEN];
} jsProfile;

typedef struct {
  uint32_t scan_head_id;
  jsCamera camera;
  jsLaser laser;
  uint64_t timestamp_ns;
  uint32_t flags;
  uint32_t sequence_number;
  int64_t encoder_values[JS_ENCODER_MAX];
  uint32_t num_encoder_values;
  uint32_t laser_on_time_us;
  jsDataFormat format;
  uint32_t packets_received;
  uint32_t packets_expected;
  uint32_t data_len;
  uint32_t data_valid_brightness;
  uint32_t data_valid_xy;
  uint64_t reserved_0;
  uint64_t reserved_1;
  uint64_t reserved_2;
  uint64_t reserved_3;
  uint64_t reserved_4;
  uint64_t reserved_5;
  jsProfileData data[JS_RAW_PROFILE_DATA_LEN];
} jsRawProfile;

typedef struct {
  uint32_t scan_head_id;
  jsCamera camera;
  jsLaser laser;
  uint64_t timestamp_ns;
  uint64_t encoder_values[JS_ENCODER_MAX];
  uint32_t num_encoder_values;
  uint32_t camera_exposure_time_us;
  uint32_t laser_on_time_us;

  uint32_t image_height;
  uint32_t image_width;

  uint8_t data[JS_CAMERA_IMAGE_DATA_LEN];
} jsCameraImage;

#pragma pack(pop)

#ifndef NO_PINCHOT_INTERFACE

// Macros for setting the visiblity of functions within the library.
#if defined _WIN32 || defined __CYGWIN__
  #ifdef WIN_EXPORT
    #ifdef __GNUC__
      #define EXPORTED __attribute__((dllexport))
    #else
      #define EXPORTED __declspec(dllexport)
    #endif
  #else
    #ifdef __GNUC__
      #define EXPORTED __attribute__((dllexport))
    #else
      #define EXPORTED __declspec(dllexport)
    #endif
  #endif
  #define NOT_EXPORTED
  #define PRE __cdecl
  #define POST
#else
  #if __GNUC__ >= 4
    #define EXPORTED __attribute__((visibility("default")))
    #define NOT_EXPORTED __attribute__((visibility("hidden")))
  #else
    #define EXPORTED
    #define NOT_EXPORTED
  #endif
  #define PRE
  #define POST __attribute__((sysv_abi))
#endif

#if defined _MSC_VER
  #define DEPRECATED __declspec(deprecated)
#elif defined(__GNUC__) || defined(__clang__)
  #define DEPRECATED __attribute__((deprecated))
#else
  #define DEPRECATED
#endif

EXPORTED void PRE jsGetAPIVersion(
  const char **version_str) POST;

EXPORTED void PRE jsGetAPISemanticVersion(
  uint32_t *major,
  uint32_t *minor,
  uint32_t *patch) POST;

EXPORTED void PRE jsGetError(
  int32_t return_code,
  const char **error_str) POST;

EXPORTED int32_t PRE jsScanSystemGetLastErrorExtended(
  jsScanSystem scan_system,
  const char **error_extended_str) POST;

EXPORTED int32_t PRE jsScanHeadGetLastErrorExtended(
  jsScanHead scan_head,
  const char **error_extended_str) POST;

EXPORTED void PRE jsProfileInit(
  jsProfile *profile) POST;

EXPORTED void PRE jsRawProfileInit(
  jsRawProfile *profile) POST;

EXPORTED
int32_t jsPowerCycleScanHead(
  uint32_t serial_number) POST;

EXPORTED jsScanSystem PRE jsScanSystemCreate(
  jsUnits units) POST;

EXPORTED void PRE jsScanSystemFree(
  jsScanSystem scan_system) POST;

EXPORTED int PRE jsScanSystemDiscover(
  jsScanSystem scan_system) POST;

EXPORTED int PRE jsScanSystemGetDiscovered(
  jsScanSystem scan_system,
  jsDiscovered *results,
  uint32_t max_results) POST;

EXPORTED int PRE jsScanSystemScanSyncDiscover(
  jsScanSystem scan_system) POST;

EXPORTED int PRE jsScanSystemGetScanSyncDiscovered(
  jsScanSystem scan_system,
  jsScanSyncDiscovered *results,
  uint32_t max_results) POST;

EXPORTED int PRE jsScanSystemSetScanSyncEncoder(
  jsScanSystem scan_system,
  uint32_t serial_main,
  uint32_t serial_aux1,
  uint32_t serial_aux2) POST;

EXPORTED int PRE jsScanSystemGetScanSyncEncoder(
  jsScanSystem scan_system,
  uint32_t *serial_main,
  uint32_t *serial_aux1,
  uint32_t *serial_aux2) POST;

EXPORTED int PRE jsScanSystemGetScanSyncStatus(
  jsScanSystem scan_system,
  uint32_t serial,
  jsScanSyncStatus *status) POST;

DEPRECATED EXPORTED int PRE jsScanSystemGetEncoder(
  jsScanSystem scan_system,
  jsEncoder encoder,
  int64_t *value) POST;

EXPORTED jsScanHead PRE jsScanSystemCreateScanHead(
  jsScanSystem scan_system,
  uint32_t serial,
  uint32_t id) POST;

EXPORTED jsScanHead PRE jsScanSystemGetScanHeadById(
  jsScanSystem scan_system,
  uint32_t id) POST;

EXPORTED jsScanHead PRE jsScanSystemGetScanHeadBySerial(
  jsScanSystem scan_system,
  uint32_t serial) POST;

EXPORTED int32_t PRE jsScanSystemGetNumberScanHeads(
  jsScanSystem scan_system) POST;

EXPORTED int32_t PRE jsScanSystemConnect(
  jsScanSystem scan_system,
  int32_t timeout_s) POST;

EXPORTED int32_t PRE jsScanSystemDisconnect(
  jsScanSystem scan_system) POST;

EXPORTED bool PRE jsScanSystemIsConnected(
  jsScanSystem scan_system) POST;

EXPORTED int32_t PRE jsScanSystemPhaseClearAll(
  jsScanSystem scan_system) POST;

EXPORTED int32_t PRE jsScanSystemPhaseCreate(
  jsScanSystem scan_system) POST;

EXPORTED int32_t PRE jsScanSystemPhaseInsertCamera(
  jsScanSystem scan_system,
  jsScanHead scan_head,
  jsCamera camera) POST;

EXPORTED int32_t PRE jsScanSystemPhaseInsertLaser(
  jsScanSystem scan_system,
  jsScanHead scan_head,
  jsLaser laser) POST;

EXPORTED int32_t PRE jsScanSystemPhaseInsertConfigurationCamera(
  jsScanSystem scan_system,
  jsScanHead scan_head,
  jsScanHeadConfiguration *cfg,
  jsCamera camera) POST;

EXPORTED int32_t PRE jsScanSystemPhaseInsertConfigurationLaser(
  jsScanSystem scan_system,
  jsScanHead scan_head,
  jsScanHeadConfiguration *cfg,
  jsLaser laser) POST;

DEPRECATED EXPORTED int32_t PRE jsScanSystemPhaseInsertCameraConfiguration(
  jsScanSystem scan_system,
  jsScanHead scan_head,
  jsCamera camera,
  jsScanHeadConfiguration cfg) POST;

DEPRECATED EXPORTED int32_t PRE jsScanSystemPhaseInsertLaserConfiguration(
  jsScanSystem scan_system,
  jsScanHead scan_head,
  jsLaser laser,
  jsScanHeadConfiguration cfg) POST;

EXPORTED int32_t PRE
jsScanSystemGetMinScanPeriod(
  jsScanSystem scan_system) POST;

EXPORTED int32_t PRE jsScanSystemConfigure(
  jsScanSystem scan_system) POST;

EXPORTED bool PRE jsScanSystemIsConfigured(
  jsScanSystem scan_system) POST;

EXPORTED int32_t PRE jsScanSystemStartScanning(
  jsScanSystem scan_system,
  uint32_t period_us,
  jsDataFormat fmt) POST;

EXPORTED int32_t PRE jsScanSystemStopScanning(
  jsScanSystem scan_system) POST;

EXPORTED int32_t PRE jsScanSystemStartFrameScanning(
  jsScanSystem scan_system,
  uint32_t period_us,
  jsDataFormat fmt) POST;

EXPORTED int32_t PRE jsScanSystemGetProfilesPerFrame(
  jsScanSystem scan_system) POST;

EXPORTED int32_t PRE jsScanSystemWaitUntilFrameAvailable(
  jsScanSystem scan_system,
  uint32_t timeout_us) POST;

EXPORTED bool PRE jsScanSystemIsFrameAvailable(
  jsScanSystem scan_system) POST;

EXPORTED int32_t PRE jsScanSystemClearFrames(
  jsScanSystem scan_system) POST;

EXPORTED int32_t PRE jsScanSystemGetFrame(
  jsScanSystem scan_system,
  jsProfile *profiles) POST;

EXPORTED int32_t PRE jsScanSystemGetRawFrame(
  jsScanSystem scan_system,
  jsRawProfile *profiles) POST;

EXPORTED bool PRE jsScanSystemIsScanning(
  jsScanSystem scan_system) POST;

EXPORTED jsScanHeadType PRE jsScanHeadGetType(
  jsScanHead scan_head) POST;

EXPORTED uint32_t PRE jsScanHeadGetId(
  jsScanHead scan_head) POST;

EXPORTED uint32_t PRE jsScanHeadGetSerial(
  jsScanHead scan_head) POST;

EXPORTED int32_t PRE jsScanHeadGetCapabilities(
  jsScanHead scan_head,
  jsScanHeadCapabilities *capabilities) POST;

EXPORTED int32_t PRE jsScanHeadGetFirmwareVersion(
  jsScanHead scan_head,
  uint32_t *major,
  uint32_t *minor,
  uint32_t *patch) POST;

EXPORTED bool PRE jsScanHeadIsConnected(
  jsScanHead scan_head) POST;

EXPORTED int32_t PRE jsScanHeadSetConfiguration(
  jsScanHead scan_head,
  jsScanHeadConfiguration *cfg) POST;

EXPORTED int32_t PRE jsScanHeadGetConfiguration(
  jsScanHead scan_head,
  jsScanHeadConfiguration *cfg) POST;

EXPORTED int32_t PRE jsScanHeadGetConfigurationDefault(
  jsScanHead scan_head,
  jsScanHeadConfiguration *cfg) POST;

EXPORTED int32_t PRE jsScanHeadSetCableOrientation(
  jsScanHead scan_head,
  jsCableOrientation cable_orientation);

EXPORTED int32_t PRE jsScanHeadGetCableOrientation(
  jsScanHead scan_head,
  jsCableOrientation *cable_orientation);

EXPORTED int32_t PRE jsScanHeadSetAlignment(
  jsScanHead scan_head,
  double roll_degrees,
  double shift_x,
  double shift_y) POST;

EXPORTED int32_t PRE jsScanHeadSetAlignmentCamera(
  jsScanHead scan_head,
  jsCamera camera,
  double roll_degrees,
  double shift_x,
  double shift_y) POST;

EXPORTED int32_t PRE jsScanHeadGetAlignmentCamera(
  jsScanHead scan_head,
  jsCamera camera,
  double *roll_degrees,
  double *shift_x,
  double *shift_y) POST;

EXPORTED int32_t PRE jsScanHeadSetAlignmentLaser(
  jsScanHead scan_head,
  jsLaser laser,
  double roll_degrees,
  double shift_x,
  double shift_y) POST;

EXPORTED int32_t PRE jsScanHeadGetAlignmentLaser(
  jsScanHead scan_head,
  jsLaser laser,
  double *roll_degrees,
  double *shift_x,
  double *shift_y) POST;

EXPORTED int32_t PRE jsScanHeadSetExclusionMaskCamera(
  jsScanHead scan_head,
  jsCamera camera,
  jsExclusionMask *mask) POST;

EXPORTED int32_t PRE jsScanHeadSetExclusionMaskLaser(
  jsScanHead scan_head,
  jsLaser laser,
  jsExclusionMask *mask) POST;

EXPORTED int32_t PRE jsScanHeadGetExclusionMaskCamera(
  jsScanHead scan_head,
  jsCamera camera,
  jsExclusionMask *mask) POST;

EXPORTED int32_t PRE jsScanHeadGetExclusionMaskLaser(
  jsScanHead scan_head,
  jsLaser laser,
  jsExclusionMask *mask) POST;

EXPORTED int32_t PRE jsScanHeadSetBrightnessCorrectionCamera_BETA(
  jsScanHead scan_head,
  jsCamera camera,
  jsBrightnessCorrection_BETA *correction) POST;

EXPORTED int32_t PRE jsScanHeadSetBrightnessCorrectionLaser_BETA(
  jsScanHead scan_head,
  jsLaser laser,
  jsBrightnessCorrection_BETA *correction) POST;

EXPORTED int32_t PRE jsScanHeadGetBrightnessCorrectionCamera_BETA(
  jsScanHead scan_head,
  jsCamera camera,
  jsBrightnessCorrection_BETA *correction) POST;

EXPORTED int32_t PRE jsScanHeadGetBrightnessCorrectionLaser_BETA(
  jsScanHead scan_head,
  jsLaser laser,
  jsBrightnessCorrection_BETA *correction) POST;

DEPRECATED EXPORTED int32_t PRE jsScanHeadSetMinimumEncoderTravel(
  jsScanHead scan_head,
  uint32_t min_encoder_travel);

DEPRECATED EXPORTED int32_t PRE jsScanHeadGetMinimumEncoderTravel(
  jsScanHead scan_head,
  uint32_t *min_encoder_travel);

EXPORTED int32_t PRE jsScanSystemSetIdleScanPeriod(
  jsScanSystem scan_system,
  uint32_t idle_period_us) POST;

EXPORTED int32_t PRE jsScanSystemGetIdleScanPeriod(
  jsScanSystem scan_system,
  uint32_t *idle_period_us) POST;

EXPORTED int32_t PRE jsScanSystemDisableIdleScanning(jsScanSystem scan_system);

EXPORTED bool PRE jsScanSystemIsIdleScanningEnabled(jsScanSystem scan_system);

DEPRECATED EXPORTED int32_t PRE jsScanHeadSetIdleScanPeriod(
  jsScanHead scan_head,
  uint32_t idle_period_us);

DEPRECATED EXPORTED int32_t PRE jsScanHeadGetIdleScanPeriod(
  jsScanHead scan_head,
  uint32_t *idle_period_us);

EXPORTED int32_t PRE jsScanHeadSetWindowUnconstrained(
  jsScanHead scan_head) POST;

EXPORTED int32_t PRE jsScanHeadSetWindowUnconstrainedCamera(
  jsScanHead scan_head,
  jsCamera camera) POST;

EXPORTED int32_t PRE jsScanHeadSetWindowUnconstrainedLaser(
  jsScanHead scan_head,
  jsLaser laser) POST;

EXPORTED int32_t PRE jsScanHeadSetWindowRectangular(
  jsScanHead scan_head,
  double window_top,
  double window_bottom,
  double window_left,
  double window_right) POST;

EXPORTED int32_t PRE jsScanHeadSetWindowRectangularCamera(
  jsScanHead scan_head,
  jsCamera camera,
  double window_top,
  double window_bottom,
  double window_left,
  double window_right) POST;

EXPORTED int32_t PRE jsScanHeadSetWindowRectangularLaser(
  jsScanHead scan_head,
  jsLaser laser,
  double window_top,
  double window_bottom,
  double window_left,
  double window_right) POST;

EXPORTED int32_t PRE jsScanHeadSetPolygonWindow(
  jsScanHead scan_head,
  jsCoordinate *points,
  uint32_t points_len);

EXPORTED int32_t PRE jsScanHeadSetPolygonWindowCamera(
  jsScanHead scan_head,
  jsCamera camera,
  jsCoordinate *points,
  uint32_t points_len);

EXPORTED int32_t PRE jsScanHeadSetPolygonWindowLaser(
  jsScanHead scan_head,
  jsLaser laser,
  jsCoordinate *points,
  uint32_t points_len);

EXPORTED int32_t PRE jsScanHeadGetWindowTypeCamera(
  jsScanHead scan_head,
  jsCamera camera,
  jsScanWindowType *window_type);

EXPORTED int32_t PRE jsScanHeadGetWindowTypeLaser(
  jsScanHead scan_head,
  jsLaser laser,
  jsScanWindowType *window_type);

EXPORTED int32_t PRE jsScanHeadGetNumberWindowPointsCamera(
  jsScanHead scan_head,
  jsCamera camera) POST;

EXPORTED int32_t PRE jsScanHeadGetNumberWindowPointsLaser(
  jsScanHead scan_head,
  jsLaser laser) POST;

EXPORTED int32_t PRE jsScanHeadGetWindowCamera(
  jsScanHead scan_head,
  jsCamera camera,
  jsCoordinate *points);

EXPORTED int32_t PRE jsScanHeadGetWindowLaser(
  jsScanHead scan_head,
  jsLaser laser,
  jsCoordinate *points);

EXPORTED int32_t PRE jsScanHeadGetStatus(
  jsScanHead scan_head,
  jsScanHeadStatus *status) POST;

EXPORTED int32_t PRE jsScanHeadGetProfilesAvailable(
  jsScanHead scan_head) POST;

EXPORTED int32_t PRE jsScanHeadWaitUntilProfilesAvailable(
  jsScanHead scan_head,
  uint32_t count,
  uint32_t timeout_us) POST;

EXPORTED int32_t PRE jsScanHeadClearProfiles(
  jsScanHead scan_head) POST;

EXPORTED int32_t PRE jsScanHeadGetProfiles(
  jsScanHead scan_head,
  jsProfile *profiles,
  uint32_t max_profiles) POST;

EXPORTED int32_t PRE jsScanHeadGetRawProfiles(
  jsScanHead scan_head,
  jsRawProfile *profiles,
  uint32_t max_profiles) POST;

EXPORTED int32_t PRE jsScanHeadGetDiagnosticProfileCamera(
  jsScanHead scan_head,
  jsCamera camera,
  jsDiagnosticMode mode,
  uint32_t laser_on_time_us,
  uint32_t camera_exposure_time_us,
  jsRawProfile *profile) POST;

EXPORTED int32_t PRE jsScanHeadGetDiagnosticProfileLaser(
  jsScanHead scan_head,
  jsLaser laser,
  jsDiagnosticMode mode,
  uint32_t laser_on_time_us,
  uint32_t camera_exposure_time_us,
  jsRawProfile *profile) POST;

DEPRECATED EXPORTED int32_t PRE jsScanHeadGetDiagnosticImageCamera(
  jsScanHead scan_head,
  jsCamera camera,
  jsDiagnosticMode mode,
  uint32_t laser_on_time_us,
  uint32_t camera_exposure_time_us,
  jsCameraImage *image) POST;

DEPRECATED EXPORTED int32_t PRE jsScanHeadGetDiagnosticImageLaser(
  jsScanHead scan_head,
  jsLaser laser,
  jsDiagnosticMode mode,
  uint32_t laser_on_time_us,
  uint32_t camera_exposure_time_us,
  jsCameraImage *image) POST;

DEPRECATED EXPORTED int32_t PRE jsScanHeadGetDiagnosticImage(
  jsScanHead scan_head,
  jsCamera camera,
  jsLaser laser,
  jsDiagnosticMode mode,
  uint32_t laser_on_time_us,
  uint32_t camera_exposure_time_us,
  jsCameraImage *image) POST;

#ifdef PRE
  #undef PRE
#endif

#ifdef POST
  #undef POST
#endif

#endif

#ifdef __cplusplus
} // extern "C" {
#endif

#endif