├── converter ├── images │ └── favicon.png ├── src │ ├── locales │ │ ├── localeList │ │ ├── cs_CZ_QWERTZ.lang │ │ ├── cs_CZ_QWERTY.lang │ │ ├── en_UK.lang │ │ ├── en_US.lang │ │ ├── cz_CZ.lang │ │ ├── pt_PT.lang │ │ ├── pt_BR.lang │ │ ├── it_IT.lang │ │ ├── be_BE.lang │ │ ├── es_ES.lang │ │ ├── fi_FI.lang │ │ ├── tr_TR.lang │ │ ├── fr_FR.lang │ │ ├── sv_SE.lang │ │ ├── de_DE.lang │ │ └── da_DK.lang │ ├── Keyboard.h │ ├── Keyboard_begin.cpp │ ├── Keyboard_end.cpp │ └── elite.ino ├── css │ ├── style.css │ ├── normalize.css │ └── skeleton.css ├── js │ ├── filesaver.js │ ├── converter.js │ └── duckuino.js ├── info.html └── index.html ├── .gitignore ├── LICENSE ├── firmware ├── malduino_lite │ └── malduino_lite.ino └── malduino_elite │ └── malduino_elite.ino └── README.md /converter/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seytonic/malduino/HEAD/converter/images/favicon.png -------------------------------------------------------------------------------- /converter/src/locales/localeList: -------------------------------------------------------------------------------- 1 | en_US 2 | de_DE 3 | fr_FR 4 | be_BE 5 | es_ES 6 | fi_FI 7 | cz_CZ 8 | da_DK 9 | pt_PT 10 | tr_TR 11 | it_IT 12 | sample 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Object files 2 | *.o 3 | *.ko 4 | *.obj 5 | *.elf 6 | 7 | # Precompiled Headers 8 | *.gch 9 | *.pch 10 | 11 | # Libraries 12 | *.lib 13 | *.a 14 | *.la 15 | *.lo 16 | 17 | # Shared objects (inc. Windows DLLs) 18 | *.dll 19 | *.so 20 | *.so.* 21 | *.dylib 22 | 23 | # Executables 24 | *.exe 25 | *.out 26 | *.app 27 | *.i*86 28 | *.x86_64 29 | *.hex 30 | 31 | # Debug files 32 | *.dSYM/ 33 | *.su 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Jhonti Todd-Simpson (aka. Seytonic) and Stefan Kremser (aka. Spacehuhn) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /firmware/malduino_lite/malduino_lite.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2017 Seytonic, Spacehuhn (Licensed under MIT) 3 | For more information see: github.com/seytonic/malduino 4 | */ 5 | 6 | #include "Keyboard.h" 7 | #include "Mouse.h" 8 | 9 | #define blinkInterval 50 10 | #define ledPin 3 11 | #define buttonPin 6 12 | 13 | int defaultDelay = 4; 14 | int defaultCharDelay = 5; 15 | bool ledOn = true; 16 | int rMin = 0; 17 | int rMax = 100; 18 | 19 | void typeKey(int key){ 20 | Keyboard.press(key); 21 | delay(defaultCharDelay); 22 | Keyboard.release(key); 23 | } 24 | 25 | void setup(){ 26 | 27 | pinMode(buttonPin, INPUT_PULLUP); 28 | pinMode(ledPin, OUTPUT); 29 | 30 | digitalWrite(ledPin, HIGH); 31 | 32 | if(digitalRead(buttonPin) == LOW){ 33 | 34 | Keyboard.begin(); 35 | Mouse.begin(); 36 | 37 | /* ----- Script-Begin (just a little Hello World example here) ----- */ 38 | delay(1000); 39 | 40 | delay(defaultDelay); 41 | Keyboard.print("Hello World!"); 42 | 43 | delay(defaultDelay); 44 | /* ----- Script-End ----- */ 45 | Keyboard.end(); 46 | } 47 | } 48 | 49 | void loop() { 50 | ledOn = !ledOn; 51 | digitalWrite(ledPin, ledOn); 52 | delay(blinkInterval); 53 | } 54 | -------------------------------------------------------------------------------- /converter/css/style.css: -------------------------------------------------------------------------------- 1 | #header{ 2 | background: #323232; 3 | color: #0974F6; 4 | padding-left: 1rem; 5 | } 6 | #infoLink{ 7 | color: #fff; 8 | float: right; 9 | margin-right: 1rem; 10 | text-decoration: none; 11 | font-size: 0.7em; 12 | padding-top: 0.25em; 13 | } 14 | #settings{ 15 | display: none; 16 | background: #f0f0f0; 17 | border-radius: 4px; 18 | margin-bottom: 1rem; 19 | padding: 1rem; 20 | } 21 | #compilerMsg{ 22 | padding: 0.5rem; 23 | background: #f0f0f0; 24 | border-radius: 4px; 25 | font-size: 2rem; 26 | color: #676565; 27 | } 28 | #downloadBtn{ 29 | width: 100%; 30 | font-size: 1.5rem; 31 | height: 4rem; 32 | } 33 | #modelSelection{ 34 | margin-bottom: 1rem; 35 | } 36 | .modelOption{ 37 | width: 50%; 38 | float: left; 39 | background: #323232; 40 | text-align: center; 41 | font-size: 2rem; 42 | color: #fff; 43 | border-bottom: 3px solid #323232; 44 | border-top: 3px solid #323232; 45 | cursor: pointer; 46 | } 47 | .modelOption:hover, 48 | .modelOption.selected{ 49 | background: #1EAEDB; 50 | border-bottom: 3px solid #A40001; 51 | border-top: 3px solid #1EAEDB; 52 | } 53 | .modelOption:hover{ 54 | background: #1EAEDB; 55 | } 56 | .selected:hover{ 57 | background: #2293B6; 58 | border-top: 3px solid #2293B6; 59 | } 60 | .modelOption:hover a, 61 | .modelOption.selected a{ 62 | color: #fff; 63 | } 64 | 65 | 66 | textarea{ 67 | width: 100%; 68 | height: 50rem; 69 | position: relative; 70 | } 71 | 72 | .red{ 73 | color: #A40001; 74 | } 75 | .left{ 76 | float: left; 77 | } 78 | .right{ 79 | float: right; 80 | } 81 | .bold{ 82 | font-weight: bold; 83 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MalDuino 2 | 3 | In `firmware` is the current source code for both MalDuino lite and elite. 4 | 5 | In `converter` you find the source code for the MalDuino Script Converter: https://malduino.com/converter/ 6 | 7 | **If you find bugs in the converter or with the MalDuino code, please let us know.** 8 | 9 | ## Ducky Script Command List 10 | 11 | | Command | Description | 12 | | ------------------------- | --------------------------------- | 13 | | REM | Comment | 14 | | DEFAULTDELAY | Time in ms between every command | 15 | | DEFAULTCHARDELAY | Time in ms between every character| 16 | | DELAY | Delay in ms | 17 | | RANDOM | Returns a random int | 18 | | RANDOMMIN | Set min random value (default 0) | 19 | | RANDOMMAX | Set max random value (default 100)| 20 | | STRING | Types the following string | 21 | | REPLAY | Repeats the last command n times | 22 | | GUI | Windows or CMD key | 23 | 24 | | Modifier Keys | 25 | | ------------------------- | 26 | | GUI | 27 | | SHIFT | 28 | | ALT_LEFT | 29 | | ALT_RIGHT | 30 | | CAPSLOCK | 31 | 32 | | Keys | 33 | | ------------------------- | 34 | | a - z | 35 | | A - Z | 36 | | 0 - 9 | 37 | | F1 - F12 | 38 | | ENTER | 39 | | DELETE | 40 | | BACKSPACE | 41 | | ESC | 42 | | INSERT | 43 | | SPACE | 44 | | TAB | 45 | | DOWN | 46 | | LEFT | 47 | | RIGHT | 48 | | UP | 49 | | HOME | 50 | | APP | 51 | | MENU | 52 | | PAGEUP | 53 | | PAGEDOWN | 54 | | KEYPAD_0 - KEYPAD_9 | 55 | | KEYPAD_ASTERIX | 56 | | KEYPAD_ENTER | 57 | | KEYPAD_MINUS | 58 | | KEYPAD_PERIOD | 59 | | KEYPAD_PLUS | 60 | | KEYPAD_SLASH | 61 | | PRINTSCREEN | 62 | 63 | | Mouse Commands | 64 | | ------------------------- | 65 | | MOUSE X Y | 66 | | SCROLL Y | 67 | | CLICK_LEFT | 68 | | CLICK_RIGHT | 69 | | CLICK_MIDDLE | 70 | | PRESS_LEFT | 71 | | PRESS_RIGHT | 72 | | PRESS_MIDDLE | 73 | | RELEASE_LEFT | 74 | | RELEASE_RIGHT | 75 | | RELEASE_MIDDLE | 76 | 77 | Based on Hak5's work: [Ducky Script](https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Duckyscript) -------------------------------------------------------------------------------- /converter/js/filesaver.js: -------------------------------------------------------------------------------- 1 | /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ 2 | var saveAs=saveAs||function(e){"use strict";if(typeof e==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=e.document,n=function(){return e.URL||e.webkitURL||e},r=t.createElementNS("http://www.w3.org/1999/xhtml","a"),o="download"in r,a=function(e){var t=new MouseEvent("click");e.dispatchEvent(t)},i=/constructor/i.test(e.HTMLElement)||e.safari,f=/CriOS\/[\d]+/.test(navigator.userAgent),u=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},s="application/octet-stream",d=1e3*40,c=function(e){var t=function(){if(typeof e==="string"){n().revokeObjectURL(e)}else{e.remove()}};setTimeout(t,d)},l=function(e,t,n){t=[].concat(t);var r=t.length;while(r--){var o=e["on"+t[r]];if(typeof o==="function"){try{o.call(e,n||e)}catch(a){u(a)}}}},p=function(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob([String.fromCharCode(65279),e],{type:e.type})}return e},v=function(t,u,d){if(!d){t=p(t)}var v=this,w=t.type,m=w===s,y,h=function(){l(v,"writestart progress write writeend".split(" "))},S=function(){if((f||m&&i)&&e.FileReader){var r=new FileReader;r.onloadend=function(){var t=f?r.result:r.result.replace(/^data:[^;]*;/,"data:attachment/file;");var n=e.open(t,"_blank");if(!n)e.location.href=t;t=undefined;v.readyState=v.DONE;h()};r.readAsDataURL(t);v.readyState=v.INIT;return}if(!y){y=n().createObjectURL(t)}if(m){e.location.href=y}else{var o=e.open(y,"_blank");if(!o){e.location.href=y}}v.readyState=v.DONE;h();c(y)};v.readyState=v.INIT;if(o){y=n().createObjectURL(t);setTimeout(function(){r.href=y;r.download=u;a(r);h();c(y);v.readyState=v.DONE});return}S()},w=v.prototype,m=function(e,t,n){return new v(e,t||e.name||"download",n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){t=t||e.name||"download";if(!n){e=p(e)}return navigator.msSaveOrOpenBlob(e,t)}}w.abort=function(){};w.readyState=w.INIT=0;w.WRITING=1;w.DONE=2;w.error=w.onwritestart=w.onprogress=w.onwrite=w.onabort=w.onerror=w.onwriteend=null;return m}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!==null){define("FileSaver.js",function(){return saveAs})} 3 | -------------------------------------------------------------------------------- /converter/info.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MalDuino Converter 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 24 | 25 |
26 |

About MalDuino

27 |

28 | MalDuino is an arduino-powered USB device which has keyboard injection capabilities. Once plugged in, MalDuino acts as a keyboard, typing commands at superhuman speeds. What's the point? You could gain a reverse shell, change the desktop wallpaper, anything is possible. For penetration testers, hobbyists and pranksters the MalDuino will serve you well! 29 |

30 |

License

31 |

32 | This project is licensed under the MIT License - see the license file file for details.
33 | The License file must be included in any redistributed version of this program! 34 |

35 |

Sources and additional links

36 |

37 | Source Code: https://github.com/seytonic/malduino
38 | MalDuino Indiegogo Campaign: https://www.indiegogo.com/projects/malduino-badusb-arduino-usb
39 | Seytonic's Youtube Channel: http://youtube.com/seytonic
40 |
41 | Ducky Script: (Copyright goes to Hak5) https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Duckyscript
42 | Duckuino converter: (Licensed under MIT) https://github.com/Nurrl/Dckuino.js
43 | Arduino Keyboard Layouts: (Licensed under MIT) https://github.com/Nurrl/LocaleKeyboard.js
44 |
45 | Arduino: https://www.arduino.cc/
46 |
47 |

