diff --git a/images/cli_backdrop.png b/images/cli_backdrop.png new file mode 100644 index 00000000..0f9b3c87 Binary files /dev/null and b/images/cli_backdrop.png differ diff --git a/images/cli_backdrop.psd b/images/cli_backdrop.psd new file mode 100644 index 00000000..c8b31878 Binary files /dev/null and b/images/cli_backdrop.psd differ diff --git a/tabs/cli old.css b/tabs/cli old.css new file mode 100644 index 00000000..c019ebe4 --- /dev/null +++ b/tabs/cli old.css @@ -0,0 +1,53 @@ +.tab-cli { + height: 100%; +} +.tab-cli p { + padding: 5px; + border: 1px dotted silver; +} +.tab-cli .backdrop { + border: 1px solid silver; + background-color: rgba(0,0,0,0.75); + + margin-top: 10px; + height: calc(100% - 80px); /* - (p, textarea) */ + background-image: url("../images/light-wide-1.svg"); + background-repeat: no-repeat; + background-position: 50% 80%; + background-size: 600px; +} +.tab-cli .window { + height:100%; + padding: 5px; + + overflow-y: scroll; + overflow-x: hidden; + + font-family: monospace; + color: white; + + box-sizing: border-box; + -webkit-user-select: text; +} +.tab-cli textarea { + -webkit-box-sizing: border-box; + + width: 100%; + + margin-top: 8px; + + height: 22px; + line-height: 20px; + + padding-left: 5px; + + border: 1px solid silver; + + resize: none; +} +.tab-cli #content-watermark { + z-index:0; +} +.tab-cli .window .wrapper { + white-space: pre-wrap; +} \ No newline at end of file diff --git a/tabs/cli old.html b/tabs/cli old.html new file mode 100644 index 00000000..5bec1778 --- /dev/null +++ b/tabs/cli old.html @@ -0,0 +1,10 @@ +
+

+

