From 819aadc34957df5d758ef1860cf1086355bb00f8 Mon Sep 17 00:00:00 2001 From: portree_kid Date: Sun, 29 Dec 2019 21:02:01 +0100 Subject: [PATCH] Next --- package-lock.json | 21 +++ package.json | 1 + src/renderer/aptdb.js | 5 + src/renderer/components/AirportEdit.vue | 41 +++++ src/renderer/components/EditLayer.vue | 28 +++- src/renderer/components/FlightgearMap.vue | 72 +++++--- src/renderer/components/LeafletSidebar.vue | 11 +- src/renderer/components/RunScan.vue | 28 ++-- src/renderer/components/SettingsPanel.vue | 20 ++- src/renderer/db/index.js | 1 - src/renderer/store/api/airports.js | 90 ++++++++++ src/renderer/store/index.js | 6 +- src/renderer/store/modules/Airports.js | 46 ++++-- src/renderer/store/modules/Counter.js | 25 --- src/renderer/store/modules/Editable.js | 25 +++ src/renderer/store/modules/Settings.js | 20 ++- src/renderer/utils/airports.js | 28 ---- src/renderer/utils/apt.js | 180 +++++++++++++------- src/renderer/utils/scan.js | 181 +++++++++++++++------ src/renderer/utils/worker.js | 36 ++-- 20 files changed, 623 insertions(+), 242 deletions(-) create mode 100644 src/renderer/aptdb.js create mode 100644 src/renderer/components/AirportEdit.vue create mode 100644 src/renderer/store/api/airports.js delete mode 100644 src/renderer/store/modules/Counter.js create mode 100644 src/renderer/store/modules/Editable.js diff --git a/package-lock.json b/package-lock.json index b87ccc3..29412c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6385,6 +6385,11 @@ } } }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + }, "flatten": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", @@ -16043,6 +16048,22 @@ "electron-store": "^2.0.0" } }, + "vuex-persist": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vuex-persist/-/vuex-persist-2.2.0.tgz", + "integrity": "sha512-o/qbBeMcKZZqMvCXc7kfIew/5cjHxlP1f53rx5YYp3r2tk2kxXYK/UZumxKn7OXywlurl2r0mgkuBzH6nIWFjw==", + "requires": { + "flatted": "^2.0.0", + "lodash.merge": "^4.6.2" + }, + "dependencies": { + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + } + } + }, "vuex-persistedstate": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-2.7.0.tgz", diff --git a/package.json b/package.json index 51a4f7a..5ed4550 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,7 @@ "vuetify": "^2.1.9", "vuex": "^3.0.1", "vuex-electron": "^1.0.0", + "vuex-persist": "^2.2.0", "vuex-persistedstate": "^2.7.0", "worker-threads": "^1.0.0", "xamel": "^0.3.1" diff --git a/src/renderer/aptdb.js b/src/renderer/aptdb.js new file mode 100644 index 0000000..5f51977 --- /dev/null +++ b/src/renderer/aptdb.js @@ -0,0 +1,5 @@ +function getApts (params) { + console.log('Log') +} + +export {getApts} diff --git a/src/renderer/components/AirportEdit.vue b/src/renderer/components/AirportEdit.vue new file mode 100644 index 0000000..5d4416f --- /dev/null +++ b/src/renderer/components/AirportEdit.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/renderer/components/EditLayer.vue b/src/renderer/components/EditLayer.vue index 5332941..de774a0 100644 --- a/src/renderer/components/EditLayer.vue +++ b/src/renderer/components/EditLayer.vue @@ -5,30 +5,40 @@ diff --git a/src/renderer/components/LeafletSidebar.vue b/src/renderer/components/LeafletSidebar.vue index effec4d..10d67a1 100644 --- a/src/renderer/components/LeafletSidebar.vue +++ b/src/renderer/components/LeafletSidebar.vue @@ -4,6 +4,7 @@
@@ -21,7 +22,14 @@

A responsive sidebar for mapping libraries

+
+ +
+

