/* 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(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 (*p, 0x80); E_Notify(PSTR(")"), 0x80); } void ReportDescParserBase::PrintByteValue(uint8_t data) { E_Notify(PSTR("("), 0x80); PrintHex (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(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 (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 (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 (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 (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(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 (PSTR("GetReportDescr-2"), ret); }