diff options
author | Konstantin Sharlaimov <konstantin.sharlaimov@gmail.com> | 2018-02-17 14:27:54 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-17 14:27:54 +0300 |
commit | 23ef794d5b20def7693908bfc1f9f5ce132eaff7 (patch) | |
tree | be321465b42d90d812c4c03c79f15abe91e9c8dc | |
parent | 5a1238cc99fb82f698aaf49ee047fba4cf78a869 (diff) | |
parent | b24f3a29d656ca7dc09f4bf5f2858400eeb089c2 (diff) |
Merge pull request #324 from Afinogen/mission-planer1.9.0
Mission planer
-rwxr-xr-x | _locales/en/messages.json | 39 | ||||
-rw-r--r-- | js/fc.js | 15 | ||||
-rw-r--r-- | js/gui.js | 3 | ||||
-rw-r--r-- | js/msp/MSPCodes.js | 4 | ||||
-rw-r--r-- | js/msp/MSPHelper.js | 130 | ||||
-rw-r--r-- | main.css | 11 | ||||
-rwxr-xr-x | main.html | 9 | ||||
-rw-r--r-- | main.js | 3 | ||||
-rw-r--r-- | package-lock.json | 413 | ||||
-rwxr-xr-x | package.json | 2 | ||||
-rw-r--r-- | src/css/tabs/mission_planer.css | 122 | ||||
-rw-r--r-- | tabs/mission_control.html | 76 | ||||
-rw-r--r-- | tabs/mission_control.js | 474 |
13 files changed, 1055 insertions, 246 deletions
diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 3763ea04..41a8ad07 100755 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -2328,6 +2328,45 @@ "downloadUpdatesBtn": { "message": "Download new app" }, + "tabMissionControl": { + "message": "Mission Control" + }, + "loadMissionButton": { + "message": "Load mission from FC" + }, + "saveMissionButton": { + "message": "Save mission to FC" + }, + "loadEepromMissionButton": { + "message": "Load Eeprom mission" + }, + "saveEepromMissionButton": { + "message": "Save Eeprom mission" + }, + "editPointHead": { + "message": "Edit point" + }, + "editPointButtonSave": { + "message": "Save" + }, + "editPointButtonRemove": { + "message": "Remove" + }, + "removeAllPointButtonSave": { + "message": "Remove all points" + }, + "missionTotalInformationHead": { + "message": "Total information" + }, + "useOnlyStandalone": { + "message": "Use stand-alone application.<br> Please visit the <a href=\"https://github.com/iNavFlight/inav-configurator/releases\" target=\"_blank\">website</a> to read the release notes and download." + }, + "eeprom_load_ok": { + "message": "EEPROM <span style=\"color: #37a8db\">loaded</span>" + }, + "confirm_delete_all_points": { + "message": "Do you really want to delete all points?" + }, "servoMixer": { "message": "Servo mixer" }, @@ -23,6 +23,7 @@ var CONFIG, MOTOR_DATA, SERVO_DATA, GPS_DATA, + MISSION_PLANER, ANALOG, ARMING_CONFIG, FC_CONFIG, @@ -197,6 +198,20 @@ var FC = { packetCount: 0 }; + MISSION_PLANER = { + maxWaypoints: 0, + isValidMission: 0, + countBusyPoints: 0, + bufferPoint: { + number: 0, + action: 0, + lat: 0, + lon: 0, + alt: 0, + endMission: 0 + } + }; + ANALOG = { voltage: 0, mAhdrawn: 0, @@ -38,7 +38,8 @@ var GUI_control = function () { 'setup', 'osd', 'profiles', - 'advanced_tuning' + 'advanced_tuning', + 'mission_control' ]; this.allowedTabs = this.defaultAllowedTabsWhenDisconnected; diff --git a/js/msp/MSPCodes.js b/js/msp/MSPCodes.js index 2ac5e26a..69cd7ace 100644 --- a/js/msp/MSPCodes.js +++ b/js/msp/MSPCodes.js @@ -20,7 +20,9 @@ var MSPCodes = { MSP_POSITION_ESTIMATION_CONFIG: 16, MSP_SET_POSITION_ESTIMATION_CONFIG: 17, - + MSP_WP_MISSION_LOAD: 18, + MSP_WP_MISSION_SAVE: 19, + MSP_WP_GETINFO: 20, MSP_RTH_AND_LAND_CONFIG: 21, MSP_SET_RTH_AND_LAND_CONFIG: 22, MSP_FW_CONFIG: 23, diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 5c150eb7..f3601d6d 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -42,7 +42,7 @@ var mspHelper = (function (gui) { 'BLACKBOX': 7, 'TELEMETRY_MAVLINK': 8, 'TELEMETRY_IBUS': 9, - 'RUNCAM_DEVICE_CONTROL' : 10, + 'RUNCAM_DEVICE_CONTROL': 10, 'TBS_SMARTAUDIO': 11, 'IRC_TRAMP': 12 }; @@ -138,14 +138,14 @@ var mspHelper = (function (gui) { case MSPCodes.MSP_SENSOR_STATUS: SENSOR_STATUS.isHardwareHealthy = data.getUint8(0); - SENSOR_STATUS.gyroHwStatus = data.getUint8(1); - SENSOR_STATUS.accHwStatus = data.getUint8(2); - SENSOR_STATUS.magHwStatus = data.getUint8(3); - SENSOR_STATUS.baroHwStatus = data.getUint8(4); - SENSOR_STATUS.gpsHwStatus = data.getUint8(5); - SENSOR_STATUS.rangeHwStatus = data.getUint8(6); - SENSOR_STATUS.speedHwStatus = data.getUint8(7); - SENSOR_STATUS.flowHwStatus = data.getUint8(8); + SENSOR_STATUS.gyroHwStatus = data.getUint8(1); + SENSOR_STATUS.accHwStatus = data.getUint8(2); + SENSOR_STATUS.magHwStatus = data.getUint8(3); + SENSOR_STATUS.baroHwStatus = data.getUint8(4); + SENSOR_STATUS.gpsHwStatus = data.getUint8(5); + SENSOR_STATUS.rangeHwStatus = data.getUint8(6); + SENSOR_STATUS.speedHwStatus = data.getUint8(7); + SENSOR_STATUS.flowHwStatus = data.getUint8(8); if (semver.gte(CONFIG.flightControllerVersion, "1.5.0")) { sensor_status_ex(SENSOR_STATUS); } @@ -345,7 +345,12 @@ var mspHelper = (function (gui) { } break; case MSPCodes.MSP_WP: - console.log(data); + MISSION_PLANER.bufferPoint.number = data.getUint8(0); + MISSION_PLANER.bufferPoint.action = data.getUint8(1); + MISSION_PLANER.bufferPoint.lat = data.getInt32(2, true) / 10000000; + MISSION_PLANER.bufferPoint.lon = data.getInt32(6, true) / 10000000; + MISSION_PLANER.bufferPoint.alt = data.getInt32(10, true); + break; case MSPCodes.MSP_BOXIDS: //noinspection JSUndeclaredVariable @@ -1144,6 +1149,23 @@ var mspHelper = (function (gui) { case MSPCodes.MSPV2_SET_SETTING: console.log("Setting set"); break; + case MSPCodes.MSP_WP_GETINFO: + // Reserved for waypoint capabilities data.getUint8(0); + MISSION_PLANER.maxWaypoints = data.getUint8(1); + MISSION_PLANER.isValidMission = data.getUint8(2); + MISSION_PLANER.countBusyPoints = data.getUint8(3); + break; + case MSPCodes.MSP_SET_WP: + console.log('Point saved'); + break; + case MSPCodes.MSP_WP_MISSION_SAVE: + // buffer.push(0); + console.log(data); + + break; + case MSPCodes.MSP_WP_MISSION_LOAD: + console.log('Mission load'); + break; default: console.log('Unknown code detected: ' + dataHandler.code); } else { @@ -1323,7 +1345,7 @@ var mspHelper = (function (gui) { buffer.push(highByte(FAILSAFE_CONFIG.failsafe_fw_yaw_rate)); buffer.push(lowByte(FAILSAFE_CONFIG.failsafe_stick_motion_threshold)); buffer.push(highByte(FAILSAFE_CONFIG.failsafe_stick_motion_threshold)); - } + } if (semver.gte(CONFIG.flightControllerVersion, "1.7.4")) { buffer.push(lowByte(FAILSAFE_CONFIG.failsafe_min_distance)); buffer.push(highByte(FAILSAFE_CONFIG.failsafe_min_distance)); @@ -1624,6 +1646,44 @@ var mspHelper = (function (gui) { buffer.push(SENSOR_CONFIG.opflow); break; + case MSPCodes.MSP_SET_WP: + buffer.push(MISSION_PLANER.bufferPoint.number); // sbufReadU8(src); // number + buffer.push(MISSION_PLANER.bufferPoint.action); // sbufReadU8(src); // action + buffer.push(specificByte(MISSION_PLANER.bufferPoint.lat, 0)); // sbufReadU32(src); // lat + buffer.push(specificByte(MISSION_PLANER.bufferPoint.lat, 1)); + buffer.push(specificByte(MISSION_PLANER.bufferPoint.lat, 2)); + buffer.push(specificByte(MISSION_PLANER.bufferPoint.lat, 3)); + buffer.push(specificByte(MISSION_PLANER.bufferPoint.lon, 0)); // sbufReadU32(src); // lon + buffer.push(specificByte(MISSION_PLANER.bufferPoint.lon, 1)); + buffer.push(specificByte(MISSION_PLANER.bufferPoint.lon, 2)); + buffer.push(specificByte(MISSION_PLANER.bufferPoint.lon, 3)); + buffer.push(specificByte(MISSION_PLANER.bufferPoint.alt, 0)); // sbufReadU32(src); // to set altitude (cm) + buffer.push(specificByte(MISSION_PLANER.bufferPoint.alt, 1)); + buffer.push(specificByte(MISSION_PLANER.bufferPoint.alt, 2)); + buffer.push(specificByte(MISSION_PLANER.bufferPoint.alt, 3)); + buffer.push(lowByte(0)); //sbufReadU16(src); // P1 + buffer.push(highByte(0)); + buffer.push(lowByte(0)); //sbufReadU16(src); // P2 + buffer.push(highByte(0)); + buffer.push(lowByte(0)); //sbufReadU16(src); // P3 + buffer.push(highByte(0)); + buffer.push(MISSION_PLANER.bufferPoint.endMission); //sbufReadU8(src); // future: to set nav flag + break; + case MSPCodes.MSP_WP: + console.log(MISSION_PLANER.bufferPoint.number); + buffer.push(MISSION_PLANER.bufferPoint.number+1); + + break; + case MSPCodes.MSP_WP_MISSION_SAVE: + // buffer.push(0); + console.log(buffer); + + break; + case MSPCodes.MSP_WP_MISSION_LOAD: + // buffer.push(0); + console.log(buffer); + + break; default: return false; } @@ -1649,9 +1709,9 @@ var mspHelper = (function (gui) { self.sendBlackboxConfiguration = function (onDataCallback) { var message = [ - BLACKBOX.blackboxDevice & 0xFF, - BLACKBOX.blackboxRateNum & 0xFF, - BLACKBOX.blackboxRateDenom & 0xFF + BLACKBOX.blackboxDevice & 0xFF, + BLACKBOX.blackboxRateNum & 0xFF, + BLACKBOX.blackboxRateDenom & 0xFF ]; //noinspection JSUnusedLocalSymbols @@ -2095,7 +2155,7 @@ var mspHelper = (function (gui) { MSP.send_message(MSPCodes.MSP_IDENT, false, false, callback); }; - self.loadINAVPidConfig = function(callback) { + self.loadINAVPidConfig = function (callback) { if (semver.gt(CONFIG.flightControllerVersion, "1.3.0")) { MSP.send_message(MSPCodes.MSP_INAV_PID, false, false, callback); } else { @@ -2107,7 +2167,7 @@ var mspHelper = (function (gui) { MSP.send_message(MSPCodes.MSP_LOOP_TIME, false, false, callback); }; - self.loadAdvancedConfig = function(callback) { + self.loadAdvancedConfig = function (callback) { if (semver.gte(CONFIG.flightControllerVersion, "1.3.0")) { MSP.send_message(MSPCodes.MSP_ADVANCED_CONFIG, false, false, callback); } else { @@ -2288,7 +2348,7 @@ var mspHelper = (function (gui) { }; self.saveRxConfig = function (callback) { - if(semver.gte(CONFIG.apiVersion, "1.21.0")) { + if (semver.gte(CONFIG.apiVersion, "1.21.0")) { MSP.send_message(MSPCodes.MSP_SET_RX_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_RX_CONFIG), false, callback); } else { callback(); @@ -2296,7 +2356,7 @@ var mspHelper = (function (gui) { }; self.saveSensorConfig = function (callback) { - if(semver.gte(CONFIG.flightControllerVersion, "1.5.0")) { + if (semver.gte(CONFIG.flightControllerVersion, "1.5.0")) { MSP.send_message(MSPCodes.MSP_SET_SENSOR_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_SENSOR_CONFIG), false, callback); } else { callback(); @@ -2383,20 +2443,28 @@ var mspHelper = (function (gui) { } }; - self._getSetting = function(name) { + self.getMissionInfo = function (callback) { + if (semver.gte(CONFIG.flightControllerVersion, "1.8.1")) { + MSP.send_message(MSPCodes.MSP_WP_GETINFO, false, false, callback); + } else { + callback(); + } + }; + + self._getSetting = function (name) { var promise; if (this._settings) { promise = Promise.resolve(this._settings); } else { - promise = new Promise(function(resolve, reject) { + promise = new Promise(function (resolve, reject) { var $this = this; $.ajax({ url: chrome.runtime.getURL('/resources/settings.json'), dataType: 'json', - error: function(jqXHR, text, error) { + error: function (jqXHR, text, error) { reject(error); }, - success: function(data) { + success: function (data) { $this._settings = data; resolve(data); } @@ -2408,19 +2476,19 @@ var mspHelper = (function (gui) { }); }; - self._encodeSettingName = function(name, data) { + self._encodeSettingName = function (name, data) { for (var ii = 0; ii < name.length; ii++) { data.push(name.charCodeAt(ii)); } data.push(0); }; - self.getSetting = function(name, callback) { + self.getSetting = function (name, callback) { var $this = this; return this._getSetting(name).then(function (setting) { - var data = []; + var data = []; $this._encodeSettingName(name, data); - MSP.send_message(MSPCodes.MSPV2_SETTING, data, false, function(resp) { + MSP.send_message(MSPCodes.MSPV2_SETTING, data, false, function (resp) { var value; switch (setting.type) { case "uint8_t": @@ -2457,7 +2525,7 @@ var mspHelper = (function (gui) { }); }; - self.encodeSetting = function(name, value) { + self.encodeSetting = function (name, value) { var $this = this; return this._getSetting(name).then(function (setting) { if (setting.table) { @@ -2500,15 +2568,15 @@ var mspHelper = (function (gui) { }); }; - self.setSetting = function(name, value, callback) { + self.setSetting = function (name, value, callback) { this.encodeSetting(name, value).then(function (data) { MSP.send_message(MSPCodes.MSPV2_SET_SETTING, data, false, callback); }); }; - self.getRTC = function(callback) { + self.getRTC = function (callback) { if (semver.gt(CONFIG.flightControllerVersion, "1.7.3")) { - MSP.send_message(MSPCodes.MSP_RTC, false, false, function(resp) { + MSP.send_message(MSPCodes.MSP_RTC, false, false, function (resp) { var seconds = resp.data.read32(); var millis = resp.data.readU16(); if (callback) { @@ -2520,7 +2588,7 @@ var mspHelper = (function (gui) { } }; - self.setRTC = function(callback) { + self.setRTC = function (callback) { if (semver.gt(CONFIG.flightControllerVersion, "1.7.3")) { var now = Date.now(); var secs = now / 1000; @@ -1107,6 +1107,17 @@ dialog { opacity: 0.5; } +.content_toolbar .btn-danger a { + background-color: #db250e; + border: 1px solid #b5480e; +} + +.content_toolbar .btn-danger a:hover { + background-color: #b5480e; + transition: all ease 0.2s; +} + + .toolbar_scroll_bottom .content_wrapper { /* content wrapper in view with toolbar in scroll bottom leave 50px space for the toolbar @@ -1,9 +1,11 @@ -<!DOCTYPE html> +<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <link type="text/css" rel="stylesheet" href="./build/styles.css" media="all"/> <script type="text/javascript" src="./build/script.js"></script> + <link type="text/css" rel="stylesheet" href="./build/map.css" media="all"/> + <script type="text/javascript" src="./build/map.js"></script> <title></title> </head> <body> @@ -14,7 +16,8 @@ <div class="modal__text" data-i18n="appUpdateNotificationDescription"></div> </div> <div class="modal__buttons modal__buttons--upbottom"> - <a href="https://github.com/iNavFlight/inav-configurator/releases" target="_blank" id="update-notification-download" class="modal__button modal__button--main modal__button--main--inline" data-i18n="downloadUpdatesBtn"></a> + <a href="https://github.com/iNavFlight/inav-configurator/releases" target="_blank" id="update-notification-download" + class="modal__button modal__button--main modal__button--main--inline" data-i18n="downloadUpdatesBtn"></a> <a id="update-notification-close" class="modal__button modal__button--main modal__button--main--inline" data-i18n="closeUpdateBtn"></a> </div> </div> @@ -185,6 +188,7 @@ <li class="tab_servos"><a href="#" data-i18n="tabServos" class="tabicon ic_servo" title="Servos"></a> </li> <li class="tab_gps"><a href="#" data-i18n="tabGPS" class="tabicon ic_gps" title="GPS"></a></li> + <li class="tab_mission_control"><a href="#" data-i18n="tabMissionControl" class="tabicon ic_mission" title="Mission Control"></a></li> <li class="tab_motors"><a href="#" data-i18n="tabMotorTesting" class="tabicon ic_motor" title="Motors"></a></li> <li class="tab_osd"><a href="#" data-i18n="tabOSD" class="tabicon ic_osd" title="OSD"></a></li> @@ -199,7 +203,6 @@ title="Onboard Logging"></a></li> <li class="tab_cli"><a href="#" data-i18n="tabCLI" class="tabicon ic_cli" title="CLI"></a></li> - <!--<li class=""><a href="#" class="tabicon ic_mission">Mission (spare icon)</a></li>--> <!--<li class=""><a href="#" class="tabicon ic_advanced">Advanced (spare icon)</a></li>--> <!--<li class=""><a href="#" class="tabicon ic_wizzard">Wizzard (spare icon)</a></li>--> </ul> @@ -189,6 +189,9 @@ $(document).ready(function () { case 'gps': TABS.gps.initialize(content_ready); break; + case 'mission_control': + TABS.mission_control.initialize(content_ready); + break; case 'motors': TABS.motors.initialize(content_ready); break; diff --git a/package-lock.json b/package-lock.json index d5346a6a..979d93f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,26 +1,13 @@ { "name": "inav-configurator", - "version": "1.7.3", + "version": "1.8.1", "lockfileVersion": 1, "requires": true, "dependencies": { - "@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=" - }, - "@mapbox/vector-tile": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.0.tgz", - "integrity": "sha1-xJX5clJb78zvzYOPRf+jfvO3D+g=", - "requires": { - "@mapbox/point-geometry": "0.1.0" - } - }, "abbrev": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { "version": "1.3.3", @@ -32,9 +19,9 @@ } }, "acorn": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", - "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" }, "after": { "version": "0.8.2", @@ -118,9 +105,9 @@ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, "aproba": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", - "integrity": "sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "archiver": { "version": "2.0.3", @@ -212,9 +199,9 @@ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" }, "asn1": { "version": "0.2.3", @@ -234,6 +221,11 @@ "lodash": "4.17.4" } }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -250,9 +242,9 @@ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, "babylon": { - "version": "7.0.0-beta.24", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.24.tgz", - "integrity": "sha512-k1yiJYz1Zt6/xfxx0OC7obTNOF5WktZ8P8z1y+7kwP4INOygqqgzolO5fse4jYIb3CzHyU7WNC38EjYa1wjEGQ==" + "version": "7.0.0-beta.19", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", + "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==" }, "backo2": { "version": "1.0.2", @@ -612,36 +604,44 @@ } }, "closure-util": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/closure-util/-/closure-util-1.22.0.tgz", - "integrity": "sha512-DX5IhSawO9838/fKNaH3Cx8jeeJGWORodHhTFkxCOVsr71OtXCfo/rtXsV24eq3iq31jdmgUQvlNIXEMHTlkWg==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/closure-util/-/closure-util-1.26.0.tgz", + "integrity": "sha512-zpWABEochWrY48soiEttuqJk/OSYscS9PcvKgHvKUefM29+R8rqx5Bp8KIZHR0Nsq1JrNgxg2VTmJ/IsqN5VOA==", "requires": { - "acorn": "5.0.3", - "async": "2.5.0", - "fs-extra": "3.0.1", + "acorn": "5.2.1", + "async": "2.6.0", + "fs-extra": "4.0.2", "gaze": "1.1.2", "get-down": "1.2.0", "glob": "7.1.2", "graceful-fs": "4.1.11", - "handlebars": "4.0.10", + "handlebars": "4.0.11", "lodash": "4.17.4", "minimatch": "3.0.4", "mkdirp": "0.5.1", "nomnom": "1.8.1", "npmlog": "4.1.2", - "rimraf": "2.6.1", - "send": "0.15.3", - "socket.io": "2.0.1", + "rimraf": "2.6.2", + "send": "0.16.1", + "socket.io": "2.0.4", "temp": "github:adam-lynch/node-temp#279c1350cb7e4f02515d91da9e35d39a40774016" }, "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "requires": { + "lodash": "4.17.4" + } + }, "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", "requires": { "graceful-fs": "4.1.11", - "jsonfile": "3.0.1", + "jsonfile": "4.0.0", "universalify": "0.1.1" } }, @@ -664,12 +664,20 @@ } }, "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "4.1.11" } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } } } }, @@ -1572,23 +1580,23 @@ } }, "engine.io": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.1.tgz", - "integrity": "sha1-CAUf+5UZB6MmfnLgvLPQ83fkZgs=", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.4.tgz", + "integrity": "sha1-PQIRtwpVLOhB/8fahiezAamkFi4=", "requires": { "accepts": "1.3.3", "base64id": "1.0.0", "cookie": "0.3.1", - "debug": "2.6.8", - "engine.io-parser": "2.1.1", + "debug": "2.6.9", + "engine.io-parser": "2.1.2", "uws": "0.14.5", - "ws": "2.3.1" + "ws": "3.3.3" }, "dependencies": { "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -1601,28 +1609,27 @@ } }, "engine.io-client": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.1.tgz", - "integrity": "sha1-QVqYUrrbFPoAj6PvHjFgjbZ2EyU=", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.4.tgz", + "integrity": "sha1-T88TcLRxY70s6b4nM5ckMDUNTqE=", "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", - "debug": "2.6.8", - "engine.io-parser": "2.1.1", + "debug": "2.6.9", + "engine.io-parser": "2.1.2", "has-cors": "1.1.0", "indexof": "0.0.1", - "parsejson": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "ws": "2.3.1", - "xmlhttprequest-ssl": "1.5.3", + "ws": "3.3.3", + "xmlhttprequest-ssl": "1.5.4", "yeast": "0.1.2" }, "dependencies": { "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -1635,12 +1642,12 @@ } }, "engine.io-parser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.1.tgz", - "integrity": "sha1-4Ps/DgRi9/WLt3waUun1p+JuRmg=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", "requires": { "after": "0.8.2", - "arraybuffer.slice": "0.0.6", + "arraybuffer.slice": "0.0.7", "base64-arraybuffer": "0.1.5", "blob": "0.0.4", "has-binary2": "1.0.2" @@ -1927,9 +1934,9 @@ } }, "fresh": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-exists-sync": { "version": "0.1.0", @@ -1958,7 +1965,7 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { - "aproba": "1.1.2", + "aproba": "1.2.0", "console-control-strings": "1.1.0", "has-unicode": "2.0.1", "object-assign": "4.1.1", @@ -2410,9 +2417,9 @@ } }, "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "requires": { "async": "1.5.2", "optimist": "0.6.1", @@ -2880,17 +2887,17 @@ "optional": true }, "jsdoc": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.4.tgz", - "integrity": "sha512-VmTw0J+2L16IxAe0JSDSAcH0F+DbZxaj8wN1AjHtKMQU/hO0ciIl5ZE93XqrrFIbknobuqHKJCXZj6+Hk57MjA==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", + "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", "requires": { - "babylon": "7.0.0-beta.24", - "bluebird": "3.5.0", + "babylon": "7.0.0-beta.19", + "bluebird": "3.5.1", "catharsis": "0.8.9", "escape-string-regexp": "1.0.5", "js2xmlparser": "3.0.0", "klaw": "2.0.0", - "marked": "0.3.6", + "marked": "0.3.9", "mkdirp": "0.5.1", "requizzle": "0.2.1", "strip-json-comments": "2.0.1", @@ -2899,9 +2906,9 @@ }, "dependencies": { "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" }, "klaw": { "version": "2.0.0", @@ -3187,7 +3194,7 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", "requires": { - "vlq": "0.2.2" + "vlq": "0.2.3" } }, "make-dir": { @@ -3211,9 +3218,9 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "marked": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", - "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=" + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.9.tgz", + "integrity": "sha512-nW5u0dxpXxHfkHzzrveY45gCbi+R4PaO4WRZYqZNl+vB0hVGeqlFn0aOg1c8AKL63TrNFn9Bm2UP4AdiZ9TPLw==" }, "merge": { "version": "1.2.0", @@ -3254,9 +3261,9 @@ } }, "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" }, "mime-db": { "version": "1.30.0", @@ -3300,9 +3307,9 @@ } }, "minizlib": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.0.3.tgz", - "integrity": "sha1-1cGr93vhVGGZUuJTM27Mq5sqMvU=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "requires": { "minipass": "2.2.1" } @@ -3414,7 +3421,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { - "abbrev": "1.1.0" + "abbrev": "1.1.1" } }, "normalize-path": { @@ -3617,41 +3624,48 @@ } }, "openlayers": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/openlayers/-/openlayers-4.3.3.tgz", - "integrity": "sha512-hFOPwplmgjgCyIrnXoVixtZeZ4mog84xpI9PLoXWiyO7iGmIH3/XxhBPuSLuvrHg+/huoFzA0OckRLvr3T2DAg==", - "requires": { - "@mapbox/vector-tile": "1.3.0", - "async": "2.5.0", - "closure-util": "1.22.0", - "fs-extra": "4.0.1", - "jsdoc": "3.5.4", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/openlayers/-/openlayers-4.6.4.tgz", + "integrity": "sha512-Oru7/xniirjech7H5zkMQSUj/JUymNveiE4vAwmyjAmcoNyO4zTRD/Pp7BPfxBPuAz45vDl78H1wEQD7RGWkGg==", + "requires": { + "async": "2.6.0", + "closure-util": "1.26.0", + "fs-extra": "4.0.3", + "jsdoc": "3.5.5", "nomnom": "1.8.1", - "pbf": "3.0.5", + "pbf": "3.1.0", "pixelworks": "1.1.0", "rbush": "2.0.1", - "rollup": "0.47.6", - "rollup-plugin-cleanup": "1.0.1", - "rollup-plugin-commonjs": "8.2.1", + "rollup": "0.52.3", + "rollup-plugin-cleanup": "2.0.0", + "rollup-plugin-commonjs": "8.2.6", "rollup-plugin-node-resolve": "3.0.0", "temp": "github:adam-lynch/node-temp#279c1350cb7e4f02515d91da9e35d39a40774016", "walk": "2.3.9" }, "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "requires": { + "lodash": "4.17.4" + } + }, "fs-extra": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz", - "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "requires": { "graceful-fs": "4.1.11", - "jsonfile": "3.0.1", + "jsonfile": "4.0.0", "universalify": "0.1.1" } }, "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "4.1.11" } @@ -3836,14 +3850,6 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "requires": { - "better-assert": "1.0.2" - } - }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -3899,9 +3905,9 @@ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" }, "pbf": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.0.5.tgz", - "integrity": "sha1-JPD6LL6xblxWpZAbt+nCrAyAWb4=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.1.0.tgz", + "integrity": "sha512-/hYJmIsTmh7fMkHAWWXJ5b8IKLWdjdlAFb3IHkRBn1XUhIYBChVGfVwmHEAV3UfXTxsP/AKfYTXTS/dCPxJd5w==", "requires": { "ieee754": "1.1.8", "resolve-protobuf-schema": "2.0.0" @@ -4054,9 +4060,9 @@ "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" }, "quickselect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.0.0.tgz", - "integrity": "sha1-AmMIGPmq5OyrJvAQP5jQYcF8WPM=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.0.1.tgz", + "integrity": "sha512-Jt30UQSzTbxf6L2bFTMabHtGtYUzQcvOY0a+s5brm8tzndV/XWifBIH9v5QKtH5gGCZ5RRDwRhdhGMDVHAEGNQ==" }, "randomatic": { "version": "1.1.7", @@ -4105,7 +4111,7 @@ "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.1.tgz", "integrity": "sha1-TPrKKMMGS8DudUMaG3mZDode76k=", "requires": { - "quickselect": "1.0.0" + "quickselect": "1.0.1" } }, "rc": { @@ -4308,14 +4314,14 @@ } }, "rollup": { - "version": "0.47.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.47.6.tgz", - "integrity": "sha512-bH3eWh7MzbiKTQcHQN7Ievqbs/yY7T+ZcJYboBYkp7BkRlAr2DXHPfiqlvlEH/M95giEBpinHEi/s9CVIgYT6w==" + "version": "0.52.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.52.3.tgz", + "integrity": "sha512-cw+vb9NqaTXlwJyb8G+Ve+uhhlVTcl1NKBkfANdeQqVcpZFilQgeNnAnNiu7MwfeXrqiKEGz+3R03a3zeFkmEQ==" }, "rollup-plugin-cleanup": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-1.0.1.tgz", - "integrity": "sha1-ygVsdP5uoheD+ZhRljsXPL6Ok1k=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-2.0.0.tgz", + "integrity": "sha1-hZdzGaO/VHUKnXX7kJx+UfWaLaQ=", "requires": { "acorn": "4.0.13", "magic-string": "0.22.4", @@ -4330,26 +4336,21 @@ } }, "rollup-plugin-commonjs": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.1.tgz", - "integrity": "sha512-ZTwAetmKimCsuWost/+n4FaOpMoczBRTx+kuQaZCIKXTx/R1wNBezuX5NS0vnPKM3hBoErdpAqmNyVSCi5XKbg==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.6.tgz", + "integrity": "sha512-qK0+uhktmnAgZkHkqFuajNmPw93fjrO7+CysDaxWE5jrUR9XSlSvuao5ZJP+XizxA8weakhgYYBtbVz9SGBpjA==", "requires": { - "acorn": "5.1.2", - "estree-walker": "0.5.0", + "acorn": "5.2.1", + "estree-walker": "0.5.1", "magic-string": "0.22.4", "resolve": "1.4.0", "rollup-pluginutils": "2.0.1" }, "dependencies": { - "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==" - }, "estree-walker": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.0.tgz", - "integrity": "sha512-/bEAy+yKAZQrEWUhGmS3H9XpGqSDBtRzX0I2PgMw9kA2n1jN22uV5B5p7MFdZdvWdXCRJztXAfx6ZeRfgkEETg==" + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.1.tgz", + "integrity": "sha512-7HgCgz1axW7w5aOvgOQkoR1RMBkllygJrssU3BvymKQ95lxXYv6Pon17fBRDm9qhkvXZGijOULoSF9ShOk/ZLg==" } } }, @@ -4416,19 +4417,19 @@ } }, "send": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", - "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", "requires": { - "debug": "2.6.7", + "debug": "2.6.9", "depd": "1.1.1", "destroy": "1.0.4", "encodeurl": "1.0.1", "escape-html": "1.0.3", "etag": "1.8.1", - "fresh": "0.5.0", + "fresh": "0.5.2", "http-errors": "1.6.2", - "mime": "1.3.4", + "mime": "1.4.1", "ms": "2.0.0", "on-finished": "2.3.0", "range-parser": "1.2.0", @@ -4436,9 +4437,9 @@ }, "dependencies": { "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -4548,22 +4549,21 @@ } }, "socket.io": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.1.tgz", - "integrity": "sha1-BkwSUXhGLkd6bfI9L9rRjdHFkU8=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", + "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", "requires": { - "debug": "2.6.8", - "engine.io": "3.1.1", - "object-assign": "4.1.1", + "debug": "2.6.9", + "engine.io": "3.1.4", "socket.io-adapter": "1.1.1", - "socket.io-client": "2.0.1", + "socket.io-client": "2.0.4", "socket.io-parser": "3.1.2" }, "dependencies": { "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -4581,36 +4581,37 @@ "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" }, "socket.io-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.1.tgz", - "integrity": "sha1-HVL4x0Zgxou2aVlT+hGZcRVfrZM=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", + "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", "requires": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "2.6.4", - "engine.io-client": "3.1.1", + "debug": "2.6.9", + "engine.io-client": "3.1.4", "has-cors": "1.1.0", "indexof": "0.0.1", "object-component": "0.0.3", + "parseqs": "0.0.5", "parseuri": "0.0.5", "socket.io-parser": "3.1.2", "to-array": "0.1.4" }, "dependencies": { "debug": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.4.tgz", - "integrity": "sha1-dYaps8OXQcAoKuM0RcTorHRzT+A=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "ms": "0.7.3" + "ms": "2.0.0" } }, "ms": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", - "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -4620,15 +4621,15 @@ "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", "requires": { "component-emitter": "1.2.1", - "debug": "2.6.8", + "debug": "2.6.9", "has-binary2": "1.0.2", "isarray": "2.0.1" }, "dependencies": { "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -4845,7 +4846,7 @@ "integrity": "sha512-TKJKz1fqBOZBaIQ/MGRKU0EnTGmKMLy4ReTRgP10AgtfOWBbj9PBg4MgY80GFpqGbs2EzcIctW5gbwbP4woDYg==", "requires": { "minipass": "2.2.1", - "minizlib": "1.0.3", + "minizlib": "1.1.0", "mkdirp": "0.5.1", "yallist": "3.0.2" }, @@ -4993,7 +4994,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", "requires": { - "abbrev": "1.1.0" + "abbrev": "1.1.1" } } } @@ -5099,9 +5100,9 @@ "optional": true }, "ultron": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", - "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "unbzip2-stream": { "version": "1.2.5", @@ -5344,9 +5345,9 @@ } }, "vlq": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.2.tgz", - "integrity": "sha1-4xbVJXtAuGu0PLjV/qXX9U1rDKE=" + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" }, "walk": { "version": "2.3.9", @@ -5425,19 +5426,13 @@ } }, "ws": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "requires": { - "safe-buffer": "5.0.1", - "ultron": "1.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" - } + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" } }, "xdg-basedir": { @@ -5464,9 +5459,9 @@ "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" }, "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.4.tgz", + "integrity": "sha1-BPVgkVcks4kIhxXMDteBPpZ3v1c=" }, "xtend": { "version": "4.0.1", diff --git a/package.json b/package.json index 19b56933..a484cffe 100755 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "jquery-ui-npm": "1.12.0", "nw": "^0.25.4-sdk", "nw-builder": "^3.4.1", - "openlayers": "^4.3.3", + "openlayers": "^4.6.4", "run-sequence": "^2.2.0", "temp": "^0.8.3", "three": "0.72.0" diff --git a/src/css/tabs/mission_planer.css b/src/css/tabs/mission_planer.css new file mode 100644 index 00000000..40bd7f7b --- /dev/null +++ b/src/css/tabs/mission_planer.css @@ -0,0 +1,122 @@ +.tab-calibration .content_toolbar { + height: 100px; +} + +.tab-mission-control .waypoint { + padding-left: 19px; + padding-right: 19px; + /*padding-bottom: 10px;*/ +} +.tab-mission-control .waypoint-left { + width: 54%; + float: left; + padding-right: 5px; +} +.tab-mission-control .waypoint-right{ + width: 40%; + float: right; +} + +.tab-mission-control .checksfail { + /*float: right;*/ + margin-top: 3px; + height: 15px; + width: 15px; + background-image:url(../../../images/icons/nopass.svg); + background-size:contain; + background-position:center; + background-repeat:no-repeat; +} + +.tab-mission-control input { + width: 115px; + padding-left: 3px; + height: 20px; + line-height: 20px; + text-align: left; + border: 1px solid silver; + border-radius: 3px; + margin-left: 11px; + font-size: 12px; + font-weight: normal; +} + +.tab-mission-control .point { + display: inline-block; + margin-bottom: 5px; + margin-left: 5px; +} + +.tab-mission-control .point-label { + +} + +@media (max-width: 1236px) { + .tab-mission-control .waypoint-left { + width: 96%; + } + .tab-mission-control .waypoint-right{ + width: 96%; + float: left; + padding-right: 19px; + } + .tab-mission-control .content_toolbar { + height: 240px; + } + .tab-mission-control .content_wrapper { + height: calc(100% - 240px); + } +} + +/* Need test! */ +.tab-mission-control .content_toolbar { + display: flex; + /*height: 150px;*/ + height: auto; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; +} + +.tab-mission-control .waypoint-left, +.tab-mission-control .waypoint-right { + width: 47%; + float: none; +} + +.tab-mission-control .btn.save_btn { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} + +.tab-mission-control .btn.save_btn a{ + margin-top: 5px; +} + +.tab-mission-control .gui_box{ + width: 100%; + clear: both; + height: 90%; +} + +.tab-mission-control.toolbar_fixed_bottom{ + height: 100%; +} +/*.tab-mission-control .content_wrapper{*/ + /*height: 100%;*/ +/*}*/ +#missionMap{ + height: 100%; +} + +@media (max-width: 1252px){ + .tab-mission-control .waypoint-left, + .tab-mission-control .waypoint-right { + width: 100%; + } + .tab-mission-control .waypoint-right{ + padding-right: 5px; + margin-top: 5px; + } +} diff --git a/tabs/mission_control.html b/tabs/mission_control.html new file mode 100644 index 00000000..c7b04d66 --- /dev/null +++ b/tabs/mission_control.html @@ -0,0 +1,76 @@ +<div class="tab-mission-control toolbar_fixed_bottom"> + <div class="content_wrapper"> + <div id="missionMap"></div> + <div id="notLoadMap" data-i18n="useOnlyStandalone" style="display: none;"></div> + </div> + <div class="content_toolbar" id="missionControls"> + <div class="waypoint waypoint-left"> + <div class="gui_box" style="padding-bottom: 10px"> + <div class="gui_box_titlebar"> + <div class="spacer_box_title i18n-replaced" data-i18n="editPointHead">Edit point</div> + </div> + <div class="spacer"> + <input type="hidden" name="pointNumber" value=""> + <div class="point"> + <select name="type" id="pointType"> + <!--<option value="1">Home</option>--> + <option value="1">Waypoint</option> + <option value="4">RTH</option> + </select> + </div> + <div class="point"> + <label class="point-label" for="pointLat">Lat: </label> + <input id="pointLat" type="text" value="0.0" required> + </div> + <div class="point"> + <label class="point-label" for="pointLon">Lon: </label> + <input id="pointLon" type="text" value="0.0" required> + </div> + <div class="point"> + <label class="point-label" for="pointAlt">Alt (cm): </label> + <input id="pointAlt" type="text" value="0" required> + </div> + <div> + <div id="savePoint" class="btn save_btn" style="padding-top: 10px; display: inline-block"> + <a class="save" href="#" data-i18n="editPointButtonSave" style="float: left">Save</a> + </div> + <div id="removePoint" class="btn btn-danger" style="padding-top: 10px; display: inline-block;"> + <a class="save" href="#" data-i18n="editPointButtonRemove" style="float: left">Remove</a> + </div> + <div id="removeAllPoints" class="btn btn-danger" style="padding-top: 10px; display: inline-block"> + <a class="save" href="#" data-i18n="removeAllPointButtonSave" style="float: left">Remove all points</a> + </div> + </div> + </div> + </div> + </div> + <div class="waypoint waypoint-right"> + <div class="gui_box" style="padding-bottom: 10px"> + <div class="gui_box_titlebar"> + <div class="spacer_box_title i18n-replaced" data-i18n="missionTotalInformationHead">Total information</div> + </div> + <div class="spacer"> + <div> + <span>Distance (m):</span> + <span id="missionDistance"></span> + </div> + <div> + <span>Available Points</span> + <span id="availablePoints">0/0</span> + </div> + <div> + <span>Mission valid</span> + <div id="missionValid" style="display: inline-block"></div> + </div> + + <div class="btn save_btn"> + <a id="loadMissionButton" class="save" href="#" data-i18n="loadMissionButton"></a> + <a id="saveMissionButton" class="save" href="#" data-i18n="saveMissionButton"></a> + <a id="loadEepromMissionButton" class="save" href="#" data-i18n="loadEepromMissionButton">Load Eeprom mission</a> + <a id="saveEepromMissionButton" class="save" href="#" data-i18n="saveEepromMissionButton">Save Eeprom mission</a> + </div> + </div> + </div> + </div> + </div> +</div> diff --git a/tabs/mission_control.js b/tabs/mission_control.js new file mode 100644 index 00000000..c438b199 --- /dev/null +++ b/tabs/mission_control.js @@ -0,0 +1,474 @@ +'use strict'; + +TABS.mission_control = {}; +TABS.mission_control.isYmapLoad = false; +TABS.mission_control.initialize = function (callback) { + + if (GUI.active_tab != 'mission_control') { + GUI.active_tab = 'mission_control'; + googleAnalytics.sendAppView('Mission Control'); + } + + var loadChainer = new MSPChainerClass(); + loadChainer.setChain([ + mspHelper.getMissionInfo + ]); + loadChainer.setExitPoint(loadHtml); + loadChainer.execute(); + + function updateTotalInfo() { + $('#availablePoints').text(MISSION_PLANER.countBusyPoints + '/' + MISSION_PLANER.maxWaypoints); + $('#missionValid').html(MISSION_PLANER.isValidMission ? chrome.i18n.getMessage('armingCheckPass') : chrome.i18n.getMessage('armingCheckFail')); + } + + function loadHtml() { + $('#content').load("./tabs/mission_control.html", process_html); + } + + function process_html() { + if (typeof require !== "undefined") { + initMap(); + } else { + $('#missionMap, #missionControls').hide(); + $('#notLoadMap').show(); + } + localize(); + + GUI.content_ready(callback); + } + + var markers = []; + var lines = []; + var map; + var selectedMarker; + var pointForSend = 0; + + function clearEditForm() { + $('#pointLat').val(''); + $('#pointLon').val(''); + $('#pointAlt').val(''); + $('[name=pointNumber]').val('') + } + + function repaint() { + var oldPos; + for (var i in lines) { + map.removeLayer(lines[i]); + } + lines = []; + $('#missionDistance').text(0); + + map.getLayers().forEach(function (t) { + //feature.getGeometry().getType() + if (t instanceof ol.layer.Vector && typeof t.alt !== 'undefined') { + var geometry = t.getSource().getFeatures()[0].getGeometry(); + if (typeof oldPos !== 'undefined') { + paintLine(oldPos, geometry.getCoordinates()); + } + + oldPos = geometry.getCoordinates(); + } + }); + } + + function paintLine(pos1, pos2) { + var line = new ol.geom.LineString([pos1, pos2]); + + var feature = new ol.Feature({ + geometry: line + }); + feature.setStyle(new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#1497f1', + width: 3 + }) + })); + + var vectorSource = new ol.source.Vector({ + features: [feature] + }); + + var vectorLayer = new ol.layer.Vector({ + source: vectorSource + }); + + lines.push(vectorLayer); + + var length = ol.Sphere.getLength(line) + parseFloat($('#missionDistance').text()); + $('#missionDistance').text(length.toFixed(3)); + + map.addLayer(vectorLayer); + } + + function addMarker(_pos, _alt, _action) { + var iconFeature = new ol.Feature({ + geometry: new ol.geom.Point(_pos), + name: 'Null Island', + population: 4000, + rainfall: 500 + }); + + var iconStyle = new ol.style.Style({ + image: new ol.style.Icon(({ + anchor: [0.5, 1], + opacity: 1, + scale: 0.5, + src: '../images/icons/cf_icon_position.png' + })) +// text: new ol.style.Text({ +// text: '10', +// offsetX: -1, +// offsetY: -30, +// overflow: true, +// scale: 2, +// fill: new ol.style.Fill({ +// color: 'black' +// }) +// }) + }); + + iconFeature.setStyle(iconStyle); + + var vectorSource = new ol.source.Vector({ + features: [iconFeature] + }); + + var vectorLayer = new ol.layer.Vector({ + source: vectorSource + }); + + vectorLayer.alt = _alt; + vectorLayer.number = markers.length; + vectorLayer.action = _action; + + markers.push(vectorLayer); + + return vectorLayer; + } + + function initMap() { + // var center = ol.proj.fromLonLat([e.data.lon, e.data.lat]); + // + // mapView.setCenter(center); + // iconGeometry.setCoordinates(center); + + var app = {}; + + /** + * @constructor + * @extends {ol.interaction.Pointer} + */ + app.Drag = function () { + + ol.interaction.Pointer.call(this, { + handleDownEvent: app.Drag.prototype.handleDownEvent, + handleDragEvent: app.Drag.prototype.handleDragEvent, + handleMoveEvent: app.Drag.prototype.handleMoveEvent, + handleUpEvent: app.Drag.prototype.handleUpEvent + }); + + /** + * @type {ol.Pixel} + * @private + */ + this.coordinate_ = null; + + /** + * @type {string|undefined} + * @private + */ + this.cursor_ = 'pointer'; + + /** + * @type {ol.Feature} + * @private + */ + this.feature_ = null; + + /** + * @type {string|undefined} + * @private + */ + this.previousCursor_ = undefined; + + }; + ol.inherits(app.Drag, ol.interaction.Pointer); + + + /** + * @param {ol.MapBrowserEvent} evt Map browser event. + * @return {boolean} `true` to start the drag sequence. + */ + app.Drag.prototype.handleDownEvent = function (evt) { + var map = evt.map; + + var feature = map.forEachFeatureAtPixel(evt.pixel, + function (feature, layer) { + return feature; + }); + + if (feature) { + this.coordinate_ = evt.coordinate; + this.feature_ = feature; + } + + return !!feature; + }; + + /** + * @param {ol.MapBrowserEvent} evt Map browser event. + */ + app.Drag.prototype.handleDragEvent = function (evt) { + var map = evt.map; + + var feature = map.forEachFeatureAtPixel(evt.pixel, + function (feature, layer) { + return feature; + }); + + var deltaX = evt.coordinate[0] - this.coordinate_[0]; + var deltaY = evt.coordinate[1] - this.coordinate_[1]; + + var geometry = /** @type {ol.geom.SimpleGeometry} */ + (this.feature_.getGeometry()); + geometry.translate(deltaX, deltaY); + + this.coordinate_[0] = evt.coordinate[0]; + this.coordinate_[1] = evt.coordinate[1]; + repaint(); + }; + + + /** + * @param {ol.MapBrowserEvent} evt Event. + */ + app.Drag.prototype.handleMoveEvent = function (evt) { + if (this.cursor_) { + var map = evt.map; + var feature = map.forEachFeatureAtPixel(evt.pixel, + function (feature, layer) { + return feature; + }); + var element = evt.map.getTargetElement(); + if (feature) { + if (element.style.cursor != this.cursor_) { + this.previousCursor_ = element.style.cursor; + element.style.cursor = this.cursor_; + } + } else if (this.previousCursor_ !== undefined) { + element.style.cursor = this.previousCursor_; + this.previousCursor_ = undefined; + } + } + }; + + + /** + * @param {ol.MapBrowserEvent} evt Map browser event. + * @return {boolean} `false` to stop the drag sequence. + */ + app.Drag.prototype.handleUpEvent = function (evt) { + this.coordinate_ = null; + this.feature_ = null; + return false; + }; + + var lat = GPS_DATA.lat / 10000000; + var lon = GPS_DATA.lon / 10000000; + + map = new ol.Map({ + interactions: ol.interaction.defaults().extend([new app.Drag()]), + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + target: document.getElementById('missionMap'), + view: new ol.View({ + center: ol.proj.fromLonLat([lon, lat]), + zoom: 14 + }) + }); + + map.on('click', function (evt) { + var selectedFeature = map.forEachFeatureAtPixel(evt.pixel, + function (feature, layer) { + return feature; + }); + selectedMarker = map.forEachFeatureAtPixel(evt.pixel, + function (feature, layer) { + return layer; + }); + if (selectedFeature) { + var geometry = selectedFeature.getGeometry(); + var coord = ol.proj.toLonLat(geometry.getCoordinates()); + + $('#pointLat').val(coord[0]); + $('#pointLon').val(coord[1]); + $('#pointAlt').val(selectedMarker.alt); + $('#pointType').val(selectedMarker.action); + } else { + map.addLayer(addMarker(evt.coordinate, 1500, 1)); + repaint(); + } + }); + + // change mouse cursor when over marker + $(map.getViewport()).on('mousemove', function (e) { + var pixel = map.getEventPixel(e.originalEvent); + var hit = map.forEachFeatureAtPixel(pixel, function (feature, layer) { + return true; + }); + if (hit) { + map.getTarget().style.cursor = 'pointer'; + } else { + map.getTarget().style.cursor = ''; + } + }); + + $('#removeAllPoints').on('click', function () { + if (confirm(chrome.i18n.getMessage('confirm_delete_all_points'))) { + removeAllPoints(); + } + }); + + $('#removePoint').on('click', function () { + if (selectedMarker) { + + var tmp = []; + for (var i in markers) { + if (markers[i] !== selectedMarker && typeof markers[i].action !== "undefined") { + tmp.push(markers[i]); + } + } + map.removeLayer(selectedMarker); + markers = tmp; + selectedMarker = null; + + clearEditForm(); + repaint(); + } + }); + + $('#savePoint').on('click', function () { + if (selectedMarker) { + map.getLayers().forEach(function (t) { + if (t === selectedMarker) { + var geometry = t.getSource().getFeatures()[0].getGeometry(); + geometry.setCoordinates(ol.proj.fromLonLat([parseFloat($('#pointLat').val()), parseFloat($('#pointLon').val())])); + t.alt = $('#pointAlt').val(); + t.action = $('#pointType').val(); + } + }); + + selectedMarker = null; + clearEditForm(); + repaint(); + } + }); + + $('#loadMissionButton').on('click', function () { + removeAllPoints(); + $(this).addClass('disabled'); + GUI.log('Start get point'); + + pointForSend = 0; + getNextPoint(); + }); + + $('#saveMissionButton').on('click', function () { + $(this).addClass('disabled'); + GUI.log('Start send point'); + + pointForSend = 0; + sendNextPoint(); + }); + + $('#loadEepromMissionButton').on('click', function () { + GUI.log(chrome.i18n.getMessage('eeprom_load_ok')); + + MSP.send_message(MSPCodes.MSP_WP_MISSION_LOAD, false, getPointsFromEprom); + }); + $('#saveEepromMissionButton').on('click', function () { + GUI.log(chrome.i18n.getMessage('eeprom_saved_ok')); + MSP.send_message(MSPCodes.MSP_WP_MISSION_SAVE, false, false); + }); + + updateTotalInfo(); + } + + function removeAllPoints() { + for (var i in markers) { + map.removeLayer(markers[i]); + } + markers = []; + clearEditForm(); + repaint(); + } + + function getPointsFromEprom() { + pointForSend = 0; + MSP.send_message(MSPCodes.MSP_WP_GETINFO, false, false, getNextPoint); + } + + + function getNextPoint() { + var coord; + if (pointForSend > 0) { + // console.log(MISSION_PLANER.bufferPoint.lon); + // console.log(MISSION_PLANER.bufferPoint.lat); + // console.log(MISSION_PLANER.bufferPoint.alt); + // console.log(MISSION_PLANER.bufferPoint.action); + + coord = ol.proj.fromLonLat([MISSION_PLANER.bufferPoint.lon, MISSION_PLANER.bufferPoint.lat]); + map.addLayer(addMarker(coord, MISSION_PLANER.bufferPoint.alt, MISSION_PLANER.bufferPoint.action)); + } + + if (pointForSend >= MISSION_PLANER.countBusyPoints) { + GUI.log('End get point'); + $('#loadMissionButton').removeClass('disabled'); + map.getView().setCenter(coord); + repaint(); + updateTotalInfo(); + return; + } + + MISSION_PLANER.bufferPoint.number = pointForSend; + + pointForSend++; + + MSP.send_message(MSPCodes.MSP_WP, mspHelper.crunch(MSPCodes.MSP_WP), false, getNextPoint); + } + + function sendNextPoint() { + if (pointForSend >= markers.length) { + GUI.log('End send point'); + + MSP.send_message(MSPCodes.MSP_WP_GETINFO, false, false, updateTotalInfo); + + $('#saveMissionButton').removeClass('disabled'); + return; + } + + var geometry = markers[pointForSend].getSource().getFeatures()[0].getGeometry(); + var coordinate = ol.proj.toLonLat(geometry.getCoordinates()); + + MISSION_PLANER.bufferPoint.number = pointForSend + 1; + MISSION_PLANER.bufferPoint.action = markers[pointForSend].action; + MISSION_PLANER.bufferPoint.lon = parseInt(coordinate[0] * 10000000); + MISSION_PLANER.bufferPoint.lat = parseInt(coordinate[1] * 10000000); + MISSION_PLANER.bufferPoint.alt = markers[pointForSend].alt; + pointForSend++; + if (pointForSend >= markers.length) { + MISSION_PLANER.bufferPoint.endMission = 0xA5; + } else { + MISSION_PLANER.bufferPoint.endMission = 0; + } + + MSP.send_message(MSPCodes.MSP_SET_WP, mspHelper.crunch(MSPCodes.MSP_SET_WP), false, sendNextPoint); + } +}; + +TABS.mission_control.cleanup = function (callback) { + if (callback) callback(); +};
\ No newline at end of file |