+ Scanning +
+

@@ -36,13 +44,14 @@ import 'font-awesome/css/font-awesome.css' import {} from 'leaflet-sidebar-v2' import L from 'leaflet' + import AirportEdit from './AirportEdit' import SettingsPanel from './SettingsPanel' import RunScan from './RunScan' import FileSelect from './FileSelect' export default { name: 'leaflet-sidebar', - components: { SettingsPanel, RunScan, FileSelect }, + components: { AirportEdit, SettingsPanel, RunScan, FileSelect }, props: [], mounted () { this.add() diff --git a/src/renderer/components/RunScan.vue b/src/renderer/components/RunScan.vue index c30ed29..ad7186b 100644 --- a/src/renderer/components/RunScan.vue +++ b/src/renderer/components/RunScan.vue @@ -1,10 +1,10 @@ @@ -38,11 +38,14 @@ console.log(fileUrl('src/renderer/utils/worker.js')) // var worker = new Worker(fileUrl('src/renderer/utils/worker.js')) - worker.postMessage('scanapt') + worker.postMessage(['scanapt']) // the reply + var store = this.$store worker.onmessage = function (e) { if (e.data === 'DONE') { console.log('DONE') + store.dispatch('getAirports') + worker.terminate() } console.log(e.data) } @@ -60,12 +63,14 @@ const worker = new Worker(winURL) console.log(fileUrl('src/renderer/utils/worker.js')) - // var worker = new Worker(fileUrl('src/renderer/utils/worker.js')) - worker.postMessage('scan') + worker.postMessage(['scan', this.$store.state.Settings.settings.airportsDirectory]) // the reply + var store = this.$store worker.onmessage = function (e) { if (e.data === 'DONE') { console.log('DONE') + store.dispatch('getAirports') + worker.terminate() } console.log(e.data) } @@ -83,13 +88,14 @@ const worker = new Worker(winURL) console.log(fileUrl('src/renderer/utils/worker.js')) - - // var worker = new Worker(fileUrl('src/renderer/utils/worker.js')) - worker.postMessage('scanai') + worker.postMessage(['scanai', this.$store.state.Settings.settings.flightgearDirectory]) // the reply + var store = this.$store worker.onmessage = function (e) { if (e.data === 'DONE') { console.log('DONE') + store.dispatch('getAirports') + worker.terminate() } console.log(e.data) } diff --git a/src/renderer/components/SettingsPanel.vue b/src/renderer/components/SettingsPanel.vue index a7acca1..d374a97 100644 --- a/src/renderer/components/SettingsPanel.vue +++ b/src/renderer/components/SettingsPanel.vue @@ -7,11 +7,18 @@
+ + Airports Directory + {{ airports_directory }} + + + + Flightgear Directory {{ flightgear_directory }} - +
@@ -33,14 +40,21 @@ } }, methods: { - directorySelect: function (flightgearDirectory) { + flightgearDirectorySelect: function (flightgearDirectory) { console.log(flightgearDirectory) - this.$store.commit('SETTINGS_DIRECTORY', flightgearDirectory.path) + this.$store.commit('FLIGHTGEAR_DIRECTORY', flightgearDirectory.path) + }, + airportsDirectorySelect: function (flightgearDirectory) { + console.log(flightgearDirectory) + this.$store.commit('AIPORTS_DIRECTORY', flightgearDirectory.path) } }, computed: { flightgear_directory: function () { return this.$store.state.Settings.settings.flightgearDirectory + }, + airports_directory: function () { + return this.$store.state.Settings.settings.airportsDirectory } } } diff --git a/src/renderer/db/index.js b/src/renderer/db/index.js index e5fbf9e..48afa67 100644 --- a/src/renderer/db/index.js +++ b/src/renderer/db/index.js @@ -13,7 +13,6 @@ export default new VueIdb({ }, apis: { bigs: { - all: () => axios.get('/dev/data/data.json') } } }) diff --git a/src/renderer/store/api/airports.js b/src/renderer/store/api/airports.js new file mode 100644 index 0000000..308dbcd --- /dev/null +++ b/src/renderer/store/api/airports.js @@ -0,0 +1,90 @@ +/* eslint-disable */ +const DB_NAME = 'flightgear'; +const DB_VERSION = 2; +let DB; + +export default { + + async getDb() { + return new Promise((resolve, reject) => { + + if(DB) { return resolve(DB); } + console.log('OPENING DB', DB); + let request = window.indexedDB.open(DB_NAME, DB_VERSION); + + request.onerror = e => { + console.log('Error opening db', e); + reject('Error'); + }; + + request.onsuccess = e => { + DB = e.target.result; + resolve(DB); + }; + + request.onupgradeneeded = e => { + console.log('onupgradeneeded'); + let db = e.target.result; + db.createObjectStore("airports", { autoIncrement: true, keyPath:'properties.icao' }); + }; + }); + }, + async deleteAirport(airport) { + + let db = await this.getDb(); + + return new Promise(resolve => { + + let trans = db.transaction(['airports'],'readwrite'); + trans.oncomplete = () => { + resolve(); + }; + + let store = trans.objectStore('airports'); + store.delete(airport.features.icao); + }); + }, + async getAirports() { + + let db = await this.getDb(); + + return new Promise(resolve => { + + let trans = db.transaction(['airports'],'readonly'); + trans.oncomplete = () => { + resolve(airports); + }; + + let store = trans.objectStore('airports'); + let airports = []; + + store.openCursor().onsuccess = e => { + let cursor = e.target.result; + if (cursor) { + airports.push(cursor.value) + cursor.continue(); + } + }; + + }); + }, + + async saveAirport(airport) { + + let db = await this.getDb(); + + return new Promise(resolve => { + + let trans = db.transaction(['airports'],'readwrite'); + trans.oncomplete = () => { + resolve(); + }; + + let store = trans.objectStore('airports'); + store.put(airport); + + }); + + } + +} \ No newline at end of file diff --git a/src/renderer/store/index.js b/src/renderer/store/index.js index d8c338b..cebc05d 100644 --- a/src/renderer/store/index.js +++ b/src/renderer/store/index.js @@ -1,7 +1,7 @@ import Vue from 'vue' import Vuex from 'vuex' -// import from 'electron-settings' -// import the auto exporter +import createPersistedState from 'vuex-persistedstate' + import createLogger from 'vuex/dist/logger' import modules from './modules' @@ -12,5 +12,5 @@ const debug = process.env.NODE_ENV !== 'production' export default new Vuex.Store({ modules, strict: debug, - plugins: debug ? [createLogger()] : [] // set logger only for development + plugins: debug ? [createLogger(), createPersistedState({paths: ['Settings']})] : [] // set logger only for development }) diff --git a/src/renderer/store/modules/Airports.js b/src/renderer/store/modules/Airports.js index 44a8ab4..11c44d4 100644 --- a/src/renderer/store/modules/Airports.js +++ b/src/renderer/store/modules/Airports.js @@ -1,22 +1,46 @@ +/* eslint-disable */ +import idb from '../api/airports'; + +const ADD_AIRPORT = 'ADD_AIRPORT'; +const SET_AIRPORTS = 'SET_AIRPORTS'; +const RESET_AIRPORTS = 'RESET_AIRPORTS'; + const state = { - main: 0 + airports: [] } const mutations = { - DECREMENT_MAIN_COUNTER (state) { - state.main-- + 'DELETE_INDEXED_DB' () { }, + ADD_AIRPORT (state, airports) { + state.airports.push(airports); }, - INCREMENT_MAIN_COUNTER (state) { - state.main++ - } + SET_AIRPORTS (state, airports) { + state.airports = airports; + }, + RESET_AIRPORTS (state) { + state.airports = []; + }, + } const actions = { - someAsyncTask ({ commit }) { - // do something async - commit('INCREMENT_MAIN_COUNTER') - } -} + async deleteAirport(context, airport) { + await idb.deleteAirport(airport); + }, + async getAirports(context) { + context.commit(RESET_AIRPORTS); + let airports = await idb.getAirports(); +// let newAirports = []; +// airports.forEach(c => { +// newAirports.push(c); +// }); + context.commit(SET_AIRPORTS, airports + .filter(point => typeof point.geometry.coordinates !== "undefined" ) + .filter(point => point.properties.flights > 0 )); + }, + async saveAirport(context, airport) { + await idb.saveAirport(airport); + }} export default { state, diff --git a/src/renderer/store/modules/Counter.js b/src/renderer/store/modules/Counter.js deleted file mode 100644 index 44a8ab4..0000000 --- a/src/renderer/store/modules/Counter.js +++ /dev/null @@ -1,25 +0,0 @@ -const state = { - main: 0 -} - -const mutations = { - DECREMENT_MAIN_COUNTER (state) { - state.main-- - }, - INCREMENT_MAIN_COUNTER (state) { - state.main++ - } -} - -const actions = { - someAsyncTask ({ commit }) { - // do something async - commit('INCREMENT_MAIN_COUNTER') - } -} - -export default { - state, - mutations, - actions -} diff --git a/src/renderer/store/modules/Editable.js b/src/renderer/store/modules/Editable.js new file mode 100644 index 0000000..9813e6b --- /dev/null +++ b/src/renderer/store/modules/Editable.js @@ -0,0 +1,25 @@ +const state = { + type: 'airport', + data: Object +} + +const SET_EDIT_AIRPORT = 'SET_EDIT_AIRPORT' + +const mutations = { + SET_EDIT_AIRPORT (state, airport) { + state.data = airport + state.type = 'airport' + } +} + +const actions = { + async setAirport (context, airport) { + context.commit(SET_EDIT_AIRPORT, airport) + } +} + +export default { + state, + mutations, + actions +} diff --git a/src/renderer/store/modules/Settings.js b/src/renderer/store/modules/Settings.js index e8b7cd4..f09b46a 100644 --- a/src/renderer/store/modules/Settings.js +++ b/src/renderer/store/modules/Settings.js @@ -1,17 +1,27 @@ -import createPersistedState from 'vuex-persistedstate' - const state = { - settings: { flightgearDirectory: '.' } + settings: { flightgearDirectory: '.' }, + zoom: 14, + center: [47.413220, -1.219482] } const mutations = { 'DELETE_INDEXED_DB' () { }, - 'SETTINGS_DIRECTORY' (state, flightgearDirectory) { + 'FLIGHTGEAR_DIRECTORY' (state, flightgearDirectory) { state.settings.flightgearDirectory = flightgearDirectory + }, + 'AIPORTS_DIRECTORY' (state, airportsDirectory) { + state.settings.airportsDirectory = airportsDirectory + }, + 'ZOOM' (state, zoom) { + state.zoom = zoom + }, + 'CENTER' (state, center) { + state.center = center } + } -const plugins = [createPersistedState()] +const plugins = [] const actions = { } diff --git a/src/renderer/utils/airports.js b/src/renderer/utils/airports.js index ba94f96..c1a416d 100644 --- a/src/renderer/utils/airports.js +++ b/src/renderer/utils/airports.js @@ -8,15 +8,6 @@ async function initDB() { if (features == null) { console.log("Loading DB"); console.log(this.indexedDB); -// var deleteRequest = indexedDB.deleteDatabase("flightgear"); -// deleteRequest.onerror = function (event) { -// console.log(event); -// reject(event); -// }; -// deleteRequest.onsuccess = function (event) { -// console.log(event); -// }; - var request = this.indexedDB.open("flightgear", 2); request.onerror = function (event) { reject(event); @@ -58,25 +49,6 @@ async function initDB() { } }; - // db.loadDatabase({}, function (err) { - // if (err) { - // console.error("Error loading DB"); - // console.error(err); - // db.addCollection('features', { - // unique: ["properties.icao"], autoupdate: true - // }); - // features = db.getCollection('features'); - // } - // features = db.getCollection('features'); - // if( features == null ){ - // db.addCollection('features', { - // unique: ["properties.icao"], autoupdate: true - // }); - // features = db.getCollection('features'); - // } - // console.log("Loaded " + features.count() + " features"); - // resolve(features); - // }); } else { resolve(features); diff --git a/src/renderer/utils/apt.js b/src/renderer/utils/apt.js index 8660900..418f551 100644 --- a/src/renderer/utils/apt.js +++ b/src/renderer/utils/apt.js @@ -1,89 +1,147 @@ /* eslint-disable */ const lineReader = require('readline'); +var icao; + var scanMethods = { - 1: (l, apts) => { - console.log('Airport:', l); - saveName(apts, l[4], l.slice(5).join(' ').replace('\t', ' ')); - }, - 99: (l) => { - console.log('Finished'); - } + 1: (l, apts) => { + console.log('Airport:', l); + icao = l[4]; + saveName(apts, l[4], l.slice(5).join(' ').replace('\t', ' ')); + }, + 14: (l, apts) => { + console.log('Viewport:', l); + saveCoordinates(apts, icao, l[1], l[2]); + }, + 99: (l) => { + console.log('Finished'); + } }; async function saveName(features, icao, name) { - var promise = new Promise(function (resolve, reject) { + var promise = new Promise(function (resolve, reject) { - var transaction = features.transaction("airports", "readwrite"); - var objectStore = transaction.objectStore("airports"); - var objectStoreRequest = objectStore.get(icao); - - objectStoreRequest.onsuccess = function (event) { - console.log(event); - var feature = objectStoreRequest.result; - if (!feature) { - feature = { - "type": "Feature", - 'properties': { 'icao': icao, 'twr': false, 'threshold': false, 'flights': 0, airlines: [] }, - 'geometry': { - "type": "Point" - } - }; + var transaction = features.transaction("airports", "readwrite"); + var objectStore = transaction.objectStore("airports"); + var objectStoreRequest = objectStore.get(icao); + + objectStoreRequest.onsuccess = function (event) { + console.log(event); + var feature = objectStoreRequest.result; + if (!feature) { + feature = { + "type": "Feature", + 'properties': { 'icao': icao, 'twr': false, 'threshold': false, 'flights': 0, airlines: [] }, + 'geometry': { + "type": "Point" } - feature.properties.name = name; - feature.properties.icao = icao; - console.log("ICAO : " + feature.properties.icao); - // Create another request that inserts the item back into the database - var updateAirportRequest = objectStore.put(feature); - - // Log the transaction that originated this request - console.log("The transaction that originated this request is " + updateAirportRequest.updateAirportRequest); - - // When this new request succeeds, run the displayData() function again to update the display - updateAirportRequest.onsuccess = function () { - console.log("Stored"); - resolve(); - }; - updateAirportRequest.onerror = function (event) { - console.log("Error " + event); - reject(event); - }; }; - objectStoreRequest.onerror = function (event) { - console.log("Error " + event); - reject(event); - }; - }); + } + feature.properties.name = name; + feature.properties.icao = icao; + console.log("ICAO : " + feature.properties.icao); + // Create another request that inserts the item back into the database + var updateAirportRequest = objectStore.put(feature); - return promise; + // Log the transaction that originated this request + console.log("The transaction that originated this request is " + updateAirportRequest.updateAirportRequest); + + // When this new request succeeds, run the displayData() function again to update the display + updateAirportRequest.onsuccess = function () { + console.log("Stored"); + resolve(); + }; + updateAirportRequest.onerror = function (event) { + console.log("Error " + event); + reject(event); + }; + }; + objectStoreRequest.onerror = function (event) { + console.log("Error " + event); + reject(event); + }; + }); + return promise; } -function scanAPTIntoDB(f, apts) { - console.log(f); - lineReader.createInterface({ +async function saveCoordinates(features, icao, lat, lon) { + var promise = new Promise(function (resolve, reject) { + + var transaction = features.transaction("airports", "readwrite"); + var objectStore = transaction.objectStore("airports"); + var objectStoreRequest = objectStore.get(icao); + + objectStoreRequest.onsuccess = function (event) { + console.log(event); + var feature = objectStoreRequest.result; + if (!feature) { + feature = { + "type": "Feature", + 'properties': { 'icao': icao, 'twr': false, 'threshold': false, 'flights': 0, airlines: [] }, + 'geometry': { + "type": "Point" + } + }; + } + feature.geometry.coordinates = [lon, lat]; + console.log("ICAO : " + feature.properties.icao); + // Create another request that inserts the item back into the database + var updateAirportRequest = objectStore.put(feature); + + // Log the transaction that originated this request + console.log("The transaction that originated this request is " + updateAirportRequest.updateAirportRequest); + + // When this new request succeeds, run the displayData() function again to update the display + updateAirportRequest.onsuccess = function () { + console.log("Stored"); + resolve(); + }; + updateAirportRequest.onerror = function (event) { + console.log("Error " + event); + reject(event); + }; + }; + objectStoreRequest.onerror = function (event) { + console.log("Error " + event); + reject(event); + }; + }); + return promise; +} + +async function scanAPTIntoDB(f, features) { + var promise = new Promise(function (resolve, reject) { + try { + lineReader.createInterface({ input: fs.createReadStream(f) - }).on('line', function (line) { + }).on('line', function (line) { var fields = line.split(/[ ]+/); // var fields = line.match('([0-9]+)'); if (fields == null) - return; + return; var scanMethod = scanMethods[fields[0]]; if (scanMethod != null) { - scanMethod(fields, apts); + scanMethod(fields, features); } else { - if (fields[0] == '99') { - lineReader.close(); - } - // console.log('Ignored:', line); + if (fields[0] == '99') { + lineReader.close(); + } + // console.log('Ignored:', line); } - }).on('error', function (err) { + }).on('error', function (err) { console.log(err); lr.close(); - }).on('close', function () { + }).on('close', function () { console.log("End"); - apts.close(); - }); + features.close(); + this.postMessage('DONE'); + }); + } catch (error) { + console.log(error); + reject(error); + } + }); } // export default { scan, name } diff --git a/src/renderer/utils/scan.js b/src/renderer/utils/scan.js index 8837b77..79674a7 100644 --- a/src/renderer/utils/scan.js +++ b/src/renderer/utils/scan.js @@ -9,7 +9,7 @@ // const apt = require('apt.js'); async function asyncForEach(array, callback) { - console.log("Len " + array.length); + console.log("AsyncForEach Len " + array.length); for (let index = 0; index < array.length; index++) { try { var res = await callback(array[index], index, array); @@ -32,6 +32,7 @@ async function waitFor(milliseconds) { return new Promise(resolve => setTimeout(resolve, milliseconds)); } + async function scanGroundnetFiles(p, features) { var promise = new Promise(function (resolve, reject) { try { @@ -68,6 +69,50 @@ async function scanGroundnetFiles(p, features) { }); } +async function scanTrafficFiles(p, features) { + var promise = new Promise(function (resolve, reject) { + try { + console.log('Start Groundnets ' + p); + var files = traverseDir(p); + console.log(files); + + asyncForEach(files, async f => { + //await waitFor(5000); + try { + var text = await readAI(f, features); + console.log(text); + resolve(text); + } catch (error) { + console.error(error); + reject(error); + } + }).then(t => { + console.log("Finished"); + features.close(); + resolve(); + this.postMessage('DONE'); + }).catch(reason => { + console.log("Crashed"); + console.log(reason); + features.close() + this.postMessage('DONE'); + }); + + //walkDir(p, f => { readGroundnet(f, features) }); + + } catch (error) { + console.log(error); + reject(error); + } + }); +} + +/** + * + * @param {*} p + * @param {*} features + */ + function scanTrafficIntoDB(p, features) { try { console.log('Start Traffic ' + p + ' ' + features); @@ -85,9 +130,11 @@ function scanTrafficIntoDB(p, features) { console.log("No more entries!"); } }; + walkDir(p, f => { readAI(f, features) }); console.log("Closing"); features.close(); + this.postMessage('DONE'); console.log("End Traffic"); } catch (error) { console.log(error); @@ -123,56 +170,88 @@ function walkDir(dir, callback) { }); } +/** + * + * @param {*} f + * @param {*} apts + */ + function readAI(f, apts) { - try { - console.log(path.basename(f)); - // Reset - var airline = path.basename(f).match('([^.]+)'); - if (airline == null) - return; - var xmlSource = fs.readFileSync(f, 'utf8').toString(); - console.debug("read " + path.basename(f)); - // var doc = new domParser().parseFromString(xmlSource ); - // console.log("parsed "); - // var flights = xpath.select("/trafficlist/flight", doc); - // console.log("selected flight "); - // console.log(flights); - var dat = tXml(xmlSource); - // console.log(dat); - console.log(dat[0].children[0]); + var promise = new Promise(function (resolve, reject) { + try { + console.log(path.basename(f)); + // Reset + var airline = path.basename(f).match('([^.]+)\.xml'); + if (airline == null){ + resolve(); + return; + } + var xmlSource = fs.readFileSync(f, 'utf8').toString(); + console.debug("read airline " + path.basename(f)); + // var doc = new domParser().parseFromString(xmlSource ); + // console.log("parsed "); + // var flights = xpath.select("/trafficlist/flight", doc); + // console.log("selected flight "); + // console.log(flights); + var dat = tXml(xmlSource); + // console.log(dat); + if( !dat || !dat[0] || !dat[0].children || !dat[0].children[0] ) { + resolve(); + return; + } - var flightNodes = dat[0].children[0].children.filter(e => e.tagName === 'flight'); - flightNodes = tXml.simplify(flightNodes); + console.log(dat[0].children[0]); - console.log(flightNodes.flight); + var flightNodes = dat[0].children[0].children.filter(e => e.tagName === 'flight'); + flightNodes = tXml.simplify(flightNodes); + if (!flightNodes || !flightNodes.flight) { + resolve(); + return; + } - console.log("Departure flights " + flightNodes.flight.length); + console.log(flightNodes.flight); - var merged = new Array(); + console.log("Departure flights " + flightNodes.flight.length); - flightNodes.flight.map(n => { - merged.push(n.departure.port); - merged.push(n.arrival.port); - }).sort(); + var merged = new Array(); - var counts = {}; - for (var i = 0; i < merged.length; i++) { - counts[merged[i]] = 1 + (counts[merged[i]] || 0); + flightNodes.flight.map(n => { + merged.push(n.departure.port); + merged.push(n.arrival.port); + }).sort(); + + var counts = {}; + for (var i = 0; i < merged.length; i++) { + counts[merged[i]] = 1 + (counts[merged[i]] || 0); + } + + asyncForEach(Object.keys(counts), async key => { + console.log(key); + await store(key, airline[0], counts[key]); + }).then(t => { + console.log("Finished"); + resolve(); + }).catch(reason => { + console.log("Crashed"); + console.log(reason); + features.close() + }); + //for (var key in counts) { + // store(key, airline[0], counts[key]); + //} + + // var flights = xpath.select("/trafficlist/flight/departure/port/text()", doc); + // console.log(nodes); + // console.log(nodes); + // nodes = xpath.select("/trafficlist/flight/arrival/port/text()", doc); + // console.log(nodes); + + } catch (error) { + console.error(error); + reject(error); } - - for (var key in counts) { - store(key, airline[0], counts[key]); - } - - // var flights = xpath.select("/trafficlist/flight/departure/port/text()", doc); - // console.log(nodes); - // console.log(nodes); - // nodes = xpath.select("/trafficlist/flight/arrival/port/text()", doc); - // console.log(nodes); - - } catch (error) { - console.error(error); - } + }); + return promise; } /** @@ -184,7 +263,7 @@ function readAI(f, apts) { function store(icao, airline, value) { var promise = new Promise(function (resolve, reject) { - console.log("Airport " + icao + " has " + value + " flights"); + console.log("Airport " + icao + " has " + value + " new flights"); // Make a request to get a record by key from the object store var transaction = features.transaction("airports", "readwrite"); var objectStore = transaction.objectStore("airports"); @@ -313,10 +392,15 @@ async function readGroundnet(f, features) { } } else if (filename[2] == 'groundnet') { console.log('groundnet : ' + filename[1]); - var nodes = dat['?xml'].groundnet.TaxiNodes; - feature['properties']['groundnet'] = nodes ? true : false; - var nodes = dat['?xml'].groundnet.Parking; - feature['properties']['parking'] = nodes ? true : false; + if (dat['?xml'].groundnet) { + var nodes = dat['?xml'].groundnet.TaxiNodes; + if (nodes && nodes.node) { + console.log(nodes); + } + feature['properties']['groundnet'] = nodes && nodes.node ? nodes.node.length : 0; + var nodes = dat['?xml'].groundnet.parkingList; + feature['properties']['parking'] = nodes && nodes.Parking ? nodes.Parking.length : 0; + } } else if (filename[2] == 'ils') { console.log('ils : ' + filename[1]); if (dat['?xml'].PropertyList.runways) { @@ -380,7 +464,6 @@ function createFeature(icao) { } function mean(coord1, coord2) { - return (coord1 + coord2) / 2; } // export default { scanAPT, scanTraffic, scanGroundnet } diff --git a/src/renderer/utils/worker.js b/src/renderer/utils/worker.js index 92e0f84..a016aae 100644 --- a/src/renderer/utils/worker.js +++ b/src/renderer/utils/worker.js @@ -18,8 +18,8 @@ function errorReceiver(event) { onmessage = function (event) { postMessage('scanStarted'); console.log(event.data); - if (event.data === 'scan') { - scanGroundnet().then(result => { + if (event.data[0] === 'scan') { + scanGroundnet(event.data[1]).then(result => { console.log("DONE Scanning"); postMessage('DONE', 'this'); // event.origin.webContents.send('scanFinished'); @@ -28,8 +28,8 @@ onmessage = function (event) { console.log('Crashed'); console.log(result); }); - } else if (event.data === 'scanai') { - scanai().then(result => { + } else if (event.data[0] === 'scanai') { + scanai(event.data[1]).then(result => { console.log("DONE Scanning"); postMessage('DONE'); // event.origin.webContents.send('scanFinished'); @@ -39,8 +39,8 @@ onmessage = function (event) { console.log(result); }); } - else if (event.data === 'scanapt') { - scanAPT().then(result => { + else if (event.data[0] === 'scanapt') { + scanAPT(event.data[1]).then(result => { console.log("DONE Scanning"); postMessage('DONE'); // event.origin.webContents.send('scanFinished'); @@ -53,28 +53,34 @@ onmessage = function (event) { } }; -async function scanGroundnet() { +async function scanGroundnet(fdir) { var promise = new Promise(function (resolve, reject) { return initDB().then(features => { - var d = path.join(homedir, '/Documents/Flightgear/main/Airports/A'); + var d = path.join(fdir); scanGroundnetFiles(d, features); }); }); return promise; } -function scanai() { - return initDB().then(features => { - scanTrafficIntoDB("C:/GIT/fgmeta/fgdata/AI/Traffic", features); +async function scanai(fdir) { + var promise = new Promise(function (resolve, reject) { + return initDB().then(features => { + var d = path.join(fdir); + scanTrafficFiles(d, features); + }); }); + return promise; } async function scanAPT() { - return initDB().then(features => { - var d = path.join(homedir, 'Documents/apt.dat'); - scanAPTIntoDB(d, features); - console.log("Closed DB"); + var promise = new Promise(function (resolve, reject) { + return initDB().then(features => { + var d = path.join(homedir, 'Documents/apt.dat'); + scanAPTIntoDB(d, features); + }); }); + return promise; }