[Mammoth] Add a keyboard library that translates scancode to keycodes.
This commit is contained in:
parent
aecae8e41f
commit
2bc64b045c
8 changed files with 286 additions and 108 deletions
|
|
@ -2,6 +2,7 @@ add_executable(teton
|
|||
framebuffer/console.cpp
|
||||
framebuffer/framebuffer.cpp
|
||||
framebuffer/psf.cpp
|
||||
keyboard_listener.cpp
|
||||
teton.cpp
|
||||
)
|
||||
|
||||
|
|
|
|||
3
sys/teton/keyboard_listener.cpp
Normal file
3
sys/teton/keyboard_listener.cpp
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#include "keyboard_listener.h"
|
||||
|
||||
void KeyboardListener::HandleCharacter(char c) { console_.WriteChar(c); }
|
||||
12
sys/teton/keyboard_listener.h
Normal file
12
sys/teton/keyboard_listener.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
#include <mammoth/input/keyboard.h>
|
||||
|
||||
#include "framebuffer/console.h"
|
||||
|
||||
class KeyboardListener : public mmth::KeyboardListenerBase {
|
||||
public:
|
||||
KeyboardListener(Console& c) : mmth::KeyboardListenerBase(), console_(c) {}
|
||||
virtual void HandleCharacter(char c) override;
|
||||
|
||||
private:
|
||||
Console& console_;
|
||||
};
|
||||
|
|
@ -2,12 +2,12 @@
|
|||
#include <mammoth/util/debug.h>
|
||||
#include <mammoth/util/init.h>
|
||||
#include <victoriafalls/victoriafalls.yunq.client.h>
|
||||
#include <voyageurs/voyageurs.yunq.client.h>
|
||||
#include <yellowstone/yellowstone.yunq.client.h>
|
||||
|
||||
#include "framebuffer/console.h"
|
||||
#include "framebuffer/framebuffer.h"
|
||||
#include "framebuffer/psf.h"
|
||||
#include "keyboard_listener.h"
|
||||
|
||||
uint64_t main(uint64_t init_port) {
|
||||
ParseInitPort(init_port);
|
||||
|
|
@ -37,26 +37,12 @@ uint64_t main(uint64_t init_port) {
|
|||
console.WriteChar(i);
|
||||
}
|
||||
|
||||
GetEndpointRequest req;
|
||||
req.set_endpoint_name("voyageurs");
|
||||
Endpoint endpoint;
|
||||
RET_ERR(client.GetEndpoint(req, endpoint));
|
||||
KeyboardListener listener(console);
|
||||
listener.Register();
|
||||
|
||||
VoyageursClient voyaguers(endpoint.endpoint());
|
||||
ASSIGN_OR_RETURN(mmth::PortServer server, mmth::PortServer::Create());
|
||||
KeyboardListener listener;
|
||||
ASSIGN_OR_RETURN(mmth::PortClient pclient, server.CreateClient());
|
||||
listener.set_port_capability(pclient.cap());
|
||||
None n;
|
||||
RET_ERR(voyaguers.RegisterKeyboardListener(listener, n));
|
||||
Thread lthread = listener.Listen();
|
||||
|
||||
while (true) {
|
||||
ASSIGN_OR_RETURN(char c, server.RecvChar());
|
||||
if (c != '\0') {
|
||||
console.WriteChar(c);
|
||||
dbgln("{}", c);
|
||||
}
|
||||
}
|
||||
check(lthread.Join());
|
||||
|
||||
return 0;
|
||||
return glcr::OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,92 +2,6 @@
|
|||
|
||||
#include <mammoth/util/debug.h>
|
||||
|
||||
namespace {
|
||||
|
||||
char ScancodeToChar(uint8_t code) {
|
||||
switch (code) {
|
||||
case 0x02:
|
||||
return '1';
|
||||
case 0x03:
|
||||
return '2';
|
||||
case 0x04:
|
||||
return '3';
|
||||
case 0x05:
|
||||
return '4';
|
||||
case 0x06:
|
||||
return '5';
|
||||
case 0x07:
|
||||
return '6';
|
||||
case 0x08:
|
||||
return '7';
|
||||
case 0x09:
|
||||
return '8';
|
||||
case 0x0A:
|
||||
return '9';
|
||||
case 0x0B:
|
||||
return '0';
|
||||
case 0x10:
|
||||
return 'Q';
|
||||
case 0x11:
|
||||
return 'W';
|
||||
case 0x12:
|
||||
return 'E';
|
||||
case 0x13:
|
||||
return 'R';
|
||||
case 0x14:
|
||||
return 'T';
|
||||
case 0x15:
|
||||
return 'Y';
|
||||
case 0x16:
|
||||
return 'U';
|
||||
case 0x17:
|
||||
return 'I';
|
||||
case 0x18:
|
||||
return 'O';
|
||||
case 0x19:
|
||||
return 'P';
|
||||
case 0x1E:
|
||||
return 'A';
|
||||
case 0x1F:
|
||||
return 'S';
|
||||
case 0x20:
|
||||
return 'D';
|
||||
case 0x21:
|
||||
return 'F';
|
||||
case 0x22:
|
||||
return 'G';
|
||||
case 0x23:
|
||||
return 'H';
|
||||
case 0x24:
|
||||
return 'J';
|
||||
case 0x25:
|
||||
return 'K';
|
||||
case 0x26:
|
||||
return 'L';
|
||||
case 0x2C:
|
||||
return 'Z';
|
||||
case 0x2D:
|
||||
return 'X';
|
||||
case 0x2E:
|
||||
return 'Y';
|
||||
case 0x2F:
|
||||
return 'C';
|
||||
case 0x30:
|
||||
return 'V';
|
||||
case 0x31:
|
||||
return 'B';
|
||||
case 0x32:
|
||||
return 'N';
|
||||
case 0x33:
|
||||
return 'M';
|
||||
}
|
||||
|
||||
dbgln("Unhandled scancode {x}", code);
|
||||
return '\0';
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void InterruptEnter(void* void_keyboard) {
|
||||
KeyboardDriver* keyboard = static_cast<KeyboardDriver*>(void_keyboard);
|
||||
|
||||
|
|
@ -111,10 +25,9 @@ void KeyboardDriver::InterruptLoop() {
|
|||
uint64_t num_bytes = 1;
|
||||
uint64_t num_caps = 0;
|
||||
check(ZPortRecv(irq_cap_, &num_bytes, &scancode, &num_caps, nullptr));
|
||||
dbgln("Scan {x}", scancode);
|
||||
|
||||
for (mmth::PortClient& client : listeners_) {
|
||||
client.WriteByte(ScancodeToChar(scancode));
|
||||
client.WriteByte(scancode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue