[USB-BRINGUP]

- Implement mouse move detection, wheel state detection

svn path=/branches/usb-bringup/; revision=54772
This commit is contained in:
Johannes Anderwald 2011-12-28 11:36:05 +00:00
parent d4bb27774a
commit 012eac6d8f
2 changed files with 118 additions and 3 deletions

View file

@ -28,6 +28,35 @@ static USHORT MouHid_ButtonUpFlags[] =
MOUSE_BUTTON_5_UP MOUSE_BUTTON_5_UP
}; };
VOID
MouHid_GetButtonMove(
IN PDEVICE_OBJECT DeviceObject,
OUT PLONG LastX,
OUT PLONG LastY)
{
PMOUHID_DEVICE_EXTENSION DeviceExtension;
NTSTATUS Status;
/* get device extension */
DeviceExtension = (PMOUHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
/* init result */
*LastX = 0;
*LastY = 0;
/* get scaled usage value x */
Status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, HIDP_LINK_COLLECTION_UNSPECIFIED, HID_USAGE_GENERIC_X, (PLONG)&LastX, DeviceExtension->PreparsedData, DeviceExtension->Report, DeviceExtension->ReportLength);
/* FIXME handle error */
ASSERT(Status == HIDP_STATUS_SUCCESS);
/* get scaled usage value y */
Status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, HIDP_LINK_COLLECTION_UNSPECIFIED, HID_USAGE_GENERIC_Y, (PLONG)&LastY, DeviceExtension->PreparsedData, DeviceExtension->Report, DeviceExtension->ReportLength);
/* FIXME handle error */
ASSERT(Status == HIDP_STATUS_SUCCESS);
}
VOID VOID
MouHid_GetButtonFlags( MouHid_GetButtonFlags(
IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_OBJECT DeviceObject,
@ -146,6 +175,9 @@ MouHid_ReadCompletion(
{ {
PMOUHID_DEVICE_EXTENSION DeviceExtension; PMOUHID_DEVICE_EXTENSION DeviceExtension;
USHORT ButtonFlags; USHORT ButtonFlags;
LONG UsageValue;
NTSTATUS Status;
LONG LastX, LastY;
MOUSE_INPUT_DATA MouseInputData; MOUSE_INPUT_DATA MouseInputData;
/* get device extension */ /* get device extension */
@ -154,14 +186,34 @@ MouHid_ReadCompletion(
/* get mouse change flags */ /* get mouse change flags */
MouHid_GetButtonFlags(DeviceObject, &ButtonFlags); MouHid_GetButtonFlags(DeviceObject, &ButtonFlags);
/* FIXME detect mouse move change */ /* get mouse change */
/* FIXME detect mouse wheel change */ MouHid_GetButtonMove(DeviceObject, &LastX, &LastY);
/* init input data */ /* init input data */
RtlZeroMemory(&MouseInputData, sizeof(MOUSE_INPUT_DATA)); RtlZeroMemory(&MouseInputData, sizeof(MOUSE_INPUT_DATA));
/* init input data */ /* init input data */
MouseInputData.ButtonFlags = ButtonFlags; MouseInputData.ButtonFlags = ButtonFlags;
MouseInputData.LastX = LastX;
MouseInputData.LastY = LastY;
/* detect mouse wheel change */
if (DeviceExtension->MouseIdentifier == WHEELMOUSE_HID_HARDWARE)
{
/* get usage */
UsageValue = 0;
Status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, HIDP_LINK_COLLECTION_UNSPECIFIED, HID_USAGE_GENERIC_WHEEL, &UsageValue, DeviceExtension->PreparsedData, DeviceExtension->Report, DeviceExtension->ReportLength);
if (Status == HIDP_STATUS_SUCCESS)
{
/* store wheel status */
MouseInputData.ButtonFlags |= MOUSE_WHEEL;
MouseInputData.ButtonData = (USHORT)UsageValue; /* FIXME */
}
else
{
DPRINT1("[MOUHID] failed to get wheel status with %x\n", Status);
}
}
/* dispatch mouse action */ /* dispatch mouse action */
MouHid_DispatchInputData(DeviceObject, &MouseInputData); MouHid_DispatchInputData(DeviceObject, &MouseInputData);

View file

@ -12,26 +12,89 @@
typedef struct typedef struct
{ {
//
// lower device object
//
PDEVICE_OBJECT NextDeviceObject; PDEVICE_OBJECT NextDeviceObject;
//
// irp which is used for reading input reports
//
PIRP Irp; PIRP Irp;
//
// event
//
KEVENT Event; KEVENT Event;
//
// device object for class callback
//
PDEVICE_OBJECT ClassDeviceObject; PDEVICE_OBJECT ClassDeviceObject;
//
// class callback
//
PVOID ClassService; PVOID ClassService;
//
// mouse type
//
USHORT MouseIdentifier; USHORT MouseIdentifier;
//
// wheel usage page
//
USHORT WheelUsagePage; USHORT WheelUsagePage;
//
// usage list length
//
USHORT UsageListLength; USHORT UsageListLength;
//
// current usage list length
//
PUSAGE CurrentUsageList; PUSAGE CurrentUsageList;
//
// previous usage list
//
PUSAGE PreviousUsageList; PUSAGE PreviousUsageList;
//
// removed usage item list
//
PUSAGE BreakUsageList; PUSAGE BreakUsageList;
//
// new item usage list
//
PUSAGE MakeUsageList; PUSAGE MakeUsageList;
//
// preparsed data
//
PVOID PreparsedData; PVOID PreparsedData;
//
// mdl for reading input report
//
PMDL ReportMDL; PMDL ReportMDL;
//
// input report buffer
//
PUCHAR Report; PUCHAR Report;
//
// input report length
//
ULONG ReportLength; ULONG ReportLength;
//
// file object the device is reading reports from
//
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
}MOUHID_DEVICE_EXTENSION, *PMOUHID_DEVICE_EXTENSION; }MOUHID_DEVICE_EXTENSION, *PMOUHID_DEVICE_EXTENSION;