/*
 * 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_HIDGLOBAL_H_
#define HIDUTIL_HIDGLOBAL_H_

#include "HidItem.h"
#include "TriState.h"

namespace HidUtil {
// A set of global states that parser has to keep track during parsing.
// They are all specified in HID spec v1.11 section 6.2.2.7
struct HidGlobal {
    // add a token and change global states, returns value indicates if operation is successful
    bool append(const HidItem &i);

    tri_uint usagePage;
    tri_int  logicalMin;
    tri_int  logicalMax;
    tri_int  physicalMin;
    tri_int  physicalMax;
    tri_uint exponent;
    tri_uint unit;
    tri_uint reportSize;
    tri_uint reportId;
    tri_uint reportCount;
};

// HID specs allows PUSH and POP to save a snapshot of current global states and come back to the
// saved sates later. HidStack manages this logic. Note that PUSH and POP are also HidItems, so
// there is no explicit push and pop function in this stack implementation.
class HidGlobalStack {
public:
    HidGlobalStack();

    // add a token and change global states, returns value indicates if operation is successful
    // it the token is push/pop, the stack push/pop accordingly.
    bool append(const HidItem &i);

    // get reference to top element on the stack
    const HidGlobal& top() const;
private:
    std::vector<HidGlobal> mStack;
};

} //namespace HidUtil

#endif // HIDUTIL_HIDGLOABL_H_