[go: nahoru, domu]

blob: d38b09b4905bbe4292ebb8488516968e4bf2d4b6 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/device/public/cpp/hid/hid_report_item.h"
#include "services/device/public/mojom/hid.mojom.h"
namespace device {
namespace {
mojom::HidUsageAndPagePtr ConvertUsageToMojo(uint32_t usage) {
uint16_t usage_id = usage & 0xffff;
uint16_t usage_page = (usage >> 16) & 0xffff;
return mojom::HidUsageAndPage::New(usage_id, usage_page);
}
} // namespace
HidReportItem::HidReportItem(HidReportDescriptorItem::Tag tag,
uint32_t short_data,
const HidItemStateTable& state)
: tag_(tag),
report_info_(
*reinterpret_cast<HidReportDescriptorItem::ReportInfo*>(&short_data)),
report_id_(state.report_id),
local_(state.local),
global_(state.global_stack.empty()
? HidItemStateTable::HidGlobalItemState()
: state.global_stack.back()),
is_range_(state.local.usage_minimum != state.local.usage_maximum) {
if (state.local.string_index) {
local_.string_minimum = state.local.string_index;
local_.string_maximum = state.local.string_index;
}
if (state.local.designator_index) {
local_.designator_minimum = state.local.designator_index;
local_.designator_maximum = state.local.designator_index;
}
}
HidReportItem::~HidReportItem() = default;
mojom::HidReportItemPtr HidReportItem::ToMojo() const {
auto report_item = mojom::HidReportItem::New();
report_item->is_range = is_range_;
// Data associated with the Main item.
report_item->is_constant = report_info_.data_or_constant;
report_item->is_variable = report_info_.array_or_variable;
report_item->is_relative = report_info_.absolute_or_relative;
report_item->wrap = report_info_.wrap;
report_item->is_non_linear = report_info_.linear;
report_item->no_preferred_state = report_info_.preferred;
report_item->has_null_position = report_info_.null;
report_item->is_volatile = report_info_.is_volatile;
report_item->is_buffered_bytes = report_info_.bit_field_or_buffer;
// Local items.
for (const auto& item : local_.usages)
report_item->usages.push_back(ConvertUsageToMojo(item));
report_item->usage_minimum = ConvertUsageToMojo(local_.usage_minimum);
report_item->usage_maximum = ConvertUsageToMojo(local_.usage_maximum);
report_item->designator_minimum = local_.designator_minimum;
report_item->designator_maximum = local_.designator_maximum;
report_item->string_minimum = local_.string_minimum;
report_item->string_maximum = local_.string_maximum;
// Global items.
report_item->logical_minimum = global_.logical_minimum;
report_item->logical_maximum = global_.logical_maximum;
report_item->physical_minimum = global_.physical_minimum;
report_item->physical_maximum = global_.physical_maximum;
report_item->unit_exponent = global_.unit_exponent;
report_item->unit = global_.unit;
report_item->report_size = global_.report_size;
report_item->report_count = global_.report_count;
return report_item;
}
} // namespace device