|
MHVLib
20111227
An efficiency oriented runtime library for AVR microcontrollers
|
00001 /* 00002 * Copyright (c) 2011, Make, Hack, Void Inc 00003 * All rights reserved. 00004 * 00005 * License: GNU GPL v2 (see mhvlib-Vusb-Keyboard/vusb/License.txt) 00006 * 00007 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 00008 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00009 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00010 * DISCLAIMED. IN NO EVENT SHALL MAKE, HACK, VOID BE LIABLE FOR ANY 00011 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00012 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00013 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00014 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00015 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00016 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00017 */ 00018 00019 #include <MHV_VusbTypist.h> 00020 #include <avr/pgmspace.h> 00021 00022 extern "C" { 00023 #include <vusb/usbdrv.h> 00024 } 00025 00026 00033 MHV_VusbTypist::MHV_VusbTypist(MHV_RingBuffer &txBuffer, MHV_RTC &rtc) : 00034 MHV_VusbKeyboard(rtc), MHV_Device_TX(txBuffer) { 00035 _isTyping = false; 00036 } 00037 00042 void MHV_VusbTypist::alarm(const MHV_ALARM &alarm) { 00043 MHV_VusbKeyboard::alarm(alarm); 00044 if (usbInterruptIsReady()) { 00045 int c = nextCharacter(); 00046 00047 if (-1 == c) { 00048 if (_isTyping) { 00049 _isTyping = false; 00050 keysUp(); 00051 } 00052 return; 00053 } 00054 00055 _isTyping = true; 00056 typeChar(c); 00057 } 00058 } 00059 00064 void MHV_VusbTypist::runTxBuffers() { 00065 } 00066 00070 void MHV_VusbTypist::typeChar(char c) { 00071 uint8_t modifiers = 0; 00072 MHV_VUSB_KEYBOARD_KEY key = MHV_KEY_BACKSPACE; 00073 00074 if (c >= 'a' && c <= 'z') { 00075 key = MHV_KEY_A + (c - 'a'); 00076 } else if (c >= 'A' && c <= 'Z') { 00077 key = MHV_KEY_A + (c - 'A'); 00078 modifiers = MHV_MOD_SHIFT_LEFT; 00079 } else if (c >= '1' && c <= '9') { 00080 key = MHV_KEY_1 + (c - '1'); 00081 } else { 00082 // Shifted characters 00083 switch (c) { 00084 case '!': 00085 key = MHV_KEY_1; 00086 break; 00087 case '@': 00088 key = MHV_KEY_2; 00089 break; 00090 case '#': 00091 key = MHV_KEY_3; 00092 break; 00093 case '$': 00094 key = MHV_KEY_4; 00095 break; 00096 case '%': 00097 key = MHV_KEY_5; 00098 break; 00099 case '^': 00100 key = MHV_KEY_6; 00101 break; 00102 case '&': 00103 key = MHV_KEY_7; 00104 break; 00105 case '(': 00106 key = MHV_KEY_9; 00107 break; 00108 case ')': 00109 key = MHV_KEY_0; 00110 break; 00111 case '{': 00112 key = MHV_KEY_L_SQUARE; 00113 break; 00114 case '}': 00115 key = MHV_KEY_R_SQUARE; 00116 break; 00117 case '|': 00118 key = MHV_KEY_BACKSLASH; 00119 break; 00120 case ':': 00121 key = MHV_KEY_SEMICOLON; 00122 break; 00123 case '"': 00124 key = MHV_KEY_QUOTE; 00125 break; 00126 case '<': 00127 key = MHV_KEY_COMMA; 00128 break; 00129 case '>': 00130 key = MHV_KEY_FULLSTOP; 00131 break; 00132 case '?': 00133 key = MHV_KEY_SLASH; 00134 break; 00135 case '_': 00136 key = MHV_KEY_MINUS; 00137 break; 00138 case '+': 00139 key = MHV_KEY_EQUALS; 00140 break; 00141 case '~': 00142 key = MHV_KEY_GRAVE_ACCENT; 00143 break; 00144 } 00145 00146 if (MHV_KEY_BACKSPACE != key) { 00147 modifiers = MHV_MOD_SHIFT_LEFT; 00148 } 00149 } 00150 00151 if (MHV_KEY_BACKSPACE == key) { 00152 switch (c) { 00153 case '0': 00154 key = MHV_KEY_0; 00155 break; 00156 case '\n': 00157 key = MHV_KEY_ENTER; 00158 break; 00159 case '\t': 00160 key = MHV_KEY_TAB; 00161 break; 00162 case '*': 00163 key = MHV_KEYPAD_ASTERISK; 00164 break; 00165 case '[': 00166 key = MHV_KEY_L_SQUARE; 00167 break; 00168 case ']': 00169 key = MHV_KEY_R_SQUARE; 00170 break; 00171 case '\\': 00172 key = MHV_KEY_BACKSLASH; 00173 break; 00174 case ';': 00175 key = MHV_KEY_SEMICOLON; 00176 break; 00177 case '\'': 00178 key = MHV_KEY_QUOTE; 00179 break; 00180 case ',': 00181 key = MHV_KEY_COMMA; 00182 break; 00183 case '.': 00184 key = MHV_KEY_FULLSTOP; 00185 break; 00186 case '/': 00187 key = MHV_KEY_SLASH; 00188 break; 00189 case '-': 00190 key = MHV_KEY_MINUS; 00191 break; 00192 case '=': 00193 key = MHV_KEY_EQUALS; 00194 break; 00195 case '`': 00196 key = MHV_KEY_GRAVE_ACCENT; 00197 break; 00198 } 00199 } 00200 00201 if (MHV_KEY_BACKSPACE == key) { 00202 key = MHV_KEY_SPACE; 00203 } 00204 00205 keyDown(key, modifiers); 00206 }