blob: 76cbd4842dbeaa16093f2861f933b0daaa8628a1 [file] [log] [blame]
// Copyright 2018 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.
#include "hid-parser.h"
#include <hid-parser/item.h>
#include <hid-parser/parser.h>
#include <hid-parser/usages.h>
#include <stdlib.h>
#include <string.h>
zx_status_t hid_lib_parse_reports(const uint8_t* buf, const size_t buf_len,
hid_reports_t* reports) {
hid::DeviceDescriptor* desc = nullptr;
auto res = hid::ParseReportDescriptor(buf, buf_len, &desc);
if (res != hid::ParseResult::kParseOk) {
return -1;
}
for (size_t item = 0; item < desc->rep_count; item++) {
hid::ReportDescriptor* desc_rep = &desc->report[item];
hid_report_size_t* hiddev_rep = &reports->sizes[item];
hiddev_rep->id = desc_rep->report_id;
if (hiddev_rep->id != 0) {
reports->has_rpt_id = true;
}
reports->num_reports++;
for (size_t i = 0; i < desc_rep->count; i++) {
hid::ReportField* field = desc_rep->first_field + i;
input_report_size_t size = field->attr.bit_sz;
switch (field->type) {
case hid::kInput:
hiddev_rep->in_size = static_cast<input_report_size_t>(hiddev_rep->in_size + size);
break;
case hid::kOutput:
hiddev_rep->out_size = static_cast<input_report_size_t>(hiddev_rep->out_size
+ size);
break;
case hid::kFeature:
hiddev_rep->feat_size = static_cast<input_report_size_t>(hiddev_rep->feat_size
+ size);
break;
}
}
}
FreeDeviceDescriptor(desc);
return ZX_OK;
}