|
|
|
|
@@ -15,22 +15,20 @@ using tink.CoreApi;
|
|
|
|
|
You need at least 3 computers that know their position to determine the position of the computer.
|
|
|
|
|
**/
|
|
|
|
|
class GPS {
|
|
|
|
|
public static var instance:GPS;
|
|
|
|
|
private static var shouldRespond = true;
|
|
|
|
|
private static var shouldDoWholeNumberCheck = true;
|
|
|
|
|
private static var posAccuracy = 0; // 0 = unkown, 1 = (ins,best guess), 2 = (stored/manual,should be right), 3 = (gps,confirmed)
|
|
|
|
|
private static var cachedPosition:Pos3;
|
|
|
|
|
private static var lastPositionResponse: Array<{pos:Pos3,dist:Float}> = [];
|
|
|
|
|
|
|
|
|
|
private var shouldRespond = true;
|
|
|
|
|
private var shouldDoWholeNumberCheck = true;
|
|
|
|
|
private var posAccuracy = 0; // 0 = unkown, 1 = (ins,best guess), 2 = (stored/manual,should be right), 3 = (gps,confirmed)
|
|
|
|
|
private var cachedPosition:Pos3;
|
|
|
|
|
private var lastPositionResponse: Array<{pos:Pos3,dist:Float}> = [];
|
|
|
|
|
|
|
|
|
|
private var futureResolve: (pos:Null<Pos3>) -> Void = null;
|
|
|
|
|
private static var futureResolve: (pos:Null<Pos3>) -> Void = null;
|
|
|
|
|
|
|
|
|
|
@:allow(kernel.Init)
|
|
|
|
|
private function new() {
|
|
|
|
|
this.loadCachedPosition();
|
|
|
|
|
private static function init() {
|
|
|
|
|
loadCachedPosition();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function setManualPosition(pos:Pos3) {
|
|
|
|
|
public static function setManualPosition(pos:Pos3) {
|
|
|
|
|
var kvstore = new KVStore("gps");
|
|
|
|
|
kvstore.set("mpos",pos);
|
|
|
|
|
kvstore.save();
|
|
|
|
|
@@ -42,39 +40,39 @@ class GPS {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@:allow(kernel.gps.INS)
|
|
|
|
|
private function setINSPosition(pos:Pos3) {
|
|
|
|
|
private static function setINSPosition(pos:Pos3) {
|
|
|
|
|
cachedPosition = pos;
|
|
|
|
|
posAccuracy = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getPosition():Null<Pos3> {
|
|
|
|
|
public static function getPosition():Null<Pos3> {
|
|
|
|
|
return cachedPosition;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getAccuracy():Int {
|
|
|
|
|
public static function getAccuracy():Int {
|
|
|
|
|
return posAccuracy;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function invalidatePosition() {
|
|
|
|
|
public static function invalidatePosition() {
|
|
|
|
|
cachedPosition = null;
|
|
|
|
|
posAccuracy = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function locate():Future<Null<Pos3>> {
|
|
|
|
|
public static function locate():Future<Null<Pos3>> {
|
|
|
|
|
// TODO: implenet a timeout
|
|
|
|
|
// TODO: dont send a request twice if the last one is still pending or we moved
|
|
|
|
|
return new Future<Null<Pos3>>((resolve)->{
|
|
|
|
|
this.futureResolve = resolve;
|
|
|
|
|
futureResolve = resolve;
|
|
|
|
|
sendPositionRequest();
|
|
|
|
|
return null;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function resolveFuture(pos:Null<Pos3>) {
|
|
|
|
|
this.futureResolve(pos);
|
|
|
|
|
private static function resolveFuture(pos:Null<Pos3>) {
|
|
|
|
|
futureResolve(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function persistCachedPositon() {
|
|
|
|
|
private static function persistCachedPositon() {
|
|
|
|
|
if (cachedPosition == null) return;
|
|
|
|
|
var kvstore = new KVStore("gps");
|
|
|
|
|
|
|
|
|
|
@@ -82,7 +80,7 @@ class GPS {
|
|
|
|
|
kvstore.save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function loadCachedPosition() {
|
|
|
|
|
private static function loadCachedPosition() {
|
|
|
|
|
var kvstore = new KVStore("gps");
|
|
|
|
|
kvstore.load();
|
|
|
|
|
|
|
|
|
|
@@ -119,12 +117,12 @@ class GPS {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function sendPositionRequest() {
|
|
|
|
|
private static function sendPositionRequest() {
|
|
|
|
|
Net.brodcastGPSRequest();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@:allow(kernel.net.Net)
|
|
|
|
|
private function handlePackage(pack:Package<Noise>, dist: Float,iface: INetworkInterface) {
|
|
|
|
|
private static function handlePackage(pack:Package<Noise>, dist: Float,iface: INetworkInterface) {
|
|
|
|
|
switch (pack.type) {
|
|
|
|
|
case GPSRequest:
|
|
|
|
|
if (!shouldRespond) return;
|
|
|
|
|
@@ -159,7 +157,7 @@ class GPS {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function calculatePosition():Null<Pos3> {
|
|
|
|
|
private static function calculatePosition():Null<Pos3> {
|
|
|
|
|
if (lastPositionResponse.length < 3) return null;
|
|
|
|
|
|
|
|
|
|
// do a simple trilateration with the last 3 responses for now
|
|
|
|
|
@@ -210,7 +208,7 @@ class GPS {
|
|
|
|
|
/**
|
|
|
|
|
Determines the position(s) of a point given 3 other points and the distance to each of them.
|
|
|
|
|
**/
|
|
|
|
|
private function trilateration(p1:Pos3,p2:Pos3,p3: Pos3,r1:Float,r2:Float,r3:Float):Pair<Pos3,Pos3> {
|
|
|
|
|
private static function trilateration(p1:Pos3,p2:Pos3,p3: Pos3,r1:Float,r2:Float,r3:Float):Pair<Pos3,Pos3> {
|
|
|
|
|
var a2b = p2 - p1;
|
|
|
|
|
var a2c = p3 - p1;
|
|
|
|
|
|
|
|
|
|
|