1589 lines
		
	
	
		
			57 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1589 lines
		
	
	
		
			57 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
 | |
| 
 | |
| This software may be distributed and modified under the terms of the GNU
 | |
| General Public License version 2 (GPL2) as published by the Free Software
 | |
| Foundation and appearing in the file GPL2.TXT included in the packaging of
 | |
| this file. Please note that GPL2 Section 2[b] requires that all works based
 | |
| on this software must also be made publicly available under the terms of
 | |
| the GPL2 ("Copyleft").
 | |
| 
 | |
| Contact information
 | |
| -------------------
 | |
| 
 | |
| Circuits At Home, LTD
 | |
| Web      :  http://www.circuitsathome.com
 | |
| e-mail   :  support@circuitsathome.com
 | |
|  */
 | |
| 
 | |
| #include "hidescriptorparser.h"
 | |
| 
 | |
| const char * const ReportDescParserBase::usagePageTitles0[] PROGMEM = {
 | |
|         pstrUsagePageGenericDesktopControls,
 | |
|         pstrUsagePageSimulationControls,
 | |
|         pstrUsagePageVRControls,
 | |
|         pstrUsagePageSportControls,
 | |
|         pstrUsagePageGameControls,
 | |
|         pstrUsagePageGenericDeviceControls,
 | |
|         pstrUsagePageKeyboardKeypad,
 | |
|         pstrUsagePageLEDs,
 | |
|         pstrUsagePageButton,
 | |
|         pstrUsagePageOrdinal,
 | |
|         pstrUsagePageTelephone,
 | |
|         pstrUsagePageConsumer,
 | |
|         pstrUsagePageDigitizer,
 | |
|         pstrUsagePagePID,
 | |
|         pstrUsagePageUnicode
 | |
| };
 | |
| 
 | |
| const char * const ReportDescParserBase::usagePageTitles1[] PROGMEM = {
 | |
|         pstrUsagePageBarCodeScanner,
 | |
|         pstrUsagePageScale,
 | |
|         pstrUsagePageMSRDevices,
 | |
|         pstrUsagePagePointOfSale,
 | |
|         pstrUsagePageCameraControl,
 | |
|         pstrUsagePageArcade
 | |
| };
 | |
| const char * const ReportDescParserBase::genDesktopTitles0[] PROGMEM = {
 | |
|         pstrUsagePointer,
 | |
|         pstrUsageMouse,
 | |
|         pstrUsageJoystick,
 | |
|         pstrUsageGamePad,
 | |
|         pstrUsageKeyboard,
 | |
|         pstrUsageKeypad,
 | |
|         pstrUsageMultiAxisController,
 | |
|         pstrUsageTabletPCSystemControls
 | |
| 
 | |
| };
 | |
| const char * const ReportDescParserBase::genDesktopTitles1[] PROGMEM = {
 | |
|         pstrUsageX,
 | |
|         pstrUsageY,
 | |
|         pstrUsageZ,
 | |
|         pstrUsageRx,
 | |
|         pstrUsageRy,
 | |
|         pstrUsageRz,
 | |
|         pstrUsageSlider,
 | |
|         pstrUsageDial,
 | |
|         pstrUsageWheel,
 | |
|         pstrUsageHatSwitch,
 | |
|         pstrUsageCountedBuffer,
 | |
|         pstrUsageByteCount,
 | |
|         pstrUsageMotionWakeup,
 | |
|         pstrUsageStart,
 | |
|         pstrUsageSelect,
 | |
|         pstrUsagePageReserved,
 | |
|         pstrUsageVx,
 | |
|         pstrUsageVy,
 | |
|         pstrUsageVz,
 | |
|         pstrUsageVbrx,
 | |
|         pstrUsageVbry,
 | |
|         pstrUsageVbrz,
 | |
|         pstrUsageVno,
 | |
|         pstrUsageFeatureNotification,
 | |
|         pstrUsageResolutionMultiplier
 | |
| };
 | |
| const char * const ReportDescParserBase::genDesktopTitles2[] PROGMEM = {
 | |
|         pstrUsageSystemControl,
 | |
|         pstrUsageSystemPowerDown,
 | |
|         pstrUsageSystemSleep,
 | |
|         pstrUsageSystemWakeup,
 | |
|         pstrUsageSystemContextMenu,
 | |
|         pstrUsageSystemMainMenu,
 | |
|         pstrUsageSystemAppMenu,
 | |
|         pstrUsageSystemMenuHelp,
 | |
|         pstrUsageSystemMenuExit,
 | |
|         pstrUsageSystemMenuSelect,
 | |
|         pstrUsageSystemMenuRight,
 | |
|         pstrUsageSystemMenuLeft,
 | |
|         pstrUsageSystemMenuUp,
 | |
|         pstrUsageSystemMenuDown,
 | |
|         pstrUsageSystemColdRestart,
 | |
|         pstrUsageSystemWarmRestart,
 | |
|         pstrUsageDPadUp,
 | |
|         pstrUsageDPadDown,
 | |
|         pstrUsageDPadRight,
 | |
|         pstrUsageDPadLeft
 | |
| };
 | |
| const char * const ReportDescParserBase::genDesktopTitles3[] PROGMEM = {
 | |
|         pstrUsageSystemDock,
 | |
|         pstrUsageSystemUndock,
 | |
|         pstrUsageSystemSetup,
 | |
|         pstrUsageSystemBreak,
 | |
|         pstrUsageSystemDebuggerBreak,
 | |
|         pstrUsageApplicationBreak,
 | |
|         pstrUsageApplicationDebuggerBreak,
 | |
|         pstrUsageSystemSpeakerMute,
 | |
|         pstrUsageSystemHibernate
 | |
| };
 | |
| const char * const ReportDescParserBase::genDesktopTitles4[] PROGMEM = {
 | |
|         pstrUsageSystemDisplayInvert,
 | |
|         pstrUsageSystemDisplayInternal,
 | |
|         pstrUsageSystemDisplayExternal,
 | |
|         pstrUsageSystemDisplayBoth,
 | |
|         pstrUsageSystemDisplayDual,
 | |
|         pstrUsageSystemDisplayToggleIntExt,
 | |
|         pstrUsageSystemDisplaySwapPriSec,
 | |
|         pstrUsageSystemDisplayLCDAutoscale
 | |
| };
 | |
| const char * const ReportDescParserBase::simuTitles0[] PROGMEM = {
 | |
|         pstrUsageFlightSimulationDevice,
 | |
|         pstrUsageAutomobileSimulationDevice,
 | |
|         pstrUsageTankSimulationDevice,
 | |
|         pstrUsageSpaceshipSimulationDevice,
 | |
|         pstrUsageSubmarineSimulationDevice,
 | |
|         pstrUsageSailingSimulationDevice,
 | |
|         pstrUsageMotocicleSimulationDevice,
 | |
|         pstrUsageSportsSimulationDevice,
 | |
|         pstrUsageAirplaneSimulationDevice,
 | |
|         pstrUsageHelicopterSimulationDevice,
 | |
|         pstrUsageMagicCarpetSimulationDevice,
 | |
|         pstrUsageBicycleSimulationDevice
 | |
| };
 | |
| const char * const ReportDescParserBase::simuTitles1[] PROGMEM = {
 | |
|         pstrUsageFlightControlStick,
 | |
|         pstrUsageFlightStick,
 | |
|         pstrUsageCyclicControl,
 | |
|         pstrUsageCyclicTrim,
 | |
|         pstrUsageFlightYoke,
 | |
|         pstrUsageTrackControl
 | |
| };
 | |
| const char * const ReportDescParserBase::simuTitles2[] PROGMEM = {
 | |
|         pstrUsageAileron,
 | |
|         pstrUsageAileronTrim,
 | |
|         pstrUsageAntiTorqueControl,
 | |
|         pstrUsageAutopilotEnable,
 | |
|         pstrUsageChaffRelease,
 | |
|         pstrUsageCollectiveControl,
 | |
|         pstrUsageDiveBrake,
 | |
|         pstrUsageElectronicCountermeasures,
 | |
|         pstrUsageElevator,
 | |
|         pstrUsageElevatorTrim,
 | |
|         pstrUsageRudder,
 | |
|         pstrUsageThrottle,
 | |
|         pstrUsageFlightCommunications,
 | |
|         pstrUsageFlareRelease,
 | |
|         pstrUsageLandingGear,
 | |
|         pstrUsageToeBrake,
 | |
|         pstrUsageTrigger,
 | |
|         pstrUsageWeaponsArm,
 | |
|         pstrUsageWeaponsSelect,
 | |
|         pstrUsageWingFlaps,
 | |
|         pstrUsageAccelerator,
 | |
|         pstrUsageBrake,
 | |
|         pstrUsageClutch,
 | |
|         pstrUsageShifter,
 | |
|         pstrUsageSteering,
 | |
|         pstrUsageTurretDirection,
 | |
|         pstrUsageBarrelElevation,
 | |
|         pstrUsageDivePlane,
 | |
|         pstrUsageBallast,
 | |
|         pstrUsageBicycleCrank,
 | |
|         pstrUsageHandleBars,
 | |
|         pstrUsageFrontBrake,
 | |
|         pstrUsageRearBrake
 | |
| };
 | |
| const char * const ReportDescParserBase::vrTitles0[] PROGMEM = {
 | |
|         pstrUsageBelt,
 | |
|         pstrUsageBodySuit,
 | |
|         pstrUsageFlexor,
 | |
|         pstrUsageGlove,
 | |
|         pstrUsageHeadTracker,
 | |
|         pstrUsageHeadMountedDisplay,
 | |
|         pstrUsageHandTracker,
 | |
|         pstrUsageOculometer,
 | |
|         pstrUsageVest,
 | |
|         pstrUsageAnimatronicDevice
 | |
| };
 | |
| const char * const ReportDescParserBase::vrTitles1[] PROGMEM = {
 | |
|         pstrUsageStereoEnable,
 | |
|         pstrUsageDisplayEnable
 | |
| };
 | |
| const char * const ReportDescParserBase::sportsCtrlTitles0[] PROGMEM = {
 | |
|         pstrUsageBaseballBat,
 | |
|         pstrUsageGolfClub,
 | |
|         pstrUsageRowingMachine,
 | |
|         pstrUsageTreadmill
 | |
| };
 | |
| const char * const ReportDescParserBase::sportsCtrlTitles1[] PROGMEM = {
 | |
|         pstrUsageOar,
 | |
|         pstrUsageSlope,
 | |
|         pstrUsageRate,
 | |
|         pstrUsageStickSpeed,
 | |
|         pstrUsageStickFaceAngle,
 | |
|         pstrUsageStickHeelToe,
 | |
|         pstrUsageStickFollowThough,
 | |
|         pstrUsageStickTempo,
 | |
|         pstrUsageStickType,
 | |
|         pstrUsageStickHeight
 | |
| };
 | |
| const char * const ReportDescParserBase::sportsCtrlTitles2[] PROGMEM = {
 | |
|         pstrUsagePutter,
 | |
|         pstrUsage1Iron,
 | |
|         pstrUsage2Iron,
 | |
|         pstrUsage3Iron,
 | |
|         pstrUsage4Iron,
 | |
|         pstrUsage5Iron,
 | |
|         pstrUsage6Iron,
 | |
|         pstrUsage7Iron,
 | |
|         pstrUsage8Iron,
 | |
|         pstrUsage9Iron,
 | |
|         pstrUsage10Iron,
 | |
|         pstrUsage11Iron,
 | |
|         pstrUsageSandWedge,
 | |
|         pstrUsageLoftWedge,
 | |
|         pstrUsagePowerWedge,
 | |
|         pstrUsage1Wood,
 | |
|         pstrUsage3Wood,
 | |
|         pstrUsage5Wood,
 | |
|         pstrUsage7Wood,
 | |
|         pstrUsage9Wood
 | |
| };
 | |
| const char * const ReportDescParserBase::gameTitles0[] PROGMEM = {
 | |
|         pstrUsage3DGameController,
 | |
|         pstrUsagePinballDevice,
 | |
|         pstrUsageGunDevice
 | |
| };
 | |
| const char * const ReportDescParserBase::gameTitles1[] PROGMEM = {
 | |
|         pstrUsagePointOfView,
 | |
|         pstrUsageTurnRightLeft,
 | |
|         pstrUsagePitchForwardBackward,
 | |
|         pstrUsageRollRightLeft,
 | |
|         pstrUsageMoveRightLeft,
 | |
|         pstrUsageMoveForwardBackward,
 | |
|         pstrUsageMoveUpDown,
 | |
|         pstrUsageLeanRightLeft,
 | |
|         pstrUsageLeanForwardBackward,
 | |
|         pstrUsageHeightOfPOV,
 | |
|         pstrUsageFlipper,
 | |
|         pstrUsageSecondaryFlipper,
 | |
|         pstrUsageBump,
 | |
|         pstrUsageNewGame,
 | |
|         pstrUsageShootBall,
 | |
|         pstrUsagePlayer,
 | |
|         pstrUsageGunBolt,
 | |
|         pstrUsageGunClip,
 | |
|         pstrUsageGunSelector,
 | |
|         pstrUsageGunSingleShot,
 | |
|         pstrUsageGunBurst,
 | |
|         pstrUsageGunAutomatic,
 | |
|         pstrUsageGunSafety,
 | |
|         pstrUsageGamepadFireJump,
 | |
|         pstrUsageGamepadTrigger
 | |
| };
 | |
| const char * const ReportDescParserBase::genDevCtrlTitles[] PROGMEM = {
 | |
|         pstrUsageBatteryStrength,
 | |
|         pstrUsageWirelessChannel,
 | |
|         pstrUsageWirelessID,
 | |
|         pstrUsageDiscoverWirelessControl,
 | |
|         pstrUsageSecurityCodeCharEntered,
 | |
|         pstrUsageSecurityCodeCharErased,
 | |
|         pstrUsageSecurityCodeCleared
 | |
| };
 | |
| const char * const ReportDescParserBase::ledTitles[] PROGMEM = {
 | |
|         pstrUsageNumLock,
 | |
|         pstrUsageCapsLock,
 | |
|         pstrUsageScrollLock,
 | |
|         pstrUsageCompose,
 | |
|         pstrUsageKana,
 | |
|         pstrUsagePower,
 | |
|         pstrUsageShift,
 | |
|         pstrUsageDoNotDisturb,
 | |
|         pstrUsageMute,
 | |
|         pstrUsageToneEnable,
 | |
|         pstrUsageHighCutFilter,
 | |
|         pstrUsageLowCutFilter,
 | |
|         pstrUsageEqualizerEnable,
 | |
|         pstrUsageSoundFieldOn,
 | |
|         pstrUsageSurroundOn,
 | |
|         pstrUsageRepeat,
 | |
|         pstrUsageStereo,
 | |
|         pstrUsageSamplingRateDetect,
 | |
|         pstrUsageSpinning,
 | |
|         pstrUsageCAV,
 | |
|         pstrUsageCLV,
 | |
|         pstrUsageRecordingFormatDetect,
 | |
|         pstrUsageOffHook,
 | |
|         pstrUsageRing,
 | |
|         pstrUsageMessageWaiting,
 | |
|         pstrUsageDataMode,
 | |
|         pstrUsageBatteryOperation,
 | |
|         pstrUsageBatteryOK,
 | |
|         pstrUsageBatteryLow,
 | |
|         pstrUsageSpeaker,
 | |
|         pstrUsageHeadSet,
 | |
|         pstrUsageHold,
 | |
|         pstrUsageMicrophone,
 | |
|         pstrUsageCoverage,
 | |
|         pstrUsageNightMode,
 | |
|         pstrUsageSendCalls,
 | |
|         pstrUsageCallPickup,
 | |
|         pstrUsageConference,
 | |
|         pstrUsageStandBy,
 | |
|         pstrUsageCameraOn,
 | |
|         pstrUsageCameraOff,
 | |
|         pstrUsageOnLine,
 | |
|         pstrUsageOffLine,
 | |
|         pstrUsageBusy,
 | |
|         pstrUsageReady,
 | |
|         pstrUsagePaperOut,
 | |
|         pstrUsagePaperJam,
 | |
|         pstrUsageRemote,
 | |
|         pstrUsageForward,
 | |
|         pstrUsageReverse,
 | |
|         pstrUsageStop,
 | |
|         pstrUsageRewind,
 | |
|         pstrUsageFastForward,
 | |
|         pstrUsagePlay,
 | |
|         pstrUsagePause,
 | |
|         pstrUsageRecord,
 | |
|         pstrUsageError,
 | |
|         pstrUsageSelectedIndicator,
 | |
|         pstrUsageInUseIndicator,
 | |
|         pstrUsageMultiModeIndicator,
 | |
|         pstrUsageIndicatorOn,
 | |
|         pstrUsageIndicatorFlash,
 | |
|         pstrUsageIndicatorSlowBlink,
 | |
|         pstrUsageIndicatorFastBlink,
 | |
|         pstrUsageIndicatorOff,
 | |
|         pstrUsageFlashOnTime,
 | |
|         pstrUsageSlowBlinkOnTime,
 | |
|         pstrUsageSlowBlinkOffTime,
 | |
|         pstrUsageFastBlinkOnTime,
 | |
|         pstrUsageFastBlinkOffTime,
 | |
|         pstrUsageIndicatorColor,
 | |
|         pstrUsageIndicatorRed,
 | |
|         pstrUsageIndicatorGreen,
 | |
|         pstrUsageIndicatorAmber,
 | |
|         pstrUsageGenericIndicator,
 | |
|         pstrUsageSystemSuspend,
 | |
|         pstrUsageExternalPowerConnected
 | |
| };
 | |
| const char * const ReportDescParserBase::telTitles0 [] PROGMEM = {
 | |
|         pstrUsagePhone,
 | |
|         pstrUsageAnsweringMachine,
 | |
|         pstrUsageMessageControls,
 | |
|         pstrUsageHandset,
 | |
|         pstrUsageHeadset,
 | |
|         pstrUsageTelephonyKeyPad,
 | |
|         pstrUsageProgrammableButton
 | |
| };
 | |
| const char * const ReportDescParserBase::telTitles1 [] PROGMEM = {
 | |
|         pstrUsageHookSwitch,
 | |
|         pstrUsageFlash,
 | |
|         pstrUsageFeature,
 | |
|         pstrUsageHold,
 | |
|         pstrUsageRedial,
 | |
|         pstrUsageTransfer,
 | |
|         pstrUsageDrop,
 | |
|         pstrUsagePark,
 | |
|         pstrUsageForwardCalls,
 | |
|         pstrUsageAlternateFunction,
 | |
|         pstrUsageLine,
 | |
|         pstrUsageSpeakerPhone,
 | |
|         pstrUsageConference,
 | |
|         pstrUsageRingEnable,
 | |
|         pstrUsageRingSelect,
 | |
|         pstrUsagePhoneMute,
 | |
|         pstrUsageCallerID,
 | |
|         pstrUsageSend
 | |
| };
 | |
| const char * const ReportDescParserBase::telTitles2 [] PROGMEM = {
 | |
|         pstrUsageSpeedDial,
 | |
|         pstrUsageStoreNumber,
 | |
|         pstrUsageRecallNumber,
 | |
|         pstrUsagePhoneDirectory
 | |
| };
 | |
| const char * const ReportDescParserBase::telTitles3 [] PROGMEM = {
 | |
|         pstrUsageVoiceMail,
 | |
|         pstrUsageScreenCalls,
 | |
|         pstrUsageDoNotDisturb,
 | |
|         pstrUsageMessage,
 | |
|         pstrUsageAnswerOnOff
 | |
| };
 | |
| const char * const ReportDescParserBase::telTitles4 [] PROGMEM = {
 | |
|         pstrUsageInsideDialTone,
 | |
|         pstrUsageOutsideDialTone,
 | |
|         pstrUsageInsideRingTone,
 | |
|         pstrUsageOutsideRingTone,
 | |
|         pstrUsagePriorityRingTone,
 | |
|         pstrUsageInsideRingback,
 | |
|         pstrUsagePriorityRingback,
 | |
|         pstrUsageLineBusyTone,
 | |
|         pstrUsageReorderTone,
 | |
|         pstrUsageCallWaitingTone,
 | |
|         pstrUsageConfirmationTone1,
 | |
|         pstrUsageConfirmationTone2,
 | |
|         pstrUsageTonesOff,
 | |
|         pstrUsageOutsideRingback,
 | |
|         pstrUsageRinger
 | |
| };
 | |
