MouseDevice.cpp 1.6 KB

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