keyboard.c

00001 /***************************************************************************
00002                           keyboard.c  -  description
00003                              -------------------
00004     begin                : Fri Dec 26 2003
00005     copyright            : (C) 2003 by Dynacube Team
00006     email                : mdshah82@yahoo.com
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 #include "dev/keyboard/keyboard.h"
00018 #include "common/ktypes.h"
00019 #include "core/kio.h"
00020 #include "core/kstdio.h"
00021 #include "core/kint.h"
00022 #include "common/string.h"
00023 
00024 /*
00025 01   Esc        0F   Tab        1D   L Ctrl     2B   \|
00026 02   1!         10   Q          1E   A          2C   Z
00027 03   2"         11   W          1F   S          2D   X
00028 04   3#         12   E          20   D          2E   C
00029 05   4$         13   R          21   F          2F   V
00030 06   5%         14   T          22   G          30   B
00031 07   6^         15   Y          23   H          31   N
00032 08   7&         16   U          24   J          32   M
00033 09   8*         17   I          25   K          33   ,<
00034 0A   9(         18   O          26   L          34   .>
00035 0B   0)         19   P          27   ;:         35   /?
00036 0C   -_         1A   [{         28   '"         36   R Shift
00037 0D   =+         1B   ]}         29   `~         37   *
00038 0E   BackSpace  1C   Enter      2A   L Shift    38   L Alt
00039 
00040 39   Space      41   F7         49   PageUp 9   51   PageDown 3
00041 3A   CapsLock   42   F8         4A   -          52   Insert 0
00042 3B   F1         43   F9         4B   (left) 4   53   Del .
00043 3C   F2         44   F10        4C   5
00044 3D   F3         45   NumLock    4D   (right) 6  57   F11
00045 3E   F4         46   ScrollLock 4E   +          58   F12
00046 3F   F5         47   Home  7    4F   End 1
00047 40   F6         48   (up) 8     50   (down) 2
00048 
00049 */
00050 
00051  boolean _ctrl = _false, _alt = _false, _shift = _false, _caps = _false;
00052 
00053  // This Handler will evolve into a buffering method and the remaining
00054  // code will be stripped from it to make a shell
00055  boolean make = _true;
00056 
00057  void handle_KBD()
00058  {
00059   DB scan, ch, i;
00060   MSG mymsg;
00061   static DW state;
00062   static DW prev;
00063 
00064   scan = readData();
00065   ch = decode(scan);
00066 
00067         switch(scan)
00068         {
00069                 case _CTRL_PUSH:
00070                         _ctrl = _true;
00071                 state |= ST_CNTL;
00072                         break;
00073 
00074                 case _CTRL_PULL:
00075                         _ctrl = _false;
00076                 state &= ~ST_CNTL;
00077                         break;
00078 
00079                 case _ALT_PUSH:
00080                 state |= ST_ALT;
00081                         _alt = _true;
00082                         break;
00083 
00084                 case _ALT_PULL:
00085                 state &= ~ST_ALT;
00086                         _alt = _false;
00087                         break;
00088 
00089                 case _SHIFT_PUSH:
00090                 state |= ST_SHIFT;
00091                         _shift = _true;
00092                         break;
00093                         
00094                 case _R_SHIFT_PUSH :
00095                         state |= ST_SHIFT;
00096                         _shift = _true;
00097                         break;
00098 
00099                 case _SHIFT_PULL:
00100                         if(prev != 0xE0)
00101                         {
00102                         state &= ~ST_SHIFT;
00103                                 _shift = _false;
00104                         }
00105                         break;
00106                         
00107                 case _R_SHIFT_PULL:
00108                         if(prev != 0xE0)
00109                         {
00110                         state &= ~ST_SHIFT;
00111                                 _shift = _false;
00112                         }
00113                         break;
00114                         
00115                 case _CAPS_TOGGLE:
00116                         _caps = !_caps;
00117                         break;
00118 
00119                 default:
00120                         break;
00121         }
00122 
00123         if(ch == DEL && _ctrl == _true && _alt == _true)
00124         {
00125                 //Call Sys_Sync to Sync the System
00126             //Then lidt(SomeLoc);
00127             ginfo(40,200,"RESTART");
00128             lidt((IDT*)0x0);
00129         }
00130 
00131         switch(ch)
00132         {
00133                 case 0:
00134                         break;
00135                         
00136                 case VK_TAB:
00137                         printf("\t");
00138                         break;
00139                         
00140                 default:
00141                           mymsg.type     = ACTION;
00142                           mymsg.sub_type = KBD;
00143                           mymsg.length   = 6;
00144                         
00145                         
00146                           if(_caps)
00147                                 state |=  ST_CAPS;
00148                           else
00149                                 state &= ~ST_CAPS;
00150                         
00151                         
00152                           *((DW*)mymsg.msg_buf) = state;
00153                           *((DW*)mymsg.msg_buf+1) = ch;
00154                           
00155                           if(ksend(GUI_PID,&mymsg) == -1)
00156                               panic("from mouse message overflow");
00157                               
00158                           break;
00159         }
00160                         
00161   updateCursor();
00162   prev = scan;
00163   eoi();
00164  }
00165 
00166   DB decode(DB in)
00167   {
00168                         DB map[] = {
00169                                  /* 00 */ 0,ESC,'1','2','3','4','5','6','7','8',                                                    \
00170                      /* 0A */ '9','0','-','=','\b','\t','q','w','e','r',                                                \
00171                      /* 14 */ 't','y','u','i','o','p','[',']','\n',CTRL,                                                \
00172                      /* 1E */ 'a','s','d','f','g','h','j','k','l',';',                                                  \
00173                      /* 28 */ '\'','`',SHIFT,'\\','z','x','c','v','b','n',            \
00174                      /* 32 */ 'm',',','.','/',SHIFT,'*',ALT,' ',CAPS_LOCK,F1,         \
00175                      /* 3c */  F2,F3,F4,F5,F6,F7,F8,F9,F10,NUM_LOCK,                  \
00176                      /* 46 */ SCROLL_LOCK,HOME,UP,PAGE_UP,'-',LEFT_A,'5',RIGHT_A,'+',END, \
00177                      /* 50 */  DOWN,PAGE_DOWN,INS,DEL,0,0,0,F11,F12};
00178 
00179             if(in > 0x80)
00180               return 0;
00181             if(in >= (sizeof(map) / sizeof(map[0])))
00182                return 0;
00183             return map[in];
00184         }

Generated on Thu Jul 27 23:52:26 2006 for Dynacube by  doxygen 1.4.7