├── 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 |
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 |
41 |
42 |
43 |
44 | extras
45 | convert
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | Convert Special Chars to ALT-Codes
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | Optimize Repeating Commands
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 | Add DELAY 1000 at the Beginning
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | Command Autocorrection
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 | Delete Comments
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
Input to STRING Commands
100 |
101 |
102 | convert into string
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
Press Convert
119 |
120 |
121 |
122 |
123 |
124 | Keyboard Layout:
125 |
126 | be_BE
127 | cz_CZ
128 | da_DK
129 | de_DE
130 | en_US
131 | en_UK
132 | es_ES
133 | fi_FI
134 | fr_FR
135 | it_IT
136 | pt_PT
137 | tr_TR
138 | cs_CZ_QWERTY
139 | cs_CZ_QWERTZ
140 | pt_BR
141 | pt_PT
142 | sv_SE
143 |
144 |
145 |
146 |
147 | Name:
148 |
149 | .zip
150 |
151 |
152 |
153 |
154 |
155 |
156 | Download
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 |
--------------------------------------------------------------------------------