From 048406eb18ae49944acfd9f088914be37b7c7818 Mon Sep 17 00:00:00 2001 From: MPIBR-tushevg Date: Tue, 8 Jan 2019 00:26:00 +0100 Subject: [PATCH] add first windows addaptation --- .gitignore | 2 +- BrainATUMtome/BrainATUMtome.pro | 20 +- BrainATUMtome/epos.cpp | 1 + BrainATUMtome/mainwindow.cpp | 8 +- config/settings.ini | 14 +- libs/epos/win/Definitions.h | 511 ++++++++++++++++++++++++++++++++ libs/epos/win/EposCmd.lib | Bin 0 -> 53518 bytes libs/epos/win/EposCmd64.lib | Bin 0 -> 50014 bytes 8 files changed, 540 insertions(+), 16 deletions(-) create mode 100644 libs/epos/win/Definitions.h create mode 100644 libs/epos/win/EposCmd.lib create mode 100644 libs/epos/win/EposCmd64.lib diff --git a/.gitignore b/.gitignore index 867dbec..1fb2fa1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # C++ objects and libs .DS_Store -#libs/ +libs/opencv/ *.slo *.lo diff --git a/BrainATUMtome/BrainATUMtome.pro b/BrainATUMtome/BrainATUMtome.pro index 935a9ea..a142bcf 100644 --- a/BrainATUMtome/BrainATUMtome.pro +++ b/BrainATUMtome/BrainATUMtome.pro @@ -53,12 +53,24 @@ qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -win32: LIBS += -L$$PWD/../libs/epos/lib/ -lEposCmd64 +win32 { + # eops + LIBS += -L$$PWD/../libs/epos/win/ -lEposCmd64 + INCLUDEPATH += $$PWD/../libs/epos/win + DEPENDPATH += $$PWD/../libs/epos/win -INCLUDEPATH += $$PWD/../libs/epos/include -DEPENDPATH += $$PWD/../libs/epos/include + # opencv + CONFIG(release, debug|release): LIBS += -L$$PWD/../libs/opencv/lib/ -lopencv_world340 + CONFIG(debug, debug|release): LIBS += -L$$PWD/../libs/opencv/lib/ -lopencv_world340d -macx{ + INCLUDEPATH += $$PWD/../libs/opencv/include + DEPENDPATH += $$PWD/../libs/opencv/include +} + + +macx { + + # epos INCLUDEPATH += $$PWD/../libs/epos/macx LIBS += -L$$PWD/../libs/epos/macx -lepos diff --git a/BrainATUMtome/epos.cpp b/BrainATUMtome/epos.cpp index 09501a6..ea01a95 100644 --- a/BrainATUMtome/epos.cpp +++ b/BrainATUMtome/epos.cpp @@ -207,6 +207,7 @@ void Epos::throwError(const QString &errorMessage) if (!VCS_GetErrorInfo(m_errorCode, errorInfo, errorInfoSize)) { //std::copy(errorInfo, "failed to read error information", errorInfoSize); + } emit log(Qt::red, "EPOS :: Error, " + errorMessage + "\n" + QString(errorInfo) + ", errorCode: " + QString::number(m_errorCode, 16)); diff --git a/BrainATUMtome/mainwindow.cpp b/BrainATUMtome/mainwindow.cpp index 65733ec..f72e7bb 100644 --- a/BrainATUMtome/mainwindow.cpp +++ b/BrainATUMtome/mainwindow.cpp @@ -21,16 +21,16 @@ MainWindow::MainWindow(QWidget *parent) : ui->setupUi(this); // open settings - QString fileIni = "/Users/tushevg/Desktop/BrainATUMtome/config/settings.ini"; + QString fileIni = "D:\\Developer\\BrainATUMtome\\config\\settings.ini"; if (!(QFileInfo::exists(fileIni) && QFileInfo(fileIni).isFile())) ui->widget_board->on_log(Qt::red, "MainWindow :: provided INI file " + fileIni + " is not valid."); m_settings = new QSettings(fileIni, QSettings::IniFormat); configure_logs(); - configure_video(); + //configure_video(); configure_epos(); - configure_microtome(); - configure_syringe(); + //configure_microtome(); + //configure_syringe(); } MainWindow::~MainWindow() diff --git a/config/settings.ini b/config/settings.ini index 7329ab0..787efb5 100644 --- a/config/settings.ini +++ b/config/settings.ini @@ -1,13 +1,13 @@ [export] -path=/Users/tushevg/Desktop/export +path=D:\Developer\logs [microtome] -#deviceName=LeicaEMUC7 -#port=COM2 -#baudRate=19200 -deviceName=Arduino -port=/dev/cu.usbmodem14311 -baudRate=9600 +deviceName=LeicaEMUC7 +port=COM2 +baudRate=19200 +#deviceName=Arduino +#port=/dev/cu.usbmodem14311 +#baudRate=9600 [epos] deviceName=EPOS2 diff --git a/libs/epos/win/Definitions.h b/libs/epos/win/Definitions.h new file mode 100644 index 0000000..b168bd8 --- /dev/null +++ b/libs/epos/win/Definitions.h @@ -0,0 +1,511 @@ +// ******************************************************************************************************************* +// maxon motor ag, CH-6072 Sachseln +// ******************************************************************************************************************* +// +// File: Definitions.h +// +// Description: Functions definitions for EposCmd.dll/EposCmd64.dll library for Developer Platform Microsoft Visual C++ +// +// Date: 13.11.2003 +// +// Dev. Platform: Microsoft Visual C++ +// +// Target: Windows Operating Systems +// +// Written by: maxon motor ag, CH-6072 Sachseln +// +// History: See chapter History in the document EPOS Command Library +// +// Copyright © 2003 - 2017, maxon motor ag. +// All rights reserved. +// ******************************************************************************************************************* + +// -------------------------------------------------------------------------- +// DIRECTIVES +// -------------------------------------------------------------------------- + +#ifndef _WINDOWS_ +#include +#endif + +#if !defined(EposCommandLibraryDefinitions) +#define EposCommandLibraryDefinitions + +// -------------------------------------------------------------------------- +// IMPORTED FUNCTIONS PROTOTYPE +// -------------------------------------------------------------------------- + +// INITIALISATION FUNCTIONS + #define Initialisation_DllExport extern "C" __declspec(dllexport) + #define HelpFunctions_DllExport extern "C" __declspec(dllexport) +// CONFIGURATION FUNCTIONS + #define Configuration_DllExport extern "C" __declspec(dllexport) +// OPERATION FUNCTIONS + #define Status_DllExport extern "C" __declspec(dllexport) + #define StateMachine_DllExport extern "C" __declspec(dllexport) + #define ErrorHandling_DllExport extern "C" __declspec(dllexport) + #define MotionInfo_DllExport extern "C" __declspec(dllexport) + #define ProfilePositionMode_DllExport extern "C" __declspec(dllexport) + #define ProfileVelocityMode_DllExport extern "C" __declspec(dllexport) + #define HomingMode_DllExport extern "C" __declspec(dllexport) + #define InterpolatedPositionMode_DllExport extern "C" __declspec(dllexport) + #define PositionMode_DllExport extern "C" __declspec(dllexport) + #define VelocityMode_DllExport extern "C" __declspec(dllexport) + #define CurrentMode_DllExport extern "C" __declspec(dllexport) + #define MasterEncoderMode_DllExport extern "C" __declspec(dllexport) + #define StepDirectionMode_DllExport extern "C" __declspec(dllexport) + #define InputsOutputs_DllExport extern "C" __declspec(dllexport) +// DATA RECORDING FUNCTIONS + #define DataRecording_DllExport extern "C" __declspec(dllexport) +// LOW LAYER FUNCTIONS + #define CanLayer_DllExport extern "C" __declspec(dllexport) + +//******************************************************************************************************************* +// INITIALISATION FUNCTIONS +//******************************************************************************************************************* + +//Communication + Initialisation_DllExport HANDLE __stdcall VCS_OpenDevice(char* DeviceName, char* ProtocolStackName, char* InterfaceName, char* PortName, DWORD* pErrorCode); + Initialisation_DllExport HANDLE __stdcall VCS_OpenDeviceDlg(DWORD* pErrorCode); + Initialisation_DllExport BOOL __stdcall VCS_SetProtocolStackSettings(HANDLE KeyHandle, DWORD Baudrate, DWORD Timeout, DWORD* pErrorCode); + Initialisation_DllExport BOOL __stdcall VCS_GetProtocolStackSettings(HANDLE KeyHandle, DWORD* pBaudrate, DWORD* pTimeout, DWORD* pErrorCode); + Initialisation_DllExport BOOL __stdcall VCS_FindDeviceCommunicationSettings(HANDLE* pKeyHandle, char* pDeviceName, char* pProtocolStackName, char* pInterfaceName, char* pPortName, WORD SizeName, DWORD* pBaudrate, DWORD* pTimeout, WORD* pNodeId, int DialogMode, DWORD* pErrorCode); + Initialisation_DllExport BOOL __stdcall VCS_CloseDevice(HANDLE KeyHandle, DWORD* pErrorCode); + Initialisation_DllExport BOOL __stdcall VCS_CloseAllDevices(DWORD* pErrorCode); + + //Gateway + Initialisation_DllExport BOOL __stdcall VCS_SetGatewaySettings(HANDLE KeyHandle, DWORD Baudrate, DWORD* pErrorCode); + Initialisation_DllExport BOOL __stdcall VCS_GetGatewaySettings(HANDLE KeyHandle, DWORD* pBaudrate, DWORD* pErrorCode); + + //Subdevice + Initialisation_DllExport HANDLE __stdcall VCS_OpenSubDevice(HANDLE DeviceHandle, char* DeviceName, char* ProtocolStackName, DWORD* pErrorCode); + Initialisation_DllExport HANDLE __stdcall VCS_OpenSubDeviceDlg(HANDLE DeviceHandle, DWORD* pErrorCode); + Initialisation_DllExport BOOL __stdcall VCS_FindSubDeviceCommunicationSettings(HANDLE DeviceHandle, HANDLE* pKeyHandle, char* pDeviceName, char* pProtocolStackName, WORD SizeName, DWORD* pBaudrate, WORD* pNodeId, int DialogMode, DWORD* pErrorCode); + Initialisation_DllExport BOOL __stdcall VCS_CloseSubDevice(HANDLE KeyHandle, DWORD* pErrorCode); + Initialisation_DllExport BOOL __stdcall VCS_CloseAllSubDevices(HANDLE DeviceHandle, DWORD* pErrorCode); + +//Info + HelpFunctions_DllExport BOOL __stdcall VCS_GetDriverInfo(char* pLibraryName, WORD MaxNameSize, char* pLibraryVersion, WORD MaxVersionSize, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetVersion(HANDLE KeyHandle, WORD NodeId, WORD* pHardwareVersion, WORD* pSoftwareVersion, WORD* pApplicationNumber, WORD* pApplicationVersion, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetErrorInfo(DWORD ErrorCodeValue, char* pErrorInfo, WORD MaxStrSize); + +//Advanced Functions + HelpFunctions_DllExport BOOL __stdcall VCS_GetDeviceNameSelection(BOOL StartOfSelection, char* pDeviceNameSel, WORD MaxStrSize, BOOL* pEndOfSelection, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetProtocolStackNameSelection(char* DeviceName, BOOL StartOfSelection, char* pProtocolStackNameSel, WORD MaxStrSize, BOOL* pEndOfSelection, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetInterfaceNameSelection(char* DeviceName, char* ProtocolStackName, BOOL StartOfSelection, char* pInterfaceNameSel, WORD MaxStrSize, BOOL* pEndOfSelection, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetPortNameSelection(char* DeviceName, char* ProtocolStackName, char* InterfaceName, BOOL StartOfSelection, char* pPortSel, WORD MaxStrSize, BOOL* pEndOfSelection, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_ResetPortNameSelection(char* DeviceName, char* ProtocolStackName, char* InterfaceName, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetBaudrateSelection(char* DeviceName, char* ProtocolStackName, char* InterfaceName, char* PortName, BOOL StartOfSelection, DWORD* pBaudrateSel, BOOL* pEndOfSelection, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetKeyHandle(char* DeviceName, char* ProtocolStackName, char* InterfaceName, char* PortName, HANDLE* pKeyHandle, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetDeviceName(HANDLE KeyHandle, char* pDeviceName, WORD MaxStrSize, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetProtocolStackName(HANDLE KeyHandle, char* pProtocolStackName, WORD MaxStrSize, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetInterfaceName(HANDLE KeyHandle, char* pInterfaceName, WORD MaxStrSize, DWORD* pErrorCode); + HelpFunctions_DllExport BOOL __stdcall VCS_GetPortName(HANDLE KeyHandle, char* pPortName, WORD MaxStrSize, DWORD* pErrorCode); + +//******************************************************************************************************************* +// CONFIGURATION FUNCTIONS +//******************************************************************************************************************* + +//General + Configuration_DllExport BOOL __stdcall VCS_ImportParameter(HANDLE KeyHandle, WORD NodeId, char* pParameterFileName, BOOL ShowDlg, BOOL ShowMsg, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_ExportParameter(HANDLE KeyHandle, WORD NodeId, char* pParameterFileName, char* pFirmwareFileName, char* pUserID, char* pComment, BOOL ShowDlg, BOOL ShowMsg, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetObject(HANDLE KeyHandle, WORD NodeId, WORD ObjectIndex, BYTE ObjectSubIndex, void* pData, DWORD NbOfBytesToWrite, DWORD* pNbOfBytesWritten, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetObject(HANDLE KeyHandle, WORD NodeId, WORD ObjectIndex, BYTE ObjectSubIndex, void* pData, DWORD NbOfBytesToRead, DWORD* pNbOfBytesRead, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_Restore(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_Store(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + +//Advanced Functions + //Motor + Configuration_DllExport BOOL __stdcall VCS_SetMotorType(HANDLE KeyHandle, WORD NodeId, WORD MotorType, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetDcMotorParameter(HANDLE KeyHandle, WORD NodeId, WORD NominalCurrent, WORD MaxOutputCurrent, WORD ThermalTimeConstant, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetEcMotorParameter(HANDLE KeyHandle, WORD NodeId, WORD NominalCurrent, WORD MaxOutputCurrent, WORD ThermalTimeConstant, BYTE NbOfPolePairs, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetMotorType(HANDLE KeyHandle, WORD NodeId, WORD* pMotorType, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetDcMotorParameter(HANDLE KeyHandle, WORD NodeId, WORD* pNominalCurrent, WORD* pMaxOutputCurrent, WORD* pThermalTimeConstant, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetEcMotorParameter(HANDLE KeyHandle, WORD NodeId, WORD* pNominalCurrent, WORD* pMaxOutputCurrent, WORD* pThermalTimeConstant, BYTE* pNbOfPolePairs, DWORD* pErrorCode); + + //Sensor + Configuration_DllExport BOOL __stdcall VCS_SetSensorType(HANDLE KeyHandle, WORD NodeId, WORD SensorType, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetIncEncoderParameter(HANDLE KeyHandle, WORD NodeId, DWORD EncoderResolution, BOOL InvertedPolarity, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetHallSensorParameter(HANDLE KeyHandle, WORD NodeId, BOOL InvertedPolarity, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetSsiAbsEncoderParameter(HANDLE KeyHandle, WORD NodeId, WORD DataRate, WORD NbOfMultiTurnDataBits, WORD NbOfSingleTurnDataBits, BOOL InvertedPolarity, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetSsiAbsEncoderParameterEx(HANDLE KeyHandle, WORD NodeId, WORD DataRate, WORD NbOfMultiTurnDataBits, WORD NbOfSingleTurnDataBits, WORD NbOfSpecialDataBits, BOOL InvertedPolarity, WORD Timeout, WORD PowerupTime, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetSensorType(HANDLE KeyHandle, WORD NodeId, WORD* pSensorType, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetIncEncoderParameter(HANDLE KeyHandle, WORD NodeId, DWORD* pEncoderResolution, BOOL* pInvertedPolarity, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetHallSensorParameter(HANDLE KeyHandle, WORD NodeId, BOOL* pInvertedPolarity, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetSsiAbsEncoderParameter(HANDLE KeyHandle, WORD NodeId, WORD* pDataRate, WORD* pNbOfMultiTurnDataBits, WORD* pNbOfSingleTurnDataBits, BOOL* pInvertedPolarity, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetSsiAbsEncoderParameterEx(HANDLE KeyHandle, WORD NodeId, WORD* pDataRate, WORD* pNbOfMultiTurnDataBits, WORD* pNbOfSingleTurnDataBits, WORD* pNbOfSpecialDataBits, BOOL* pInvertedPolarity, WORD* pTimeout, WORD* pPowerupTime, DWORD* pErrorCode); + + //Safety + Configuration_DllExport BOOL __stdcall VCS_SetMaxFollowingError(HANDLE KeyHandle, WORD NodeId, DWORD MaxFollowingError, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetMaxFollowingError(HANDLE KeyHandle, WORD NodeId, DWORD* pMaxFollowingError, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetMaxProfileVelocity(HANDLE KeyHandle, WORD NodeId, DWORD MaxProfileVelocity, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetMaxProfileVelocity(HANDLE KeyHandle, WORD NodeId, DWORD* pMaxProfileVelocity, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetMaxAcceleration(HANDLE KeyHandle, WORD NodeId, DWORD MaxAcceleration, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetMaxAcceleration(HANDLE KeyHandle, WORD NodeId, DWORD* pMaxAcceleration, DWORD* pErrorCode); + + //Position Regulator + Configuration_DllExport BOOL __stdcall VCS_SetPositionRegulatorGain(HANDLE KeyHandle, WORD NodeId, WORD P, WORD I, WORD D, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetPositionRegulatorFeedForward(HANDLE KeyHandle, WORD NodeId, WORD VelocityFeedForward, WORD AccelerationFeedForward, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetPositionRegulatorGain(HANDLE KeyHandle, WORD NodeId, WORD* pP, WORD* pI, WORD* pD, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetPositionRegulatorFeedForward(HANDLE KeyHandle, WORD NodeId, WORD* pVelocityFeedForward, WORD* pAccelerationFeedForward, DWORD* pErrorCode); + + //Velocity Regulator + Configuration_DllExport BOOL __stdcall VCS_SetVelocityRegulatorGain(HANDLE KeyHandle, WORD NodeId, WORD P, WORD I, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetVelocityRegulatorFeedForward(HANDLE KeyHandle, WORD NodeId, WORD VelocityFeedForward, WORD AccelerationFeedForward, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetVelocityRegulatorGain(HANDLE KeyHandle, WORD NodeId, WORD* pP, WORD* pI, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetVelocityRegulatorFeedForward(HANDLE KeyHandle, WORD NodeId, WORD* pVelocityFeedForward, WORD* pAccelerationFeedForward, DWORD* pErrorCode); + + //Current Regulator + Configuration_DllExport BOOL __stdcall VCS_SetCurrentRegulatorGain(HANDLE KeyHandle, WORD NodeId, WORD P, WORD I, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetCurrentRegulatorGain(HANDLE KeyHandle, WORD NodeId, WORD* pP, WORD* pI, DWORD* pErrorCode); + + //Inputs/Outputs + Configuration_DllExport BOOL __stdcall VCS_DigitalInputConfiguration(HANDLE KeyHandle, WORD NodeId, WORD DigitalInputNb, WORD Configuration, BOOL Mask, BOOL Polarity, BOOL ExecutionMask, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_DigitalOutputConfiguration(HANDLE KeyHandle, WORD NodeId, WORD DigitalOutputNb, WORD Configuration, BOOL State, BOOL Mask, BOOL Polarity, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_AnalogInputConfiguration(HANDLE KeyHandle, WORD NodeId, WORD AnalogInputNb, WORD Configuration, BOOL ExecutionMask, DWORD* pErrorCode); + + //Units + Configuration_DllExport BOOL __stdcall VCS_SetVelocityUnits(HANDLE KeyHandle, WORD NodeId, BYTE VelDimension, char VelNotation, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetVelocityUnits(HANDLE KeyHandle, WORD NodeId, BYTE* pVelDimension, char* pVelNotation, DWORD* pErrorCode); + + //Compatibility Functions (do not use) + Configuration_DllExport BOOL __stdcall VCS_SetMotorParameter(HANDLE KeyHandle, WORD NodeId, WORD MotorType, WORD ContinuousCurrent, WORD PeakCurrent, BYTE PolePair, WORD ThermalTimeConstant, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_SetEncoderParameter(HANDLE KeyHandle, WORD NodeId, WORD Counts, WORD PositionSensorType, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetMotorParameter(HANDLE KeyHandle, WORD NodeId, WORD* pMotorType, WORD* pContinuousCurrent, WORD* pPeakCurrent, BYTE* pPolePair, WORD* pThermalTimeConstant, DWORD* pErrorCode); + Configuration_DllExport BOOL __stdcall VCS_GetEncoderParameter(HANDLE KeyHandle, WORD NodeId, WORD* pCounts, WORD* pPositionSensorType, DWORD* pErrorCode); + +//******************************************************************************************************************* +// OPERATION FUNCTIONS +//******************************************************************************************************************* + +//OperationMode + Status_DllExport BOOL __stdcall VCS_SetOperationMode(HANDLE KeyHandle, WORD NodeId, __int8 OperationMode, DWORD* pErrorCode); + Status_DllExport BOOL __stdcall VCS_GetOperationMode(HANDLE KeyHandle, WORD NodeId, __int8* pOperationMode, DWORD* pErrorCode); + +//StateMachine + StateMachine_DllExport BOOL __stdcall VCS_ResetDevice(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + StateMachine_DllExport BOOL __stdcall VCS_SetState(HANDLE KeyHandle, WORD NodeId, WORD State, DWORD* pErrorCode); + StateMachine_DllExport BOOL __stdcall VCS_SetEnableState(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + StateMachine_DllExport BOOL __stdcall VCS_SetDisableState(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + StateMachine_DllExport BOOL __stdcall VCS_SetQuickStopState(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + StateMachine_DllExport BOOL __stdcall VCS_ClearFault(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + StateMachine_DllExport BOOL __stdcall VCS_GetState(HANDLE KeyHandle, WORD NodeId, WORD* pState, DWORD* pErrorCode); + StateMachine_DllExport BOOL __stdcall VCS_GetEnableState(HANDLE KeyHandle, WORD NodeId, BOOL* pIsEnabled, DWORD* pErrorCode); + StateMachine_DllExport BOOL __stdcall VCS_GetDisableState(HANDLE KeyHandle, WORD NodeId, BOOL* pIsDisabled, DWORD* pErrorCode); + StateMachine_DllExport BOOL __stdcall VCS_GetQuickStopState(HANDLE KeyHandle, WORD NodeId, BOOL* pIsQuickStopped, DWORD* pErrorCode); + StateMachine_DllExport BOOL __stdcall VCS_GetFaultState(HANDLE KeyHandle, WORD NodeId, BOOL* pIsInFault, DWORD* pErrorCode); + +//ErrorHandling + ErrorHandling_DllExport BOOL __stdcall VCS_GetNbOfDeviceError(HANDLE KeyHandle, WORD NodeId, BYTE* pNbDeviceError, DWORD* pErrorCode); + ErrorHandling_DllExport BOOL __stdcall VCS_GetDeviceErrorCode(HANDLE KeyHandle, WORD NodeId, BYTE ErrorNumber, DWORD* pDeviceErrorCode, DWORD* pErrorCode); + +//Motion Info + MotionInfo_DllExport BOOL __stdcall VCS_GetMovementState(HANDLE KeyHandle, WORD NodeId, BOOL* pTargetReached, DWORD* pErrorCode); + MotionInfo_DllExport BOOL __stdcall VCS_GetPositionIs(HANDLE KeyHandle, WORD NodeId, long* pPositionIs, DWORD* pErrorCode); + MotionInfo_DllExport BOOL __stdcall VCS_GetVelocityIs(HANDLE KeyHandle, WORD NodeId, long* pVelocityIs, DWORD* pErrorCode); + MotionInfo_DllExport BOOL __stdcall VCS_GetVelocityIsAveraged(HANDLE KeyHandle, WORD NodeId, long* pVelocityIsAveraged, DWORD* pErrorCode); + MotionInfo_DllExport BOOL __stdcall VCS_GetCurrentIs(HANDLE KeyHandle, WORD NodeId, short* pCurrentIs, DWORD* pErrorCode); + MotionInfo_DllExport BOOL __stdcall VCS_GetCurrentIsAveraged(HANDLE KeyHandle, WORD NodeId, short* pCurrentIsAveraged, DWORD* pErrorCode); + MotionInfo_DllExport BOOL __stdcall VCS_WaitForTargetReached(HANDLE KeyHandle, WORD NodeId, DWORD Timeout, DWORD* pErrorCode); + +//Profile Position Mode + ProfilePositionMode_DllExport BOOL __stdcall VCS_ActivateProfilePositionMode(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + ProfilePositionMode_DllExport BOOL __stdcall VCS_SetPositionProfile(HANDLE KeyHandle, WORD NodeId, DWORD ProfileVelocity, DWORD ProfileAcceleration, DWORD ProfileDeceleration, DWORD* pErrorCode); + ProfilePositionMode_DllExport BOOL __stdcall VCS_GetPositionProfile(HANDLE KeyHandle, WORD NodeId, DWORD* pProfileVelocity, DWORD* pProfileAcceleration, DWORD* pProfileDeceleration, DWORD* pErrorCode); + ProfilePositionMode_DllExport BOOL __stdcall VCS_MoveToPosition(HANDLE KeyHandle, WORD NodeId, long TargetPosition, BOOL Absolute, BOOL Immediately, DWORD* pErrorCode); + ProfilePositionMode_DllExport BOOL __stdcall VCS_GetTargetPosition(HANDLE KeyHandle, WORD NodeId, long* pTargetPosition, DWORD* pErrorCode); + ProfilePositionMode_DllExport BOOL __stdcall VCS_HaltPositionMovement(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + + //Advanced Functions + ProfilePositionMode_DllExport BOOL __stdcall VCS_EnablePositionWindow(HANDLE KeyHandle, WORD NodeId, DWORD PositionWindow, WORD PositionWindowTime, DWORD* pErrorCode); + ProfilePositionMode_DllExport BOOL __stdcall VCS_DisablePositionWindow(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + +//Profile Velocity Mode + ProfileVelocityMode_DllExport BOOL __stdcall VCS_ActivateProfileVelocityMode(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + ProfileVelocityMode_DllExport BOOL __stdcall VCS_SetVelocityProfile(HANDLE KeyHandle, WORD NodeId, DWORD ProfileAcceleration, DWORD ProfileDeceleration, DWORD* pErrorCode); + ProfileVelocityMode_DllExport BOOL __stdcall VCS_GetVelocityProfile(HANDLE KeyHandle, WORD NodeId, DWORD* pProfileAcceleration, DWORD* pProfileDeceleration, DWORD* pErrorCode); + ProfileVelocityMode_DllExport BOOL __stdcall VCS_MoveWithVelocity(HANDLE KeyHandle, WORD NodeId, long TargetVelocity, DWORD* pErrorCode); + ProfileVelocityMode_DllExport BOOL __stdcall VCS_GetTargetVelocity(HANDLE KeyHandle, WORD NodeId, long* pTargetVelocity, DWORD* pErrorCode); + ProfileVelocityMode_DllExport BOOL __stdcall VCS_HaltVelocityMovement(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + + //Advanced Functions + ProfileVelocityMode_DllExport BOOL __stdcall VCS_EnableVelocityWindow(HANDLE KeyHandle, WORD NodeId, DWORD VelocityWindow, WORD VelocityWindowTime, DWORD* pErrorCode); + ProfileVelocityMode_DllExport BOOL __stdcall VCS_DisableVelocityWindow(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + +//Homing Mode + HomingMode_DllExport BOOL __stdcall VCS_ActivateHomingMode(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + HomingMode_DllExport BOOL __stdcall VCS_SetHomingParameter(HANDLE KeyHandle, WORD NodeId, DWORD HomingAcceleration, DWORD SpeedSwitch, DWORD SpeedIndex, long HomeOffset, WORD CurrentThreshold, long HomePosition, DWORD* pErrorCode); + HomingMode_DllExport BOOL __stdcall VCS_GetHomingParameter(HANDLE KeyHandle, WORD NodeId, DWORD* pHomingAcceleration, DWORD* pSpeedSwitch, DWORD* pSpeedIndex, long* pHomeOffset, WORD* pCurrentThreshold, long* pHomePosition, DWORD* pErrorCode); + HomingMode_DllExport BOOL __stdcall VCS_FindHome(HANDLE KeyHandle, WORD NodeId, __int8 HomingMethod, DWORD* pErrorCode); + HomingMode_DllExport BOOL __stdcall VCS_StopHoming(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + HomingMode_DllExport BOOL __stdcall VCS_DefinePosition(HANDLE KeyHandle, WORD NodeId, long HomePosition, DWORD* pErrorCode); + HomingMode_DllExport BOOL __stdcall VCS_WaitForHomingAttained(HANDLE KeyHandle, WORD NodeId, DWORD Timeout, DWORD* pErrorCode); + HomingMode_DllExport BOOL __stdcall VCS_GetHomingState(HANDLE KeyHandle, WORD NodeId, BOOL* pHomingAttained, BOOL* pHomingError, DWORD* pErrorCode); + +//Interpolated Position Mode + InterpolatedPositionMode_DllExport BOOL __stdcall VCS_ActivateInterpolatedPositionMode(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + InterpolatedPositionMode_DllExport BOOL __stdcall VCS_SetIpmBufferParameter(HANDLE KeyHandle, WORD NodeId, WORD UnderflowWarningLimit, WORD OverflowWarningLimit, DWORD* pErrorCode); + InterpolatedPositionMode_DllExport BOOL __stdcall VCS_GetIpmBufferParameter(HANDLE KeyHandle, WORD NodeId, WORD* pUnderflowWarningLimit, WORD* pOverflowWarningLimit, DWORD* pMaxBufferSize, DWORD* pErrorCode); + InterpolatedPositionMode_DllExport BOOL __stdcall VCS_ClearIpmBuffer(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + InterpolatedPositionMode_DllExport BOOL __stdcall VCS_GetFreeIpmBufferSize(HANDLE KeyHandle, WORD NodeId, DWORD* pBufferSize, DWORD* pErrorCode); + InterpolatedPositionMode_DllExport BOOL __stdcall VCS_AddPvtValueToIpmBuffer(HANDLE KeyHandle, WORD NodeId, long Position, long Velocity, BYTE Time, DWORD* pErrorCode); + InterpolatedPositionMode_DllExport BOOL __stdcall VCS_StartIpmTrajectory(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + InterpolatedPositionMode_DllExport BOOL __stdcall VCS_StopIpmTrajectory(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + InterpolatedPositionMode_DllExport BOOL __stdcall VCS_GetIpmStatus(HANDLE KeyHandle, WORD NodeId, BOOL* pTrajectoryRunning, BOOL* pIsUnderflowWarning, BOOL* pIsOverflowWarning, BOOL* pIsVelocityWarning, BOOL* pIsAccelerationWarning, BOOL* pIsUnderflowError, BOOL* pIsOverflowError, BOOL* pIsVelocityError, BOOL* pIsAccelerationError, DWORD* pErrorCode); + +//Position Mode + PositionMode_DllExport BOOL __stdcall VCS_ActivatePositionMode(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + PositionMode_DllExport BOOL __stdcall VCS_SetPositionMust(HANDLE KeyHandle, WORD NodeId, long PositionMust, DWORD* pErrorCode); + PositionMode_DllExport BOOL __stdcall VCS_GetPositionMust(HANDLE KeyHandle, WORD NodeId, long* pPositionMust, DWORD* pErrorCode); + + //Advanced Functions + PositionMode_DllExport BOOL __stdcall VCS_ActivateAnalogPositionSetpoint(HANDLE KeyHandle, WORD NodeId, WORD AnalogInputNumber, float Scaling, long Offset, DWORD* pErrorCode); + PositionMode_DllExport BOOL __stdcall VCS_DeactivateAnalogPositionSetpoint(HANDLE KeyHandle, WORD NodeId, WORD AnalogInputNumber, DWORD* pErrorCode); + PositionMode_DllExport BOOL __stdcall VCS_EnableAnalogPositionSetpoint(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + PositionMode_DllExport BOOL __stdcall VCS_DisableAnalogPositionSetpoint(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + +//Velocity Mode + VelocityMode_DllExport BOOL __stdcall VCS_ActivateVelocityMode(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + VelocityMode_DllExport BOOL __stdcall VCS_SetVelocityMust(HANDLE KeyHandle, WORD NodeId, long VelocityMust, DWORD* pErrorCode); + VelocityMode_DllExport BOOL __stdcall VCS_GetVelocityMust(HANDLE KeyHandle, WORD NodeId, long* pVelocityMust, DWORD* pErrorCode); + + //Advanced Functions + VelocityMode_DllExport BOOL __stdcall VCS_ActivateAnalogVelocitySetpoint(HANDLE KeyHandle, WORD NodeId, WORD AnalogInputNumber, float Scaling, long Offset, DWORD* pErrorCode); + VelocityMode_DllExport BOOL __stdcall VCS_DeactivateAnalogVelocitySetpoint(HANDLE KeyHandle, WORD NodeId, WORD AnalogInputNumber, DWORD* pErrorCode); + VelocityMode_DllExport BOOL __stdcall VCS_EnableAnalogVelocitySetpoint(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + VelocityMode_DllExport BOOL __stdcall VCS_DisableAnalogVelocitySetpoint(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + +//Current Mode + CurrentMode_DllExport BOOL __stdcall VCS_ActivateCurrentMode(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + CurrentMode_DllExport BOOL __stdcall VCS_SetCurrentMust(HANDLE KeyHandle, WORD NodeId, short CurrentMust, DWORD* pErrorCode); + CurrentMode_DllExport BOOL __stdcall VCS_GetCurrentMust(HANDLE KeyHandle, WORD NodeId, short* pCurrentMust, DWORD* pErrorCode); + + //Advanced Functions + CurrentMode_DllExport BOOL __stdcall VCS_ActivateAnalogCurrentSetpoint(HANDLE KeyHandle, WORD NodeId, WORD AnalogInputNumber, float Scaling, short Offset, DWORD* pErrorCode); + CurrentMode_DllExport BOOL __stdcall VCS_DeactivateAnalogCurrentSetpoint(HANDLE KeyHandle, WORD NodeId, WORD AnalogInputNumber, DWORD* pErrorCode); + CurrentMode_DllExport BOOL __stdcall VCS_EnableAnalogCurrentSetpoint(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + CurrentMode_DllExport BOOL __stdcall VCS_DisableAnalogCurrentSetpoint(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + +//MasterEncoder Mode + MasterEncoderMode_DllExport BOOL __stdcall VCS_ActivateMasterEncoderMode(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + MasterEncoderMode_DllExport BOOL __stdcall VCS_SetMasterEncoderParameter(HANDLE KeyHandle, WORD NodeId, WORD ScalingNumerator, WORD ScalingDenominator, BYTE Polarity, DWORD MaxVelocity, DWORD MaxAcceleration, DWORD* pErrorCode); + MasterEncoderMode_DllExport BOOL __stdcall VCS_GetMasterEncoderParameter(HANDLE KeyHandle, WORD NodeId, WORD* pScalingNumerator, WORD* pScalingDenominator, BYTE* pPolarity, DWORD* pMaxVelocity, DWORD* pMaxAcceleration, DWORD* pErrorCode); + +//StepDirection Mode + StepDirectionMode_DllExport BOOL __stdcall VCS_ActivateStepDirectionMode(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + StepDirectionMode_DllExport BOOL __stdcall VCS_SetStepDirectionParameter(HANDLE KeyHandle, WORD NodeId, WORD ScalingNumerator, WORD ScalingDenominator, BYTE Polarity, DWORD MaxVelocity, DWORD MaxAcceleration, DWORD* pErrorCode); + StepDirectionMode_DllExport BOOL __stdcall VCS_GetStepDirectionParameter(HANDLE KeyHandle, WORD NodeId, WORD* pScalingNumerator, WORD* pScalingDenominator, BYTE* pPolarity, DWORD* pMaxVelocity, DWORD* pMaxAcceleration, DWORD* pErrorCode); + +//Inputs Outputs + //General + InputsOutputs_DllExport BOOL __stdcall VCS_GetAllDigitalInputs(HANDLE KeyHandle, WORD NodeId, WORD* pInputs, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_GetAllDigitalOutputs(HANDLE KeyHandle, WORD NodeId, WORD* pOutputs, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_SetAllDigitalOutputs(HANDLE KeyHandle, WORD NodeId, WORD Outputs, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_GetAnalogInput(HANDLE KeyHandle, WORD NodeId, WORD InputNumber, WORD* pAnalogValue, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_SetAnalogOutput(HANDLE KeyHandle, WORD NodeId, WORD OutputNumber, WORD AnalogValue, DWORD* pErrorCode); + + //Position Compare + InputsOutputs_DllExport BOOL __stdcall VCS_SetPositionCompareParameter(HANDLE KeyHandle, WORD NodeId, BYTE OperationalMode, BYTE IntervalMode, BYTE DirectionDependency, WORD IntervalWidth, WORD IntervalRepetitions, WORD PulseWidth, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_GetPositionCompareParameter(HANDLE KeyHandle, WORD NodeId, BYTE* pOperationalMode, BYTE* pIntervalMode, BYTE* pDirectionDependency, WORD* pIntervalWidth, WORD* pIntervalRepetitions, WORD* pPulseWidth, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_ActivatePositionCompare(HANDLE KeyHandle, WORD NodeId, WORD DigitalOutputNumber, BOOL Polarity, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_DeactivatePositionCompare(HANDLE KeyHandle, WORD NodeId, WORD DigitalOutputNumber, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_EnablePositionCompare(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_DisablePositionCompare(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_SetPositionCompareReferencePosition(HANDLE KeyHandle, WORD NodeId, long ReferencePosition, DWORD* pErrorCode); + + //Position Marker + InputsOutputs_DllExport BOOL __stdcall VCS_SetPositionMarkerParameter(HANDLE KeyHandle, WORD NodeId, BYTE PositionMarkerEdgeType, BYTE PositionMarkerMode, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_GetPositionMarkerParameter(HANDLE KeyHandle, WORD NodeId, BYTE* pPositionMarkerEdgeType, BYTE* pPositionMarkerMode, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_ActivatePositionMarker(HANDLE KeyHandle, WORD NodeId, WORD DigitalInputNumber, BOOL Polarity, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_DeactivatePositionMarker(HANDLE KeyHandle, WORD NodeId, WORD DigitalInputNumber, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_ReadPositionMarkerCounter(HANDLE KeyHandle, WORD NodeId, WORD* pCount, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_ReadPositionMarkerCapturedPosition(HANDLE KeyHandle, WORD NodeId, WORD CounterIndex, long* pCapturedPosition, DWORD* pErrorCode); + InputsOutputs_DllExport BOOL __stdcall VCS_ResetPositionMarkerCounter(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + +//******************************************************************************************************************* +// DATA RECORDING FUNCTIONS +//******************************************************************************************************************* + +//DataRecorder Setup + DataRecording_DllExport BOOL __stdcall VCS_SetRecorderParameter(HANDLE KeyHandle, WORD NodeId, WORD SamplingPeriod, WORD NbOfPrecedingSamples, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_GetRecorderParameter(HANDLE KeyHandle, WORD NodeId, WORD* pSamplingPeriod, WORD* pNbOfPrecedingSamples, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_EnableTrigger(HANDLE KeyHandle, WORD NodeId, BYTE TriggerType, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_DisableAllTriggers(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_ActivateChannel(HANDLE KeyHandle, WORD NodeId, BYTE ChannelNumber, WORD ObjectIndex, BYTE ObjectSubIndex, BYTE ObjectSize, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_DeactivateAllChannels(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + +//DataRecorder Status + DataRecording_DllExport BOOL __stdcall VCS_StartRecorder(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_StopRecorder(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_ForceTrigger(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_IsRecorderRunning(HANDLE KeyHandle, WORD NodeId, BOOL* pRunning, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_IsRecorderTriggered(HANDLE KeyHandle, WORD NodeId, BOOL* pTriggered, DWORD* pErrorCode); + +//DataRecorder Data + DataRecording_DllExport BOOL __stdcall VCS_ReadChannelVectorSize(HANDLE KeyHandle, WORD NodeId, DWORD* pVectorSize, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_ReadChannelDataVector(HANDLE KeyHandle, WORD NodeId, BYTE ChannelNumber, BYTE* pDataVector, DWORD VectorSize, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_ShowChannelDataDlg(HANDLE KeyHandle, WORD NodeId, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_ExportChannelDataToFile(HANDLE KeyHandle, WORD NodeId, char* FileName, DWORD* pErrorCode); + +//Advanced Functions + DataRecording_DllExport BOOL __stdcall VCS_ReadDataBuffer(HANDLE KeyHandle, WORD NodeId, BYTE* pDataBuffer, DWORD BufferSizeToRead, DWORD* pBufferSizeRead, WORD* pVectorStartOffset, WORD* pMaxNbOfSamples, WORD* pNbOfRecordedSamples, DWORD* pErrorCode); + DataRecording_DllExport BOOL __stdcall VCS_ExtractChannelDataVector(HANDLE KeyHandle, WORD NodeId, BYTE ChannelNumber, BYTE* pDataBuffer, DWORD BufferSize, BYTE* pDataVector, DWORD VectorSize, WORD VectorStartOffset, WORD MaxNbOfSamples, WORD NbOfRecordedSamples, DWORD* pErrorCode); + +//******************************************************************************************************************* +// LOW LAYER FUNCTIONS +//******************************************************************************************************************* + +//CanLayer Functions + CanLayer_DllExport BOOL __stdcall VCS_SendCANFrame(HANDLE KeyHandle, WORD CobID, WORD Length, void* pData, DWORD* pErrorCode); + CanLayer_DllExport BOOL __stdcall VCS_ReadCANFrame(HANDLE KeyHandle, WORD CobID, WORD Length, void* pData, DWORD Timeout, DWORD* pErrorCode); + CanLayer_DllExport BOOL __stdcall VCS_RequestCANFrame(HANDLE KeyHandle, WORD CobID, WORD Length, void* pData, DWORD* pErrorCode); + CanLayer_DllExport BOOL __stdcall VCS_SendNMTService(HANDLE KeyHandle, WORD NodeId, WORD CommandSpecifier, DWORD* pErrorCode); + +//******************************************************************************************************************* +// TYPE DEFINITIONS +//******************************************************************************************************************* + +//Communication + //Dialog Mode + const int DM_PROGRESS_DLG = 0; + const int DM_PROGRESS_AND_CONFIRM_DLG = 1; + const int DM_CONFIRM_DLG = 2; + const int DM_NO_DLG = 3; + +//Configuration + //MotorType + const WORD MT_DC_MOTOR = 1; + const WORD MT_EC_SINUS_COMMUTATED_MOTOR = 10; + const WORD MT_EC_BLOCK_COMMUTATED_MOTOR = 11; + + //SensorType + const WORD ST_UNKNOWN = 0; + const WORD ST_INC_ENCODER_3CHANNEL = 1; + const WORD ST_INC_ENCODER_2CHANNEL = 2; + const WORD ST_HALL_SENSORS = 3; + const WORD ST_SSI_ABS_ENCODER_BINARY = 4; + const WORD ST_SSI_ABS_ENCODER_GREY = 5; + +//In- and outputs + //Digital input configuration + const WORD DIC_NEGATIVE_LIMIT_SWITCH = 0; + const WORD DIC_POSITIVE_LIMIT_SWITCH = 1; + const WORD DIC_HOME_SWITCH = 2; + const WORD DIC_POSITION_MARKER = 3; + const WORD DIC_DRIVE_ENABLE = 4; + const WORD DIC_QUICK_STOP = 5; + const WORD DIC_GENERAL_PURPOSE_J = 6; + const WORD DIC_GENERAL_PURPOSE_I = 7; + const WORD DIC_GENERAL_PURPOSE_H = 8; + const WORD DIC_GENERAL_PURPOSE_G = 9; + const WORD DIC_GENERAL_PURPOSE_F = 10; + const WORD DIC_GENERAL_PURPOSE_E = 11; + const WORD DIC_GENERAL_PURPOSE_D = 12; + const WORD DIC_GENERAL_PURPOSE_C = 13; + const WORD DIC_GENERAL_PURPOSE_B = 14; + const WORD DIC_GENERAL_PURPOSE_A = 15; + + //Digital output configuration + const WORD DOC_READY_FAULT = 0; + const WORD DOC_POSITION_COMPARE = 1; + const WORD DOC_GENERAL_PURPOSE_H = 8; + const WORD DOC_GENERAL_PURPOSE_G = 9; + const WORD DOC_GENERAL_PURPOSE_F = 10; + const WORD DOC_GENERAL_PURPOSE_E = 11; + const WORD DOC_GENERAL_PURPOSE_D = 12; + const WORD DOC_GENERAL_PURPOSE_C = 13; + const WORD DOC_GENERAL_PURPOSE_B = 14; + const WORD DOC_GENERAL_PURPOSE_A = 15; + + //Analog input configuration + const WORD AIC_ANALOG_CURRENT_SETPOINT = 0; + const WORD AIC_ANALOG_VELOCITY_SETPOINT = 1; + const WORD AIC_ANALOG_POSITION_SETPOINT = 2; + +//Units + //VelocityDimension + const BYTE VD_RPM = 0xA4; + + //VelocityNotation + const char VN_STANDARD = 0; + const char VN_DECI = -1; + const char VN_CENTI = -2; + const char VN_MILLI = -3; + +//Operational mode + const __int8 OMD_PROFILE_POSITION_MODE = 1; + const __int8 OMD_PROFILE_VELOCITY_MODE = 3; + const __int8 OMD_HOMING_MODE = 6; + const __int8 OMD_INTERPOLATED_POSITION_MODE = 7; + const __int8 OMD_POSITION_MODE = -1; + const __int8 OMD_VELOCITY_MODE = -2; + const __int8 OMD_CURRENT_MODE = -3; + const __int8 OMD_MASTER_ENCODER_MODE = -5; + const __int8 OMD_STEP_DIRECTION_MODE = -6; + +//States + const WORD ST_DISABLED = 0; + const WORD ST_ENABLED = 1; + const WORD ST_QUICKSTOP = 2; + const WORD ST_FAULT = 3; + +//Homing mode + //Homing method + const __int8 HM_ACTUAL_POSITION = 35; + const __int8 HM_NEGATIVE_LIMIT_SWITCH = 17; + const __int8 HM_NEGATIVE_LIMIT_SWITCH_AND_INDEX = 1; + const __int8 HM_POSITIVE_LIMIT_SWITCH = 18; + const __int8 HM_POSITIVE_LIMIT_SWITCH_AND_INDEX = 2; + const __int8 HM_HOME_SWITCH_POSITIVE_SPEED = 23; + const __int8 HM_HOME_SWITCH_POSITIVE_SPEED_AND_INDEX = 7; + const __int8 HM_HOME_SWITCH_NEGATIVE_SPEED = 27; + const __int8 HM_HOME_SWITCH_NEGATIVE_SPEED_AND_INDEX = 11; + const __int8 HM_CURRENT_THRESHOLD_POSITIVE_SPEED = -3; + const __int8 HM_CURRENT_THRESHOLD_POSITIVE_SPEED_AND_INDEX = -1; + const __int8 HM_CURRENT_THRESHOLD_NEGATIVE_SPEED = -4; + const __int8 HM_CURRENT_THRESHOLD_NEGATIVE_SPEED_AND_INDEX = -2; + const __int8 HM_INDEX_POSITIVE_SPEED = 34; + const __int8 HM_INDEX_NEGATIVE_SPEED = 33; + +//Input Output PositionMarker + //PositionMarkerEdgeType + const BYTE PET_BOTH_EDGES = 0; + const BYTE PET_RISING_EDGE = 1; + const BYTE PET_FALLING_EDGE = 2; + + //PositionMarkerMode + const BYTE PM_CONTINUOUS = 0; + const BYTE PM_SINGLE = 1; + const BYTE PM_MULTIPLE = 2; + +//Input Output PositionCompare + //PositionCompareOperationalMode + const BYTE PCO_SINGLE_POSITION_MODE = 0; + const BYTE PCO_POSITION_SEQUENCE_MODE = 1; + + //PositionCompareIntervalMode + const BYTE PCI_NEGATIVE_DIR_TO_REFPOS = 0; + const BYTE PCI_POSITIVE_DIR_TO_REFPOS = 1; + const BYTE PCI_BOTH_DIR_TO_REFPOS = 2; + + //PositionCompareDirectionDependency + const BYTE PCD_MOTOR_DIRECTION_NEGATIVE = 0; + const BYTE PCD_MOTOR_DIRECTION_POSITIVE = 1; + const BYTE PCD_MOTOR_DIRECTION_BOTH = 2; + +//Data recorder + //Trigger type + const WORD DR_MOVEMENT_START_TRIGGER = 1; //bit 1 + const WORD DR_ERROR_TRIGGER = 2; //bit 2 + const WORD DR_DIGITAL_INPUT_TRIGGER = 4; //bit 3 + const WORD DR_MOVEMENT_END_TRIGGER = 8; //bit 4 + +//CanLayer Functions + const WORD NCS_START_REMOTE_NODE = 1; + const WORD NCS_STOP_REMOTE_NODE = 2; + const WORD NCS_ENTER_PRE_OPERATIONAL = 128; + const WORD NCS_RESET_NODE = 129; + const WORD NCS_RESET_COMMUNICATION = 130; + +#endif //EposCommandLibraryDefinitions + diff --git a/libs/epos/win/EposCmd.lib b/libs/epos/win/EposCmd.lib new file mode 100644 index 0000000000000000000000000000000000000000..02157db2daac2f9b383acbe7749761a9f5bf0b48 GIT binary patch literal 53518 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