Program Listing for File api.h

Return to documentation for file (cwipc_util/api.h)

#ifndef _cwipc_util_api_h_
#define _cwipc_util_api_h_

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

#ifdef __cplusplus
#include <string>
#include <set>
#endif

// For Windows ensure that the symbols are imported from a DLL, unless we're compiling the DLL itself.
#ifndef _CWIPC_UTIL_EXPORT
#ifdef WIN32
#define _CWIPC_UTIL_EXPORT __declspec(dllimport)
#else
#define _CWIPC_UTIL_EXPORT
#endif
#endif

#define CWIPC_API_VERSION ((uint64_t)0x20260129)

#define CWIPC_API_VERSION_OLD ((uint64_t)0x20260129)

#define CWIPC_CWIPCDUMP_HEADER "cpcd"

#define CWIPC_CWIPCDUMP_VERSION ((uint32_t)0x20210208)

#define CWIPC_FLAG_BINARY 1

struct cwipc_cwipcdump_header {
    char hdr[4];    // 0-4
    uint32_t magic; // 4-8
    uint64_t timestamp; // 8-16
    float cellsize; // 16-20
    uint32_t unused; // 20-24
    size_t size; // 24-32
};

#ifdef __cplusplus
static_assert(sizeof(struct cwipc_cwipcdump_header) == 32, "cwipc_cwipcdump_header unexpected size");
#endif

struct cwipc_vector {
    double x;
    double y;
    double z;
};

struct cwipc_point {
    float x;
    float y;
    float z;
    uint8_t r;
    uint8_t g;
    uint8_t b;
    uint8_t tile;
};

struct cwipc_point_packetheader {
    uint32_t magic;
    uint32_t dataCount;
    uint64_t timestamp;
    float cellsize;
    uint32_t unused;
};

#define CWIPC_POINT_PACKETHEADER_MAGIC 0x20201016

struct cwipc_skeleton_joint {
    uint32_t confidence;
    float x;
    float y;
    float z;
    float q_w;
    float q_x;
    float q_y;
    float q_z;
};

struct cwipc_skeleton_collection {
    uint32_t n_skeletons;
    uint32_t n_joints;
    struct cwipc_skeleton_joint joints[1];
};

struct cwipc_tileinfo {
    struct cwipc_vector normal;
    char* cameraName;
    uint8_t ncamera;
    uint8_t cameraMask;
};


enum cwipc_log_level { CWIPC_LOG_LEVEL_NONE=0, CWIPC_LOG_LEVEL_ERROR=1, CWIPC_LOG_LEVEL_WARNING=2, CWIPC_LOG_LEVEL_TRACE=3, CWIPC_LOG_LEVEL_DEBUG=4 };

typedef void (*cwipc_log_callback_t)(int level, const char* message);

#ifdef __cplusplus

class cwipc_metadata;

#ifndef DOXYGEN_SHOULD_SKIP_THIS
#ifndef _CWIPC_PCL_POINTCLOUD_DEFINED
typedef void* cwipc_pcl_pointcloud;
#define _CWIPC_PCL_POINTCLOUD_PLACEHOLDER_DEFINED
#endif //_CWIPC_PCL_POINTCLOUD_DEFINED
#endif // DOXYGEN_SHOULD_SKIP_THIS

class cwipc_pointcloud {
public:
    virtual ~cwipc_pointcloud() {};

    virtual void free() = 0;

    virtual cwipc_pointcloud *_shallowcopy() = 0;

    virtual uint64_t timestamp() = 0;

    virtual float cellsize() = 0;

    virtual void _set_cellsize(float cellsize) = 0;

    virtual void _set_timestamp(uint64_t timestamp) = 0;

    virtual int count() = 0;

    virtual size_t get_uncompressed_size() = 0;

    virtual int copy_uncompressed(struct cwipc_point* pointbuf, size_t size) = 0;

    virtual size_t copy_packet(uint8_t* packet, size_t size) = 0;

    virtual cwipc_pcl_pointcloud access_pcl_pointcloud() = 0;

    virtual cwipc_metadata* access_metadata() = 0;
};

class cwipc_source {
public:
    virtual ~cwipc_source() {};

    virtual void free() = 0;

    virtual bool seek(uint64_t timestamp) = 0;

    virtual bool eof() = 0;

    virtual bool available(bool wait) = 0;

    virtual cwipc_pointcloud* get() = 0;

};

class cwipc_activesource : public cwipc_source {
public:
    virtual ~cwipc_activesource() {};

    virtual bool reload_config(const char* configFile) = 0;

    virtual size_t get_config(char* buffer, size_t size) = 0;
    virtual bool start() = 0;

    virtual void stop() = 0;

    virtual bool seek(uint64_t timestamp) = 0;

    virtual int maxtile() = 0;

    virtual bool get_tileinfo(int tilenum, struct cwipc_tileinfo* tileinfo) = 0;


    virtual void request_metadata(const std::string& name) {
        metadata_wanted.insert(name);
    }

    bool is_metadata_requested(const std::string& name) {
        return metadata_wanted.find(name) != metadata_wanted.end();
    }

    virtual bool auxiliary_operation(const std::string op, const void* inbuf, size_t insize, void* outbuf, size_t outsize) {
        return false;
    }

private:
    std::set<std::string> metadata_wanted;
};

class cwipc_sink {
public:
    virtual ~cwipc_sink() {};

    virtual void free() = 0;

    virtual bool feed(cwipc_pointcloud* pc, bool clear) = 0;

    virtual bool caption(const char* caption) = 0;

    virtual char interact(const char* prompt, const char* responses, int32_t millis) = 0;
};

class cwipc_metadata {
public:
    typedef void (*deallocfunc)(void*);

    virtual ~cwipc_metadata() {}

    virtual int count() = 0;

    virtual const std::string& name(int idx) = 0;

    virtual const std::string& description(int idx) = 0;

    virtual void* pointer(int idx) = 0;

    virtual size_t size(int idx) = 0;

    virtual void _add(const std::string& name, const std::string& description, void* pointer, size_t size, deallocfunc dealloc) = 0;

    virtual void _move(cwipc_metadata* other) = 0;
};

#else

typedef struct _cwipc_pointcloud {
    int _dummy;
} cwipc_pointcloud;

typedef struct _cwipc_pcl_pointcloud {
    int _dummy;
} *cwipc_pcl_pointcloud;

typedef struct _cwipc_source {
    int _dummy;
} cwipc_source;

typedef struct cwipc_activesource {
    struct _cwipc_source source;
} cwipc_activesource;

typedef struct _cwipc_sink {
    int _dummy;
} cwipc_sink;

typedef struct _cwipc_metadata {
    int _dummy;
} cwipc_metadata;

#endif

