Interactive Device Design / Mbed 2 deprecated idd_hw2_douglasc_5keymouse

Dependencies:   PinDetect USBDevice mbed

Committer:
douglasc
Date:
Sun Sep 21 19:11:55 2014 +0000
Revision:
0:286a51986128
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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