From e69294b98c07dcefd05c5e55af98717dcc287c92 Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Wed, 10 May 2023 16:13:55 +0200 Subject: [PATCH] Optimized transmission of data of dead units Dead units only transmit basedata. Empty fields and empty units are removed from update packages. --- client/src/panels/unitcontrolpanel.ts | 73 +++++++++++++---------- client/src/panels/unitinfopanel.ts | 2 +- client/src/units/unit.ts | 6 +- scripts/OlympusCommand.lua | 6 +- src/core/src/unit.cpp | 86 ++++++++++++++++----------- src/core/src/unitsmanager.cpp | 4 +- 6 files changed, 102 insertions(+), 75 deletions(-) diff --git a/client/src/panels/unitcontrolpanel.ts b/client/src/panels/unitcontrolpanel.ts index 38b964ab..75056e4a 100644 --- a/client/src/panels/unitcontrolpanel.ts +++ b/client/src/panels/unitcontrolpanel.ts @@ -72,8 +72,9 @@ export class UnitControlPanel extends Panel { this.#advancedSettingsDialog = document.querySelector("#advanced-settings-dialog"); - document.addEventListener("unitUpdated", (e: CustomEvent) => { if (e.detail.getSelected()) this.update() }); - document.addEventListener("unitsSelection", (e: CustomEvent) => { this.show(); this.addButtons(); this.update()}); + window.setInterval(() => {this.update();}, 25); + + document.addEventListener("unitsSelection", (e: CustomEvent) => { this.show(); this.addButtons();}); document.addEventListener("clearSelection", () => { this.hide() }); document.addEventListener("applyAdvancedSettings", () => {this.#applyAdvancedSettings();}) document.addEventListener("showAdvancedSettings", () => { @@ -94,45 +95,53 @@ export class UnitControlPanel extends Panel { addButtons() { var units = getUnitsManager().getSelectedUnits(); - this.getElement().querySelector("#selected-units-container")?.replaceChildren(...units.map((unit: Unit, index: number) => { - let database: UnitDatabase | null; - if (unit instanceof Aircraft) - database = aircraftDatabase; - else if (unit instanceof GroundUnit) - database = groundUnitsDatabase; - else - database = null; // TODO add databases for other unit types + if (units.length < 20) { + this.getElement().querySelector("#selected-units-container")?.replaceChildren(...units.map((unit: Unit, index: number) => { + let database: UnitDatabase | null; + if (unit instanceof Aircraft) + database = aircraftDatabase; + else if (unit instanceof GroundUnit) + database = groundUnitsDatabase; + else + database = null; // TODO add databases for other unit types - var button = document.createElement("button"); - var callsign = unit.getBaseData().unitName || ""; + var button = document.createElement("button"); + var callsign = unit.getBaseData().unitName || ""; - button.setAttribute("data-short-label", database?.getByName(unit.getBaseData().name)?.shortLabel || ""); - button.setAttribute("data-callsign", callsign); + button.setAttribute("data-short-label", database?.getByName(unit.getBaseData().name)?.shortLabel || unit.getBaseData().name); + button.setAttribute("data-callsign", callsign); - button.setAttribute("data-coalition", unit.getMissionData().coalition); - button.classList.add("pill", "highlight-coalition") + button.setAttribute("data-coalition", unit.getMissionData().coalition); + button.classList.add("pill", "highlight-coalition") - button.addEventListener("click", () => { - getUnitsManager().deselectAllUnits(); - getUnitsManager().selectUnit(unit.ID, true); - }); - return (button); - })); + button.addEventListener("click", () => { + getUnitsManager().deselectAllUnits(); + getUnitsManager().selectUnit(unit.ID, true); + }); + return (button); + })); + } else { + var el = document.createElement("div"); + el.innerText = "Too many units selected" + this.getElement().querySelector("#selected-units-container")?.replaceChildren(el); + } } update() { - var units = getUnitsManager().getSelectedUnits(); - this.getElement().querySelector("#advanced-settings-div")?.classList.toggle("hide", units.length != 1); - if (this.getElement() != null && units.length > 0) { - this.#showFlightControlSliders(units); + if (this.getVisible()){ + var units = getUnitsManager().getSelectedUnits(); + this.getElement().querySelector("#advanced-settings-div")?.classList.toggle("hide", units.length != 1); + if (this.getElement() != null && units.length > 0) { + this.#showFlightControlSliders(units); - this.#optionButtons["ROE"].forEach((button: HTMLButtonElement) => { - button.classList.toggle("selected", units.every((unit: Unit) => unit.getOptionsData().ROE === button.value)) - }); + this.#optionButtons["ROE"].forEach((button: HTMLButtonElement) => { + button.classList.toggle("selected", units.every((unit: Unit) => unit.getOptionsData().ROE === button.value)) + }); - this.#optionButtons["reactionToThreat"].forEach((button: HTMLButtonElement) => { - button.classList.toggle("selected", units.every((unit: Unit) => unit.getOptionsData().reactionToThreat === button.value)) - }); + this.#optionButtons["reactionToThreat"].forEach((button: HTMLButtonElement) => { + button.classList.toggle("selected", units.every((unit: Unit) => unit.getOptionsData().reactionToThreat === button.value)) + }); + } } } diff --git a/client/src/panels/unitinfopanel.ts b/client/src/panels/unitinfopanel.ts index 19c3646e..4d4eb77e 100644 --- a/client/src/panels/unitinfopanel.ts +++ b/client/src/panels/unitinfopanel.ts @@ -54,7 +54,7 @@ export class UnitInfoPanel extends Panel { const baseData = unit.getBaseData(); /* Set the unit info */ - this.#unitLabel.innerText = aircraftDatabase.getByName(baseData.name)?.label || ""; + this.#unitLabel.innerText = aircraftDatabase.getByName(baseData.name)?.label || baseData.name; this.#unitName.innerText = baseData.unitName; this.#unitControl.innerText = ( ( baseData.AI ) ? "AI" : "Human" ) + " controlled"; // this.#groupName.innerText = baseData.groupName; diff --git a/client/src/units/unit.ts b/client/src/units/unit.ts index 64463133..971cff02 100644 --- a/client/src/units/unit.ts +++ b/client/src/units/unit.ts @@ -141,9 +141,9 @@ export class Unit extends Marker { setData(data: UpdateData) { /* Check if data has changed comparing new values to old values */ - const positionChanged = (data.flightData.latitude != undefined && data.flightData.longitude != undefined && (this.getFlightData().latitude != data.flightData.latitude || this.getFlightData().longitude != data.flightData.longitude)); - const headingChanged = (data.flightData.heading != undefined && this.getFlightData().heading != data.flightData.heading); - const aliveChanged = (data.baseData.alive != undefined && this.getBaseData().alive != data.baseData.alive); + const positionChanged = (data.flightData != undefined && data.flightData.latitude != undefined && data.flightData.longitude != undefined && (this.getFlightData().latitude != data.flightData.latitude || this.getFlightData().longitude != data.flightData.longitude)); + const headingChanged = (data.flightData != undefined && data.flightData.heading != undefined && this.getFlightData().heading != data.flightData.heading); + const aliveChanged = (data.baseData != undefined && data.baseData.alive != undefined && this.getBaseData().alive != data.baseData.alive); var updateMarker = (positionChanged || headingChanged || aliveChanged || !getMap().hasLayer(this)) if (data.baseData != undefined) diff --git a/scripts/OlympusCommand.lua b/scripts/OlympusCommand.lua index 24a19810..c4ff27f1 100644 --- a/scripts/OlympusCommand.lua +++ b/scripts/OlympusCommand.lua @@ -48,9 +48,11 @@ end function Olympus.getCountryIDByCoalition(coalition) local countryID = 0 if coalition == 'red' then - countryID = country.id.RUSSIA + countryID = country.id.CJTF_RED + elseif coalition == 'blue' then + countryID = country.id.CJTF_BLUE else - countryID = country.id.USA + countryID = country.id.UN_PEACEKEEPERS end return countryID end diff --git a/src/core/src/unit.cpp b/src/core/src/unit.cpp index 43f9c316..e68e1ccb 100644 --- a/src/core/src/unit.cpp +++ b/src/core/src/unit.cpp @@ -29,8 +29,8 @@ Unit::Unit(json::value json, int ID) : addMeasure(L"radioCallsign", json::value(radioCallsign)); addMeasure(L"radioCallsignNumber", json::value(radioCallsignNumber)); - setROE(L"Designated"); - setReactionToThreat(L"Evade"); + addMeasure(L"ROE", json::value(L"Designated")); + addMeasure(L"reactionToThreat", json::value(L"Evade")); } Unit::~Unit() @@ -119,45 +119,59 @@ json::value Unit::getData(long long time) if (measures.find(key) != measures.end() && measures[key]->getTime() > time) json[L"baseData"][key] = measures[key]->getValue(); } + if (json[L"baseData"].size() == 0) + json.erase(L"baseData"); - /********** Flight data **********/ - json[L"flightData"] = json::value::object(); - for (auto key : { L"latitude", L"longitude", L"altitude", L"speed", L"heading"}) - { - if (measures.find(key) != measures.end() && measures[key]->getTime() > time) - json[L"flightData"][key] = measures[key]->getValue(); - } + if (alive) { + /********** Flight data **********/ + json[L"flightData"] = json::value::object(); + for (auto key : { L"latitude", L"longitude", L"altitude", L"speed", L"heading" }) + { + if (measures.find(key) != measures.end() && measures[key]->getTime() > time) + json[L"flightData"][key] = measures[key]->getValue(); + } + if (json[L"flightData"].size() == 0) + json.erase(L"flightData"); - /********** Mission data **********/ - json[L"missionData"] = json::value::object(); - for (auto key : { L"fuel", L"ammo", L"targets", L"hasTask", L"coalition", L"flags"}) - { - if (measures.find(key) != measures.end() && measures[key]->getTime() > time) - json[L"missionData"][key] = measures[key]->getValue(); - } + /********** Mission data **********/ + json[L"missionData"] = json::value::object(); + for (auto key : { L"fuel", L"ammo", L"targets", L"hasTask", L"coalition", L"flags" }) + { + if (measures.find(key) != measures.end() && measures[key]->getTime() > time) + json[L"missionData"][key] = measures[key]->getValue(); + } + if (json[L"missionData"].size() == 0) + json.erase(L"missionData"); - /********** Formation data **********/ - json[L"formationData"] = json::value::object(); - for (auto key : { L"leaderID" }) - { - if (measures.find(key) != measures.end() && measures[key]->getTime() > time) - json[L"formationData"][key] = measures[key]->getValue(); - } + /********** Formation data **********/ + json[L"formationData"] = json::value::object(); + for (auto key : { L"leaderID" }) + { + if (measures.find(key) != measures.end() && measures[key]->getTime() > time) + json[L"formationData"][key] = measures[key]->getValue(); + } + if (json[L"formationData"].size() == 0) + json.erase(L"formationData"); - /********** Task data **********/ - json[L"taskData"] = json::value::object(); - for (auto key : { L"currentState", L"currentTask", L"targetSpeed", L"targetAltitude", L"activePath", L"isTanker", L"isAWACS", L"TACANChannel", L"TACANXY", L"TACANCallsign", L"radioFrequency", L"radioCallsign", L"radioCallsignNumber"}) - { - if (measures.find(key) != measures.end() && measures[key]->getTime() > time) - json[L"taskData"][key] = measures[key]->getValue(); - } + /********** Task data **********/ + json[L"taskData"] = json::value::object(); + for (auto key : { L"currentState", L"currentTask", L"targetSpeed", L"targetAltitude", L"activePath", L"isTanker", L"isAWACS", L"TACANChannel", L"TACANXY", L"TACANCallsign", L"radioFrequency", L"radioCallsign", L"radioCallsignNumber" }) + { + if (measures.find(key) != measures.end() && measures[key]->getTime() > time) + json[L"taskData"][key] = measures[key]->getValue(); + } + if (json[L"taskData"].size() == 0) + json.erase(L"taskData"); - /********** Options data **********/ - json[L"optionsData"] = json::value::object(); - for (auto key : { L"ROE", L"reactionToThreat" }) - { - if (measures.find(key) != measures.end() && measures[key]->getTime() > time) - json[L"optionsData"][key] = measures[key]->getValue(); + /********** Options data **********/ + json[L"optionsData"] = json::value::object(); + for (auto key : { L"ROE", L"reactionToThreat" }) + { + if (measures.find(key) != measures.end() && measures[key]->getTime() > time) + json[L"optionsData"][key] = measures[key]->getValue(); + } + if (json[L"optionsData"].size() == 0) + json.erase(L"optionsData"); } return json; diff --git a/src/core/src/unitsmanager.cpp b/src/core/src/unitsmanager.cpp index a04a19d7..bd05a61c 100644 --- a/src/core/src/unitsmanager.cpp +++ b/src/core/src/unitsmanager.cpp @@ -97,7 +97,9 @@ void UnitsManager::getData(json::value& answer, long long time) auto unitsJson = json::value::object(); for (auto const& p : units) { - unitsJson[to_wstring(p.first)] = p.second->getData(time); + auto unitJson = p.second->getData(time); + if (unitJson.size() > 0) + unitsJson[to_wstring(p.first)] = p.second->getData(time); } answer[L"units"] = unitsJson; }