diff options
author | Jakob Stendahl <jakst070500@ntvgs.no> | 2017-10-23 14:16:27 +0200 |
---|---|---|
committer | Jakob Stendahl <jakst070500@ntvgs.no> | 2017-10-23 14:16:27 +0200 |
commit | 2d7d728e184f24961e4a0871f4d5bed3e2fe652a (patch) | |
tree | 52147439c27002cc5ccabef86fd8156dc50a588f /webPage | |
parent | c962ad1b2ade35022cc614dd4cc0e5e6d17ddb91 (diff) | |
download | Luxcena-cs-2d7d728e184f24961e4a0871f4d5bed3e2fe652a.tar.gz Luxcena-cs-2d7d728e184f24961e4a0871f4d5bed3e2fe652a.zip |
Moved everything into the new REPO
Diffstat (limited to 'webPage')
-rw-r--r-- | webPage/index.html | 127 | ||||
-rw-r--r-- | webPage/settings.html | 167 | ||||
-rw-r--r-- | webPage/style.css | 148 |
3 files changed, 442 insertions, 0 deletions
diff --git a/webPage/index.html b/webPage/index.html new file mode 100644 index 0000000..c80ee61 --- /dev/null +++ b/webPage/index.html @@ -0,0 +1,127 @@ +<!DOCTYPE html> +<html> + + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + + <title>{{NAME}}</title> + + <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous"> + <link rel="stylesheet" href="./style.css"> + </head> + + + <body> + + <nav class="navbar navbar-dark bg-dark"> + <a class="navbar-brand" href="/">IOT Device</a> + <a class="navbar-toggler navbar-toggler-right" href="/settings"> + ⚙ + </a> + </nav> + + <div class="container-fluid pt-3"> + + <div class="card card-inverse bg-dark text-white"> + <div class="card-body"> + + <div class="card-title"> + <h3> + {{NAME}} + <span class="text-align:right;"> + <label class="switch float-right"> + <input type="checkbox" id="lampActive"> + <span class="slider round"></span> + </label> + </span> + </h3> + </div> + <h6 class="card-subtitle mb-2 text-muted">{{Location}}</h6> + + <hr /> + <div class="toggle-button toggle-button--tuli"> + <input id="sensorActive" type="checkbox"> + <label for="sensorActive">Clap sensor</label> + <div class="toggle-button__icon"></div> + </div> + + </div> + </div> + + </div> + + + <script type="text/javascript"> + var pollingActive = true; // Prevent states from being updated while trying to change them. + document.getElementById("lampActive").addEventListener("change", changLampState); + document.getElementById("sensorActive").addEventListener("change", changSensorState); + setInterval(getStates, 1000); + + function ajax_request(adress, callback_function) { + /* A simple ajax request wrapper + Doesn´t return anything else than the callback */ + var xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + callback_function(this.responseText); + } + }; + xhttp.open("POST", adress, true); + xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + xhttp.send(); + } + + function changLampState() { + var boxState = document.getElementById("lampActive").checked; + if (boxState) { + pollingActive = false; + ajax_request("/j?lamp=1", function(e) { + pollingActive = true; + console.log(e); + }); + } else { + pollingActive = false; + ajax_request("/j?lamp=0", function(e) { + pollingActive = true; + console.log(e); + }); + } + } + + function changSensorState() { + var sensorState = document.getElementById("sensorActive").checked; + if (sensorState) { + pollingActive = false; + ajax_request("/j?sens=1", function(e) { + pollingActive = true; + console.log(e); + }); + } else { + pollingActive = false; + ajax_request("/j?sens=0", function(e) { + pollingActive = true; + console.log(e); + }); + } + } + + function getStates() { + if (pollingActive) { + ajax_request("/j/", function(e) { + result = JSON.parse(e); + + var lampOn = false; + var sensorOn = false; + if (result['lampOn'] == 1) { lampOn = true; } + if (result['sensorOn'] == 1) { sensorOn = true; } + + document.getElementById("lampActive").checked = lampOn; + document.getElementById("sensorActive").checked = sensorOn; + }); + } + } + </script> + </body> + +</html> diff --git a/webPage/settings.html b/webPage/settings.html new file mode 100644 index 0000000..cdda75a --- /dev/null +++ b/webPage/settings.html @@ -0,0 +1,167 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + + <title>{{NAME}}</title> + + <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous"> + <link rel="stylesheet" href="./style.css"> +</head> + + +<body> + + <nav class="navbar navbar-dark bg-dark"> + <a class="navbar-brand" href="/">IOT Device</a> + <a class="navbar-toggler navbar-toggler-right" href="/settings"> + ⚙ + </a> + </nav> + + <div class="container-fluid pt-3 pb-3"> + + <div id="success-box" class="alert alert-success" role="alert"> + {{SUCCESSMSG}} + </div> + + <div class="alert alert-danger" role="alert"> + <b>Warning:</b> The password-protection does not work yet! Make sure to don´t expose the device. + </div> + + <div class="card card-inverse bg-dark text-white mt-3"> + <div class="card-body"> + + <div class="card-title"> + <h3>Password</h3> + </div> + + <div class="container"> + <form> + + <h5 class="small text-muted">To change any settings, you must enter the correct password"</h5> + <div class="form-group row"> + + <div class="col-sm-12"> + <input type="password" class="form-control" id="" placeholder="Device password" readonly> + </div> + </div> + + </form> + </div> + + </div> + </div> + + <div class="card card-inverse bg-dark text-white mt-3"> + <div class="card-body"> + + <div class="card-title"> + <h3>Settings</h3> + </div> + + <div class="container"> + <form method="post"> + + <input type="hidden" name="type" value="settings"> + + <h5 class="small text-muted">Device settings:</h5> + <div class="form-group row"> + <label for="lblDeviceName" class="col-sm-2 col-form-label">Device name</label> + <div class="col-sm-10"> + <input type="text" class="form-control" name="txtDeviceName" id="txtDeviceName" placeholder="Ex. Rooflight"> + </div> + </div> + + <div class="form-group row"> + <label for="lblDeviceLocation" class="col-sm-2 col-form-label">Location</label> + <div class="col-sm-10"> + <input type="text" class="form-control" name="txtDeviceLocation" id="txtDeviceLocation" placeholder="Ex. Bathroom"> + </div> + </div> + + <h5 class="small text-muted">Wifi settings:</h5> + <div class="form-group row"> + <label for="lblSSID" class="col-sm-2 col-form-label">SSID</label> + <div class="col-sm-10"> + <input type="name" class="form-control" name="txtSSID" id="txtSSID" placeholder="Name of router"> + </div> + </div> + + <div class="form-group row"> + <label for="lblPassword" class="col-sm-2 col-form-label">Pasword</label> + <div class="col-sm-10"> + <input type="name" class="form-control" name="txtPassword" id="txtPassword" placeholder="Passphrase (If open, write nothing)"> + </div> + </div> + + <div class="form-group row"> + <div class="col-sm-10"> + + <button type="submit" class="btn btn-primary">Save</button> + <br /><span class="small text-muted"> <b> Note:</b> The device will reboot and turn of any connected appliances when you save the settings.</span> + <br /><span class="small text-muted"> <b> Note:</b> Empty or unchanged fields will not be updated.</span> + </div> + </div> + + </form> + </div> + + </div> + </div> + + <div class="card card-inverse bg-dark text-white mt-3"> + <div class="card-body"> + + <div class="card-title"> + <h3>Version & OTA</h3> + </div> + + <div class="container"> + <form> + <h5>Device type: <b>clapSensor</b></h5> + <h5>Current version: <b>1.0.0</b></h5> + <hr /> + <div class="form-group row"> + <label for="inputEmail3" class="col-sm-2 col-form-label">Update file:</label> + <div class="col-sm-10"> + <input type="file" class="form-control-file" id="exampleFormControlFile1"> + </div> + </div> + + <div class="form-group row"> + <div class="col-sm-10"> + <button type="submit" class="btn btn-danger">Flash new version</button> + <br /><span class="small text-muted"> <b> Note:</b> The device will reboot and turn of any connected appliances when you flash a new version.</span> + </div> + </div> + + </form> + </div> + + </div> + </div> + </div> + + + <script type="text/javascript"> + var successAlert = document.getElementById('success-box'); + + updatePlaceholder("txtDeviceName", "{{DEVICENAME}}"); + updatePlaceholder("txtDeviceLocation", "{{DEVICELOCATION}}");; + + if (successAlert.innerHtml == "") { + successAlert.style.display = "none"; + } + + function updatePlaceholder(elemId, textToInsert) { + var field = document.getElementById(elemId); + if (textToInsert != "") { field.placeholder = "Curr; " + textToInsert } + } + + </script> +</body> + +</html> diff --git a/webPage/style.css b/webPage/style.css new file mode 100644 index 0000000..63663d5 --- /dev/null +++ b/webPage/style.css @@ -0,0 +1,148 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 1rem; + font-weight: normal; + line-height: 1.5; + background-color: #222; +} + +/* SWITCH */ + .switch { + position: relative; + display: inline-block; + width: 60px; + height: 34px; +} + +.switch input {display:none;} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 26px; + width: 26px; + left: 4px; + bottom: 4px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; +} + +input:checked + .slider { + background-color: #2196F3; +} + +input:focus + .slider { + box-shadow: 0 0 1px #2196F3; +} + +input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} +/* ./SWITCH */ + +.toggle-button { + position: relative; + display: inline-block; + color: #fff; +} + + .toggle-button label { + display: inline-block; + text-transform: uppercase; + cursor: pointer; + text-align: left; +} + +.toggle-button input { + display: none; +} + + .toggle-button__icon { + cursor: pointer; + pointer-events: none; +} + +.toggle-button__icon:before, .toggle-button__icon:after { + content: ""; + position: absolute; + top: 45%; + left: 35%; + transition: 0.2s ease-out; +} + +.toggle-button--tuli label { + line-height: 20px; + text-indent: 30px; +} + +.toggle-button--tuli input[type=checkbox]:checked ~ .toggle-button__icon { + background: #fff; +} + +.toggle-button--tuli input[type=checkbox]:checked ~ .toggle-button__icon:before, .toggle-button--tuli input[type=checkbox]:checked ~ .toggle-button__icon:after { + opacity: 1; +} + +.toggle-button--tuli .toggle-button__icon { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; + transition: all 0.2s; + border: 2px solid #fff; + border-radius: 1px; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); +} + +.toggle-button--tuli .toggle-button__icon:before, .toggle-button--tuli .toggle-button__icon:after { + top: 5px; + left: 2px; + width: 12px; + height: 2px; + border-radius: 3px; + background: #fff; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); + top: 35%; + background: #61B136; + opacity: 0; + transform-origin: left center; +} + +.toggle-button--tuli .toggle-button__icon:before { + transform: translate(0, 0) rotate(45deg) scale(0.6, 1); +} + +.toggle-button--tuli .toggle-button__icon:after { + transform: translate(4px, 6px) rotate(-45deg); +} + +.toggle-button--tuli:hover input[type=checkbox]:not(:checked) ~ .toggle-button__icon { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); +} |