/******************************************************************************
* Web based vehicle tracker based on Freematics Hub
* Developed by Stanley Huang https://www.facebook.com/stanleyhuangyc
* Distributed under BSD license
* Visit https://freematics.com/hub/api for Freematics Hub API reference
* To obtain your Freematics Hub server key, contact support@freematics.com.au
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
onResize();
USER.load("updateUI()");
var chart;
$(function () {
$(document).ready(function () {
var options = {
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 10000,
};
navigator.geolocation.getCurrentPosition(
function (pos) {
OSMAP.init("map", pos.coords.latitude, pos.coords.longitude, 15);
//OSMAP.setCenter([pos.coords.latitude, pos.coords.longitude]);
}, null, options);
});
});
var myStyle = {
"color": "#0000ff",
"weight": 5,
"opacity": 0.65
};
function getDateFromGPSFormat(date, time)
{
var d = new Date();
if (date.length == 6) {
d.setUTCFullYear(2000 + (date % 100));
d.setUTCMonth(Math.floor(date / 100) % 100 - 1);
d.setUTCDate(Math.floor(date / 10000));
} else {
d.setUTCFullYear(Math.floor(date / 10000));
d.setUTCMonth(Math.floor(date / 100) % 100 - 1);
d.setUTCDate(date % 100);
}
if (time) {
d.setUTCHours(Math.floor(time / 1000000))
d.setUTCMinutes(Math.floor((time % 1000000) / 10000));
d.setUTCSeconds(Math.floor((time % 10000) / 100));
d.setUTCMilliseconds((time % 100) * 10);
}
return d;
}
function getISOFromLocal(date, time) {
var d = new Date(Math.floor(date / 10000),
Math.floor(date / 100) % 100 - 1,
date % 100,
Math.floor(time / 10000),
Math.floor((time % 10000) / 100),
Math.floor(time % 100)
);
return d.toISOString();
/*
var utc = d.getUTCFullYear();
if (d.getUTCMonth() < 9) utc += "0";
utc += (d.getUTCMonth() + 1);
if (d.getUTCDate() < 10) utc += "0";
utc += d.getUTCDate();
utc += "-";
if (d.getHours() < 10) utc += "0";
utc += d.getHours();
if (d.getMinutes() < 10) utc += "0";
utc += d.getMinutes();
if (d.getSeconds() < 10) utc += "0";
utc += d.getSeconds();
return utc;
*/
}
function goDash(devid)
{
var s = "?";
if (USER.user) s += "user=" + USER.user + "&";
s += "devid=" + devid;
location.href = s;
}
function goNextDash(devid)
{
if (USER.info.devid) {
for (var i = 0; i < USER.info.devid.length; i++) {
if (USER.info.devid[i] == devid) {
goDash(USER.info.devid[(i + 1) % USER.info.devid.length]);
return;
}
}
}
}
function updateUI()
{
var opts = document.getElementById("opts_range");
setRange(opts.value);
opts.style.display = "block";
TRIPS.list();
if (!USER.info) {
document.getElementById("info").innerHTML = "DEVICE: " + USER.devid;
return;
}
var s = "";
document.getElementById("info").innerHTML = s;
}
var TRIPS = {
xhr: new XMLHttpRequest(),
startTimeEpoc: null,
startDeviceTick: null,
histroy: null,
series: [],
tripID: null,
loadTrip: function(tripIndex)
{
this.xhr.onreadystatechange = function () {
if (this.readyState != 4) return;
if (this.status != 200) {
if (this.status >= 500) {
alert("Server under maintenance (status: " + this.status + ")");
}
return;
}
var data = JSON.parse(this.responseText);
if (!data || !data.trip) {
document.getElementById("trips").innerHTML = "No location data";
document.getElementById("chart").style.display = "none";
OSMAP.clear();
return;
}
var length = data.trip.coordinates.length;
var features = new Array;
var tripDate = TRIPS.tripID.substr(0, 8);
var startTime = getDateFromGPSFormat(data.stats.start.date ? data.stats.start.date : tripDate, data.stats.start.time);
var finishTime = getDateFromGPSFormat(data.stats.end.date ? data.stats.end.date : tripDate, data.stats.end.time);
TRIPS.startTimeEpoc = Date.parse(startTime.toISOString()) - startTime.getTimezoneOffset() * 60000;
TRIPS.startDeviceTick = data.stats.start.ts;
features.push({
type: "Feature", properties: { name: "Start", info: startTime }, geometry: { type: "Point", coordinates: data.trip.coordinates[0] }
});
features.push({
type: "Feature", properties: { name: "Finish", info: finishTime }, geometry: { type: "Point", coordinates: data.trip.coordinates[length - 1] }
});
var index;
var indexTopSpeed;
var topSpeed = 0;
var longestStopping = 0;
var totalStopping = 0;
for (var i = 0; i < length; i++) {
var speed = data.trip.speeds[i];
if (index == null && speed == 0) {
index = i;
} else if (index != null && speed > 1) {
var duration = Math.floor((data.trip.timestamps[i] - data.trip.timestamps[index]) / 1000);
if (duration > longestStopping) longestStopping = duration;
if (duration >= STOP_TIME_MIN) {
// stopped
features.push({
type: "Feature", properties: { name: "Stopping", info: duration + " seconds" }, geometry: { type: "Point", coordinates: data.trip.coordinates[index] }
});
}
totalStopping += duration;
index = null;
}
if (speed > topSpeed) {
topSpeed = speed;
indexTopSpeed = i;
}
}
/*
features.push({
type: "Feature", properties: { name: "Top Speed", info: topSpeed + " km/h" }, geometry: { type: "Point", coordinates: data.trip.coordinates[indexTopSpeed] }
});
*/
// generate popup info
var info = "Distance: " + (data.stats.distance / 1000).toFixed(1) + " km";
var duration = Math.floor((data.stats.end.ts - data.stats.start.ts) / 1000);
var hr = Math.floor(duration / 3600);
var min = Math.floor((duration % 3600) / 60);
var sec = duration % 60;
info += "
Duration: ";
if (hr) info += hr + " hours ";
if (hr || min) info += min + " minutes ";
if (hr == 0 && sec) info += sec + " seconds";
if (topSpeed >= 1) info += "
Top Speed: " + topSpeed + " km/h";
info += "
Average Speed: " + (data.stats.distance / duration * 3600 / 1000).toFixed(1) + " km/h";
if (totalStopping) info += "
Total Stopping Time: " + (totalStopping / 60).toFixed(0) + " minutes";
info += "
Max Stopping Time: " + longestStopping + " seconds";
// generate summary
var summ = "