diff --git a/resources/NotoSans-Regular.ttf b/resources/NotoSans-Regular.ttf new file mode 100644 index 0000000..91a774a Binary files /dev/null and b/resources/NotoSans-Regular.ttf differ diff --git a/resources/RGB-64x32.png b/resources/RGB-64x32.png new file mode 100644 index 0000000..c49a773 Binary files /dev/null and b/resources/RGB-64x32.png differ diff --git a/resources/index.html b/resources/index.html new file mode 100644 index 0000000..f126e79 --- /dev/null +++ b/resources/index.html @@ -0,0 +1,237 @@ + + + + + + Topology Explorer - Panel Index + + + + + +
+ + +
+

Panels on Network:

+ +

Updated:

+ +
+ +
+

SKAARHOJ devices found on the network.

+ + + \ No newline at end of file diff --git a/resources/kasperwashere.png b/resources/kasperwashere.png new file mode 100644 index 0000000..c18c669 Binary files /dev/null and b/resources/kasperwashere.png differ diff --git a/resources/logoheader.png b/resources/logoheader.png new file mode 100644 index 0000000..610de05 Binary files /dev/null and b/resources/logoheader.png differ diff --git a/resources/panel.html b/resources/panel.html new file mode 100644 index 0000000..623a67e --- /dev/null +++ b/resources/panel.html @@ -0,0 +1,879 @@ + + + + + + Topology Explorer - Panel View + + + + + + +
+ + +
+ +

Panel Topology Explorer

+ +

Updated:

+ +

Panel Info:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Title:S/W version:Boot Count:Rdy/Bsy:
Model:Platform:Total Uptime:Sleeping:
Serial:Blue Pill Ready:Session Uptime:CPU:
Max Clients:Screen Save On:
Connections:
Locked to IPs:
+ + + + +   + + + + + +
+ + + + + + + + +
+

Various panel information.

+ + + + + + + +
+

Reference SVG Rendering:

+
+

The SVG image above is the reference rendering of panel based on the SVG base and the + topology components listed below. Click any component to see it highlighted in the table (hold shift + for more).

+
+

Panel Communication:

+
+

Use this to send various types of feedback to the connected panel.

+ +
+ Raw Panel ASCII Command sequence (v1):
+

+
+                    Raw Panel ASCII JSON (v2):
+
+ + Raw Panel Binary Protobuf command:
+
+
+

These are the various encodings of the sent command.

+
+ +

Topology Summary:

+
+

The topology summary is a friendly overview of the features of individual hardware components (HWCs) + on the panel. It's compiled from the topology json structure. Click the rows to highlight the component in both + the json-structure and on the controller. Shift click to select more.

+ + +

Topology JSON:

+
+

+    
+

The topology json is the authoritative description of the panels hardware components. This includes + not only their capabilities in terms of triggers (In) and feedback (Out, Ext, Disp) but also how they should + render on a visual representation.

+ +

Log:

+
+

This is a log of the communication between this webpage and the PanelTopology websocket server.

