51 lines
1.5 KiB
JavaScript
51 lines
1.5 KiB
JavaScript
// Load dependencies
|
|
const { TimerMgr } = require('../utils');
|
|
const tm = new TimerMgr();
|
|
|
|
function debounceFunction(id, debounceTimeout, func, params) {
|
|
console.warn('debounce', id, debounceTimeout);
|
|
|
|
timeout = time.ZonedDateTime.now().plusNanos(debounceTimeout * 1000000);
|
|
|
|
if (tm.hasTimer(id) && tm.isActive(id)) {
|
|
log.info(`Skip evaluation of function with id ${id} as function is already running. Reschedule timer`);
|
|
tm.reschedule(id, timeout);
|
|
} else {
|
|
log.info(`Create timer to execute function ${id}`);
|
|
if (tm.hasTimer(id)) {
|
|
tm.cancel(id);
|
|
}
|
|
tm.create(id, timeout, func, params);
|
|
}
|
|
}
|
|
|
|
function distanceFrom(locationA, locationB) {
|
|
const [lat1, lon1] = locationA.split(',').map(Number);
|
|
const [lat2, lon2] = locationB.split(',').map(Number);
|
|
|
|
const toRadians = (degree) => degree * (Math.PI / 180);
|
|
|
|
const radLat1 = toRadians(lat1);
|
|
const radLon1 = toRadians(lon1);
|
|
const radLat2 = toRadians(lat2);
|
|
const radLon2 = toRadians(lon2);
|
|
|
|
if (lat1 === lat2 && lon1 === lon2) return '0 m';
|
|
|
|
const dlon = radLon2 - radLon1;
|
|
const dlat = radLat2 - radLat1;
|
|
|
|
const a = Math.pow(Math.sin(dlat / 2), 2)
|
|
+ Math.cos(radLat1) * Math.cos(radLat2)
|
|
* Math.pow(Math.sin(dlon / 2), 2);
|
|
|
|
const c = 2 * Math.asin(Math.sqrt(a));
|
|
const r = 6371000; // Radius of earth in meters
|
|
|
|
return `${(c * r).toFixed()} m`;
|
|
}
|
|
|
|
module.exports = {
|
|
debounceFunction,
|
|
distanceFrom
|
|
}; |