Created
May 29, 2014 03:25
-
-
Save sarfata/df39171bebee7766b816 to your computer and use it in GitHub Desktop.
JSConf'14 Scavenger Hunt app
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var card = new Pebble.UI.Card({ title: "JSConf 2014", subtitle: "Scavenger Hunt", scrollable: true }); | |
card.show(); | |
var msg = "Contacting NSA to get your current position "; | |
var timer = setInterval(function() { | |
card.body(msg); | |
msg += "."; | |
}, 800); | |
function distanceBetweenCoordinates(pos1, pos2) { | |
var R = 6371; // Radius of the earth in km | |
var dLat = (pos2.latitude - pos1.latitude) * (Math.PI/180); // deg2rad below | |
var dLon = (pos2.longitude - pos1.longitude) * (Math.PI/180); | |
var a = | |
Math.sin(dLat/2) * Math.sin(dLat/2) + | |
Math.cos((pos1.latitude) * (Math.PI/180)) * Math.cos(pos2.latitude * (Math.PI/180)) * | |
Math.sin(dLon/2) * Math.sin(dLon/2) | |
; | |
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); | |
var d = R * c * 1000; // Distance in m | |
return d; | |
} | |
function angleBetweenCoords(pos1, pos2) { | |
var dLon = (pos2.longitude - pos1.longitude); | |
var y = Math.sin(dLon) * Math.cos(pos2.latitude); | |
var x = Math.cos(pos1.latitude) * Math.sin(pos2.latitude) - Math.sin(pos1.latitude) * Math.cos(pos2.latitude) * Math.cos(dLon); | |
var brng = Math.atan2(y, x); | |
brng = brng * (180 / Math.PI); | |
brng = (brng + 360) % 360; | |
brng = 360 - brng; | |
return brng; | |
} | |
var cardinals = { | |
'N': [ 360 - 45/2, 360+45/2 ], | |
'NE': [ 45 - 45/2, 45 + 45/2 ], | |
'E' : [ 90 - 45/2, 90 + 45/2 ], | |
'SE': [ 135 - 45/2, 135 + 45/2 ], | |
'S': [ 180 - 45/2, 180 + 45/2 ], | |
'SW': [ 225 - 45/2, 225 + 45/2 ], | |
'W': [ 270 - 45/2, 270 + 45/2 ], | |
'NW': [ 315 - 45/2, 315 + 45/2 ] | |
}; | |
function angleToCardinal(angle) { | |
console.log("AngleToCardinals: " + angle); | |
for (var k in cardinals) { | |
if (angle >= cardinals[k][0] && angle <= cardinals[k][1]) { | |
return k; | |
} | |
} | |
return "???"; | |
} | |
var targetCoords = { latitude: 30.5625, longitude: -81.453611 }; | |
var foundTree = false; | |
function gotPosition(pos) { | |
clearInterval(timer); | |
var distance = distanceBetweenCoordinates(pos.coords, targetCoords); | |
var angle = angleBetweenCoords(pos.coords, targetCoords); | |
console.log("Got Position: " + JSON.stringify(pos)); | |
console.log("Distance: " + distance + " Angle: " + angle); | |
if (distance > 20) { | |
card.body("You are " + Math.round(distance) + "m from the goal! Direction: " + angleToCardinal(angle)); | |
foundTree = false; | |
} else { | |
card.body("Good! You made it! Take a picture of your team with the 'Landmark Oak'\n\nThis demo was built entirely in JS - Check the source on pbl.io/jsconfscavengersource"); | |
} | |
} | |
function positionError(err) { | |
clearInterval(timer); | |
console.log("Unable to get coordinates ... :( " + err.code + " " + err.message); | |
card.body("NSA does not like you ... No luck with GPS."); | |
} | |
setTimeout(function() { | |
navigator.geolocation.watchPosition(gotPosition, positionError, { enableHighAccuracy: true, maximumAge: 0 }); | |
}, 3000); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment