/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef HIDUTIL_HIDDEFS_H_
#define HIDUTIL_HIDDEFS_H_

namespace HidUtil {

// HID specification constants definition
//
// Definitions are from HID specification v1.11, which can be obtained from http://www.usb.org
//
// Preferred namespace for namespace restriction than enum class as enum class has strong type
// which is inconvenient in a parser, in which input binary values has to be compared with these
// definitions frequnetly.
namespace HidDef {
// Hid spec 6.2.2.3
namespace TagType {
enum {
    MAIN,
    GLOBAL,
    LOCAL,
    RESERVED
};
} // namespace TagType

// HID spec 6.2.2.4
namespace ReportFlag {
enum {
    DATA_CONST = 1,
    ARRAY_VARIABLE = 2,
    WRAP = 4,
    NONLINEAR = 8,
    NO_PREFERRED = 0x10,
    NULL_STATE = 0x20,
    VOLATILE = 0x40,
    // bit 7 reserved
    BUFFERED_BYTES = 0x100
};
} // namespace ReportFlag

// HID spec 6.2.2.5
namespace MainTag {
enum {
    INPUT = 8,
    OUTPUT = 9,
    COLLECTION = 10,
    FEATURE = 11,
    END_COLLECTION = 12,
    LONG_ITEM = 15,
};
} // namespace MainTag

// HID spec 6.2.2.6
namespace CollectionType {
enum {
    PHYSICAL = 0,
    APPLICATION,
    LOGICAL,
    REPORT,
    NAMED_ARRAY,
    USAGE_SWITCH,
    USAGE_MODIFIER
};
} // namespace CollectionType

// HID spec 6.2.2.7
namespace GlobalTag {
enum {
    USAGE_PAGE,
    LOGICAL_MINIMUM,
    LOGICAL_MAXIMUM,
    PHYSICAL_MINIMUM,
    PHYSICAL_MAXIMUM,
    UNIT_EXPONENT,
    UNIT,
    REPORT_SIZE,
    REPORT_ID,
    REPORT_COUNT,
    PUSH,
    POP
};
} //namespace GlobalTag

// HID spec 6.2.2.8
namespace LocalTag {
enum HidLocalTag {
    USAGE,
    USAGE_MINIMUM,
    USAGE_MAXIMUM,
    DESIGNATOR_INDEX,
    DESIGNATOR_MINIMUM,
    DESIGNATOR_MAXIMUM,
    // there is a hole here in the spec
    STRING_INDEX = 7,
    STRING_MINIMUM,
    STRING_MAXIMUM,
    DELIMITOR
};
} // namespace LocalTag

} //namespace HidDef
} //namespace HidUtil

#endif // HIDUTIL_HIDDEFS_H_