// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef DEVICE_HID_HID_USAGE_AND_PAGE_H_
#define DEVICE_HID_HID_USAGE_AND_PAGE_H_

#include "base/basictypes.h"

namespace device {

struct HidUsageAndPage {
  enum Page {
    kPageUndefined = 0x00,
    kPageGenericDesktop = 0x01,
    kPageSimulation = 0x02,
    kPageVirtualReality = 0x03,
    kPageSport = 0x04,
    kPageGame = 0x05,
    kPageKeyboard = 0x07,
    kPageLed = 0x08,
    kPageButton = 0x09,
    kPageOrdinal = 0x0A,
    kPageTelephony = 0x0B,
    kPageConsumer = 0x0C,
    kPageDigitizer = 0x0D,
    kPagePidPage = 0x0F,
    kPageUnicode = 0x10,
    kPageAlphanumericDisplay = 0x14,
    kPageMedicalInstruments = 0x40,
    kPageMonitor0 = 0x80,
    kPageMonitor1 = 0x81,
    kPageMonitor2 = 0x82,
    kPageMonitor3 = 0x83,
    kPagePower0 = 0x84,
    kPagePower1 = 0x85,
    kPagePower2 = 0x86,
    kPagePower3 = 0x87,
    kPageBarCodeScanner = 0x8C,
    kPageScale = 0x8D,
    kPageMagneticStripeReader = 0x8E,
    kPageReservedPointOfSale = 0x8F,
    kPageCameraControl = 0x90,
    kPageArcade = 0x91,
    kPageVendor = 0xFF00,
    kPageMediaCenter = 0xFFBC
  };

  // These usage enumerations are derived from the HID Usage Tables v1.11 spec.
  enum GenericDesktopUsage {
    kGenericDesktopUndefined = 0,
    kGenericDesktopPointer = 1,
    kGenericDesktopMouse = 2,
    kGenericDesktopJoystick = 4,
    kGenericDesktopGamePad = 5,
    kGenericDesktopKeyboard = 6,
    kGenericDesktopKeypad = 7,
    kGenericDesktopMultiAxisController = 8,
    kGenericDesktopX = 0x30,
    kGenericDesktopY = 0x31,
    kGenericDesktopZ = 0x32,
    kGenericDesktopRx = 0x33,
    kGenericDesktopRy = 0x34,
    kGenericDesktopRz = 0x35,
    kGenericDesktopSlider = 0x36,
    kGenericDesktopDial = 0x37,
    kGenericDesktopWheel = 0x38,
    kGenericDesktopHatSwitch = 0x39,
    kGenericDesktopCountedBuffer = 0x3a,
    kGenericDesktopByteCount = 0x3b,
    kGenericDesktopMotionWakeup = 0x3c,
    kGenericDesktopStart = 0x3d,
    kGenericDesktopSelect = 0x3e,
    kGenericDesktopVx = 0x40,
    kGenericDesktopVy = 0x41,
    kGenericDesktopVz = 0x42,
    kGenericDesktopVbrx = 0x43,
    kGenericDesktopVbry = 0x44,
    kGenericDesktopVbrz = 0x45,
    kGenericDesktopVno = 0x46,

    kGenericDesktopSystemControl = 0x80,
    kGenericDesktopSystemPowerDown = 0x81,
    kGenericDesktopSystemSleep = 0x82,
    kGenericDesktopSystemWakeUp = 0x83,
    kGenericDesktopSystemContextMenu = 0x84,
    kGenericDesktopSystemMainMenu = 0x85,
    kGenericDesktopSystemAppMenu = 0x86,
    kGenericDesktopSystemMenuHelp = 0x87,
    kGenericDesktopSystemMenuExit = 0x88,
    kGenericDesktopSystemMenuSelect = 0x89,
    kGenericDesktopSystemMenuRight = 0x8a,
    kGenericDesktopSystemMenuLeft = 0x8b,
    kGenericDesktopSystemMenuUp = 0x8c,
    kGenericDesktopSystemMenuDown = 0x8d,
    kGenericDesktopSystemColdRestart = 0x8e,
    kGenericDesktopSystemWarmRestart = 0x8f,

    kGenericDesktopDPadUp = 0x90,
    kGenericDesktopDPadDown = 0x91,
    kGenericDesktopDPadLeft = 0x92,
    kGenericDesktopDPadRight = 0x93,

    kGenericDesktopSystemDock = 0xa0,
    kGenericDesktopSystemUndock = 0xa1,
    kGenericDesktopSystemSetup = 0xa2,
    kGenericDesktopSystemBreak = 0xa3,
    kGenericDesktopSystemDebuggerBreak = 0xa4,
    kGenericDesktopApplicationBreak = 0xa5,
    kGenericDesktopApplicationDebuggerBreak = 0xa6,
    kGenericDesktopSystemSpeakerMute = 0xa7,
    kGenericDesktopSystemHibernate = 0xa8,
    kGenericDesktopSystemDisplayInvert = 0xb0,
    kGenericDesktopSystemDisplayInternal = 0xb1,
    kGenericDesktopSystemDisplayExternal = 0xb2,
    kGenericDesktopSystemDisplayBoth = 0xb3,
    kGenericDesktopSystemDisplayDual = 0xb4,
    kGenericDesktopSystemDisplayToggle = 0xb5,
    kGenericDesktopSystemDisplaySwap = 0xb6,
  };

  HidUsageAndPage(uint16_t usage, Page usage_page)
      : usage(usage), usage_page(usage_page) {}
  ~HidUsageAndPage() {}

  uint16_t usage;
  Page usage_page;

  // Indicates whether this usage is protected by Chrome.
  bool IsProtected() const;
};

}  // namespace device

#endif  // DEVICE_HID_HID_USAGE_AND_PAGE_H_