48 |
49 | 50 | -------------------------------------------------------------------------------- /converter/src/Keyboard.h: -------------------------------------------------------------------------------- 1 | /* 2 | Keyboard.h 3 | 4 | Copyright (c) 2015, Arduino LLC 5 | Original code (pre-library): Copyright (c) 2011, Peter Barrett 6 | 7 | This library is free software; you can redistribute it and/or 8 | modify it under the terms of the GNU Lesser General Public 9 | License as published by the Free Software Foundation; either 10 | version 2.1 of the License, or (at your option) any later version. 11 | 12 | This library is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 | Lesser General Public License for more details. 16 | 17 | You should have received a copy of the GNU Lesser General Public 18 | License along with this library; if not, write to the Free Software 19 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 20 | */ 21 | 22 | #ifndef KEYBOARD_h 23 | #define KEYBOARD_h 24 | 25 | #include "HID.h" 26 | 27 | #if !defined(_USING_HID) 28 | 29 | #warning "Using legacy HID core (non pluggable)" 30 | 31 | #else 32 | 33 | //================================================================================ 34 | //================================================================================ 35 | // Keyboard 36 | 37 | #define KEY_LEFT_CTRL 0x80 38 | #define KEY_LEFT_SHIFT 0x81 39 | #define KEY_LEFT_ALT 0x82 40 | #define KEY_LEFT_GUI 0x83 41 | #define KEY_RIGHT_CTRL 0x84 42 | #define KEY_RIGHT_SHIFT 0x85 43 | #define KEY_RIGHT_ALT 0x86 44 | #define KEY_RIGHT_GUI 0x87 45 | 46 | #define KEY_UP_ARROW 0xDA 47 | #define KEY_DOWN_ARROW 0xD9 48 | #define KEY_LEFT_ARROW 0xD8 49 | #define KEY_RIGHT_ARROW 0xD7 50 | #define KEY_BACKSPACE 0xB2 51 | #define KEY_TAB 0xB3 52 | #define KEY_RETURN 0xB0 53 | #define KEY_ESC 0xB1 54 | #define KEY_INSERT 0xD1 55 | #define KEY_DELETE 0xD4 56 | #define KEY_PAGE_UP 0xD3 57 | #define KEY_PAGE_DOWN 0xD6 58 | #define KEY_HOME 0xD2 59 | #define KEY_END 0xD5 60 | #define KEY_CAPS_LOCK 0xC1 61 | #define KEY_F1 0xC2 62 | #define KEY_F2 0xC3 63 | #define KEY_F3 0xC4 64 | #define KEY_F4 0xC5 65 | #define KEY_F5 0xC6 66 | #define KEY_F6 0xC7 67 | #define KEY_F7 0xC8 68 | #define KEY_F8 0xC9 69 | #define KEY_F9 0xCA 70 | #define KEY_F10 0xCB 71 | #define KEY_F11 0xCC 72 | #define KEY_F12 0xCD 73 | 74 | // Low level key report: up to 6 keys and shift, ctrl etc at once 75 | typedef struct 76 | { 77 | uint8_t modifiers; 78 | uint8_t reserved; 79 | uint8_t keys[6]; 80 | } KeyReport; 81 | 82 | class Keyboard_ : public Print 83 | { 84 | private: 85 | KeyReport _keyReport; 86 | void sendReport(KeyReport* keys); 87 | public: 88 | Keyboard_(void); 89 | void begin(void); 90 | void end(void); 91 | size_t write(uint8_t k); 92 | size_t press(uint8_t k); 93 | size_t release(uint8_t k); 94 | void releaseAll(void); 95 | }; 96 | extern Keyboard_ Keyboard; 97 | 98 | #endif 99 | #endif 100 | -------------------------------------------------------------------------------- /converter/src/Keyboard_begin.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Keyboard.cpp 3 | 4 | Copyright (c) 2015, Arduino LLC 5 | Original code (pre-library): Copyright (c) 2011, Peter Barrett 6 | 7 | This library is free software; you can redistribute it and/or 8 | modify it under the terms of the GNU Lesser General Public 9 | License as published by the Free Software Foundation; either 10 | version 2.1 of the License, or (at your option) any later version. 11 | 12 | This library is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 | Lesser General Public License for more details. 16 | 17 | You should have received a copy of the GNU Lesser General Public 18 | License along with this library; if not, write to the Free Software 19 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 20 | */ 21 | 22 | #include "Keyboard.h" 23 | 24 | #if defined(_USING_HID) 25 | 26 | //================================================================================ 27 | //================================================================================ 28 | // Keyboard 29 | 30 | static const uint8_t _hidReportDescriptor[] PROGMEM = { 31 | 32 | // Keyboard 33 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 47 34 | 0x09, 0x06, // USAGE (Keyboard) 35 | 0xa1, 0x01, // COLLECTION (Application) 36 | 0x85, 0x02, // REPORT_ID (2) 37 | 0x05, 0x07, // USAGE_PAGE (Keyboard) 38 | 39 | 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 40 | 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) 41 | 0x15, 0x00, // LOGICAL_MINIMUM (0) 42 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) 43 | 0x75, 0x01, // REPORT_SIZE (1) 44 | 45 | 0x95, 0x08, // REPORT_COUNT (8) 46 | 0x81, 0x02, // INPUT (Data,Var,Abs) 47 | 0x95, 0x01, // REPORT_COUNT (1) 48 | 0x75, 0x08, // REPORT_SIZE (8) 49 | 0x81, 0x03, // INPUT (Cnst,Var,Abs) 50 | 51 | 0x95, 0x06, // REPORT_COUNT (6) 52 | 0x75, 0x08, // REPORT_SIZE (8) 53 | 0x15, 0x00, // LOGICAL_MINIMUM (0) 54 | 0x25, 0x65, // LOGICAL_MAXIMUM (101) 55 | 0x05, 0x07, // USAGE_PAGE (Keyboard) 56 | 57 | 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 58 | 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 59 | 0x81, 0x00, // INPUT (Data,Ary,Abs) 60 | 0xc0, // END_COLLECTION 61 | }; 62 | 63 | Keyboard_::Keyboard_(void) 64 | { 65 | static HIDSubDescriptor node(_hidReportDescriptor, sizeof(_hidReportDescriptor)); 66 | HID().AppendDescriptor(&node); 67 | } 68 | 69 | void Keyboard_::begin(void) 70 | { 71 | } 72 | 73 | void Keyboard_::end(void) 74 | { 75 | } 76 | 77 | void Keyboard_::sendReport(KeyReport* keys) 78 | { 79 | HID().SendReport(2,keys,sizeof(KeyReport)); 80 | } 81 | 82 | extern 83 | const uint8_t _asciimap[128] PROGMEM; 84 | -------------------------------------------------------------------------------- /converter/src/Keyboard_end.cpp: -------------------------------------------------------------------------------- 1 | 2 | uint8_t USBPutChar(uint8_t c); 3 | 4 | // press() adds the specified key (printing, non-printing, or modifier) 5 | // to the persistent key report and sends the report. Because of the way 6 | // USB HID works, the host acts like the key remains pressed until we 7 | // call release(), releaseAll(), or otherwise clear the report and resend. 8 | size_t Keyboard_::press(uint8_t k) 9 | { 10 | uint8_t i; 11 | if (k >= 136) { // it's a non-printing key (not a modifier) 12 | k = k - 136; 13 | } else if (k >= 128) { // it's a modifier key 14 | _keyReport.modifiers |= (1<<(k-128)); 15 | k = 0; 16 | } else { // it's a printing key 17 | int oldKey = k; 18 | k = pgm_read_byte(_asciimap + k); 19 | if (!k) { 20 | setWriteError(); 21 | return 0; 22 | } 23 | 24 | #ifdef ADD_ALTGR 25 | if (!_altFine) initAltGr(); 26 | if (_altGrMap[oldKey]){ 27 | _keyReport.modifiers |= 0x40; 28 | } 29 | #endif 30 | 31 | if (k & 0x80) { // it's a capital letter or other character reached with shift 32 | _keyReport.modifiers |= 0x02; // the left shift modifier 33 | k &= 0x7F; 34 | } 35 | } 36 | 37 | // Add k to the key report only if it's not already present 38 | // and if there is an empty slot. 39 | if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && 40 | _keyReport.keys[2] != k && _keyReport.keys[3] != k && 41 | _keyReport.keys[4] != k && _keyReport.keys[5] != k) { 42 | 43 | for (i=0; i<6; i++) { 44 | if (_keyReport.keys[i] == 0x00) { 45 | _keyReport.keys[i] = k; 46 | break; 47 | } 48 | } 49 | if (i == 6) { 50 | setWriteError(); 51 | return 0; 52 | } 53 | } 54 | sendReport(&_keyReport); 55 | return 1; 56 | } 57 | 58 | // release() takes the specified key out of the persistent key report and 59 | // sends the report. This tells the OS the key is no longer pressed and that 60 | // it shouldn't be repeated any more. 61 | size_t Keyboard_::release(uint8_t k) 62 | { 63 | uint8_t i; 64 | if (k >= 136) { // it's a non-printing key (not a modifier) 65 | k = k - 136; 66 | } else if (k >= 128) { // it's a modifier key 67 | _keyReport.modifiers &= ~(1<<(k-128)); 68 | k = 0; 69 | } else { // it's a printing key 70 | int oldKey = k; 71 | k = pgm_read_byte(_asciimap + k); 72 | if (!k) { 73 | return 0; 74 | } 75 | 76 | #ifdef ADD_ALTGR 77 | if (!_altFine) initAltGr(); 78 | if (_altGrMap[oldKey]){ 79 | _keyReport.modifiers &= ~(0x40); 80 | } 81 | #endif 82 | 83 | if (k & 0x80) { // it's a capital letter or other character reached with shift 84 | _keyReport.modifiers &= ~(0x02); // the left shift modifier 85 | k &= 0x7F; 86 | } 87 | } 88 | 89 | // Test the key report to see if k is present. Clear it if it exists. 90 | // Check all positions in case the key is present more than once (which it shouldn't be) 91 | for (i=0; i<6; i++) { 92 | if (0 != k && _keyReport.keys[i] == k) { 93 | _keyReport.keys[i] = 0x00; 94 | } 95 | } 96 | 97 | sendReport(&_keyReport); 98 | return 1; 99 | } 100 | 101 | void Keyboard_::releaseAll(void) 102 | { 103 | _keyReport.keys[0] = 0; 104 | _keyReport.keys[1] = 0; 105 | _keyReport.keys[2] = 0; 106 | _keyReport.keys[3] = 0; 107 | _keyReport.keys[4] = 0; 108 | _keyReport.keys[5] = 0; 109 | _keyReport.modifiers = 0; 110 | sendReport(&_keyReport); 111 | } 112 | 113 | size_t Keyboard_::write(uint8_t c) 114 | { 115 | uint8_t p = press(c); // Keydown 116 | release(c); // Keyup 117 | return p; // just return the result of press() since release() almost always returns 1 118 | } 119 | 120 | Keyboard_ Keyboard; 121 | 122 | #endif 123 | -------------------------------------------------------------------------------- /converter/src/locales/cs_CZ_QWERTZ.lang: -------------------------------------------------------------------------------- 1 | #define SHIFT 0x80 2 | const uint8_t _asciimap[128] = 3 | { 4 | 0x00, // NUL 0 5 | 0x00, // SOH 1 6 | 0x00, // STX 2 7 | 0x00, // ETX 3 8 | 0x00, // EOT 4 9 | 0x00, // ENQ 5 10 | 0x00, // ACK 6 11 | 0x00, // BEL 7 12 | 0x2a, // BS 8 13 | 0x2b, // TAB 9 14 | 0x28, // LF 10 15 | 0x00, // VT 11 16 | 0x00, // FF 12 17 | 0x00, // CR 13 18 | 0x00, // SO 14 19 | 0x00, // SI 15 20 | 0x00, // DEL 16 21 | 0x00, // DC1 17 22 | 0x00, // DC2 18 23 | 0x00, // DC3 19 24 | 0x00, // DC4 20 25 | 0x00, // NAK 21 26 | 0x00, // SYN 22 27 | 0x00, // ETB 23 28 | 0x00, // CAN 24 29 | 0x00, // EM 25 30 | 0x00, // SUB 26 31 | 0x00, // ESC 27 32 | 0x00, // FS 28 33 | 0x00, // GS 29 34 | 0x00, // RS 30 35 | 0x00, // US 31 36 | 0x2c, // ' ' 32 37 | 0x34 | SHIFT, // ! 33 38 | 0x33 | SHIFT, // " 34 39 | 0x1b, // # 35 + AltGr 40 | 0x33, // $ 36 + AltGr 41 | 0x2d | SHIFT, // % 37 42 | 0x06, // & 38 + AltGr 43 | 0x31 | SHIFT, // ' 39 44 | 0x30 | SHIFT, // ( 40 45 | 0x30, // ) 41 46 | 0x38, // * 42 + AltGr 47 | 0x1e, // + 43 48 | 0x36, // , 44 49 | 0x38, // - 45 50 | 0x37, // . 46 51 | 0x2f | SHIFT, // / 47 52 | 0x27 | SHIFT, // 0 48 53 | 0x1e | SHIFT, // 1 49 54 | 0x1f | SHIFT, // 2 50 55 | 0x20 | SHIFT, // 3 51 56 | 0x21 | SHIFT, // 4 52 57 | 0x22 | SHIFT, // 5 53 58 | 0x23 | SHIFT, // 6 54 59 | 0x24 | SHIFT, // 7 55 60 | 0x25 | SHIFT, // 8 56 61 | 0x26 | SHIFT, // 9 57 62 | 0x37 | SHIFT, // : 58 63 | 0x35, // ; 59 64 | 0x36, // < 60 + AltGr 65 | 0x2d, // = 61 66 | 0x37, // > 62 + AltGr 67 | 0x36 | SHIFT, // ? 63 68 | 0x19, // @ 64 + AltGr 69 | 0x04 | SHIFT, // A 65 70 | 0x05 | SHIFT, // B 66 71 | 0x06 | SHIFT, // C 67 72 | 0x07 | SHIFT, // D 68 73 | 0x08 | SHIFT, // E 69 74 | 0x09 | SHIFT, // F 70 75 | 0x0a | SHIFT, // G 71 76 | 0x0b | SHIFT, // H 72 77 | 0x0c | SHIFT, // I 73 78 | 0x0d | SHIFT, // J 74 79 | 0x0e | SHIFT, // K 75 80 | 0x0f | SHIFT, // L 76 81 | 0x10 | SHIFT, // M 77 82 | 0x11 | SHIFT, // N 78 83 | 0x12 | SHIFT, // O 79 84 | 0x13 | SHIFT, // P 80 85 | 0x14 | SHIFT, // Q 81 86 | 0x15 | SHIFT, // R 82 87 | 0x16 | SHIFT, // S 83 88 | 0x17 | SHIFT, // T 84 89 | 0x18 | SHIFT, // U 85 90 | 0x19 | SHIFT, // V 86 91 | 0x1a | SHIFT, // W 87 92 | 0x1b | SHIFT, // X 88 93 | 0x1d | SHIFT, // Y 89 94 | 0x1c | SHIFT, // Z 90 95 | 0x09, // [ 91 + AltGr 96 | 0x14, // bsl 92 + AltGr 97 | 0x0a, // ] 93 + AltGr 98 | 0x20, // ^ 94 + AltGr 99 | 0x38 | SHIFT, // _ 95 100 | 0x24, // ` 96 + AltGr 101 | 0x04, // a 97 102 | 0x05, // b 98 103 | 0x06, // c 99 104 | 0x07, // d 100 105 | 0x08, // e 101 106 | 0x09, // f 102 107 | 0x0a, // g 103 108 | 0x0b, // h 104 109 | 0x0c, // i 105 110 | 0x0d, // j 106 111 | 0x0e, // k 107 112 | 0x0f, // l 108 113 | 0x10, // m 109 114 | 0x11, // n 110 115 | 0x12, // o 111 116 | 0x13, // p 112 117 | 0x14, // q 113 118 | 0x15, // r 114 119 | 0x16, // s 115 120 | 0x17, // t 116 121 | 0x18, // u 117 122 | 0x19, // v 118 123 | 0x1a, // w 119 124 | 0x1b, // x 120 125 | 0x1d, // y 121 126 | 0x1c, // z 122 127 | 0x05, // { 123 + AltGr 128 | 0x1a, // | 124 + AltGr 129 | 0x11, // } 125 + AltGr 130 | 0x1e, // ~ 126 + AltGr 131 | 0x00 // DEL 127 132 | }; 133 | bool _altGrMap[128]; 134 | bool _altFine = false; 135 | 136 | void initAltGr() { 137 | _altFine = true; 138 | 139 | _altGrMap[35] = true; 140 | _altGrMap[36] = true; 141 | _altGrMap[38] = true; 142 | _altGrMap[42] = true; 143 | _altGrMap[60] = true; 144 | _altGrMap[62] = true; 145 | _altGrMap[64] = true; 146 | _altGrMap[91] = true; 147 | _altGrMap[92] = true; 148 | _altGrMap[93] = true; 149 | _altGrMap[94] = true; 150 | _altGrMap[96] = true; 151 | _altGrMap[123] = true; 152 | _altGrMap[124] = true; 153 | _altGrMap[125] = true; 154 | _altGrMap[126] = true; 155 | } 156 | -------------------------------------------------------------------------------- /converter/src/locales/cs_CZ_QWERTY.lang: -------------------------------------------------------------------------------- 1 | #define SHIFT 0x80 2 | const uint8_t _asciimap[128] = 3 | { 4 | 0x00, // NUL 0 5 | 0x00, // SOH 1 6 | 0x00, // STX 2 7 | 0x00, // ETX 3 8 | 0x00, // EOT 4 9 | 0x00, // ENQ 5 10 | 0x00, // ACK 6 11 | 0x00, // BEL 7 12 | 0x2a, // BS 8 13 | 0x2b, // TAB 9 14 | 0x28, // LF 10 15 | 0x00, // VT 11 16 | 0x00, // FF 12 17 | 0x00, // CR 13 18 | 0x00, // SO 14 19 | 0x00, // SI 15 20 | 0x00, // DEL 16 21 | 0x00, // DC1 17 22 | 0x00, // DC2 18 23 | 0x00, // DC3 19 24 | 0x00, // DC4 20 25 | 0x00, // NAK 21 26 | 0x00, // SYN 22 27 | 0x00, // ETB 23 28 | 0x00, // CAN 24 29 | 0x00, // EM 25 30 | 0x00, // SUB 26 31 | 0x00, // ESC 27 32 | 0x00, // FS 28 33 | 0x00, // GS 29 34 | 0x00, // RS 30 35 | 0x00, // US 31 36 | 0x2c, // ' ' 32 37 | 0x34 | SHIFT, // ! 33 38 | 0x33 | SHIFT, // " 34 39 | 0x20, // # 35 + AltGr 40 | 0x21, // $ 36 + AltGr 41 | 0x2d | SHIFT, // % 37 42 | 0x24, // & 38 + AltGr 43 | 0x31 | SHIFT, // ' 39 44 | 0x30 | SHIFT, // ( 40 45 | 0x30, // ) 41 46 | 0x25, // * 42 + AltGr 47 | 0x1e, // + 43 48 | 0x36, // , 44 49 | 0x38, // - 45 50 | 0x37, // . 46 51 | 0x2f | SHIFT, // / 47 52 | 0x27 | SHIFT, // 0 48 53 | 0x1e | SHIFT, // 1 49 54 | 0x1f | SHIFT, // 2 50 55 | 0x20 | SHIFT, // 3 51 56 | 0x21 | SHIFT, // 4 52 57 | 0x22 | SHIFT, // 5 53 58 | 0x23 | SHIFT, // 6 54 59 | 0x24 | SHIFT, // 7 55 60 | 0x25 | SHIFT, // 8 56 61 | 0x26 | SHIFT, // 9 57 62 | 0x37 | SHIFT, // : 58 63 | 0x35, // ; 59 64 | 0x36, // < 60 + AltGr 65 | 0x2d, // = 61 66 | 0x37, // > 62 + AltGr 67 | 0x36 | SHIFT, // ? 63 68 | 0x1f, // @ 64 + AltGr 69 | 0x04 | SHIFT, // A 65 70 | 0x05 | SHIFT, // B 66 71 | 0x06 | SHIFT, // C 67 72 | 0x07 | SHIFT, // D 68 73 | 0x08 | SHIFT, // E 69 74 | 0x09 | SHIFT, // F 70 75 | 0x0a | SHIFT, // G 71 76 | 0x0b | SHIFT, // H 72 77 | 0x0c | SHIFT, // I 73 78 | 0x0d | SHIFT, // J 74 79 | 0x0e | SHIFT, // K 75 80 | 0x0f | SHIFT, // L 76 81 | 0x10 | SHIFT, // M 77 82 | 0x11 | SHIFT, // N 78 83 | 0x12 | SHIFT, // O 79 84 | 0x13 | SHIFT, // P 80 85 | 0x14 | SHIFT, // Q 81 86 | 0x15 | SHIFT, // R 82 87 | 0x16 | SHIFT, // S 83 88 | 0x17 | SHIFT, // T 84 89 | 0x18 | SHIFT, // U 85 90 | 0x19 | SHIFT, // V 86 91 | 0x1a | SHIFT, // W 87 92 | 0x1b | SHIFT, // X 88 93 | 0x1c | SHIFT, // Y 89 94 | 0x1d | SHIFT, // Z 90 95 | 0x2f, // [ 91 + AltGr 96 | 0x31, // bsl 92 + AltGr 97 | 0x30, // ] 93 + AltGr 98 | 0x23, // ^ 94 + AltGr 99 | 0x38 | SHIFT, // _ 95 100 | 0x35, // ` 96 + AltGr 101 | 0x04, // a 97 102 | 0x05, // b 98 103 | 0x06, // c 99 104 | 0x07, // d 100 105 | 0x08, // e 101 106 | 0x09, // f 102 107 | 0x0a, // g 103 108 | 0x0b, // h 104 109 | 0x0c, // i 105 110 | 0x0d, // j 106 111 | 0x0e, // k 107 112 | 0x0f, // l 108 113 | 0x10, // m 109 114 | 0x11, // n 110 115 | 0x12, // o 111 116 | 0x13, // p 112 117 | 0x14, // q 113 118 | 0x15, // r 114 119 | 0x16, // s 115 120 | 0x17, // t 116 121 | 0x18, // u 117 122 | 0x19, // v 118 123 | 0x1a, // w 119 124 | 0x1b, // x 120 125 | 0x1c, // y 121 126 | 0x1d, // z 122 127 | 0x2f | SHIFT, // { 123 + AltGr 128 | 0x31 | SHIFT, // | 124 + AltGr 129 | 0x30 | SHIFT, // } 125 + AltGr 130 | 0x35 | SHIFT, // ~ 126 + AltGr 131 | 0x00 // DEL 127 132 | }; 133 | bool _altGrMap[128]; 134 | bool _altFine = false; 135 | 136 | void initAltGr() { 137 | _altFine = true; 138 | 139 | _altGrMap[35] = true; 140 | _altGrMap[36] = true; 141 | _altGrMap[38] = true; 142 | _altGrMap[42] = true; 143 | _altGrMap[60] = true; 144 | _altGrMap[62] = true; 145 | _altGrMap[64] = true; 146 | _altGrMap[91] = true; 147 | _altGrMap[92] = true; 148 | _altGrMap[93] = true; 149 | _altGrMap[94] = true; 150 | _altGrMap[96] = true; 151 | _altGrMap[123] = true; 152 | _altGrMap[124] = true; 153 | _altGrMap[125] = true; 154 | _altGrMap[126] = true; 155 | } 156 | -------------------------------------------------------------------------------- /converter/src/locales/en_UK.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * Local generated by Matthew Milan. https://devleaf.com 3 | */ 4 | 5 | #define SHIFT 0x80 6 | const uint8_t _asciimap[128] = 7 | { 8 | 0x00, // NUL 9 | 0x00, // SOH 10 | 0x00, // STX 11 | 0x00, // ETX 12 | 0x00, // EOT 13 | 0x00, // ENQ 14 | 0x00, // ACK 15 | 0x00, // BEL 16 | 0x2a, // BS Backspace 17 | 0x2b, // TAB Tab 18 | 0x28, // LF Enter 19 | 0x00, // VT 20 | 0x00, // FF 21 | 0x00, // CR 22 | 0x00, // SO 23 | 0x00, // SI 24 | 0x00, // DEL 25 | 0x00, // DC1 26 | 0x00, // DC2 27 | 0x00, // DC3 28 | 0x00, // DC4 29 | 0x00, // NAK 30 | 0x00, // SYN 31 | 0x00, // ETB 32 | 0x00, // CAN 33 | 0x00, // EM 34 | 0x00, // SUB 35 | 0x00, // ESC 36 | 0x00, // FS 37 | 0x00, // GS 38 | 0x00, // RS 39 | 0x00, // US 40 | 41 | 0x2c, // ' ' 42 | 0x1e|SHIFT, // ! 43 | 0x1f|SHIFT, // " , 44 | 0x31, // # 45 | 0x21|SHIFT, // $ 46 | 0x22|SHIFT, // % 47 | 0x24|SHIFT, // & 48 | 0x34, // ' 49 | 0x26|SHIFT, // ( 50 | 0x27|SHIFT, // ) 51 | 0x25|SHIFT, // * 52 | 0x2e|SHIFT, // + 53 | 0x36, // , 54 | 0x2d, // - 55 | 0x37, // . 56 | 0x38, // / 57 | 0x27, // 0 58 | 0x1e, // 1 59 | 0x1f, // 2 60 | 0x20, // 3 61 | 0x21, // 4 62 | 0x22, // 5 63 | 0x23, // 6 64 | 0x24, // 7 65 | 0x25, // 8 66 | 0x26, // 9 67 | 0x33|SHIFT, // : 68 | 0x33, // ; 69 | 0x36|SHIFT, // < 70 | 0x2e, // = 71 | 0x37|SHIFT, // > 72 | 0x38|SHIFT, // ? 73 | 0x34|SHIFT, // @ 74 | 0x04|SHIFT, // A 75 | 0x05|SHIFT, // B 76 | 0x06|SHIFT, // C 77 | 0x07|SHIFT, // D 78 | 0x08|SHIFT, // E 79 | 0x09|SHIFT, // F 80 | 0x0a|SHIFT, // G 81 | 0x0b|SHIFT, // H 82 | 0x0c|SHIFT, // I 83 | 0x0d|SHIFT, // J 84 | 0x0e|SHIFT, // K 85 | 0x0f|SHIFT, // L 86 | 0x10|SHIFT, // M 87 | 0x11|SHIFT, // N 88 | 0x12|SHIFT, // O 89 | 0x13|SHIFT, // P 90 | 0x14|SHIFT, // Q 91 | 0x15|SHIFT, // R 92 | 0x16|SHIFT, // S 93 | 0x17|SHIFT, // T 94 | 0x18|SHIFT, // U 95 | 0x19|SHIFT, // V 96 | 0x1a|SHIFT, // W 97 | 0x1b|SHIFT, // X 98 | 0x1c|SHIFT, // Y 99 | 0x1d|SHIFT, // Z 100 | 0x2f, // [ 101 | 0x64, // bslash 102 | 0x30, // ] 103 | 0x23|SHIFT, // ^ 104 | 0x2d|SHIFT, // _ 105 | 0x35, // ` 106 | 0x04, // a 107 | 0x05, // b 108 | 0x06, // c 109 | 0x07, // d 110 | 0x08, // e 111 | 0x09, // f 112 | 0x0a, // g 113 | 0x0b, // h 114 | 0x0c, // i 115 | 0x0d, // j 116 | 0x0e, // k 117 | 0x0f, // l 118 | 0x10, // m 119 | 0x11, // n 120 | 0x12, // o 121 | 0x13, // p 122 | 0x14, // q 123 | 0x15, // r 124 | 0x16, // s 125 | 0x17, // t 126 | 0x18, // u 127 | 0x19, // v 128 | 0x1a, // w 129 | 0x1b, // x 130 | 0x1c, // y 131 | 0x1d, // z 132 | 0x2f|SHIFT, // { 133 | 0x64|SHIFT, // | 134 | 0x30|SHIFT, // } 135 | 0x31|SHIFT, // ~ 136 | 0 // DEL 137 | }; 138 | 139 | // Init var 140 | bool _altGrMap[128]; 141 | bool _altFine = false; 142 | 143 | // Individually define all needed char 144 | void initAltGr() {_altFine = true;} 145 | -------------------------------------------------------------------------------- /converter/src/locales/en_US.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * _asciimap took from Keyboard.cpp, don't need to be modified 3 | */ 4 | 5 | #define SHIFT 0x80 6 | const uint8_t _asciimap[128] = 7 | { 8 | 0x00, // NUL 9 | 0x00, // SOH 10 | 0x00, // STX 11 | 0x00, // ETX 12 | 0x00, // EOT 13 | 0x00, // ENQ 14 | 0x00, // ACK 15 | 0x00, // BEL 16 | 0x2a, // BS Backspace 17 | 0x2b, // TAB Tab 18 | 0x28, // LF Enter 19 | 0x00, // VT 20 | 0x00, // FF 21 | 0x00, // CR 22 | 0x00, // SO 23 | 0x00, // SI 24 | 0x00, // DEL 25 | 0x00, // DC1 26 | 0x00, // DC2 27 | 0x00, // DC3 28 | 0x00, // DC4 29 | 0x00, // NAK 30 | 0x00, // SYN 31 | 0x00, // ETB 32 | 0x00, // CAN 33 | 0x00, // EM 34 | 0x00, // SUB 35 | 0x00, // ESC 36 | 0x00, // FS 37 | 0x00, // GS 38 | 0x00, // RS 39 | 0x00, // US 40 | 41 | 0x2c, // ' ' 42 | 0x1e|SHIFT, // ! 43 | 0x34|SHIFT, // " 44 | 0x20|SHIFT, // # 45 | 0x21|SHIFT, // $ 46 | 0x22|SHIFT, // % 47 | 0x24|SHIFT, // & 48 | 0x34, // ' 49 | 0x26|SHIFT, // ( 50 | 0x27|SHIFT, // ) 51 | 0x25|SHIFT, // * 52 | 0x2e|SHIFT, // + 53 | 0x36, // , 54 | 0x2d, // - 55 | 0x37, // . 56 | 0x38, // / 57 | 0x27, // 0 58 | 0x1e, // 1 59 | 0x1f, // 2 60 | 0x20, // 3 61 | 0x21, // 4 62 | 0x22, // 5 63 | 0x23, // 6 64 | 0x24, // 7 65 | 0x25, // 8 66 | 0x26, // 9 67 | 0x33|SHIFT, // : 68 | 0x33, // ; 69 | 0x36|SHIFT, // < 70 | 0x2e, // = 71 | 0x37|SHIFT, // > 72 | 0x38|SHIFT, // ? 73 | 0x1f|SHIFT, // @ 74 | 0x04|SHIFT, // A 75 | 0x05|SHIFT, // B 76 | 0x06|SHIFT, // C 77 | 0x07|SHIFT, // D 78 | 0x08|SHIFT, // E 79 | 0x09|SHIFT, // F 80 | 0x0a|SHIFT, // G 81 | 0x0b|SHIFT, // H 82 | 0x0c|SHIFT, // I 83 | 0x0d|SHIFT, // J 84 | 0x0e|SHIFT, // K 85 | 0x0f|SHIFT, // L 86 | 0x10|SHIFT, // M 87 | 0x11|SHIFT, // N 88 | 0x12|SHIFT, // O 89 | 0x13|SHIFT, // P 90 | 0x14|SHIFT, // Q 91 | 0x15|SHIFT, // R 92 | 0x16|SHIFT, // S 93 | 0x17|SHIFT, // T 94 | 0x18|SHIFT, // U 95 | 0x19|SHIFT, // V 96 | 0x1a|SHIFT, // W 97 | 0x1b|SHIFT, // X 98 | 0x1c|SHIFT, // Y 99 | 0x1d|SHIFT, // Z 100 | 0x2f, // [ 101 | 0x31, // bslash 102 | 0x30, // ] 103 | 0x23|SHIFT, // ^ 104 | 0x2d|SHIFT, // _ 105 | 0x35, // ` 106 | 0x04, // a 107 | 0x05, // b 108 | 0x06, // c 109 | 0x07, // d 110 | 0x08, // e 111 | 0x09, // f 112 | 0x0a, // g 113 | 0x0b, // h 114 | 0x0c, // i 115 | 0x0d, // j 116 | 0x0e, // k 117 | 0x0f, // l 118 | 0x10, // m 119 | 0x11, // n 120 | 0x12, // o 121 | 0x13, // p 122 | 0x14, // q 123 | 0x15, // r 124 | 0x16, // s 125 | 0x17, // t 126 | 0x18, // u 127 | 0x19, // v 128 | 0x1a, // w 129 | 0x1b, // x 130 | 0x1c, // y 131 | 0x1d, // z 132 | 0x2f|SHIFT, // { 133 | 0x31|SHIFT, // | 134 | 0x30|SHIFT, // } 135 | 0x35|SHIFT, // ~ 136 | 0 // DEL 137 | }; 138 | 139 | // Init var 140 | bool _altGrMap[128]; 141 | bool _altFine = false; 142 | 143 | // Individually define all needed char 144 | void initAltGr() {_altFine = true;} 145 | -------------------------------------------------------------------------------- /converter/src/locales/cz_CZ.lang: -------------------------------------------------------------------------------- 1 | #define SHIFT 0x80 2 | const uint8_t _asciimap[128] = 3 | { 4 | 0x00, // NUL 5 | 0x00, // SOH 6 | 0x00, // STX 7 | 0x00, // ETX 8 | 0x00, // EOT 9 | 0x00, // ENQ 10 | 0x00, // ACK 11 | 0x00, // BEL 12 | 0x2a, // BS Backspace 13 | 0x2b, // TAB Tab 14 | 0x28, // LF Enter 15 | 0x00, // VT 16 | 0x00, // FF 17 | 0x00, // CR 18 | 0x00, // SO 19 | 0x00, // SI 20 | 0x00, // DEL 21 | 0x00, // DC1 22 | 0x00, // DC2 23 | 0x00, // DC3 24 | 0x00, // DC4 25 | 0x00, // NAK 26 | 0x00, // SYN 27 | 0x00, // ETB 28 | 0x00, // CAN 29 | 0x00, // EM 30 | 0x00, // SUB 31 | 0x00, // ESC 32 | 0x00, // FS 33 | 0x00, // GS 34 | 0x00, // RS 35 | 0x00, // US 36 | 37 | 0x2c, // ' ' 38 | 0x34|SHIFT, // ! 39 | 0x33|SHIFT, // " 40 | 0x1b, // # 41 | 0x33, // $ 42 | 0x2d|SHIFT, // % 43 | 0x06, // & 44 | 0x31|SHIFT, // ' 45 | 0x30|SHIFT, // ( 46 | 0x30, // ) 47 | 0x38, // * 48 | 0x1e, // + 49 | 0x36, // , 50 | 0x38, // - 51 | 0x37, // . 52 | 0x2f|SHIFT, // / 53 | 0x27|SHIFT, // 0 54 | 0x1e|SHIFT, // 1 55 | 0x1f|SHIFT, // 2 56 | 0x20|SHIFT, // 3 57 | 0x21|SHIFT, // 4 58 | 0x22|SHIFT, // 5 59 | 0x23|SHIFT, // 6 60 | 0x24|SHIFT, // 7 61 | 0x25|SHIFT, // 8 62 | 0x26|SHIFT, // 9 63 | 0x37|SHIFT, // : 64 | 0x35, // ; 65 | 0x36, // < 66 | 0x2d, // = 67 | 0x37, // > 68 | 0x36|SHIFT, // ? 69 | 0x19, // @ 70 | 0x04|SHIFT, // A 71 | 0x05|SHIFT, // B 72 | 0x06|SHIFT, // C 73 | 0x07|SHIFT, // D 74 | 0x08|SHIFT, // E 75 | 0x09|SHIFT, // F 76 | 0x0a|SHIFT, // G 77 | 0x0b|SHIFT, // H 78 | 0x0c|SHIFT, // I 79 | 0x0d|SHIFT, // J 80 | 0x0e|SHIFT, // K 81 | 0x0f|SHIFT, // L 82 | 0x10|SHIFT, // M 83 | 0x11|SHIFT, // N 84 | 0x12|SHIFT, // O 85 | 0x13|SHIFT, // P 86 | 0x14|SHIFT, // Q 87 | 0x15|SHIFT, // R 88 | 0x16|SHIFT, // S 89 | 0x17|SHIFT, // T 90 | 0x18|SHIFT, // U 91 | 0x19|SHIFT, // V 92 | 0x1a|SHIFT, // W 93 | 0x1b|SHIFT, // X 94 | 0x1d|SHIFT, // Y 95 | 0x1c|SHIFT, // Z 96 | 0x09, // [ 97 | 0x14, // bslash 98 | 0x0a, // ] 99 | 0x23|SHIFT, // ^ 100 | 0x38|SHIFT, // _ 101 | 0x35, // ` 102 | 0x04, // a 103 | 0x05, // b 104 | 0x06, // c 105 | 0x07, // d 106 | 0x08, // e 107 | 0x09, // f 108 | 0x0a, // g 109 | 0x0b, // h 110 | 0x0c, // i 111 | 0x0d, // j 112 | 0x0e, // k 113 | 0x0f, // l 114 | 0x10, // m 115 | 0x11, // n 116 | 0x12, // o 117 | 0x13, // p 118 | 0x14, // q 119 | 0x15, // r 120 | 0x16, // s 121 | 0x17, // t 122 | 0x18, // u 123 | 0x19, // v 124 | 0x1a, // w 125 | 0x1b, // x 126 | 0x1d, // y 127 | 0x1c, // z 128 | 0x05, // { 129 | 0x1a, // | 130 | 0x11, // } 131 | 0x1e, // ~ 132 | 0 // DEL 133 | }; 134 | bool _altGrMap[128]; 135 | bool _altFine = false; 136 | 137 | void initAltGr() { 138 | _altFine = true; 139 | 140 | _altGrMap[35] = true; 141 | _altGrMap[36] = true; 142 | _altGrMap[38] = true; 143 | _altGrMap[42] = true; 144 | _altGrMap[60] = true; 145 | _altGrMap[62] = true; 146 | _altGrMap[64] = true; 147 | _altGrMap[91] = true; 148 | _altGrMap[92] = true; 149 | _altGrMap[93] = true; 150 | _altGrMap[123] = true; 151 | _altGrMap[124] = true; 152 | _altGrMap[125] = true; 153 | _altGrMap[126] = true; 154 | 155 | } 156 | -------------------------------------------------------------------------------- /converter/src/locales/pt_PT.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * _asciimap took from Keyboard.cpp, 3 | * Updated by brigadinhos with the correct keys for pt_PT keyboard 4 | */ 5 | 6 | #define SHIFT 0x80 7 | const uint8_t _asciimap[128] = 8 | { 9 | 0x00, // NUL 10 | 0x00, // SOH 11 | 0x00, // STX 12 | 0x00, // ETX 13 | 0x00, // EOT 14 | 0x00, // ENQ 15 | 0x00, // ACK 16 | 0x00, // BEL 17 | 0x2a, // BS Backspace 18 | 0x2b, // TAB Tab 19 | 0x28, // LF Enter 20 | 0x00, // VT 21 | 0x00, // FF 22 | 0x00, // CR 23 | 0x00, // SO 24 | 0x00, // SI 25 | 0x00, // DEL 26 | 0x00, // DC1 27 | 0x00, // DC2 28 | 0x00, // DC3 29 | 0x00, // DC4 30 | 0x00, // NAK 31 | 0x00, // SYN 32 | 0x00, // ETB 33 | 0x00, // CAN 34 | 0x00, // EM 35 | 0x00, // SUB 36 | 0x00, // ESC 37 | 0x00, // FS 38 | 0x00, // GS 39 | 0x00, // RS 40 | 0x00, // US 41 | 0x2c, // ' ' 42 | 0x1e|SHIFT, // ! 43 | 0x1f|SHIFT, // " 44 | 0x20|SHIFT, // # 45 | 0x21|SHIFT, // $ 46 | 0x22|SHIFT, // % 47 | 0x23|SHIFT, // & 48 | 0x2d, // ' 49 | 0x25|SHIFT, // ( 50 | 0x26|SHIFT, // ) 51 | 0x2f|SHIFT, // * 52 | 0x2f, // + 53 | 0x36, // , 54 | 0x38, // - 55 | 0x37, // . 56 | 0x24|SHIFT, // / 57 | 0x27, // 0 58 | 0x1e, // 1 59 | 0x1f, // 2 60 | 0x20, // 3 61 | 0x21, // 4 62 | 0x22, // 5 63 | 0x23, // 6 64 | 0x24, // 7 65 | 0x25, // 8 66 | 0x26, // 9 67 | 0x37|SHIFT, // : 68 | 0x36|SHIFT, // ; 69 | 0x64, // < 70 | 0x27|SHIFT, // = 71 | 0x64|SHIFT, // > 72 | 0x2d|SHIFT, // ? 73 | 0x1f, // @ 74 | 0x04|SHIFT, // A 75 | 0x05|SHIFT, // B 76 | 0x06|SHIFT, // C 77 | 0x07|SHIFT, // D 78 | 0x08|SHIFT, // E 79 | 0x09|SHIFT, // F 80 | 0x0a|SHIFT, // G 81 | 0x0b|SHIFT, // H 82 | 0x0c|SHIFT, // I 83 | 0x0d|SHIFT, // J 84 | 0x0e|SHIFT, // K 85 | 0x0f|SHIFT, // L 86 | 0x10|SHIFT, // M 87 | 0x11|SHIFT, // N 88 | 0x12|SHIFT, // O 89 | 0x13|SHIFT, // P 90 | 0x14|SHIFT, // Q 91 | 0x15|SHIFT, // R 92 | 0x16|SHIFT, // S 93 | 0x17|SHIFT, // T 94 | 0x18|SHIFT, // U 95 | 0x19|SHIFT, // V 96 | 0x1a|SHIFT, // W 97 | 0x1b|SHIFT, // X 98 | 0x1c|SHIFT, // Y 99 | 0x1d|SHIFT, // Z 100 | 0x25, // [ 101 | 0x35, // bslash 102 | 0x26, // ] 103 | 0x31|SHIFT, // ^ 104 | 0x38|SHIFT, // _ 105 | 0x30|SHIFT, // ` 106 | 0x04, // a 107 | 0x05, // b 108 | 0x06, // c 109 | 0x07, // d 110 | 0x08, // e 111 | 0x09, // f 112 | 0x0a, // g 113 | 0x0b, // h 114 | 0x0c, // i 115 | 0x0d, // j 116 | 0x0e, // k 117 | 0x0f, // l 118 | 0x10, // m 119 | 0x11, // n 120 | 0x12, // o 121 | 0x13, // p 122 | 0x14, // q 123 | 0x15, // r 124 | 0x16, // s 125 | 0x17, // t 126 | 0x18, // u 127 | 0x19, // v 128 | 0x1a, // w 129 | 0x1b, // x 130 | 0x1c, // y 131 | 0x1d, // z 132 | 0x24, // { 133 | 0x35|SHIFT, // | 134 | 0x27, // } 135 | 0x31, // ~ 136 | 0 // DEL 137 | }; 138 | 139 | // Init var 140 | bool _altGrMap[128]; 141 | bool _altFine = false; 142 | 143 | // Individually define all needed char 144 | void initAltGr() { 145 | _altFine = true; 146 | 147 | _altGrMap[91] = true; // [ 148 | _altGrMap[93] = true; // ] 149 | 150 | _altGrMap[123] = true; // { 151 | _altGrMap[125] = true; // } 152 | 153 | _altGrMap[64] = true; // @ 154 | } 155 | -------------------------------------------------------------------------------- /converter/src/locales/pt_BR.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * _asciimap took from Keyboard.cpp, 3 | * Updated by diegochaves with the correct keys for pt_BR keyboard 4 | */ 5 | 6 | #define SHIFT 0x80 7 | const uint8_t _asciimap[128] = 8 | { 9 | 0x00, // NUL 10 | 0x00, // SOH 11 | 0x00, // STX 12 | 0x00, // ETX 13 | 0x00, // EOT 14 | 0x00, // ENQ 15 | 0x00, // ACK 16 | 0x00, // BEL 17 | 0x2a, // BS Backspace 18 | 0x2b, // TAB Tab 19 | 0x28, // LF Enter 20 | 0x00, // VT 21 | 0x00, // FF 22 | 0x00, // CR 23 | 0x00, // SO 24 | 0x00, // SI 25 | 0x00, // DEL 26 | 0x00, // DC1 27 | 0x00, // DC2 28 | 0x00, // DC3 29 | 0x00, // DC4 30 | 0x00, // NAK 31 | 0x00, // SYN 32 | 0x00, // ETB 33 | 0x00, // CAN 34 | 0x00, // EM 35 | 0x00, // SUB 36 | 0x00, // ESC 37 | 0x00, // FS 38 | 0x00, // GS 39 | 0x00, // RS 40 | 0x00, // US 41 | 0x2c, // ' ' 42 | 0x1e|SHIFT, // ! 43 | 0x35|SHIFT, // " 44 | 0x20|SHIFT, // # 45 | 0x21|SHIFT, // $ 46 | 0x22|SHIFT, // % 47 | 0x24|SHIFT, // & 48 | 0x35, // ' 49 | 0x26|SHIFT, // ( 50 | 0x27|SHIFT, // ) 51 | 0x25|SHIFT, // * 52 | 0x2e|SHIFT, // + 53 | 0x36, // , 54 | 0x2d, // - 55 | 0x37, // . 56 | 0x14, // / 57 | 0x27, // 0 58 | 0x1e, // 1 59 | 0x1f, // 2 60 | 0x20, // 3 61 | 0x21, // 4 62 | 0x22, // 5 63 | 0x23, // 6 64 | 0x24, // 7 65 | 0x25, // 8 66 | 0x26, // 9 67 | 0x38|SHIFT, // : 68 | 0x38, // ; 69 | 0x36|SHIFT, // < 70 | 0x2e, // = 71 | 0x37|SHIFT, // > 72 | 0x1a, // ? 73 | 0x1f|SHIFT, // @ 74 | 0x04|SHIFT, // A 75 | 0x05|SHIFT, // B 76 | 0x06|SHIFT, // C 77 | 0x07|SHIFT, // D 78 | 0x08|SHIFT, // E 79 | 0x09|SHIFT, // F 80 | 0x0a|SHIFT, // G 81 | 0x0b|SHIFT, // H 82 | 0x0c|SHIFT, // I 83 | 0x0d|SHIFT, // J 84 | 0x0e|SHIFT, // K 85 | 0x0f|SHIFT, // L 86 | 0x10|SHIFT, // M 87 | 0x11|SHIFT, // N 88 | 0x12|SHIFT, // O 89 | 0x13|SHIFT, // P 90 | 0x14|SHIFT, // Q 91 | 0x15|SHIFT, // R 92 | 0x16|SHIFT, // S 93 | 0x17|SHIFT, // T 94 | 0x18|SHIFT, // U 95 | 0x19|SHIFT, // V 96 | 0x1a|SHIFT, // W 97 | 0x1b|SHIFT, // X 98 | 0x1c|SHIFT, // Y 99 | 0x1d|SHIFT, // Z 100 | 0x30, // [ 101 | 0x30, // bslash 102 | 0x31, // ] 103 | 0x34|SHIFT, // ^ 104 | 0x2d|SHIFT, // _ 105 | 0x2f|SHIFT, // ` 106 | 0x04, // a 107 | 0x05, // b 108 | 0x06, // c 109 | 0x07, // d 110 | 0x08, // e 111 | 0x09, // f 112 | 0x0a, // g 113 | 0x0b, // h 114 | 0x0c, // i 115 | 0x0d, // j 116 | 0x0e, // k 117 | 0x0f, // l 118 | 0x10, // m 119 | 0x11, // n 120 | 0x12, // o 121 | 0x13, // p 122 | 0x14, // q 123 | 0x15, // r 124 | 0x16, // s 125 | 0x17, // t 126 | 0x18, // u 127 | 0x19, // v 128 | 0x1a, // w 129 | 0x1b, // x 130 | 0x1c, // y 131 | 0x1d, // z 132 | 0x30|SHIFT, // { 133 | 0x2f|SHIFT, // | 134 | 0x31|SHIFT, // } 135 | 0x34, // ~ 136 | 0 // DEL 137 | }; 138 | 139 | // Init var 140 | bool _altGrMap[128]; 141 | bool _altFine = false; 142 | 143 | // Individually define all needed char 144 | void initAltGr() { 145 | _altFine = true; 146 | _altGrMap[47] = true; // / 147 | _altGrMap[63] = true; // ? 148 | } -------------------------------------------------------------------------------- /converter/src/locales/it_IT.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * The following character can't be typed: 3 | * "èéòçà°ù§ì£5€`~" 4 | * As you see you get the wrong character. Spaces mean you get nothing or the script crashes. 5 | */ 6 | 7 | #define SHIFT 0x80 8 | const uint8_t _asciimap[128] = 9 | { 10 | 0x00, // NUL 11 | 0x00, // SOH 12 | 0x00, // STX 13 | 0x00, // ETX 14 | 0x00, // EOT 15 | 0x00, // ENQ 16 | 0x00, // ACK 17 | 0x00, // BEL 18 | 0x2a, // BS Backspace 19 | 0x2b, // TAB Tab 20 | 0x28, // LF Enter 21 | 0x00, // VT 22 | 0x00, // FF 23 | 0x00, // CR 24 | 0x00, // SO 25 | 0x00, // SI 26 | 0x00, // DEL 27 | 0x00, // DC1 28 | 0x00, // DC2 29 | 0x00, // DC3 30 | 0x00, // DC4 31 | 0x00, // NAK 32 | 0x00, // SYN 33 | 0x00, // ETB 34 | 0x00, // CAN 35 | 0x00, // EM 36 | 0x00, // SUB 37 | 0x00, // ESC 38 | 0x00, // FS 39 | 0x00, // GS 40 | 0x00, // RS 41 | 0x00, // US 42 | 43 | 0x2c, // ' ' 44 | 0x1e|SHIFT, // ! 45 | 0x1f|SHIFT, // " 46 | 0x34, // # 47 | 0x21|SHIFT, // $ 48 | 0x22|SHIFT, // % 49 | 0x23|SHIFT, // & 50 | 0x2d, // ' 51 | 0x25|SHIFT, // ( 52 | 0x26|SHIFT, // ) 53 | 0x30|SHIFT, // * 54 | 0x30, // + 55 | 0x36, // , 56 | 0x38, // - 57 | 0x37, // . 58 | 0x24|SHIFT, // / 59 | 0x27, // 0 60 | 0x1e, // 1 61 | 0x1f, // 2 62 | 0x20, // 3 63 | 0x21, // 4 64 | 0x22, // 5 65 | 0x23, // 6 66 | 0x24, // 7 67 | 0x25, // 8 68 | 0x26, // 9 69 | 0x37|SHIFT, // : 70 | 0x36|SHIFT, // ; 71 | 0x64, // < 72 | 0x27|SHIFT, // = 73 | 0x64|SHIFT, // > 74 | 0x2d|SHIFT, // ? 75 | 0x33, // @ 76 | 0x04|SHIFT, // A 77 | 0x05|SHIFT, // B 78 | 0x06|SHIFT, // C 79 | 0x07|SHIFT, // D 80 | 0x08|SHIFT, // E 81 | 0x09|SHIFT, // F 82 | 0x0a|SHIFT, // G 83 | 0x0b|SHIFT, // H 84 | 0x0c|SHIFT, // I 85 | 0x0d|SHIFT, // J 86 | 0x0e|SHIFT, // K 87 | 0x0f|SHIFT, // L 88 | 0x10|SHIFT, // M 89 | 0x11|SHIFT, // N 90 | 0x12|SHIFT, // O 91 | 0x13|SHIFT, // P 92 | 0x14|SHIFT, // Q 93 | 0x15|SHIFT, // R 94 | 0x16|SHIFT, // S 95 | 0x17|SHIFT, // T 96 | 0x18|SHIFT, // U 97 | 0x19|SHIFT, // V 98 | 0x1a|SHIFT, // W 99 | 0x1b|SHIFT, // X 100 | 0x1c|SHIFT, // Y 101 | 0x1d|SHIFT, // Z 102 | 0x2f, // [ 103 | 0x35, // bslash 104 | 0x30, // ] 105 | 0x2e|SHIFT, // ^ 106 | 0x38|SHIFT, // _ 107 | 0x39, // ` 108 | 0x04, // a 109 | 0x05, // b 110 | 0x06, // c 111 | 0x07, // d 112 | 0x08, // e 113 | 0x09, // f 114 | 0x0a, // g 115 | 0x0b, // h 116 | 0x0c, // i 117 | 0x0d, // j 118 | 0x0e, // k 119 | 0x0f, // l 120 | 0x10, // m 121 | 0x11, // n 122 | 0x12, // o 123 | 0x13, // p 124 | 0x14, // q 125 | 0x15, // r 126 | 0x16, // s 127 | 0x17, // t 128 | 0x18, // u 129 | 0x19, // v 130 | 0x1a, // w 131 | 0x1b, // x 132 | 0x1c, // y 133 | 0x1d, // z 134 | 0x2f|SHIFT, // { 135 | 0x35|SHIFT, // | 136 | 0x30|SHIFT, // } 137 | 0x34, // ~ 138 | 0 // DEL 139 | }; 140 | 141 | // Init var 142 | bool _altGrMap[128]; 143 | bool _altFine = false; 144 | 145 | // Individually define all needed char 146 | void initAltGr() { 147 | _altFine = true; 148 | 149 | _altGrMap[35] = true; // # 150 | _altGrMap[64] = true; // @ 151 | 152 | _altGrMap[91] = true; // [ 153 | _altGrMap[93] = true; // ] 154 | 155 | _altGrMap[123] = true; // { 156 | _altGrMap[125] = true; // } 157 | _altGrMap[126] = true; // ~ 158 | } 159 | -------------------------------------------------------------------------------- /converter/src/locales/be_BE.lang: -------------------------------------------------------------------------------- 1 | #define SHIFT 0x80 2 | const uint8_t _asciimap[128] = 3 | { 4 | 0x00, // NUL 5 | 0x00, // SOH 6 | 0x00, // STX 7 | 0x00, // ETX 8 | 0x00, // EOT 9 | 0x00, // ENQ 10 | 0x00, // ACK 11 | 0x00, // BEL 12 | 0x2a, // BS Backspace 13 | 0x2b, // TAB Tab 14 | 0x28, // LF Enter 15 | 0x00, // VT 16 | 0x00, // FF 17 | 0x00, // CR 18 | 0x00, // SO 19 | 0x00, // SI 20 | 0x00, // DEL 21 | 0x00, // DC1 22 | 0x00, // DC2 23 | 0x00, // DC3 24 | 0x00, // DC4 25 | 0x00, // NAK 26 | 0x00, // SYN 27 | 0x00, // ETB 28 | 0x00, // CAN 29 | 0x00, // EM 30 | 0x00, // SUB 31 | 0x00, // ESC 32 | 0x00, // FS 33 | 0x00, // GS 34 | 0x00, // RS 35 | 0x00, // US 36 | 0x2c, // ' ' 37 | 0x25, // ! 38 | 0x20, // " 39 | 0x20, // # 40 | 0x30, // $ 41 | 0x34|SHIFT, // % 42 | 0x1e, // & 43 | 0x21, // ' 44 | 0x22, // ( 45 | 0x2d, // ) 46 | 0x30|SHIFT, // * 47 | 0x38|SHIFT, // + 48 | 0x10, // , 49 | 0x2e, // - 50 | 0x36|SHIFT, // . 51 | 0x37|SHIFT, // / 52 | 0x27|SHIFT, // 0 53 | 0x1e|SHIFT, // 1 54 | 0x1f|SHIFT, // 2 55 | 0x20|SHIFT, // 3 56 | 0x21|SHIFT, // 4 57 | 0x22|SHIFT, // 5 58 | 0x23|SHIFT, // 6 59 | 0x24|SHIFT, // 7 60 | 0x25|SHIFT, // 8 61 | 0x26|SHIFT, // 9 62 | 0x37, // : 63 | 0x36, // ; 64 | 0x64, // < 65 | 0x38, // = 66 | 0x64|SHIFT, // > 67 | 0x10|SHIFT, // ? 68 | 0x27, // @ 69 | 0x14|SHIFT, // A 70 | 0x05|SHIFT, // B 71 | 0x06|SHIFT, // C 72 | 0x07|SHIFT, // D 73 | 0x08|SHIFT, // E 74 | 0x09|SHIFT, // F 75 | 0x0a|SHIFT, // G 76 | 0x0b|SHIFT, // H 77 | 0x0c|SHIFT, // I 78 | 0x0d|SHIFT, // J 79 | 0x0e|SHIFT, // K 80 | 0x0f|SHIFT, // L 81 | 0x33|SHIFT, // M 82 | 0x11|SHIFT, // N 83 | 0x12|SHIFT, // O 84 | 0x13|SHIFT, // P 85 | 0x04|SHIFT, // Q 86 | 0x15|SHIFT, // R 87 | 0x16|SHIFT, // S 88 | 0x17|SHIFT, // T 89 | 0x18|SHIFT, // U 90 | 0x19|SHIFT, // V 91 | 0x1d|SHIFT, // W 92 | 0x1b|SHIFT, // X 93 | 0x1c|SHIFT, // Y 94 | 0x1a|SHIFT, // Z 95 | 0x22, // [ 96 | 0x64, // bslash 97 | 0x30, // ] 98 | 0x22, // ^ 99 | 0x2e|SHIFT, // _ 100 | 0x24, // ` 101 | 0x14, // a 102 | 0x05, // b 103 | 0x06, // c 104 | 0x07, // d 105 | 0x08, // e 106 | 0x09, // f 107 | 0x0a, // g 108 | 0x0b, // h 109 | 0x0c, // i 110 | 0x0d, // j 111 | 0x0e, // k 112 | 0x0f, // l 113 | 0x33, // m 114 | 0x11, // n 115 | 0x12, // o 116 | 0x13, // p 117 | 0x04, // q 118 | 0x15, // r 119 | 0x16, // s 120 | 0x17, // t 121 | 0x18, // u 122 | 0x19, // v 123 | 0x1d, // w 124 | 0x1b, // x 125 | 0x1c, // y 126 | 0x1a, // z 127 | 0x21, // { 128 | 0x1e, // | 129 | 0x27, // } 130 | 0x38, // ~ 131 | 0 // DEL 132 | }; 133 | 134 | // Init var 135 | bool _altGrMap[128]; 136 | bool _altFine = false; 137 | 138 | // Individually define all needed char 139 | void initAltGr() { 140 | _altFine = true; 141 | 142 | _altGrMap[35] = true; // # 143 | _altGrMap[64] = true; // @ 144 | _altGrMap[91] = true; // [ 145 | _altGrMap[92] = true; // bslash fixed 146 | _altGrMap[93] = true; // ] 147 | _altGrMap[96] = true; // ` 148 | _altGrMap[123] = true; // { 149 | _altGrMap[124] = true; // | fixed 150 | _altGrMap[125] = true; // } fixed 151 | _altGrMap[127] = true; // ~ 152 | } 153 | -------------------------------------------------------------------------------- /converter/src/locales/es_ES.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * _asciimap took from Keyboard.cpp, 3 | * Updated by Borja Garduño with the correct keys, 4 | * and ~, ^ and `, fixed by BlueArduino20. 5 | */ 6 | 7 | #define SHIFT 0x80 8 | const uint8_t _asciimap[128] = 9 | { 10 | 0x00, // NUL 11 | 0x00, // SOH 12 | 0x00, // STX 13 | 0x00, // ETX 14 | 0x00, // EOT 15 | 0x00, // ENQ 16 | 0x00, // ACK 17 | 0x00, // BEL 18 | 0x2a, // BS Backspace 19 | 0x2b, // TAB Tab 20 | 0x28, // LF Enter 21 | 0x00, // VT 22 | 0x00, // FF 23 | 0x00, // CR 24 | 0x00, // SO 25 | 0x00, // SI 26 | 0x00, // DEL 27 | 0x00, // DC1 28 | 0x00, // DC2 29 | 0x00, // DC3 30 | 0x00, // DC4 31 | 0x00, // NAK 32 | 0x00, // SYN 33 | 0x00, // ETB 34 | 0x00, // CAN 35 | 0x00, // EM 36 | 0x00, // SUB 37 | 0x00, // ESC 38 | 0x00, // FS 39 | 0x00, // GS 40 | 0x00, // RS 41 | 0x00, // US 42 | 43 | 0x2c, // ' ' 44 | 0x1e|SHIFT, // ! 45 | 0x1f|SHIFT, // " 46 | 0x20, // # 47 | 0x21|SHIFT, // $ 48 | 0x22|SHIFT, // % 49 | 0x23|SHIFT, // & 50 | 0x2d, // ' 51 | 0x25|SHIFT, // ( 52 | 0x26|SHIFT, // ) 53 | 0x30|SHIFT, // * 54 | 0x30, // + 55 | 0x36, // , 56 | 0x38, // - 57 | 0x37, // . 58 | 0x24|SHIFT, // / 59 | 0x27, // 0 60 | 0x1e, // 1 61 | 0x1f, // 2 62 | 0x20, // 3 63 | 0x21, // 4 64 | 0x22, // 5 65 | 0x23, // 6 66 | 0x24, // 7 67 | 0x25, // 8 68 | 0x26, // 9 69 | 0x37|SHIFT, // : 70 | 0x36|SHIFT, // ; 71 | 0x64, // < 72 | 0x27|SHIFT, // = 73 | 0x64|SHIFT, // > 74 | 0x2d|SHIFT, // ? 75 | 0x1f, // @ 76 | 0x04|SHIFT, // A 77 | 0x05|SHIFT, // B 78 | 0x06|SHIFT, // C 79 | 0x07|SHIFT, // D 80 | 0x08|SHIFT, // E 81 | 0x09|SHIFT, // F 82 | 0x0a|SHIFT, // G 83 | 0x0b|SHIFT, // H 84 | 0x0c|SHIFT, // I 85 | 0x0d|SHIFT, // J 86 | 0x0e|SHIFT, // K 87 | 0x0f|SHIFT, // L 88 | 0x10|SHIFT, // M 89 | 0x11|SHIFT, // N 90 | 0x12|SHIFT, // O 91 | 0x13|SHIFT, // P 92 | 0x14|SHIFT, // Q 93 | 0x15|SHIFT, // R 94 | 0x16|SHIFT, // S 95 | 0x17|SHIFT, // T 96 | 0x18|SHIFT, // U 97 | 0x19|SHIFT, // V 98 | 0x1a|SHIFT, // W 99 | 0x1b|SHIFT, // X 100 | 0x1c|SHIFT, // Y 101 | 0x1d|SHIFT, // Z 102 | 0x2f, // [ 103 | 0x35, // bslash 104 | 0x30, // ] 105 | 0x2f|SHIFT, // ^ 106 | 0x38|SHIFT, // _ 107 | 0x2f, // ` 108 | 0x04, // a 109 | 0x05, // b 110 | 0x06, // c 111 | 0x07, // d 112 | 0x08, // e 113 | 0x09, // f 114 | 0x0a, // g 115 | 0x0b, // h 116 | 0x0c, // i 117 | 0x0d, // j 118 | 0x0e, // k 119 | 0x0f, // l 120 | 0x10, // m 121 | 0x11, // n 122 | 0x12, // o 123 | 0x13, // p 124 | 0x14, // q 125 | 0x15, // r 126 | 0x16, // s 127 | 0x17, // t 128 | 0x18, // u 129 | 0x19, // v 130 | 0x1a, // w 131 | 0x1b, // x 132 | 0x1c, // y 133 | 0x1d, // z 134 | 0x34, // { 135 | 0x1e, // | 136 | 0x32, // } 137 | 0x21, // ^ 138 | 0 // DEL 139 | 140 | }; 141 | 142 | // Init var 143 | bool _altGrMap[128]; 144 | bool _altFine = false; 145 | 146 | // Individually define all needed char 147 | void initAltGr() { 148 | _altFine = true; 149 | 150 | _altGrMap[126] = true; // ~ 151 | _altGrMap[123] = true; // { 152 | _altGrMap[91] = true; // [ 153 | _altGrMap[93] = true; // ] 154 | _altGrMap[125] = true; // } 155 | _altGrMap[92] = true; // bslash 156 | _altGrMap[124] = true; // | 157 | _altGrMap[64] = true; // @ 158 | _altGrMap[35] = true; // # 159 | } 160 | -------------------------------------------------------------------------------- /converter/src/locales/fi_FI.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * Characters produced by dead keys (^ ~ `) do not work 3 | */ 4 | 5 | #define SHIFT 0x80 6 | const uint8_t _asciimap[128] = 7 | { 8 | 0x00, // NUL 9 | 0x00, // SOH 10 | 0x00, // STX 11 | 0x00, // ETX 12 | 0x00, // EOT 13 | 0x00, // ENQ 14 | 0x00, // ACK 15 | 0x00, // BEL 16 | 0x2a, // BS Backspace 17 | 0x2b, // TAB Tab 18 | 0x28, // LF Enter 19 | 0x00, // VT 20 | 0x00, // FF 21 | 0x00, // CR 22 | 0x00, // SO 23 | 0x00, // SI 24 | 0x00, // DEL 25 | 0x00, // DC1 26 | 0x00, // DC2 27 | 0x00, // DC3 28 | 0x00, // DC4 29 | 0x00, // NAK 30 | 0x00, // SYN 31 | 0x00, // ETB 32 | 0x00, // CAN 33 | 0x00, // EM 34 | 0x00, // SUB 35 | 0x00, // ESC 36 | 0x00, // FS 37 | 0x00, // GS 38 | 0x00, // RS 39 | 0x00, // US 40 | 41 | 0x2c, // ' ' 42 | 0x1e|SHIFT, // ! 43 | 0x1f|SHIFT, // " 44 | 0x20|SHIFT, // # 45 | 0x21, // $ 46 | 0x22|SHIFT, // % 47 | 0x23|SHIFT, // & 48 | 0x31, // ' 49 | 0x25|SHIFT, // ( 50 | 0x26|SHIFT, // ) 51 | 0x31|SHIFT, // * 52 | 0x2d, // + 53 | 0x36, // , 54 | 0x38, // - 55 | 0x37, // . 56 | 0x24|SHIFT, // / 57 | 0x27, // 0 58 | 0x1e, // 1 59 | 0x1f, // 2 60 | 0x20, // 3 61 | 0x21, // 4 62 | 0x22, // 5 63 | 0x23, // 6 64 | 0x24, // 7 65 | 0x25, // 8 66 | 0x26, // 9 67 | 0x37|SHIFT, // : 68 | 0x36|SHIFT, // ; 69 | 0x64, // < 70 | 0x27|SHIFT, // = 71 | 0x64|SHIFT, // > 72 | 0x2d|SHIFT, // ? 73 | 0x1f, // @ 74 | 0x04|SHIFT, // A 75 | 0x05|SHIFT, // B 76 | 0x06|SHIFT, // C 77 | 0x07|SHIFT, // D 78 | 0x08|SHIFT, // E 79 | 0x09|SHIFT, // F 80 | 0x0a|SHIFT, // G 81 | 0x0b|SHIFT, // H 82 | 0x0c|SHIFT, // I 83 | 0x0d|SHIFT, // J 84 | 0x0e|SHIFT, // K 85 | 0x0f|SHIFT, // L 86 | 0x10|SHIFT, // M 87 | 0x11|SHIFT, // N 88 | 0x12|SHIFT, // O 89 | 0x13|SHIFT, // P 90 | 0x14|SHIFT, // Q 91 | 0x15|SHIFT, // R 92 | 0x16|SHIFT, // S 93 | 0x17|SHIFT, // T 94 | 0x18|SHIFT, // U 95 | 0x19|SHIFT, // V 96 | 0x1a|SHIFT, // W 97 | 0x1b|SHIFT, // X 98 | 0x1c|SHIFT, // Y 99 | 0x1d|SHIFT, // Z 100 | 0x25, // [ 101 | 0x2d, // bslash 102 | 0x26, // ] 103 | 0x23, // ^ 104 | 0x38|SHIFT, // _ 105 | 0x2d|SHIFT, // ` 106 | 0x04, // a 107 | 0x05, // b 108 | 0x06, // c 109 | 0x07, // d 110 | 0x08, // e 111 | 0x09, // f 112 | 0x0a, // g 113 | 0x0b, // h 114 | 0x0c, // i 115 | 0x0d, // j 116 | 0x0e, // k 117 | 0x0f, // l 118 | 0x10, // m 119 | 0x11, // n 120 | 0x12, // o 121 | 0x13, // p 122 | 0x14, // q 123 | 0x15, // r 124 | 0x16, // s 125 | 0x17, // t 126 | 0x18, // u 127 | 0x19, // v 128 | 0x1a, // w 129 | 0x1b, // x 130 | 0x1c, // y 131 | 0x1d, // z 132 | 0x24, // { 133 | 0x36, // | 134 | 0x27, // } 135 | 0x2d, // ~ 136 | 0 // DEL 137 | }; 138 | 139 | // Init var 140 | bool _altGrMap[128]; 141 | bool _altFine = false; 142 | 143 | // Individually define all needed char 144 | void initAltGr() { 145 | _altFine = true; 146 | _altGrMap[36] = true; // $ 147 | _altGrMap[64] = true; // @ 148 | _altGrMap[91] = true; // [ 149 | _altGrMap[92] = true; // bslash 150 | _altGrMap[93] = true; // ] 151 | _altGrMap[94] = true; // ^ 152 | _altGrMap[96] = true; // ` 153 | _altGrMap[123] = true; // { 154 | _altGrMap[124] = true; // | 155 | _altGrMap[125] = true; // } 156 | _altGrMap[126] = true; // ~ 157 | } 158 | -------------------------------------------------------------------------------- /converter/src/locales/tr_TR.lang: -------------------------------------------------------------------------------- 1 | /* Grave Accent(`) not working yet. AltGr + , combination work only from keyboard. */ 2 | 3 | #define SHIFT 0x80 4 | const uint8_t _asciimap[128] = 5 | { 6 | 0x00, // NUL 7 | 0x00, // SOH 8 | 0x00, // STX 9 | 0x00, // ETX 10 | 0x00, // EOT 11 | 0x00, // ENQ 12 | 0x00, // ACK 13 | 0x00, // BEL 14 | 0x2a, // BS Backspace 15 | 0x2b, // TAB Tab 16 | 0x28, // LF Enter 17 | 0x00, // VT 18 | 0x00, // FF 19 | 0x00, // CR 20 | 0x00, // SO 21 | 0x00, // SI 22 | 0x00, // DEL 23 | 0x00, // DC1 24 | 0x00, // DC2 25 | 0x00, // DC3 26 | 0x00, // DC4 27 | 0x00, // NAK 28 | 0x00, // SYN 29 | 0x00, // ETB 30 | 0x00, // CAN 31 | 0x00, // EM 32 | 0x00, // SUB 33 | 0x00, // ESC 34 | 0x00, // FS 35 | 0x00, // GS 36 | 0x00, // RS 37 | 0x00, // US 38 | 39 | 0x2c, // ' ' 40 | 0x1e|SHIFT, // ! 41 | 0x35, // " 42 | 0x20, // # 43 | 0x21, // $ 44 | 0x22|SHIFT, // % 45 | 0x23|SHIFT, // & 46 | 0x1f|SHIFT, // ' 47 | 0x25|SHIFT, // ( 48 | 0x26|SHIFT, // ) 49 | 0x2d, // * 50 | 0x21|SHIFT, // + 51 | 0x31, // , 52 | 0x2e, // - 53 | 0x38, // . 54 | 0x24|SHIFT, // / 55 | 0x27, // 0 56 | 0x1e, // 1 57 | 0x1f, // 2 58 | 0x20, // 3 59 | 0x21, // 4 60 | 0x22, // 5 61 | 0x23, // 6 62 | 0x24, // 7 63 | 0x25, // 8 64 | 0x26, // 9 65 | 0x38|SHIFT, // : 66 | 0x31|SHIFT, // ; 67 | 0x64, // < 68 | 0x27|SHIFT, // = 69 | 0x64|SHIFT, // > 70 | 0x2d|SHIFT, // ? 71 | 0x14, // @ 72 | 0x04|SHIFT, // A 73 | 0x05|SHIFT, // B 74 | 0x06|SHIFT, // C 75 | 0x07|SHIFT, // D 76 | 0x08|SHIFT, // E 77 | 0x09|SHIFT, // F 78 | 0x0a|SHIFT, // G 79 | 0x0b|SHIFT, // H 80 | 0x0c|SHIFT, // I 81 | 0x0d|SHIFT, // J 82 | 0x0e|SHIFT, // K 83 | 0x0f|SHIFT, // L 84 | 0x10|SHIFT, // M 85 | 0x11|SHIFT, // N 86 | 0x12|SHIFT, // O 87 | 0x13|SHIFT, // P 88 | 0x14|SHIFT, // Q 89 | 0x15|SHIFT, // R 90 | 0x16|SHIFT, // S 91 | 0x17|SHIFT, // T 92 | 0x18|SHIFT, // U 93 | 0x19|SHIFT, // V 94 | 0x1a|SHIFT, // W 95 | 0x1b|SHIFT, // X 96 | 0x1c|SHIFT, // Y 97 | 0x1d|SHIFT, // Z 98 | 0x25, // [ 99 | 0x2d, // bslash 100 | 0x26, // ] 101 | 0x20|SHIFT, // ^ 102 | 0x2e|SHIFT, // _ 103 | 0x35, // ` //DOES NOT WORK 104 | 0x04, // a 105 | 0x05, // b 106 | 0x06, // c 107 | 0x07, // d 108 | 0x08, // e 109 | 0x09, // f 110 | 0x0a, // g 111 | 0x0b, // h 112 | 0x34, // i 113 | 0x0d, // j 114 | 0x0e, // k 115 | 0x0f, // l 116 | 0x10, // m 117 | 0x11, // n 118 | 0x12, // o 119 | 0x13, // p 120 | 0x14, // q 121 | 0x15, // r 122 | 0x16, // s 123 | 0x17, // t 124 | 0x18, // u 125 | 0x19, // v 126 | 0x1a, // w 127 | 0x1b, // x 128 | 0x1c, // y 129 | 0x1d, // z 130 | 0x24, // { 131 | 0x64, // | 132 | 0x27, // } 133 | 0x30, // ~ 134 | 0 // DEL 135 | }; 136 | 137 | // Init var 138 | bool _altGrMap[128]; 139 | bool _altFine = false; 140 | 141 | // Individually define all needed char 142 | void initAltGr() { 143 | _altFine = true; 144 | 145 | _altGrMap[126] = true; // ~ 146 | _altGrMap[123] = true; // { 147 | _altGrMap[64] = true; // @ 148 | _altGrMap[91] = true; // [ 149 | _altGrMap[92] = true; // bslash 150 | _altGrMap[93] = true; // ] 151 | //_altGrMap[96] = true; // ` DOES NOT WORK YET. 152 | _altGrMap[124] = true; // | 153 | _altGrMap[35] = true; // # 154 | _altGrMap[36] = true; // $ 155 | _altGrMap[125] = true; // } 156 | } 157 | -------------------------------------------------------------------------------- /converter/src/locales/fr_FR.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * _asciimap took from internet, fixed by Thecakeisgit 3 | */ 4 | 5 | #define SHIFT 0x80 6 | const uint8_t _asciimap[128] = 7 | { 8 | 0x00, // NUL 9 | 0x00, // SOH 10 | 0x00, // STX 11 | 0x00, // ETX 12 | 0x00, // EOT 13 | 0x00, // ENQ 14 | 0x00, // ACK 15 | 0x00, // BEL 16 | 0x2a, // BS Backspace 17 | 0x2b, // TAB Tab 18 | 0x28, // LF Enter 19 | 0x00, // VT 20 | 0x00, // FF 21 | 0x00, // CR 22 | 0x00, // SO 23 | 0x00, // SI 24 | 0x00, // DEL 25 | 0x00, // DC1 26 | 0x00, // DC2 27 | 0x00, // DC3 28 | 0x00, // DC4 29 | 0x00, // NAK 30 | 0x00, // SYN 31 | 0x00, // ETB 32 | 0x00, // CAN 33 | 0x00, // EM 34 | 0x00, // SUB 35 | 0x00, // ESC 36 | 0x00, // FS 37 | 0x00, // GS 38 | 0x00, // RS 39 | 0x00, // US 40 | 41 | 0x2c, // ' ' 42 | 0x38, // ! 43 | 0x20, // " 44 | 0x20, // # 45 | 0x30, // $ 46 | 0x34|SHIFT, // % 47 | 0x1e, // & 48 | 0x21, // ' 49 | 0x22, // ( 50 | 0x2d, // ) 51 | 0x31, // * 52 | 0x2e|SHIFT, // + 53 | 0x10, // , 54 | 0x23, // - 55 | 0x36|SHIFT, // . 56 | 0x37|SHIFT, // / 57 | 0x27|SHIFT, // 0 58 | 0x1e|SHIFT, // 1 59 | 0x1f|SHIFT, // 2 60 | 0x20|SHIFT, // 3 61 | 0x21|SHIFT, // 4 62 | 0x22|SHIFT, // 5 63 | 0x23|SHIFT, // 6 64 | 0x24|SHIFT, // 7 65 | 0x25|SHIFT, // 8 66 | 0x26|SHIFT, // 9 67 | 0x37, // : 68 | 0x36, // ; 69 | 0x64, // < 70 | 0x2e, // = 71 | 0x64|SHIFT, // > 72 | 0x10|SHIFT, // ? 73 | 0x27, // @ 74 | 0x14|SHIFT, // A 75 | 0x05|SHIFT, // B 76 | 0x06|SHIFT, // C 77 | 0x07|SHIFT, // D 78 | 0x08|SHIFT, // E 79 | 0x09|SHIFT, // F 80 | 0x0a|SHIFT, // G 81 | 0x0b|SHIFT, // H 82 | 0x0c|SHIFT, // I 83 | 0x0d|SHIFT, // J 84 | 0x0e|SHIFT, // K 85 | 0x0f|SHIFT, // L 86 | 0x33|SHIFT, // M 87 | 0x11|SHIFT, // N 88 | 0x12|SHIFT, // O 89 | 0x13|SHIFT, // P 90 | 0x04|SHIFT, // Q 91 | 0x15|SHIFT, // R 92 | 0x16|SHIFT, // S 93 | 0x17|SHIFT, // T 94 | 0x18|SHIFT, // U 95 | 0x19|SHIFT, // V 96 | 0x1d|SHIFT, // W 97 | 0x1b|SHIFT, // X 98 | 0x1c|SHIFT, // Y 99 | 0x1a|SHIFT, // Z 100 | 0x22, // [ 101 | 0x25, // bslash 102 | 0x2d, // ] 103 | 0x26, // ^ 104 | 0x25, // _ 105 | 0x24, // ` 106 | 0x14, // a 107 | 0x05, // b 108 | 0x06, // c 109 | 0x07, // d 110 | 0x08, // e 111 | 0x09, // f 112 | 0x0a, // g 113 | 0x0b, // h 114 | 0x0c, // i 115 | 0x0d, // j 116 | 0x0e, // k 117 | 0x0f, // l 118 | 0x33, // m 119 | 0x11, // n 120 | 0x12, // o 121 | 0x13, // p 122 | 0x04, // q 123 | 0x15, // r 124 | 0x16, // s 125 | 0x17, // t 126 | 0x18, // u 127 | 0x19, // v 128 | 0x1d, // w 129 | 0x1b, // x 130 | 0x1c, // y 131 | 0x1a, // z 132 | 0x21, // { 133 | 0x23, // | 134 | 0x2e, // } 135 | 0x1f, // ~ 136 | 0 // DEL 137 | }; 138 | 139 | // Init var 140 | bool _altGrMap[128]; 141 | bool _altFine = false; 142 | 143 | // Individually define all needed char 144 | void initAltGr() { 145 | _altFine = true; 146 | 147 | _altGrMap[35] = true; // # 148 | _altGrMap[64] = true; // @ 149 | 150 | _altGrMap[91] = true; // [ 151 | _altGrMap[92] = true; // bslash 152 | _altGrMap[93] = true; // ] 153 | _altGrMap[94] = true; // ^ 154 | 155 | _altGrMap[96] = true; // ` 156 | 157 | _altGrMap[123] = true; // { 158 | _altGrMap[124] = true; // | 159 | _altGrMap[125] = true; // } 160 | _altGrMap[126] = true; // ~ 161 | } 162 | 163 | -------------------------------------------------------------------------------- /converter/src/locales/sv_SE.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * This is based off of the Danish locale. 3 | * Due to how the Swedish keyboard works, some characters (~, ^, `) have to be pressed twice. On ubuntu two presses creates one character, 4 | * on Windows one press creates no charater and two presses creates two. 5 | * 6 | * This means that the required test string is "!"#$%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^``_abcdefghijklmnopqrstuvwxyz{|}~~ @" 7 | */ 8 | 9 | #define SHIFT 0x80 10 | const uint8_t _asciimap[128] = 11 | { 12 | 0x00, // NUL 13 | 0x00, // SOH 14 | 0x00, // STX 15 | 0x00, // ETX 16 | 0x00, // EOT 17 | 0x00, // ENQ 18 | 0x00, // ACK 19 | 0x00, // BEL 20 | 0x2a, // BS Backspace 21 | 0x2b, // TAB Tab 22 | 0x28, // LF Enter 23 | 0x00, // VT 24 | 0x00, // FF 25 | 0x00, // CR 26 | 0x00, // SO 27 | 0x00, // SI 28 | 0x00, // DEL 29 | 0x00, // DC1 30 | 0x00, // DC2 31 | 0x00, // DC3 32 | 0x00, // DC4 33 | 0x00, // NAK 34 | 0x00, // SYN 35 | 0x00, // ETB 36 | 0x00, // CAN 37 | 0x00, // EM 38 | 0x00, // SUB 39 | 0x00, // ESC 40 | 0x00, // FS 41 | 0x00, // GS 42 | 0x00, // RS 43 | 0x00, // US 44 | 45 | 0x2c, // ' ' 46 | 0x1e|SHIFT, // ! 47 | 0x1f|SHIFT, // " 48 | 0x20|SHIFT, // # 49 | 0x21, // $ 50 | 0x22|SHIFT, // % 51 | 0x23|SHIFT, // & 52 | 0x31, // ' 53 | 0x25|SHIFT, // ( 54 | 0x26|SHIFT, // ) 55 | 0x31|SHIFT, // * 56 | 0x2d, // + 57 | 0x36, // , 58 | 0x38, // - 59 | 0x37, // . 60 | 0x24|SHIFT, // / 61 | 0x27, // 0 62 | 0x1e, // 1 63 | 0x1f, // 2 64 | 0x20, // 3 65 | 0x21, // 4 66 | 0x22, // 5 67 | 0x23, // 6 68 | 0x24, // 7 69 | 0x25, // 8 70 | 0x26, // 9 71 | 0x37|SHIFT, // : 72 | 0x36|SHIFT, // ; 73 | 0x64, // < 74 | 0x27|SHIFT, // = 75 | 0x64|SHIFT, // > 76 | 0x2d|SHIFT, // ? 77 | 0x1f, // @ 78 | 0x04|SHIFT, // A 79 | 0x05|SHIFT, // B 80 | 0x06|SHIFT, // C 81 | 0x07|SHIFT, // D 82 | 0x08|SHIFT, // E 83 | 0x09|SHIFT, // F 84 | 0x0a|SHIFT, // G 85 | 0x0b|SHIFT, // H 86 | 0x0c|SHIFT, // I 87 | 0x0d|SHIFT, // J 88 | 0x0e|SHIFT, // K 89 | 0x0f|SHIFT, // L 90 | 0x10|SHIFT, // M 91 | 0x11|SHIFT, // N 92 | 0x12|SHIFT, // O 93 | 0x13|SHIFT, // P 94 | 0x14|SHIFT, // Q 95 | 0x15|SHIFT, // R 96 | 0x16|SHIFT, // S 97 | 0x17|SHIFT, // T 98 | 0x18|SHIFT, // U 99 | 0x19|SHIFT, // V 100 | 0x1a|SHIFT, // W 101 | 0x1b|SHIFT, // X 102 | 0x1c|SHIFT, // Y 103 | 0x1d|SHIFT, // Z 104 | 0x25, // [ 105 | 0x2d, // bslash 106 | 0x26, // ] 107 | 0x30|SHIFT, // ^ 108 | 0x38|SHIFT, // _ 109 | 0x2e|SHIFT, // ` 110 | 0x04, // a 111 | 0x05, // b 112 | 0x06, // c 113 | 0x07, // d 114 | 0x08, // e 115 | 0x09, // f 116 | 0x0a, // g 117 | 0x0b, // h 118 | 0x0c, // i 119 | 0x0d, // j 120 | 0x0e, // k 121 | 0x0f, // l 122 | 0x10, // m 123 | 0x11, // n 124 | 0x12, // o 125 | 0x13, // p 126 | 0x14, // q 127 | 0x15, // r 128 | 0x16, // s 129 | 0x17, // t 130 | 0x18, // u 131 | 0x19, // v 132 | 0x1a, // w 133 | 0x1b, // x 134 | 0x1c, // y 135 | 0x1d, // z 136 | 0x24, // { 137 | 0x64, // | 138 | 0x27, // } 139 | 0x30, // ~ 140 | 0 // DEL 141 | }; 142 | 143 | // Init var 144 | bool _altGrMap[128]; 145 | bool _altFine = false; 146 | 147 | // Individually define all needed char 148 | void initAltGr() { 149 | _altFine = true; 150 | 151 | _altGrMap[36] = true; // $ 152 | _altGrMap[64] = true; // @ 153 | _altGrMap[91] = true; // [ 154 | _altGrMap[92] = true; // bslash 155 | _altGrMap[93] = true; // ] 156 | _altGrMap[123] = true; // { 157 | _altGrMap[124] = true; // | 158 | _altGrMap[125] = true; // } 159 | _altGrMap[126] = true; // ~ 160 | } 161 | -------------------------------------------------------------------------------- /converter/src/locales/de_DE.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * The following character can't be typed: 3 | * "ß´üöä°§ÜÖIJ³€µ" 4 | * If you try to type these you get this result: ('"' can be typed) 5 | * "t ä´z qk 2 " 6 | * As you see you get the wrong character. Spaces mean you get nothing or the script crashes. 7 | */ 8 | 9 | #define SHIFT 0x80 10 | const uint8_t _asciimap[128] = 11 | { 12 | 0x00, // NUL 0 13 | 0x00, // SOH 14 | 0x00, // STX 15 | 0x00, // ETX 16 | 0x00, // EOT 17 | 0x00, // ENQ 18 | 0x00, // ACK 19 | 0x00, // BEL 20 | 0x2a, // BS Backspace 21 | 0x2b, // TAB Tab 22 | 0x28, // LF Enter 10 23 | 0x00, // VT 24 | 0x00, // FF 25 | 0x00, // CR 26 | 0x00, // SO 27 | 0x00, // SI 28 | 0x00, // DEL 29 | 0x00, // DC1 30 | 0x00, // DC2 31 | 0x00, // DC3 32 | 0x00, // DC4 20 33 | 0x00, // NAK 34 | 0x00, // SYN 35 | 0x00, // ETB 36 | 0x00, // CAN 37 | 0x00, // EM 38 | 0x00, // SUB 39 | 0x00, // ESC 40 | 0x00, // FS 41 | 0x00, // GS 42 | 0x00, // RS 30 43 | 0x00, // US 44 | 45 | 0x2c, // ' ' 46 | 0x1e|SHIFT, // ! 47 | 0x1f|SHIFT, // " 48 | 0x31, // # 49 | 0x21|SHIFT, // $ 50 | 0x22|SHIFT, // % 51 | 0x23|SHIFT, // & 52 | 0x31|SHIFT, // ' 53 | 0x25|SHIFT, // ( 40 54 | 0x26|SHIFT, // ) 55 | 0x30|SHIFT, // * 56 | 0x30, // + 57 | 0x36, // , 58 | 0x38, // - 59 | 0x37, // . 60 | 0x24|SHIFT, // / 61 | 0x27, // 0 62 | 0x1e, // 1 63 | 0x1f, // 2 50 64 | 0x20, // 3 65 | 0x21, // 4 66 | 0x22, // 5 67 | 0x23, // 6 68 | 0x24, // 7 69 | 0x25, // 8 70 | 0x26, // 9 71 | 0x37|SHIFT, // : 72 | 0x36|SHIFT, // ; 73 | 0x64, // < 60 74 | 0x27|SHIFT, // = 75 | 0x64|SHIFT, // > 76 | 0x2d|SHIFT, // ? 77 | 0x14, // @ 78 | 0x04|SHIFT, // A 79 | 0x05|SHIFT, // B 80 | 0x06|SHIFT, // C 81 | 0x07|SHIFT, // D 82 | 0x08|SHIFT, // E 83 | 0x09|SHIFT, // F 70 84 | 0x0a|SHIFT, // G 85 | 0x0b|SHIFT, // H 86 | 0x0c|SHIFT, // I 87 | 0x0d|SHIFT, // J 88 | 0x0e|SHIFT, // K 89 | 0x0f|SHIFT, // L 90 | 0x10|SHIFT, // M 91 | 0x11|SHIFT, // N 92 | 0x12|SHIFT, // O 93 | 0x13|SHIFT, // P 80 94 | 0x14|SHIFT, // Q 95 | 0x15|SHIFT, // R 96 | 0x16|SHIFT, // S 97 | 0x17|SHIFT, // T 98 | 0x18|SHIFT, // U 99 | 0x19|SHIFT, // V 100 | 0x1a|SHIFT, // W 101 | 0x1b|SHIFT, // X 102 | 0x1d|SHIFT, // Y 103 | 0x1c|SHIFT, // Z 90 104 | 0x25, // [ 105 | 0x2d, // bslash 106 | 0x26, // ] 107 | 0x35, // ^ 108 | 0x38|SHIFT, // _ 109 | 0x2e|SHIFT, // ` 110 | 0x04, // a 111 | 0x05, // b 112 | 0x06, // c 113 | 0x07, // d 100 114 | 0x08, // e 115 | 0x09, // f 116 | 0x0a, // g 117 | 0x0b, // h 118 | 0x0c, // i 119 | 0x0d, // j 120 | 0x0e, // k 121 | 0x0f, // l 122 | 0x10, // m 123 | 0x11, // n 110 124 | 0x12, // o 125 | 0x13, // p 126 | 0x14, // q 127 | 0x15, // r 128 | 0x16, // s 129 | 0x17, // t 130 | 0x18, // u 131 | 0x19, // v 132 | 0x1a, // w 133 | 0x1b, // x 120 134 | 0x1d, // y 135 | 0x1c, // z 136 | 0x24, // { 137 | 0x64, // | 138 | 0x27, // } 139 | 0x30, // ~ 140 | 0 // DEL 127 141 | }; 142 | 143 | // Init var 144 | bool _altGrMap[128]; 145 | bool _altFine = false; 146 | 147 | // Individually define all needed char 148 | void initAltGr() { 149 | _altFine = true; 150 | 151 | _altGrMap[126] = true; // ~ 152 | _altGrMap[123] = true; // { 153 | _altGrMap[91] = true; // [ 154 | _altGrMap[93] = true; // ] 155 | _altGrMap[125] = true; // } 156 | _altGrMap[92] = true; // bslash 157 | _altGrMap[124] = true; // | 158 | _altGrMap[64] = true; // | 159 | } 160 | -------------------------------------------------------------------------------- /converter/src/locales/da_DK.lang: -------------------------------------------------------------------------------- 1 | /* 2 | * Due to how the danish keyboard works some characters (~, ^, `) have to be pressed twice, on ubuntu two presses creates one character, on windows one press creates no charater and two presses creates two. 3 | * 4 | * This means that the required test string is "!\"#$%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^^``_abcdefghijklmnopqrstuvwxyz{|}~~ @" 5 | * Note that the two backslashes are just escaping the backslash. Backslashes don't have to be pressed twice on danish keyboards. 6 | */ 7 | 8 | #define SHIFT 0x80 9 | const uint8_t _asciimap[128] = 10 | { 11 | 0x00, // NUL 12 | 0x00, // SOH 13 | 0x00, // STX 14 | 0x00, // ETX 15 | 0x00, // EOT 16 | 0x00, // ENQ 17 | 0x00, // ACK 18 | 0x00, // BEL 19 | 0x2a, // BS Backspace 20 | 0x2b, // TAB Tab 21 | 0x28, // LF Enter 22 | 0x00, // VT 23 | 0x00, // FF 24 | 0x00, // CR 25 | 0x00, // SO 26 | 0x00, // SI 27 | 0x00, // DEL 28 | 0x00, // DC1 29 | 0x00, // DC2 30 | 0x00, // DC3 31 | 0x00, // DC4 32 | 0x00, // NAK 33 | 0x00, // SYN 34 | 0x00, // ETB 35 | 0x00, // CAN 36 | 0x00, // EM 37 | 0x00, // SUB 38 | 0x00, // ESC 39 | 0x00, // FS 40 | 0x00, // GS 41 | 0x00, // RS 42 | 0x00, // US 43 | 44 | 0x2c, // ' ' 45 | 0x1e|SHIFT, // ! 46 | 0x1f|SHIFT, // " 47 | 0x20|SHIFT, // # 48 | 0x21, // $ 49 | 0x22|SHIFT, // % 50 | 0x23|SHIFT, // & 51 | 0x31, // ' 52 | 0x25|SHIFT, // ( 53 | 0x26|SHIFT, // ) 54 | 0x31|SHIFT, // * 55 | 0x2d, // + 56 | 0x36, // , 57 | 0x38, // - 58 | 0x37, // . 59 | 0x24|SHIFT, // / 60 | 0x27, // 0 61 | 0x1e, // 1 62 | 0x1f, // 2 63 | 0x20, // 3 64 | 0x21, // 4 65 | 0x22, // 5 66 | 0x23, // 6 67 | 0x24, // 7 68 | 0x25, // 8 69 | 0x26, // 9 70 | 0x37|SHIFT, // : 71 | 0x36|SHIFT, // ; 72 | 0x64, // < 73 | 0x27|SHIFT, // = 74 | 0x64|SHIFT, // > 75 | 0x2d|SHIFT, // ? 76 | 0x1f, // @ 77 | 0x04|SHIFT, // A 78 | 0x05|SHIFT, // B 79 | 0x06|SHIFT, // C 80 | 0x07|SHIFT, // D 81 | 0x08|SHIFT, // E 82 | 0x09|SHIFT, // F 83 | 0x0a|SHIFT, // G 84 | 0x0b|SHIFT, // H 85 | 0x0c|SHIFT, // I 86 | 0x0d|SHIFT, // J 87 | 0x0e|SHIFT, // K 88 | 0x0f|SHIFT, // L 89 | 0x10|SHIFT, // M 90 | 0x11|SHIFT, // N 91 | 0x12|SHIFT, // O 92 | 0x13|SHIFT, // P 93 | 0x14|SHIFT, // Q 94 | 0x15|SHIFT, // R 95 | 0x16|SHIFT, // S 96 | 0x17|SHIFT, // T 97 | 0x18|SHIFT, // U 98 | 0x19|SHIFT, // V 99 | 0x1a|SHIFT, // W 100 | 0x1b|SHIFT, // X 101 | 0x1c|SHIFT, // Y 102 | 0x1d|SHIFT, // Z 103 | 0x25, // [ 104 | 0x64, // bslash 105 | 0x26, // ] 106 | 0x30|SHIFT, // ^ 107 | 0x38|SHIFT, // _ 108 | 0x2e|SHIFT, // ` 109 | 0x04, // a 110 | 0x05, // b 111 | 0x06, // c 112 | 0x07, // d 113 | 0x08, // e 114 | 0x09, // f 115 | 0x0a, // g 116 | 0x0b, // h 117 | 0x0c, // i 118 | 0x0d, // j 119 | 0x0e, // k 120 | 0x0f, // l 121 | 0x10, // m 122 | 0x11, // n 123 | 0x12, // o 124 | 0x13, // p 125 | 0x14, // q 126 | 0x15, // r 127 | 0x16, // s 128 | 0x17, // t 129 | 0x18, // u 130 | 0x19, // v 131 | 0x1a, // w 132 | 0x1b, // x 133 | 0x1c, // y 134 | 0x1d, // z 135 | 0x24, // { 136 | 0x2e, // | 137 | 0x27, // } 138 | 0x30, // ~ 139 | 0 // DEL 140 | }; 141 | 142 | // Init var 143 | bool _altGrMap[128]; 144 | bool _altFine = false; 145 | 146 | // Individually define all needed char 147 | void initAltGr() { 148 | _altFine = true; 149 | 150 | _altGrMap[36] = true; // $ 151 | _altGrMap[64] = true; // @ 152 | _altGrMap[91] = true; // [ 153 | _altGrMap[92] = true; // bslash 154 | _altGrMap[93] = true; // ] 155 | _altGrMap[123] = true; // { 156 | _altGrMap[124] = true; // | 157 | _altGrMap[125] = true; // } 158 | _altGrMap[126] = true; // ~ 159 | } 160 | -------------------------------------------------------------------------------- /converter/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MalDuino Converter 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 30 | 31 |
32 | 33 |
34 |
35 | LITE 36 |
37 |
38 | ELITE 39 |
40 |
41 | 42 |
43 |
44 | 45 | 46 |
47 |
48 | 49 |
50 |
51 | 52 |
53 |
54 | 55 |
56 |
57 | 58 |
59 |
60 | 61 |
62 |
63 | 64 |
65 |
66 | 67 |
68 |
69 | 70 |
71 |
72 | 73 |
74 |
75 | 76 |
77 |
78 | 79 |
80 |
81 | 82 |
83 |
84 | 85 |
86 |
87 | 88 |
89 |
90 | 91 |
92 |
93 | 94 |
95 |
96 | 97 |
98 |
99 |

