1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:27:43 +00:00

Use a CircularQueue for the PS/2 mouse driver.

This commit is contained in:
Andreas Kling 2019-01-16 01:52:39 +01:00
parent 8ad2dfb6e1
commit 09ba129bcf
2 changed files with 12 additions and 5 deletions

View file

@ -44,7 +44,9 @@ void PS2MouseDevice::handle_irq()
(m_data[0] & 2) ? "Right" : "" (m_data[0] & 2) ? "Right" : ""
); );
#endif #endif
m_buffer.write((const byte*)m_data, 3); m_queue.enqueue(m_data[0]);
m_queue.enqueue(m_data[1]);
m_queue.enqueue(m_data[2]);
break; break;
} }
} }
@ -118,12 +120,18 @@ byte PS2MouseDevice::mouse_read()
bool PS2MouseDevice::can_read(Process&) const bool PS2MouseDevice::can_read(Process&) const
{ {
return !m_buffer.is_empty(); return !m_queue.is_empty();
} }
ssize_t PS2MouseDevice::read(Process&, byte* buffer, size_t size) ssize_t PS2MouseDevice::read(Process&, byte* buffer, size_t size)
{ {
return m_buffer.read(buffer, size); ssize_t nread = 0;
while ((size_t)nread < size) {
if (m_queue.is_empty())
break;
buffer[nread++] = m_queue.dequeue();
}
return nread;
} }
ssize_t PS2MouseDevice::write(Process&, const byte*, size_t) ssize_t PS2MouseDevice::write(Process&, const byte*, size_t)

View file

@ -1,7 +1,6 @@
#pragma once #pragma once
#include <VirtualFileSystem/CharacterDevice.h> #include <VirtualFileSystem/CharacterDevice.h>
#include "DoubleBuffer.h"
#include "IRQHandler.h" #include "IRQHandler.h"
class PS2MouseDevice final : public IRQHandler, public CharacterDevice { class PS2MouseDevice final : public IRQHandler, public CharacterDevice {
@ -29,7 +28,7 @@ private:
void wait_then_write(byte port, byte data); void wait_then_write(byte port, byte data);
byte wait_then_read(byte port); byte wait_then_read(byte port);
DoubleBuffer m_buffer; CircularQueue<byte, 600> m_queue;
byte m_data_state { 0 }; byte m_data_state { 0 };
signed_byte m_data[3]; signed_byte m_data[3];
}; };