Program Listing for File ApiBufferApi.h

Return to documentation for file (common\include\ApiBufferApi.h)

//This header file is used to generate the Doxygen manual
//TO STRIP ALL DOXYGEN COMMENTS FROM THIS HEADER FILE, SEARCH FOR THE FOLLOWING REGULAR EXPRESSION AND REPLACE IT WITH BLANK
// (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/\s+)|((//(/)<.*\s*)*(//(/)<.*))|(//(/)[^<].*\s*)

//==========================================DOCUMENTATION GUIDELINES (2017/3/30)=======================================================
//
// 1. References to constants, functions, classes, and class members should be linked using the @ref command. The format should be as
//   follows:
//
//   @ref [Full Path Including Namespaces] "[Name of Constant/Function/Class/Member]"
//
//   Examples: @ref Motion::StartPos "StartPos"
//             @ref Motion::StartPos(TriggerPosCommand *pPosCommand) "StartPos"
//
// 2. When documenting functions, @param should be used to document every function argument. @remarks should be used to explain the
//   function in further detail.
//
// 3. Try to follow the conventions of the existing documentation as much as possible.
//

#ifndef WMX3_APIBUFFER_API_H
#define WMX3_APIBUFFER_API_H
#include <windows.h>
#include "WMX3Api.h"

namespace wmx3Api{

    namespace constants {
        static const int maxApiBufferChannel = 255;
        static const int maxApiBufferErrorLog = 10;
        static const int maxDefaultApiBufferSize = 524288;
    }

    class ApiBufferErrorCode : public ErrorCode{
    public:
        enum {
            OverMaxLevel = 0x00012000,
            InvalidLevel,
            InvalidBuffControl,
            InvalidWatchTriggerRoutineChannel,
            WatchTriggerRoutineChannelSameAsExecChannel,
            RewindFailedFirstCommandOverwritten,
            AlreadyRecordingForSpecifiedChannel,
            NotRecording,
            RequestModeChangeTimeout
        };
    };

    class ApiBufferConditionType {
    public:
        enum T {
            NeverTrue,
            AlwaysTrue,
            IOInput,
            IOOutput,
            UserMemory,
            MinimumTrq,
            OpState,
            AxisCmdMode,
            InPos,
            PosSET,
            DelayedPosSET,
            CommandDistributedEnd,
            RemainingTime,
            RemainingDistance,
            CompletedTime,
            CompletedDistance,
            DistanceToTarget,
            DecelerationStarted,
            AxisIdle,
            MotionStarted,
            MotionStartedOverrideReady,
            Event
        };
    };

    class ApiBufferState {
    public:
        enum T {
            Idle,
            Active,
            Stop,
            Delay
        };
    };

    class ApiBufferCondition{
    public:
        ApiBufferCondition();
        ApiBufferConditionType::T bufferConditionType;

        union ApiBufferConditionArguments {
            ApiBufferConditionArguments();

            struct NeverTrue {
                int reserved;
            }neverTrue;

            struct AlwaysTrue {
                int reserved;
            }alwaysTrue;

            struct IOInput {
                unsigned int byteAddress;
                unsigned char bitAddress;
                unsigned char invert;
            }ioInput;

            struct IOOutput {
                unsigned int byteAddress;
                unsigned char bitAddress;
                unsigned char invert;
            }ioOutput;

            struct UserMemory {
                unsigned int byteAddress;
                unsigned char bitAddress;
                unsigned char invert;
            }userMemory;

            struct MinimumTrq {
                int axis;
                double torque;
            }minimumTrq;

            struct OpState {
                int axis;
                OperationState::T opState;
            }opState;

            struct AxisCmdMode {
                int axis;
                AxisCommandMode::T axisCommandMode;
                unsigned char useFeedback;
            }axisCmdMode;

            struct InPos {
                int axis;
                unsigned int channel;
            }inPos;

            struct PosSET {
                int axis;
            }posSET;

            struct DelayedPosSET {
                int axis;
            }delayedPosSET;

            struct CommandDistributedEnd {
                int axis;
            }commandDistributedEnd;

            struct RemainingTime {
                int axis;
                double timeMilliseconds;
            }remainingTime;

            struct RemainingDistance {
                int axis;
                double distance;
            }remainingDistance;

            struct CompletedTime {
                int axis;
                double timeMilliseconds;
            }completedTime;

            struct CompletedDistance{
                int axis;
                double distance;
            }completedDistance;

            struct DistanceToTarget {
                int axis;
                double distance;
            }distanceToTarget;

            struct DecelerationStarted {
                int axis;
            }decelerationStarted;

            struct AxisIdle {
                unsigned int axisCount;
                int axis[constants::maxAxes];
            }axisIdle;

            struct MotionStarted {
                int axis;
            }motionStarted;

            struct MotionStartedOverrideReady {
                int axis;
            }motionStartedOverrideReady;

            struct Event {
                unsigned int eventID;
            }event;
        }arg;
    };

    class ApiBufferErrorLog {
    public:
        ApiBufferErrorLog();
        int execBlockNumber;
        int errorCode;
    };

