mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-22 22:00:39 -06:00
Reformat all the things. Have fun with merge conflicts.
This commit is contained in:
@ -2,16 +2,15 @@
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include "InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.h"
|
||||
#include <algorithm>
|
||||
#include <string>
|
||||
#include "Common/Thread.h"
|
||||
#include "InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.h"
|
||||
|
||||
namespace ciface
|
||||
{
|
||||
namespace ForceFeedback
|
||||
{
|
||||
|
||||
// template instantiation
|
||||
template class ForceFeedbackDevice::Force<DICONSTANTFORCE>;
|
||||
template class ForceFeedbackDevice::Force<DIRAMPFORCE>;
|
||||
@ -19,192 +18,190 @@ template class ForceFeedbackDevice::Force<DIPERIODIC>;
|
||||
|
||||
struct ForceType
|
||||
{
|
||||
GUID guid;
|
||||
const std::string name;
|
||||
GUID guid;
|
||||
const std::string name;
|
||||
};
|
||||
|
||||
static const ForceType force_type_names[] =
|
||||
{
|
||||
{GUID_ConstantForce, "Constant"}, // DICONSTANTFORCE
|
||||
{GUID_RampForce, "Ramp"}, // DIRAMPFORCE
|
||||
{GUID_Square, "Square"}, // DIPERIODIC ...
|
||||
{GUID_Sine, "Sine"},
|
||||
{GUID_Triangle, "Triangle"},
|
||||
{GUID_SawtoothUp, "Sawtooth Up"},
|
||||
{GUID_SawtoothDown, "Sawtooth Down"},
|
||||
//{GUID_Spring, "Spring"}, // DICUSTOMFORCE ... < I think
|
||||
//{GUID_Damper, "Damper"},
|
||||
//{GUID_Inertia, "Inertia"},
|
||||
//{GUID_Friction, "Friction"},
|
||||
static const ForceType force_type_names[] = {
|
||||
{GUID_ConstantForce, "Constant"}, // DICONSTANTFORCE
|
||||
{GUID_RampForce, "Ramp"}, // DIRAMPFORCE
|
||||
{GUID_Square, "Square"}, // DIPERIODIC ...
|
||||
{GUID_Sine, "Sine"},
|
||||
{GUID_Triangle, "Triangle"},
|
||||
{GUID_SawtoothUp, "Sawtooth Up"},
|
||||
{GUID_SawtoothDown, "Sawtooth Down"},
|
||||
//{GUID_Spring, "Spring"}, // DICUSTOMFORCE ... < I think
|
||||
//{GUID_Damper, "Damper"},
|
||||
//{GUID_Inertia, "Inertia"},
|
||||
//{GUID_Friction, "Friction"},
|
||||
};
|
||||
|
||||
bool ForceFeedbackDevice::InitForceFeedback(const LPDIRECTINPUTDEVICE8 device, int cAxes)
|
||||
{
|
||||
if (cAxes == 0)
|
||||
return false;
|
||||
if (cAxes == 0)
|
||||
return false;
|
||||
|
||||
// TODO: check for DIDC_FORCEFEEDBACK in devcaps?
|
||||
// TODO: check for DIDC_FORCEFEEDBACK in devcaps?
|
||||
|
||||
// temporary
|
||||
DWORD rgdwAxes[2] = {DIJOFS_X, DIJOFS_Y};
|
||||
LONG rglDirection[2] = {-200, 0};
|
||||
// temporary
|
||||
DWORD rgdwAxes[2] = {DIJOFS_X, DIJOFS_Y};
|
||||
LONG rglDirection[2] = {-200, 0};
|
||||
|
||||
DIEFFECT eff;
|
||||
memset(&eff, 0, sizeof(eff));
|
||||
eff.dwSize = sizeof(DIEFFECT);
|
||||
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
|
||||
eff.dwDuration = INFINITE; // (4 * DI_SECONDS)
|
||||
eff.dwSamplePeriod = 0;
|
||||
eff.dwGain = DI_FFNOMINALMAX;
|
||||
eff.dwTriggerButton = DIEB_NOTRIGGER;
|
||||
eff.dwTriggerRepeatInterval = 0;
|
||||
eff.cAxes = std::min<DWORD>(1, cAxes);
|
||||
eff.rgdwAxes = rgdwAxes;
|
||||
eff.rglDirection = rglDirection;
|
||||
DIEFFECT eff;
|
||||
memset(&eff, 0, sizeof(eff));
|
||||
eff.dwSize = sizeof(DIEFFECT);
|
||||
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
|
||||
eff.dwDuration = INFINITE; // (4 * DI_SECONDS)
|
||||
eff.dwSamplePeriod = 0;
|
||||
eff.dwGain = DI_FFNOMINALMAX;
|
||||
eff.dwTriggerButton = DIEB_NOTRIGGER;
|
||||
eff.dwTriggerRepeatInterval = 0;
|
||||
eff.cAxes = std::min<DWORD>(1, cAxes);
|
||||
eff.rgdwAxes = rgdwAxes;
|
||||
eff.rglDirection = rglDirection;
|
||||
|
||||
// initialize parameters
|
||||
DICONSTANTFORCE diCF = { -10000 };
|
||||
diCF.lMagnitude = DI_FFNOMINALMAX;
|
||||
DIRAMPFORCE diRF = { 0 };
|
||||
DIPERIODIC diPE = { 0 };
|
||||
// initialize parameters
|
||||
DICONSTANTFORCE diCF = {-10000};
|
||||
diCF.lMagnitude = DI_FFNOMINALMAX;
|
||||
DIRAMPFORCE diRF = {0};
|
||||
DIPERIODIC diPE = {0};
|
||||
|
||||
// doesn't seem needed
|
||||
//DIENVELOPE env;
|
||||
//eff.lpEnvelope = &env;
|
||||
//ZeroMemory(&env, sizeof(env));
|
||||
//env.dwSize = sizeof(env);
|
||||
// doesn't seem needed
|
||||
// DIENVELOPE env;
|
||||
// eff.lpEnvelope = &env;
|
||||
// ZeroMemory(&env, sizeof(env));
|
||||
// env.dwSize = sizeof(env);
|
||||
|
||||
for (const ForceType& f : force_type_names)
|
||||
{
|
||||
if (f.guid == GUID_ConstantForce)
|
||||
{
|
||||
eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
|
||||
eff.lpvTypeSpecificParams = &diCF;
|
||||
}
|
||||
else if (f.guid == GUID_RampForce)
|
||||
{
|
||||
eff.cbTypeSpecificParams = sizeof(DIRAMPFORCE);
|
||||
eff.lpvTypeSpecificParams = &diRF;
|
||||
}
|
||||
else
|
||||
{
|
||||
// all other forces need periodic parameters
|
||||
eff.cbTypeSpecificParams = sizeof(DIPERIODIC);
|
||||
eff.lpvTypeSpecificParams = &diPE;
|
||||
}
|
||||
for (const ForceType& f : force_type_names)
|
||||
{
|
||||
if (f.guid == GUID_ConstantForce)
|
||||
{
|
||||
eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
|
||||
eff.lpvTypeSpecificParams = &diCF;
|
||||
}
|
||||
else if (f.guid == GUID_RampForce)
|
||||
{
|
||||
eff.cbTypeSpecificParams = sizeof(DIRAMPFORCE);
|
||||
eff.lpvTypeSpecificParams = &diRF;
|
||||
}
|
||||
else
|
||||
{
|
||||
// all other forces need periodic parameters
|
||||
eff.cbTypeSpecificParams = sizeof(DIPERIODIC);
|
||||
eff.lpvTypeSpecificParams = &diPE;
|
||||
}
|
||||
|
||||
LPDIRECTINPUTEFFECT pEffect;
|
||||
if (SUCCEEDED(device->CreateEffect(f.guid, &eff, &pEffect, nullptr)))
|
||||
{
|
||||
if (f.guid == GUID_ConstantForce)
|
||||
AddOutput(new ForceConstant(f.name, pEffect));
|
||||
else if (f.guid == GUID_RampForce)
|
||||
AddOutput(new ForceRamp(f.name, pEffect));
|
||||
else
|
||||
AddOutput(new ForcePeriodic(f.name, pEffect));
|
||||
}
|
||||
}
|
||||
LPDIRECTINPUTEFFECT pEffect;
|
||||
if (SUCCEEDED(device->CreateEffect(f.guid, &eff, &pEffect, nullptr)))
|
||||
{
|
||||
if (f.guid == GUID_ConstantForce)
|
||||
AddOutput(new ForceConstant(f.name, pEffect));
|
||||
else if (f.guid == GUID_RampForce)
|
||||
AddOutput(new ForceRamp(f.name, pEffect));
|
||||
else
|
||||
AddOutput(new ForcePeriodic(f.name, pEffect));
|
||||
}
|
||||
}
|
||||
|
||||
// disable autocentering
|
||||
if (Outputs().size())
|
||||
{
|
||||
DIPROPDWORD dipdw;
|
||||
dipdw.diph.dwSize = sizeof( DIPROPDWORD );
|
||||
dipdw.diph.dwHeaderSize = sizeof( DIPROPHEADER );
|
||||
dipdw.diph.dwObj = 0;
|
||||
dipdw.diph.dwHow = DIPH_DEVICE;
|
||||
dipdw.dwData = DIPROPAUTOCENTER_OFF;
|
||||
device->SetProperty( DIPROP_AUTOCENTER, &dipdw.diph );
|
||||
}
|
||||
// disable autocentering
|
||||
if (Outputs().size())
|
||||
{
|
||||
DIPROPDWORD dipdw;
|
||||
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
|
||||
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
||||
dipdw.diph.dwObj = 0;
|
||||
dipdw.diph.dwHow = DIPH_DEVICE;
|
||||
dipdw.dwData = DIPROPAUTOCENTER_OFF;
|
||||
device->SetProperty(DIPROP_AUTOCENTER, &dipdw.diph);
|
||||
}
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename P>
|
||||
template <typename P>
|
||||
ForceFeedbackDevice::Force<P>::~Force()
|
||||
{
|
||||
m_iface->Stop();
|
||||
m_iface->Unload();
|
||||
m_iface->Release();
|
||||
m_iface->Stop();
|
||||
m_iface->Unload();
|
||||
m_iface->Release();
|
||||
}
|
||||
|
||||
template<typename P>
|
||||
template <typename P>
|
||||
void ForceFeedbackDevice::Force<P>::Update()
|
||||
{
|
||||
DIEFFECT eff = {};
|
||||
eff.dwSize = sizeof(DIEFFECT);
|
||||
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
|
||||
DIEFFECT eff = {};
|
||||
eff.dwSize = sizeof(DIEFFECT);
|
||||
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
|
||||
|
||||
eff.cbTypeSpecificParams = sizeof(P);
|
||||
eff.lpvTypeSpecificParams = ¶ms;
|
||||
eff.cbTypeSpecificParams = sizeof(P);
|
||||
eff.lpvTypeSpecificParams = ¶ms;
|
||||
|
||||
// set params and start effect
|
||||
m_iface->SetParameters(&eff, DIEP_TYPESPECIFICPARAMS | DIEP_START);
|
||||
// set params and start effect
|
||||
m_iface->SetParameters(&eff, DIEP_TYPESPECIFICPARAMS | DIEP_START);
|
||||
}
|
||||
|
||||
template<typename P>
|
||||
template <typename P>
|
||||
void ForceFeedbackDevice::Force<P>::Stop()
|
||||
{
|
||||
m_iface->Stop();
|
||||
m_iface->Stop();
|
||||
}
|
||||
|
||||
template<>
|
||||
template <>
|
||||
void ForceFeedbackDevice::ForceConstant::SetState(const ControlState state)
|
||||
{
|
||||
const LONG new_val = LONG(10000 * state);
|
||||
const LONG new_val = LONG(10000 * state);
|
||||
|
||||
if (params.lMagnitude == new_val)
|
||||
return;
|
||||
if (params.lMagnitude == new_val)
|
||||
return;
|
||||
|
||||
params.lMagnitude = new_val;
|
||||
if (new_val)
|
||||
Update();
|
||||
else
|
||||
Stop();
|
||||
params.lMagnitude = new_val;
|
||||
if (new_val)
|
||||
Update();
|
||||
else
|
||||
Stop();
|
||||
}
|
||||
|
||||
template<>
|
||||
template <>
|
||||
void ForceFeedbackDevice::ForceRamp::SetState(const ControlState state)
|
||||
{
|
||||
const LONG new_val = LONG(10000 * state);
|
||||
const LONG new_val = LONG(10000 * state);
|
||||
|
||||
if (params.lStart == new_val)
|
||||
return;
|
||||
if (params.lStart == new_val)
|
||||
return;
|
||||
|
||||
params.lStart = params.lEnd = new_val;
|
||||
if (new_val)
|
||||
Update();
|
||||
else
|
||||
Stop();
|
||||
params.lStart = params.lEnd = new_val;
|
||||
if (new_val)
|
||||
Update();
|
||||
else
|
||||
Stop();
|
||||
}
|
||||
|
||||
template<>
|
||||
template <>
|
||||
void ForceFeedbackDevice::ForcePeriodic::SetState(const ControlState state)
|
||||
{
|
||||
const DWORD new_val = DWORD(10000 * state);
|
||||
const DWORD new_val = DWORD(10000 * state);
|
||||
|
||||
if (params.dwMagnitude == new_val)
|
||||
return;
|
||||
if (params.dwMagnitude == new_val)
|
||||
return;
|
||||
|
||||
params.dwMagnitude = new_val;
|
||||
if (new_val)
|
||||
Update();
|
||||
else
|
||||
Stop();
|
||||
params.dwMagnitude = new_val;
|
||||
if (new_val)
|
||||
Update();
|
||||
else
|
||||
Stop();
|
||||
}
|
||||
|
||||
template <typename P>
|
||||
ForceFeedbackDevice::Force<P>::Force(const std::string& name, LPDIRECTINPUTEFFECT iface)
|
||||
: m_name(name), m_iface(iface)
|
||||
: m_name(name), m_iface(iface)
|
||||
{
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
}
|
||||
|
||||
template <typename P>
|
||||
std::string ForceFeedbackDevice::Force<P>::GetName() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
return m_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -20,35 +20,32 @@ namespace ciface
|
||||
{
|
||||
namespace ForceFeedback
|
||||
{
|
||||
|
||||
|
||||
class ForceFeedbackDevice : public Core::Device
|
||||
{
|
||||
private:
|
||||
template <typename P>
|
||||
class Force : public Output
|
||||
{
|
||||
public:
|
||||
Force(const std::string& name, LPDIRECTINPUTEFFECT iface);
|
||||
~Force();
|
||||
template <typename P>
|
||||
class Force : public Output
|
||||
{
|
||||
public:
|
||||
Force(const std::string& name, LPDIRECTINPUTEFFECT iface);
|
||||
~Force();
|
||||
|
||||
std::string GetName() const override;
|
||||
void SetState(ControlState state) override;
|
||||
void Update();
|
||||
void Stop();
|
||||
private:
|
||||
const std::string m_name;
|
||||
LPDIRECTINPUTEFFECT m_iface;
|
||||
P params;
|
||||
};
|
||||
typedef Force<DICONSTANTFORCE> ForceConstant;
|
||||
typedef Force<DIRAMPFORCE> ForceRamp;
|
||||
typedef Force<DIPERIODIC> ForcePeriodic;
|
||||
std::string GetName() const override;
|
||||
void SetState(ControlState state) override;
|
||||
void Update();
|
||||
void Stop();
|
||||
|
||||
private:
|
||||
const std::string m_name;
|
||||
LPDIRECTINPUTEFFECT m_iface;
|
||||
P params;
|
||||
};
|
||||
typedef Force<DICONSTANTFORCE> ForceConstant;
|
||||
typedef Force<DIRAMPFORCE> ForceRamp;
|
||||
typedef Force<DIPERIODIC> ForcePeriodic;
|
||||
|
||||
public:
|
||||
bool InitForceFeedback(const LPDIRECTINPUTDEVICE8, int cAxes);
|
||||
bool InitForceFeedback(const LPDIRECTINPUTDEVICE8, int cAxes);
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -14,210 +14,187 @@
|
||||
|
||||
#include <atomic>
|
||||
|
||||
typedef LONG* LPLONG; // Missing type for ForceFeedback.h
|
||||
typedef LONG* LPLONG; // Missing type for ForceFeedback.h
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <ForceFeedback/ForceFeedback.h>
|
||||
#include "DirectInputConstants.h" // Not stricty necessary
|
||||
#include "Common/CommonTypes.h" // for LONG
|
||||
#include "Common/CommonTypes.h" // for LONG
|
||||
#include "DirectInputConstants.h" // Not stricty necessary
|
||||
|
||||
namespace ciface
|
||||
{
|
||||
namespace ForceFeedback
|
||||
{
|
||||
|
||||
|
||||
// Prototypes
|
||||
class IUnknownImpl;
|
||||
class FFEffectAdapter;
|
||||
class FFDeviceAdapter;
|
||||
|
||||
// Structs
|
||||
typedef FFCAPABILITIES DICAPABILITIES;
|
||||
typedef FFCONDITION DICONDITION;
|
||||
typedef FFCONSTANTFORCE DICONSTANTFORCE;
|
||||
typedef FFCUSTOMFORCE DICUSTOMFORCE;
|
||||
typedef FFEFFECT DIEFFECT;
|
||||
typedef FFEFFESCAPE DIEFFESCAPE;
|
||||
typedef FFENVELOPE DIENVELOPE;
|
||||
typedef FFPERIODIC DIPERIODIC;
|
||||
typedef FFRAMPFORCE DIRAMPFORCE;
|
||||
typedef FFCAPABILITIES DICAPABILITIES;
|
||||
typedef FFCONDITION DICONDITION;
|
||||
typedef FFCONSTANTFORCE DICONSTANTFORCE;
|
||||
typedef FFCUSTOMFORCE DICUSTOMFORCE;
|
||||
typedef FFEFFECT DIEFFECT;
|
||||
typedef FFEFFESCAPE DIEFFESCAPE;
|
||||
typedef FFENVELOPE DIENVELOPE;
|
||||
typedef FFPERIODIC DIPERIODIC;
|
||||
typedef FFRAMPFORCE DIRAMPFORCE;
|
||||
|
||||
// Other types
|
||||
typedef CFUUIDRef GUID;
|
||||
typedef FFDeviceAdapter* FFDeviceAdapterReference;
|
||||
typedef FFEffectAdapter* FFEffectAdapterReference;
|
||||
typedef FFDeviceAdapterReference LPDIRECTINPUTDEVICE8;
|
||||
typedef FFEffectAdapterReference LPDIRECTINPUTEFFECT;
|
||||
typedef CFUUIDRef GUID;
|
||||
typedef FFDeviceAdapter* FFDeviceAdapterReference;
|
||||
typedef FFEffectAdapter* FFEffectAdapterReference;
|
||||
typedef FFDeviceAdapterReference LPDIRECTINPUTDEVICE8;
|
||||
typedef FFEffectAdapterReference LPDIRECTINPUTEFFECT;
|
||||
|
||||
// Property structures
|
||||
#define DIPH_DEVICE 0
|
||||
|
||||
typedef struct DIPROPHEADER {
|
||||
DWORD dwSize;
|
||||
DWORD dwHeaderSize;
|
||||
DWORD dwObj;
|
||||
DWORD dwHow;
|
||||
typedef struct DIPROPHEADER
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwHeaderSize;
|
||||
DWORD dwObj;
|
||||
DWORD dwHow;
|
||||
} DIPROPHEADER, *LPDIPROPHEADER;
|
||||
|
||||
typedef struct DIPROPDWORD {
|
||||
DIPROPHEADER diph;
|
||||
DWORD dwData;
|
||||
typedef struct DIPROPDWORD
|
||||
{
|
||||
DIPROPHEADER diph;
|
||||
DWORD dwData;
|
||||
} DIPROPDWORD, *LPDIPROPDWORD;
|
||||
|
||||
class IUnknownImpl : public IUnknown
|
||||
{
|
||||
private:
|
||||
std::atomic<ULONG> m_cRef;
|
||||
std::atomic<ULONG> m_cRef;
|
||||
|
||||
public:
|
||||
IUnknownImpl() : m_cRef(1) {}
|
||||
virtual ~IUnknownImpl() {}
|
||||
IUnknownImpl() : m_cRef(1) {}
|
||||
virtual ~IUnknownImpl() {}
|
||||
HRESULT QueryInterface(REFIID iid, LPVOID* ppv)
|
||||
{
|
||||
*ppv = nullptr;
|
||||
|
||||
HRESULT QueryInterface(REFIID iid, LPVOID *ppv)
|
||||
{
|
||||
*ppv = nullptr;
|
||||
if (CFEqual(&iid, IUnknownUUID))
|
||||
*ppv = this;
|
||||
if (nullptr == *ppv)
|
||||
return E_NOINTERFACE;
|
||||
|
||||
if (CFEqual(&iid, IUnknownUUID))
|
||||
*ppv = this;
|
||||
if (nullptr == *ppv)
|
||||
return E_NOINTERFACE;
|
||||
((IUnknown*)*ppv)->AddRef();
|
||||
|
||||
((IUnknown*)*ppv)->AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
ULONG AddRef() { return ++m_cRef; }
|
||||
ULONG Release()
|
||||
{
|
||||
if (--m_cRef == 0)
|
||||
delete this;
|
||||
|
||||
ULONG AddRef()
|
||||
{
|
||||
return ++m_cRef;
|
||||
}
|
||||
|
||||
ULONG Release()
|
||||
{
|
||||
if (--m_cRef == 0)
|
||||
delete this;
|
||||
|
||||
return m_cRef;
|
||||
}
|
||||
return m_cRef;
|
||||
}
|
||||
};
|
||||
|
||||
class FFEffectAdapter : public IUnknownImpl
|
||||
{
|
||||
private:
|
||||
// Only used for destruction
|
||||
FFDeviceObjectReference m_device;
|
||||
// Only used for destruction
|
||||
FFDeviceObjectReference m_device;
|
||||
|
||||
public:
|
||||
FFEffectObjectReference m_effect;
|
||||
FFEffectObjectReference m_effect;
|
||||
|
||||
FFEffectAdapter(FFDeviceObjectReference device, FFEffectObjectReference effect) : m_device(device), m_effect(effect) {}
|
||||
~FFEffectAdapter() { FFDeviceReleaseEffect(m_device, m_effect); }
|
||||
FFEffectAdapter(FFDeviceObjectReference device, FFEffectObjectReference effect)
|
||||
: m_device(device), m_effect(effect)
|
||||
{
|
||||
}
|
||||
~FFEffectAdapter() { FFDeviceReleaseEffect(m_device, m_effect); }
|
||||
HRESULT Download() { return FFEffectDownload(m_effect); }
|
||||
HRESULT Escape(FFEFFESCAPE* pFFEffectEscape) { return FFEffectEscape(m_effect, pFFEffectEscape); }
|
||||
HRESULT GetEffectStatus(FFEffectStatusFlag* pFlags)
|
||||
{
|
||||
return FFEffectGetEffectStatus(m_effect, pFlags);
|
||||
}
|
||||
|
||||
HRESULT Download()
|
||||
{
|
||||
return FFEffectDownload(m_effect);
|
||||
}
|
||||
HRESULT GetParameters(FFEFFECT* pFFEffect, FFEffectParameterFlag flags)
|
||||
{
|
||||
return FFEffectGetParameters(m_effect, pFFEffect, flags);
|
||||
}
|
||||
|
||||
HRESULT Escape(FFEFFESCAPE *pFFEffectEscape)
|
||||
{
|
||||
return FFEffectEscape(m_effect, pFFEffectEscape);
|
||||
}
|
||||
HRESULT SetParameters(FFEFFECT* pFFEffect, FFEffectParameterFlag flags)
|
||||
{
|
||||
return FFEffectSetParameters(m_effect, pFFEffect, flags);
|
||||
}
|
||||
|
||||
HRESULT GetEffectStatus(FFEffectStatusFlag *pFlags)
|
||||
{
|
||||
return FFEffectGetEffectStatus(m_effect, pFlags);
|
||||
}
|
||||
HRESULT Start(UInt32 iterations, FFEffectStartFlag flags)
|
||||
{
|
||||
return FFEffectStart(m_effect, iterations, flags);
|
||||
}
|
||||
|
||||
HRESULT GetParameters(FFEFFECT *pFFEffect, FFEffectParameterFlag flags)
|
||||
{
|
||||
return FFEffectGetParameters(m_effect, pFFEffect, flags);
|
||||
}
|
||||
|
||||
HRESULT SetParameters(FFEFFECT *pFFEffect, FFEffectParameterFlag flags)
|
||||
{
|
||||
return FFEffectSetParameters(m_effect, pFFEffect, flags);
|
||||
}
|
||||
|
||||
HRESULT Start(UInt32 iterations, FFEffectStartFlag flags)
|
||||
{
|
||||
return FFEffectStart(m_effect, iterations, flags);
|
||||
}
|
||||
|
||||
HRESULT Stop()
|
||||
{
|
||||
return FFEffectStop(m_effect);
|
||||
}
|
||||
|
||||
HRESULT Unload()
|
||||
{
|
||||
return FFEffectUnload(m_effect);
|
||||
}
|
||||
HRESULT Stop() { return FFEffectStop(m_effect); }
|
||||
HRESULT Unload() { return FFEffectUnload(m_effect); }
|
||||
};
|
||||
|
||||
class FFDeviceAdapter : public IUnknownImpl
|
||||
{
|
||||
public:
|
||||
FFDeviceObjectReference m_device;
|
||||
FFDeviceObjectReference m_device;
|
||||
|
||||
FFDeviceAdapter(FFDeviceObjectReference device) : m_device(device) {}
|
||||
~FFDeviceAdapter() { FFReleaseDevice(m_device); }
|
||||
FFDeviceAdapter(FFDeviceObjectReference device) : m_device(device) {}
|
||||
~FFDeviceAdapter() { FFReleaseDevice(m_device); }
|
||||
static HRESULT Create(io_service_t hidDevice, FFDeviceAdapterReference* pDeviceReference)
|
||||
{
|
||||
FFDeviceObjectReference ref;
|
||||
|
||||
static HRESULT Create(io_service_t hidDevice, FFDeviceAdapterReference *pDeviceReference)
|
||||
{
|
||||
FFDeviceObjectReference ref;
|
||||
HRESULT hr = FFCreateDevice(hidDevice, &ref);
|
||||
if (SUCCEEDED(hr))
|
||||
*pDeviceReference = new FFDeviceAdapter(ref);
|
||||
|
||||
HRESULT hr = FFCreateDevice(hidDevice, &ref);
|
||||
if (SUCCEEDED(hr))
|
||||
*pDeviceReference = new FFDeviceAdapter(ref);
|
||||
return hr;
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
HRESULT CreateEffect(CFUUIDRef uuidRef, FFEFFECT* pEffectDefinition,
|
||||
FFEffectAdapterReference* pEffectReference, IUnknown* punkOuter)
|
||||
{
|
||||
FFEffectObjectReference ref;
|
||||
|
||||
HRESULT CreateEffect(CFUUIDRef uuidRef, FFEFFECT *pEffectDefinition, FFEffectAdapterReference *pEffectReference, IUnknown *punkOuter)
|
||||
{
|
||||
FFEffectObjectReference ref;
|
||||
HRESULT hr = FFDeviceCreateEffect(m_device, uuidRef, pEffectDefinition, &ref);
|
||||
if (SUCCEEDED(hr))
|
||||
*pEffectReference = new FFEffectAdapter(m_device, ref);
|
||||
|
||||
HRESULT hr = FFDeviceCreateEffect(m_device, uuidRef, pEffectDefinition, &ref);
|
||||
if (SUCCEEDED(hr))
|
||||
*pEffectReference = new FFEffectAdapter(m_device, ref);
|
||||
return hr;
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
HRESULT Escape(FFEFFESCAPE* pFFEffectEscape) { return FFDeviceEscape(m_device, pFFEffectEscape); }
|
||||
HRESULT GetForceFeedbackState(FFState* pFFState)
|
||||
{
|
||||
return FFDeviceGetForceFeedbackState(m_device, pFFState);
|
||||
}
|
||||
|
||||
HRESULT Escape(FFEFFESCAPE *pFFEffectEscape)
|
||||
{
|
||||
return FFDeviceEscape(m_device, pFFEffectEscape);
|
||||
}
|
||||
HRESULT SendForceFeedbackCommand(FFCommandFlag flags)
|
||||
{
|
||||
return FFDeviceSendForceFeedbackCommand(m_device, flags);
|
||||
}
|
||||
|
||||
HRESULT GetForceFeedbackState(FFState *pFFState)
|
||||
{
|
||||
return FFDeviceGetForceFeedbackState(m_device, pFFState);
|
||||
}
|
||||
HRESULT SetCooperativeLevel(void* taskIdentifier, FFCooperativeLevelFlag flags)
|
||||
{
|
||||
return FFDeviceSetCooperativeLevel(m_device, taskIdentifier, flags);
|
||||
}
|
||||
|
||||
HRESULT SendForceFeedbackCommand(FFCommandFlag flags)
|
||||
{
|
||||
return FFDeviceSendForceFeedbackCommand(m_device, flags);
|
||||
}
|
||||
HRESULT SetProperty(FFProperty property, const LPDIPROPHEADER pdiph)
|
||||
{
|
||||
// There are only two properties supported
|
||||
if (property != DIPROP_FFGAIN && property != DIPROP_AUTOCENTER)
|
||||
return DIERR_UNSUPPORTED;
|
||||
|
||||
HRESULT SetCooperativeLevel(void *taskIdentifier, FFCooperativeLevelFlag flags)
|
||||
{
|
||||
return FFDeviceSetCooperativeLevel(m_device, taskIdentifier, flags);
|
||||
}
|
||||
// And they are both device properties
|
||||
if (pdiph->dwHow != DIPH_DEVICE)
|
||||
return DIERR_INVALIDPARAM;
|
||||
|
||||
HRESULT SetProperty(FFProperty property, const LPDIPROPHEADER pdiph)
|
||||
{
|
||||
// There are only two properties supported
|
||||
if (property != DIPROP_FFGAIN && property != DIPROP_AUTOCENTER)
|
||||
return DIERR_UNSUPPORTED;
|
||||
|
||||
// And they are both device properties
|
||||
if (pdiph->dwHow != DIPH_DEVICE)
|
||||
return DIERR_INVALIDPARAM;
|
||||
|
||||
UInt32 value = ((const LPDIPROPDWORD)pdiph)->dwData;
|
||||
return FFDeviceSetForceFeedbackProperty(m_device, property, &value);
|
||||
}
|
||||
UInt32 value = ((const LPDIPROPDWORD)pdiph)->dwData;
|
||||
return FFDeviceSetForceFeedbackProperty(m_device, property, &value);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -12,136 +12,136 @@
|
||||
*/
|
||||
|
||||
// UUIDs
|
||||
#define GUID_ConstantForce kFFEffectType_ConstantForce_ID
|
||||
#define GUID_CustomForce kFFEffectType_CustomForce_ID
|
||||
#define GUID_Damper kFFEffectType_Damper_ID
|
||||
#define GUID_Friction kFFEffectType_Friction_ID
|
||||
#define GUID_Inertia kFFEffectType_Inertia_ID
|
||||
#define GUID_RampForce kFFEffectType_RampForce_ID
|
||||
#define GUID_SawtoothDown kFFEffectType_SawtoothDown_ID
|
||||
#define GUID_SawtoothUp kFFEffectType_SawtoothUp_ID
|
||||
#define GUID_Sine kFFEffectType_Sine_ID
|
||||
#define GUID_Spring kFFEffectType_Spring_ID
|
||||
#define GUID_Square kFFEffectType_Square_ID
|
||||
#define GUID_Triangle kFFEffectType_Triangle_ID
|
||||
#define GUID_ConstantForce kFFEffectType_ConstantForce_ID
|
||||
#define GUID_CustomForce kFFEffectType_CustomForce_ID
|
||||
#define GUID_Damper kFFEffectType_Damper_ID
|
||||
#define GUID_Friction kFFEffectType_Friction_ID
|
||||
#define GUID_Inertia kFFEffectType_Inertia_ID
|
||||
#define GUID_RampForce kFFEffectType_RampForce_ID
|
||||
#define GUID_SawtoothDown kFFEffectType_SawtoothDown_ID
|
||||
#define GUID_SawtoothUp kFFEffectType_SawtoothUp_ID
|
||||
#define GUID_Sine kFFEffectType_Sine_ID
|
||||
#define GUID_Spring kFFEffectType_Spring_ID
|
||||
#define GUID_Square kFFEffectType_Square_ID
|
||||
#define GUID_Triangle kFFEffectType_Triangle_ID
|
||||
|
||||
// Miscellaneous
|
||||
#define DI_DEGREES FF_DEGREES
|
||||
#define DI_DOWNLOADSKIPPED FF_DOWNLOADSKIPPED
|
||||
#define DI_EFFECTRESTARTED FF_EFFECTRESTARTED
|
||||
#define DI_FALSE FF_FALSE
|
||||
#define DI_FFNOMINALMAX FF_FFNOMINALMAX
|
||||
#define DI_INFINITE FF_INFINITE
|
||||
#define DI_OK FF_OK
|
||||
#define DI_SECONDS FF_SECONDS
|
||||
#define DI_TRUNCATED FF_TRUNCATED
|
||||
#define DI_TRUNCATEDANDRESTARTED FF_TRUNCATEDANDRESTARTED
|
||||
#define DIEFF_OBJECTOFFSETS FFEFF_OBJECTOFFSETS
|
||||
#define DIERR_DEVICEFULL FFERR_DEVICEFULL
|
||||
#define DIERR_DEVICENOTREG FFERR_DEVICENOTREG
|
||||
#define DIERR_DEVICEPAUSED FFERR_DEVICEPAUSED
|
||||
#define DIERR_DEVICERELEASED FFERR_DEVICERELEASED
|
||||
#define DIERR_EFFECTPLAYING FFERR_EFFECTPLAYING
|
||||
#define DIERR_EFFECTTYPEMISMATCH FFERR_EFFECTTYPEMISMATCH
|
||||
#define DIERR_EFFECTTYPENOTSUPPORTED FFERR_EFFECTTYPENOTSUPPORTED
|
||||
#define DIERR_GENERIC FFERR_GENERIC
|
||||
#define DIERR_HASEFFECTS FFERR_HASEFFECTS
|
||||
#define DIERR_INCOMPLETEEFFECT FFERR_INCOMPLETEEFFECT
|
||||
#define DIERR_INTERNAL FFERR_INTERNAL
|
||||
#define DIERR_INVALIDDOWNLOADID FFERR_INVALIDDOWNLOADID
|
||||
#define DIERR_INVALIDPARAM FFERR_INVALIDPARAM
|
||||
#define DIERR_MOREDATA FFERR_MOREDATA
|
||||
#define DIERR_NOINTERFACE FFERR_NOINTERFACE
|
||||
#define DIERR_NOTDOWNLOADED FFERR_NOTDOWNLOADED
|
||||
#define DIERR_NOTINITIALIZED FFERR_NOTINITIALIZED
|
||||
#define DIERR_OUTOFMEMORY FFERR_OUTOFMEMORY
|
||||
#define DIERR_UNPLUGGED FFERR_UNPLUGGED
|
||||
#define DIERR_UNSUPPORTED FFERR_UNSUPPORTED
|
||||
#define DIERR_UNSUPPORTEDAXIS FFERR_UNSUPPORTEDAXIS
|
||||
#define DIJOFS_X FFJOFS_X
|
||||
#define DIJOFS_Y FFJOFS_Y
|
||||
#define DIJOFS_Z FFJOFS_Z
|
||||
#define DI_DEGREES FF_DEGREES
|
||||
#define DI_DOWNLOADSKIPPED FF_DOWNLOADSKIPPED
|
||||
#define DI_EFFECTRESTARTED FF_EFFECTRESTARTED
|
||||
#define DI_FALSE FF_FALSE
|
||||
#define DI_FFNOMINALMAX FF_FFNOMINALMAX
|
||||
#define DI_INFINITE FF_INFINITE
|
||||
#define DI_OK FF_OK
|
||||
#define DI_SECONDS FF_SECONDS
|
||||
#define DI_TRUNCATED FF_TRUNCATED
|
||||
#define DI_TRUNCATEDANDRESTARTED FF_TRUNCATEDANDRESTARTED
|
||||
#define DIEFF_OBJECTOFFSETS FFEFF_OBJECTOFFSETS
|
||||
#define DIERR_DEVICEFULL FFERR_DEVICEFULL
|
||||
#define DIERR_DEVICENOTREG FFERR_DEVICENOTREG
|
||||
#define DIERR_DEVICEPAUSED FFERR_DEVICEPAUSED
|
||||
#define DIERR_DEVICERELEASED FFERR_DEVICERELEASED
|
||||
#define DIERR_EFFECTPLAYING FFERR_EFFECTPLAYING
|
||||
#define DIERR_EFFECTTYPEMISMATCH FFERR_EFFECTTYPEMISMATCH
|
||||
#define DIERR_EFFECTTYPENOTSUPPORTED FFERR_EFFECTTYPENOTSUPPORTED
|
||||
#define DIERR_GENERIC FFERR_GENERIC
|
||||
#define DIERR_HASEFFECTS FFERR_HASEFFECTS
|
||||
#define DIERR_INCOMPLETEEFFECT FFERR_INCOMPLETEEFFECT
|
||||
#define DIERR_INTERNAL FFERR_INTERNAL
|
||||
#define DIERR_INVALIDDOWNLOADID FFERR_INVALIDDOWNLOADID
|
||||
#define DIERR_INVALIDPARAM FFERR_INVALIDPARAM
|
||||
#define DIERR_MOREDATA FFERR_MOREDATA
|
||||
#define DIERR_NOINTERFACE FFERR_NOINTERFACE
|
||||
#define DIERR_NOTDOWNLOADED FFERR_NOTDOWNLOADED
|
||||
#define DIERR_NOTINITIALIZED FFERR_NOTINITIALIZED
|
||||
#define DIERR_OUTOFMEMORY FFERR_OUTOFMEMORY
|
||||
#define DIERR_UNPLUGGED FFERR_UNPLUGGED
|
||||
#define DIERR_UNSUPPORTED FFERR_UNSUPPORTED
|
||||
#define DIERR_UNSUPPORTEDAXIS FFERR_UNSUPPORTEDAXIS
|
||||
#define DIJOFS_X FFJOFS_X
|
||||
#define DIJOFS_Y FFJOFS_Y
|
||||
#define DIJOFS_Z FFJOFS_Z
|
||||
|
||||
// FFCapabilitiesEffectSubType
|
||||
#define DICAP_ST_KINESTHETIC FFCAP_ST_KINESTHETIC
|
||||
#define DICAP_ST_VIBRATION FFCAP_ST_VIBRATION
|
||||
#define DICAP_ST_KINESTHETIC FFCAP_ST_KINESTHETIC
|
||||
#define DICAP_ST_VIBRATION FFCAP_ST_VIBRATION
|
||||
|
||||
// FFCapabilitiesEffectType
|
||||
#define DICAP_ET_CONSTANTFORCE FFCAP_ET_CONSTANTFORCE
|
||||
#define DICAP_ET_RAMPFORCE FFCAP_ET_RAMPFORCE
|
||||
#define DICAP_ET_SQUARE FFCAP_ET_SQUARE
|
||||
#define DICAP_ET_SINE FFCAP_ET_SINE
|
||||
#define DICAP_ET_TRIANGLE FFCAP_ET_TRIANGLE
|
||||
#define DICAP_ET_SAWTOOTHUP FFCAP_ET_SAWTOOTHUP
|
||||
#define DICAP_ET_SAWTOOTHDOWN FFCAP_ET_SAWTOOTHDOWN
|
||||
#define DICAP_ET_SPRING FFCAP_ET_SPRING
|
||||
#define DICAP_ET_DAMPER FFCAP_ET_DAMPER
|
||||
#define DICAP_ET_INERTIA FFCAP_ET_INERTIA
|
||||
#define DICAP_ET_FRICTION FFCAP_ET_FRICTION
|
||||
#define DICAP_ET_CUSTOMFORCE FFCAP_ET_CUSTOMFORCE
|
||||
#define DICAP_ET_CONSTANTFORCE FFCAP_ET_CONSTANTFORCE
|
||||
#define DICAP_ET_RAMPFORCE FFCAP_ET_RAMPFORCE
|
||||
#define DICAP_ET_SQUARE FFCAP_ET_SQUARE
|
||||
#define DICAP_ET_SINE FFCAP_ET_SINE
|
||||
#define DICAP_ET_TRIANGLE FFCAP_ET_TRIANGLE
|
||||
#define DICAP_ET_SAWTOOTHUP FFCAP_ET_SAWTOOTHUP
|
||||
#define DICAP_ET_SAWTOOTHDOWN FFCAP_ET_SAWTOOTHDOWN
|
||||
#define DICAP_ET_SPRING FFCAP_ET_SPRING
|
||||
#define DICAP_ET_DAMPER FFCAP_ET_DAMPER
|
||||
#define DICAP_ET_INERTIA FFCAP_ET_INERTIA
|
||||
#define DICAP_ET_FRICTION FFCAP_ET_FRICTION
|
||||
#define DICAP_ET_CUSTOMFORCE FFCAP_ET_CUSTOMFORCE
|
||||
|
||||
// FFCommandFlag
|
||||
#define DISFFC_RESET FFSFFC_RESET
|
||||
#define DISFFC_STOPALL FFSFFC_STOPALL
|
||||
#define DISFFC_PAUSE FFSFFC_PAUSE
|
||||
#define DISFFC_CONTINUE FFSFFC_CONTINUE
|
||||
#define DISFFC_SETACTUATORSON FFSFFC_SETACTUATORSON
|
||||
#define DISFFC_SETACTUATORSOFF FFSFFC_SETACTUATORSOFF
|
||||
#define DISFFC_RESET FFSFFC_RESET
|
||||
#define DISFFC_STOPALL FFSFFC_STOPALL
|
||||
#define DISFFC_PAUSE FFSFFC_PAUSE
|
||||
#define DISFFC_CONTINUE FFSFFC_CONTINUE
|
||||
#define DISFFC_SETACTUATORSON FFSFFC_SETACTUATORSON
|
||||
#define DISFFC_SETACTUATORSOFF FFSFFC_SETACTUATORSOFF
|
||||
|
||||
// FFCooperativeLevelFlag
|
||||
#define DISCL_EXCLUSIVE FFSCL_EXCLUSIVE
|
||||
#define DISCL_NONEXCLUSIVE FFSCL_NONEXCLUSIVE
|
||||
#define DISCL_FOREGROUND FFSCL_FOREGROUND
|
||||
#define DISCL_BACKGROUND FFSCL_BACKGROUND
|
||||
#define DISCL_EXCLUSIVE FFSCL_EXCLUSIVE
|
||||
#define DISCL_NONEXCLUSIVE FFSCL_NONEXCLUSIVE
|
||||
#define DISCL_FOREGROUND FFSCL_FOREGROUND
|
||||
#define DISCL_BACKGROUND FFSCL_BACKGROUND
|
||||
|
||||
// FFCoordinateSystemFlag
|
||||
#define DIEFF_CARTESIAN FFEFF_CARTESIAN
|
||||
#define DIEFF_POLAR FFEFF_POLAR
|
||||
#define DIEFF_SPHERICAL FFEFF_SPHERICAL
|
||||
#define DIEFF_CARTESIAN FFEFF_CARTESIAN
|
||||
#define DIEFF_POLAR FFEFF_POLAR
|
||||
#define DIEFF_SPHERICAL FFEFF_SPHERICAL
|
||||
|
||||
// FFEffectParameterFlag
|
||||
#define DIEP_DURATION FFEP_DURATION
|
||||
#define DIEP_SAMPLEPERIOD FFEP_SAMPLEPERIOD
|
||||
#define DIEP_GAIN FFEP_GAIN
|
||||
#define DIEP_TRIGGERBUTTON FFEP_TRIGGERBUTTON
|
||||
#define DIEP_TRIGGERREPEATINTERVAL FFEP_TRIGGERREPEATINTERVAL
|
||||
#define DIEP_AXES FFEP_AXES
|
||||
#define DIEP_DIRECTION FFEP_DIRECTION
|
||||
#define DIEP_ENVELOPE FFEP_ENVELOPE
|
||||
#define DIEP_TYPESPECIFICPARAMS FFEP_TYPESPECIFICPARAMS
|
||||
#define DIEP_STARTDELAY FFEP_STARTDELAY
|
||||
#define DIEP_ALLPARAMS FFEP_ALLPARAMS
|
||||
#define DIEP_START FFEP_START
|
||||
#define DIEP_NORESTART FFEP_NORESTART
|
||||
#define DIEP_NODOWNLOAD FFEP_NODOWNLOAD
|
||||
#define DIEB_NOTRIGGER FFEB_NOTRIGGER
|
||||
#define DIEP_DURATION FFEP_DURATION
|
||||
#define DIEP_SAMPLEPERIOD FFEP_SAMPLEPERIOD
|
||||
#define DIEP_GAIN FFEP_GAIN
|
||||
#define DIEP_TRIGGERBUTTON FFEP_TRIGGERBUTTON
|
||||
#define DIEP_TRIGGERREPEATINTERVAL FFEP_TRIGGERREPEATINTERVAL
|
||||
#define DIEP_AXES FFEP_AXES
|
||||
#define DIEP_DIRECTION FFEP_DIRECTION
|
||||
#define DIEP_ENVELOPE FFEP_ENVELOPE
|
||||
#define DIEP_TYPESPECIFICPARAMS FFEP_TYPESPECIFICPARAMS
|
||||
#define DIEP_STARTDELAY FFEP_STARTDELAY
|
||||
#define DIEP_ALLPARAMS FFEP_ALLPARAMS
|
||||
#define DIEP_START FFEP_START
|
||||
#define DIEP_NORESTART FFEP_NORESTART
|
||||
#define DIEP_NODOWNLOAD FFEP_NODOWNLOAD
|
||||
#define DIEB_NOTRIGGER FFEB_NOTRIGGER
|
||||
|
||||
// FFEffectStartFlag
|
||||
#define DIES_SOLO FFES_SOLO
|
||||
#define DIES_NODOWNLOAD FFES_NODOWNLOAD
|
||||
#define DIES_SOLO FFES_SOLO
|
||||
#define DIES_NODOWNLOAD FFES_NODOWNLOAD
|
||||
|
||||
// FFEffectStatusFlag
|
||||
#define DIEGES_NOTPLAYING FFEGES_NOTPLAYING
|
||||
#define DIEGES_PLAYING FFEGES_PLAYING
|
||||
#define DIEGES_EMULATED FFEGES_EMULATED
|
||||
#define DIEGES_NOTPLAYING FFEGES_NOTPLAYING
|
||||
#define DIEGES_PLAYING FFEGES_PLAYING
|
||||
#define DIEGES_EMULATED FFEGES_EMULATED
|
||||
|
||||
// FFProperty
|
||||
#define DIPROP_FFGAIN FFPROP_FFGAIN
|
||||
#define DIPROP_AUTOCENTER FFPROP_AUTOCENTER
|
||||
#define DIPROP_FFGAIN FFPROP_FFGAIN
|
||||
#define DIPROP_AUTOCENTER FFPROP_AUTOCENTER
|
||||
// not defined in ForceFeedbackConstants.h
|
||||
#define DIPROPAUTOCENTER_OFF 0
|
||||
#define DIPROPAUTOCENTER_ON 1
|
||||
#define DIPROPAUTOCENTER_OFF 0
|
||||
#define DIPROPAUTOCENTER_ON 1
|
||||
|
||||
// FFState
|
||||
#define DIGFFS_EMPTY FFGFFS_EMPTY
|
||||
#define DIGFFS_STOPPED FFGFFS_STOPPED
|
||||
#define DIGFFS_PAUSED FFGFFS_PAUSED
|
||||
#define DIGFFS_ACTUATORSON FFGFFS_ACTUATORSON
|
||||
#define DIGFFS_ACTUATORSOFF FFGFFS_ACTUATORSOFF
|
||||
#define DIGFFS_POWERON FFGFFS_POWERON
|
||||
#define DIGFFS_POWEROFF FFGFFS_POWEROFF
|
||||
#define DIGFFS_SAFETYSWITCHON FFGFFS_SAFETYSWITCHON
|
||||
#define DIGFFS_SAFETYSWITCHOFF FFGFFS_SAFETYSWITCHOFF
|
||||
#define DIGFFS_USERFFSWITCHON FFGFFS_USERFFSWITCHON
|
||||
#define DIGFFS_USERFFSWITCHOFF FFGFFS_USERFFSWITCHOFF
|
||||
#define DIGFFS_DEVICELOST FFGFFS_DEVICELOST
|
||||
#define DIGFFS_EMPTY FFGFFS_EMPTY
|
||||
#define DIGFFS_STOPPED FFGFFS_STOPPED
|
||||
#define DIGFFS_PAUSED FFGFFS_PAUSED
|
||||
#define DIGFFS_ACTUATORSON FFGFFS_ACTUATORSON
|
||||
#define DIGFFS_ACTUATORSOFF FFGFFS_ACTUATORSOFF
|
||||
#define DIGFFS_POWERON FFGFFS_POWERON
|
||||
#define DIGFFS_POWEROFF FFGFFS_POWEROFF
|
||||
#define DIGFFS_SAFETYSWITCHON FFGFFS_SAFETYSWITCHON
|
||||
#define DIGFFS_SAFETYSWITCHOFF FFGFFS_SAFETYSWITCHOFF
|
||||
#define DIGFFS_USERFFSWITCHON FFGFFS_USERFFSWITCHON
|
||||
#define DIGFFS_USERFFSWITCHOFF FFGFFS_USERFFSWITCHOFF
|
||||
#define DIGFFS_DEVICELOST FFGFFS_DEVICELOST
|
||||
|
Reference in New Issue
Block a user