Add modifier information to KeyboardReport class

This change adds the keycodes for keyboard modifier keys to the vector returned
by KeyboardReport::ActiveKeycodes(). Also, a simple method for getting the
modifiers byte from a keyboard hid report.

Signed-off-by: Michael Richters <gedankenexperimenter@gmail.com>
pull/948/head
Michael Richters 4 years ago
parent 9ec11f1b4b
commit 2207c3f4f8
No known key found for this signature in database
GPG Key ID: 1288FD13E4EEF0C0

@ -28,13 +28,38 @@ KeyboardReport::KeyboardReport(const void* data) {
}
std::vector<uint8_t> KeyboardReport::ActiveKeycodes() const {
std::vector<uint8_t> active_keys;
auto keycodes = ActiveNonModifierKeycodes();
auto mods = ActiveModifierKeycodes();
keycodes.insert(keycodes.end(), mods.begin(), mods.end());
return keycodes;
}
std::vector<uint8_t> KeyboardReport::ActiveModifierKeycodes() const {
constexpr uint8_t modifier_keycode_offset{HID_KEYBOARD_FIRST_MODIFIER};
std::vector<uint8_t> active_modifiers;
uint8_t modifiers{report_data_.modifiers}, mask{1};
for (uint8_t i{0}; modifiers != 0; ++i, modifiers >>= 1) {
if (modifiers & mask) {
active_modifiers.push_back(i + modifier_keycode_offset);
}
}
return active_modifiers;
}
std::vector<uint8_t> KeyboardReport::ActiveNonModifierKeycodes() const {
std::vector<uint8_t> active_keycodes;
for (uint8_t i = 0; i < HID_LAST_KEY; ++i) {
uint8_t bit = 1 << (uint8_t(i) % 8);
uint8_t key_code = report_data_.keys[i / 8] & bit;
if (key_code) active_keys.push_back(i);
uint8_t keycode = report_data_.keys[i / 8] & bit;
if (keycode) active_keycodes.push_back(i);
}
return active_keys;
return active_keycodes;
}
} // namespace testing

@ -34,6 +34,8 @@ class KeyboardReport {
KeyboardReport(const void* data);
std::vector<uint8_t> ActiveKeycodes() const;
std::vector<uint8_t> ActiveModifierKeycodes() const;
std::vector<uint8_t> ActiveNonModifierKeycodes() const;
private:
ReportData report_data_;

Loading…
Cancel
Save