// Copyright 2019 The Fuchsia 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 HID_PARSER_REPORT_H_
#define HID_PARSER_REPORT_H_

#include <stdint.h>
#include <stdlib.h>

#include <hid-parser/parser.h>
#include <hid-parser/units.h>

namespace hid {

// Extracts |value_out| from |report| as the closest unit type to |attr.unit|. The unit type
// can be gotten from the |GetUnitTypeFromUnit| function. This is the recommended
// extraction function for the users of this library.
bool ExtractAsUnitType(const uint8_t* report, size_t report_len, const hid::Attributes& attr,
                       double* value_out);
// Inserts |value_in| into |report|. This function assumes that |value_in| is in the
// unit type closest to |attr.unit|.
bool InsertAsUnitType(uint8_t* report, size_t report_len, const hid::Attributes& attr,
                      double value_in);

// Extracts |value_out| from |report| and ensures that is in the units
// specified by |attr|.
bool ExtractAsUnit(const uint8_t* report, size_t report_len, const hid::Attributes& attr,
                   double* value_out);
// Inserts |value_in| into |report| after it has been translated into
// the logical units described by |attr|.
bool InsertAsUnit(uint8_t* report, size_t report_len, const hid::Attributes& attr, double value_in);

// Extracts |value_out| from |report| and converts it into the units
// specified by |unit_out|.
bool ExtractWithUnit(const uint8_t* report, size_t report_len, const hid::Attributes& attr,
                     const Unit& unit_out, double* value_out);
// Given |value_in| with units |unit_in|, it converts it to |attr.unit| and
// then inserts it into |report|.
bool InsertWithUnit(uint8_t* report, size_t report_len, const hid::Attributes& attr,
                    const Unit& unit_in, double value_in);

// Helper functions that extracts the raw byte data from a report. This is only
// recommended for users that know what they are doing and are willing to
// use raw data or do their own conversion between logical and physical values.
bool ExtractUint(const uint8_t* report, size_t report_len, const hid::Attributes& attr,
                 uint8_t* value_out);
bool ExtractUint(const uint8_t* report, size_t report_len, const hid::Attributes& attr,
                 uint16_t* value_out);
bool ExtractUint(const uint8_t* report, size_t report_len, const hid::Attributes& attr,
                 uint32_t* value_out);

bool InsertUint(uint8_t* report, size_t report_len, const hid::Attributes& attr, uint32_t value_in);

}  // namespace hid

#endif  // HID_PARSER_REPORT_H_