Input to STRING Commands

100 |
101 |
102 | 103 |
104 |
105 |
106 |
107 | 108 |
109 |
110 | 111 |
112 |
113 |
114 |
115 |
116 | 117 |
118 |

Press Convert

119 |
120 | 121 |
122 |
123 |
124 | 145 |
146 |
147 | 151 |
152 |
153 |
154 | 155 |
156 | 157 |
158 |
159 | 160 | 161 | -------------------------------------------------------------------------------- /converter/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS text size adjust after orientation change, without disabling 6 | * user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 29 | * and Firefox. 30 | * Correct `block` display not defined for `main` in IE 11. 31 | */ 32 | 33 | article, 34 | aside, 35 | details, 36 | figcaption, 37 | figure, 38 | footer, 39 | header, 40 | hgroup, 41 | main, 42 | menu, 43 | nav, 44 | section, 45 | summary { 46 | display: block; 47 | } 48 | 49 | /** 50 | * 1. Correct `inline-block` display not defined in IE 8/9. 51 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 52 | */ 53 | 54 | audio, 55 | canvas, 56 | progress, 57 | video { 58 | display: inline-block; /* 1 */ 59 | vertical-align: baseline; /* 2 */ 60 | } 61 | 62 | /** 63 | * Prevent modern browsers from displaying `audio` without controls. 64 | * Remove excess height in iOS 5 devices. 65 | */ 66 | 67 | audio:not([controls]) { 68 | display: none; 69 | height: 0; 70 | } 71 | 72 | /** 73 | * Address `[hidden]` styling not present in IE 8/9/10. 74 | * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. 75 | */ 76 | 77 | [hidden], 78 | template { 79 | display: none; 80 | } 81 | 82 | /* Links 83 | ========================================================================== */ 84 | 85 | /** 86 | * Remove the gray background color from active links in IE 10. 87 | */ 88 | 89 | a { 90 | background-color: transparent; 91 | } 92 | 93 | /** 94 | * Improve readability when focused and also mouse hovered in all browsers. 95 | */ 96 | 97 | a:active, 98 | a:hover { 99 | outline: 0; 100 | } 101 | 102 | /* Text-level semantics 103 | ========================================================================== */ 104 | 105 | /** 106 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 107 | */ 108 | 109 | abbr[title] { 110 | border-bottom: 1px dotted; 111 | } 112 | 113 | /** 114 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 115 | */ 116 | 117 | b, 118 | strong { 119 | font-weight: bold; 120 | } 121 | 122 | /** 123 | * Address styling not present in Safari and Chrome. 124 | */ 125 | 126 | dfn { 127 | font-style: italic; 128 | } 129 | 130 | /** 131 | * Address variable `h1` font-size and margin within `section` and `article` 132 | * contexts in Firefox 4+, Safari, and Chrome. 133 | */ 134 | 135 | h1 { 136 | font-size: 2em; 137 | margin: 0.67em 0; 138 | } 139 | 140 | /** 141 | * Address styling not present in IE 8/9. 142 | */ 143 | 144 | mark { 145 | background: #ff0; 146 | color: #000; 147 | } 148 | 149 | /** 150 | * Address inconsistent and variable font size in all browsers. 151 | */ 152 | 153 | small { 154 | font-size: 80%; 155 | } 156 | 157 | /** 158 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 159 | */ 160 | 161 | sub, 162 | sup { 163 | font-size: 75%; 164 | line-height: 0; 165 | position: relative; 166 | vertical-align: baseline; 167 | } 168 | 169 | sup { 170 | top: -0.5em; 171 | } 172 | 173 | sub { 174 | bottom: -0.25em; 175 | } 176 | 177 | /* Embedded content 178 | ========================================================================== */ 179 | 180 | /** 181 | * Remove border when inside `a` element in IE 8/9/10. 182 | */ 183 | 184 | img { 185 | border: 0; 186 | } 187 | 188 | /** 189 | * Correct overflow not hidden in IE 9/10/11. 190 | */ 191 | 192 | svg:not(:root) { 193 | overflow: hidden; 194 | } 195 | 196 | /* Grouping content 197 | ========================================================================== */ 198 | 199 | /** 200 | * Address margin not present in IE 8/9 and Safari. 201 | */ 202 | 203 | figure { 204 | margin: 1em 40px; 205 | } 206 | 207 | /** 208 | * Address differences between Firefox and other browsers. 209 | */ 210 | 211 | hr { 212 | -moz-box-sizing: content-box; 213 | box-sizing: content-box; 214 | height: 0; 215 | } 216 | 217 | /** 218 | * Contain overflow in all browsers. 219 | */ 220 | 221 | pre { 222 | overflow: auto; 223 | } 224 | 225 | /** 226 | * Address odd `em`-unit font size rendering in all browsers. 227 | */ 228 | 229 | code, 230 | kbd, 231 | pre, 232 | samp { 233 | font-family: monospace, monospace; 234 | font-size: 1em; 235 | } 236 | 237 | /* Forms 238 | ========================================================================== */ 239 | 240 | /** 241 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 242 | * styling of `select`, unless a `border` property is set. 243 | */ 244 | 245 | /** 246 | * 1. Correct color not being inherited. 247 | * Known issue: affects color of disabled elements. 248 | * 2. Correct font properties not being inherited. 249 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 250 | */ 251 | 252 | button, 253 | input, 254 | optgroup, 255 | select, 256 | textarea { 257 | color: inherit; /* 1 */ 258 | font: inherit; /* 2 */ 259 | margin: 0; /* 3 */ 260 | } 261 | 262 | /** 263 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 264 | */ 265 | 266 | button { 267 | overflow: visible; 268 | } 269 | 270 | /** 271 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 272 | * All other form control elements do not inherit `text-transform` values. 273 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 274 | * Correct `select` style inheritance in Firefox. 275 | */ 276 | 277 | button, 278 | select { 279 | text-transform: none; 280 | } 281 | 282 | /** 283 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 284 | * and `video` controls. 285 | * 2. Correct inability to style clickable `input` types in iOS. 286 | * 3. Improve usability and consistency of cursor style between image-type 287 | * `input` and others. 288 | */ 289 | 290 | button, 291 | html input[type="button"], /* 1 */ 292 | input[type="reset"], 293 | input[type="submit"] { 294 | -webkit-appearance: button; /* 2 */ 295 | cursor: pointer; /* 3 */ 296 | } 297 | 298 | /** 299 | * Re-set default cursor for disabled elements. 300 | */ 301 | 302 | button[disabled], 303 | html input[disabled] { 304 | cursor: default; 305 | } 306 | 307 | /** 308 | * Remove inner padding and border in Firefox 4+. 309 | */ 310 | 311 | button::-moz-focus-inner, 312 | input::-moz-focus-inner { 313 | border: 0; 314 | padding: 0; 315 | } 316 | 317 | /** 318 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 319 | * the UA stylesheet. 320 | */ 321 | 322 | input { 323 | line-height: normal; 324 | } 325 | 326 | /** 327 | * It's recommended that you don't attempt to style these elements. 328 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 329 | * 330 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 331 | * 2. Remove excess padding in IE 8/9/10. 332 | */ 333 | 334 | input[type="checkbox"], 335 | input[type="radio"] { 336 | box-sizing: border-box; /* 1 */ 337 | padding: 0; /* 2 */ 338 | } 339 | 340 | /** 341 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 342 | * `font-size` values of the `input`, it causes the cursor style of the 343 | * decrement button to change from `default` to `text`. 344 | */ 345 | 346 | input[type="number"]::-webkit-inner-spin-button, 347 | input[type="number"]::-webkit-outer-spin-button { 348 | height: auto; 349 | } 350 | 351 | /** 352 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 353 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome 354 | * (include `-moz` to future-proof). 355 | */ 356 | 357 | input[type="search"] { 358 | -webkit-appearance: textfield; /* 1 */ 359 | -moz-box-sizing: content-box; 360 | -webkit-box-sizing: content-box; /* 2 */ 361 | box-sizing: content-box; 362 | } 363 | 364 | /** 365 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 366 | * Safari (but not Chrome) clips the cancel button when the search input has 367 | * padding (and `textfield` appearance). 368 | */ 369 | 370 | input[type="search"]::-webkit-search-cancel-button, 371 | input[type="search"]::-webkit-search-decoration { 372 | -webkit-appearance: none; 373 | } 374 | 375 | /** 376 | * Define consistent border, margin, and padding. 377 | */ 378 | 379 | fieldset { 380 | border: 1px solid #c0c0c0; 381 | margin: 0 2px; 382 | padding: 0.35em 0.625em 0.75em; 383 | } 384 | 385 | /** 386 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 387 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 388 | */ 389 | 390 | legend { 391 | border: 0; /* 1 */ 392 | padding: 0; /* 2 */ 393 | } 394 | 395 | /** 396 | * Remove default vertical scrollbar in IE 8/9/10/11. 397 | */ 398 | 399 | textarea { 400 | overflow: auto; 401 | } 402 | 403 | /** 404 | * Don't inherit the `font-weight` (applied by a rule above). 405 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 406 | */ 407 | 408 | optgroup { 409 | font-weight: bold; 410 | } 411 | 412 | /* Tables 413 | ========================================================================== */ 414 | 415 | /** 416 | * Remove most spacing between table cells. 417 | */ 418 | 419 | table { 420 | border-collapse: collapse; 421 | border-spacing: 0; 422 | } 423 | 424 | td, 425 | th { 426 | padding: 0; 427 | } -------------------------------------------------------------------------------- /converter/src/elite.ino: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================== 3 | Copyright (c) 2017 Seytonic, Spacehuhn (Licensed under MIT) 4 | For more information see: github.com/seytonic/malduino 5 | ============================================================== 6 | */ 7 | 8 | #include 9 | #include 10 | #include "Keyboard.h" 11 | #include "Mouse.h" 12 | 13 | #define debug true // <-- uncomment to turn serial output on 14 | #define CSpin 4 //Chip-Select of the SD-Card reader 15 | #define ledPin 3 16 | #define blinkInterval 50 17 | 18 | //Dip-Switch Pins: 19 | #define dip1 6 20 | #define dip2 8 21 | #define dip3 9 22 | #define dip4 10 23 | 24 | #define buffersize 256 25 | 26 | #define KEYPAD_0 234 27 | #define KEYPAD_1 225 28 | #define KEYPAD_2 226 29 | #define KEYPAD_3 227 30 | #define KEYPAD_4 228 31 | #define KEYPAD_5 229 32 | #define KEYPAD_6 230 33 | #define KEYPAD_7 231 34 | #define KEYPAD_8 232 35 | #define KEYPAD_9 233 36 | #define KEYPAD_ASTERIX 221 37 | #define KEYPAD_ENTER 224 38 | #define KEYPAD_MINUS 222 39 | #define KEYPAD_PERIOD 235 40 | #define KEYPAD_PLUS 223 41 | #define KEYPAD_SLASH 220 42 | #define PRINTSCREEN 206 43 | 44 | File payload; 45 | char* buf = malloc(sizeof(char)*buffersize); 46 | char* repeatBuffer = malloc(sizeof(char)*12); 47 | 48 | int bufSize = 0; 49 | int defaultDelay = 5; 50 | int defaultCharDelay = 5; 51 | bool ledOn = true; 52 | int rMin = -100; 53 | int rMax = 100; 54 | 55 | 56 | int getSpace(int start, int end){ 57 | for(int i=start;i= 0 && space < bufSize){ 123 | int nSpace = getSpace(space+1,bufSize); 124 | if(nSpace == -1) nSpace = bufSize; 125 | runCommand(space+1,nSpace); 126 | space = nSpace; 127 | } 128 | } 129 | } 130 | 131 | Keyboard.releaseAll(); 132 | delay(defaultDelay); 133 | } 134 | 135 | void runCommand(int s, int e){ 136 | 137 | #ifdef debug 138 | Serial.println("Press '"+String(buf).substring(s,e)+"'"); 139 | #endif 140 | 141 | if(e - s < 2) Keyboard.press(buf[s]); 142 | else if(equalsBuffer(s,e,"ENTER")) Keyboard.press(KEY_RETURN); 143 | else if(equalsBuffer(s,e,"GUI") || equalsBuffer(s,e,"WINDOWS")) Keyboard.press(KEY_LEFT_GUI); 144 | else if(equalsBuffer(s,e,"SHIFT")) Keyboard.press(KEY_LEFT_SHIFT); 145 | else if(equalsBuffer(s,e,"ALT") ||equalsBuffer(s,e,"ALT_LEFT") ||equalsBuffer(s,e,"ALTLEFT")) Keyboard.press(KEY_LEFT_ALT); 146 | else if(equalsBuffer(s,e,"ALT_RIGHT") ||equalsBuffer(s,e,"ALTRIGHT")) Keyboard.press(KEY_RIGHT_ALT); 147 | else if(equalsBuffer(s,e,"CTRL") || equalsBuffer(s,e,"CONTROL")) Keyboard.press(KEY_LEFT_CTRL); 148 | else if(equalsBuffer(s,e,"CAPSLOCK")) Keyboard.press(KEY_CAPS_LOCK); 149 | else if(equalsBuffer(s,e,"DELETE")) Keyboard.press(KEY_DELETE); 150 | else if(equalsBuffer(s,e,"END")) Keyboard.press(KEY_END); 151 | else if(equalsBuffer(s,e,"ESC") || equalsBuffer(s,e,"ESCAPE")) Keyboard.press(KEY_ESC); 152 | else if(equalsBuffer(s,e,"HOME")) Keyboard.press(KEY_HOME); 153 | else if(equalsBuffer(s,e,"INSERT")) Keyboard.press(KEY_INSERT); 154 | else if(equalsBuffer(s,e,"PAGEUP")) Keyboard.press(KEY_PAGE_UP); 155 | else if(equalsBuffer(s,e,"PAGEDOWN")) Keyboard.press(KEY_PAGE_DOWN); 156 | else if(equalsBuffer(s,e,"SPACE")) Keyboard.press(' '); 157 | else if(equalsBuffer(s,e,"TAB")) Keyboard.press(KEY_TAB); 158 | else if(equalsBuffer(s,e,"BACKSPACE")) Keyboard.press(KEY_BACKSPACE); 159 | 160 | else if(equalsBuffer(s,e,"UP") || equalsBuffer(s,e,"UPARROW")) Keyboard.press(KEY_UP_ARROW); 161 | else if(equalsBuffer(s,e,"DOWN") || equalsBuffer(s,e,"DOWNARROW")) Keyboard.press(KEY_DOWN_ARROW); 162 | else if(equalsBuffer(s,e,"LEFT") || equalsBuffer(s,e,"LEFTARROW")) Keyboard.press(KEY_LEFT_ARROW); 163 | else if(equalsBuffer(s,e,"RIGHT") || equalsBuffer(s,e,"RIGHTARROW")) Keyboard.press(KEY_RIGHT_ARROW); 164 | 165 | else if(equalsBuffer(s,e,"PRINTSCREEN")) Keyboard.press(PRINTSCREEN); 166 | 167 | else if(equalsBuffer(s,e,"F1")) Keyboard.press(KEY_F1); 168 | else if(equalsBuffer(s,e,"F2")) Keyboard.press(KEY_F2); 169 | else if(equalsBuffer(s,e,"F3")) Keyboard.press(KEY_F3); 170 | else if(equalsBuffer(s,e,"F4")) Keyboard.press(KEY_F4); 171 | else if(equalsBuffer(s,e,"F5")) Keyboard.press(KEY_F5); 172 | else if(equalsBuffer(s,e,"F6")) Keyboard.press(KEY_F6); 173 | else if(equalsBuffer(s,e,"F7")) Keyboard.press(KEY_F7); 174 | else if(equalsBuffer(s,e,"F8")) Keyboard.press(KEY_F8); 175 | else if(equalsBuffer(s,e,"F9")) Keyboard.press(KEY_F9); 176 | else if(equalsBuffer(s,e,"F10")) Keyboard.press(KEY_F10); 177 | else if(equalsBuffer(s,e,"F11")) Keyboard.press(KEY_F11); 178 | else if(equalsBuffer(s,e,"F12")) Keyboard.press(KEY_F12); 179 | 180 | else if(equalsBuffer(s,e,"NUM_0")) KeyboardWrite(KEYPAD_0); 181 | else if(equalsBuffer(s,e,"NUM_1")) KeyboardWrite(KEYPAD_1); 182 | else if(equalsBuffer(s,e,"NUM_2")) KeyboardWrite(KEYPAD_2); 183 | else if(equalsBuffer(s,e,"NUM_3")) KeyboardWrite(KEYPAD_3); 184 | else if(equalsBuffer(s,e,"NUM_4")) KeyboardWrite(KEYPAD_4); 185 | else if(equalsBuffer(s,e,"NUM_5")) KeyboardWrite(KEYPAD_5); 186 | else if(equalsBuffer(s,e,"NUM_6")) KeyboardWrite(KEYPAD_6); 187 | else if(equalsBuffer(s,e,"NUM_7")) KeyboardWrite(KEYPAD_7); 188 | else if(equalsBuffer(s,e,"NUM_8")) KeyboardWrite(KEYPAD_8); 189 | else if(equalsBuffer(s,e,"NUM_9")) KeyboardWrite(KEYPAD_9); 190 | else if(equalsBuffer(s,e,"NUM_ASTERIX")) KeyboardWrite(KEYPAD_ASTERIX); 191 | else if(equalsBuffer(s,e,"NUM_ENTER")) KeyboardWrite(KEYPAD_ENTER); 192 | else if(equalsBuffer(s,e,"NUM_Minus")) KeyboardWrite(KEYPAD_MINUS); 193 | else if(equalsBuffer(s,e,"NUM_PERIOD")) KeyboardWrite(KEYPAD_PERIOD); 194 | else if(equalsBuffer(s,e,"NUM_PLUS")) KeyboardWrite(KEYPAD_PLUS); 195 | 196 | else if(equalsBuffer(s,e,"CLICK") || equalsBuffer(s,e,"CLICK_LEFT") || equalsBuffer(s,e,"MOUSECLICK")) Mouse.click(); 197 | else if(equalsBuffer(s,e,"CLICK_RIGHT")) Mouse.click(MOUSE_RIGHT); 198 | else if(equalsBuffer(s,e,"CLICK_MIDDLE")) Mouse.click(MOUSE_MIDDLE); 199 | 200 | else if(equalsBuffer(s,e,"PRESS") || equalsBuffer(s,e,"PRESS_LEFT")) Mouse.press(); 201 | else if(equalsBuffer(s,e,"PRESS_LEFT")) Mouse.press(MOUSE_RIGHT); 202 | else if(equalsBuffer(s,e,"PRESS_MIDDLE")) Mouse.press(MOUSE_MIDDLE); 203 | else if(equalsBuffer(s,e,"RELEASE") || equalsBuffer(s,e,"RELEASE_LEFT")) Mouse.release(); 204 | else if(equalsBuffer(s,e,"RELEASE_LEFT")) Mouse.release(MOUSE_RIGHT); 205 | else if(equalsBuffer(s,e,"RELEASE_MIDDLE")) Mouse.release(MOUSE_MIDDLE); 206 | 207 | #ifdef debug 208 | else Serial.println("failed to find command"); 209 | #endif 210 | /* not implemented 211 | else if(equalsBuffer(s,e,"APP")) Keyboard.press(); 212 | else if(equalsBuffer(s,e,"MENU")) Keyboard.press(); 213 | else if(equalsBuffer(s,e,"BREAK") || equalsBuffer(s,e,"PAUSE",5)) Keyboard.press(); 214 | else if(equalsBuffer(s,e,"NUMLOCK")) Keyboard.press(); 215 | else if(equalsBuffer(s,e,"SCROLLLOCK")) Keyboard.press(); 216 | */ 217 | } 218 | 219 | void setup() { 220 | #ifdef debug 221 | Serial.begin(115200); 222 | delay(2000); 223 | Serial.println("Started!"); 224 | #endif 225 | 226 | randomSeed(analogRead(0)); 227 | 228 | pinMode(ledPin, OUTPUT); 229 | digitalWrite(ledPin, HIGH); 230 | 231 | String scriptName = ""; // Name of the file that will be opened 232 | 233 | pinMode(dip1, INPUT_PULLUP); 234 | pinMode(dip2, INPUT_PULLUP); 235 | pinMode(dip3, INPUT_PULLUP); 236 | pinMode(dip4, INPUT_PULLUP); 237 | 238 | if(digitalRead(dip1) == LOW){scriptName += '1';} else {scriptName += '0';} 239 | if(digitalRead(dip2) == LOW){scriptName += '1';} else {scriptName += '0';} 240 | if(digitalRead(dip3) == LOW){scriptName += '1';} else {scriptName += '0';} 241 | if(digitalRead(dip4) == LOW){scriptName += '1';} else {scriptName += '0';} 242 | 243 | scriptName += ".txt"; 244 | 245 | if(!SD.begin(4)) { 246 | #ifdef debug 247 | Serial.println("couldn't access sd-card :("); 248 | #endif 249 | return; 250 | } 251 | 252 | payload = SD.open(scriptName); 253 | if(!payload){ 254 | #ifdef debug 255 | Serial.println("couldn't find script: '"+String(scriptName)+"'"); 256 | #endif 257 | return; 258 | }else{ 259 | Keyboard.begin(); 260 | Mouse.begin(); 261 | while(payload.available()){ 262 | 263 | buf[bufSize] = payload.read(); 264 | if(buf[bufSize] == '\r' || buf[bufSize] == '\n' || bufSize >= buffersize){ 265 | if(buf[bufSize] == '\r' && payload.peek() == '\n') payload.read(); 266 | 267 | //---------REPEAT--------- 268 | int repeatBufferSize = 0; 269 | int repeats = 0; 270 | unsigned long payloadPosition = payload.position(); 271 | 272 | for(int i=0;i<12;i++){ 273 | if(payload.available()){ 274 | repeatBuffer[repeatBufferSize] = payload.read(); 275 | repeatBufferSize++; 276 | }else break; 277 | } 278 | 279 | if(repeatBufferSize > 6){ 280 | if(equals(repeatBuffer, 0, 6, "REPEAT", 6)){ 281 | repeats = getInt(repeatBuffer, 6); 282 | } 283 | } 284 | 285 | for(int i=0;i 0){ 296 | runLine(); 297 | bufSize = 0; 298 | } 299 | payload.close(); 300 | Mouse.end(); 301 | Keyboard.end(); 302 | } 303 | } 304 | 305 | void loop() { 306 | ledOn = !ledOn; 307 | digitalWrite(ledPin, ledOn); 308 | delay(blinkInterval); 309 | } 310 | -------------------------------------------------------------------------------- /firmware/malduino_elite/malduino_elite.ino: -------------------------------------------------------------------------------- 1 | n/* 2 | ============================================================== 3 | Copyright (c) 2017 Seytonic, Spacehuhn (Licensed under MIT) 4 | For more information see: github.com/seytonic/malduino 5 | ============================================================== 6 | */ 7 | 8 | #include 9 | #include 10 | #include "Keyboard.h" 11 | #include "Mouse.h" 12 | 13 | #define debug true // <-- uncomment to turn serial output on 14 | #define CSpin 4 //Chip-Select of the SD-Card reader 15 | #define ledPin 3 16 | #define blinkInterval 50 17 | 18 | //Dip-Switch Pins: 19 | #define dip1 6 20 | #define dip2 8 21 | #define dip3 9 22 | #define dip4 10 23 | 24 | #define buffersize 256 25 | 26 | #define KEYPAD_0 234 27 | #define KEYPAD_1 225 28 | #define KEYPAD_2 226 29 | #define KEYPAD_3 227 30 | #define KEYPAD_4 228 31 | #define KEYPAD_5 229 32 | #define KEYPAD_6 230 33 | #define KEYPAD_7 231 34 | #define KEYPAD_8 232 35 | #define KEYPAD_9 233 36 | #define KEYPAD_ASTERIX 221 37 | #define KEYPAD_ENTER 224 38 | #define KEYPAD_MINUS 222 39 | #define KEYPAD_PERIOD 235 40 | #define KEYPAD_PLUS 223 41 | #define KEYPAD_SLASH 220 42 | #define PRINTSCREEN 206 43 | 44 | File payload; 45 | char* buf = malloc(sizeof(char)*buffersize); 46 | char* repeatBuffer = malloc(sizeof(char)*12); 47 | 48 | int bufSize = 0; 49 | int defaultDelay = 5; 50 | int defaultCharDelay = 5; 51 | bool ledOn = true; 52 | int rMin = -100; 53 | int rMax = 100; 54 | 55 | 56 | int getSpace(int start, int end){ 57 | for(int i=start;i= 0 && space < bufSize){ 123 | int nSpace = getSpace(space+1,bufSize); 124 | if(nSpace == -1) nSpace = bufSize; 125 | runCommand(space+1,nSpace); 126 | space = nSpace; 127 | } 128 | } 129 | } 130 | 131 | Keyboard.releaseAll(); 132 | delay(defaultDelay); 133 | } 134 | 135 | void runCommand(int s, int e){ 136 | 137 | #ifdef debug 138 | Serial.println("Press '"+String(buf).substring(s,e)+"'"); 139 | #endif 140 | 141 | if(e - s < 2) Keyboard.press(buf[s]); 142 | else if(equalsBuffer(s,e,"ENTER")) Keyboard.press(KEY_RETURN); 143 | else if(equalsBuffer(s,e,"GUI") || equalsBuffer(s,e,"WINDOWS")) Keyboard.press(KEY_LEFT_GUI); 144 | else if(equalsBuffer(s,e,"SHIFT")) Keyboard.press(KEY_LEFT_SHIFT); 145 | else if(equalsBuffer(s,e,"ALT") ||equalsBuffer(s,e,"ALT_LEFT") ||equalsBuffer(s,e,"ALTLEFT")) Keyboard.press(KEY_LEFT_ALT); 146 | else if(equalsBuffer(s,e,"ALT_RIGHT") ||equalsBuffer(s,e,"ALTRIGHT")) Keyboard.press(KEY_RIGHT_ALT); 147 | else if(equalsBuffer(s,e,"CTRL") || equalsBuffer(s,e,"CONTROL")) Keyboard.press(KEY_LEFT_CTRL); 148 | else if(equalsBuffer(s,e,"CAPSLOCK")) Keyboard.press(KEY_CAPS_LOCK); 149 | else if(equalsBuffer(s,e,"DELETE")) Keyboard.press(KEY_DELETE); 150 | else if(equalsBuffer(s,e,"END")) Keyboard.press(KEY_END); 151 | else if(equalsBuffer(s,e,"ESC") || equalsBuffer(s,e,"ESCAPE")) Keyboard.press(KEY_ESC); 152 | else if(equalsBuffer(s,e,"HOME")) Keyboard.press(KEY_HOME); 153 | else if(equalsBuffer(s,e,"INSERT")) Keyboard.press(KEY_INSERT); 154 | else if(equalsBuffer(s,e,"PAGEUP")) Keyboard.press(KEY_PAGE_UP); 155 | else if(equalsBuffer(s,e,"PAGEDOWN")) Keyboard.press(KEY_PAGE_DOWN); 156 | else if(equalsBuffer(s,e,"SPACE")) Keyboard.press(' '); 157 | else if(equalsBuffer(s,e,"TAB")) Keyboard.press(KEY_TAB); 158 | else if(equalsBuffer(s,e,"BACKSPACE")) Keyboard.press(KEY_BACKSPACE); 159 | 160 | else if(equalsBuffer(s,e,"UP") || equalsBuffer(s,e,"UPARROW")) Keyboard.press(KEY_UP_ARROW); 161 | else if(equalsBuffer(s,e,"DOWN") || equalsBuffer(s,e,"DOWNARROW")) Keyboard.press(KEY_DOWN_ARROW); 162 | else if(equalsBuffer(s,e,"LEFT") || equalsBuffer(s,e,"LEFTARROW")) Keyboard.press(KEY_LEFT_ARROW); 163 | else if(equalsBuffer(s,e,"RIGHT") || equalsBuffer(s,e,"RIGHTARROW")) Keyboard.press(KEY_RIGHT_ARROW); 164 | 165 | else if(equalsBuffer(s,e,"PRINTSCREEN")) Keyboard.press(PRINTSCREEN); 166 | 167 | else if(equalsBuffer(s,e,"F1")) Keyboard.press(KEY_F1); 168 | else if(equalsBuffer(s,e,"F2")) Keyboard.press(KEY_F2); 169 | else if(equalsBuffer(s,e,"F3")) Keyboard.press(KEY_F3); 170 | else if(equalsBuffer(s,e,"F4")) Keyboard.press(KEY_F4); 171 | else if(equalsBuffer(s,e,"F5")) Keyboard.press(KEY_F5); 172 | else if(equalsBuffer(s,e,"F6")) Keyboard.press(KEY_F6); 173 | else if(equalsBuffer(s,e,"F7")) Keyboard.press(KEY_F7); 174 | else if(equalsBuffer(s,e,"F8")) Keyboard.press(KEY_F8); 175 | else if(equalsBuffer(s,e,"F9")) Keyboard.press(KEY_F9); 176 | else if(equalsBuffer(s,e,"F10")) Keyboard.press(KEY_F10); 177 | else if(equalsBuffer(s,e,"F11")) Keyboard.press(KEY_F11); 178 | else if(equalsBuffer(s,e,"F12")) Keyboard.press(KEY_F12); 179 | 180 | else if(equalsBuffer(s,e,"NUM_0")) KeyboardWrite(KEYPAD_0); 181 | else if(equalsBuffer(s,e,"NUM_1")) KeyboardWrite(KEYPAD_1); 182 | else if(equalsBuffer(s,e,"NUM_2")) KeyboardWrite(KEYPAD_2); 183 | else if(equalsBuffer(s,e,"NUM_3")) KeyboardWrite(KEYPAD_3); 184 | else if(equalsBuffer(s,e,"NUM_4")) KeyboardWrite(KEYPAD_4); 185 | else if(equalsBuffer(s,e,"NUM_5")) KeyboardWrite(KEYPAD_5); 186 | else if(equalsBuffer(s,e,"NUM_6")) KeyboardWrite(KEYPAD_6); 187 | else if(equalsBuffer(s,e,"NUM_7")) KeyboardWrite(KEYPAD_7); 188 | else if(equalsBuffer(s,e,"NUM_8")) KeyboardWrite(KEYPAD_8); 189 | else if(equalsBuffer(s,e,"NUM_9")) KeyboardWrite(KEYPAD_9); 190 | else if(equalsBuffer(s,e,"NUM_ASTERIX")) KeyboardWrite(KEYPAD_ASTERIX); 191 | else if(equalsBuffer(s,e,"NUM_ENTER")) KeyboardWrite(KEYPAD_ENTER); 192 | else if(equalsBuffer(s,e,"NUM_Minus")) KeyboardWrite(KEYPAD_MINUS); 193 | else if(equalsBuffer(s,e,"NUM_PERIOD")) KeyboardWrite(KEYPAD_PERIOD); 194 | else if(equalsBuffer(s,e,"NUM_PLUS")) KeyboardWrite(KEYPAD_PLUS); 195 | 196 | else if(equalsBuffer(s,e,"CLICK") || equalsBuffer(s,e,"CLICK_LEFT") || equalsBuffer(s,e,"MOUSECLICK")) Mouse.click(); 197 | else if(equalsBuffer(s,e,"CLICK_RIGHT")) Mouse.click(MOUSE_RIGHT); 198 | else if(equalsBuffer(s,e,"CLICK_MIDDLE")) Mouse.click(MOUSE_MIDDLE); 199 | 200 | else if(equalsBuffer(s,e,"PRESS") || equalsBuffer(s,e,"PRESS_LEFT")) Mouse.press(); 201 | else if(equalsBuffer(s,e,"PRESS_LEFT")) Mouse.press(MOUSE_RIGHT); 202 | else if(equalsBuffer(s,e,"PRESS_MIDDLE")) Mouse.press(MOUSE_MIDDLE); 203 | else if(equalsBuffer(s,e,"RELEASE") || equalsBuffer(s,e,"RELEASE_LEFT")) Mouse.release(); 204 | else if(equalsBuffer(s,e,"RELEASE_LEFT")) Mouse.release(MOUSE_RIGHT); 205 | else if(equalsBuffer(s,e,"RELEASE_MIDDLE")) Mouse.release(MOUSE_MIDDLE); 206 | 207 | #ifdef debug 208 | else Serial.println("failed to find command"); 209 | #endif 210 | /* not implemented 211 | else if(equalsBuffer(s,e,"APP")) Keyboard.press(); 212 | else if(equalsBuffer(s,e,"MENU")) Keyboard.press(); 213 | else if(equalsBuffer(s,e,"BREAK") || equalsBuffer(s,e,"PAUSE",5)) Keyboard.press(); 214 | else if(equalsBuffer(s,e,"NUMLOCK")) Keyboard.press(); 215 | else if(equalsBuffer(s,e,"SCROLLLOCK")) Keyboard.press(); 216 | */ 217 | } 218 | 219 | void setup() { 220 | #ifdef debug 221 | Serial.begin(115200); 222 | delay(2000); 223 | Serial.println("Started!"); 224 | #endif 225 | 226 | randomSeed(analogRead(0)); 227 | 228 | pinMode(ledPin, OUTPUT); 229 | digitalWrite(ledPin, HIGH); 230 | 231 | String scriptName = ""; // Name of the file that will be opened 232 | 233 | pinMode(dip1, INPUT_PULLUP); 234 | pinMode(dip2, INPUT_PULLUP); 235 | pinMode(dip3, INPUT_PULLUP); 236 | pinMode(dip4, INPUT_PULLUP); 237 | 238 | if(digitalRead(dip1) == LOW){scriptName += '1';} else {scriptName += '0';} 239 | if(digitalRead(dip2) == LOW){scriptName += '1';} else {scriptName += '0';} 240 | if(digitalRead(dip3) == LOW){scriptName += '1';} else {scriptName += '0';} 241 | if(digitalRead(dip4) == LOW){scriptName += '1';} else {scriptName += '0';} 242 | 243 | scriptName += ".txt"; 244 | 245 | if(!SD.begin(4)) { 246 | #ifdef debug 247 | Serial.println("couldn't access sd-card :("); 248 | #endif 249 | return; 250 | } 251 | 252 | payload = SD.open(scriptName); 253 | if(!payload){ 254 | #ifdef debug 255 | Serial.println("couldn't find script: '"+String(scriptName)+"'"); 256 | #endif 257 | return; 258 | }else{ 259 | Keyboard.begin(); 260 | Mouse.begin(); 261 | while(payload.available()){ 262 | 263 | buf[bufSize] = payload.read(); 264 | if(buf[bufSize] == '\r' || buf[bufSize] == '\n' || bufSize >= buffersize){ 265 | if(buf[bufSize] == '\r' && payload.peek() == '\n') payload.read(); 266 | 267 | //---------REPEAT--------- 268 | int repeatBufferSize = 0; 269 | int repeats = 0; 270 | unsigned long payloadPosition = payload.position(); 271 | 272 | for(int i=0;i<12;i++){ 273 | if(payload.available()){ 274 | repeatBuffer[repeatBufferSize] = payload.read(); 275 | repeatBufferSize++; 276 | }else break; 277 | } 278 | 279 | if(repeatBufferSize > 6){ 280 | if(equals(repeatBuffer, 0, 6, "REPEAT", 6)){ 281 | repeats = getInt(repeatBuffer, 6); 282 | } 283 | } 284 | 285 | for(int i=0;i 0){ 296 | runLine(); 297 | bufSize = 0; 298 | } 299 | payload.close(); 300 | Mouse.end(); 301 | Keyboard.end(); 302 | } 303 | } 304 | 305 | void loop() { 306 | ledOn = !ledOn; 307 | digitalWrite(ledPin, ledOn); 308 | delay(blinkInterval); 309 | } 310 | -------------------------------------------------------------------------------- /converter/css/skeleton.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Skeleton V2.0.4 3 | * Copyright 2014, Dave Gamache 4 | * www.getskeleton.com 5 | * Free to use under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 12/29/2014 8 | */ 9 | 10 | 11 | /* Table of contents 12 | –––––––––––––––––––––––––––––––––––––––––––––––––– 13 | - Grid 14 | - Base Styles 15 | - Typography 16 | - Links 17 | - Buttons 18 | - Forms 19 | - Lists 20 | - Code 21 | - Tables 22 | - Spacing 23 | - Utilities 24 | - Clearing 25 | - Media Queries 26 | */ 27 | 28 | 29 | /* Grid 30 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 31 | .container { 32 | position: relative; 33 | width: 100%; 34 | max-width: 960px; 35 | margin: 0 auto; 36 | padding: 0 20px; 37 | box-sizing: border-box; } 38 | .column, 39 | .columns { 40 | width: 100%; 41 | float: left; 42 | box-sizing: border-box; } 43 | 44 | /* For devices larger than 400px */ 45 | @media (min-width: 400px) { 46 | .container { 47 | width: 85%; 48 | padding: 0; } 49 | } 50 | 51 | /* For devices larger than 550px */ 52 | @media (min-width: 550px) { 53 | .container { 54 | width: 80%; } 55 | .column, 56 | .columns { 57 | margin-left: 4%; } 58 | .column:first-child, 59 | .columns:first-child { 60 | margin-left: 0; } 61 | 62 | .one.column, 63 | .one.columns { width: 4.66666666667%; } 64 | .two.columns { width: 13.3333333333%; } 65 | .three.columns { width: 22%; } 66 | .four.columns { width: 30.6666666667%; } 67 | .five.columns { width: 39.3333333333%; } 68 | .six.columns { width: 48%; } 69 | .seven.columns { width: 56.6666666667%; } 70 | .eight.columns { width: 65.3333333333%; } 71 | .nine.columns { width: 74.0%; } 72 | .ten.columns { width: 82.6666666667%; } 73 | .eleven.columns { width: 91.3333333333%; } 74 | .twelve.columns { width: 100%; margin-left: 0; } 75 | 76 | .one-third.column { width: 30.6666666667%; } 77 | .two-thirds.column { width: 65.3333333333%; } 78 | 79 | .one-half.column { width: 48%; } 80 | 81 | /* Offsets */ 82 | .offset-by-one.column, 83 | .offset-by-one.columns { margin-left: 8.66666666667%; } 84 | .offset-by-two.column, 85 | .offset-by-two.columns { margin-left: 17.3333333333%; } 86 | .offset-by-three.column, 87 | .offset-by-three.columns { margin-left: 26%; } 88 | .offset-by-four.column, 89 | .offset-by-four.columns { margin-left: 34.6666666667%; } 90 | .offset-by-five.column, 91 | .offset-by-five.columns { margin-left: 43.3333333333%; } 92 | .offset-by-six.column, 93 | .offset-by-six.columns { margin-left: 52%; } 94 | .offset-by-seven.column, 95 | .offset-by-seven.columns { margin-left: 60.6666666667%; } 96 | .offset-by-eight.column, 97 | .offset-by-eight.columns { margin-left: 69.3333333333%; } 98 | .offset-by-nine.column, 99 | .offset-by-nine.columns { margin-left: 78.0%; } 100 | .offset-by-ten.column, 101 | .offset-by-ten.columns { margin-left: 86.6666666667%; } 102 | .offset-by-eleven.column, 103 | .offset-by-eleven.columns { margin-left: 95.3333333333%; } 104 | 105 | .offset-by-one-third.column, 106 | .offset-by-one-third.columns { margin-left: 34.6666666667%; } 107 | .offset-by-two-thirds.column, 108 | .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } 109 | 110 | .offset-by-one-half.column, 111 | .offset-by-one-half.columns { margin-left: 52%; } 112 | 113 | } 114 | 115 | 116 | /* Base Styles 117 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 118 | /* NOTE 119 | html is set to 62.5% so that all the REM measurements throughout Skeleton 120 | are based on 10px sizing. So basically 1.5rem = 15px :) */ 121 | html { 122 | font-size: 62.5%; } 123 | body { 124 | font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ 125 | line-height: 1.6; 126 | font-weight: 400; 127 | font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; 128 | color: #222; } 129 | 130 | 131 | /* Typography 132 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 133 | h1, h2, h3, h4, h5, h6 { 134 | margin-top: 0; 135 | margin-bottom: 2rem; 136 | font-weight: 300; } 137 | h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} 138 | h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } 139 | h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } 140 | h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } 141 | h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } 142 | h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } 143 | 144 | /* Larger than phablet */ 145 | @media (min-width: 550px) { 146 | h1 { font-size: 5.0rem; } 147 | h2 { font-size: 4.2rem; } 148 | h3 { font-size: 3.6rem; } 149 | h4 { font-size: 3.0rem; } 150 | h5 { font-size: 2.4rem; } 151 | h6 { font-size: 1.5rem; } 152 | } 153 | 154 | p { 155 | margin-top: 0; } 156 | 157 | 158 | /* Links 159 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 160 | a { 161 | color: #1EAEDB; } 162 | a:hover { 163 | color: #0FA0CE; } 164 | 165 | 166 | /* Buttons 167 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 168 | .button, 169 | button, 170 | input[type="submit"], 171 | input[type="reset"], 172 | input[type="button"] { 173 | display: inline-block; 174 | height: 38px; 175 | padding: 0 30px; 176 | color: #555; 177 | text-align: center; 178 | font-size: 11px; 179 | font-weight: 600; 180 | line-height: 38px; 181 | letter-spacing: .1rem; 182 | text-transform: uppercase; 183 | text-decoration: none; 184 | white-space: nowrap; 185 | background-color: transparent; 186 | border-radius: 4px; 187 | border: 1px solid #bbb; 188 | cursor: pointer; 189 | box-sizing: border-box; } 190 | .button:hover, 191 | button:hover, 192 | input[type="submit"]:hover, 193 | input[type="reset"]:hover, 194 | input[type="button"]:hover, 195 | .button:focus, 196 | button:focus, 197 | input[type="submit"]:focus, 198 | input[type="reset"]:focus, 199 | input[type="button"]:focus { 200 | color: #333; 201 | border-color: #888; 202 | outline: 0; } 203 | .button.button-primary, 204 | button.button-primary, 205 | input[type="submit"].button-primary, 206 | input[type="reset"].button-primary, 207 | input[type="button"].button-primary { 208 | color: #FFF; 209 | background-color: #33C3F0; 210 | border-color: #33C3F0; } 211 | .button.button-primary:hover, 212 | button.button-primary:hover, 213 | input[type="submit"].button-primary:hover, 214 | input[type="reset"].button-primary:hover, 215 | input[type="button"].button-primary:hover, 216 | .button.button-primary:focus, 217 | button.button-primary:focus, 218 | input[type="submit"].button-primary:focus, 219 | input[type="reset"].button-primary:focus, 220 | input[type="button"].button-primary:focus { 221 | color: #FFF; 222 | background-color: #1EAEDB; 223 | border-color: #1EAEDB; } 224 | 225 | 226 | /* Forms 227 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 228 | input[type="email"], 229 | input[type="number"], 230 | input[type="search"], 231 | input[type="text"], 232 | input[type="tel"], 233 | input[type="url"], 234 | input[type="password"], 235 | textarea, 236 | select { 237 | height: 38px; 238 | padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ 239 | background-color: #fff; 240 | border: 1px solid #D1D1D1; 241 | border-radius: 4px; 242 | box-shadow: none; 243 | box-sizing: border-box; } 244 | /* Removes awkward default styles on some inputs for iOS */ 245 | input[type="email"], 246 | input[type="number"], 247 | input[type="search"], 248 | input[type="text"], 249 | input[type="tel"], 250 | input[type="url"], 251 | input[type="password"], 252 | textarea { 253 | -webkit-appearance: none; 254 | -moz-appearance: none; 255 | appearance: none; } 256 | textarea { 257 | min-height: 65px; 258 | padding-top: 6px; 259 | padding-bottom: 6px; } 260 | input[type="email"]:focus, 261 | input[type="number"]:focus, 262 | input[type="search"]:focus, 263 | input[type="text"]:focus, 264 | input[type="tel"]:focus, 265 | input[type="url"]:focus, 266 | input[type="password"]:focus, 267 | textarea:focus, 268 | select:focus { 269 | border: 1px solid #33C3F0; 270 | outline: 0; } 271 | label, 272 | legend { 273 | display: block; 274 | margin-bottom: .5rem; 275 | font-weight: 600; } 276 | fieldset { 277 | padding: 0; 278 | border-width: 0; } 279 | input[type="checkbox"], 280 | input[type="radio"] { 281 | display: inline; } 282 | label > .label-body { 283 | display: inline-block; 284 | margin-left: .5rem; 285 | font-weight: normal; } 286 | 287 | 288 | /* Lists 289 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 290 | ul { 291 | list-style: circle inside; } 292 | ol { 293 | list-style: decimal inside; } 294 | ol, ul { 295 | padding-left: 0; 296 | margin-top: 0; } 297 | ul ul, 298 | ul ol, 299 | ol ol, 300 | ol ul { 301 | margin: 1.5rem 0 1.5rem 3rem; 302 | font-size: 90%; } 303 | li { 304 | margin-bottom: 1rem; } 305 | 306 | 307 | /* Code 308 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 309 | code { 310 | padding: .2rem .5rem; 311 | margin: 0 .2rem; 312 | font-size: 90%; 313 | white-space: nowrap; 314 | background: #F1F1F1; 315 | border: 1px solid #E1E1E1; 316 | border-radius: 4px; } 317 | pre > code { 318 | display: block; 319 | padding: 1rem 1.5rem; 320 | white-space: pre; } 321 | 322 | 323 | /* Tables 324 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 325 | th, 326 | td { 327 | padding: 12px 15px; 328 | text-align: left; 329 | border-bottom: 1px solid #E1E1E1; } 330 | th:first-child, 331 | td:first-child { 332 | padding-left: 0; } 333 | th:last-child, 334 | td:last-child { 335 | padding-right: 0; } 336 | 337 | 338 | /* Spacing 339 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 340 | button, 341 | .button { 342 | margin-bottom: 1rem; } 343 | input, 344 | textarea, 345 | select, 346 | fieldset { 347 | margin-bottom: 1.5rem; } 348 | pre, 349 | blockquote, 350 | dl, 351 | figure, 352 | table, 353 | p, 354 | ul, 355 | ol, 356 | form { 357 | margin-bottom: 2.5rem; } 358 | 359 | 360 | /* Utilities 361 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 362 | .u-full-width { 363 | width: 100%; 364 | box-sizing: border-box; } 365 | .u-max-full-width { 366 | max-width: 100%; 367 | box-sizing: border-box; } 368 | .u-pull-right { 369 | float: right; } 370 | .u-pull-left { 371 | float: left; } 372 | 373 | 374 | /* Misc 375 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 376 | hr { 377 | margin-top: 3rem; 378 | margin-bottom: 3.5rem; 379 | border-width: 0; 380 | border-top: 1px solid #E1E1E1; } 381 | 382 | 383 | /* Clearing 384 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 385 | 386 | /* Self Clearing Goodness */ 387 | .container:after, 388 | .row:after, 389 | .u-cf { 390 | content: ""; 391 | display: table; 392 | clear: both; } 393 | 394 | 395 | /* Media Queries 396 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 397 | /* 398 | Note: The best way to structure the use of media queries is to create the queries 399 | near the relevant code. For example, if you wanted to change the styles for buttons 400 | on small devices, paste the mobile query code up in the buttons section and style it 401 | there. 402 | */ 403 | 404 | 405 | /* Larger than mobile */ 406 | @media (min-width: 400px) {} 407 | 408 | /* Larger than phablet (also point when grid becomes active) */ 409 | @media (min-width: 550px) {} 410 | 411 | /* Larger than tablet */ 412 | @media (min-width: 750px) {} 413 | 414 | /* Larger than desktop */ 415 | @media (min-width: 1000px) {} 416 | 417 | /* Larger than Desktop HD */ 418 | @media (min-width: 1200px) {} 419 | -------------------------------------------------------------------------------- /converter/js/converter.js: -------------------------------------------------------------------------------- 1 | var specialChars = [['☺','1'],['☻','2'],['♥','3'],['♦','4'],['♣','5'],['♠','6'],['•','7'],['◘','8'],['○','9'],['◙','10'],['♂','11'],['♀','12'],['♪','13'],['♫','14'],['☼','15'],['►','16'],['◄','17'],['↕','18'],['‼','19'],['¶','20'],['§','21'],['▬','22'],['↨','23'],['↑','24'],['↓','25'],['→','26'],['←','27'],['∟','28'],['↔','29'],['▲','30'],['▼','31'],['~','126'],['⌂','127'],['Ç','128'],['ü','129'],['é','130'],['â','131'],['ä','132'],['à','133'],['å','134'],['ç','135'],['ê','136'],['ë','137'],['è','138'],['ï','139'],['î','140'],['ì','141'],['Ä','142'],['Å','143'],['É','144'],['æ','145'],['Æ','146'],['ô','147'],['ö','148'],['ò','149'],['û','150'],['ù','151'],['ÿ','152'],['Ö','153'],['Ü','154'],['ø','155'],['£','156'],['Ø','157'],['×','158'],['ƒ','159'],['á','160'],['í','161'],['ó','162'],['ú','163'],['ñ','164'],['Ñ','165'],['ª','166'],['º','167'],['¿','168'],['®','169'],['¬','170'],['½','171'],['¼','172'],['¡','173'],['«','174'],['»','175'],['░','176'],['▒','177'],['▓','178'],['│','179'],['┤','180'],['Á','181'],['Â','182'],['À','183'],['©','184'],['╣','185'],['║','186'],['╗','187'],['╝','188'],['¢','189'],['¥','190'],['┐','191'],['└','192'],['┴','193'],['┬','194'],['├','195'],['─','196'],['┼','197'],['ã','198'],['Ã','199'],['╚','200'],['╔','201'],['╩','202'],['╦','203'],['╠','204'],['═','205'],['╬','206'],['¤','207'],['ð','208'],['Ð','209'],['Ê','210'],['Ë','211'],['È','212'],['ı','213'],['Í','214'],['Î','215'],['Ï','216'],['┘','217'],['┌','218'],['█','219'],['▄','220'],['¦','221'],['Ì','222'],['▀','223'],['Ó','224'],['ß','225'],['Ô','226'],['Ò','227'],['õ','228'],['Õ','229'],['µ','230'],['þ','231'],['Þ','232'],['Ú','233'],['Û','234'],['Ù','235'],['ý','236'],['Ý','237'],['¯','238'],['´','239'],['­','240'],['±','241'],['‗','242'],['¾','243'],['¶','244'],['§','245'],['÷','246'],['¸','247'],['°','248'],['¨','249'],['·','250'],['¹','251'],['³','252'],['²','253'],['■','254'],[' ','255'],['€','0128'],['','0129'],['‚','0130'],['ƒ','0131'],['„','0132'],['…','0133'],['†','0134'],['‡','0135'],['ˆ','0136'],['‰','0137'],['Š','0138'],['‹','0139'],['Œ','0140'],['','0141'],['Ž','0142'],['','0143'],['','0144'],['‘','0145'],['’','0146'],['“','0147'],['”','0148'],['•','0149'],['–','0150'],['—','0151'],['˜','0152'],['™','0153'],['š','0154'],['›','0155'],['œ','0156'],['','0157'],['ž','0158'],['Ÿ','0159'],[' ','0160'],['¡','0161'],['¢','0162'],['£','0163'],['¤','0164'],['¥','0165'],['¦','0166'],['§','0167'],['¨','0168'],['©','0169'],['ª','0170'],['«','0171'],['¬','0172'],['­','0173'],['®','0174'],['¯','0175'],['°','0176'],['±','0177'],['²','0178'],['³','0179'],['´','0180'],['µ','0181'],['¶','0182'],['·','0183'],['¸','0184'],['¹','0185'],['º','0186'],['»','0187'],['¼','0188'],['½','0189'],['¾','0190'],['¿','0191'],['À','0192'],['Á','0193'],['Â','0194'],['Ã','0195'],['Ä','0196'],['Å','0197'],['Æ','0198'],['Ç','0199'],['È','0200'],['É','0201'],['Ê','0202'],['Ë','0203'],['Ì','0204'],['Í','0205'],['Î','0206'],['Ï','0207'],['Ð','0208'],['Ñ','0209'],['Ò','0210'],['Ó','0211'],['Ô','0212'],['Õ','0213'],['Ö','0214'],['×','0215'],['Ø','0216'],['Ù','0217'],['Ú','0218'],['Û','0219'],['Ü','0220'],['Ý','0221'],['Þ','0222'],['ß','0223'],['à','0224'],['á','0225'],['â','0226'],['ã','0227'],['ä','0228'],['å','0229'],['æ','0230'],['ç','0231'],['è','0232'],['é','0233'],['ê','0234'],['ë','0235'],['ì','0236'],['í','0237'],['î','0238'],['ï','0239'],['ð','0240'],['ñ','0241'],['ò','0242'],['ó','0243'],['ô','0244'],['õ','0245'],['ö','0246'],['÷','0247'],['ø','0248'],['ù','0249'],['ú','0250'],['û','0251'],['ü','0252'],['ý','0253'],['þ','0254'],['ÿ','0255']]; 2 | var commands = ["WINDOWS","DEFAULTDELAY","DEFAULT_DELAY","DEFAULTCHARDELAY","DELAY","STRING","REPEAT","ENTER","GUI","SHIFT","ALT","ALTLEFT","ALTRIGHT","ALT_LEFT","ALT_RIGHT","CTRL","CAPSLOCK","DELETE","END","ESC","HOME","INSERT","PAGEUP","PAGEDOWN","SPACE","TAB","BACKSPACE","UP","DOWN","LEFT","RIGHT","UPARROW","DOWNARROW","LEFTARROW","RIGHTARROW","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","NUM_0","NUM_1","NUM_2","NUM_3","NUM_4","NUM_5","NUM_6","NUM_7","NUM_8","NUM_9","NUM_ASTERIX","NUM_ENTER","NUM_Minus","NUM_PERIOD","NUM_PLUS","NUM_SLASH"]; 3 | var langCopyrightNotice = "\n/*[Language Files are provided by LocaleKeyboard.js (Licensed under MIT) - for more information visit: https://github.com/Nurrl/LocaleKeyboard.js]*/\n"; 4 | var settingsOn = false; 5 | var useLite = true; 6 | var duckyScript = ""; 7 | var arduinoCode = ""; 8 | var duckuino = new Duckuino(); 9 | var compilerMsg = ""; 10 | var maxlen = 256 - 7; 11 | var converter; 12 | 13 | var lang; 14 | var name; 15 | var url = "/converter/src"; 16 | 17 | var keyboardCPPbegin = ""; 18 | var keyboardCPPend = ""; 19 | var keyboardCPP = ""; 20 | var keyboardH = ""; 21 | var langFile = ""; 22 | var eliteFirmware = ""; 23 | 24 | var loaded = 0; 25 | 26 | function openSettings(){ 27 | if(!settingsOn) $('#settings').show('normal'); 28 | else $('#settings').hide('normal'); 29 | settingsOn = !settingsOn; 30 | } 31 | 32 | function changeModel(mode){ 33 | useLite = mode; 34 | if(useLite === true){ 35 | $('#lite').addClass('selected'); 36 | $('#elite').removeClass('selected'); 37 | $('#output').val(arduinoCode); 38 | history.replaceState(null, "Lite", "index.html"); 39 | }else { 40 | $('#lite').removeClass('selected'); 41 | $('#elite').addClass('selected'); 42 | $('#output').val(duckyScript); 43 | history.replaceState(null, "Elite", "index.html?m=elite"); 44 | } 45 | } 46 | 47 | function log(msg){ 48 | $("#compilerMsg").html(msg); 49 | } 50 | 51 | function _error(msg){ 52 | $("#compilerMsg").html(""+msg+""); 53 | } 54 | 55 | function convertToStrings(){ 56 | var str = $('#input').val(); 57 | str = str.replace(/\r/gm,"\n"); 58 | str = str.replace(/\n\n/gm,"\n"); 59 | 60 | str = str.replace(/^(?!(STRING |ENTER))/gm,"STRING "); 61 | str = str.replace(/\n/g,"\nENTER\n"); 62 | 63 | var lines = str.split('\n'); 64 | for(var i=0;imaxlen){ 67 | var runs = parseInt(line.length/maxlen); 68 | if(line.length%maxlen > 0) runs++; 69 | var newline = ""; 70 | for(var j=0;j=0 && lines[i+1].indexOf("REPEAT")>=0) lines[i+1] = ""; 146 | while(lines[h] == lines[h+1] && h 0){ 151 | lines[i+1] = "REPEAT "+count; 152 | var linesLen = lines.length; 153 | var _linesEnd = lines.splice(i+count+1,linesLen); 154 | var _linesBegin = lines.splice(0,i+2); 155 | lines = _linesBegin.concat(_linesEnd); 156 | } 157 | } 158 | 159 | str = ""; 160 | for(var i=0;i 0) name = $("#scriptName").val().trim(); 216 | else name = "example"; 217 | if(loaded == 5) createDownload(); 218 | else{ 219 | $.ajax({url: url+"/Keyboard_begin.cpp", success: function(result){ 220 | keyboardCPPbegin = result; 221 | loaded++; 222 | 223 | $.ajax({url: url+"/Keyboard_end.cpp", success: function(result){ 224 | keyboardCPPend = result; 225 | loaded++; 226 | 227 | $.ajax({url: url+"/locales/"+lang+".lang", success: function(result){ 228 | langFile = result; 229 | if(lang == "es_ES") keyboardCPP = "#define ADD_ALTGR\r\n"; 230 | if(lang == "de_DE") keyboardCPP = "#define ADD_ALTGR\r\n"; 231 | if(lang == "it_IT") keyboardCPP = "#define ADD_ALTGR\r\n"; 232 | if(lang == "sv_SE") keyboardCPP = "#define ADD_ALTGR\r\n"; 233 | if(lang == "fi_FI") keyboardCPP = "#define ADD_ALTGR\r\n"; 234 | if(lang == "tr_TR") keyboardCPP = "#define ADD_ALTGR\r\n"; 235 | if(lang == "cs_CZ_QWERTY") keyboardCPP = "#define ADD_ALTGR\r\n"; 236 | if(lang == "cs_CZ_QWERTZ") keyboardCPP = "#define ADD_ALTGR\r\n"; 237 | keyboardCPP += keyboardCPPbegin + langCopyrightNotice + langFile + keyboardCPPend; 238 | loaded++; 239 | 240 | $.ajax({url: url+"/Keyboard.h", success: function(result){ 241 | keyboardH = result; 242 | loaded++; 243 | 244 | $.ajax({url: url+"/elite.ino", success: function(result){ 245 | eliteFirmware = result; 246 | loaded++; 247 | 248 | createDownload(); 249 | 250 | 251 | },error: function(xhr,status,error){ 252 | _error("error loading '"+this.url+"' ( "+status+" "+error+")"); 253 | }}); 254 | 255 | 256 | },error: function(xhr,status,error){ 257 | _error("error loading '"+this.url+"' ( "+status+" "+error+")"); 258 | }}); 259 | 260 | },error: function(xhr,status,error){ 261 | _error("error loading '"+this.url+"' ( "+status+" "+error+")"); 262 | }}); 263 | 264 | },error: function(xhr,status,error){ 265 | _error("error loading '"+this.url+"' ("+status+" "+error+")"); 266 | }}); 267 | 268 | },error: function(xhr,status,error){ 269 | _error("error loading '"+this.url+"' ( "+status+" "+error+")"); 270 | }}); 271 | } 272 | } 273 | } 274 | 275 | function createDownload(){ 276 | if(!$("#compilerMsg").val().includes("error")&&!$("#compilerMsg").val().includes("Error")){ 277 | var zip = new JSZip(); 278 | var eliteFolder = zip.folder("elite"); 279 | var liteFolder = zip.folder("lite"); 280 | eliteFolder.file("elite.ino", eliteFirmware); 281 | eliteFolder.file(name+".txt", duckyScript); 282 | eliteFolder.file("Keyboard.h", keyboardH); 283 | eliteFolder.file("Keyboard.cpp", keyboardCPP); 284 | liteFolder.file("lite.ino", arduinoCode); 285 | liteFolder.file("Keyboard.h", keyboardH); 286 | liteFolder.file("Keyboard.cpp", keyboardCPP); 287 | zip.generateAsync({type:"blob"}).then(function(content) { 288 | saveAs(content, name+".zip"); 289 | }); 290 | } 291 | } 292 | -------------------------------------------------------------------------------- /converter/js/duckuino.js: -------------------------------------------------------------------------------- 1 | /* 2 | MIT License 3 | 4 | Copyright (c) 2016 Thecakeisgit 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | */ 24 | 25 | var commandMap = { 26 | ESCAPE:'KEY_ESC', 27 | MENU:'229', 28 | ESC:'KEY_LEFT_ESC', 29 | END:'KEY_END', 30 | SPACE:'\' \'', 31 | TAB:'KEY_TAB', 32 | PRINTSCREEN:'206', 33 | ENTER:'KEY_RETURN', 34 | UPARROW:'KEY_UP_ARROW', 35 | DOWNARROW:'KEY_DOWN_ARROW', 36 | LEFTARROW:'KEY_LEFT_ARROW', 37 | RIGHTARROW:'KEY_RIGHT_ARROW', 38 | UP:'KEY_UP_ARROW', 39 | DOWN:'KEY_DOWN_ARROW', 40 | LEFT:'KEY_LEFT_ARROW', 41 | RIGHT:'KEY_RIGHT_ARROW', 42 | PAGEUP:'KEY_PAGE_UP', 43 | PAGEDOWN:'KEY_PAGE_DOWN', 44 | CAPSLOCK:'KEY_CAPS_LOCK', 45 | DELETE:'KEY_DELETE', 46 | DEL:'KEY_DELETE', 47 | BACKSPACE:'KEY_BACKSPACE', 48 | F1:'KEY_F1', 49 | F2:'KEY_F2', 50 | F3:'KEY_F3', 51 | F4:'KEY_F4', 52 | F5:'KEY_F5', 53 | F6:'KEY_F6', 54 | F7:'KEY_F7', 55 | F8:'KEY_F8', 56 | F9:'KEY_F9', 57 | F10:'KEY_F10', 58 | F11:'KEY_F11', 59 | F12:'KEY_F12' 60 | }; 61 | 62 | var numpadMap = { 63 | NUM_0:'234', 64 | NUM_1:'225', 65 | NUM_2:'226', 66 | NUM_3:'227', 67 | NUM_4:'228', 68 | NUM_5:'229', 69 | NUM_6:'230', 70 | NUM_7:'231', 71 | NUM_8:'232', 72 | NUM_9:'233', 73 | NUM_ASTERIX:'221', 74 | NUM_ENTER:'224', 75 | NUM_MINUS:'222', 76 | NUM_PERIOD:'235', 77 | NUM_PLUS:'223', 78 | NUM_SLASH:'220' 79 | } 80 | 81 | var comboMap = { 82 | ALT:'KEY_LEFT_ALT', 83 | ALTLEFT:'KEY_LEFT_ALT', 84 | ALT_LEFT:'KEY_LEFT_ALT', 85 | ALTRIGHT:'KEY_RIGHT_ALT', 86 | ALT_RIGHT:'KEY_RIGHT_ALT', 87 | GUI:'KEY_LEFT_GUI', 88 | WINDOWS:'KEY_LEFT_GUI', 89 | COMMAND:'KEY_LEFT_GUI', 90 | CTRL:'KEY_LEFT_CTRL', 91 | CONTROL:'KEY_LEFT_CTRL', 92 | SHIFT:'KEY_LEFT_SHIFT' 93 | }; 94 | 95 | var mouseMap = { 96 | CLICK:'click()', 97 | CLICK_LEFT:'click()', 98 | CLICK_RIGHT:'click(MOUSE_RIGHT)', 99 | CLICK_MIDDLE:'click(MOUSE_MIDDLE)', 100 | PRESS:'press()', 101 | PRESS_LEFT:'press()', 102 | PRESS_RIGHT:'press(MOUSE_RIGHT)', 103 | PRESS_MIDDLE:'press(MOUSE_MIDDLE)', 104 | RELEASE:'release()', 105 | RELEASE_LEFT:'release()', 106 | RELEASE_RIGHT:'release(MOUSE_RIGHT)', 107 | RELEASE_MIDDLE:'release(MOUSE_MIDDLE)' 108 | } 109 | 110 | var keyMap = { 111 | a:'97', 112 | b:'98', 113 | c:'99', 114 | d:'100', 115 | e:'101', 116 | f:'102', 117 | g:'103', 118 | h:'104', 119 | i:'105', 120 | j:'106', 121 | k:'107', 122 | l:'108', 123 | m:'109', 124 | n:'110', 125 | o:'111', 126 | p:'112', 127 | q:'113', 128 | r:'114', 129 | s:'115', 130 | t:'116', 131 | u:'117', 132 | v:'118', 133 | w:'119', 134 | x:'120', 135 | y:'121', 136 | z:'122' 137 | }; 138 | 139 | class Duckuino { 140 | constructor() { 141 | this.keyMap = keyMap; 142 | this.commandMap = commandMap; 143 | this.comboMap = comboMap; 144 | this.mouseMap = mouseMap; 145 | } 146 | 147 | compile(inputCode){ 148 | // Check if there is any code input at all 149 | if (inputCode == '' || inputCode == undefined) 150 | { 151 | _error('Error: No ducky script was entered!'); 152 | return 'Error, look at the output below...'; 153 | } 154 | 155 | var parsedDucky = this.parser(inputCode); 156 | if (parsedDucky == '' || parsedDucky == undefined) 157 | { 158 | return 'Error, look at the output below...'; 159 | } 160 | 161 | // Build the Arduino code skeleton 162 | return '/*\nCopyright (c) 2017 Seytonic, Spacehuhn (Licensed under MIT)\n' 163 | + 'For more information see: github.com/seytonic/malduino\n' 164 | + '*/\n' 165 | + '\n' 166 | + '#include "Keyboard.h"\n' 167 | + '#include "Mouse.h"\n' 168 | + '\n' 169 | + '#define blinkInterval 50\n' 170 | + '#define ledPin 3\n' 171 | + '#define buttonPin 6\n' 172 | + '\n' 173 | + 'int defaultDelay = 4;\n' 174 | + 'int defaultCharDelay = 5;\n' 175 | + 'int rMin = 0;\n' 176 | + 'int rMax = 100;\n' 177 | + '\n' 178 | + 'bool ledOn = true;\n' 179 | + '\n' 180 | + 'void typeKey(int key){\n' 181 | + ' Keyboard.press(key);\n' 182 | + ' delay(defaultCharDelay);\n' 183 | + ' Keyboard.release(key);\n' 184 | + '}\n' 185 | + '\n' 186 | + 'void setup(){\n' 187 | + ' \n' 188 | + ' pinMode(buttonPin, INPUT_PULLUP);\n' 189 | + ' pinMode(ledPin, OUTPUT);\n' 190 | + ' digitalWrite(ledPin, HIGH);\n' 191 | + ' \n' 192 | + ' if(digitalRead(buttonPin) == LOW){\n' 193 | + ' \n' 194 | + ' Keyboard.begin();\n' 195 | + ' Mouse.begin();\n' 196 | + ' \n' 197 | + ' /* ----- Begin-Script -----*/\n' 198 | + ' \n' 199 | + ' /* [Parsed By Duckuino (Licensed under MIT) - for more information visit: https://github.com/Nurrl/Dckuino.js] */' 200 | + ' \n' 201 | + parsedDucky 202 | + ' \n' 203 | + ' /* ----- End-Script -----*/\n' 204 | + ' \n' 205 | + ' Keyboard.end();\n' 206 | + ' }\n' 207 | + '}\n' 208 | + '\n' 209 | + 'void loop(){\n' 210 | + ' ledOn = !ledOn;\n' 211 | + ' digitalWrite(ledPin, ledOn);\n' 212 | + ' delay(blinkInterval);\n' 213 | + '}'; 214 | } 215 | 216 | // The parsing function 217 | parser(toParse){ 218 | // Init chronometer 219 | var timerStart = Date.now(); 220 | 221 | var parsedScript = ''; 222 | 223 | // Trim whitespaces 224 | toParse = toParse.replace(/^ +| +$/gm, ""); 225 | 226 | // Cuting the input in lines 227 | var lineArray = toParse.split('\n'); 228 | 229 | // Loop every line 230 | for (var i = 0; i < lineArray.length; i++) 231 | { 232 | // Line empty, skip 233 | if (lineArray[i] === '' || lineArray[i] === '\n') 234 | { 235 | log('Info: Skipped line ' + (i + 1) + ', because was empty.'); 236 | continue; 237 | } 238 | 239 | // Var who indicates to release all at the line end 240 | var releaseAll = false; 241 | 242 | // Outputs, for REPLAY/REPEAT COMMANDS 243 | if (parsedOut !== undefined && parsedOut !== '') 244 | { 245 | var lastLines = parsedOut; 246 | var lastCount = ((lastLines.split('\n')).length + 1); 247 | } 248 | var parsedOut = ''; 249 | 250 | // Command known 251 | var commandKnown = false; 252 | 253 | // Cutting every line in words 254 | var wordArray = lineArray[i].split(' '); 255 | var wordOne = wordArray[0]; 256 | 257 | // Handle commands 258 | switch(wordOne){ 259 | case "STRING": 260 | wordArray.shift(); 261 | 262 | var textString = wordArray.join(' '); 263 | 264 | // Replace all '"' by '\"' and all '\' by '\\' 265 | textString = textString.split('\\').join('\\\\').split('"').join('\\"'); 266 | if (textString !== '') 267 | { 268 | parsedOut += ' Keyboard.print("' + textString + '");\n'; 269 | commandKnown = true; 270 | } else { 271 | _error('Error: at line: ' + (i + 1) + ', STRING needs a text'); 272 | return; 273 | } 274 | break; 275 | case "DELAY": 276 | wordArray.shift(); 277 | 278 | if(wordArray[0] === undefined || wordArray[0] === '') { 279 | _error('Error: at line: ' + (i + 1) + ', DELAY needs a time'); 280 | return; 281 | } 282 | 283 | if (! isNaN(wordArray[0])) 284 | { 285 | parsedOut += ' delay(' + wordArray[0] + ');\n'; 286 | commandKnown = true; 287 | } else { 288 | _error('Error: at line: ' + (i + 1) + ', DELAY only acceptes numbers'); 289 | return; 290 | } 291 | break; 292 | case "DEFAULTDELAY": 293 | case "DEFAULT_DELAY": 294 | wordArray.shift(); 295 | 296 | if(wordArray[0] === undefined || wordArray[0] === '') { 297 | _error('Error: at line: ' + (i + 1) + ', DEFAULTDELAY needs a time'); 298 | return; 299 | } 300 | 301 | if (! isNaN(wordArray[0])) 302 | { 303 | parsedOut += ' defaultDelay = ' + wordArray[0] + ';\n'; 304 | commandKnown = true; 305 | } else { 306 | _error('Error: at line: ' + (i + 1) + ', DEFAULTDELAY only acceptes numbers'); 307 | return; 308 | } 309 | break; 310 | case "DEFAULTCHARDELAY": 311 | case "DEFAULT_CHAR_DELAY": 312 | wordArray.shift(); 313 | 314 | if(wordArray[0] === undefined || wordArray[0] === '') { 315 | _error('Error: at line: ' + (i + 1) + ', DEFAULTCHARDELAY needs a time'); 316 | return; 317 | } 318 | 319 | if (! isNaN(wordArray[0])) 320 | { 321 | parsedOut += ' defaultCharDelay = ' + wordArray[0] + ';\n'; 322 | commandKnown = true; 323 | } else { 324 | _error('Error: at line: ' + (i + 1) + ', DEFAULTCHARDELAY only acceptes numbers'); 325 | return; 326 | } 327 | break; 328 | 329 | case "REM": 330 | wordArray.shift(); 331 | 332 | // Placing the comment to arduino code 333 | if (wordArray[0] !== undefined && wordArray[0] !== '') 334 | { 335 | commandKnown = true; 336 | parsedOut += ' // ' + wordArray.join(' ') + '\n'; 337 | } else { 338 | _error('Error: at line: ' + (i + 1) + ', REM needs a comment'); 339 | return; 340 | } 341 | break; 342 | 343 | case "MOUSE": 344 | wordArray.shift(); 345 | if (wordArray[0] != undefined && wordArray[0] != ' ' && wordArray[1] != undefined && wordArray[1] != ' '){ 346 | commandKnown = true; 347 | parsedOut += ' Mouse.move('+wordArray[0]+', '+wordArray[1] + ');\n'; 348 | wordArray.shift(); 349 | } else { 350 | _error('Error: at line: ' + (i + 1) + ', MOUSE requires at least two parameters') 351 | return; 352 | } 353 | break; 354 | 355 | case "SCROLL": 356 | wordArray.shift(); 357 | if (wordArray[0] != undefined && wordArray[0] != ''){ 358 | commandKnown = true; 359 | parsedOut += ' Mouse.move(0,0,'+wordArray[0]+');\n' 360 | wordArray.shift(); 361 | } else { 362 | _error('Error: at line: ' + (i + 1) + ', SCROLL requires a parameter') 363 | return; 364 | } 365 | break; 366 | 367 | case "RANDOMMIN": 368 | wordArray.shift(); 369 | if (wordArray[0] != undefined && wordArray[0] != ''){ 370 | commandKnown = true; 371 | parsedOut += ' RANDOMMIN = '+wordArray[0]+';\n' 372 | wordArray.shift(); 373 | } else { 374 | _error('Error: at line: ' + (i + 1) + ', RANDOMMIN requires a parameter') 375 | return; 376 | } 377 | break; 378 | 379 | case "RANDOMMAX": 380 | wordArray.shift(); 381 | if (wordArray[0] != undefined && wordArray[0] != ''){ 382 | commandKnown = true; 383 | parsedOut += ' RANDOMMAX = '+wordArray[0]+';\n' 384 | wordArray.shift(); 385 | } else { 386 | _error('Error: at line: ' + (i + 1) + ', RANDOMMAX requires a parameter') 387 | return; 388 | } 389 | break; 390 | 391 | case "REPEAT": 392 | case "REPLAY": 393 | wordArray.shift(); 394 | 395 | if (wordArray[0] === undefined || wordArray[0] === '') { 396 | _error('Error: at line: ' + (i + 1) + ', REPEAT/REPLAY needs a loop count'); 397 | return; 398 | } 399 | 400 | if (lastLines === undefined) 401 | { 402 | _error('Error: at line: ' + (i + 1) + ', nothing to repeat, this is the first line.'); 403 | return; 404 | } 405 | 406 | if (! isNaN(wordArray[0])) 407 | { 408 | // Remove the lines we just created 409 | var linesTmp = parsedScript.split('\n'); 410 | linesTmp.splice(-lastCount, lastCount); 411 | 412 | if (linesTmp.join('\n') === '') 413 | parsedScript = linesTmp.join('\n'); 414 | else { 415 | parsedScript = linesTmp.join('\n') + '\n'; 416 | } 417 | 418 | // Add two spaces at Begining 419 | lastLines = lastLines.replace(/^ /gm,' '); 420 | 421 | // Replace them 422 | parsedOut += ' for(int i = 0; i < ' + wordArray[0] + '; i++) {\n'; 423 | parsedOut += lastLines; 424 | parsedOut += ' }\n'; 425 | 426 | commandKnown = true; 427 | } else { 428 | _error('Error: at line: ' + (i + 1) + ', REPEAT/REPLAY only acceptes numbers'); 429 | return; 430 | } 431 | break; 432 | default: 433 | if (wordArray.length == 1) 434 | { 435 | if (comboMap[wordArray[0]] !== undefined) 436 | { 437 | commandKnown = true; 438 | 439 | parsedOut += ' typeKey(' + comboMap[wordArray[0]] + ');\n'; 440 | }else if (commandMap[wordArray[0]] !== undefined) { 441 | commandKnown = true; 442 | 443 | parsedOut += ' typeKey(' + commandMap[wordArray[0]] + ');\n'; 444 | }else if (numpadMap[wordArray[0]] !== undefined){ 445 | commandKnown = true; 446 | releaseAll = true; 447 | 448 | parsedOut += ' typeKey(' + numpadMap[wordArray[0]] + ');\n'; 449 | }else if (mouseMap[wordArray[0]] !== undefined){ 450 | commandKnown = true; 451 | parsedOut += ' Mouse.' + mouseMap[wordArray[0]] + ';\n'; 452 | }else { 453 | commandKnown = false; 454 | break; 455 | } 456 | wordArray.shift(); 457 | } 458 | while (wordArray.length){ 459 | if (comboMap[wordArray[0]] !== undefined) 460 | { 461 | commandKnown = true; 462 | releaseAll = true; 463 | 464 | parsedOut += ' Keyboard.press(' + comboMap[wordArray[0]] + ');\n'; 465 | }else if (commandMap[wordArray[0]] !== undefined) { 466 | commandKnown = true; 467 | releaseAll = true; 468 | 469 | parsedOut += ' Keyboard.press(' + commandMap[wordArray[0]] + ');\n'; 470 | }else if (keyMap[wordArray[0]] !== undefined) { 471 | commandKnown = true; 472 | releaseAll = true; 473 | 474 | parsedOut += ' Keyboard.press(' + keyMap[wordArray[0]] + ');\n'; 475 | }else if (numpadMap[wordArray[0]] !== undefined){ 476 | commandKnown = true; 477 | releaseAll = true; 478 | 479 | parsedOut += ' typeKey(' + numpadMap[wordArray[0]] + ');\n'; 480 | }else if (mouseMap[wordArray[0]] !== undefined){ 481 | commandKnown = true; 482 | parsedOut += ' Mouse.' + mouseMap[wordArray[0]] + ';\n'; 483 | }else { 484 | commandKnown = false; 485 | break; 486 | } 487 | wordArray.shift(); 488 | } 489 | } 490 | 491 | if (!commandKnown) 492 | { 493 | _error('Error: Unknown command or key \'' + wordArray[0] + '\' at line: ' + (i + 1) + '.'); 494 | return; 495 | } 496 | 497 | // If we need to release keys, we do 498 | if (releaseAll) 499 | parsedOut += ' Keyboard.releaseAll();\n'; 500 | 501 | parsedScript += parsedOut; // Add what we parsed 502 | if (i != (lineArray.length - 1)) 503 | parsedScript += '\n delay(defaultDelay);\n'; // Add new line if not the last line 504 | } 505 | 506 | var timerEnd = Date.now(); 507 | var timePassed = new Date(timerEnd - timerStart); 508 | 509 | log('Successfuly parsed ' + (lineArray.length) + ' lines in ' + timePassed.getMilliseconds() + 'ms'); 510 | parsedScript = parsedScript.replace('RANDOM','random(rMin,rMax)'); 511 | return parsedScript; 512 | } 513 | } 514 | --------------------------------------------------------------------------------