ArduinoCore-samd/libraries/USBHost/src/hidescriptorparser.cpp
Henry Gabryjelski c68c0b19ae Disable -Wimplicit-fallthrough in sections
These two files contain code with switch statements,
where one case "fall through" to the next case.
As it's not currently clear if this is intentional or not,
rather than modifying the code in any way (regression risk),
use GCC diagnostic pragmas to disable this warning for
only these two files, with BUGBUG marking to encourage
review by someone more familiar with this code.
2020-01-17 01:16:20 -08:00

1619 lines
60 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 uint32_t len, const uint8_t *pbuf, const uint32_t & /* offset */) {
uint32_t cntdn = (uint32_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))
}
#pragma GCC diagnostic push // Available since GCC 4.6.4
/*
* BUGBUG -- Enabled and review all `-Wimplicit-fallthrough` messages
* This code has multiple switch statements that "fall through" to the
* next case -- but it's not always clear if this is intentional or not.
* Review and commenting of code, and reducing cyclomatic complexity
* are highly recommended....
*/
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
uint8_t ReportDescParserBase::ParseItem(uint8_t **pp, uint32_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;
}
#pragma GCC diagnostic pop
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]);
// Dead code...
//
// pfUsage = (UsagePageFunc)pgm_read_pointer(usagePageFunctions[page - 1]);
//else if (page > 0x7f && page < 0x84)
// E_Notify(pstrUsagePageMonitor);
//else if (page > 0x83 && page < 0x8c)
// E_Notify(pstrUsagePagePower);
//else if (page > 0x8b && page < 0x92)
// E_Notify((char*)pgm_read_pointer(&usagePageTitles1[page - 0x8c]));
//else if (page > 0xfeff && page <= 0xffff)
// E_Notify(pstrUsagePageVendorDefined);
//
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);
}
#pragma GCC diagnostic push // Available since GCC 4.6.4
/*
* BUGBUG -- Enabled and review all `-Wimplicit-fallthrough` messages
* This code has multiple switch statements that "fall through" to the
* next case -- but it's not always clear if this is intentional or not.
* Review and commenting of code, and reducing cyclomatic complexity
* are highly recommended....
*/
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
uint8_t ReportDescParser2::ParseItem(uint8_t **pp, uint32_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;
}
#pragma GCC diagnostic pop
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, uint32_t /* is_rpt_id */, uint32_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);
}