/* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2023, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace Kernel { class PS2MouseDevice : public SerialIODevice { friend class DeviceManagement; public: static ErrorOr> try_to_initialize(SerialIOController const&, SerialIOController::PortIndex, MouseDevice const&); ErrorOr initialize(); virtual ~PS2MouseDevice() override; // ^SerialIODevice virtual void handle_byte_read_from_serial_input(u8 byte) override; protected: PS2MouseDevice(SerialIOController const&, SerialIOController::PortIndex, MouseDevice const&); struct RawPacket { union { u32 dword; u8 bytes[4]; }; }; ErrorOr read_from_device(); ErrorOr send_command(SerialIOController::DeviceCommand command); ErrorOr send_command(SerialIOController::DeviceCommand command, u8 data); MousePacket parse_data_packet(RawPacket const&); ErrorOr set_sample_rate(u8); ErrorOr get_device_id(); u8 m_data_state { 0 }; RawPacket m_data; bool m_has_wheel { false }; bool m_has_five_buttons { false }; NonnullRefPtr const m_mouse_device; }; }