Skip to content

Commit ba25d17

Browse files
committed
* Implementing keyboard input handler
1 parent 987003e commit ba25d17

File tree

7 files changed

+360
-97
lines changed

7 files changed

+360
-97
lines changed

Drivers/Keyboard.cpp

+26-73
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
#include "Keyboard.h"
22

3-
static bool isShift = false;
43
static bool isCTRLed = false;
54

65

7-
86
bool isUSRChanged = false;
9-
void printf(char*);
7+
void printf(char *);
108
void printfchar(char st);
119
void printHex(uint8_t key);
1210
void PrintDate();
@@ -44,11 +42,16 @@ void CustomShell::clearBuffer()
4442
{
4543
}
4644

45+
void CustomShell::OnKeyDown(uint8_t key)
46+
{
47+
}
48+
4749
KeyboardDriver::KeyboardDriver(InterruptManager* manager, CustomShell* shell)
4850
:InterruptHandler(0x21, manager),
4951
DataPort(0x60),
5052
CommandPort(0x64)
5153
{
54+
clear_key_buffer();
5255
isTxtMode = false;
5356
this->shell = shell;
5457
Task task1(&gdt, taskA);
@@ -75,7 +78,7 @@ KeyboardDriver::~KeyboardDriver()
7578

7679
void KeyboardDriver::activate()
7780
{
78-
while(CommandPort.ReadFromPort() & 0x1)
81+
while (CommandPort.ReadFromPort() & 0x1)
7982
DataPort.ReadFromPort();
8083
CommandPort.WriteToPort(0xAE); // Activates the interrupts
8184
CommandPort.WriteToPort(0x20); // Gets current state
@@ -89,6 +92,7 @@ void KeyboardDriver::activate()
8992
uint32_t KeyboardDriver::HandleInterrupt(uint32_t esp)
9093
{
9194
esp2 = esp;
95+
9296
if(isESPChanged)
9397
{
9498
printf("\n");
@@ -100,16 +104,13 @@ uint32_t KeyboardDriver::HandleInterrupt(uint32_t esp)
100104
return esp1;
101105
}
102106
uint8_t key = DataPort.ReadFromPort(); // The variable where a single keystroke is stored
107+
shell->OnKeyDown(key);
103108
if(key < 0x80 & key != 0x3A & key != 0x2A & key != 0x2A & key != 0x36 & key != 0x3A & key != 0x0E & key != 0x38 & key != 0x1D ){
104109
if(!IsShellDisabled)
105110
{
106111
key_buffer[key_buffer_index] = KeycodeToASCII(key);
107112
key_buffer_index++;
108-
}
109-
else
110-
{
111-
shell->CharBuffer[shell->CharBufferIndex] = KeycodeToASCII(key);
112-
shell->CharBufferIndex++;
113+
113114
}
114115
}
115116
switch (key)
@@ -241,6 +242,14 @@ uint32_t KeyboardDriver::HandleInterrupt(uint32_t esp)
241242
key_buffer_index--;
242243
break;
243244

245+
case 0x3E :
246+
for (int i = 0; i < key_buffer_index; i++)
247+
{
248+
printf(key_buffer[i]);
249+
}
250+
break;
251+
252+
244253
case 0x4D :
245254
if(isTxtMode)
246255
printf("\6");
@@ -262,70 +271,7 @@ uint32_t KeyboardDriver::HandleInterrupt(uint32_t esp)
262271
return esp;
263272
}
264273

265-
char* KeyboardDriver::KeycodeToASCII(uint8_t Keycode)
266-
{
267-
char* result;
268-
if (Keycode < 0x80)
269-
{
270-
switch (Keycode)
271-
{
272-
case 0xFA: break;
273-
case 0x45: case 0xC5: break;
274-
case 0x29:if (!isShift) result = "`"; else result = "~"; break;
275-
case 0x02:if (!isShift) result = "1"; else result = "!"; break;
276-
case 0x03:if (!isShift) result = "2"; else result = "@"; break;
277-
case 0x04:if (!isShift) result = "3"; else result = "#"; break;
278-
case 0x05:if (!isShift) result = "4"; else result = "$"; break;
279-
case 0x06:if (!isShift) result = "5"; else result = "%"; break;
280-
case 0x07:if (!isShift) result = "6"; else result = "^"; break;
281-
case 0x08:if (!isShift) result = "7"; else result = "&"; break;
282-
case 0x09:if (!isShift) result = "8"; else result = "*"; break;
283-
case 0x0A:if (!isShift) result = "9"; else result = "("; break;
284-
case 0x0B:if (!isShift) result = "0"; else result = ")"; break;
285-
case 0x0C:if (!isShift) result = "-"; else result = "_"; break;
286-
case 0x0D:if (!isShift) result = "="; else result = "+"; break;
287-
288-
case 0x10:if (!isShift) result = "q"; else result = "Q"; break;
289-
case 0x11:if (!isShift) result = "w"; else result = "W"; break;
290-
case 0x12:if (!isShift) result = "e"; else result = "E"; break;
291-
case 0x13:if (!isShift) result = "r"; else result = "R"; break;
292-
case 0x14:if (!isShift) result = "t"; else result = "T"; break;
293-
case 0x15:if (!isShift) result = "y"; else result = "Y"; break;
294-
case 0x16:if (!isShift) result = "u"; else result = "U"; break;
295-
case 0x17:if (!isShift) result = "i"; else result = "I"; break;
296-
case 0x18:if (!isShift) result = "o"; else result = "O"; break;
297-
case 0x19:if (!isShift) result = "p"; else result = "P"; break;
298-
case 0x1A:if (!isShift) result = "["; else result = "{"; break;
299-
case 0x1B:if (!isShift) result = "]"; else result = "}"; break;
300-
case 0x1C:if (!isShift) result = "\n"; else result = "\n"; break;
301-
302-
case 0x1E:if (!isShift) result = "a"; else result = "A"; break;
303-
case 0x1F:if (!isShift) result = "s"; else result = "S"; break;
304-
case 0x20:if (!isShift) result = "d"; else result = "D"; break;
305-
case 0x21:if (!isShift) result = "f"; else result = "F"; break;
306-
case 0x22:if (!isShift) result = "g"; else result = "G"; break;
307-
case 0x23:if (!isShift) result = "h"; else result = "H"; break;
308-
case 0x24:if (!isShift) result = "j"; else result = "J"; break;
309-
case 0x25:if (!isShift) result = "k"; else result = "K"; break;
310-
case 0x26:if (!isShift) result = "l"; else result = "L"; break;
311-
case 0x27:if (!isShift) result = ";"; else result = ":"; break;
312-
313-
case 0x2C:if (!isShift) result = "z"; else result = "Z"; break;
314-
case 0x2D:if (!isShift) result = "x"; else result = "X"; break;
315-
case 0x2E:if (!isShift) result = "c"; else result = "C"; break;
316-
case 0x2F:if (!isShift) result = "v"; else result = "V"; break;
317-
case 0x30:if (!isShift) result = "v"; else result = "B"; break;
318-
case 0x31:if (!isShift) result = "n"; else result = "N"; break;
319-
case 0x32:if (!isShift) result = "m"; else result = "M"; break;
320-
case 0x33:if (!isShift) result = ","; else result = "<"; break;
321-
case 0x34:if (!isShift) result = "."; else result = ">"; break;
322-
case 0x35:if (!isShift) result = "/"; else result = "?"; break;
323-
case 0x39:if (!isShift) result = " "; else result = " "; break;
324-
case 0x2B:if (!isShift) result = "\\"; else result = "|"; break;
325-
}
326-
}
327-
return result;
328-
}
274+
329275

330276
void KeyboardDriver::clear_key_buffer()
331277
{
@@ -578,6 +524,13 @@ void KeyboardDriver::CommandInterpreter() // SOSH v1.0.3 [SectorOS SHell]. 11 Co
578524
}
579525
else
580526
{
527+
for (int i = 0x00; i < key_buffer_index; i++)
528+
{
529+
printHex(i);
530+
printf(" : ");
531+
printf(key_buffer[i]);
532+
printf("\n");
533+
}
581534
printf("Unknown Command. Type help in console to get all the commands");
582535
}
583536
if(!isTxtMode){

Drivers/Keyboard.h

+4-5
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ class CustomShell
2121
~CustomShell();
2222
virtual void Shell();
2323
virtual void clearBuffer();
24-
char* CharBuffer[256];
25-
int CharBufferIndex;
26-
24+
virtual void OnKeyDown(uint8_t key);
2725
};
2826

2927
class KeyboardDriver : public InterruptHandler, public Driver // Driver for keyboard
@@ -40,12 +38,13 @@ class KeyboardDriver : public InterruptHandler, public Driver // Driver for keyb
4038
KeyboardDriver(InterruptManager* manager, CustomShell* cshell);
4139
~KeyboardDriver();
4240
virtual uint32_t HandleInterrupt(uint32_t esp);
43-
// To change the keycode to ascii to write it into string
4441
TaskManager taskManager;
4542
uint32_t esp1;
4643
CustomShell* shell;
4744
uint32_t esp2;
48-
char* KeycodeToASCII(uint8_t Keycode);
45+
char *key_buffer[256]; // To Save the keystrokes in memory to use them later. Max number keystroke to save in the buffer is 256 Chars
46+
int key_buffer_index = 0; // The index of the key_buffer
47+
4948
// To clear the keystrokes in the keyboard buffer
5049
void clear_key_buffer();
5150
// To activate the keyboard driver

Include/Public_VAR.h

+137-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ inline char* OS_NAME = "SectorOS";
55

66
inline char* KERNEL_NAME = "SectorOS";
77
inline char* KERNEL_VERSION = "V2.1.6";
8-
inline char* KERNEL_BUILD = "Build: 2021-12-10";
8+
inline char* KERNEL_BUILD = "Build: 2021-12-11";
99
inline char* KERNEL_ARCH = "x86";
1010

1111
inline char* SHELL_NAME = "SOSH";
@@ -17,9 +17,143 @@ inline int SPIndex = 0; // Shell Prompt Index
1717
// END Environment variables
1818

1919
// START Kernel variables
20-
inline char *key_buffer[256]; // To Save the keystrokes in memory to use them later. Max number keystroke to save in the buffer is 256 Chars
21-
inline int key_buffer_index = 0; // The index of the key_buffer
2220
inline bool IsShellDisabled = false; // To disable the shell
21+
inline bool isShift = false; // To know if the shift key is pressed
22+
2323
// END Kernel variables
2424

25+
// START Common Functions
26+
27+
inline char KeyCodeToChar(uint8_t keyCode)
28+
{
29+
char result;
30+
if (keyCode < 0x80)
31+
{
32+
switch (keyCode)
33+
{
34+
case 0xFA: break;
35+
case 0x45: case 0xC5: break;
36+
case 0x29:if (!isShift) result = '`'; else result = '~'; break;
37+
case 0x02:if (!isShift) result = '1'; else result = '!'; break;
38+
case 0x03:if (!isShift) result = '2'; else result = '@'; break;
39+
case 0x04:if (!isShift) result = '3'; else result = '#'; break;
40+
case 0x05:if (!isShift) result = '4'; else result = '$'; break;
41+
case 0x06:if (!isShift) result = '5'; else result = '%'; break;
42+
case 0x07:if (!isShift) result = '6'; else result = '^'; break;
43+
case 0x08:if (!isShift) result = '7'; else result = '&'; break;
44+
case 0x09:if (!isShift) result = '8'; else result = '*'; break;
45+
case 0x0A:if (!isShift) result = '9'; else result = '('; break;
46+
case 0x0B:if (!isShift) result = '0'; else result = ')'; break;
47+
case 0x0C:if (!isShift) result = '-'; else result = '_'; break;
48+
case 0x0D:if (!isShift) result = '='; else result = '+'; break;
49+
50+
case 0x10:if (!isShift) result = 'q'; else result = 'Q'; break;
51+
case 0x11:if (!isShift) result = 'w'; else result = 'W'; break;
52+
case 0x12:if (!isShift) result = 'e'; else result = 'E'; break;
53+
case 0x13:if (!isShift) result = 'r'; else result = 'R'; break;
54+
case 0x14:if (!isShift) result = 't'; else result = 'T'; break;
55+
case 0x15:if (!isShift) result = 'y'; else result = 'Y'; break;
56+
case 0x16:if (!isShift) result = 'u'; else result = 'U'; break;
57+
case 0x17:if (!isShift) result = 'i'; else result = 'I'; break;
58+
case 0x18:if (!isShift) result = 'o'; else result = 'O'; break;
59+
case 0x19:if (!isShift) result = 'p'; else result = 'P'; break;
60+
case 0x1A:if (!isShift) result = '['; else result = '{'; break;
61+
case 0x1B:if (!isShift) result = ']'; else result = '}'; break;
62+
case 0x1C:if (!isShift) result = '\n'; else result = '\n'; break;
63+
64+
case 0x1E:if (!isShift) result = 'a'; else result = 'A'; break;
65+
case 0x1F:if (!isShift) result = 's'; else result = 'S'; break;
66+
case 0x20:if (!isShift) result = 'd'; else result = 'D'; break;
67+
case 0x21:if (!isShift) result = 'f'; else result = 'F'; break;
68+
case 0x22:if (!isShift) result = 'g'; else result = 'G'; break;
69+
case 0x23:if (!isShift) result = 'h'; else result = 'H'; break;
70+
case 0x24:if (!isShift) result = 'j'; else result = 'J'; break;
71+
case 0x25:if (!isShift) result = 'k'; else result = 'K'; break;
72+
case 0x26:if (!isShift) result = 'l'; else result = 'L'; break;
73+
case 0x27:if (!isShift) result = ';'; else result = ':'; break;
74+
75+
case 0x2C:if (!isShift) result = 'z'; else result = 'Z'; break;
76+
case 0x2D:if (!isShift) result = 'x'; else result = 'X'; break;
77+
case 0x2E:if (!isShift) result = 'c'; else result = 'C'; break;
78+
case 0x2F:if (!isShift) result = 'v'; else result = 'V'; break;
79+
case 0x30:if (!isShift) result = 'v'; else result = 'B'; break;
80+
case 0x31:if (!isShift) result = 'n'; else result = 'N'; break;
81+
case 0x32:if (!isShift) result = 'm'; else result = 'M'; break;
82+
case 0x33:if (!isShift) result = ','; else result = '<'; break;
83+
case 0x34:if (!isShift) result = '.'; else result = '>'; break;
84+
case 0x35:if (!isShift) result = '/'; else result = '?'; break;
85+
case 0x39:if (!isShift) result = ' '; else result = ' '; break;
86+
case 0x2B:if (!isShift) result = '\\'; else result = '|'; break;
87+
}
88+
}
89+
return result;
90+
}
91+
92+
inline char* KeycodeToASCII(uint8_t Keycode)
93+
{
94+
char* result;
95+
if (Keycode < 0x80)
96+
{
97+
switch (Keycode)
98+
{
99+
case 0xFA: break;
100+
case 0x45: case 0xC5: break;
101+
case 0x29:if (!isShift) result = "`"; else result = "~"; break;
102+
case 0x02:if (!isShift) result = "1"; else result = "!"; break;
103+
case 0x03:if (!isShift) result = "2"; else result = "@"; break;
104+
case 0x04:if (!isShift) result = "3"; else result = "#"; break;
105+
case 0x05:if (!isShift) result = "4"; else result = "$"; break;
106+
case 0x06:if (!isShift) result = "5"; else result = "%"; break;
107+
case 0x07:if (!isShift) result = "6"; else result = "^"; break;
108+
case 0x08:if (!isShift) result = "7"; else result = "&"; break;
109+
case 0x09:if (!isShift) result = "8"; else result = "*"; break;
110+
case 0x0A:if (!isShift) result = "9"; else result = "("; break;
111+
case 0x0B:if (!isShift) result = "0"; else result = ")"; break;
112+
case 0x0C:if (!isShift) result = "-"; else result = "_"; break;
113+
case 0x0D:if (!isShift) result = "="; else result = "+"; break;
114+
115+
case 0x10:if (!isShift) result = "q"; else result = "Q"; break;
116+
case 0x11:if (!isShift) result = "w"; else result = "W"; break;
117+
case 0x12:if (!isShift) result = "e"; else result = "E"; break;
118+
case 0x13:if (!isShift) result = "r"; else result = "R"; break;
119+
case 0x14:if (!isShift) result = "t"; else result = "T"; break;
120+
case 0x15:if (!isShift) result = "y"; else result = "Y"; break;
121+
case 0x16:if (!isShift) result = "u"; else result = "U"; break;
122+
case 0x17:if (!isShift) result = "i"; else result = "I"; break;
123+
case 0x18:if (!isShift) result = "o"; else result = "O"; break;
124+
case 0x19:if (!isShift) result = "p"; else result = "P"; break;
125+
case 0x1A:if (!isShift) result = "["; else result = "{"; break;
126+
case 0x1B:if (!isShift) result = "]"; else result = "}"; break;
127+
case 0x1C:if (!isShift) result = "\n"; else result = "\n"; break;
128+
129+
case 0x1E:if (!isShift) result = "a"; else result = "A"; break;
130+
case 0x1F:if (!isShift) result = "s"; else result = "S"; break;
131+
case 0x20:if (!isShift) result = "d"; else result = "D"; break;
132+
case 0x21:if (!isShift) result = "f"; else result = "F"; break;
133+
case 0x22:if (!isShift) result = "g"; else result = "G"; break;
134+
case 0x23:if (!isShift) result = "h"; else result = "H"; break;
135+
case 0x24:if (!isShift) result = "j"; else result = "J"; break;
136+
case 0x25:if (!isShift) result = "k"; else result = "K"; break;
137+
case 0x26:if (!isShift) result = "l"; else result = "L"; break;
138+
case 0x27:if (!isShift) result = ";"; else result = ":"; break;
139+
140+
case 0x2C:if (!isShift) result = "z"; else result = "Z"; break;
141+
case 0x2D:if (!isShift) result = "x"; else result = "X"; break;
142+
case 0x2E:if (!isShift) result = "c"; else result = "C"; break;
143+
case 0x2F:if (!isShift) result = "v"; else result = "V"; break;
144+
case 0x30:if (!isShift) result = "v"; else result = "B"; break;
145+
case 0x31:if (!isShift) result = "n"; else result = "N"; break;
146+
case 0x32:if (!isShift) result = "m"; else result = "M"; break;
147+
case 0x33:if (!isShift) result = ","; else result = "<"; break;
148+
case 0x34:if (!isShift) result = "."; else result = ">"; break;
149+
case 0x35:if (!isShift) result = "/"; else result = "?"; break;
150+
case 0x39:if (!isShift) result = " "; else result = " "; break;
151+
case 0x2B:if (!isShift) result = "\\"; else result = "|"; break;
152+
}
153+
}
154+
return result;
155+
}
156+
157+
// END Common Functions
158+
25159
#endif

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ CPU/PowerControl.o \
1616
Drivers/Keyboard.o \
1717
Drivers/HDD-ATA.o \
1818
Drivers/VGADriver.o \
19+
Shell/Shell.o \
1920
CPU/syscall.o \
2021
Filesystem/MSDOSPT.o \
2122
Filesystem/FATFS.o \

0 commit comments

Comments
 (0)