From f94596f20c48a5db0757a99ce23791406aacba72 Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 2 Dec 2024 15:45:24 +0100 Subject: [PATCH] Properly handle padded input report data on Windows --- soup/HidReportDescriptor.cpp | 1 - soup/hwHid.cpp | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/soup/HidReportDescriptor.cpp b/soup/HidReportDescriptor.cpp index 76b7cccc..6d99ffff 100644 --- a/soup/HidReportDescriptor.cpp +++ b/soup/HidReportDescriptor.cpp @@ -276,7 +276,6 @@ NAMESPACE_SOUP ++pUsageId; } } - br.finishByte(); // It seems like in the case of a "Hat Switch", the high nibble is unused. continue; } else if (f.size == 16 && f.logical_max != 0) diff --git a/soup/hwHid.cpp b/soup/hwHid.cpp index c55011f6..9b686ab2 100644 --- a/soup/hwHid.cpp +++ b/soup/hwHid.cpp @@ -755,6 +755,7 @@ NAMESPACE_SOUP return a.bit_index < b.bit_index; }); + uint32_t bit_index = 8; for (uint32_t i = 0; i != pp_data->header.input_item_count; ++i) { //std::cout << "report_id: " << (int)pp_data->items[i].report_id << std::endl; @@ -765,6 +766,22 @@ NAMESPACE_SOUP result.report_ids.emplace(pp_data->items[i].report_id); } + const uint32_t this_item_bit_index = (pp_data->items[i].byte_index * 8) + pp_data->items[i].bit_index; + if (this_item_bit_index > bit_index) + { + const auto pad_bits = this_item_bit_index - bit_index; + //std::cout << "inserting " << pad_bits << " bits of padding" << std::endl; + result.input_report_fields.emplace_back(HidReportDescriptor::ReportField{ + 1, + pad_bits, + 0, + false, + 0, + {} + }); + bit_index = this_item_bit_index; + } + std::vector usage_ids{}; for (uint32_t usage = pp_data->items[i].usage_minimum; usage != (pp_data->items[i].usage_maximum + 1); ++usage) { @@ -778,6 +795,8 @@ NAMESPACE_SOUP pp_data->items[i].usage_page, std::move(usage_ids) }); + + bit_index += pp_data->items[i].bit_size * pp_data->items[i].report_count; } HidD_FreePreparsedData(_pp_data);