Serenity Operating System
at master 49 lines 1.5 kB view raw
1/* 2 * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <Kernel/Devices/HID/HIDManagement.h> 8#include <Kernel/Devices/HID/MouseDevice.h> 9 10namespace Kernel { 11 12MouseDevice::MouseDevice() 13 : HIDDevice(10, HIDManagement::the().generate_minor_device_number_for_mouse()) 14{ 15} 16 17MouseDevice::~MouseDevice() = default; 18 19bool MouseDevice::can_read(OpenFileDescription const&, u64) const 20{ 21 SpinlockLocker lock(m_queue_lock); 22 return !m_queue.is_empty(); 23} 24 25ErrorOr<size_t> MouseDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size) 26{ 27 VERIFY(size > 0); 28 size_t nread = 0; 29 size_t remaining_space_in_buffer = static_cast<size_t>(size) - nread; 30 SpinlockLocker lock(m_queue_lock); 31 while (!m_queue.is_empty() && remaining_space_in_buffer) { 32 auto packet = m_queue.dequeue(); 33 lock.unlock(); 34 35 dbgln_if(MOUSE_DEBUG, "Mouse Read: Buttons {:x}", packet.buttons); 36 dbgln_if(MOUSE_DEBUG, "PS2 Mouse: X {}, Y {}, Z {}, W {}, Relative {}", packet.x, packet.y, packet.z, packet.w, packet.buttons); 37 dbgln_if(MOUSE_DEBUG, "PS2 Mouse Read: Filter packets"); 38 39 size_t bytes_read_from_packet = min(remaining_space_in_buffer, sizeof(MousePacket)); 40 TRY(buffer.write(&packet, nread, bytes_read_from_packet)); 41 nread += bytes_read_from_packet; 42 remaining_space_in_buffer -= bytes_read_from_packet; 43 44 lock.lock(); 45 } 46 return nread; 47} 48 49}