diff --git a/client/demo.js b/client/demo.js index 6c7c354b..a92efcd6 100644 --- a/client/demo.js +++ b/client/demo.js @@ -290,8 +290,10 @@ class DemoDataGenerator { } logs(req, res){ - var ret = {logs: {}}; + var ret = {logs: {"1": "I'm a log!", "2": "I'm a different log!"}}; ret.time = Date.now(); + ret.frameRate = 60; + ret.load = 0; res.send(JSON.stringify(ret)); }; diff --git a/client/public/stylesheets/layout/layout.css b/client/public/stylesheets/layout/layout.css index 63a525e6..b1053f4b 100644 --- a/client/public/stylesheets/layout/layout.css +++ b/client/public/stylesheets/layout/layout.css @@ -38,7 +38,16 @@ font-size: 12px; position: absolute; right: 10px; - width: 250px; + width: 180px; + z-index: 9999; +} + +#server-status-panel { + bottom: 20px; + font-size: 12px; + position: absolute; + right: 200px; + width: 300px; z-index: 9999; } diff --git a/client/public/stylesheets/olympus.css b/client/public/stylesheets/olympus.css index b6f2db41..ae397f53 100644 --- a/client/public/stylesheets/olympus.css +++ b/client/public/stylesheets/olympus.css @@ -3,6 +3,7 @@ @import url("atc/unitdatatable.css"); @import url("aic/aic.css"); @import url("panels/connectionstatus.css"); +@import url("panels/serverstatus.css"); @import url("panels/mouseinfo.css"); @import url("panels/unitcontrol.css"); @import url("panels/unitinfo.css"); diff --git a/client/public/stylesheets/panels/connectionstatus.css b/client/public/stylesheets/panels/connectionstatus.css index 715850a9..2b7dcec4 100644 --- a/client/public/stylesheets/panels/connectionstatus.css +++ b/client/public/stylesheets/panels/connectionstatus.css @@ -11,7 +11,7 @@ } #connection-status-panel[data-is-connected] dt::before { - content: "Connected FPS: " attr(data-framerate) " Load: " attr(data-load); + content: "Connected"; } #connection-status-panel[data-is-connected] dd::after { diff --git a/client/public/stylesheets/panels/serverstatus.css b/client/public/stylesheets/panels/serverstatus.css new file mode 100644 index 00000000..c001de99 --- /dev/null +++ b/client/public/stylesheets/panels/serverstatus.css @@ -0,0 +1,43 @@ +#server-status-panel { + display: flex; + flex-direction: row; + justify-content: space-between; + column-gap: 10px; +} + +#server-status-panel .ol-data-grid { + width: 100%; +} + +#server-status-panel .ol-data-grid:first-of-type { + border-right: 1px solid gray; + padding-right: 10px; +} + +#server-status-panel dd { + font-weight: bold; +} + +.fps-low { + color: red; +} + +.fps-medium { + color: orange; +} + +.fps-high { + color: lightgreen; +} + +.load-low { + color: lightgreen; +} + +.load-medium { + color: orange; +} + +.load-high { + color: red; +} \ No newline at end of file diff --git a/client/src/index.ts b/client/src/index.ts index 07787e68..6c20538b 100644 --- a/client/src/index.ts +++ b/client/src/index.ts @@ -17,6 +17,7 @@ import { Dropdown } from "./controls/dropdown"; import { HotgroupPanel } from "./panels/hotgrouppanel"; import { SVGInjector } from "@tanem/svg-injector"; import { BLUE_COMMANDER, GAME_MASTER, RED_COMMANDER } from "./constants/constants"; +import { ServerStatusPanel } from "./panels/serverstatuspanel"; var map: Map; @@ -28,6 +29,7 @@ var atc: ATC; var unitInfoPanel: UnitInfoPanel; var connectionStatusPanel: ConnectionStatusPanel; +var serverStatusPanel: ServerStatusPanel; var unitControlPanel: UnitControlPanel; var mouseInfoPanel: MouseInfoPanel; var logPanel: LogPanel; @@ -53,9 +55,10 @@ function setup() { unitInfoPanel = new UnitInfoPanel("unit-info-panel"); unitControlPanel = new UnitControlPanel("unit-control-panel"); connectionStatusPanel = new ConnectionStatusPanel("connection-status-panel"); + serverStatusPanel = new ServerStatusPanel("server-status-panel"); mouseInfoPanel = new MouseInfoPanel("mouse-info-panel"); hotgroupPanel = new HotgroupPanel("hotgroup-panel"); - //logPanel = new LogPanel("log-panel"); + /* Popups */ infoPopup = new Popup("info-popup"); @@ -247,6 +250,10 @@ export function getConnectionStatusPanel() { return connectionStatusPanel; } +export function getServerStatusPanel() { + return serverStatusPanel; +} + export function getHotgroupPanel() { return hotgroupPanel; } diff --git a/client/src/panels/connectionstatuspanel.ts b/client/src/panels/connectionstatuspanel.ts index 686595c2..54a3f7f6 100644 --- a/client/src/panels/connectionstatuspanel.ts +++ b/client/src/panels/connectionstatuspanel.ts @@ -8,12 +8,4 @@ export class ConnectionStatusPanel extends Panel { update(connected: boolean) { this.getElement().toggleAttribute( "data-is-connected", connected ); } - - setMetrics(frameRate: number, load: number) { - const dt = this.getElement().querySelector("dt"); - if (dt) { - dt.dataset["framerate"] = String(frameRate); - dt.dataset["load"] = String(load); - } - } } \ No newline at end of file diff --git a/client/src/panels/serverstatuspanel.ts b/client/src/panels/serverstatuspanel.ts new file mode 100644 index 00000000..33cb1b7a --- /dev/null +++ b/client/src/panels/serverstatuspanel.ts @@ -0,0 +1,26 @@ +import { Panel } from "./panel"; + +export class ServerStatusPanel extends Panel { + constructor(ID: string) { + super(ID); + } + + update(frameRate: number, load: number) { + const frameRateEl = this.getElement().querySelector("#server-frame-rate"); + if (frameRateEl) { + frameRateEl.textContent = `${frameRate}`; + frameRateEl.classList.toggle("fps-high", frameRate >= 60) + frameRateEl.classList.toggle("fps-medium", frameRate >= 30 && frameRate < 60) + frameRateEl.classList.toggle("fps-low", frameRate <= 30) + } + + const loadEl = this.getElement().querySelector("#server-load"); + if (loadEl) { + loadEl.textContent = `${load}`; + loadEl.classList.toggle("load-high", load >= 1000) + loadEl.classList.toggle("load-medium", load >= 100 && load < 1000) + loadEl.classList.toggle("load-low", load <= 100) + } + + } +} \ No newline at end of file diff --git a/client/src/server/server.ts b/client/src/server/server.ts index afa39e74..fcfcd4bb 100644 --- a/client/src/server/server.ts +++ b/client/src/server/server.ts @@ -1,5 +1,5 @@ import { LatLng } from 'leaflet'; -import { getConnectionStatusPanel, getInfoPopup, getMissionData, getUnitDataTable, getUnitsManager, setLoginStatus } from '..'; +import { getConnectionStatusPanel, getInfoPopup, getMissionData, getServerStatusPanel, getUnitDataTable, getUnitsManager, setLoginStatus } from '..'; import { GeneralSettings, Radio, TACAN } from '../@types/unit'; import { ROEs, emissionsCountermeasures, reactionsToThreat } from '../constants/constants'; @@ -59,8 +59,8 @@ export function GET(callback: CallableFunction, uri: string, options?: { time?: const result = JSON.parse(xmlHttp.responseText); lastUpdateTimes[uri] = callback(result); - if ("frameRate" in result && "load" in result) - getConnectionStatusPanel().setMetrics(result.frameRate, result.load); + if (result.frameRate && result.load) + getServerStatusPanel().update(result.frameRate, result.load); } } else if (xmlHttp.status == 401) { /* Bad credentials */ diff --git a/client/views/index.ejs b/client/views/index.ejs index 558d6b67..86ecd092 100644 --- a/client/views/index.ejs +++ b/client/views/index.ejs @@ -24,6 +24,7 @@ <%- include('panels/unitinfo.ejs') %> <%- include('panels/mouseinfo.ejs') %> <%- include('panels/connectionstatus.ejs') %> + <%- include('panels/serverstatus.ejs') %> <%- include('panels/hotgroup.ejs') %> <%- include('panels/navbar.ejs') %> diff --git a/client/views/panels/serverstatus.ejs b/client/views/panels/serverstatus.ejs new file mode 100644 index 00000000..6cf7d63b --- /dev/null +++ b/client/views/panels/serverstatus.ejs @@ -0,0 +1,10 @@ +
+
+
Server frame rate:
+
+
+
+
Olympus load:
+
+
+
\ No newline at end of file