You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
6.5 KiB
JavaScript
204 lines
6.5 KiB
JavaScript
'use strict';
|
|
|
|
const path = require('path');
|
|
const ol = require('openlayers');
|
|
|
|
const { GUI } = require('./gui');
|
|
const ltmDecoder = require('./ltmDecoder');
|
|
const interval = require('./intervals');
|
|
const { globalSettings } = require('./globalSettings');
|
|
const i18n = require('./localization');
|
|
|
|
const groundstation = (function () {
|
|
|
|
let publicScope = {},
|
|
privateScope = {};
|
|
|
|
privateScope.activated = false;
|
|
privateScope.$viewport = null;
|
|
privateScope.$gsViewport = null;
|
|
privateScope.mapHandler = null;
|
|
privateScope.mapLayer = null;
|
|
privateScope.mapView = null;
|
|
|
|
privateScope.cursorStyle = null;
|
|
privateScope.cursorPosition = null;
|
|
privateScope.cursorFeature = null;
|
|
privateScope.cursorVector = null;
|
|
privateScope.cursorLayer = null;
|
|
|
|
privateScope.textGeometry = null;
|
|
privateScope.textFeature = null;
|
|
privateScope.textVector = null;
|
|
privateScope.textSource = null;
|
|
|
|
privateScope.mapInitiated = false;
|
|
|
|
publicScope.isActivated = function () {
|
|
return privateScope.activated;
|
|
};
|
|
|
|
publicScope.activate = function ($viewport) {
|
|
|
|
if (privateScope.activated) {
|
|
return;
|
|
}
|
|
|
|
interval.add('gsUpdateGui', privateScope.updateGui, 200);
|
|
|
|
privateScope.$viewport = $viewport;
|
|
|
|
privateScope.$viewport.find(".tab_container").hide();
|
|
privateScope.$viewport.find('#content').hide();
|
|
privateScope.$viewport.find('#status-bar').hide();
|
|
privateScope.$viewport.find('#connectbutton a.connect_state').text(i18n.getMessage('disconnect'));
|
|
privateScope.$viewport.find('#connectbutton a.connect').addClass('active');
|
|
|
|
privateScope.$gsViewport = $viewport.find('#view-groundstation');
|
|
privateScope.$gsViewport.show();
|
|
privateScope.mapInitiated = false;
|
|
|
|
setTimeout(privateScope.initMap, 100);
|
|
|
|
privateScope.activated = true;
|
|
GUI.log(i18n.getMessage('gsActivated'));
|
|
}
|
|
|
|
privateScope.initMap = function () {
|
|
|
|
//initialte layers
|
|
if (globalSettings.mapProviderType == 'bing') {
|
|
privateScope.mapLayer = new ol.source.BingMaps({
|
|
key: globalSettings.mapApiKey,
|
|
imagerySet: 'AerialWithLabels',
|
|
maxZoom: 19
|
|
});
|
|
} else if (globalSettings.mapProviderType == 'mapproxy') {
|
|
privateScope.mapLayer = new ol.source.TileWMS({
|
|
url: globalSettings.proxyURL,
|
|
params: { 'LAYERS': globalSettings.proxyLayer }
|
|
})
|
|
} else {
|
|
privateScope.mapLayer = new ol.source.OSM();
|
|
}
|
|
|
|
//initiate view
|
|
privateScope.mapView = new ol.View({
|
|
center: ol.proj.fromLonLat([0, 0]),
|
|
zoom: 3
|
|
});
|
|
|
|
//initiate map handler
|
|
privateScope.mapHandler = new ol.Map({
|
|
target: document.getElementById('groundstation-map'),
|
|
layers: [
|
|
new ol.layer.Tile({
|
|
source: privateScope.mapLayer
|
|
})
|
|
],
|
|
view: privateScope.mapView
|
|
});
|
|
};
|
|
|
|
publicScope.deactivate = function () {
|
|
|
|
if (!privateScope.activated) {
|
|
return;
|
|
}
|
|
|
|
interval.remove('gsUpdateGui');
|
|
|
|
if (privateScope.$viewport !== null) {
|
|
privateScope.$viewport.find(".tab_container").show();
|
|
privateScope.$viewport.find('#content').show();
|
|
privateScope.$viewport.find('#status-bar').show();
|
|
}
|
|
|
|
if (privateScope.$gsViewport !== null) {
|
|
privateScope.$gsViewport.hide();
|
|
}
|
|
|
|
privateScope.activated = false;
|
|
GUI.log(i18n.getMessage('gsDeactivated'));
|
|
}
|
|
|
|
privateScope.updateGui = function () {
|
|
|
|
let telemetry = ltmDecoder.get();
|
|
|
|
if (telemetry.gpsFix && telemetry.gpsFix > 1) {
|
|
|
|
let lat = telemetry.latitude / 10000000;
|
|
let lon = telemetry.longitude / 10000000;
|
|
|
|
//On first initiation, set zoom to 15
|
|
if (!privateScope.mapInitiated) {
|
|
|
|
//Place UAV on the map
|
|
privateScope.cursorStyle = new ol.style.Style({
|
|
image: new ol.style.Icon(({
|
|
anchor: [0.5, 0.5],
|
|
opacity: 1,
|
|
scale: 0.6,
|
|
src: path.join(__dirname, './../images/icons/icon_mission_airplane.png')
|
|
}))
|
|
});
|
|
privateScope.cursorPosition = new ol.geom.Point(ol.proj.fromLonLat([lon, lat]));
|
|
|
|
privateScope.cursorFeature = new ol.Feature({
|
|
geometry: privateScope.cursorPosition
|
|
});
|
|
|
|
privateScope.cursorFeature.setStyle(privateScope.cursorStyle);
|
|
|
|
privateScope.cursorVector = new ol.source.Vector({
|
|
features: [privateScope.cursorFeature]
|
|
});
|
|
privateScope.cursorLayer = new ol.layer.Vector({
|
|
source: privateScope.cursorVector
|
|
});
|
|
|
|
privateScope.mapHandler.addLayer(privateScope.cursorLayer);
|
|
|
|
privateScope.mapView.setZoom(17);
|
|
|
|
privateScope.mapInitiated = true;
|
|
}
|
|
|
|
//Update map center
|
|
let position = ol.proj.fromLonLat([lon, lat]);
|
|
privateScope.mapView.setCenter(position);
|
|
|
|
//Update position of cursor
|
|
privateScope.cursorPosition.setCoordinates(position);
|
|
//Update orientation of cursor
|
|
privateScope.cursorStyle.getImage().setRotation((telemetry.heading / 360.0) * 6.28318);
|
|
|
|
|
|
|
|
//Update text
|
|
privateScope.$viewport.find("#gs-telemetry-latitude").html(lat);
|
|
privateScope.$viewport.find("#gs-telemetry-longitude").html(lon);
|
|
}
|
|
|
|
privateScope.$viewport.find("#gs-telemetry-altitude").html((telemetry.altitude / 100.0).toFixed(2) + 'm');
|
|
privateScope.$viewport.find("#gs-telemetry-voltage").html((telemetry.voltage / 1000.0).toFixed(2) + 'V');
|
|
privateScope.$viewport.find("#gs-telemetry-sats").html(telemetry.gpsSats);
|
|
privateScope.$viewport.find("#gs-telemetry-speed").html(telemetry.groundSpeed.toFixed(0) + 'm/s');
|
|
|
|
let fixText = '';
|
|
if (telemetry.gpsFix == 3) {
|
|
fixText = '3D';
|
|
} else if (telemetry.gpsFix == 2) {
|
|
fixText = '2D';
|
|
} else {
|
|
fixText = 'No fix';
|
|
}
|
|
|
|
privateScope.$viewport.find("#gs-telemetry-fix").html(fixText);
|
|
};
|
|
|
|
return publicScope;
|
|
})();
|
|
|
|
module.exports = groundstation; |