| const char * const ReportDescParserBase::telTitles5 [] PROGMEM = {
 | |
|         pstrUsagePhoneKey0,
 | |
|         pstrUsagePhoneKey1,
 | |
|         pstrUsagePhoneKey2,
 | |
|         pstrUsagePhoneKey3,
 | |
|         pstrUsagePhoneKey4,
 | |
|         pstrUsagePhoneKey5,
 | |
|         pstrUsagePhoneKey6,
 | |
|         pstrUsagePhoneKey7,
 | |
|         pstrUsagePhoneKey8,
 | |
|         pstrUsagePhoneKey9,
 | |
|         pstrUsagePhoneKeyStar,
 | |
|         pstrUsagePhoneKeyPound,
 | |
|         pstrUsagePhoneKeyA,
 | |
|         pstrUsagePhoneKeyB,
 | |
|         pstrUsagePhoneKeyC,
 | |
|         pstrUsagePhoneKeyD
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitles0[] PROGMEM = {
 | |
|         pstrUsageConsumerControl,
 | |
|         pstrUsageNumericKeyPad,
 | |
|         pstrUsageProgrammableButton,
 | |
|         pstrUsageMicrophone,
 | |
|         pstrUsageHeadphone,
 | |
|         pstrUsageGraphicEqualizer
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitles1[] PROGMEM = {
 | |
|         pstrUsagePlus10,
 | |
|         pstrUsagePlus100,
 | |
|         pstrUsageAMPM
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitles2[] PROGMEM = {
 | |
|         pstrUsagePower,
 | |
|         pstrUsageReset,
 | |
|         pstrUsageSleep,
 | |
|         pstrUsageSleepAfter,
 | |
|         pstrUsageSleepMode,
 | |
|         pstrUsageIllumination,
 | |
|         pstrUsageFunctionButtons
 | |
| 
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitles3[] PROGMEM = {
 | |
|         pstrUsageMenu,
 | |
|         pstrUsageMenuPick,
 | |
|         pstrUsageMenuUp,
 | |
|         pstrUsageMenuDown,
 | |
|         pstrUsageMenuLeft,
 | |
|         pstrUsageMenuRight,
 | |
|         pstrUsageMenuEscape,
 | |
|         pstrUsageMenuValueIncrease,
 | |
|         pstrUsageMenuValueDecrease
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitles4[] PROGMEM = {
 | |
|         pstrUsageDataOnScreen,
 | |
|         pstrUsageClosedCaption,
 | |
|         pstrUsageClosedCaptionSelect,
 | |
|         pstrUsageVCRTV,
 | |
|         pstrUsageBroadcastMode,
 | |
|         pstrUsageSnapshot,
 | |
|         pstrUsageStill
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitles5[] PROGMEM = {
 | |
|         pstrUsageSelection,
 | |
|         pstrUsageAssignSelection,
 | |
|         pstrUsageModeStep,
 | |
|         pstrUsageRecallLast,
 | |
|         pstrUsageEnterChannel,
 | |
|         pstrUsageOrderMovie,
 | |
|         pstrUsageChannel,
 | |
|         pstrUsageMediaSelection,
 | |
|         pstrUsageMediaSelectComputer,
 | |
|         pstrUsageMediaSelectTV,
 | |
|         pstrUsageMediaSelectWWW,
 | |
|         pstrUsageMediaSelectDVD,
 | |
|         pstrUsageMediaSelectTelephone,
 | |
|         pstrUsageMediaSelectProgramGuide,
 | |
|         pstrUsageMediaSelectVideoPhone,
 | |
|         pstrUsageMediaSelectGames,
 | |
|         pstrUsageMediaSelectMessages,
 | |
|         pstrUsageMediaSelectCD,
 | |
|         pstrUsageMediaSelectVCR,
 | |
|         pstrUsageMediaSelectTuner,
 | |
|         pstrUsageQuit,
 | |
|         pstrUsageHelp,
 | |
|         pstrUsageMediaSelectTape,
 | |
|         pstrUsageMediaSelectCable,
 | |
|         pstrUsageMediaSelectSatellite,
 | |
|         pstrUsageMediaSelectSecurity,
 | |
|         pstrUsageMediaSelectHome,
 | |
|         pstrUsageMediaSelectCall,
 | |
|         pstrUsageChannelIncrement,
 | |
|         pstrUsageChannelDecrement,
 | |
|         pstrUsageMediaSelectSAP,
 | |
|         pstrUsagePageReserved,
 | |
|         pstrUsageVCRPlus,
 | |
|         pstrUsageOnce,
 | |
|         pstrUsageDaily,
 | |
|         pstrUsageWeekly,
 | |
|         pstrUsageMonthly
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitles6[] PROGMEM = {
 | |
|         pstrUsagePlay,
 | |
|         pstrUsagePause,
 | |
|         pstrUsageRecord,
 | |
|         pstrUsageFastForward,
 | |
|         pstrUsageRewind,
 | |
|         pstrUsageScanNextTrack,
 | |
|         pstrUsageScanPreviousTrack,
 | |
|         pstrUsageStop,
 | |
|         pstrUsageEject,
 | |
|         pstrUsageRandomPlay,
 | |
|         pstrUsageSelectDisk,
 | |
|         pstrUsageEnterDisk,
 | |
|         pstrUsageRepeat,
 | |
|         pstrUsageTracking,
 | |
|         pstrUsageTrackNormal,
 | |
|         pstrUsageSlowTracking,
 | |
|         pstrUsageFrameForward,
 | |
|         pstrUsageFrameBackwards,
 | |
|         pstrUsageMark,
 | |
|         pstrUsageClearMark,
 | |
|         pstrUsageRepeatFromMark,
 | |
|         pstrUsageReturnToMark,
 | |
|         pstrUsageSearchMarkForward,
 | |
|         pstrUsageSearchMarkBackwards,
 | |
|         pstrUsageCounterReset,
 | |
|         pstrUsageShowCounter,
 | |
|         pstrUsageTrackingIncrement,
 | |
|         pstrUsageTrackingDecrement,
 | |
|         pstrUsageStopEject,
 | |
|         pstrUsagePlayPause,
 | |
|         pstrUsagePlaySkip
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitles7[] PROGMEM = {
 | |
|         pstrUsageVolume,
 | |
|         pstrUsageBalance,
 | |
|         pstrUsageMute,
 | |
|         pstrUsageBass,
 | |
|         pstrUsageTreble,
 | |
|         pstrUsageBassBoost,
 | |
|         pstrUsageSurroundMode,
 | |
|         pstrUsageLoudness,
 | |
|         pstrUsageMPX,
 | |
|         pstrUsageVolumeIncrement,
 | |
|         pstrUsageVolumeDecrement
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitles8[] PROGMEM = {
 | |
|         pstrUsageSpeedSelect,
 | |
|         pstrUsagePlaybackSpeed,
 | |
|         pstrUsageStandardPlay,
 | |
|         pstrUsageLongPlay,
 | |
|         pstrUsageExtendedPlay,
 | |
|         pstrUsageSlow
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitles9[] PROGMEM = {
 | |
|         pstrUsageFanEnable,
 | |
|         pstrUsageFanSpeed,
 | |
|         pstrUsageLightEnable,
 | |
|         pstrUsageLightIlluminationLevel,
 | |
|         pstrUsageClimateControlEnable,
 | |
|         pstrUsageRoomTemperature,
 | |
|         pstrUsageSecurityEnable,
 | |
|         pstrUsageFireAlarm,
 | |
|         pstrUsagePoliceAlarm,
 | |
|         pstrUsageProximity,
 | |
|         pstrUsageMotion,
 | |
|         pstrUsageDuresAlarm,
 | |
|         pstrUsageHoldupAlarm,
 | |
|         pstrUsageMedicalAlarm
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitlesA[] PROGMEM = {
 | |
|         pstrUsageBalanceRight,
 | |
|         pstrUsageBalanceLeft,
 | |
|         pstrUsageBassIncrement,
 | |
|         pstrUsageBassDecrement,
 | |
|         pstrUsageTrebleIncrement,
 | |
|         pstrUsageTrebleDecrement
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitlesB[] PROGMEM = {
 | |
|         pstrUsageSpeakerSystem,
 | |
|         pstrUsageChannelLeft,
 | |
|         pstrUsageChannelRight,
 | |
|         pstrUsageChannelCenter,
 | |
|         pstrUsageChannelFront,
 | |
|         pstrUsageChannelCenterFront,
 | |
|         pstrUsageChannelSide,
 | |
|         pstrUsageChannelSurround,
 | |
|         pstrUsageChannelLowFreqEnhancement,
 | |
|         pstrUsageChannelTop,
 | |
|         pstrUsageChannelUnknown
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitlesC[] PROGMEM = {
 | |
|         pstrUsageSubChannel,
 | |
|         pstrUsageSubChannelIncrement,
 | |
|         pstrUsageSubChannelDecrement,
 | |
|         pstrUsageAlternateAudioIncrement,
 | |
|         pstrUsageAlternateAudioDecrement
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitlesD[] PROGMEM = {
 | |
|         pstrUsageApplicationLaunchButtons,
 | |
|         pstrUsageALLaunchButtonConfigTool,
 | |
|         pstrUsageALProgrammableButton,
 | |
|         pstrUsageALConsumerControlConfig,
 | |
|         pstrUsageALWordProcessor,
 | |
|         pstrUsageALTextEditor,
 | |
|         pstrUsageALSpreadsheet,
 | |
|         pstrUsageALGraphicsEditor,
 | |
|         pstrUsageALPresentationApp,
 | |
|         pstrUsageALDatabaseApp,
 | |
|         pstrUsageALEmailReader,
 | |
|         pstrUsageALNewsreader,
 | |
|         pstrUsageALVoicemail,
 | |
|         pstrUsageALContactsAddressBook,
 | |
|         pstrUsageALCalendarSchedule,
 | |
|         pstrUsageALTaskProjectManager,
 | |
|         pstrUsageALLogJournalTimecard,
 | |
|         pstrUsageALCheckbookFinance,
 | |
|         pstrUsageALCalculator,
 | |
|         pstrUsageALAVCapturePlayback,
 | |
|         pstrUsageALLocalMachineBrowser,
 | |
|         pstrUsageALLANWANBrow,
 | |
|         pstrUsageALInternetBrowser,
 | |
|         pstrUsageALRemoteNetISPConnect,
 | |
|         pstrUsageALNetworkConference,
 | |
|         pstrUsageALNetworkChat,
 | |
|         pstrUsageALTelephonyDialer,
 | |
|         pstrUsageALLogon,
 | |
|         pstrUsageALLogoff,
 | |
|         pstrUsageALLogonLogoff,
 | |
|         pstrUsageALTermLockScrSav,
 | |
|         pstrUsageALControlPannel,
 | |
|         pstrUsageALCommandLineProcessorRun,
 | |
|         pstrUsageALProcessTaskManager,
 | |
|         pstrUsageALSelectTaskApplication,
 | |
|         pstrUsageALNextTaskApplication,
 | |
|         pstrUsageALPreviousTaskApplication,
 | |
|         pstrUsageALPreemptiveHaltTaskApp,
 | |
|         pstrUsageALIntegratedHelpCenter,
 | |
|         pstrUsageALDocuments,
 | |
|         pstrUsageALThesaurus,
 | |
|         pstrUsageALDictionary,
 | |
|         pstrUsageALDesktop,
 | |
|         pstrUsageALSpellCheck,
 | |
|         pstrUsageALGrammarCheck,
 | |
|         pstrUsageALWirelessStatus,
 | |
|         pstrUsageALKeyboardLayout,
 | |
|         pstrUsageALVirusProtection,
 | |
|         pstrUsageALEncryption,
 | |
|         pstrUsageALScreenSaver,
 | |
|         pstrUsageALAlarms,
 | |
|         pstrUsageALClock,
 | |
|         pstrUsageALFileBrowser,
 | |
|         pstrUsageALPowerStatus,
 | |
|         pstrUsageALImageBrowser,
 | |
|         pstrUsageALAudioBrowser,
 | |
|         pstrUsageALMovieBrowser,
 | |
|         pstrUsageALDigitalRightsManager,
 | |
|         pstrUsageALDigitalWallet,
 | |
|         pstrUsagePageReserved,
 | |
|         pstrUsageALInstantMessaging,
 | |
|         pstrUsageALOEMFeaturesBrowser,
 | |
|         pstrUsageALOEMHelp,
 | |
|         pstrUsageALOnlineCommunity,
 | |
|         pstrUsageALEntertainmentContentBrow,
 | |
|         pstrUsageALOnlineShoppingBrowser,
 | |
|         pstrUsageALSmartCardInfoHelp,
 | |
|         pstrUsageALMarketMonitorFinBrowser,
 | |
|         pstrUsageALCustomCorpNewsBrowser,
 | |
|         pstrUsageALOnlineActivityBrowser,
 | |
|         pstrUsageALResearchSearchBrowser,
 | |
|         pstrUsageALAudioPlayer
 | |
| };
 | |
| const char * const ReportDescParserBase::consTitlesE[] PROGMEM = {
 | |
|         pstrUsageGenericGUIAppControls,
 | |
|         pstrUsageACNew,
 | |
|         pstrUsageACOpen,
 | |
|         pstrUsageACClose,
 | |
|         pstrUsageACExit,
 | |
|         pstrUsageACMaximize,
 | |
|         pstrUsageACMinimize,
 | |
|         pstrUsageACSave,
 | |
|         pstrUsageACPrint,
 | |
|         pstrUsageACProperties,
 | |
|         pstrUsageACUndo,
 | |
|         pstrUsageACCopy,
 | |
|         pstrUsageACCut,
 | |
|         pstrUsageACPaste,
 | |
|         pstrUsageACSelectAll,
 | |
|         pstrUsageACFind,
 | |
|         pstrUsageACFindAndReplace,
 | |
|         pstrUsageACSearch,
 | |
|         pstrUsageACGoto,
 | |
|         pstrUsageACHome,
 | |
|         pstrUsageACBack,
 | |
|         pstrUsageACForward,
 | |
|         pstrUsageACStop,
 | |
|         pstrUsageACRefresh,
 | |
|         pstrUsageACPreviousLink,
 | |
|         pstrUsageACNextLink,
 | |
|         pstrUsageACBookmarks,
 | |
|         pstrUsageACHistory,
 | |
|         pstrUsageACSubscriptions,
 | |
|         pstrUsageACZoomIn,
 | |
|         pstrUsageACZoomOut,
 | |
|         pstrUsageACZoom,
 | |
|         pstrUsageACFullScreenView,
 | |
|         pstrUsageACNormalView,
 | |
|         pstrUsageACViewToggle,
 | |
|         pstrUsageACScrollUp,
 | |
|         pstrUsageACScrollDown,
 | |
|         pstrUsageACScroll,
 | |
|         pstrUsageACPanLeft,
 | |
|         pstrUsageACPanRight,
 | |
|         pstrUsageACPan,
 | |
|         pstrUsageACNewWindow,
 | |
|         pstrUsageACTileHoriz,
 | |
|         pstrUsageACTileVert,
 | |
|         pstrUsageACFormat,
 | |
|         pstrUsageACEdit,
 | |
|         pstrUsageACBold,
 | |
|         pstrUsageACItalics,
 | |
|         pstrUsageACUnderline,
 | |
|         pstrUsageACStrikethrough,
 | |
|         pstrUsageACSubscript,
 | |
|         pstrUsageACSuperscript,
 | |
|         pstrUsageACAllCaps,
 | |
|         pstrUsageACRotate,
 | |
|         pstrUsageACResize,
 | |
|         pstrUsageACFlipHorizontal,
 | |
|         pstrUsageACFlipVertical,
 | |
|         pstrUsageACMirrorHorizontal,
 | |
|         pstrUsageACMirrorVertical,
 | |
|         pstrUsageACFontSelect,
 | |
|         pstrUsageACFontColor,
 | |
|         pstrUsageACFontSize,
 | |
|         pstrUsageACJustifyLeft,
 | |
|         pstrUsageACJustifyCenterH,
 | |
|         pstrUsageACJustifyRight,
 | |
|         pstrUsageACJustifyBlockH,
 | |
|         pstrUsageACJustifyTop,
 | |
|         pstrUsageACJustifyCenterV,
 | |
|         pstrUsageACJustifyBottom,
 | |
|         pstrUsageACJustifyBlockV,
 | |
|         pstrUsageACIndentDecrease,
 | |
|         pstrUsageACIndentIncrease,
 | |
|         pstrUsageACNumberedList,
 | |
|         pstrUsageACRestartNumbering,
 | |
|         pstrUsageACBulletedList,
 | |
|         pstrUsageACPromote,
 | |
|         pstrUsageACDemote,
 | |
|         pstrUsageACYes,
 | |
|         pstrUsageACNo,
 | |
|         pstrUsageACCancel,
 | |
|         pstrUsageACCatalog,
 | |
|         pstrUsageACBuyChkout,
 | |
|         pstrUsageACAddToCart,
 | |
|         pstrUsageACExpand,
 | |
|         pstrUsageACExpandAll,
 | |
|         pstrUsageACCollapse,
 | |
|         pstrUsageACCollapseAll,
 | |
|         pstrUsageACPrintPreview,
 | |
|         pstrUsageACPasteSpecial,
 | |
|         pstrUsageACInsertMode,
 | |
|         pstrUsageACDelete,
 | |
|         pstrUsageACLock,
 | |
|         pstrUsageACUnlock,
 | |
|         pstrUsageACProtect,
 | |
|         pstrUsageACUnprotect,
 | |
|         pstrUsageACAttachComment,
 | |
|         pstrUsageACDeleteComment,
 | |
|         pstrUsageACViewComment,
 | |
|         pstrUsageACSelectWord,
 | |
|         pstrUsageACSelectSentence,
 | |
|         pstrUsageACSelectParagraph,
 | |
|         pstrUsageACSelectColumn,
 | |
|         pstrUsageACSelectRow,
 | |
|         pstrUsageACSelectTable,
 | |
|         pstrUsageACSelectObject,
 | |
|         pstrUsageACRedoRepeat,
 | |
|         pstrUsageACSort,
 | |
|         pstrUsageACSortAscending,
 | |
|         pstrUsageACSortDescending,
 | |
|         pstrUsageACFilter,
 | |
|         pstrUsageACSetClock,
 | |
|         pstrUsageACViewClock,
 | |
|         pstrUsageACSelectTimeZone,
 | |
|         pstrUsageACEditTimeZone,
 | |
|         pstrUsageACSetAlarm,
 | |
|         pstrUsageACClearAlarm,
 | |
|         pstrUsageACSnoozeAlarm,
 | |
|         pstrUsageACResetAlarm,
 | |
|         pstrUsageACSyncronize,
 | |
|         pstrUsageACSendReceive,
 | |
|         pstrUsageACSendTo,
 | |
|         pstrUsageACReply,
 | |
|         pstrUsageACReplyAll,
 | |
|         pstrUsageACForwardMessage,
 | |
|         pstrUsageACSend,
 | |
|         pstrUsageACAttachFile,
 | |
|         pstrUsageACUpload,
 | |
|         pstrUsageACDownload,
 | |
|         pstrUsageACSetBorders,
 | |
|         pstrUsageACInsertRow,
 | |
|         pstrUsageACInsertColumn,
 | |
|         pstrUsageACInsertFile,
 | |
|         pstrUsageACInsertPicture,
 | |
|         pstrUsageACInsertObject,
 | |
|         pstrUsageACInsertSymbol,
 | |
|         pstrUsageACSaveAndClose,
 | |
|         pstrUsageACRename,
 | |
|         pstrUsageACMerge,
 | |
|         pstrUsageACSplit,
 | |
|         pstrUsageACDistributeHorizontaly,
 | |
|         pstrUsageACDistributeVerticaly
 | |
| };
 | |
| const char * const ReportDescParserBase::digitTitles0[] PROGMEM = {
 | |
|         pstrUsageDigitizer,
 | |
|         pstrUsagePen,
 | |
|         pstrUsageLightPen,
 | |
|         pstrUsageTouchScreen,
 | |
|         pstrUsageTouchPad,
 | |
|         pstrUsageWhiteBoard,
 | |
|         pstrUsageCoordinateMeasuringMachine,
 | |
|         pstrUsage3DDigitizer,
 | |
|         pstrUsageStereoPlotter,
 | |
|         pstrUsageArticulatedArm,
 | |
|         pstrUsageArmature,
 | |
|         pstrUsageMultiplePointDigitizer,
 | |
|         pstrUsageFreeSpaceWand
 | |
| };
 | |
| const char * const ReportDescParserBase::digitTitles1[] PROGMEM = {
 | |
|         pstrUsageStylus,
 | |
|         pstrUsagePuck,
 | |
|         pstrUsageFinger
 | |
| 
 | |
| };
 | |
| const char * const ReportDescParserBase::digitTitles2[] PROGMEM = {
 | |
|         pstrUsageTipPressure,
 | |
|         pstrUsageBarrelPressure,
 | |
|         pstrUsageInRange,
 | |
|         pstrUsageTouch,
 | |
|         pstrUsageUntouch,
 | |
|         pstrUsageTap,
 | |
|         pstrUsageQuality,
 | |
|         pstrUsageDataValid,
 | |
|         pstrUsageTransducerIndex,
 | |
|         pstrUsageTabletFunctionKeys,
 | |
|         pstrUsageProgramChangeKeys,
 | |
|         pstrUsageBatteryStrength,
 | |
|         pstrUsageInvert,
 | |
|         pstrUsageXTilt,
 | |
|         pstrUsageYTilt,
 | |
|         pstrUsageAzimuth,
 | |
|         pstrUsageAltitude,
 | |
|         pstrUsageTwist,
 | |
|         pstrUsageTipSwitch,
 | |
|         pstrUsageSecondaryTipSwitch,
 | |
|         pstrUsageBarrelSwitch,
 | |
|         pstrUsageEraser,
 | |
|         pstrUsageTabletPick
 | |
| };
 | |
| const char * const ReportDescParserBase::aplphanumTitles0[] PROGMEM = {
 | |
|         pstrUsageAlphanumericDisplay,
 | |
|         pstrUsageBitmappedDisplay
 | |
| };
 | |
| const char * const ReportDescParserBase::aplphanumTitles1[] PROGMEM = {
 | |
|         pstrUsageDisplayAttributesReport,
 | |
|         pstrUsageASCIICharacterSet,
 | |
|         pstrUsageDataReadBack,
 | |
|         pstrUsageFontReadBack,
 | |
|         pstrUsageDisplayControlReport,
 | |
|         pstrUsageClearDisplay,
 | |
|         pstrUsageDisplayEnable,
 | |
|         pstrUsageScreenSaverDelay,
 | |
|         pstrUsageScreenSaverEnable,
 | |
|         pstrUsageVerticalScroll,
 | |
|         pstrUsageHorizontalScroll,
 | |
|         pstrUsageCharacterReport,
 | |
|         pstrUsageDisplayData,
 | |
|         pstrUsageDisplayStatus,
 | |
|         pstrUsageStatusNotReady,
 | |
|         pstrUsageStatusReady,
 | |
|         pstrUsageErrorNotALoadableCharacter,
 | |
|         pstrUsageErrorFotDataCanNotBeRead,
 | |
|         pstrUsageCursorPositionReport,
 | |
|         pstrUsageRow,
 | |
|         pstrUsageColumn,
 | |
|         pstrUsageRows,
 | |
|         pstrUsageColumns,
 | |
|         pstrUsageCursorPixelPosition,
 | |
|         pstrUsageCursorMode,
 | |
|         pstrUsageCursorEnable,
 | |
|         pstrUsageCursorBlink,
 | |
|         pstrUsageFontReport,
 | |
|         pstrUsageFontData,
 | |
|         pstrUsageCharacterWidth,
 | |
|         pstrUsageCharacterHeight,
 | |
|         pstrUsageCharacterSpacingHorizontal,
 | |
|         pstrUsageCharacterSpacingVertical,
 | |
|         pstrUsageUnicodeCharset,
 | |
|         pstrUsageFont7Segment,
 | |
|         pstrUsage7SegmentDirectMap,
 | |
|         pstrUsageFont14Segment,
 | |
|         pstrUsage14SegmentDirectMap,
 | |
|         pstrUsageDisplayBrightness,
 | |
|         pstrUsageDisplayContrast,
 | |
|         pstrUsageCharacterAttribute,
 | |
|         pstrUsageAttributeReadback,
 | |
|         pstrUsageAttributeData,
 | |
|         pstrUsageCharAttributeEnhance,
 | |
|         pstrUsageCharAttributeUnderline,
 | |
|         pstrUsageCharAttributeBlink
 | |
| };
 | |
| const char * const ReportDescParserBase::aplphanumTitles2[] PROGMEM = {
 | |
|         pstrUsageBitmapSizeX,
 | |
|         pstrUsageBitmapSizeY,
 | |
|         pstrUsagePageReserved,
 | |
|         pstrUsageBitDepthFormat,
 | |
|         pstrUsageDisplayOrientation,
 | |
|         pstrUsagePaletteReport,
 | |
|         pstrUsagePaletteDataSize,
 | |
|         pstrUsagePaletteDataOffset,
 | |
|         pstrUsagePaletteData,
 | |
|         pstrUsageBlitReport,
 | |
|         pstrUsageBlitRectangleX1,
 | |
|         pstrUsageBlitRectangleY1,
 | |
|         pstrUsageBlitRectangleX2,
 | |
|         pstrUsageBlitRectangleY2,
 | |
|         pstrUsageBlitData,
 | |
|         pstrUsageSoftButton,
 | |
|         pstrUsageSoftButtonID,
 | |
|         pstrUsageSoftButtonSide,
 | |
|         pstrUsageSoftButtonOffset1,
 | |
|         pstrUsageSoftButtonOffset2,
 | |
|         pstrUsageSoftButtonReport
 | |
| };
 | |
| const char * const ReportDescParserBase::medInstrTitles0[] PROGMEM = {
 | |
|         pstrUsageVCRAcquisition,
 | |
|         pstrUsageFreezeThaw,
 | |
|         pstrUsageClipStore,
 | |
|         pstrUsageUpdate,
 | |
|         pstrUsageNext,
 | |
|         pstrUsageSave,
 | |
|         pstrUsagePrint,
 | |
|         pstrUsageMicrophoneEnable
 | |
| };
 | |
| const char * const ReportDescParserBase::medInstrTitles1[] PROGMEM = {
 | |
|         pstrUsageCine,
 | |
|         pstrUsageTransmitPower,
 | |
|         pstrUsageVolume,
 | |
|         pstrUsageFocus,
 | |
|         pstrUsageDepth
 | |
| };
 | |
| const char * const ReportDescParserBase::medInstrTitles2[] PROGMEM = {
 | |
|         pstrUsageSoftStepPrimary,
 | |
|         pstrUsageSoftStepSecondary
 | |
| };
 | |
| const char * const ReportDescParserBase::medInstrTitles3[] PROGMEM = {
 | |
|         pstrUsageZoomSelect,
 | |
|         pstrUsageZoomAdjust,
 | |
|         pstrUsageSpectralDopplerModeSelect,
 | |
|         pstrUsageSpectralDopplerModeAdjust,
 | |
|         pstrUsageColorDopplerModeSelect,
 | |
|         pstrUsageColorDopplerModeAdjust,
 | |
|         pstrUsageMotionModeSelect,
 | |
|         pstrUsageMotionModeAdjust,
 | |
|         pstrUsage2DModeSelect,
 | |
|         pstrUsage2DModeAdjust
 | |
| };
 | |
| const char * const ReportDescParserBase::medInstrTitles4[] PROGMEM = {
 | |
|         pstrUsageSoftControlSelect,
 | |
|         pstrUsageSoftControlAdjust
 | |
| };
 | |
| 
 | |
| void ReportDescParserBase::Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) {
 | |
|         uint16_t cntdn = (uint16_t)len;
 | |
|         uint8_t *p = (uint8_t*)pbuf;
 | |
| 
 | |
| 
 | |
|         totalSize = 0;
 | |
| 
 | |
|         while(cntdn) {
 | |
|                 //USB_HOST_SERIAL.println("");
 | |
|                 //PrintHex<uint16_t>(offset + len - cntdn);
 | |
|                 //USB_HOST_SERIAL.print(":");
 | |
| 
 | |
|                 ParseItem(&p, &cntdn);
 | |
| 
 | |
|                 //if (ParseItem(&p, &cntdn))
 | |
|                 //        return;
 | |
|         }
 | |
|         //USBTRACE2("Total:", totalSize);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintValue(uint8_t *p, uint8_t len) {
 | |
|         E_Notify(PSTR("("), 0x80);
 | |
|         for(; len; p++, len--)
 | |
|                 PrintHex<uint8_t > (*p, 0x80);
 | |
|         E_Notify(PSTR(")"), 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintByteValue(uint8_t data) {
 | |
|         E_Notify(PSTR("("), 0x80);
 | |
|         PrintHex<uint8_t > (data, 0x80);
 | |
|         E_Notify(PSTR(")"), 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintItemTitle(uint8_t prefix) {
 | |
|         switch(prefix & (TYPE_MASK | TAG_MASK)) {
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_PUSH):
 | |
|                         E_Notify(PSTR("\r\nPush"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_POP):
 | |
|                         E_Notify(PSTR("\r\nPop"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_USAGEPAGE):
 | |
|                         E_Notify(PSTR("\r\nUsage Page"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_LOGICALMIN):
 | |
|                         E_Notify(PSTR("\r\nLogical Min"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_LOGICALMAX):
 | |
|                         E_Notify(PSTR("\r\nLogical Max"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_PHYSMIN):
 | |
|                         E_Notify(PSTR("\r\nPhysical Min"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_PHYSMAX):
 | |
|                         E_Notify(PSTR("\r\nPhysical Max"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_UNITEXP):
 | |
|                         E_Notify(PSTR("\r\nUnit Exp"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_UNIT):
 | |
|                         E_Notify(PSTR("\r\nUnit"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_REPORTSIZE):
 | |
|                         E_Notify(PSTR("\r\nReport Size"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_REPORTCOUNT):
 | |
|                         E_Notify(PSTR("\r\nReport Count"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_GLOBAL | TAG_GLOBAL_REPORTID):
 | |
|                         E_Notify(PSTR("\r\nReport Id"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_LOCAL | TAG_LOCAL_USAGE):
 | |
|                         E_Notify(PSTR("\r\nUsage"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
 | |
|                         E_Notify(PSTR("\r\nUsage Min"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
 | |
|                         E_Notify(PSTR("\r\nUsage Max"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_MAIN | TAG_MAIN_COLLECTION):
 | |
|                         E_Notify(PSTR("\r\nCollection"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_MAIN | TAG_MAIN_ENDCOLLECTION):
 | |
|                         E_Notify(PSTR("\r\nEnd Collection"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_MAIN | TAG_MAIN_INPUT):
 | |
|                         E_Notify(PSTR("\r\nInput"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_MAIN | TAG_MAIN_OUTPUT):
 | |
|                         E_Notify(PSTR("\r\nOutput"), 0x80);
 | |
|                         break;
 | |
|                 case (TYPE_MAIN | TAG_MAIN_FEATURE):
 | |
|                         E_Notify(PSTR("\r\nFeature"), 0x80);
 | |
|                         break;
 | |
|         } // switch (**pp & (TYPE_MASK | TAG_MASK))
 | |
| }
 | |
| 
 | |
| uint8_t ReportDescParserBase::ParseItem(uint8_t **pp, uint16_t *pcntdn) {
 | |
|         //uint8_t ret = enErrorSuccess;
 | |
|         //reinterpret_cast<>(varBuffer);
 | |
|         switch(itemParseState) {
 | |
|                 case 0:
 | |
|                         if(**pp == HID_LONG_ITEM_PREFIX)
 | |
|                                 USBTRACE("\r\nLONG\r\n");
 | |
|                         else {
 | |
|                                 uint8_t size = ((**pp) & DATA_SIZE_MASK);
 | |
| 
 | |
|                                 itemPrefix = (**pp);
 | |
|                                 itemSize = 1 + ((size == DATA_SIZE_4) ? 4 : size);
 | |
| 
 | |
|                                 PrintItemTitle(itemPrefix);
 | |
|                         }
 | |
|                         (*pp)++;
 | |
|                         (*pcntdn)--;
 | |
|                         itemSize--;
 | |
|                         itemParseState = 1;
 | |
| 
 | |
|                         if(!itemSize)
 | |
|                                 break;
 | |
| 
 | |
|                         if(!pcntdn)
 | |
|                                 return enErrorIncomplete;
 | |
|                 case 1:
 | |
|                         //USBTRACE2("\r\niSz:",itemSize);
 | |
| 
 | |
|                         theBuffer.valueSize = itemSize;
 | |
|                         valParser.Initialize(&theBuffer);
 | |
|                         itemParseState = 2;
 | |
|                 case 2:
 | |
|                         if(!valParser.Parse(pp, pcntdn))
 | |
|                                 return enErrorIncomplete;
 | |
|                         itemParseState = 3;
 | |
|                 case 3:
 | |
|                 {
 | |
|                         uint8_t data = *((uint8_t*)varBuffer);
 | |
| 
 | |
|                         switch(itemPrefix & (TYPE_MASK | TAG_MASK)) {
 | |
|                                 case (TYPE_LOCAL | TAG_LOCAL_USAGE):
 | |
|                                         if(pfUsage) {
 | |
|                                                 if(theBuffer.valueSize > 1) {
 | |
|                                                         uint16_t* ui16 = reinterpret_cast<uint16_t *>(varBuffer);
 | |
|                                                         pfUsage(*ui16);
 | |
|                                                 } else
 | |
|                                                         pfUsage(data);
 | |
|                                         }
 | |
|                                         break;
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_REPORTSIZE):
 | |
|                                         rptSize = data;
 | |
|                                         PrintByteValue(data);
 | |
|                                         break;
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_REPORTCOUNT):
 | |
|                                         rptCount = data;
 | |
|                                         PrintByteValue(data);
 | |
|                                         break;
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_LOGICALMIN):
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_LOGICALMAX):
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_PHYSMIN):
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_PHYSMAX):
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_REPORTID):
 | |
|                                 case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
 | |
|                                 case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_UNITEXP):
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_UNIT):
 | |
|                                         PrintValue(varBuffer, theBuffer.valueSize);
 | |
|                                         break;
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_PUSH):
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_POP):
 | |
|                                         break;
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_USAGEPAGE):
 | |
|                                         SetUsagePage(data);
 | |
|                                         PrintUsagePage(data);
 | |
|                                         PrintByteValue(data);
 | |
|                                         break;
 | |
|                                 case (TYPE_MAIN | TAG_MAIN_COLLECTION):
 | |
|                                 case (TYPE_MAIN | TAG_MAIN_ENDCOLLECTION):
 | |
|                                         switch(data) {
 | |
|                                                 case 0x00:
 | |
|                                                         E_Notify(PSTR(" Physical"), 0x80);
 | |
|                                                         break;
 | |
|                                                 case 0x01:
 | |
|                                                         E_Notify(PSTR(" Application"), 0x80);
 | |
|                                                         break;
 | |
|                                                 case 0x02:
 | |
|                                                         E_Notify(PSTR(" Logical"), 0x80);
 | |
|                                                         break;
 | |
|                                                 case 0x03:
 | |
|                                                         E_Notify(PSTR(" Report"), 0x80);
 | |
|                                                         break;
 | |
|                                                 case 0x04:
 | |
|                                                         E_Notify(PSTR(" Named Array"), 0x80);
 | |
|                                                         break;
 | |
|                                                 case 0x05:
 | |
|                                                         E_Notify(PSTR(" Usage Switch"), 0x80);
 | |
|                                                         break;
 | |
|                                                 case 0x06:
 | |
|                                                         E_Notify(PSTR(" Usage Modifier"), 0x80);
 | |
|                                                         break;
 | |
|                                                 default:
 | |
|                                                         E_Notify(PSTR(" Vendor Defined("), 0x80);
 | |
|                                                         PrintHex<uint8_t > (data, 0x80);
 | |
|                                                         E_Notify(PSTR(")"), 0x80);
 | |
|                                         }
 | |
|                                         break;
 | |
|                                 case (TYPE_MAIN | TAG_MAIN_INPUT):
 | |
|                                 case (TYPE_MAIN | TAG_MAIN_OUTPUT):
 | |
|                                 case (TYPE_MAIN | TAG_MAIN_FEATURE):
 | |
|                                         totalSize += (uint16_t)rptSize * (uint16_t)rptCount;
 | |
|                                         rptSize = 0;
 | |
|                                         rptCount = 0;
 | |
|                                         E_Notify(PSTR("("), 0x80);
 | |
|                                         PrintBin<uint8_t > (data, 0x80);
 | |
|                                         E_Notify(PSTR(")"), 0x80);
 | |
|                                         break;
 | |
|                         } // switch (**pp & (TYPE_MASK | TAG_MASK))
 | |
|                 }
 | |
|         } // switch (itemParseState)
 | |
|         itemParseState = 0;
 | |
|         return enErrorSuccess;
 | |
| }
 | |
| 
 | |
| ReportDescParserBase::UsagePageFunc ReportDescParserBase::usagePageFunctions[] /*PROGMEM*/ = {
 | |
|         &ReportDescParserBase::PrintGenericDesktopPageUsage,
 | |
|         &ReportDescParserBase::PrintSimulationControlsPageUsage,
 | |
|         &ReportDescParserBase::PrintVRControlsPageUsage,
 | |
|         &ReportDescParserBase::PrintSportsControlsPageUsage,
 | |
|         &ReportDescParserBase::PrintGameControlsPageUsage,
 | |
|         &ReportDescParserBase::PrintGenericDeviceControlsPageUsage,
 | |
|         NULL, // Keyboard/Keypad
 | |
|         &ReportDescParserBase::PrintLEDPageUsage,
 | |
|         &ReportDescParserBase::PrintButtonPageUsage,
 | |
|         &ReportDescParserBase::PrintOrdinalPageUsage,
 | |
|         &ReportDescParserBase::PrintTelephonyPageUsage,
 | |
|         &ReportDescParserBase::PrintConsumerPageUsage,
 | |
|         &ReportDescParserBase::PrintDigitizerPageUsage,
 | |
|         NULL, // Reserved
 | |
|         NULL, // PID
 | |
|         NULL // Unicode
 | |
| };
 | |
| 
 | |
| void ReportDescParserBase::SetUsagePage(uint16_t page) {
 | |
|         pfUsage = NULL;
 | |
| 
 | |
|         if(VALUE_BETWEEN(page, 0x00, 0x11)) {
 | |
|                 pfUsage = (usagePageFunctions[page - 1]);
 | |
| 
 | |
|         } else {
 | |
|                 switch(page) {
 | |
|                         case 0x14:
 | |
|                                 pfUsage = &ReportDescParserBase::PrintAlphanumDisplayPageUsage;
 | |
|                                 break;
 | |
|                         case 0x40:
 | |
|                                 pfUsage = &ReportDescParserBase::PrintMedicalInstrumentPageUsage;
 | |
|                                 break;
 | |
|                 }
 | |
|         }
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintUsagePage(uint16_t page) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(page, 0x00, 0x11, w, E_Notify, usagePageTitles0, 0x80)
 | |
|         else output_if_between(page, 0x8b, 0x92, w, E_Notify, usagePageTitles1, 0x80)
 | |
|         else if(VALUE_BETWEEN(page, 0x7f, 0x84))
 | |
|                 E_Notify(pstrUsagePageMonitor, 0x80);
 | |
|         else if(VALUE_BETWEEN(page, 0x83, 0x8c))
 | |
|                 E_Notify(pstrUsagePagePower, 0x80);
 | |
|         else if(page > 0xfeff /* && page <= 0xffff */)
 | |
|                 E_Notify(pstrUsagePageVendorDefined, 0x80);
 | |
|         else
 | |
|                 switch(page) {
 | |
|                         case 0x14:
 | |
|                                 E_Notify(pstrUsagePageAlphaNumericDisplay, 0x80);
 | |
|                                 break;
 | |
|                         case 0x40:
 | |
|                                 E_Notify(pstrUsagePageMedicalInstruments, 0x80);
 | |
|                                 break;
 | |
|                         default:
 | |
|                                 E_Notify(pstrUsagePageUndefined, 0x80);
 | |
|                 }
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintButtonPageUsage(uint16_t usage) {
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
|         E_Notify(PSTR("Btn"), 0x80);
 | |
|         PrintHex<uint16_t > (usage, 0x80);
 | |
|         E_Notify(PSTR("\r\n"), 0x80);
 | |
|         //USB_HOST_SERIAL.print(usage, HEX);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintOrdinalPageUsage(uint16_t usage) {
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
|         E_Notify(PSTR("Inst"), 0x80);
 | |
|         // Sorry, HEX for now...
 | |
|         PrintHex<uint16_t > (usage, 0x80);
 | |
|         E_Notify(PSTR("\r\n"), 0x80);
 | |
|         //USB_HOST_SERIAL.print(usage, DEC);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintGenericDesktopPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x00, 0x0a, w, E_Notify, genDesktopTitles0, 0x80)
 | |
|         else output_if_between(usage, 0x2f, 0x49, w, E_Notify, genDesktopTitles1, 0x80)
 | |
|         else output_if_between(usage, 0x7f, 0x94, w, E_Notify, genDesktopTitles2, 0x80)
 | |
|         else output_if_between(usage, 0x9f, 0xa9, w, E_Notify, genDesktopTitles3, 0x80)
 | |
|         else output_if_between(usage, 0xaf, 0xb8, w, E_Notify, genDesktopTitles4, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintSimulationControlsPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x00, 0x0d, w, E_Notify, simuTitles0, 0x80)
 | |
|         else output_if_between(usage, 0x1f, 0x26, w, E_Notify, simuTitles1, 0x80)
 | |
|         else output_if_between(usage, 0xaf, 0xd1, w, E_Notify, simuTitles2, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintVRControlsPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x00, 0x0b, w, E_Notify, vrTitles0, 0x80)
 | |
|         else output_if_between(usage, 0x1f, 0x22, w, E_Notify, vrTitles1, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintSportsControlsPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x00, 0x05, w, E_Notify, sportsCtrlTitles0, 0x80)
 | |
|         else output_if_between(usage, 0x2f, 0x3a, w, E_Notify, sportsCtrlTitles1, 0x80)
 | |
|         else output_if_between(usage, 0x4f, 0x64, w, E_Notify, sportsCtrlTitles2, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintGameControlsPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x00, 0x04, w, E_Notify, gameTitles0, 0x80)
 | |
|         else output_if_between(usage, 0x1f, 0x3a, w, E_Notify, gameTitles1, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintGenericDeviceControlsPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x1f, 0x27, w, E_Notify, genDevCtrlTitles, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintLEDPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x00, 0x4e, w, E_Notify, ledTitles, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintTelephonyPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x00, 0x08, w, E_Notify, telTitles0, 0x80)
 | |
|         else output_if_between(usage, 0x1f, 0x32, w, E_Notify, telTitles1, 0x80)
 | |
|         else output_if_between(usage, 0x4f, 0x54, w, E_Notify, telTitles2, 0x80)
 | |
|         else output_if_between(usage, 0x6f, 0x75, w, E_Notify, telTitles3, 0x80)
 | |
|         else output_if_between(usage, 0x8f, 0x9f, w, E_Notify, telTitles4, 0x80)
 | |
|         else output_if_between(usage, 0xaf, 0xc0, w, E_Notify, telTitles5, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintConsumerPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x00, 0x07, w, E_Notify, consTitles0, 0x80)
 | |
|         else output_if_between(usage, 0x1f, 0x23, w, E_Notify, consTitles1, 0x80)
 | |
|         else output_if_between(usage, 0x2f, 0x37, w, E_Notify, consTitles2, 0x80)
 | |
|         else output_if_between(usage, 0x3f, 0x49, w, E_Notify, consTitles3, 0x80)
 | |
|         else output_if_between(usage, 0x5f, 0x67, w, E_Notify, consTitles4, 0x80)
 | |
|         else output_if_between(usage, 0x7f, 0xa5, w, E_Notify, consTitles5, 0x80)
 | |
|         else output_if_between(usage, 0xaf, 0xcf, w, E_Notify, consTitles6, 0x80)
 | |
|         else output_if_between(usage, 0xdf, 0xeb, w, E_Notify, consTitles7, 0x80)
 | |
|         else output_if_between(usage, 0xef, 0xf6, w, E_Notify, consTitles8, 0x80)
 | |
|         else output_if_between(usage, 0xff, 0x10e, w, E_Notify, consTitles9, 0x80)
 | |
|         else output_if_between(usage, 0x14f, 0x156, w, E_Notify, consTitlesA, 0x80)
 | |
|         else output_if_between(usage, 0x15f, 0x16b, w, E_Notify, consTitlesB, 0x80)
 | |
|         else output_if_between(usage, 0x16f, 0x175, w, E_Notify, consTitlesC, 0x80)
 | |
|         else output_if_between(usage, 0x17f, 0x1c8, w, E_Notify, consTitlesD, 0x80)
 | |
|         else output_if_between(usage, 0x1ff, 0x29d, w, E_Notify, consTitlesE, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintDigitizerPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x00, 0x0e, w, E_Notify, digitTitles0, 0x80)
 | |
|         else output_if_between(usage, 0x1f, 0x23, w, E_Notify, digitTitles1, 0x80)
 | |
|         else output_if_between(usage, 0x2f, 0x47, w, E_Notify, digitTitles2, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintAlphanumDisplayPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         output_if_between(usage, 0x00, 0x03, w, E_Notify, aplphanumTitles0, 0x80)
 | |
|         else output_if_between(usage, 0x1f, 0x4e, w, E_Notify, aplphanumTitles1, 0x80)
 | |
|         else output_if_between(usage, 0x7f, 0x96, w, E_Notify, digitTitles2, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| void ReportDescParserBase::PrintMedicalInstrumentPageUsage(uint16_t usage) {
 | |
|         const char * const * w;
 | |
|         E_Notify(pstrSpace, 0x80);
 | |
| 
 | |
|         if(usage == 1) E_Notify(pstrUsageMedicalUltrasound, 0x80);
 | |
|         else if(usage == 0x70)
 | |
|                 E_Notify(pstrUsageDepthGainCompensation, 0x80);
 | |
|         else output_if_between(usage, 0x1f, 0x28, w, E_Notify, medInstrTitles0, 0x80)
 | |
|         else output_if_between(usage, 0x3f, 0x45, w, E_Notify, medInstrTitles1, 0x80)
 | |
|         else output_if_between(usage, 0x5f, 0x62, w, E_Notify, medInstrTitles2, 0x80)
 | |
|         else output_if_between(usage, 0x7f, 0x8a, w, E_Notify, medInstrTitles3, 0x80)
 | |
|         else output_if_between(usage, 0x9f, 0xa2, w, E_Notify, medInstrTitles4, 0x80)
 | |
|         else E_Notify(pstrUsagePageUndefined, 0x80);
 | |
| }
 | |
| 
 | |
| uint8_t ReportDescParser2::ParseItem(uint8_t **pp, uint16_t *pcntdn) {
 | |
|         //uint8_t ret = enErrorSuccess;
 | |
| 
 | |
|         switch(itemParseState) {
 | |
|                 case 0:
 | |
|                         if(**pp == HID_LONG_ITEM_PREFIX)
 | |
|                                 USBTRACE("\r\nLONG\r\n");
 | |
|                         else {
 | |
|                                 uint8_t size = ((**pp) & DATA_SIZE_MASK);
 | |
|                                 itemPrefix = (**pp);
 | |
|                                 itemSize = 1 + ((size == DATA_SIZE_4) ? 4 : size);
 | |
|                         }
 | |
|                         (*pp)++;
 | |
|                         (*pcntdn)--;
 | |
|                         itemSize--;
 | |
|                         itemParseState = 1;
 | |
| 
 | |
|                         if(!itemSize)
 | |
|                                 break;
 | |
| 
 | |
|                         if(!pcntdn)
 | |
|                                 return enErrorIncomplete;
 | |
|                 case 1:
 | |
|                         theBuffer.valueSize = itemSize;
 | |
|                         valParser.Initialize(&theBuffer);
 | |
|                         itemParseState = 2;
 | |
|                 case 2:
 | |
|                         if(!valParser.Parse(pp, pcntdn))
 | |
|                                 return enErrorIncomplete;
 | |
|                         itemParseState = 3;
 | |
|                 case 3:
 | |
|                 {
 | |
|                         uint8_t data = *((uint8_t*)varBuffer);
 | |
| 
 | |
|                         switch(itemPrefix & (TYPE_MASK | TAG_MASK)) {
 | |
|                                 case (TYPE_LOCAL | TAG_LOCAL_USAGE):
 | |
|                                         if(pfUsage) {
 | |
|                                                 if(theBuffer.valueSize > 1) {
 | |
|                                                         uint16_t* ui16 = reinterpret_cast<uint16_t *>(varBuffer);
 | |
|                                                         pfUsage(*ui16);
 | |
|                                                 } else
 | |
|                                                         pfUsage(data);
 | |
|                                         }
 | |
|                                         break;
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_REPORTSIZE):
 | |
|                                         rptSize = data;
 | |
|                                         break;
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_REPORTCOUNT):
 | |
|                                         rptCount = data;
 | |
|                                         break;
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_REPORTID):
 | |
|                                         rptId = data;
 | |
|                                         break;
 | |
|                                 case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
 | |
|                                         useMin = data;
 | |
|                                         break;
 | |
|                                 case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
 | |
|                                         useMax = data;
 | |
|                                         break;
 | |
|                                 case (TYPE_GLOBAL | TAG_GLOBAL_USAGEPAGE):
 | |
|                                         SetUsagePage(data);
 | |
|                                         break;
 | |
|                                 case (TYPE_MAIN | TAG_MAIN_OUTPUT):
 | |
|                                 case (TYPE_MAIN | TAG_MAIN_FEATURE):
 | |
|                                         rptSize = 0;
 | |
|                                         rptCount = 0;
 | |
|                                         useMin = 0;
 | |
|                                         useMax = 0;
 | |
|                                         break;
 | |
|                                 case (TYPE_MAIN | TAG_MAIN_INPUT):
 | |
|                                         OnInputItem(data);
 | |
| 
 | |
|                                         totalSize += (uint16_t)rptSize * (uint16_t)rptCount;
 | |
| 
 | |
|                                         rptSize = 0;
 | |
|                                         rptCount = 0;
 | |
|                                         useMin = 0;
 | |
|                                         useMax = 0;
 | |
|                                         break;
 | |
|                         } // switch (**pp & (TYPE_MASK | TAG_MASK))
 | |
|                 }
 | |
|         } // switch (itemParseState)
 | |
|         itemParseState = 0;
 | |
|         return enErrorSuccess;
 | |
| }
 | |
| 
 | |
| void ReportDescParser2::OnInputItem(uint8_t itm) {
 | |
|         uint8_t byte_offset = (totalSize >> 3); // calculate offset to the next unhandled byte i = (int)(totalCount / 8);
 | |
|         uint32_t tmp = (byte_offset << 3);
 | |
|         uint8_t bit_offset = totalSize - tmp; // number of bits in the current byte already handled
 | |
|         uint8_t *p = pBuf + byte_offset; // current byte pointer
 | |
| 
 | |
|         if(bit_offset)
 | |
|                 *p >>= bit_offset;
 | |
| 
 | |
|         uint8_t usage = useMin;
 | |
| 
 | |
|         bool print_usemin_usemax = ((useMin < useMax) && ((itm & 3) == 2) && pfUsage) ? true : false;
 | |
| 
 | |
|         uint8_t bits_of_byte = 8;
 | |
| 
 | |
|         // for each field in field array defined by rptCount
 | |
|         for(uint8_t field = 0; field < rptCount; field++, usage++) {
 | |
| 
 | |
|                 union {
 | |
|                         uint8_t bResult[4];
 | |
|                         uint16_t wResult[2];
 | |
|                         uint32_t dwResult;
 | |
|                 } result;
 | |
| 
 | |
|                 result.dwResult = 0;
 | |
|                 uint8_t mask = 0;
 | |
| 
 | |
|                 if(print_usemin_usemax)
 | |
|                         pfUsage(usage);
 | |
| 
 | |
|                 // bits_left            - number of bits in the field(array of fields, depending on Report Count) left to process
 | |
|                 // bits_of_byte         - number of bits in current byte left to process
 | |
|                 // bits_to_copy         - number of bits to copy to result buffer
 | |
| 
 | |
|                 // for each bit in a field
 | |
|                 for(uint8_t bits_left = rptSize, bits_to_copy = 0; bits_left;
 | |
|                         bits_left -= bits_to_copy) {
 | |
|                         bits_to_copy = (bits_left > bits_of_byte) ? bits_of_byte : bits_left;
 | |
| 
 | |
|                         result.dwResult <<= bits_to_copy; // Result buffer is shifted by the number of bits to be copied into it
 | |
| 
 | |
|                         uint8_t val = *p;
 | |
| 
 | |
|                         val >>= (8 - bits_of_byte); // Shift by the number of bits already processed
 | |
| 
 | |
|                         mask = 0;
 | |
| 
 | |
|                         for(uint8_t j = bits_to_copy; j; j--) {
 | |
|                                 mask <<= 1;
 | |
|                                 mask |= 1;
 | |
|                         }
 | |
| 
 | |
|                         result.bResult[0] = (result.bResult[0] | (val & mask));
 | |
| 
 | |
|                         bits_of_byte -= bits_to_copy;
 | |
| 
 | |
|                         if(bits_of_byte < 1) {
 | |
|                                 bits_of_byte = 8;
 | |
|                                 p++;
 | |
|                         }
 | |
|                 }
 | |
|                 PrintByteValue(result.dwResult);
 | |
|         }
 | |
|         E_Notify(PSTR("\r\n"), 0x80);
 | |
| }
 | |
| 
 | |
| void UniversalReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
 | |
|         ReportDescParser2 prs(len, buf);
 | |
| 
 | |
|         uint8_t ret = hid->GetReportDescr(0, &prs);
 | |
| 
 | |
|         if(ret)
 | |
|                 ErrorMessage<uint8_t > (PSTR("GetReportDescr-2"), ret);
 | |
| }
 |