Skip to content

Instantly share code, notes, and snippets.

@gabonator
Created May 22, 2015 11:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gabonator/e5f004b82e78a9284034 to your computer and use it in GitHub Desktop.
Save gabonator/e5f004b82e78a9284034 to your computer and use it in GitHub Desktop.
Sygic aura gps emulator
<html>
<head>
<title>Night rider</title>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
html { height: 100%; width:100%}
body { width:100%; height: 100%; margin: 0; padding: 0 }
#map-canvas { width:100%; height: 100%; z-index:2}
#map-canvas-small {
position:absolute; width:300px; height:300px; right:100px; top:100px; z-index:5;
box-shadow: 2px 2px 5px #888888;
}
#info {
padding-left:4px;
padding-right:4px;
padding-top:2px;
width:292px; height:40px; position:absolute; top:50px; right:100px; z-index:6; background:#ffffff;
font-family:arial; font-size:15px;
box-shadow: 2px 2px 5px #888888;
}
#tools {width:300px; height:60px; position:absolute; top:420px; right:100px; z-index:6;
font-family:arial; font-size:15px;
}
</style>
<script type="text/javascript"
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyA5YCStfqf6-KLMm3UJbwRK3Kx6zRxffl8&libraries=geometry">
</script>
</head>
<body>
<div id="map-canvas"/></div>
<div id="map-canvas-small"/></div>
<img id="car" style="position:absolute; width:40px; height:40px; left:50%; top:50%; margin-left:-20px; margin-top:-20px; z-index:6; transform:rotate(45deg)">
<div id="info" onClick="connect()"/></div>
<div id="tools">
<input type="button" value="Enable debug" onClick="Send('SygicDebug(1);')">
<input type="button" value="Disable debug" onClick="Send('SygicDebug(0);')">
</div>
</body>
</html>
<script language="javascript">
function getStorage(key, def)
{
if (typeof(Storage) == "undefined")
return def;
if (localStorage.getItem(key) === null)
return def;
return localStorage.getItem(key);
}
function setStorage(key, value)
{
if (typeof(Storage) == "undefined")
return def;
localStorage.setItem(key, value);
}
var map, mapMini, markerMini, markerPos=[];
var markerIndex = 0;
var glob_ip = "10.0.15.59"; //"localhost";
var glob_position = {y:48.14389, x:17.10972};
glob_position.x = parseFloat(getStorage("sym_car_x", glob_position.x));
glob_position.y = parseFloat(getStorage("sym_car_y", glob_position.y));
glob_ip = getStorage("ip", glob_ip);
function initialize()
{
var mapOptions = {
center: new google.maps.LatLng(glob_position.y, glob_position.x),
zoom: 20,
keyboardShortcuts: false,
disableDefaultUI: true
};
map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
mapOptions.zoom = 15;
mapMini = new google.maps.Map(document.getElementById("map-canvas-small"), mapOptions);
markerMini = new google.maps.Marker({
position: map.getCenter(),
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: 4,
},
draggable: false,
map: mapMini
});
for (var i=0; i<5; i++)
{
markerPos[i] = new google.maps.Marker({
position: map.getCenter(),
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: 4,
},
draggable: false,
map: map
});
}
google.maps.event.addListener(mapMini, 'click', function(e) {
car.y = e.latLng.lat();
car.x = e.latLng.lng();
});
google.maps.event.addListener(map, 'click', function(e) {
socket.send("TMC.AddEvent("+Math.floor(e.latLng.lng()*100000)+","+Math.floor(e.latLng.lat()*100000)+");");
});
setIcon();
}
google.maps.event.addDomListener(window, 'load', initialize);
var keys = [];
var c = {left:37, right:39, up:38, down:40}
var car = {rotation:0, x:glob_position.x, y:glob_position.y, spd:0};
var vect = {x:0.0000001/Math.cos(car.y*Math.PI/180), y:0.0000001};
var lastSend = (new Date()).getTime();
var lastPos = new google.maps.LatLng(car.y, car.x);
function update()
{
if ( keys[c.left] )
car.rotation -= 5;
if ( keys[c.right] )
car.rotation += 5;
if ( keys[c.up] )
car.spd += 1;
else
if ( keys[c.down] )
{
car.spd *= 0.95;
car.spd -= 1;
} else
car.spd *= 0.95;
car.spd *= 0.99;
var spdmul = 1/Math.pow(2, map.getZoom()-20);
car.x += Math.cos(car.rotation*Math.PI/180)*car.spd*spdmul*vect.x;
car.y -= Math.sin(car.rotation*Math.PI/180)*car.spd*spdmul*vect.y;
if ( car.spd < 0.01 )
return;
// update pos
document.getElementById("car").style.transform = "rotate("+car.rotation.toFixed(1)+"deg)";
document.getElementById("car").style.webkitTransform = "rotate("+car.rotation.toFixed(1)+"deg)";
map.setCenter(new google.maps.LatLng(car.y,car.x));
markerMini.setPosition(new google.maps.LatLng(car.y,car.x));
if ( car.spd > 0.1 )
mapMini.setCenter(new google.maps.LatLng(car.y,car.x));
// send coords
var curTime = (new Date()).getTime();
var period = 500;
if ( curTime > lastSend+period)
{
lastSend = curTime;
var prevP = markerPos[markerIndex].position;
var newP = new google.maps.LatLng(car.y,car.x);
distance = google.maps.geometry.spherical.computeDistanceBetween(prevP, newP);
passed = google.maps.geometry.spherical.computeDistanceBetween(lastPos, newP);
var spd = passed*3600/period;
document.getElementById("info").innerHTML = getConInfo() +
"spd = "+spd.toFixed(1) + "Km/h";
lastPos = newP;
if (distance > 5)
{
markerPos[markerIndex++].setPosition(new google.maps.LatLng(car.y,car.x));
if (markerIndex>=markerPos.length)
markerIndex = 0;
}
if (connected)
{
var angle = Math.floor(car.rotation);
angle = (angle+3600+90)%360;
var cmd = "GPS.SetSpeed("+spd.toFixed(1)+");\n"
cmd += "GPS.SetCourse("+angle+");\n";
cmd += "GPS.SetPosition("+Math.floor(car.x*100000)+","+Math.floor(car.y*100000)+");\n";
socket.send(cmd);
}
if ( car.spd < 0.1 )
{
setStorage("sym_car_x", car.x.toFixed(9));
setStorage("sym_car_y", car.y.toFixed(9));
}
}
}
setInterval("update()", 50);
setInterval("updateRoute()", 2000);
document.addEventListener("keydown", function(e) {keys[e.keyCode] = 1;}, false);
document.addEventListener("keyup", function(e) {keys[e.keyCode] = 0;}, false);
// websocket
var socket;
var buffer = "";
var connected = 0, connecting = 0;
function connect()
{
var new_ip = window.prompt("Enter IP address", glob_ip);
if ( new_ip == null || new_ip == "" )
return;
glob_ip = new_ip;
setStorage("ip", glob_ip);
var url = "ws://"+glob_ip+":38950/index.html";
console.log("Connecting to "+url);
connecting = 1;
socket = new WebSocket(url);
socket.onopen = function()
{
console.log("Connected!");
connecting = 0;
connected = 1;
}
socket.onclose = function()
{
console.log("Connection lost!");
connecting = 0;
connected = 0;
}
socket.onerror = function()
{
console.log("Connection lost!");
connecting = 0;
connected = 0;
}
socket.onmessage = function(msg)
{
buffer += new String(msg.data);
var lines = buffer.split("\n");
while ( lines.length > 1 )
Receive( lines.shift() );
buffer = lines.join("\n");
}
}
function Receive(line)
{
var key = "jshandler_";
if ( line.substr(0, key.length) == key )
{
setTimeout(line.substr(key.length), 0);
return;
}
console.log(line);
}
function getConInfo()
{
if (connected)
return "Connected to " + glob_ip + "<br>";
if (connecting)
return "Connecting...<br>";
return "Click here to connect" + "<br>";
}
// utils
var poly, polyMini, lastStart = lastPos;
function getRoute()
{
socket.send("Route.Get('jshandler_h');");
}
function hRouteAddStart()
{
if ( poly )
{
poly.setMap(null);
polyMini.setMap(null);
}
var polyOptions = {
strokeColor: '#b000b0',
strokeOpacity: 0.4,
strokeWeight: 10
};
poly = new google.maps.Polyline(polyOptions);
polyMini = new google.maps.Polyline(polyOptions);
}
function hRouteAddDone()
{
poly.setMap(map);
polyMini.setMap(mapMini);
}
function hRouteAddPoints(points)
{
var path = poly.getPath();
var pathMini = polyMini.getPath();
for (var i=0; i<points.length; i++)
{
var p = new google.maps.LatLng( points[i].lY / 100000, points[i].lX / 100000 );
path.push(p);
pathMini.push(p);
}
}
function updateRoute()
{
if (!connected)
return;
socket.send("_jshandler_hOnRoute(Route.Serialize());\n");
}
function hOnRoute(json)
{
var start = new google.maps.LatLng( json[1].lY / 100000, json[1].lX / 100000 );
if ( start.equals(lastStart) )
return;
lastStart = start;
console.log("Loading route.");
getRoute();
}
// Shortcut
function Send(cmd)
{
socket.send(cmd);
}
function setIcon()
{
document.getElementById("car").src =
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAABGdBTUEAALG" +
"PC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpR" +
"PAAAAmdQTFRFAAAAAAAtAAAfAAAcAAAdAAAjZzEXm0EWSigYAAAeAAgbAA0aAAgaAAEdBAsbOyMYaTIXh" +
"zsWnUIWq0YVsUgVrUcVqEUVo0QVnUIVlT8Wjj0WiDsWhDoWhDoWhToWhToWhToW1FMUkj8WfTgWgDkWgj" +
"kWoEMVtkoVuksVt0oVrEcVkj4WYi8XFBQaNiIYhDoWr0cVy1AU4VcU2lUUnkIWOCIYejcW4VcURykaCxY" +
"bnkIVFRodBREYsUgVbDQZPyUYvEwVkj4WxE4VqEYWyE8UvUwVylAUyVAUnkIWNSIYnEIWq0YVkT4WYS8X" +
"m0EWAAwa8FwT+F4T/WAT/2AT/mAT8lwT1VQVxE8WvEwVvEwWv00WwU4Ww04Wwk4Wu0wWuEsWy1AV61oT7" +
"1sT7VsU9F0T/2ET3FUT3FYVbzcdRC0iPCsiMCIbPCohQCwiQi0iRS0hSC4hUTAfZTUdjD8Zt0oWv04Xpk" +
"cYvU0X4lgV51oV6FoV6VoV6VoU810U/GAT5lkU+V8Tx00SlD0T5VgT0lMVlkIZjUAbhT4bfjkYhj4bmUM" +
"aqkgYwE4X2FUV71sUZjUeSS4hPSsiOSojPysikkEa914T9l4U0VETu0oUxU4V5FkV7lwUbzYa3VYVmUMZ" +
"ezscYDMeTS4fnEQZaTYdNiojOisjOysjQiwhw08W8l0U21YVvUsTqUQSzVAT71wVxFAX61oUZzYdNyojO" +
"CojcDgd+V4TZDUegTwb/F8T9F0U01MV9V4U3lcVskoXOysicTgdWzIf5loV3FcWgz0bSi4g71wUbDcd1F" +
"QVhj4a7FoTOyoht0sWAAAAHlvwuQAAAFB0Uk5TAAEFCQYDaN8pAw0QDgYII0p0mLC6tKmcjoBzaWRjZGK" +
"W+5tkZ22fwsjEsodDChZ1ueP59KgodPvJJ7OlCtXxTemg9dj88/7+sxaYsodD3hA10QTWAAAAAWJLR0QA" +
"iAUdSAAAAYVJREFUOMtjYBgFgxowMjEzs7Ai+GzsHCCKk4ubhxcuyMcvICgkLCIiKiYuISklLSMrIyevo" +
"KikrKKiqqauoamlraMLUqanb2BoFBAYFBwSEhoWHhEZFR0TGxUXn5AYEJCUHBgSHByUYmxiClRoZh6Umh" +
"ocnJgWmJ6RmZWdk5uXX1BYVFwSVlpWXlFZVV1TW5dab2HJwGDVEBISnBrU2NTc0trW3tHZ1tXd09tX3j9" +
"h4qTJU6ZOq50+Y+as2XOsbRhsg0KC586bv2DhohCgwUCQCgRTFy9ZumzZ0uUrVlauWr1m7br1dvYMDsHB" +
"GzZu2jxpyZatITAQnLJt8zIg2Lx9x46dVWG7pu3e48jglJq6dx9IcD+mwkkHkoFWBO2uPnjImcElNejwZ" +
"hwKlx6ZmwrihjQcdWVwS516DKfC/OOpEJFUd+IVEm010Z4hOniIDnAP5Cg8gScKoYniJDRRnMKZKDyRk9" +
"kKWDI7jZnMIAnXC3fC9fbx1cWTFfygWcEfKSuMgkEJACHcNSOTRRP7AAAAJXRFWHRkYXRlOmNyZWF0ZQA" +
"yMDE0LTA4LTEzVDEzOjIwOjA5KzAyOjAwxi8X2gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNC0wOC0xM1Qx" +
"MzoyMDowOSswMjowMLdyr2YAAAAASUVORK5CYII=";
}
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment