<!DOCTYPE html>
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>xPablo.cz TRACE</title>
<style>
.ei {
  background: url('data:image/png;base64,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')  no-repeat #FBE3E4 5px 5px; padding: 1em; padding-left: 3.5em; border: 2px solid #FBC2C4; color: #D12F19;
}

html {
    display: table;
    margin: auto;
}

body {
  background-color:#f9f9f9; color:#555555;
  font-family:Helvetica Neue, Helvetica, Arial, sans-serif;
  font-weight:400; font-size:85%;
}

h3 {
  font-weight:500; font-size:1.4em;
}

p {
  height:0.9em;
}

label {
  display:inline-block; width:10em;
  text-align:right; padding-right:0.4em;
}

fieldset {
  padding-right:2em; padding-left:2em; display:inline-block;
  background-color:#efefef; border:solid 1px #dddddd;
  border-radius:0.3em; width:22em;
}

legend {
  font-size:1.15em; font-weight:500; background-color:#efefef;
  font-weight: bold;
  border-width:1px; border-style:solid; border-color:#dddddd;
  border-radius:0.3em; padding-left:0.5em; padding-right:0.5em;
}

span.r {
  color: red;
}

span.g {
  color: green;
}

span.y {
  color: yellow;
}

span.b {
  color: black;
}

/* Trace elementy */
table.trace {
 font-family: Arial;
 font-weight: bold;
}

.trace tr {
  line-height: 16px;
}

td.tr_err {
  border-left: 5px solid red;
  padding-left: 5px;
  background: #ffcccc;
}

td.tr_inf {
  border-left: 5px solid green;
  padding-left: 5px;
  background: lightgreen;
}

td.tr_warn {
  border-left: 5px solid yellow;
  padding-left: 5px;
  background: lightyellow;
}

td.tr_dbg {
  border-left: 5px solid black;
  padding-left: 5px;
  background: lightgray;
}

td.tr_tm {

  text-align: right;
  width: 5%;
}

</style>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    </head>
    <script>
      var connection;
      var connected = 0;

      function ping() {
        if (connected) {
          if (document.getElementById("live").checked)
            connection.send('status');
          else
            connection.send('ping');
          setTimeout(ping, 5000);
        }
      }

      function getTraceTime(stamp) {
        var hours = Math.trunc((stamp % 86400000) / 3600000); // 86400 equals secs per day
        var minutes = Math.trunc((stamp % 3600000) / 60000); //  3600 equals secs per minute
        var seconds = Math.trunc((stamp % 60000) / 1000);
        var ms = stamp % 1000;
        var t;

        t = hours.toLocaleString(undefined, {
          minimumIntegerDigits: 2
        }) + ':' + minutes.toLocaleString(undefined, {
          minimumIntegerDigits: 2
        }) + ':' + seconds.toLocaleString(undefined, {
          minimumIntegerDigits: 2
        }) + '.' + ms.toLocaleString(undefined, {
          minimumIntegerDigits: 3
        });
        return t;
      }

      function connect() {
        connection = new WebSocket('ws://' + window.location.hostname + '/wss', ['arduino']);

        connection.onopen = function() {
          console.log('WS Connected');
          connected = 1;
          document.getElementById('errinfo').style = "display:none";
          ping(); // ping pro rychlejsi detekci ztraty spojeni
        };

        connection.onerror = function(error) {
          console.log('WS Error ', error);
          connected = 0;
        };

        connection.onmessage = function(e) {
          var d = JSON.parse(e.data);
          if (d.type == 'trace') {
            var h = '<table class="trace" style="width:100%;">';
            for (var i = 0; i < d.data.length; i++) {
              h += '<tr><td class="tr_tm">';
              h += getTraceTime(d.data[i].t);
              h += '</td><td class="';
              switch (d.data[i].s) {
                case 0: // error
                  h += 'tr_err';
                  break;

                case 1: // warning
                  h += 'tr_warn';
                  break;

                case 2: // info
                  h += 'tr_inf';
                  break;

                case 3: // debug
                  h += 'tr_dbg';
                  break;

                case 4: // debug more
                  h += 'tr_dbg';
                  break;
              }
              h += '">' + d.data[i].d;
              h += '</td></tr>'
            }
            h += '</table>';
            document.getElementById('trace').innerHTML = h;
          }

          if (d.type == 'status') {
            // document.getElementById('reset').innerHTML = d.reset;
            // document.getElementById('flash').innerHTML = d.flash;
            document.getElementById('ram').innerHTML = d.ram;
          }
        }

        connection.onclose = function() {
          console.log('WS Reconnecting timer start');
          setTimeout(function(){connect()}, 5000);
          document.getElementById('errinfo').style = "display:show";
          connected = 0;
        }
      }
    </script>
    <body onload="connect()">
    <h3>Informace</h3>
    <fieldset>
    Příčina resetu: <span id='reset'>???</span><br>
    Velikost flash: <span id='flash'>???</span> bytů<br>
    Volná RAM: <span id='ram'>???</span> bytů <input type="checkbox" id="live">Stále aktualizovat<br>
    </fieldset>
    <br />
    <h3>Stopař</h3>
    <div class='fixed' id=trace>
      <span style='color:black'> NAHRÁVÁM ...</span>
    </div>
    <br />
    <div class="ei" id="errinfo" style="display:none">Obnovuji spojení...</div>
    </body>
</html>