#ifdef __cplusplus
extern "C" {
#endif

    _CWIPC_UTIL_EXPORT const char *cwipc_get_version();

    _CWIPC_UTIL_EXPORT void cwipc_log_configure(int level, cwipc_log_callback_t callback);

    _CWIPC_UTIL_EXPORT void _cwipc_log_emit(int level, const char* module, const char* message);

    _CWIPC_UTIL_EXPORT int cwipc_dangling_allocations(bool log);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_read(const char* filename, uint64_t timestamp, char** errorMessage, uint64_t apiVersion);

    _CWIPC_UTIL_EXPORT int cwipc_write(const char* filename, cwipc_pointcloud* pc, char** errorMessage);

    _CWIPC_UTIL_EXPORT int cwipc_write_ext(const char* filename, cwipc_pointcloud* pc, int flag, char** errorMessage);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_from_points(struct cwipc_point* points, size_t size, int npoint, uint64_t timestamp, char** errorMessage, uint64_t apiVersion);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_from_packet(uint8_t* packet, size_t size, char** errorMessage, uint64_t apiVersion);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_read_debugdump(const char* filename, char** errorMessage, uint64_t apiVersion);

    _CWIPC_UTIL_EXPORT int cwipc_write_debugdump(const char* filename, cwipc_pointcloud* pc, char** errorMessage);


    _CWIPC_UTIL_EXPORT void cwipc_pointcloud_free(cwipc_pointcloud* pc);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud *cwipc_pointcloud__shallowcopy(cwipc_pointcloud* pc);

    _CWIPC_UTIL_EXPORT uint64_t cwipc_pointcloud_timestamp(cwipc_pointcloud* pc);

    _CWIPC_UTIL_EXPORT float cwipc_pointcloud_cellsize(cwipc_pointcloud* pc);

    _CWIPC_UTIL_EXPORT void cwipc_pointcloud__set_cellsize(cwipc_pointcloud* pc, float cellsize);

    _CWIPC_UTIL_EXPORT void cwipc_pointcloud__set_timestamp(cwipc_pointcloud* pc, uint64_t timestamp);

    _CWIPC_UTIL_EXPORT int cwipc_pointcloud_count(cwipc_pointcloud* pc);

    _CWIPC_UTIL_EXPORT size_t cwipc_pointcloud_get_uncompressed_size(cwipc_pointcloud* pc);

    _CWIPC_UTIL_EXPORT int cwipc_pointcloud_copy_uncompressed(cwipc_pointcloud* pc, struct cwipc_point* pointbuf, size_t size);

    _CWIPC_UTIL_EXPORT size_t cwipc_pointcloud_copy_packet(cwipc_pointcloud* pc, uint8_t* packet, size_t size);

    _CWIPC_UTIL_EXPORT cwipc_metadata* cwipc_pointcloud_access_metadata(cwipc_pointcloud* pc);

    _CWIPC_UTIL_EXPORT bool cwipc_activesource_start(cwipc_activesource* src);

    _CWIPC_UTIL_EXPORT void cwipc_activesource_stop(cwipc_activesource* src);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_source_get(cwipc_source* src);

    _CWIPC_UTIL_EXPORT void cwipc_source_free(cwipc_source* src);

    _CWIPC_UTIL_EXPORT bool cwipc_source_eof(cwipc_source* src);

    _CWIPC_UTIL_EXPORT bool cwipc_source_available(cwipc_source* src, bool wait);

    _CWIPC_UTIL_EXPORT void cwipc_activesource_request_metadata(cwipc_activesource* src, const char* name);

    _CWIPC_UTIL_EXPORT bool cwipc_activesource_is_metadata_requested(cwipc_activesource* src, const char* name);

    _CWIPC_UTIL_EXPORT bool cwipc_activesource_reload_config(cwipc_activesource* src, const char* configFile);

    _CWIPC_UTIL_EXPORT size_t cwipc_activesource_get_config(cwipc_activesource* src, char* buffer, size_t size);

    _CWIPC_UTIL_EXPORT bool cwipc_activesource_seek(cwipc_activesource* src, uint64_t timestamp);

    _CWIPC_UTIL_EXPORT int cwipc_activesource_maxtile(cwipc_activesource* src);

    _CWIPC_UTIL_EXPORT bool cwipc_activesource_get_tileinfo(cwipc_activesource* src, int tilenum, struct cwipc_tileinfo* tileinfo);

    _CWIPC_UTIL_EXPORT bool cwipc_activesource_auxiliary_operation(cwipc_activesource *src, const char* op, const void* inbuf, size_t insize, void* outbuf, size_t outsize);


    _CWIPC_UTIL_EXPORT void cwipc_sink_free(cwipc_sink* sink);

    _CWIPC_UTIL_EXPORT bool cwipc_sink_feed(cwipc_sink* sink, cwipc_pointcloud* pc, bool clear);

    _CWIPC_UTIL_EXPORT bool cwipc_sink_caption(cwipc_sink* sink, const char* caption);

    _CWIPC_UTIL_EXPORT char cwipc_sink_interact(cwipc_sink* sink, const char* prompt, const char* responses, int32_t millis);

    _CWIPC_UTIL_EXPORT void cwipc_metadata__move(cwipc_metadata*  src, cwipc_metadata* dest);

    _CWIPC_UTIL_EXPORT int cwipc_metadata_count(cwipc_metadata* collection);

    _CWIPC_UTIL_EXPORT const char* cwipc_metadata_name(cwipc_metadata* collection, int idx);

    _CWIPC_UTIL_EXPORT const char* cwipc_metadata_description(cwipc_metadata* collection, int idx);


    _CWIPC_UTIL_EXPORT void* cwipc_metadata_pointer(cwipc_metadata* collection, int idx);

    _CWIPC_UTIL_EXPORT size_t cwipc_metadata_size(cwipc_metadata* collection, int idx);

    _CWIPC_UTIL_EXPORT cwipc_activesource* cwipc_synthetic(int fps, int npoints, char** errorMessage, uint64_t apiVersion);

    _CWIPC_UTIL_EXPORT cwipc_activesource* cwipc_capturer(const char *configFilename, char** errorMessage, uint64_t apiVersion);

    _CWIPC_UTIL_EXPORT cwipc_sink* cwipc_window(const char* title, char** errorMessage, uint64_t apiVersion);


    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_downsample(cwipc_pointcloud* pc, float voxelsize);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_remove_outliers(cwipc_pointcloud* pc, int kNeighbors, float stddevMulThresh, bool perTile);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_tilefilter(cwipc_pointcloud* pc, int tile);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_tilemap(cwipc_pointcloud* pc, uint8_t map[256]);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_crop(cwipc_pointcloud* pc, float bbox[6]);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_colormap(cwipc_pointcloud* pc, uint32_t clearBits, uint32_t setBits);

    _CWIPC_UTIL_EXPORT cwipc_pointcloud* cwipc_join(cwipc_pointcloud* pc1, cwipc_pointcloud* pc2);

    _CWIPC_UTIL_EXPORT cwipc_activesource* cwipc_proxy(const char* host, int port, char** errorMessage, uint64_t apiVersion);

#ifdef __cplusplus
}
#endif

#endif // _cwipc_util_api_h_