aprsNotifyJS/client.js

102 lines
3.1 KiB
JavaScript
Raw Normal View History

let stations = {};
let messages = [];
const timeoutLength = 20 * 60 * 1000; // 20 Minutes
const lowVoltage = 11.9;
if (Notification.permission !== "granted") {
Notification.requestPermission(permission => {
if (permission === "granted") {
new Notification("Test notification", {body: "whatever"});
}
});
}
function prettyDuration(duration) {
let date = new Date(timeoutLength);
return date.getUTCHours() > 0 ? date.getUTCHours() + " Hours": "" +
date.getUTCMinutes() > 0 ? date.getUTCMinutes() + " Minutes": "" +
date.getUTCSeconds() > 0 ? date.getUTCSeconds() + " Seconds": "" +
date.getUTCMilliseconds() > 0 ? date.getUTCMilliseconds() + " Milliseconds" : "";
}
2018-07-10 19:03:21 -04:00
function redrawTable() {
let table = document.querySelector('table.stations');
2018-07-10 19:03:21 -04:00
table.innerHTML =
`<tr><th>Callsign</th>` +
`<th>Last Heard</th>` +
`<th>Time since Last Heard</th>` +
`<th>Last Voltage</th>` +
`<th>Last Temperature</th>`;
for (let callsign in stations) {
let station = stations[callsign];
let nowDelta = new Date(new Date() - station.lastHeard);
2018-07-10 19:03:21 -04:00
let tr = table.appendChild(document.createElement('tr'));
if (nowDelta.getTime() > timeoutLength) {
tr.classList.add('timedOut');
}
if (station.lastVoltage < lowVoltage) {
tr.classList.add('lowVoltage');
}
2018-07-10 19:03:21 -04:00
tr.innerHTML =
`<td>${callsign}</td>` +
`<td>${station.lastHeard.toLocaleTimeString('en-GB')}</td>` +
`<td>${nowDelta.toLocaleTimeString('en-GB', {timeZone: "UTC"})}</td>` +
`<td>${station.lastVoltage||''}</td>` +
`<td>${station.lastTemperature||''}</td>`;
2018-07-10 19:03:21 -04:00
}
}
function notify(title, body) {
return new Notification(title, {body: body, requireInteraction: true});
}
function alertNotHeard(callsign) {
notify(`${callsign} has not been heard for ${prettyDuration(timeoutLength)}!`,
`Last Heard: ${stations[callsign].lastHeard.toLocaleTimeString('en-GB')}`);
}
function alertVoltage(callsign) {
notify(`${callsign}'s battery has dropepd below ${lowVoltage}V`,
`Voltage: ${stations[callsign].lastVoltage}`);
}
let aprsStream = new WebSocket("ws://localhost:1234");
aprsStream.onmessage = function(event) {
let message = JSON.parse(event.data);
let callsign = `${message.from.call}-${message.from.ssid || 0}`;
let date = new Date(message.recieved);
console.log(message);
messages.push(message);
if (!(callsign in stations)) {
2018-07-11 21:48:45 -04:00
stations[callsign] = {};
}
else {
window.clearTimeout(stations[callsign].timeout);
}
2018-07-11 21:48:45 -04:00
stations[callsign].lastHeard = date;
stations[callsign].delta = date - stations[callsign].lastHeard;
stations[callsign].timeout = window.setTimeout(
alertNotHeard, timeoutLength, callsign);
2018-07-10 19:03:21 -04:00
if ('data' in message && 'analog' in message.data) {
stations[callsign].lastVoltage = message.data.analog[0] / 10;
stations[callsign].lastTemperature = message.data.analog[1];
if (stations[callsign].lastVoltage <= lowVoltage) {
alertVoltage(callsign);
}
}
2018-07-10 19:03:21 -04:00
redrawTable();
};
2018-07-10 19:03:21 -04:00
window.addEventListener("load", redrawTable);
window.setInterval(redrawTable, 1000);