+
+
+
+
+
+ +
\ No newline at end of file diff --git a/tabs/cli old.js b/tabs/cli old.js new file mode 100644 index 00000000..df8f3ebc --- /dev/null +++ b/tabs/cli old.js @@ -0,0 +1,202 @@ +'use strict'; + +TABS.cli = { + 'validateText': "", + 'sequenceElements': 0 +}; + +TABS.cli.initialize = function (callback) { + var self = this; + + if (GUI.active_tab != 'cli') { + GUI.active_tab = 'cli'; + googleAnalytics.sendAppView('CLI'); + } + + $('#content').load("./tabs/cli.html", function () { + // translate to user-selected language + localize(); + + CONFIGURATOR.cliActive = true; + + // Enter CLI mode + var bufferOut = new ArrayBuffer(1); + var bufView = new Uint8Array(bufferOut); + + bufView[0] = 0x23; // # + + serial.send(bufferOut); + + var textarea = $('.tab-cli textarea'); + + textarea.keypress(function (event) { + if (event.which == 13) { // enter + event.preventDefault(); // prevent the adding of new line + + var out_string = textarea.val(); + var out_arr = out_string.split("\n"); + self.history.add(out_string.trim()); + + var timeout_needle = 0; + for (var i = 0; i < out_arr.length; i++) { + self.sendSlowly(out_arr, i, timeout_needle++); + } + + textarea.val(''); + } + }); + + textarea.keyup(function (event) { + var keyUp = {38: true}, + keyDown = {40: true}; + + if (event.keyCode in keyUp) { + textarea.val(self.history.prev()); + } + + if (event.keyCode in keyDown) { + textarea.val(self.history.next()); + } + }); + + // give input element user focus + textarea.focus(); + + if (callback) callback(); + }); +}; + +TABS.cli.history = { + history: [], + index: 0 +}; + +TABS.cli.history.add = function (str) { + this.history.push(str); + this.index = this.history.length; +}; +TABS.cli.history.prev = function () { + if (this.index > 0) this.index -= 1; + return this.history[this.index]; +}; +TABS.cli.history.next = function () { + if (this.index < this.history.length) this.index += 1; + return this.history[this.index - 1]; +}; + +TABS.cli.sendSlowly = function (out_arr, i, timeout_needle) { + GUI.timeout_add('CLI_send_slowly', function () { + var bufferOut = new ArrayBuffer(out_arr[i].length + 1); + var bufView = new Uint8Array(bufferOut); + + for (var c_key = 0; c_key < out_arr[i].length; c_key++) { + bufView[c_key] = out_arr[i].charCodeAt(c_key); + } + + bufView[out_arr[i].length] = 0x0D; // enter (\n) + + serial.send(bufferOut); + }, timeout_needle * 5); +}; + +TABS.cli.read = function (readInfo) { + /* Some info about handling line feeds and carriage return + + line feed = LF = \n = 0x0A = 10 + carriage return = CR = \r = 0x0D = 13 + + MAC only understands CR + Linux and Unix only understand LF + Windows understands (both) CRLF + Chrome OS currenty unknown + */ + var data = new Uint8Array(readInfo.data), + text = ""; + + for (var i = 0; i < data.length; i++) { + if (CONFIGURATOR.cliValid) { + if (data[i] == 27 || this.sequenceElements > 0) { // ESC + other + this.sequenceElements++; + + // delete previous space + if (this.sequenceElements == 1) { + text = text.substring(0, text.length -1); + } + + // Reset + if (this.sequenceElements >= 5) { + this.sequenceElements = 0; + } + } + + if (this.sequenceElements == 0) { + switch (data[i]) { + case 10: // line feed + if (GUI.operating_system != "MacOS") { + text += "
"; + } + break; + case 13: // carriage return + if (GUI.operating_system == "MacOS") { + text += "
"; + } + break; + case 60: + text += '<'; + break; + case 62: + text += '>'; + break; + + default: + text += String.fromCharCode(data[i]); + } + } + } else { + // try to catch part of valid CLI enter message + this.validateText += String.fromCharCode(data[i]); + } + } + + if (!CONFIGURATOR.cliValid && this.validateText.indexOf('CLI') != -1) { + CONFIGURATOR.cliValid = true; + this.validateText = ""; + + text = "Entering CLI Mode, type 'exit' to return, or 'help'

# "; + } + + $('.tab-cli .window .wrapper').append(text); + $('.tab-cli .window').scrollTop($('.tab-cli .window .wrapper').height()); + + // there seems to be some sort of initial rendering glitch in 33+, we will force redraw/refill + $('.tab-cli .window .wrapper').css('webkitTransform', 'scale(1)'); +}; + +TABS.cli.cleanup = function (callback) { + if (!CONFIGURATOR.connectionValid) { + if (callback) callback(); + return; + } + + var bufferOut = new ArrayBuffer(5); + var bufView = new Uint8Array(bufferOut); + + bufView[0] = 0x65; // e + bufView[1] = 0x78; // x + bufView[2] = 0x69; // i + bufView[3] = 0x74; // t + bufView[4] = 0x0D; // enter + + serial.send(bufferOut, function (writeInfo) { + // we could handle this "nicely", but this will do for now + // (another approach is however much more complicated): + // we can setup an interval asking for data lets say every 200ms, when data arrives, callback will be triggered and tab switched + // we could probably implement this someday + GUI.timeout_add('waiting_for_bootup', function waiting_for_bootup() { + CONFIGURATOR.cliActive = false; + CONFIGURATOR.cliValid = false; + + if (callback) callback(); + }, 5000); // if we dont allow enough time to reboot, CRC of "first" command sent will fail, keep an eye for this one + }); +}; \ No newline at end of file diff --git a/tabs/cli.css b/tabs/cli.css index c019ebe4..65c10d9c 100644 --- a/tabs/cli.css +++ b/tabs/cli.css @@ -2,22 +2,29 @@ height: 100%; } .tab-cli p { - padding: 5px; - border: 1px dotted silver; + padding: 0px; + border: 0px dotted silver; } .tab-cli .backdrop { border: 1px solid silver; background-color: rgba(0,0,0,0.75); - margin-top: 10px; - height: calc(100% - 80px); /* - (p, textarea) */ - background-image: url("../images/light-wide-1.svg"); - background-repeat: no-repeat; + margin-top: 0px; + height: calc(100% - 90px); /* - (p, textarea) */ + /* background-image: url("../images/light-wide-1.svg");*/ + background-image: url("../images/cli_backdrop.png"); + /*background-repeat: no-repeat; background-position: 50% 80%; - background-size: 600px; + background-size: 600px;*/ + border-radius: 5px; + /* box-shadow: inset 0px 0px 30px rgba(0,0,0,0.80);*/ + float:left; + width:100%; + } .tab-cli .window { height:100%; + width:100%; padding: 5px; overflow-y: scroll; @@ -28,6 +35,8 @@ box-sizing: border-box; -webkit-user-select: text; + float:left; + } .tab-cli textarea { -webkit-box-sizing: border-box; diff --git a/tabs/cli.html b/tabs/cli.html index 5bec1778..5bae7795 100644 --- a/tabs/cli.html +++ b/tabs/cli.html @@ -1,6 +1,9 @@
-

-

+ +
+

+
+