MHVLib  20111011
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 
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 }