ollie-controller
Version:
A tool to control Ollie from your computer
468 lines (447 loc) • 9.53 kB
JavaScript
var registerCommonKeys = require('./registerCommonKeys');
var morseGUIUpdateAction = require('./gui/morseGUIUpdateAction');
var events = require('events');
var waitTime = 100;
var keyboardMapDiff = [
"", // [0]
"", // [1]
"", // [2]
"CANCEL", // [3]
"", // [4]
"", // [5]
"HELP", // [6]
"", // [7]
"BACK_SPACE", // [8]
"tab", // [9]
"", // [10]
"", // [11]
"CLEAR", // [12]
"ENTER", // [13]
"ENTER_SPECIAL", // [14]
"", // [15]
"shift", // [16]
"CONTROL", // [17]
"ALT", // [18]
"PAUSE", // [19]
"CAPS_LOCK", // [20]
"KANA", // [21]
"EISU", // [22]
"JUNJA", // [23]
"FINAL", // [24]
"HANJA", // [25]
"", // [26]
"ESCAPE", // [27]
"CONVERT", // [28]
"NONCONVERT", // [29]
"ACCEPT", // [30]
"MODECHANGE", // [31]
" ", // [32]
"PAGE_UP", // [33]
"PAGE_DOWN", // [34]
"END", // [35]
"HOME", // [36]
"LEFT", // [37]
"UP", // [38]
"RIGHT", // [39]
"DOWN", // [40]
"SELECT", // [41]
"PRINT", // [42]
"EXECUTE", // [43]
"PRINTSCREEN", // [44]
"INSERT", // [45]
"DELETE", // [46]
"", // [47]
"0", // [48]
"1", // [49]
"2", // [50]
"3", // [51]
"4", // [52]
"5", // [53]
"6", // [54]
"7", // [55]
"8", // [56]
"9", // [57]
":", // [58]
";", // [59]
"LESS_THAN", // [60]
"EQUALS", // [61]
"GREATER_THAN", // [62]
"?", // [63]
"@", // [64]
"A", // [65]
"B", // [66]
"C", // [67]
"D", // [68]
"E", // [69]
"F", // [70]
"G", // [71]
"H", // [72]
"I", // [73]
"J", // [74]
"K", // [75]
"L", // [76]
"M", // [77]
"N", // [78]
"O", // [79]
"P", // [80]
"Q", // [81]
"R", // [82]
"S", // [83]
"T", // [84]
"U", // [85]
"V", // [86]
"W", // [87]
"X", // [88]
"Y", // [89]
"Z", // [90]
"OS_KEY", // [91] Super Key
"", // [92]
"CONTEXT_MENU", // [93]
"", // [94]
"SLEEP", // [95]
"NUMPAD0", // [96]
"NUMPAD1", // [97]
"NUMPAD2", // [98]
"NUMPAD3", // [99]
"NUMPAD4", // [100]
"NUMPAD5", // [101]
"NUMPAD6", // [102]
"NUMPAD7", // [103]
"NUMPAD8", // [104]
"NUMPAD9", // [105]
"MULTIPLY", // [106]
"ADD", // [107]
"SEPARATOR", // [108]
"SUBTRACT", // [109]
"DECIMAL", // [110]
"DIVIDE", // [111]
"F1", // [112]
"F2", // [113]
"F3", // [114]
"F4", // [115]
"F5", // [116]
"F6", // [117]
"F7", // [118]
"F8", // [119]
"F9", // [120]
"F10", // [121]
"F11", // [122]
"F12", // [123]
"F13", // [124]
"F14", // [125]
"F15", // [126]
"F16", // [127]
"F17", // [128]
"F18", // [129]
"F19", // [130]
"F20", // [131]
"F21", // [132]
"F22", // [133]
"F23", // [134]
"F24", // [135]
"", // [136]
"", // [137]
"", // [138]
"", // [139]
"", // [140]
"", // [141]
"", // [142]
"", // [143]
"NUM_LOCK", // [144]
"SCROLL_LOCK", // [145]
"WIN_OEM_FJ_JISHO", // [146]
"WIN_OEM_FJ_MASSHOU", // [147]
"WIN_OEM_FJ_TOUROKU", // [148]
"WIN_OEM_FJ_LOYA", // [149]
"WIN_OEM_FJ_ROYA", // [150]
"", // [151]
"", // [152]
"", // [153]
"", // [154]
"", // [155]
"", // [156]
"", // [157]
"", // [158]
"", // [159]
"CIRCUMFLEX", // [160]
"EXCLAMATION", // [161]
"DOUBLE_QUOTE", // [162]
"HASH", // [163]
"DOLLAR", // [164]
"PERCENT", // [165]
"'", // [166]
"UNDERSCORE", // [167]
"()", // [168]
"()", // [169]
"*", // [170]
"PLUS", // [171]
"PIPE", // [172]
"HYPHEN_MINUS", // [173]
"OPEN_CURLY_BRACKET", // [174]
"CLOSE_CURLY_BRACKET", // [175]
"TILDE", // [176]
"", // [177]
"", // [178]
"", // [179]
"", // [180]
"VOLUME_MUTE", // [181]
"VOLUME_DOWN", // [182]
"VOLUME_UP", // [183]
"", // [184]
"", // [185]
";", // [186]
"EQUALS", // [187]
",", // [188]
"MINUS", // [189]
".", // [190]
"/", // [191]
"BACK_QUOTE", // [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]
"OPEN_BRACKET", // [219]
"BACK_SLASH", // [220]
"CLOSE_BRACKET", // [221]
"QUOTE", // [222]
"", // [223]
"META", // [224]
"ALTGR", // [225]
"", // [226]
"WIN_ICO_HELP", // [227]
"WIN_ICO_00", // [228]
"", // [229]
"WIN_ICO_CLEAR", // [230]
"", // [231]
"", // [232]
"WIN_OEM_RESET", // [233]
"WIN_OEM_JUMP", // [234]
"WIN_OEM_PA1", // [235]
"WIN_OEM_PA2", // [236]
"WIN_OEM_PA3", // [237]
"WIN_OEM_WSCTRL", // [238]
"WIN_OEM_CUSEL", // [239]
"WIN_OEM_ATTN", // [240]
"WIN_OEM_FINISH", // [241]
"WIN_OEM_COPY", // [242]
"WIN_OEM_AUTO", // [243]
"WIN_OEM_ENLW", // [244]
"WIN_OEM_BACKTAB", // [245]
"ATTN", // [246]
"CRSEL", // [247]
"EXSEL", // [248]
"EREOF", // [249]
"PLAY", // [250]
"ZOOM", // [251]
"", // [252]
"PA1", // [253]
"WIN_OEM_CLEAR", // [254]
"" // [255] // names of known key codes (0-255) from stackoverflow
];
// copied from http://freenet.msp.mn.us/people/calguire/morse.html (removed space)
var morseMap = {
'A': '.-',
'B': '-...',
'C': '-.-.',
'D': '-..',
'E': '.',
'F': '..-.',
'G': '--.',
'H': '....',
'I': '..',
'J': '.---',
'K': '-.-',
'L': '.-..',
'M': '--',
'N': '-.',
'O': '---',
'P': '.--.',
'Q': '--.-',
'R': '.-.',
'S': '...',
'T': '-',
'U': '..-',
'V': '...-',
'W': '.--',
'X': '-..-',
'Y': '-.--',
'Z': '--..',
'Á': '.--.-', // A with acute accent
'Ä': '.-.-', // A with diaeresis
'É': '..-..', // E with acute accent
'Ñ': '--.--', // N with tilde
'Ö': '---.', // O with diaeresis
'Ü': '..--', // U with diaeresis
'1': '.----',
'2': '..---',
'3': '...--',
'4': '....-',
'5': '.....',
'6': '-....',
'7': '--...',
'8': '---..',
'9': '----.',
'0': '-----',
',': '--..--', // comma
'.': '.-.-.-', // period
'?': '..--..', // question mark
';': '-.-.-', // semicolon
':': '---...', // colon
'/': '-..-.', // slash
'-': '-....-', // dash
"'": '.----.', // apostrophe
'()': '-.--.-', // parenthesis
'_': '..--.-', // underline
'@': '.--.-.' // at symbol from http://www.learnmorsecode.com/
};
//Functions
var insertCommArr = function (morse, commQuery) {
if (morse === "word end") {
commQuery.push("word end");
return 0;
}
var morseArr = morse.split("");
for (var j = 0; j < morseArr.length; j++) {
var c = morseArr[j];
switch (c) {
case ".":
commQuery.push("short");
break;
case "-":
commQuery.push("long");
break;
}
};
commQuery.push("char end");
}
var parseCommQuery = function (commQuery, ollie , emitter, idle) {
var comm = commQuery[0];
if (typeof comm === "undefined") {
idle.idle = true;
return 0;
} else {
idle.idle = false;
}
switch (comm) {
case "short":
shortBlink(ollie,emitter);
break;
case "long":
longBlink(ollie,emitter);
break;
case "word end":
endWord(ollie,emitter);
break;
case "char end":
endChar(ollie,emitter);
break;
}
commQuery.shift();
}
var shortBlink = function (ollie, emitter) {
ollie.setRGB("0xFFFFFF", function() {
setTimeout(function() {
ollie.setRGB("0x000000",function() {
setTimeout(function() { // wait time between parts of a character is one unit
emitter.emit("sent");
}, waitTime);
})
},waitTime);
});
}
var longBlink = function (ollie, emitter) {
ollie.setRGB("0xFFFFFF", function() {
setTimeout(function() {
ollie.setRGB("0x000000",function() {
setTimeout(function() { // wait time between parts of a character is one unit
emitter.emit("sent");
}, waitTime);
})
},waitTime*3);
});
}
var endChar = function (ollie, emitter) {
setTimeout(function() {
emitter.emit("sent");
},waitTime*3);
}
var endWord = function (ollie, emitter) {
setTimeout(function() {
emitter.emit("sent");
},waitTime*7);
}
var longBlink = function (ollie, emitter) {
ollie.setRGB("0xFFFFFF", function() {
setTimeout(function() {
ollie.setRGB("0x000000",function() {
setTimeout(function() { // wait time between parts of a character is one unit
emitter.emit("sent");
}, waitTime);
})
},waitTime*3);
});
}
module.exports = function(ollie, config, $) {
var runner = function() {
registerCommonKeys(config, $);
var commQuery = [];
var codeEmitter = new events.EventEmitter();
var idle = {idle:true}; // bugfix // ahh those references
$(document).keydown(function(event) {
if (keyboardMapDiff[event.keyCode] && keyboardMapDiff[event.keyCode] !== "") {
var chara = keyboardMapDiff[event.keyCode];
if (morseMap[chara]) {
var morse = morseMap[chara];
//insert
insertCommArr(morse, commQuery);
//emit event
codeEmitter.emit('got a morse', commQuery)
//update GUI
morseGUIUpdateAction(chara, morse);
} else if (chara === " ") {
var morse = "word end";
insertCommArr(morse, commQuery)
}
}
});
codeEmitter.on('got a morse', function(commQuery) { // bu once olmak zorunda(ydı idle ile çözdüm galiba)
if (idle.idle) {
parseCommQuery(commQuery, ollie, codeEmitter, idle);
}
})
codeEmitter.on('sent',function() { // process next command after sent
parseCommQuery(commQuery, ollie, codeEmitter, idle);
})
};
var ret = function() {
this.runMe = function(){
runner();
}
this.clearMe = function() {
$(document).off('keydown')
}
}
return new ret();
}