diff --git a/AIS/bsmd.AIS2Service/AISZoneMonitor.cs b/AIS/bsmd.AIS2Service/AISZoneMonitor.cs index 4b2846d7..d9e2a0d8 100644 --- a/AIS/bsmd.AIS2Service/AISZoneMonitor.cs +++ b/AIS/bsmd.AIS2Service/AISZoneMonitor.cs @@ -76,7 +76,7 @@ namespace bsmd.AIS2Service foreach(AlarmAssignmentZone aazone in testDict[mmsi]) { if(aazone.Zone.IsPointInPolygon4(target.Position)) { - _log.InfoFormat("{0} is in zone {1}", target.ToString(), aazone.Zone.Name); + _log.DebugFormat("{0} is in zone {1}", target.ToString(), aazone.Zone.Name); Alarm alarm; if (aazone.Assignment.Alarms.Count > 0) { diff --git a/AIS/bsmd.AIS2Service/lauf.html b/AIS/bsmd.AIS2Service/lauf.html index 242145c8..7fcb1334 100644 --- a/AIS/bsmd.AIS2Service/lauf.html +++ b/AIS/bsmd.AIS2Service/lauf.html @@ -1,22 +1,14 @@ - Zonen Übersicht - - - - +
(c) Informatikbüro Daniel Schick diff --git a/AIS/bsmd.AIS2Service/style.css b/AIS/bsmd.AIS2Service/style.css index 6aa16f65..4dd3c01f 100644 --- a/AIS/bsmd.AIS2Service/style.css +++ b/AIS/bsmd.AIS2Service/style.css @@ -6,127 +6,46 @@ body{ font-family: Helvetica; -webkit-font-smoothing: antialiased; - background: rgba( 71, 147, 227, 1); -} -h2{ - text-align: center; - font-size: 18px; - text-transform: uppercase; - letter-spacing: 1px; - color: white; - padding: 30px 0; } -/* Table Styles */ - -.table-wrapper{ - margin: 10px 70px 70px; - box-shadow: 0px 35px 50px rgba( 0, 0, 0, 0.2 ); -} - -.fl-table { - border-radius: 5px; - font-size: 12px; - font-weight: normal; - border: none; +.styled-table { border-collapse: collapse; - width: 100%; - max-width: 100%; - white-space: nowrap; - background-color: white; + margin: 25px 0; + font-size: 0.9em; + font-family: sans-serif; + min-width: 400px; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.15); } -.fl-table td, .fl-table th { - text-align: center; - padding: 8px; -} - -.fl-table td { - border-right: 1px solid #f8f8f8; - font-size: 12px; -} - -.fl-table thead th { +.styled-table thead tr { + background-color: #009879; color: #ffffff; - background: #4FC3A1; + text-align: left; } - -.fl-table thead th:nth-child(odd) { - color: #ffffff; - background: #324960; +.styled-table th, +.styled-table td { + padding: 12px 15px; } -.fl-table tr:nth-child(even) { - background: #F8F8F8; +.styled-table tbody tr { + border-bottom: 1px solid #dddddd; } -/* Responsive */ - -@media (max-width: 767px) { - .fl-table { - display: block; - width: 100%; - } - .table-wrapper:before{ - content: "Scroll horizontally >"; - display: block; - text-align: right; - font-size: 11px; - color: white; - padding: 0 0 10px; - } - .fl-table thead, .fl-table tbody, .fl-table thead th { - display: block; - } - .fl-table thead th:last-child{ - border-bottom: none; - } - .fl-table thead { - float: left; - } - .fl-table tbody { - width: auto; - position: relative; - overflow-x: auto; - } - .fl-table td, .fl-table th { - padding: 20px .625em .625em .625em; - height: 60px; - vertical-align: middle; - box-sizing: border-box; - overflow-x: hidden; - overflow-y: auto; - width: 120px; - font-size: 13px; - text-overflow: ellipsis; - } - .fl-table thead th { - text-align: left; - border-bottom: 1px solid #f7f7f9; - } - .fl-table tbody tr { - display: table-cell; - } - .fl-table tbody tr:nth-child(odd) { - background: none; - } - .fl-table tr:nth-child(even) { - background: transparent; - } - .fl-table tr td:nth-child(odd) { - background: #F8F8F8; - border-right: 1px solid #E6E4E4; - } - .fl-table tr td:nth-child(even) { - border-right: 1px solid #E6E4E4; - } - .fl-table tbody td { - display: block; - text-align: center; - } +.styled-table tbody tr:nth-of-type(even) { + background-color: #f3f3f3; } +.styled-table tbody tr:last-of-type { + border-bottom: 2px solid #009879; +} + +.styled-table tbody tr.active-row { + font-weight: bold; + color: #009879; +} + + #bottomcenter { position: fixed; left: 50%; diff --git a/AIS/bsmd.AIS2Service/zonen.js b/AIS/bsmd.AIS2Service/zonen.js index 2320feb3..af32799e 100644 --- a/AIS/bsmd.AIS2Service/zonen.js +++ b/AIS/bsmd.AIS2Service/zonen.js @@ -3,72 +3,160 @@ /* startup, load groups from database */ -document.addEventListener('DOMContentLoaded', function () { - let table = new DataTable('#aisTable', { - "ajax" : { - "url" : "http://192.168.2.25:9050/api/ais", - "dataSrc" : "", - "type" : "GET" - }, - columns: [ - { data: 'MMSI' }, - { data: 'Name' }, - { data: 'LastUpdate' }, - { data: 'Latitude' }, - { data: 'Longitude' }, - { data: 'IMO' }, - { data: 'IsClassB' } - ] - } ); +var groupIds = []; +var groupZones = []; - setInterval( function () { - table.ajax.reload( null, false ); // user paging is not reset on reload - }, 30000 ); +async function loadAlarms(groupId) +{ + let data; + try { + const res = await fetch('http://localhost:9050/api/slr?id=' + groupId); + data = await res.json(); + updateData(data, groupId); + } + catch(error) { + console.error(error); + } +} -} ); +function updateData(data, groupId) { + var table = document.getElementById('table-' + groupId); + + for (var i = 0; i < data.length; i++) { + + let row_id = "row_" + groupId + "_" + data[i].MMSI; + row = document.getElementById(row_id); + if(row == null) { // not found, create new row + row = document.createElement('tr'); + row.setAttribute("id", row_id); + // add leading cells + var td1 = document.createElement('td'); + //td1.innerHTML = data[i].Name; + row.appendChild(td1); + var td2 = document.createElement('td'); + + row.appendChild(td2); + var td3 = document.createElement('td'); + // td3.innerHTML = data[i].IMO; + row.appendChild(td3); + // create dummy cells for each zone + for(var j = 0; j < groupZones[groupId].length; j++) { + var td = document.createElement('td'); + td.id = "cell_" + groupId + "_" + groupZones[groupId][j] + "_" + data[i].MMSI; + row.appendChild(td); + } + // add trailing cells + var td4 = document.createElement('td'); + //td4.innerHTML = data[i].NavStatus; + row.appendChild(td4); + var td5 = document.createElement('td'); + //td5.innerHTML = data[i].MMSI; + row.appendChild(td5); + var td6 = document.createElement('td'); + //td6.innerHTML = data[i].Destination; + row.appendChild(td6); + + table.childNodes[1].appendChild(row); // append row to tbody subelement + } + + const colCount = row.childNodes.length; + row.childNodes[0].innerHTML = data[i].Name; + // TODO: incoming/outgoing symbol + row.childNodes[2].innerHTML = data[i].IMO; + + // find alarm cell and set value + let cellId = "cell_" + groupId + "_" + data[i].MonitorZoneId + "_" + data[i].MMSI; + var cell = document.getElementById(cellId); + if(cell != null) { + const timestamp = Date.parse(data[i].Timestamp_First); + const d = new Date(timestamp); + cell.innerHTML = ("0" + d.getHours()).slice(-2) + ":" + ("0" + d.getMinutes()).slice(-2) + " " + d.getDate() + "." + (d.getMonth() + 1) + "." + ("" + d.getFullYear()).slice(-2); + } + + row.childNodes[colCount - 3].innerHTML = data[i].NavStatus; + row.childNodes[colCount - 2].innerHTML = data[i].MMSI; + row.childNodes[colCount - 1].innerHTML = data[i].Destination; + } + + // TODO: remove rows (after an interval) that are not in the result set any more +} function update() { - fetch('http://192.168.2.25:9050/api/ais') + + for(var i = 0; i < groupIds.length; i++) + { + loadAlarms(groupIds[i]); + } +} + +function createAreas() +{ + fetch('http://localhost:9050/api/zones') .then(function (response) { return response.json(); }) .then(function (data) { - updateData(data); + createAreasFromData(data); }) .catch(function (err) { console.log('error: ' + err); }); - function updateData(data) { - var table = document.getElementById('aisTable'); - for (var i = 0; i < data.length; i++) { - let row_id = "row_" + data[i].MMSI; - row = document.getElementById(row_id); - if(row == null) { // not found, create new row - row = document.createElement('tr'); - row.setAttribute("id", row_id); - row.innerHTML = `` + data[i].MMSI + - `` + - `` + - `` + - `` + - `` + - `` + data[i].IsClassB + ``; - table.appendChild(row); + function createAreasFromData(data) + { + var root_div = document.getElementById('root-div'); + for (var i = 0; i < data.length; i++) { + groupIds.push(data[i].Id); + groupZones[data[i].Id] = []; + var aDiv = document.createElement('div'); + aDiv.className = ''; + aDiv.id = 'group-' + data[i].Id; + aDiv.innerHTML = data[i].Name; + root_div.appendChild(aDiv); + + // create table header with zones + var aTable = document.createElement('table'); + aTable.id = 'table-' + data[i].Id; + aTable.className = "styled-table"; + var thead = document.createElement('thead'); + aTable.appendChild(thead); + var tr = document.createElement('tr'); + thead.appendChild(tr); + var th1 = document.createElement('th'); + th1.innerHTML='Name'; + tr.appendChild(th1); + var th2 = document.createElement('th'); + th2.innerHTML='E/A'; + tr.appendChild(th2); + var th3 = document.createElement('th'); + th3.innerHTML='IMO'; + tr.appendChild(th3); + + for(var j = 0; j < data[i].Zones.length; j++) { + groupZones[data[i].Id].push(data[i].Zones[j].Id); + var aTH = document.createElement('th'); + aTH.id = 'zone-' + data[i].Zones[j].Id; + aTH.innerHTML = data[i].Zones[j].Name; + tr.appendChild(aTH); } - // update existing row - var td = document.getElementById("name_" + data[i].MMSI); - td.innerHTML = data[i].Name; - td = document.getElementById("timestamp_" + data[i].MMSI); - td.innerHTML = data[i].LastUpdate; - td = document.getElementById("lat_" + data[i].MMSI); - td.innerHTML = data[i].Latitude; - td = document.getElementById("lon_" + data[i].MMSI); - td.innerHTML = data[i].Longitude; - td = document.getElementById("imo_" + data[i].MMSI); - td.innerHTML = data[i].IMO; + var th4 = document.createElement('th'); + th4.innerHTML='Nav. status'; + tr.appendChild(th4); + var th5 = document.createElement('th'); + th5.innerHTML='MMSI'; + tr.appendChild(th5); + var th6 = document.createElement('th'); + th6.innerHTML='Destination'; + tr.appendChild(th6); + + aTable.appendChild(document.createElement('tbody')); + aDiv.appendChild(aTable); + aDiv.appendChild(document.createElement('hr')); } + + setInterval(function () { update(); }, 15000); } + } \ No newline at end of file