Simon Ford
/
keyboard
PS2ASCII.cpp@0:231dc8341ad9, 2009-11-12 (annotated)
- Committer:
- simon
- Date:
- Thu Nov 12 00:51:56 2009 +0000
- Revision:
- 0:231dc8341ad9
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
simon | 0:231dc8341ad9 | 1 | #include "PS2ASCII.h" |
simon | 0:231dc8341ad9 | 2 | |
simon | 0:231dc8341ad9 | 3 | //=================================== |
simon | 0:231dc8341ad9 | 4 | //*Constructor* |
simon | 0:231dc8341ad9 | 5 | //=================================== |
simon | 0:231dc8341ad9 | 6 | |
simon | 0:231dc8341ad9 | 7 | PS2ASCII::PS2ASCII(PinName data, PinName clk) : kbd(data,clk) ,_caps(false), _shift(false), _E0flag(false) ,_numlock(false) |
simon | 0:231dc8341ad9 | 8 | { |
simon | 0:231dc8341ad9 | 9 | |
simon | 0:231dc8341ad9 | 10 | } |
simon | 0:231dc8341ad9 | 11 | |
simon | 0:231dc8341ad9 | 12 | //=================================== |
simon | 0:231dc8341ad9 | 13 | //Functions |
simon | 0:231dc8341ad9 | 14 | //=================================== |
simon | 0:231dc8341ad9 | 15 | |
simon | 0:231dc8341ad9 | 16 | unsigned char PS2ASCII::getChar() |
simon | 0:231dc8341ad9 | 17 | { |
simon | 0:231dc8341ad9 | 18 | while(1) |
simon | 0:231dc8341ad9 | 19 | { |
simon | 0:231dc8341ad9 | 20 | _E0flag = false; |
simon | 0:231dc8341ad9 | 21 | unsigned char keypress = kbd.rd(); //code in |
simon | 0:231dc8341ad9 | 22 | |
simon | 0:231dc8341ad9 | 23 | if(keypress == 0xE0) //is it a special E0 key? |
simon | 0:231dc8341ad9 | 24 | { |
simon | 0:231dc8341ad9 | 25 | keypress = kbd.rd(); //next byte in |
simon | 0:231dc8341ad9 | 26 | if(keypress == NULL) //is it a break code? |
simon | 0:231dc8341ad9 | 27 | { |
simon | 0:231dc8341ad9 | 28 | keypress = kbd.rd(); //if so chew it up and back to start |
simon | 0:231dc8341ad9 | 29 | |
simon | 0:231dc8341ad9 | 30 | continue; |
simon | 0:231dc8341ad9 | 31 | } |
simon | 0:231dc8341ad9 | 32 | |
simon | 0:231dc8341ad9 | 33 | _E0flag = true; //tell us that it is an E0 function |
simon | 0:231dc8341ad9 | 34 | return keypress; |
simon | 0:231dc8341ad9 | 35 | } |
simon | 0:231dc8341ad9 | 36 | |
simon | 0:231dc8341ad9 | 37 | if((keypress == 0x12) || (keypress == 0x59)) //SHIFT pressed? |
simon | 0:231dc8341ad9 | 38 | { |
simon | 0:231dc8341ad9 | 39 | _shift = true; |
simon | 0:231dc8341ad9 | 40 | continue; |
simon | 0:231dc8341ad9 | 41 | } |
simon | 0:231dc8341ad9 | 42 | |
simon | 0:231dc8341ad9 | 43 | if(keypress == NULL) //gets rid of byte 1 of break code |
simon | 0:231dc8341ad9 | 44 | { |
simon | 0:231dc8341ad9 | 45 | keypress = kbd.rd(); //byte 2 of break code in |
simon | 0:231dc8341ad9 | 46 | |
simon | 0:231dc8341ad9 | 47 | if((keypress == 0x12) || (keypress == 0x59)) |
simon | 0:231dc8341ad9 | 48 | { |
simon | 0:231dc8341ad9 | 49 | _shift = false; |
simon | 0:231dc8341ad9 | 50 | } |
simon | 0:231dc8341ad9 | 51 | continue; |
simon | 0:231dc8341ad9 | 52 | } |
simon | 0:231dc8341ad9 | 53 | |
simon | 0:231dc8341ad9 | 54 | switch (keypress) { |
simon | 0:231dc8341ad9 | 55 | case 0x58: |
simon | 0:231dc8341ad9 | 56 | _caps = !_caps; //CAPS LOCK key |
simon | 0:231dc8341ad9 | 57 | continue; |
simon | 0:231dc8341ad9 | 58 | case 0x80: |
simon | 0:231dc8341ad9 | 59 | _numlock = !_numlock; |
simon | 0:231dc8341ad9 | 60 | continue; |
simon | 0:231dc8341ad9 | 61 | default: |
simon | 0:231dc8341ad9 | 62 | break; |
simon | 0:231dc8341ad9 | 63 | } |
simon | 0:231dc8341ad9 | 64 | |
simon | 0:231dc8341ad9 | 65 | unsigned char initial_keypress = keypress; |
simon | 0:231dc8341ad9 | 66 | |
simon | 0:231dc8341ad9 | 67 | if(_shift == true) //if SHIFT is pressed take shifted character |
simon | 0:231dc8341ad9 | 68 | { |
simon | 0:231dc8341ad9 | 69 | keypress = shift_on[keypress]; |
simon | 0:231dc8341ad9 | 70 | } |
simon | 0:231dc8341ad9 | 71 | |
simon | 0:231dc8341ad9 | 72 | if((_caps == true)&&(initial_keypress >= 97)&&(initial_keypress <= 127)) |
simon | 0:231dc8341ad9 | 73 | { |
simon | 0:231dc8341ad9 | 74 | keypress = shift_on[keypress]; //if caps is on shift the letter up |
simon | 0:231dc8341ad9 | 75 | } |
simon | 0:231dc8341ad9 | 76 | |
simon | 0:231dc8341ad9 | 77 | return(keypress); |
simon | 0:231dc8341ad9 | 78 | |
simon | 0:231dc8341ad9 | 79 | } |
simon | 0:231dc8341ad9 | 80 | } |
simon | 0:231dc8341ad9 | 81 | |
simon | 0:231dc8341ad9 | 82 | bool PS2ASCII::E0flag() |
simon | 0:231dc8341ad9 | 83 | { |
simon | 0:231dc8341ad9 | 84 | return _E0flag; |
simon | 0:231dc8341ad9 | 85 | } |
simon | 0:231dc8341ad9 | 86 | |
simon | 0:231dc8341ad9 | 87 | bool PS2ASCII::numlock() |
simon | 0:231dc8341ad9 | 88 | { |
simon | 0:231dc8341ad9 | 89 | return _numlock; |
simon | 0:231dc8341ad9 | 90 | } |
simon | 0:231dc8341ad9 | 91 | |
simon | 0:231dc8341ad9 | 92 |