    class ApiBufferStatus{
    public:
        ApiBufferStatus();
        ApiBufferState::T state;
        int blockCount;
        int remainingBlockCount;
        int bufferSize;
        int freeSize;
        int execBlockCount;
        int errorCount;
        ApiBufferErrorLog errorLog[constants::maxApiBufferErrorLog];
        bool watchError;
        int watchErrorCode;
        int watchErrorAxis;
    };

    class ApiBufferOptions {
    public:
        ApiBufferOptions();
        bool stopOnError;
        bool autoRewind;
        bool stopOnLastBlock;
    };

    class ApiBufferWatch {
    public:
        ApiBufferWatch();
        bool enableWatch;
        AxisSelection watchAxes;
        bool enableWatchTriggerRoutine;
        int watchTriggerRoutineChannel;
    };

    class ApiBufferChannelSelection{
    public:
        ApiBufferChannelSelection();

        unsigned int channelCount;
        unsigned int channel[constants::maxApiBufferChannel];
    };

    class ApiBufferEventOutput : public EventOutput {
    public:
        enum ApiBufferEventOutputType {
            StartAPIBuffer,
            HaltApiBuffer,
        };

        ApiBufferEventOutputType outputFunction;
        union OutputFunctionArguments {
            OutputFunctionArguments();

            struct StartAPIBuffer {
                unsigned int channel;
            }startAPIBuffer;

            struct HaltAPIBuffer {
                unsigned int channel;
            }haltAPIBuffer;
        }output;

        ApiBufferEventOutput();

        int GetOutputModuleId();
        WMX3APIFUNC GetOutputData(unsigned char* buff, int buffSize, int* dataSize);
        WMX3APIFUNC SetOutputData(int moduleId, unsigned char* data, int dataSize);
    };

    class ApiBuffer {
    private:
        WMX3Api *wmx3Api;
        int statChnlId;
        bool isSelfDev;
        void init(WMX3Api *f);
        void close();

    public:
        ApiBuffer(WMX3Api *f);
        ApiBuffer(const ApiBuffer& src);
        ApiBuffer& operator=(const ApiBuffer& src);
        ApiBuffer();
        ~ApiBuffer();

        static WMX3APIFUNC ErrorToString(int errCode, char *pString, unsigned int size);
        static WMX3APIFUNC ErrorToString(int errCode, wchar_t *pString, unsigned int size);
        static WMX3APIFUNC ApiLogToString(unsigned char* pLogData, unsigned int logDataSize, char *pString, unsigned int size);
        static WMX3APIFUNC ApiLogToString(unsigned char* pLogData, unsigned int logDataSize, wchar_t *pString, unsigned int size);
        static WMX3APIFUNC GetLibVersion(int *pMajorVersion, int *pMinorVersion, int *pRevisionVersion, int *pFixVersion);

        bool IsDeviceValid();

        WMX3APIFUNC GetVersion(int *pMajorVersion, int *pMinorVersion, int *pRevisionVersion, int *pFixVersion);

        WMX3APIFUNC CreateApiBuffer(unsigned int channel, unsigned int size);
        WMX3APIFUNC CreateApiBuffer(unsigned int channel);
        WMX3APIFUNC CreateApiBuffer(unsigned int channel, unsigned int size, SizeUnit::T sizeUnit);
        WMX3APIFUNC FreeApiBuffer(unsigned int channel);

        WMX3APIFUNC StartRecordBufferChannel(unsigned int channel);
        WMX3APIFUNC EndRecordBufferChannel();
        WMX3APIFUNC GetRecordingBufferChannel(int* channel, unsigned char* enable);

        WMX3APIFUNC Execute(unsigned int channel);
        WMX3APIFUNC Halt(unsigned int channel);
        WMX3APIFUNC Clear(unsigned int channel);
        WMX3APIFUNC Rewind(unsigned int channel);
        WMX3APIFUNC ExecuteMultipleChannel(ApiBufferChannelSelection *pChannelSelection);
        WMX3APIFUNC HaltMultipleChannel(ApiBufferChannelSelection *pChannelSelection);
        WMX3APIFUNC ClearMultipleChannel(ApiBufferChannelSelection *pChannelSelection);
        WMX3APIFUNC RewindMultipleChannel(ApiBufferChannelSelection *pChannelSelection);

        WMX3APIFUNC GetStatus(unsigned int channel, ApiBufferStatus* pStatus);
        WMX3APIFUNC SetOptions(unsigned int channel, ApiBufferOptions *pOptions);
        WMX3APIFUNC GetOptions(unsigned int channel, ApiBufferOptions *pOptions);
        WMX3APIFUNC SetWatch(unsigned int channel, ApiBufferWatch *pWatch);
        WMX3APIFUNC GetWatch(unsigned int channel, ApiBufferWatch *pWatch);

        WMX3APIFUNC Sleep(unsigned int milliseconds);
        WMX3APIFUNC USleep(unsigned int microseconds);
        WMX3APIFUNC Wait(int axis);
        WMX3APIFUNC Wait(AxisSelection *pAxisSelection);
        WMX3APIFUNC Wait(ApiBufferCondition* condition);

        WMX3APIFUNC FlowIf(ApiBufferCondition* condition, ApiBufferCondition* wait = NULL);
        WMX3APIFUNC FlowElseIf(ApiBufferCondition* condition);
        WMX3APIFUNC FlowElse();
        WMX3APIFUNC FlowEndIf();

    };


}

#endif