MHVLib  20111109
An efficiency oriented runtime library for AVR microcontrollers
A:/eclipse/mhvlib-Vusb-Keyboard/MHV_VusbTypist.cpp
Go to the documentation of this file.
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(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 }