20#include "modules/drivers/common/hid/HidUtils.h"
21#include "pedigree/kernel/LockGuard.h"
22#include "pedigree/kernel/machine/HidInputManager.h"
23#include "pedigree/kernel/machine/InputManager.h"
25#include "modules/drivers/common/hid/HidUsages.h"
27Spinlock HidUtils::InputState::m_Lock;
30HidUtils::InputState::InputState()
31 : m_pNext(nullptr), m_Keys{}, m_MouseButtons(0), m_JoystickButtons(0) {
37HidUtils::InputState::~InputState() {
39 for (
size_t key = 0; key < 256; ++key) {
40 if (m_Keys[key / 64] & (uint64_t{1} << (key % 64))) {
44 InputState** input = &m_pInputs;
45 while (*input !=
this) {
46 input = &(*input)->m_pNext;
52 if (m_JoystickButtons) {
57uint32_t HidUtils::InputState::buttons(HidDeviceType deviceType) {
59 for (InputState* input = m_pInputs; input; input = input->m_pNext) {
60 bitmap |= deviceType == Mouse ? input->m_MouseButtons : input->m_JoystickButtons;
69 for (
size_t i = 0; i < nLength; ++i)
70 value |= uint64_t{(pBuffer[(nStart + i) / 8] >> ((nStart + i) % 8)) & 1U} << i;
82 if (nMin < (1LL << 8) && nMin & (1LL << 7))
84 else if (nMin < (1LL << 16) && nMin & (1LL << 15))
86 else if (nMin < (1LL << 32) && nMin & (1LL << 31))
100 if (nMin > -(1LL << 8) && nValue < (1LL << 8) && nValue & (1LL << 7))
102 else if (nMin > -(1LL << 16) && nValue < (1LL << 16) && nValue & (1LL << 15))
104 else if (nMin > -(1LL << 32) && nValue < (1LL << 32) && nValue & (1LL << 31))
113 if ((deviceType ==
Keyboard) && (nUsagePage == HidUsagePages::Keyboard)) {
114 if (!nUsage || nUsage > 255) {
117 const uint64_t bit = uint64_t{1} << (nUsage % 64);
118 if (nRelativeValue > 0) {
119 state.m_Keys[nUsage / 64] |= bit;
122 state.m_Keys[nUsage / 64] &= ~bit;
127 const uint32_t mouseButtons = InputState::buttons(Mouse);
128 const uint32_t joystickButtons = InputState::buttons(Joystick);
130 if ((deviceType == Mouse) && (nUsagePage == HidUsagePages::GenericDesktop)) {
131 if (nUsage == HidUsages::X)
133 if (nUsage == HidUsages::Y)
135 if (nUsage == HidUsages::Wheel)
140 if ((deviceType == Joystick) && (nUsagePage == HidUsagePages::GenericDesktop)) {
141 if (nUsage == HidUsages::X)
143 if (nUsage == HidUsages::Y)
145 if (nUsage == HidUsages::Z)
150 if ((deviceType == Mouse) && (nUsagePage == HidUsagePages::Button)) {
151 if (!nUsage || nUsage > 32) {
155 if (nRelativeValue > 0) {
156 state.m_MouseButtons |= uint32_t{1} << (nUsage - 1);
158 state.m_MouseButtons &= ~(uint32_t{1} << (nUsage - 1));
166 if ((deviceType == Joystick) && (nUsagePage == HidUsagePages::Button)) {
167 if (!nUsage || nUsage > 32) {
171 if (nRelativeValue > 0) {
172 state.m_JoystickButtons |= uint32_t{1} << (nUsage - 1);
174 state.m_JoystickButtons &= ~(uint32_t{1} << (nUsage - 1));
void fixNegativeMinimum(int64_t &nMin, int64_t nMax)
Converts.
uint64_t getBufferField(uint8_t *pBuffer, size_t nStart, size_t nLength)
Retrieves a field in a buffer.
void fixNegativeValue(int64_t nMin, int64_t nMax, int64_t &nValue)
Converts.
void sendInputToManager(HidDeviceType deviceType, uint16_t nUsagePage, uint16_t nUsage, int64_t nRelativeValue, InputState &state)
Sends the input to the right handler in HidInputManager or InputManager.