about summary refs log tree commit diff stats
path: root/kernel.soso/ttydriver.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel.soso/ttydriver.c')
-rw-r--r--kernel.soso/ttydriver.c219
1 files changed, 73 insertions, 146 deletions
diff --git a/kernel.soso/ttydriver.c b/kernel.soso/ttydriver.c
index b2f19542..755cda15 100644
--- a/kernel.soso/ttydriver.c
+++ b/kernel.soso/ttydriver.c
@@ -22,16 +22,14 @@ static uint8 gKeyModifier = 0;
 
 static uint32 gPseudoTerminalNameGenerator = 0;
 
-typedef enum KeyModifier
-{
+typedef enum KeyModifier {
     KM_LeftShift = 1,
     KM_RightShift = 2,
     KM_Ctrl = 4,
     KM_Alt = 8
 } KeyModifier;
 
-enum
-{
+enum {
     KEY_LEFTSHIFT = 0x2A,
     KEY_RIGHTSHIFT = 0x36,
     KEY_CTRL = 0x1D,
@@ -78,8 +76,7 @@ enum
 
 
 
-static uint8 gKeyMap[256] =
-{
+static uint8 gKeyMap[256] = {
   NO,   0x1B, '1',  '2',  '3',  '4',  '5',  '6',  // 0x00
   '7',  '8',  '9',  '0',  '-',  '=',  '\b', '\t',
   'q',  'w',  'e',  'r',  't',  'y',  'u',  'i',  // 0x10
@@ -115,8 +112,7 @@ static uint8 gKeyMap[256] =
   [0xD3] = KEY_DELETE
 };
 
-static uint8 gKeyShiftMap[256] =
-{
+static uint8 gKeyShiftMap[256] = {
   NO,   033,  '!',  '@',  '#',  '$',  '%',  '^',  // 0x00
   '&',  '*',  '(',  ')',  '_',  '+',  '\b', '\t',
   'Q',  'W',  'E',  'R',  'T',  'Y',  'U',  'I',  // 0x10
@@ -162,21 +158,17 @@ static int32 write(Tty* tty, uint32 size, uint8 *buffer);
 static uint8 getCharacterForScancode(KeyModifier modifier, uint8 scancode);
 static void processScancode(uint8 scancode);
 
-void initializeTTYs(BOOL graphicMode)
-{
+void initializeTTYs(BOOL graphicMode) {
     gTtyList = List_Create();
 
     gReaderList = List_Create();
 
-    for (int i = 1; i <= 9; ++i)
-    {
+    for (int i = 1; i <= 9; ++i) {
         Tty* tty = NULL;
-        if (graphicMode)
-        {
+        if (graphicMode) {
             tty = createTty(768 / 16, 1024 / 9, Gfx_FlushFromTty);
         }
-        else
-        {
+        else {
             tty = createTty(25, 80, Screen_FlushFromTty);
         }
 
@@ -200,13 +192,11 @@ void initializeTTYs(BOOL graphicMode)
     gActiveTty = List_GetFirstNode(gTtyList)->data;
 }
 
-Tty* getActiveTTY()
-{
+Tty* getActiveTTY() {
     return gActiveTty;
 }
 
-FileSystemNode* createPseudoTerminal()
-{
+FileSystemNode* createPseudoTerminal() {
     Tty* tty = createTty(768 / 16, 1024 / 9, Gfx_FlushFromTty);
 
     tty->color = 0x0A;
@@ -222,22 +212,19 @@ FileSystemNode* createPseudoTerminal()
     device.write = tty_write;
     device.privateData = tty;
     FileSystemNode* node = registerDevice(&device);
-    if (NULL == node)
-    {
+    if (NULL == node) {
         destroyTty(tty);
     }
 
     return node;
 }
 
-static void sendInputToKeyBuffer(Tty* tty, uint8 scancode, uint8 character)
-{
+static void sendInputToKeyBuffer(Tty* tty, uint8 scancode, uint8 character) {
     char seq[8];
     memset(seq, 0, 8);
 
     switch (character) {
-    case KEY_PAGEUP:
-    {
+    case KEY_PAGEUP: {
         seq[0] = 27;
         seq[1] = 91;
         seq[2] = 53;
@@ -245,8 +232,7 @@ static void sendInputToKeyBuffer(Tty* tty, uint8 scancode, uint8 character)
         FifoBuffer_enqueue(tty->keyBuffer, seq, 4);
     }
         break;
-    case KEY_PAGEDOWN:
-    {
+    case KEY_PAGEDOWN: {
         seq[0] = 27;
         seq[1] = 91;
         seq[2] = 54;
@@ -254,24 +240,21 @@ static void sendInputToKeyBuffer(Tty* tty, uint8 scancode, uint8 character)
         FifoBuffer_enqueue(tty->keyBuffer, seq, 4);
     }
         break;
-    case KEY_HOME:
-    {
+    case KEY_HOME: {
         seq[0] = 27;
         seq[1] = 91;
         seq[2] = 72;
         FifoBuffer_enqueue(tty->keyBuffer, seq, 3);
     }
         break;
-    case KEY_END:
-    {
+    case KEY_END: {
         seq[0] = 27;
         seq[1] = 91;
         seq[2] = 70;
         FifoBuffer_enqueue(tty->keyBuffer, seq, 3);
     }
         break;
-    case KEY_INSERT:
-    {
+    case KEY_INSERT: {
         seq[0] = 27;
         seq[1] = 91;
         seq[2] = 50;
@@ -279,8 +262,7 @@ static void sendInputToKeyBuffer(Tty* tty, uint8 scancode, uint8 character)
         FifoBuffer_enqueue(tty->keyBuffer, seq, 4);
     }
         break;
-    case KEY_DELETE:
-    {
+    case KEY_DELETE: {
         seq[0] = 27;
         seq[1] = 91;
         seq[2] = 51;
@@ -288,32 +270,28 @@ static void sendInputToKeyBuffer(Tty* tty, uint8 scancode, uint8 character)
         FifoBuffer_enqueue(tty->keyBuffer, seq, 4);
     }
         break;
-    case KEY_UP:
-    {
+    case KEY_UP: {
         seq[0] = 27;
         seq[1] = 91;
         seq[2] = 65;
         FifoBuffer_enqueue(tty->keyBuffer, seq, 3);
     }
         break;
-    case KEY_DOWN:
-    {
+    case KEY_DOWN: {
         seq[0] = 27;
         seq[1] = 91;
         seq[2] = 66;
         FifoBuffer_enqueue(tty->keyBuffer, seq, 3);
     }
         break;
-    case KEY_RIGHT:
-    {
+    case KEY_RIGHT: {
         seq[0] = 27;
         seq[1] = 91;
         seq[2] = 67;
         FifoBuffer_enqueue(tty->keyBuffer, seq, 3);
     }
         break;
-    case KEY_LEFT:
-    {
+    case KEY_LEFT: {
         seq[0] = 27;
         seq[1] = 91;
         seq[2] = 68;
@@ -326,8 +304,7 @@ static void sendInputToKeyBuffer(Tty* tty, uint8 scancode, uint8 character)
     }
 }
 
-void sendKeyInputToTTY(Tty* tty, uint8 scancode)
-{
+void sendKeyInputToTTY(Tty* tty, uint8 scancode) {
     beginCriticalSection();
 
     processScancode(scancode);
@@ -336,49 +313,39 @@ void sendKeyInputToTTY(Tty* tty, uint8 scancode)
 
     uint8 keyRelease = (0x80 & scancode); //ignore release event
 
-    if (character > 0 && keyRelease == 0)
-    {
+    if (character > 0 && keyRelease == 0) {
         //enqueue for non-canonical readers
         sendInputToKeyBuffer(tty, scancode, character);
         //FifoBuffer_enqueue(tty->keyBuffer, &scancode, 1);
 
-        if (tty->lineBufferIndex >= TTY_LINEBUFFER_SIZE - 1)
-        {
+        if (tty->lineBufferIndex >= TTY_LINEBUFFER_SIZE - 1) {
             tty->lineBufferIndex = 0;
         }
 
-        if (character == '\b')
-        {
-            if (tty->lineBufferIndex > 0)
-            {
+        if (character == '\b') {
+            if (tty->lineBufferIndex > 0) {
                 tty->lineBuffer[--tty->lineBufferIndex] = '\0';
 
-                if ((tty->term.c_lflag & ECHO) == ECHO)
-                {
+                if ((tty->term.c_lflag & ECHO) == ECHO) {
                     write(tty, 1, &character);
                 }
             }
         }
-        else
-        {
+        else {
             tty->lineBuffer[tty->lineBufferIndex++] = character;
 
-            if ((tty->term.c_lflag & ECHO) == ECHO)
-            {
+            if ((tty->term.c_lflag & ECHO) == ECHO) {
                 write(tty, 1, &character);
             }
         }
     }
 
     //Wake readers
-    List_Foreach(n, gReaderList)
-    {
+    List_Foreach(n, gReaderList) {
         File* file = n->data;
 
-        if (file->thread->state == TS_WAITIO)
-        {
-            if (file->thread->state_privateData == tty)
-            {
+        if (file->thread->state == TS_WAITIO) {
+            if (file->thread->state_privateData == tty) {
                 file->thread->state = TS_RUN;
                 file->thread->state_privateData = NULL;
             }
@@ -388,8 +355,7 @@ void sendKeyInputToTTY(Tty* tty, uint8 scancode)
     endCriticalSection();
 }
 
-static BOOL tty_open(File *file, uint32 flags)
-{
+static BOOL tty_open(File *file, uint32 flags) {
     //printkf("tty_open: pid:%d\n", file->process->pid);
 
     Tty* tty = (Tty*)file->node->privateNodeData;
@@ -401,19 +367,15 @@ static BOOL tty_open(File *file, uint32 flags)
     return TRUE;
 }
 
-static void tty_close(File *file)
-{
+static void tty_close(File *file) {
     List_RemoveFirstOccurrence(gReaderList, file);
 }
 
-static int32 tty_ioctl(File *file, int32 request, void * argp)
-{
+static int32 tty_ioctl(File *file, int32 request, void * argp) {
     Tty* tty = (Tty*)file->node->privateNodeData;
 
-    switch (request)
-    {
-    case 0:
-    {
+    switch (request) {
+    case 0: {
         sendKeyInputToTTY(tty, (uint8)(uint32)argp);
 
         return 0;
@@ -422,16 +384,14 @@ static int32 tty_ioctl(File *file, int32 request, void * argp)
     case 1:
         return tty->columnCount * tty->lineCount * 2;
         break;
-    case 2:
-    {
+    case 2: {
         //set
         TtyUserBuffer* userTtyBuffer = (TtyUserBuffer*)argp;
         memcpy(tty->buffer, (uint8*)userTtyBuffer->buffer, tty->columnCount * tty->lineCount * 2);
         return 0;
     }
         break;
-    case 3:
-    {
+    case 3: {
         //get
         TtyUserBuffer* userTtyBuffer = (TtyUserBuffer*)argp;
         userTtyBuffer->columnCount = tty->columnCount;
@@ -442,8 +402,7 @@ static int32 tty_ioctl(File *file, int32 request, void * argp)
         return 0;
     }
         break;
-    case TCGETS:
-    {
+    case TCGETS: {
         struct termios* term = (struct termios*)argp;
 
         //Debug_PrintF("TCGETS\n");
@@ -456,8 +415,7 @@ static int32 tty_ioctl(File *file, int32 request, void * argp)
     case TCSETS:
     case TCSETSW:
         break;
-    case TCSETSF:
-    {
+    case TCSETSF: {
         struct termios* term = (struct termios*)argp;
 
         //Debug_PrintF("TCSETSF\n");
@@ -474,28 +432,21 @@ static int32 tty_ioctl(File *file, int32 request, void * argp)
     return -1;
 }
 
-static int32 tty_read(File *file, uint32 size, uint8 *buffer)
-{
+static int32 tty_read(File *file, uint32 size, uint8 *buffer) {
     enableInterrupts();
 
-    if (size > 0)
-    {
+    if (size > 0) {
         Tty* tty = (Tty*)file->node->privateNodeData;
 
-        if ((tty->term.c_lflag & ICANON) == ICANON)
-        {
-            while (TRUE)
-            {
-                for (int i = 0; i < tty->lineBufferIndex; ++i)
-                {
+        if ((tty->term.c_lflag & ICANON) == ICANON) {
+            while (TRUE) {
+                for (int i = 0; i < tty->lineBufferIndex; ++i) {
                     char chr = tty->lineBuffer[i];
 
-                    if (chr == '\n')
-                    {
+                    if (chr == '\n') {
                         int bytesToCopy = MIN(tty->lineBufferIndex, size);
 
-                        if (bytesToCopy >= tty->term.c_cc[VMIN])
-                        {
+                        if (bytesToCopy >= tty->term.c_cc[VMIN]) {
                             tty->lineBufferIndex = 0;
                             memcpy(buffer, tty->lineBuffer, bytesToCopy);
 
@@ -509,15 +460,12 @@ static int32 tty_read(File *file, uint32 size, uint8 *buffer)
                 halt();
             }
         }
-        else
-        {
-            while (TRUE)
-            {
+        else {
+            while (TRUE) {
                 uint32 neededSize = tty->term.c_cc[VMIN];
                 uint32 bufferLen = FifoBuffer_getSize(tty->keyBuffer);
 
-                if (bufferLen >= neededSize)
-                {
+                if (bufferLen >= neededSize) {
                     int readSize = FifoBuffer_dequeue(tty->keyBuffer, buffer, MIN(bufferLen, size));
 
                     return readSize;
@@ -533,16 +481,13 @@ static int32 tty_read(File *file, uint32 size, uint8 *buffer)
     return -1;
 }
 
-static int32 write(Tty* tty, uint32 size, uint8 *buffer)
-{
+static int32 write(Tty* tty, uint32 size, uint8 *buffer) {
     buffer[size] = '\0';
 
     Tty_PutText(tty, (const char*)buffer);
 
-    if (gActiveTty == tty)
-    {
-        if (gActiveTty->flushScreen)
-        {
+    if (gActiveTty == tty) {
+        if (gActiveTty->flushScreen) {
             gActiveTty->flushScreen(gActiveTty);
         }
     }
@@ -550,31 +495,25 @@ static int32 write(Tty* tty, uint32 size, uint8 *buffer)
     return size;
 }
 
-static int32 tty_write(File *file, uint32 size, uint8 *buffer)
-{
+static int32 tty_write(File *file, uint32 size, uint8 *buffer) {
     return write(file->node->privateNodeData, size, buffer);
 }
 
-static void setActiveTty(Tty* tty)
-{
+static void setActiveTty(Tty* tty) {
     gActiveTty = tty;
 
     Gfx_Fill(0xFFFFFFFF);
 
-    if (tty->flushScreen)
-    {
+    if (tty->flushScreen) {
         tty->flushScreen(tty);
     }
 
     //Serial_PrintF("line:%d column:%d\r\n", gActiveTty->currentLine, gActiveTty->currentColumn);
 }
 
-BOOL isValidTTY(Tty* tty)
-{
-    List_Foreach(n, gTtyList)
-    {
-        if (n->data == tty)
-        {
+BOOL isValidTTY(Tty* tty) {
+    List_Foreach(n, gTtyList) {
+        if (n->data == tty) {
             return TRUE;
         }
     }
@@ -582,31 +521,24 @@ BOOL isValidTTY(Tty* tty)
     return FALSE;
 }
 
-static uint8 getCharacterForScancode(KeyModifier modifier, uint8 scancode)
-{
+static uint8 getCharacterForScancode(KeyModifier modifier, uint8 scancode) {
     //return gKeyboardLayout[scancode];
-    if ((modifier & KM_LeftShift) == KM_LeftShift || (modifier & KM_RightShift) == KM_RightShift)
-    {
+    if ((modifier & KM_LeftShift) == KM_LeftShift || (modifier & KM_RightShift) == KM_RightShift) {
         return gKeyShiftMap[scancode];
     }
 
     return gKeyMap[scancode];
 }
 
-static void applyModifierKeys(KeyModifier modifier, uint8 scancode)
-{
-    if ((modifier & KM_Ctrl) == KM_Ctrl)
-    {
+static void applyModifierKeys(KeyModifier modifier, uint8 scancode) {
+    if ((modifier & KM_Ctrl) == KM_Ctrl) {
         int ttyIndex = scancode - KEY_F1;
         //printkf("TTY:%d\n", ttyIndex);
         int ttyCount = List_GetCount(gTtyList);
-        if (ttyIndex >= 0 && ttyIndex < ttyCount)
-        {
+        if (ttyIndex >= 0 && ttyIndex < ttyCount) {
             int i = 0;
-            List_Foreach(n, gTtyList)
-            {
-                if (ttyIndex == i)
-                {
+            List_Foreach(n, gTtyList) {
+                if (ttyIndex == i) {
                     setActiveTty(n->data);
                     break;
                 }
@@ -616,18 +548,15 @@ static void applyModifierKeys(KeyModifier modifier, uint8 scancode)
     }
 }
 
-static void processScancode(uint8 scancode)
-{
+static void processScancode(uint8 scancode) {
     uint8 lastBit = scancode & 0x80;
 
     scancode &= 0x7F;
 
-    if (lastBit)
-    {
+    if (lastBit) {
         //key release
 
-        switch (scancode)
-        {
+        switch (scancode) {
         case KEY_LEFTSHIFT:
             gKeyModifier &= ~KM_LeftShift;
             break;
@@ -644,12 +573,10 @@ static void processScancode(uint8 scancode)
 
         //printkf("released: %x (%d)\n", scancode, scancode);
     }
-    else
-    {
+    else {
         //key pressed
 
-        switch (scancode)
-        {
+        switch (scancode) {
         case KEY_LEFTSHIFT:
             gKeyModifier |= KM_LeftShift;
             break;