Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: PinDetect USBDevice mbed
KeyManager.h@0:286a51986128, 2014-09-21 (annotated)
- Committer:
- douglasc
- Date:
- Sun Sep 21 19:11:55 2014 +0000
- Revision:
- 0:286a51986128
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
douglasc | 0:286a51986128 | 1 | /** |
douglasc | 0:286a51986128 | 2 | * Class KeyManager |
douglasc | 0:286a51986128 | 3 | * |
douglasc | 0:286a51986128 | 4 | * This class tracks the state of the seven input |
douglasc | 0:286a51986128 | 5 | * buttons. It exposes (void) callback methods to |
douglasc | 0:286a51986128 | 6 | * flag each button as active or not and provides |
douglasc | 0:286a51986128 | 7 | * a mapping between key combinations and the |
douglasc | 0:286a51986128 | 8 | * alphabet for text input. |
douglasc | 0:286a51986128 | 9 | * |
douglasc | 0:286a51986128 | 10 | */ |
douglasc | 0:286a51986128 | 11 | |
douglasc | 0:286a51986128 | 12 | #ifndef KEYMANAGER |
douglasc | 0:286a51986128 | 13 | #define KEYMANAGER |
douglasc | 0:286a51986128 | 14 | |
douglasc | 0:286a51986128 | 15 | #include <string> |
douglasc | 0:286a51986128 | 16 | #include <ctype.h> |
douglasc | 0:286a51986128 | 17 | |
douglasc | 0:286a51986128 | 18 | class KeyManager { |
douglasc | 0:286a51986128 | 19 | private: |
douglasc | 0:286a51986128 | 20 | // key definitions |
douglasc | 0:286a51986128 | 21 | bool keyModifier; |
douglasc | 0:286a51986128 | 22 | bool keySpace; |
douglasc | 0:286a51986128 | 23 | bool key0; |
douglasc | 0:286a51986128 | 24 | bool key1; |
douglasc | 0:286a51986128 | 25 | bool key2; |
douglasc | 0:286a51986128 | 26 | bool key3; |
douglasc | 0:286a51986128 | 27 | bool key4; |
douglasc | 0:286a51986128 | 28 | |
douglasc | 0:286a51986128 | 29 | // static character map and constants |
douglasc | 0:286a51986128 | 30 | static char characters[27]; |
douglasc | 0:286a51986128 | 31 | static char space; |
douglasc | 0:286a51986128 | 32 | static char unknown; |
douglasc | 0:286a51986128 | 33 | |
douglasc | 0:286a51986128 | 34 | public: |
douglasc | 0:286a51986128 | 35 | |
douglasc | 0:286a51986128 | 36 | // constructor |
douglasc | 0:286a51986128 | 37 | KeyManager() { |
douglasc | 0:286a51986128 | 38 | keyModifier = false; |
douglasc | 0:286a51986128 | 39 | keySpace = false; |
douglasc | 0:286a51986128 | 40 | key0 = false; |
douglasc | 0:286a51986128 | 41 | key1 = false; |
douglasc | 0:286a51986128 | 42 | key2 = false; |
douglasc | 0:286a51986128 | 43 | key3 = false; |
douglasc | 0:286a51986128 | 44 | key4 = false; |
douglasc | 0:286a51986128 | 45 | } |
douglasc | 0:286a51986128 | 46 | |
douglasc | 0:286a51986128 | 47 | // DEBUG: return the status of which keys are pressed |
douglasc | 0:286a51986128 | 48 | char* getStatusString() { |
douglasc | 0:286a51986128 | 49 | std::string status = "the following keys are pressed:"; |
douglasc | 0:286a51986128 | 50 | if (key0) { |
douglasc | 0:286a51986128 | 51 | status += " 0"; |
douglasc | 0:286a51986128 | 52 | } |
douglasc | 0:286a51986128 | 53 | if (key1) { |
douglasc | 0:286a51986128 | 54 | status += " 1"; |
douglasc | 0:286a51986128 | 55 | } |
douglasc | 0:286a51986128 | 56 | if (key2) { |
douglasc | 0:286a51986128 | 57 | status += " 2"; |
douglasc | 0:286a51986128 | 58 | } |
douglasc | 0:286a51986128 | 59 | if (key3) { |
douglasc | 0:286a51986128 | 60 | status += " 3"; |
douglasc | 0:286a51986128 | 61 | } |
douglasc | 0:286a51986128 | 62 | if (key4) { |
douglasc | 0:286a51986128 | 63 | status += " 4"; |
douglasc | 0:286a51986128 | 64 | } |
douglasc | 0:286a51986128 | 65 | status += "\n"; |
douglasc | 0:286a51986128 | 66 | return (char*)status.c_str(); |
douglasc | 0:286a51986128 | 67 | } |
douglasc | 0:286a51986128 | 68 | |
douglasc | 0:286a51986128 | 69 | // get the numeric code corresponding to |
douglasc | 0:286a51986128 | 70 | // the currently pressed keys. |
douglasc | 0:286a51986128 | 71 | int getCode() { |
douglasc | 0:286a51986128 | 72 | int result = 0; |
douglasc | 0:286a51986128 | 73 | if (key0) { |
douglasc | 0:286a51986128 | 74 | result = result | 1; |
douglasc | 0:286a51986128 | 75 | } |
douglasc | 0:286a51986128 | 76 | if (key1) { |
douglasc | 0:286a51986128 | 77 | result = result | 2; |
douglasc | 0:286a51986128 | 78 | } |
douglasc | 0:286a51986128 | 79 | if (key2) { |
douglasc | 0:286a51986128 | 80 | result = result | 4; |
douglasc | 0:286a51986128 | 81 | } |
douglasc | 0:286a51986128 | 82 | if (key3) { |
douglasc | 0:286a51986128 | 83 | result = result | 8; |
douglasc | 0:286a51986128 | 84 | } |
douglasc | 0:286a51986128 | 85 | if (key4) { |
douglasc | 0:286a51986128 | 86 | result = result | 16; |
douglasc | 0:286a51986128 | 87 | } |
douglasc | 0:286a51986128 | 88 | return result; |
douglasc | 0:286a51986128 | 89 | } |
douglasc | 0:286a51986128 | 90 | |
douglasc | 0:286a51986128 | 91 | // map the current code to its character |
douglasc | 0:286a51986128 | 92 | char getCharacter() { |
douglasc | 0:286a51986128 | 93 | if (keySpace) { |
douglasc | 0:286a51986128 | 94 | return space; |
douglasc | 0:286a51986128 | 95 | } else { |
douglasc | 0:286a51986128 | 96 | int code = this->getCode(); |
douglasc | 0:286a51986128 | 97 | if (code < 28 && !keyModifier) { |
douglasc | 0:286a51986128 | 98 | return characters[code-1]; |
douglasc | 0:286a51986128 | 99 | } else if (code < 28 && keyModifier) { |
douglasc | 0:286a51986128 | 100 | return toupper(characters[code-1]); |
douglasc | 0:286a51986128 | 101 | } else { |
douglasc | 0:286a51986128 | 102 | return unknown; |
douglasc | 0:286a51986128 | 103 | } |
douglasc | 0:286a51986128 | 104 | } |
douglasc | 0:286a51986128 | 105 | } |
douglasc | 0:286a51986128 | 106 | |
douglasc | 0:286a51986128 | 107 | // check whether any of the character keys or the space |
douglasc | 0:286a51986128 | 108 | // key are pressed |
douglasc | 0:286a51986128 | 109 | bool keysPressed() { |
douglasc | 0:286a51986128 | 110 | if (key0 || key1 || key2 || key3 || key4 || keySpace) { |
douglasc | 0:286a51986128 | 111 | return true; |
douglasc | 0:286a51986128 | 112 | } |
douglasc | 0:286a51986128 | 113 | return false; |
douglasc | 0:286a51986128 | 114 | } |
douglasc | 0:286a51986128 | 115 | |
douglasc | 0:286a51986128 | 116 | // Interrupt callback functions |
douglasc | 0:286a51986128 | 117 | void keyMOn() { keyModifier = true; } |
douglasc | 0:286a51986128 | 118 | void keyMOff() { keyModifier = false; } |
douglasc | 0:286a51986128 | 119 | void keySpaceOn() { keySpace = true; } |
douglasc | 0:286a51986128 | 120 | void keySpaceOff() { keySpace = false; } |
douglasc | 0:286a51986128 | 121 | void key0On() { key0 = true; } |
douglasc | 0:286a51986128 | 122 | void key0Off() { key0 = false; } |
douglasc | 0:286a51986128 | 123 | void key1On() { key1 = true; } |
douglasc | 0:286a51986128 | 124 | void key1Off() { key1 = false; } |
douglasc | 0:286a51986128 | 125 | void key2On() { key2 = true; } |
douglasc | 0:286a51986128 | 126 | void key2Off() { key2 = false; } |
douglasc | 0:286a51986128 | 127 | void key3On() { key3 = true; } |
douglasc | 0:286a51986128 | 128 | void key3Off() { key3 = false; } |
douglasc | 0:286a51986128 | 129 | void key4On() { key4 = true; } |
douglasc | 0:286a51986128 | 130 | void key4Off() { key4 = false; } |
douglasc | 0:286a51986128 | 131 | }; |
douglasc | 0:286a51986128 | 132 | |
douglasc | 0:286a51986128 | 133 | // define statics |
douglasc | 0:286a51986128 | 134 | char KeyManager::characters[27] = {'a','b','c','d','e','f','g', |
douglasc | 0:286a51986128 | 135 | 'h','i','j','k','l','m','n','o','p','q','r','s','t', |
douglasc | 0:286a51986128 | 136 | 'u','v','w','x','y','z','.' }; |
douglasc | 0:286a51986128 | 137 | char KeyManager::space = ' '; |
douglasc | 0:286a51986128 | 138 | char KeyManager::unknown = '?'; |
douglasc | 0:286a51986128 | 139 | |
douglasc | 0:286a51986128 | 140 | #endif |