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> 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) { for (uint8_t i = 0; i < HID_LAST_KEY; ++i) {
uint8_t bit = 1 << (uint8_t(i) % 8); uint8_t bit = 1 << (uint8_t(i) % 8);
uint8_t key_code = report_data_.keys[i / 8] & bit; uint8_t keycode = report_data_.keys[i / 8] & bit;
if (key_code) active_keys.push_back(i); if (keycode) active_keycodes.push_back(i);
} }
return active_keys;
return active_keycodes;
} }
} // namespace testing } // namespace testing

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

Loading…
Cancel
Save