Kernel: Add support for absolute position mouse

This commit is contained in:
2025-07-19 18:00:39 +03:00
parent a0d1a9ad67
commit 2c65590134
7 changed files with 144 additions and 47 deletions

View File

@@ -58,8 +58,9 @@ namespace Kernel
virtual void start_report() = 0;
virtual void stop_report() = 0;
virtual void handle_variable(uint16_t usage_page, uint16_t usage, int64_t state) = 0;
virtual void handle_array(uint16_t usage_page, uint16_t usage) = 0;
virtual void handle_variable(uint16_t usage_page, uint16_t usage, int64_t state) = 0;
virtual void handle_variable_absolute(uint16_t usage_page, uint16_t usage, int64_t state, int64_t min, int64_t max) = 0;
};
class USBHIDDriver final : public USBClassDriver

View File

@@ -14,8 +14,9 @@ namespace Kernel
void start_report() override;
void stop_report() override;
void handle_variable(uint16_t usage_page, uint16_t usage, int64_t state) override;
void handle_array(uint16_t usage_page, uint16_t usage) override;
void handle_variable(uint16_t usage_page, uint16_t usage, int64_t state) override;
void handle_variable_absolute(uint16_t usage_page, uint16_t usage, int64_t state, int64_t min, int64_t max) override;
void update() override;

View File

@@ -14,8 +14,9 @@ namespace Kernel
void start_report() override;
void stop_report() override;
void handle_variable(uint16_t usage_page, uint16_t usage, int64_t state) override;
void handle_array(uint16_t usage_page, uint16_t usage) override;
void handle_variable(uint16_t usage_page, uint16_t usage, int64_t state) override;
void handle_variable_absolute(uint16_t usage_page, uint16_t usage, int64_t state, int64_t min, int64_t max) override;
private:
USBMouse()
@@ -23,13 +24,25 @@ namespace Kernel
{}
~USBMouse() = default;
private:
struct AbsInfo
{
int64_t val { -1 };
int64_t min { 0 };
int64_t max { 0 };
bool valid() const { return min <= val && val <= max; }
};
private:
BAN::Array<bool, 5> m_button_state { false };
BAN::Array<bool, 5> m_button_state_temp { false };
int64_t m_pointer_x { 0 };
int64_t m_pointer_y { 0 };
int64_t m_rel_x { 0 };
int64_t m_rel_y { 0 };
int64_t m_wheel { 0 };
AbsInfo m_abs_x;
AbsInfo m_abs_y;
friend class BAN::RefPtr<USBMouse>;
};