184 lines
4.3 KiB
JavaScript
184 lines
4.3 KiB
JavaScript
|
//50135458, 50949601
|
||
|
|
||
|
function getAirTime(tracks) {
|
||
|
let accumTime = 0;
|
||
|
if (tracks && tracks.length > 0) {
|
||
|
let prev = tracks[0];
|
||
|
let initialTime;
|
||
|
let track;
|
||
|
|
||
|
if (tracks.length === 1) {
|
||
|
return (prev.onGround === false) ? prev.time : 0;
|
||
|
}
|
||
|
|
||
|
if (prev.onGround === false) {
|
||
|
initialTime = 0;
|
||
|
// console.log('initialTime', initialTime, prev.time);
|
||
|
}
|
||
|
for (let index = 1; index < tracks.length; index++) {
|
||
|
track = tracks[index];
|
||
|
if (prev.onGround !== track.onGround) {
|
||
|
if (isInitialTimeSet(initialTime)) {
|
||
|
accumTime += Math.round((prev.time + track.time) / 2) - initialTime;
|
||
|
|
||
|
// console.log('accumTime', accumTime, prev.time, track.time);
|
||
|
initialTime = undefined;
|
||
|
} else {
|
||
|
initialTime = Math.round((prev.time + track.time) / 2);
|
||
|
// console.log('initialTime', initialTime, prev.time, track.time);
|
||
|
}
|
||
|
}
|
||
|
prev = track;
|
||
|
}
|
||
|
if (!track.onGround && isInitialTimeSet(initialTime)) {
|
||
|
accumTime += track.time - initialTime;
|
||
|
// console.log('accumTime', accumTime, track.time);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
return accumTime;
|
||
|
|
||
|
}
|
||
|
|
||
|
function isInitialTimeSet(num) {
|
||
|
return Number.isInteger(num);
|
||
|
}
|
||
|
|
||
|
function calculateTime(tracks) {
|
||
|
// const states = getShortStates(tracks);
|
||
|
// const depTime = getDepartingTime(states);
|
||
|
// const arrTime = getOnBlocksTime(states);
|
||
|
// console.log((arrTime - depTime));
|
||
|
// const time = ((arrTime - depTime));
|
||
|
// console.log('time :>> ', `${Math.trunc(time / 60 / 60)}h ${Math.round((time % 1) * 60)}m`, );
|
||
|
// return time;
|
||
|
return getAirTime(tracks);
|
||
|
}
|
||
|
|
||
|
function getShortStates(tracks) {
|
||
|
let short = [];
|
||
|
if (tracks && tracks.length > 0) {
|
||
|
let track;
|
||
|
let prev = tracks[0];
|
||
|
short.push(getTrace(prev));
|
||
|
let index = 1;
|
||
|
for (; index < tracks.length - 1; index++) {
|
||
|
track = tracks[index];
|
||
|
if (prev.onGround !== track.onGround || prev.state !== track.state) {
|
||
|
short.push(getTrace(track))
|
||
|
}
|
||
|
prev = track;
|
||
|
}
|
||
|
|
||
|
short.push(getTrace(tracks[index]))
|
||
|
|
||
|
}
|
||
|
|
||
|
return short;
|
||
|
|
||
|
// if (!tracks || tracks.length === 0) {
|
||
|
// return [];
|
||
|
// }
|
||
|
|
||
|
// while (tracks[0] && tracks[0].state === 'En Route') {
|
||
|
// tracks.shift();
|
||
|
// }
|
||
|
|
||
|
// if (tracks.length === 0) {
|
||
|
// return [];
|
||
|
// }
|
||
|
|
||
|
// let lastState = '';
|
||
|
// let lastOnGround;
|
||
|
// let short = [];
|
||
|
// let states = [];
|
||
|
// let lastPushed = -1;
|
||
|
// let index = 0;
|
||
|
// let prevTrack;
|
||
|
|
||
|
// for (; index < tracks.length; index++) {
|
||
|
// const track = tracks[index];
|
||
|
// if (index > 0) {
|
||
|
// prevTrack = tracks[index - 1];
|
||
|
// }
|
||
|
// if (track.state !== lastState || track.onGround !== lastOnGround) {
|
||
|
// console.log(index, lastPushed);
|
||
|
// if (index > 0 && index > lastPushed - 1) {
|
||
|
// states.push(getTrace(prevTrack));
|
||
|
// }
|
||
|
// short.push(track);
|
||
|
// states.push(getTrace(track));
|
||
|
// lastPushed = index;
|
||
|
// lastState = track.state;
|
||
|
// lastOnGround = track.onGround;
|
||
|
// }
|
||
|
// }
|
||
|
// if (index > 0 && index > lastPushed) {
|
||
|
// states.push(getTrace(tracks[index - 1]));
|
||
|
// }
|
||
|
// return states;
|
||
|
}
|
||
|
|
||
|
function getTrace(track) {
|
||
|
const {
|
||
|
state,
|
||
|
time,
|
||
|
onGround,
|
||
|
groundSpeed,
|
||
|
altitude,
|
||
|
arrivalDistance,
|
||
|
departureDistance,
|
||
|
latitude,
|
||
|
longitude,
|
||
|
pitch,
|
||
|
} = track;
|
||
|
return {
|
||
|
state,
|
||
|
time,
|
||
|
onGround,
|
||
|
groundSpeed,
|
||
|
altitude,
|
||
|
arrivalDistance,
|
||
|
departureDistance,
|
||
|
latitude,
|
||
|
longitude,
|
||
|
pitch,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function getDepartingTime(states) {
|
||
|
const prevState = 'Boarding';
|
||
|
const nextState = 'Departing';
|
||
|
|
||
|
for (let index = 1; index < states.length; index++) {
|
||
|
const prev = states[index - 1];
|
||
|
const state = states[index];
|
||
|
if (prev.state === prevState && state.state === nextState) {
|
||
|
return Math.round((state.time + prev.time) / 2);
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
function getOnBlocksTime(states) {
|
||
|
const STATE = 'On Blocks';
|
||
|
const PREV_STATE = 'Landed';
|
||
|
let time = -1;
|
||
|
|
||
|
for (let index = 1; index < states.length; index++) {
|
||
|
const state = states[index];
|
||
|
const prev = states[index - 1];
|
||
|
if (prev.state === PREV_STATE && state.state === STATE) {
|
||
|
time = Math.round((state.time + prev.time) / 2);
|
||
|
}
|
||
|
}
|
||
|
return time;
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
calculateTime,
|
||
|
getShortStates,
|
||
|
getDepartingTime,
|
||
|
getOnBlocksTime,
|
||
|
getAirTime,
|
||
|
};
|