home *** CD-ROM | disk | FTP | other *** search
- /*
- File: USBTabletModuleCDM.c
-
- Contains: HID Emulation glue code between the ADB SHIM and the USB Tablet HID Module
-
- Version: xxx put version here xxx
-
- Copyright: © 1998 by Apple Computer, Inc., all rights reserved.
-
- */
-
- #include <Types.h>
- #include <Devices.h>
- #include <DriverServices.h>
- #include <CursorDevices.h>
- #include <USB.h>
-
-
- #include "USBTabletModule.h"
-
- extern usbTabletPBStruct myTabletPB;
-
- void NotifyCursorDeviceManager(UInt32 refcon, void * theData)
- {
- #pragma unused (refcon)
-
- USBHIDDataPtr pTabletData;
- static UInt16 oldbuttons = 0;
- UInt16 changedbuttons = 0;
-
- // DebugStr("\pIn NotifyCursorDeviceManager");
- pTabletData = (USBHIDDataPtr)theData;
-
- // Tell the Cursor Device Manager that we moved
- if ((pTabletData->mouse.XDelta != 0) || (pTabletData->mouse.YDelta !=0))
- {
- if (pTabletData->mouse.XDelta > 127)
- pTabletData->mouse.XDelta = 127;
-
- if (pTabletData->mouse.YDelta > 127)
- pTabletData->mouse.YDelta = 127;
-
- if (pTabletData->mouse.YDelta < -127)
- pTabletData->mouse.YDelta = -127;
-
- if (pTabletData->mouse.XDelta < -127)
- pTabletData->mouse.XDelta = -127;
- CursorDeviceMove(myTabletPB.pCursorDeviceInfo, pTabletData->mouse.XDelta, pTabletData->mouse.YDelta);
- }
-
- // Update with the state of the buttons.
- pTabletData->mouse.buttons &= 0x03;
- changedbuttons = oldbuttons ^ pTabletData->mouse.buttons;
- if (changedbuttons)
- {
- CursorDeviceButtons(myTabletPB.pCursorDeviceInfo, (short)pTabletData->mouse.buttons);
- }
- oldbuttons = pTabletData->mouse.buttons;
- }
-
- OSStatus API_InstallInterrupt(HIDInterruptProcPtr HIDInterruptFunction, UInt32 refcon)
- {
- USBExpertStatus(myTabletPB.deviceRef, "\pUSBHIDTabletModule: Demo Mode Disabled (interrupt service routine installed)", myTabletPB.deviceRef);
- myTabletPB.refcon = refcon;
- myTabletPB.pSHIMInterruptRoutine = HIDInterruptFunction;
- return noErr;
- }
-
- OSStatus API_PollDevice(void)
- {
- return kUSBInternalErr;
- }
-
- OSStatus API_ControlDevice(UInt32 theControlSelector, void * theControlData)
- {
- #pragma unused (theControlData)
-
- switch (theControlSelector)
- {
- case kHIDRemoveInterruptHandler:
- myTabletPB.refcon = nil;
- myTabletPB.pSavedInterruptRoutine = nil;
- myTabletPB.pSHIMInterruptRoutine = nil;
- break;
-
- case kHIDEnableDemoMode:
- USBExpertStatus(myTabletPB.deviceRef, "\pUSBHIDTabletModule: Demo Mode Enabled", myTabletPB.deviceRef);
-
- if (myTabletPB.pCursorDeviceInfo == 0)
- {
- myTabletPB.pCursorDeviceInfo = &myTabletPB.cursorDeviceInfo;
- CursorDeviceNewDevice(&myTabletPB.pCursorDeviceInfo);
-
- CursorDeviceSetAcceleration(myTabletPB.pCursorDeviceInfo, (Fixed)(1<<16));
-
- CursorDeviceSetButtons(myTabletPB.pCursorDeviceInfo, 2); // should actually be set by reading
- // the HID descriptor, but lacking
- // a parser, we'll just force it
- // this way.
- CursorDeviceButtonOp(myTabletPB.pCursorDeviceInfo, 0, kButtonSingleClick, 0L);
- CursorDeviceButtonOp(myTabletPB.pCursorDeviceInfo, 1, kButtonSingleClick, 0L);
- CursorDeviceUnitsPerInch(myTabletPB.pCursorDeviceInfo, (Fixed)(myTabletPB.unitsPerInch));
- }
-
- myTabletPB.pSavedInterruptRoutine = myTabletPB.pSHIMInterruptRoutine;
- myTabletPB.pSHIMInterruptRoutine = NotifyCursorDeviceManager;
- break;
-
- case kHIDDisableDemoMode:
- USBExpertStatus(myTabletPB.deviceRef, "\pUSBHIDTabletModule: Demo Mode Disabled", myTabletPB.deviceRef);
- if (myTabletPB.pCursorDeviceInfo != 0)
- {
- CursorDeviceDisposeDevice(myTabletPB.pCursorDeviceInfo);
- myTabletPB.pCursorDeviceInfo = 0;
- }
- myTabletPB.pSHIMInterruptRoutine = myTabletPB.pSavedInterruptRoutine;
- break;
-
- default:
- return paramErr;
- }
- return noErr;
- }
-
-
-
- OSStatus API_GetDeviceInfo(UInt32 theInfoSelector, void * theInfo)
- {
- HIDInterruptProcPtr * pHIDIntProcPtr;
- UInt32 * pUnits;
- UInt32 * pInterruptRefcon;
-
- switch (theInfoSelector)
- {
- case kHIDGetDeviceUnitsPerInch:
- pUnits = (UInt32*)theInfo;
- *pUnits = (UInt32)(myTabletPB.unitsPerInch);
- break;
-
-
- case kHIDGetInterruptHandler:
- pHIDIntProcPtr = (HIDInterruptProcPtr *)theInfo;
- *pHIDIntProcPtr = myTabletPB.pSHIMInterruptRoutine;
- break;
-
- case kHIDGetInterruptRefcon:
- pInterruptRefcon = (UInt32 *)theInfo;
- *pInterruptRefcon = myTabletPB.refcon;
- break;
-
- default:
- return paramErr;
- }
- return noErr;
- }
-
- OSStatus API_EnterPolledMode(void)
- {
- return unimpErr;
- }
-
- OSStatus API_ExitPolledMode(void)
- {
- return unimpErr;
- }
-
- void ProcessInterruptReport(UInt32 devicetype, UInt8 hidReport[])
- {
- #pragma unused (devicetype)
-
- TabletReport *pTheTabletReport;
- USBHIDData theTabletData;
-
- static UInt16 prevXPosition = 0;
- static UInt16 prevYPosition = 0;
-
- UInt16 myXPosition, myYPosition;
- SInt16 myXDelta, myYDelta;
-
- pTheTabletReport = (TabletReport*)hidReport;
-
- pTheTabletReport->buttons &= 0x7f;
- if (pTheTabletReport->buttons)
- {
- theTabletData.mouse.buttons = 0x01;
- }
- else
- {
- theTabletData.mouse.buttons = 0;
- }
-
- myXPosition = pTheTabletReport->xPosition;
- myYPosition = pTheTabletReport->yPosition;
-
- myXDelta = (SInt16)(myXPosition - prevXPosition);
- myYDelta = (SInt16)(myYPosition - prevYPosition);
-
- prevXPosition = myXPosition;
- prevYPosition = myYPosition;
-
- theTabletData.mouse.XDelta = (SInt16)myXDelta;
- theTabletData.mouse.YDelta = (SInt16)myYDelta;
-
- if (myTabletPB.pSHIMInterruptRoutine)
- {
- (*myTabletPB.pSHIMInterruptRoutine)(myTabletPB.refcon, (void *)&theTabletData);
- }
- }
-
- USBHIDModuleDispatchTable TheHIDModuleDispatchTable =
- {
- (UInt32)0,
- (USBHIDInstallInterruptProcPtr)API_InstallInterrupt,
- (USBHIDPollDeviceProcPtr)API_PollDevice,
- (USBHIDControlDeviceProcPtr)API_ControlDevice,
- (USBHIDGetDeviceInfoProcPtr)API_GetDeviceInfo,
- (USBHIDEnterPolledModeProcPtr)API_EnterPolledMode,
- (USBHIDExitPolledModeProcPtr)API_ExitPolledMode
- };
-
- CursorDevicePtr gUSBTablet;
- CursorDevice ourDevice;
-
-