+ + + + \ No newline at end of file diff --git a/resources/vanilla-picker.js b/resources/vanilla-picker.js new file mode 100644 index 0000000..1a500b5 --- /dev/null +++ b/resources/vanilla-picker.js @@ -0,0 +1,8 @@ +/*! + * vanilla-picker v2.12.1 + * https://vanilla-picker.js.org + * + * Copyright 2017-2021 Andreas Borgen (https://github.com/Sphinxxxx), Adam Brooks (https://github.com/dissimulate) + * Released under the ISC license. + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Picker=t()}(this,function(){"use strict";function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var e=function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),e};function n(e,t){for(var r=0;rt&&(n=!0)):(g(e),n=!0):n=!0,n&&this.hide()&&(this.settings.parent.style.pointerEvents="",r!==c&&this.settings.parent.focus(),this.onClose&&this.onClose(this.colour))}},{key:"movePopup",value:function(e,t){this.closeHandler(),this.setOptions(e),t&&this.openHandler()}},{key:"setColor",value:function(e,t){this._setColor(e,{silent:t})}},{key:"_setColor",value:function(e,t){if(e="string"==typeof e?e.trim():e){t=t||{};var r=void 0;try{r=new o(e)}catch(e){if(t.failSilently)return;throw e}this.settings.alpha||((e=r.hsla)[3]=1,r.hsla=e),this.colour=this.color=r,this._setHSLA(null,null,null,null,t)}}},{key:"setColour",value:function(e,t){this.setColor(e,t)}},{key:"show",value:function(){if(!this.settings.parent)return!1;if(this.domElement){var e=this._toggleDOM(!0);return this._setPosition(),e}var t=this.settings.template||'
',r=(e=t,(t=document.createElement("div")).innerHTML=e,t.firstElementChild);return this.domElement=r,this._domH=f(".picker_hue",r),this._domSL=f(".picker_sl",r),this._domA=f(".picker_alpha",r),this._domEdit=f(".picker_editor input",r),this._domSample=f(".picker_sample",r),this._domOkay=f(".picker_done button",r),this._domCancel=f(".picker_cancel button",r),r.classList.add("layout_"+this.settings.layout),this.settings.alpha||r.classList.add("no_alpha"),this.settings.editor||r.classList.add("no_editor"),this.settings.cancelButton||r.classList.add("no_cancel"),this._ifPopup(function(){return r.classList.add("popup")}),this._setPosition(),this.colour?this._updateUI():this._setColor(this.settings.defaultColor),this._bindEvents(),!0}},{key:"hide",value:function(){return this._toggleDOM(!1)}},{key:"destroy",value:function(){this._events.destroy(),this.domElement&&this.settings.parent.removeChild(this.domElement)}},{key:"_bindEvents",value:function(){var r=this,n=this,i=this.domElement,o=this._events;function a(e,t,r){o.add(e,t,r)}a(i,"click",function(e){return e.preventDefault()}),s(o,this._domH,function(e,t){return n._setHSLA(e)}),s(o,this._domSL,function(e,t){return n._setHSLA(null,e,1-t)}),this.settings.alpha&&s(o,this._domA,function(e,t){return n._setHSLA(null,null,null,1-t)});var e=this._domEdit;a(e,"input",function(e){n._setColor(this.value,{fromEditor:!0,failSilently:!0})}),a(e,"focus",function(e){this.selectionStart===this.selectionEnd&&this.select()}),this._ifPopup(function(){function e(e){return r.closeHandler(e)}a(window,c,e),a(window,l,e),b(o,i,["Esc","Escape"],e);function t(e){r.__containedEvent=e.timeStamp}a(i,c,t),a(i,l,t),a(r._domCancel,"click",e)});e=function(e){r._ifPopup(function(){return r.closeHandler(e)}),r.onDone&&r.onDone(r.colour)};a(this._domOkay,"click",e),b(o,i,["Enter"],e)}},{key:"_setPosition",value:function(){var r=this.settings.parent,n=this.domElement;r!==n.parentNode&&r.appendChild(n),this._ifPopup(function(e){"static"===getComputedStyle(r).position&&(r.style.position="relative");var t=!0===e?"popup_right":"popup_"+e;["popup_top","popup_bottom","popup_left","popup_right"].forEach(function(e){e===t?n.classList.add(e):n.classList.remove(e)}),n.classList.add(t)})}},{key:"_setHSLA",value:function(e,t,r,n,i){i=i||{};var o=this.colour,a=o.hsla;[e,t,r,n].forEach(function(e,t){!e&&0!==e||(a[t]=e)}),o.hsla=a,this._updateUI(i),this.onChange&&!i.silent&&this.onChange(o)}},{key:"_updateUI",value:function(e){if(this.domElement){e=e||{};var t=this.colour,r=t.hsla,n="hsl("+360*r[0]+", 100%, 50%)",i=t.hslString,o=t.hslaString,a=this._domH,s=this._domSL,p=this._domA,c=f(".picker_selector",a),a=f(".picker_selector",s),p=f(".picker_selector",p);d(0,c,r[0]),this._domSL.style.backgroundColor=this._domH.style.color=n,d(0,a,r[1]),h(0,a,1-r[2]),s.style.color=i,h(0,p,1-r[3]);r=i,i=r.replace("hsl","hsla").replace(")",", 0)");if(this._domA.style.background="linear-gradient("+[r,i]+")"+", linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em,\n linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em / 2em 2em",!e.fromEditor){var e=this.settings.editorFormat,l=this.settings.alpha,u=void 0;switch(e){case"rgb":u=t.printRGB(l);break;case"hsl":u=t.printHSL(l);break;default:u=t.printHex(l)}this._domEdit.value=u}this._domSample.style.color=o}function d(e,t,r){t.style.left=100*r+"%"}function h(e,t,r){t.style.top=100*r+"%"}}},{key:"_ifPopup",value:function(e,t){this.settings.parent&&this.settings.popup?e&&e(this.settings.popup):t&&t()}},{key:"_toggleDOM",value:function(e){var t=this.domElement;if(!t)return!1;var r=e?"":"none",e=t.style.display!==r;return e&&(t.style.display=r),e}}]),m);function m(e){u(this,m),this.settings={popup:"right",layout:"default",alpha:!0,editor:!0,editorFormat:"hex",cancelButton:!1,defaultColor:"#0cf"},this._events=new r,this.onChange=null,this.onDone=null,this.onOpen=null,this.onClose=null,this.setOptions(e)}e=document.createElement("style");return e.textContent='.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:"";display:block;width:100%;height:0;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl::before{content:"";display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6.5rem}.layout_default .picker_editor input{width:100%;height:100%}.layout_default .picker_sample{order:1;flex:1 1 auto}.layout_default .picker_done,.layout_default .picker_cancel{order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{box-sizing:border-box;border:none;box-shadow:0 0 0 1px silver;outline:none}.picker_wrapper button:focus,.picker_wrapper button:active,.picker_wrapper input:focus,.picker_wrapper input:active{box-shadow:0 0 2px 1px #1e90ff}.picker_wrapper button{padding:.4em .6em;cursor:pointer;background-color:#f5f5f5;background-image:linear-gradient(0deg, gainsboro, transparent)}.picker_wrapper button:active{background-image:linear-gradient(0deg, transparent, gainsboro)}.picker_wrapper button:hover{background-color:#fff}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid #fff;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:linear-gradient(180deg, white, rgba(255, 255, 255, 0) 50%),linear-gradient(0deg, black, rgba(0, 0, 0, 0) 50%),linear-gradient(90deg, #808080, rgba(128, 128, 128, 0))}.picker_alpha,.picker_sample{position:relative;background:linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0/2em 2em,linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em/2em 2em;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample::before{content:"";position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:"";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}',document.documentElement.firstElementChild.appendChild(e),_.StyleElement=e,_}); \ No newline at end of file