Open CASCADE Technology  7.7.0
Public Types | Public Member Functions | Static Public Member Functions
WNT_HIDSpaceMouse Class Reference

Wrapper over Space Mouse data chunk within WM_INPUT event (known also as Raw Input in WinAPI). This class predefines specific list of supported devices, which does not depend on 3rdparty library provided by mouse vendor. Supported input chunks: More...

#include <WNT_HIDSpaceMouse.hxx>

Public Types

enum  { VENDOR_ID_LOGITECH = 0x46D, VENDOR_ID_3DCONNEXION = 0x256F }
 Vendor HID identifier. More...
 

Public Member Functions

 WNT_HIDSpaceMouse (unsigned long theProductId, const Standard_Byte *theData, Standard_Size theSize)
 Main constructor. More...
 
int16_t RawValueRange () const
 Return the raw value range. More...
 
void SetRawValueRange (int16_t theRange)
 Set the raw value range. More...
 
bool IsTranslation () const
 Return TRUE if data chunk defines new translation values. More...
 
Graphic3d_Vec3d Translation (bool &theIsIdle, bool theIsQuadric) const
 Return new translation values. More...
 
bool IsRotation () const
 Return TRUE if data chunk defines new rotation values. More...
 
Graphic3d_Vec3d Rotation (bool &theIsIdle, bool theIsQuadric) const
 Return new rotation values. More...
 
bool IsKeyState () const
 Return TRUE for key state data chunk. More...
 
uint32_t KeyState () const
 Return new keystate. More...
 
Aspect_VKey HidToSpaceKey (unsigned short theKeyBit) const
 Convert key state bit into virtual key. More...
 

Static Public Member Functions

static bool IsKnownProduct (unsigned long theProductId)
 Return if product id is known by this class. More...
 

Detailed Description

Wrapper over Space Mouse data chunk within WM_INPUT event (known also as Raw Input in WinAPI). This class predefines specific list of supported devices, which does not depend on 3rdparty library provided by mouse vendor. Supported input chunks:

To use the class, register Raw Input device:

Handle(WNT_Window) theWindow;
RAWINPUTDEVICE aRawInDevList[1];
RAWINPUTDEVICE& aRawSpace = aRawInDevList[0];
aRawSpace.usUsagePage = HID_USAGE_PAGE_GENERIC;
aRawSpace.usUsage = HID_USAGE_GENERIC_MULTI_AXIS_CONTROLLER;
aRawSpace.dwFlags = 0; // RIDEV_DEVNOTIFY
aRawSpace.hwndTarget = (HWND )theWindow->NativeHandle();
if (!::RegisterRawInputDevices (aRawInDevList, 1, sizeof(aRawInDevList[0]))) { Error; }

Then handle WM_INPUT events within window message loop.

AIS_ViewController theViewCtrl;
case WM_INPUT:
{
UINT aSize = 0;
::GetRawInputData ((HRAWINPUT )theLParam, RID_INPUT, NULL, &aSize, sizeof(RAWINPUTHEADER));
NCollection_LocalArray<BYTE> aRawData (aSize); // receive Raw Input for any device and process known devices
if (aSize == 0 || ::GetRawInputData ((HRAWINPUT )theLParam, RID_INPUT, aRawData, &aSize, sizeof(RAWINPUTHEADER)) != aSize)
{
break;
}
const RAWINPUT* aRawInput = (RAWINPUT* )(BYTE* )aRawData;
if (aRawInput->header.dwType != RIM_TYPEHID)
{
break;
}
RID_DEVICE_INFO aDevInfo; aDevInfo.cbSize = sizeof(RID_DEVICE_INFO);
UINT aDevInfoSize = sizeof(RID_DEVICE_INFO);
if (::GetRawInputDeviceInfoW (aRawInput->header.hDevice, RIDI_DEVICEINFO, &aDevInfo, &aDevInfoSize) != sizeof(RID_DEVICE_INFO)
|| (aDevInfo.hid.dwVendorId != WNT_HIDSpaceMouse::VENDOR_ID_LOGITECH
&& aDevInfo.hid.dwVendorId != WNT_HIDSpaceMouse::VENDOR_ID_3DCONNEXION))
{
break;
}
Aspect_VKeySet& aKeys = theViewCtrl.ChangeKeys();
const double aTimeStamp = theViewCtrl.EventTime();
WNT_HIDSpaceMouse aSpaceData (aDevInfo.hid.dwProductId, aRawInput->data.hid.bRawData, aRawInput->data.hid.dwSizeHid);
if (aSpaceData.IsTranslation())
{
// process translation input
bool isIdle = true, isQuadric = true;
const Graphic3d_Vec3d aTrans = aSpaceData.Translation (isIdle, isQuadric);
}
if (aSpaceData.IsRotation()) {} // process rotation input
if (aSpaceData.IsKeyState()) {} // process keys input
break;
}

Member Enumeration Documentation

◆ anonymous enum

anonymous enum

Vendor HID identifier.

Enumerator
VENDOR_ID_LOGITECH 
VENDOR_ID_3DCONNEXION 

Constructor & Destructor Documentation

◆ WNT_HIDSpaceMouse()

WNT_HIDSpaceMouse::WNT_HIDSpaceMouse ( unsigned long  theProductId,
const Standard_Byte theData,
Standard_Size  theSize 
)

Main constructor.

Member Function Documentation

◆ HidToSpaceKey()

Aspect_VKey WNT_HIDSpaceMouse::HidToSpaceKey ( unsigned short  theKeyBit) const

Convert key state bit into virtual key.

◆ IsKeyState()

bool WNT_HIDSpaceMouse::IsKeyState ( ) const
inline

Return TRUE for key state data chunk.

◆ IsKnownProduct()

static bool WNT_HIDSpaceMouse::IsKnownProduct ( unsigned long  theProductId)
static

Return if product id is known by this class.

◆ IsRotation()

bool WNT_HIDSpaceMouse::IsRotation ( ) const
inline

Return TRUE if data chunk defines new rotation values.

◆ IsTranslation()

bool WNT_HIDSpaceMouse::IsTranslation ( ) const
inline

Return TRUE if data chunk defines new translation values.

◆ KeyState()

uint32_t WNT_HIDSpaceMouse::KeyState ( ) const
inline

Return new keystate.

◆ RawValueRange()

int16_t WNT_HIDSpaceMouse::RawValueRange ( ) const
inline

Return the raw value range.

◆ Rotation()

Graphic3d_Vec3d WNT_HIDSpaceMouse::Rotation ( bool &  theIsIdle,
bool  theIsQuadric 
) const

Return new rotation values.

Parameters
theIsIdle[out] flag indicating idle state (no rotation)
theIsQuadric[in] flag to apply non-linear scale factor
Returns
vector of 3 elements defining rotation values within [-1..1] range, 0 meaning idle, .x defining tilt, .y defining roll and .z defining spin.

◆ SetRawValueRange()

void WNT_HIDSpaceMouse::SetRawValueRange ( int16_t  theRange)
inline

Set the raw value range.

◆ Translation()

Graphic3d_Vec3d WNT_HIDSpaceMouse::Translation ( bool &  theIsIdle,
bool  theIsQuadric 
) const

Return new translation values.

Parameters
theIsIdle[out] flag indicating idle state (no translation)
theIsQuadric[in] flag to apply non-linear scale factor
Returns
vector of 3 elements defining translation values within [-1..1] range, 0 meaning idle, .x defining left/right slide, .y defining forward/backward and .z defining up/down slide.

The documentation for this class was generated from the following file: