286 lines
7.4 KiB
HTML
286 lines
7.4 KiB
HTML
<!DOCTYPE html>
|
|
<html><head>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
|
|
<title>NMEA 2000 Gateway</title>
|
|
|
|
<script type="text/javascript">
|
|
let lastUpdate=(new Date()).getTime();
|
|
function alertRestart(){
|
|
alert("Board reset triggered, reconnect WLAN if necessary");
|
|
}
|
|
function getJson(url){
|
|
return fetch(url)
|
|
.then(function(r){return r.json()});
|
|
}
|
|
function reset(){
|
|
fetch('/api/reset');
|
|
alertRestart();
|
|
}
|
|
function update(){
|
|
let now=(new Date()).getTime();
|
|
let ce=document.getElementById('connected');
|
|
if (ce){
|
|
if ((lastUpdate+3000) > now){
|
|
ce.classList.add('ok');
|
|
}
|
|
else{
|
|
ce.classList.remove('ok');
|
|
}
|
|
}
|
|
getJson('/api/status')
|
|
.then(function(jsonData){
|
|
for (let k in jsonData){
|
|
if (k == 'cnv'){
|
|
updateCanDetails(jsonData[k]);
|
|
}
|
|
else{
|
|
let el=document.getElementById(k);
|
|
if (el) el.textContent=jsonData[k];
|
|
}
|
|
}
|
|
lastUpdate=(new Date()).getTime();
|
|
})
|
|
}
|
|
function resetForm(ev){
|
|
getJson("/api/config")
|
|
.then(function(jsonData){
|
|
for (let k in jsonData){
|
|
let el=document.querySelector("[name='"+k+"']");
|
|
if (el){
|
|
let v=jsonData[k];
|
|
el.value=v;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
function changeConfig(){
|
|
let url="/api/setConfig?";
|
|
let values=document.querySelectorAll('.configForm select , .configForm input');
|
|
for (let i=0;i<values.length;i++){
|
|
let v=values[i];
|
|
url+=v.getAttribute('name')+"="+encodeURIComponent(v.value)+"&";
|
|
}
|
|
getJson(url)
|
|
.then(function(status){
|
|
if(status.status == 'OK'){
|
|
alertRestart();
|
|
}
|
|
else{
|
|
alert("unable to set config: "+status.status);
|
|
}
|
|
})
|
|
}
|
|
function factoryReset(){
|
|
getJson("/api/resetConfig")
|
|
.then(function(status){
|
|
alertRestart();
|
|
})
|
|
}
|
|
function showCanDetails(on){
|
|
let el=document.getElementById('canDetails');
|
|
if (!el) return;
|
|
if (on) el.classList.add('visible');
|
|
else(el.classList).remove('visible');
|
|
}
|
|
function updateCanDetails(details){
|
|
let frame=document.getElementById('canDetails');
|
|
if (! frame) return;
|
|
for (let k in details){
|
|
let el=frame.querySelector("[data-id=\""+k+"\"] ");
|
|
if (!el){
|
|
el=document.createElement('div');
|
|
el.classList.add('row');
|
|
let cv=document.createElement('span');
|
|
cv.classList.add('label');
|
|
cv.textContent="PGN"+k;
|
|
el.appendChild(cv);
|
|
cv=document.createElement('span');
|
|
cv.classList.add('value');
|
|
cv.setAttribute('data-id',k);
|
|
cv.textContent=details[k];
|
|
el.appendChild(cv);
|
|
frame.appendChild(el);
|
|
}
|
|
else{
|
|
el.textContent=details[k];
|
|
}
|
|
}
|
|
}
|
|
window.setInterval(update,1000);
|
|
window.addEventListener('load',function(){
|
|
let buttons=document.querySelectorAll('button');
|
|
for (let i=0;i<buttons.length;i++){
|
|
let be=buttons[i];
|
|
be.onclick=window[be.id]; //assume a function with the button id
|
|
}
|
|
let cd=document.getElementById("showCanDetails");
|
|
cd.addEventListener('change',function(ev){
|
|
showCanDetails(ev.target.checked);
|
|
});
|
|
resetForm();
|
|
});
|
|
</script>
|
|
<style type="text/css">
|
|
.configForm {
|
|
margin-top: 1em;
|
|
margin-bottom: 1em;
|
|
padding-top: 0.5em;
|
|
padding-bottom: 0.5em;
|
|
border: 1px solid grey;
|
|
max-width: 40em;
|
|
}
|
|
span.label {
|
|
width: 10em;
|
|
display: inline-block;
|
|
opacity: 0.6;
|
|
}
|
|
span#connected {
|
|
display: inline-block;
|
|
background-color: red;
|
|
width: 1em;
|
|
height: 1em;
|
|
border-radius: 50%;
|
|
}
|
|
span#connected.ok{
|
|
background-color: #13ac13;
|
|
}
|
|
.row {
|
|
margin: 0.5em;
|
|
}
|
|
.buttons {
|
|
padding-left: 1em;
|
|
}
|
|
#canDetails{
|
|
display:none;
|
|
}
|
|
#canDetails.visible{
|
|
display: block;
|
|
}
|
|
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="main">
|
|
<h1>NMEA 2000 Gateway </h1>
|
|
<div class="row">
|
|
<span class="label">VERSION</span>
|
|
<span class="value" id="version">---</span>
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">connected</span>
|
|
<span class="value" id="connected"></span>
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">Access Point IP</span>
|
|
<span class="value" id="apIp">---</span>
|
|
</div>
|
|
<div class="row">
|
|
<span class="label"># NMEA2000 messages</span>
|
|
<span class="value" id="numcan">---</span>
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">NMEA2000 details</span>
|
|
<input type="checkbox" id="showCanDetails"></span>
|
|
</div>
|
|
|
|
<div class="row" id="canDetails">
|
|
|
|
</div>
|
|
<div class="row">
|
|
<span class="label"># TCP clients</span>
|
|
<span class="value" id="numClients">---</span>
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">wifi client connected</span>
|
|
<span class="value" id="wifiConnected">---</span>
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">wifi client IP</span>
|
|
<span class="value" id="clientIP">---</span>
|
|
</div>
|
|
<button id="reset" >Reset</button>
|
|
<div class="configForm">
|
|
<div class="row">
|
|
<span class="label">system name</span>
|
|
<input name="systemName" type="text">
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">NMEAtoUSB</span>
|
|
<select name="sendUsb">
|
|
<option value="true">On</option>
|
|
<option value="false" selected="selected">Off</option>
|
|
</select>
|
|
</div>
|
|
<!--"1200","2400","4800","9600","14400","19200","28800","38400","57600","115200","230400","460800"-->
|
|
<div class="row">
|
|
<span class="label">USB baud rate</span>
|
|
<select name="usbBaud">
|
|
<option value="1200">1200</option>
|
|
<option value="2400">2400</option>
|
|
<option value="4800">4800</option>
|
|
<option value="9600">9600</option>
|
|
<option value="14400">14400</option>
|
|
<option value="19200">19200</option>
|
|
<option value="28800">28800</option>
|
|
<option value="38400">38400</option>
|
|
<option value="57600">57600</option>
|
|
<option value="115200">115200</option>
|
|
<option value="230400">230400</option>
|
|
<option value="460800">460800</option>
|
|
</select>
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">TCP Port</span>
|
|
<input name="serverPort" type="number">
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">maxTCPClients</span>
|
|
<input name="maxClients" type="number">
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">NMEAtoTCP</span>
|
|
<select name="sendTCP">
|
|
<option value="true">On</option>
|
|
<option value="false" selected="selected">Off</option>
|
|
</select>
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">SeasmartToTCP</span>
|
|
<select name="sendSeasmart">
|
|
<option value="true">On</option>
|
|
<option value="false" selected="selected">Off</option>
|
|
</select>
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">shutdown AP after (min)</span>
|
|
<input name="stopApTime" type="number">
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">wifiClient</span>
|
|
<select name="wifiClient">
|
|
<option value="true">On</option>
|
|
<option value="false" selected="selected">Off</option>
|
|
</select>
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">wifiClientPass</span>
|
|
<input name="wifiPass" type="text">
|
|
</div>
|
|
<div class="row">
|
|
<span class="label">wifiClientSSID</span>
|
|
<input name="wifiSSID" type="text">
|
|
</div>
|
|
<div class="buttons">
|
|
<button id="resetForm">ReloadConfig</button>
|
|
<button id="changeConfig">Save&Restart</button>
|
|
<button id="factoryReset">FactoryReset</button>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|
|
|
|
|