MHVLib
20111011
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 00041 void MHV_VusbTypist::alarm(MHV_ALARM *alarm) { 00042 MHV_VusbKeyboard::alarm(alarm); 00043 if (usbInterruptIsReady()) { 00044 int c = nextCharacter(); 00045 00046 if (-1 == c) { 00047 if (_isTyping) { 00048 _isTyping = false; 00049 keysUp(); 00050 } 00051 return; 00052 } 00053 00054 _isTyping = true; 00055 typeChar(c); 00056 } 00057 } 00058 00063 void MHV_VusbTypist::runTxBuffers() { 00064 } 00065 00069 void MHV_VusbTypist::typeChar(char c) { 00070 uint8_t modifiers = 0; 00071 MHV_VUSB_KEYBOARD_KEY key = MHV_KEY_BACKSPACE; 00072 00073 if (c >= 'a' && c <= 'z') { 00074 key = MHV_KEY_A + (c - 'a'); 00075 } else if (c >= 'A' && c <= 'Z') { 00076 key = MHV_KEY_A + (c - 'A'); 00077 modifiers = MHV_MOD_SHIFT_LEFT; 00078 } else if (c >= '1' && c <= '9') { 00079 key = MHV_KEY_1 + (c - '1'); 00080 } else { 00081 // Shifted characters 00082 switch (c) { 00083 case '!': 00084 key = MHV_KEY_1; 00085 break; 00086 case '@': 00087 key = MHV_KEY_2; 00088 break; 00089 case '#': 00090 key = MHV_KEY_3; 00091 break; 00092 case '$': 00093 key = MHV_KEY_4; 00094 break; 00095 case '%': 00096 key = MHV_KEY_5; 00097 break; 00098 case '^': 00099 key = MHV_KEY_6; 00100 break; 00101 case '&': 00102 key = MHV_KEY_7; 00103 break; 00104 case '(': 00105 key = MHV_KEY_9; 00106 break; 00107 case ')': 00108 key = MHV_KEY_0; 00109 break; 00110 case '{': 00111 key = MHV_KEY_L_SQUARE; 00112 break; 00113 case '}': 00114 key = MHV_KEY_R_SQUARE; 00115 break; 00116 case '|': 00117 key = MHV_KEY_BACKSLASH; 00118 break; 00119 case ':': 00120 key = MHV_KEY_SEMICOLON; 00121 break; 00122 case '"': 00123 key = MHV_KEY_QUOTE; 00124 break; 00125 case '<': 00126 key = MHV_KEY_COMMA; 00127 break; 00128 case '>': 00129 key = MHV_KEY_FULLSTOP; 00130 break; 00131 case '?': 00132 key = MHV_KEY_SLASH; 00133 break; 00134 case '_': 00135 key = MHV_KEY_MINUS; 00136 break; 00137 case '+': 00138 key = MHV_KEY_EQUALS; 00139 break; 00140 case '~': 00141 key = MHV_KEY_GRAVE_ACCENT; 00142 break; 00143 } 00144 00145 if (MHV_KEY_BACKSPACE != key) { 00146 modifiers = MHV_MOD_SHIFT_LEFT; 00147 } 00148 } 00149 00150 if (MHV_KEY_BACKSPACE == key) { 00151 switch (c) { 00152 case '0': 00153 key = MHV_KEY_0; 00154 break; 00155 case '\n': 00156 key = MHV_KEY_ENTER; 00157 break; 00158 case '\t': 00159 key = MHV_KEY_TAB; 00160 break; 00161 case '*': 00162 key = MHV_KEYPAD_ASTERISK; 00163 break; 00164 case '[': 00165 key = MHV_KEY_L_SQUARE; 00166 break; 00167 case ']': 00168 key = MHV_KEY_R_SQUARE; 00169 break; 00170 case '\\': 00171 key = MHV_KEY_BACKSLASH; 00172 break; 00173 case ';': 00174 key = MHV_KEY_SEMICOLON; 00175 break; 00176 case '\'': 00177 key = MHV_KEY_QUOTE; 00178 break; 00179 case ',': 00180 key = MHV_KEY_COMMA; 00181 break; 00182 case '.': 00183 key = MHV_KEY_FULLSTOP; 00184 break; 00185 case '/': 00186 key = MHV_KEY_SLASH; 00187 break; 00188 case '-': 00189 key = MHV_KEY_MINUS; 00190 break; 00191 case '=': 00192 key = MHV_KEY_EQUALS; 00193 break; 00194 case '`': 00195 key = MHV_KEY_GRAVE_ACCENT; 00196 break; 00197 } 00198 } 00199 00200 if (MHV_KEY_BACKSPACE == key) { 00201 key = MHV_KEY_SPACE; 00202 } 00203 00204 keyDown(key, modifiers); 00205 }