// Keyboard Utility // Key Define (Virtual Windows Key Code) TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD20x4 ); // rs, e, d4-d7, LCDType DigitalIn ESCKEY(p10); // EXIT KEY FROM SPECIAL SWITCH (Not on key from keyboard) #define VK_ENTER 13 #define VK_BACK 0x08 #define VK_TAB 0x09 #define VK_SHIFT 0x10 // SHIFT #define VK_CONTROL 0x11 // CONTROL #define VK_MENU 0x12 // ALT #define VK_CAPITAL 0x14 #define VK_ESCAPE 0x1B #define VK_SPACE 0x20 #define VK_PRIOR 0x21 // Page Up #define VK_NEXT 0x22 // Page Down #define VK_END 0x23 #define VK_HOME 0x24 #define VK_LEFT 0x25 #define VK_UP 0x26 #define VK_RIGHT 0x27 #define VK_DOWN 0x28 #define VK_SELECT 0x29 #define VK_SNAPSHOT 0x2C #define VK_INSERT 0x2D #define VK_DELETE 0x2E #define VK_HELP 0x2F #define VK_LWIN 0x5B // Left Windows Logo #define VK_RWIN 0x5C // Right Windows Logo #define VK_NUMPAD0 0x60 // Number PAD 0 #define VK_NUMPAD1 0x61 #define VK_NUMPAD2 0x62 #define VK_NUMPAD3 0x63 #define VK_NUMPAD4 0x64 #define VK_NUMPAD5 0x65 #define VK_NUMPAD6 0x66 #define VK_NUMPAD7 0x67 #define VK_NUMPAD8 0x68 #define VK_NUMPAD9 0x69 #define VK_NUMENTER 0x00 #define VK_MULTIPLY 0x6A #define VK_ADD 0x6B #define VK_SEPARATOR 0x6C #define VK_SUBTRACT 0x6D #define VK_DECIMAL 0x6E #define VK_DIVIDE 0x6F #define VK_F1 0x70 #define VK_F2 0x71 #define VK_F3 0x72 #define VK_F4 0x73 #define VK_F5 0x74 #define VK_F6 0x75 #define VK_F7 0x76 #define VK_F8 0x77 #define VK_F9 0x78 #define VK_F10 0x79 #define VK_F11 0x7A #define VK_F12 0x7B #define VK_F13 0x7C #define VK_F14 0x7D #define VK_F15 0x7E #define VK_F16 0x7F #define VK_F17 0x80 #define VK_F18 0x81 #define VK_F19 0x82 #define VK_F20 0x83 #define VK_F21 0x84 #define VK_F22 0x85 #define VK_F23 0x86 #define VK_F24 0x87 #define VK_NUMLOCK 0x90 #define VK_SCROLL 0x91 #define VK_LSHIFT 0xA0 #define VK_RSHIFT 0xA1 #define VK_LCONTROL 0xA2 #define VK_RCONTROL 0xA3 #define VK_LMENU 0xA4 #define VK_RMENU 0xA5 #define VK_PLAY 0xFA #define VK_ZOOM 0xFB #define VK_POWER 0x00 #define VK_SLEEP 0x00 #define VK_WAKE 0x00 #define VK_PREVIOUS 0x00 #define VK_STOP 0x00 #define VK_MUTE 0x00 #define VK_VOLUP 0x00 #define VK_VOLDOWN 0x00 #define VK_EMAIL 0x00 #define VK_CAL 0x00 #define VK_MYCOMPUTER 0x00 #define VK_WWWSEARCH 0x00 #define VK_WWWHOME 0x00 #define VK_WWWBACK 0x00 #define VK_WWWFORWARD 0x00 #define VK_WWWSTOP 0x00 #define VK_WWWREFRESH 0x00 #define VK_WWWFAVORITIES 0x00 // CODE, Normal, CAPON, SHIFTON, ALTON, CTRLON, (can be change on next version) char makecode[][2]={ 0x1C, 'a', 0x32, 'b', 0x21, 'c', 0x23, 'd', 0x24, 'e', 0x2B, 'f', 0x34, 'g', 0x33, 'h', 0x43, 'i', 0x3B, 'j', 0x42, 'k', 0x4B, 'l', 0x3A, 'm', 0x31, 'n', 0x44, 'o', 0x4D, 'p', 0x15, 'q', 0x2D, 'r', 0x1B, 's', 0x2C, 't', 0x3C, 'u', 0x2A, 'v', 0x1D, 'w', 0x22, 'x', 0x35, 'y', 0x1A, 'z', 0x45, '0', 0x16, '1', 0x1E, '2', 0x26, '3', 0x25, '4', 0x2E, '5', 0x36, '6', 0x3D, '7', 0x3E, '8', 0x46, '9', 0x0E, '`', 0x4E, '-', 0x55, '=', 0x5D, '\\', 0x66, VK_BACK, 0x22, ' ', 0x0D, VK_TAB, 0x58, VK_CAPITAL, 0x12, VK_LSHIFT, 0x14, VK_LCONTROL, 0x11, VK_MENU, 0x59, VK_RSHIFT, 0x5A, VK_ENTER, 0x76, VK_ESCAPE, 0x05, VK_F1, 0x06, VK_F2, 0x04, VK_F3, 0x0C, VK_F4, 0x03, VK_F5, 0x0B, VK_F6, 0x83, VK_F7, 0x0A, VK_F8, 0x01, VK_F9, 0x09, VK_F10, 0x78, VK_F11, 0x54, '[', 0x77, VK_NUMLOCK, 0x7C, VK_DIVIDE, 0x7B, VK_MULTIPLY, 0x7B, VK_SUBTRACT, 0x79, VK_ADD, 0x71, '.', 0x70, VK_NUMPAD0, 0x69, VK_NUMPAD1, 0x72, VK_NUMPAD2, 0x7A, VK_NUMPAD3, 0x6B, VK_NUMPAD4, 0x73, VK_NUMPAD5, 0x74, VK_NUMPAD6, 0x6C, VK_NUMPAD7, 0x75, VK_NUMPAD8, 0x7D, VK_NUMPAD9, 0x5B, ']', 0x4C, ']', 0x52, '\'', 0x41, ',', 0x49, '.', 0x4A, '/', 0x29, ' '}; char makescode[][2]={ 0x37, VK_POWER, 0x3F, VK_SLEEP, 0x5E, VK_WAKE, 0x4D, VK_NEXT, // E0 + < > 0x15, VK_PREVIOUS, 0x3B, VK_STOP, 0x34, VK_PLAY, 0x23, VK_MUTE, 0x32, VK_VOLUP, 0x21, VK_VOLDOWN, 0x50, VK_SELECT, 0x48, VK_EMAIL, 0x2B, VK_CAL, 0x40, VK_MYCOMPUTER,0x10, VK_WWWSEARCH, 0x3A, VK_WWWHOME, 0x38, VK_WWWBACK, 0x30, VK_WWWFORWARD, 0x28, VK_WWWSTOP, 0x20, VK_WWWREFRESH, 0x18, VK_WWWFAVORITIES, 0x70, VK_INSERT, 0x6C, VK_HOME, 0x71, VK_DELETE, 0x69, VK_END, 0x69, VK_UP, 0x6B, VK_LEFT, 0x72, VK_DOWN, 0x74, VK_RIGHT, 0x5A, VK_NUMENTER }; char shifted[][2] = {0x1C, 'A', 0x32, 'B', 0x21, 'C', 0x23, 'D', 0x24, 'E', 0x2B, 'F', 0x34, 'G', 0x33, 'H', 0x43, 'I', 0x3B, 'J', 0x42, 'K', 0x4B, 'L', 0x3A, 'M', 0x31, 'N', 0x44, 'O', 0x4D, 'P', 0x15, 'Q', 0x2D, 'R', 0x1B, 'S', 0x2C, 'T', 0x3C, 'U', 0x2A, 'V', 0x1D, 'W', 0x22, 'X', 0x35, 'Y', 0x1A, 'Z', 0x45, ')', 0x16, '!', 0x1E, '@', 0x26, '#', 0x25, '$', 0x2E, '%', 0x36, '^', 0x3D, '&', 0x3E, '*', 0x46, '(', 0x0E, '~', 0x4E, '_', 0x55, '+', 0x5D, '|', 0x66, VK_BACK, 0x22, ' ', 0x0D, VK_TAB, 0x58, VK_CAPITAL, 0x12, VK_LSHIFT, 0x14, VK_LCONTROL, 0x11, VK_MENU, 0x59, VK_RSHIFT, 0x5A, VK_ENTER, 0x76, VK_ESCAPE, 0x05, VK_F1, 0x06, VK_F2, 0x04, VK_F3, 0x0C, VK_F4, 0x03, VK_F5, 0x0B, VK_F6, 0x83, VK_F7, 0x0A, VK_F8, 0x01, VK_F9, 0x09, VK_F10, 0x78, VK_F11, 0x54, '{', 0x77, VK_NUMLOCK, 0x7C, VK_DIVIDE, 0x7B, VK_MULTIPLY, 0x7B, VK_SUBTRACT, 0x79, VK_ADD, 0x71, '.', 0x70, VK_NUMPAD0, 0x69, VK_NUMPAD1, 0x72, VK_NUMPAD2, 0x7A, VK_NUMPAD3, 0x6B, VK_NUMPAD4, 0x73, VK_NUMPAD5, 0x74, VK_NUMPAD6, 0x6C, VK_NUMPAD7, 0x75, VK_NUMPAD8, 0x7D, VK_NUMPAD9, 0x5B, '}', 0x4C, '}', 0x52, '"', 0x41, '<', 0x49, '>', 0x4A, '?', 0x29, ' ' }; // Keyboard Utility // // Read Only ASCII>=32 and ASCII <=255 // exit on Enter of ESCAPE PS2Keyboard ps2kb(p12, p11); PS2Keyboard::keyboard_event_t evt_kb; char DECODE(char scancode[8], int size, PS2Keyboard::Type keystatus) { static bool iscapon = (1==0); static bool isshifton = (1==0); static bool isctrlon = (1==0); static bool isalton = (1==0); char result; bool isexit = (1==0); result = 0x00; if (size==0) { return '\0'; } if (keystatus==PS2Keyboard::KeyMake) { // key hold down if (size==1) { result = 0x00; if (scancode[0] == 0x12) { // hold down shift key isshifton = (!iscapon); } else if (scancode[0] == 0x11) { // hold down alt key isalton = (1==1); } else if (scancode[0] == 0x14) { // hold down ctrl key isctrlon = (1==1); } else { for (int i=0; ((i < (int) sizeof(makecode) /sizeof(char) / 2) && (!isexit)); i ++) { if (scancode[0]==makecode[i][0]) { result = makecode[i][1]; isexit = (1==1); } } } } else if (scancode[0]==0xE0) { for (int i=0;(i < (int) sizeof(makescode) / sizeof(char) / 2) && (!isexit); i++) { if (scancode[1]==makescode[i][0]) { result = makescode[i][1]; isexit = (1==1); } } } } else if (keystatus==PS2Keyboard::KeyBreak) { // Key released switch (scancode[0]) { case 0xF0: if (scancode[1]==0x58) { // Normal Key Entry iscapon = !iscapon; break; } else if (scancode[1]==0x12) { // Release shift key isshifton = (1==0); break; } else if (scancode[1]==0x14) { // Release ctrl key isctrlon = (1==0); break; } else if (scancode[1]==0x11) { // Release alt key isalton = (1==0); break; } isexit = (1==0); if ((iscapon)||(isshifton)) { for (int i=0; ((i < (int) sizeof(shifted) / sizeof(char) / 2)&&(!isexit)); i++) { if (scancode[1]==shifted[i][0]) { result = shifted[i][1]; isexit = (1==1); } // end if-loop } // end for-loop } else { for (int i=0; ((i < (int) sizeof(makecode) / sizeof(char) / 2) &&(!isexit)); i ++) { if (scancode[1]==makecode[i][0]) { result = makecode[i][1]; isexit = (1==1); } // end if-loop } // end for-loop } //end if-loop break; case 0xE0: if (scancode[1]==0xF0) { // Special Key Entry for (int i=0; ((i < (int) sizeof(makescode) / sizeof(char) / 2) && (!isexit)); i++) { if (scancode[2]==makescode[i][0]) { result = makescode[i][1]; isexit = (1==1); } } } break; } // end-case loop } //CAPON = iscapon; //SHIFTON = isshifton; return result; } bool get_line(char * result) { char rtn[80]; int loc = 0; int cursor_status; char key; int x; int y; bool isexit = false; bool c = false; rtn[0] = 0x00; x = lcd.column(); y = lcd.row(); cursor_status = lcd.cursor(CURSOR_ON); while (ESCKEY==1) ; lcd.locate(x,y); lcd.printf(""); // Show cursor to current position while ((!isexit)&&(ESCKEY==0)) { c = ps2kb.processing(&evt_kb); //GREEN_LED = (c?1:0); if (c) { key = DECODE(evt_kb.scancode, evt_kb.length, evt_kb.type); if (evt_kb.type == PS2Keyboard::KeyBreak) { if ((key>=32)&&(key<=255)) { rtn[loc] = rtn[loc] + key; loc ++; rtn[loc] = 0; } else if (key==VK_BACK) { rtn[loc-1] = 0; if (loc>1) { loc --; }; } else if (key==VK_ESCAPE) { rtn[0] = 0x00; loc = 0; } isexit = ((key==VK_ESCAPE)||(key==VK_ENTER)||(key==VK_TAB));//||(ESCKEY==1)); lcd.locate(x,y); lcd.printf("%s",rtn); lcd.locate(0,3); } } // end --if (c) } // end -while lcd.cursor(cursor_status); if (ESCKEY==1) { rtn[0] = 0x00; loc = 0; return(false); } sprintf(result, "%s",rtn); return (key!=VK_ESCAPE); }