direction detection to determine if route recalculated should be announced

This commit is contained in:
sonora 2012-03-04 12:53:27 +01:00
parent 2249360ce2
commit a1f2342024
2 changed files with 60 additions and 54 deletions

View file

@ -227,58 +227,9 @@ public class RoutingHelper {
if(routeNodes.isEmpty() || routeNodes.size() <= currentRoute){ if(routeNodes.isEmpty() || routeNodes.size() <= currentRoute){
calculateRoute = true; calculateRoute = true;
} else { } else {
// Check whether user follow by route in correct direction // 1.
tryMarkPassedRoute(currentLocation);
// 1. try to mark passed route (move forward)
float dist = currentLocation.distanceTo(routeNodes.get(currentRoute));
while(currentRoute + 1 < routeNodes.size()){
float newDist = currentLocation.distanceTo(routeNodes.get(currentRoute + 1));
boolean proccesed = false;
if (newDist < dist){
if(newDist > 150){
// may be that check is really not needed ? only for start position
if(currentRoute > 0 ){
// check that we are not far from the route (if we are on the route distance doesn't matter)
float bearing = routeNodes.get(currentRoute - 1).bearingTo(routeNodes.get(currentRoute));
float bearingMovement = currentLocation.bearingTo(routeNodes.get(currentRoute));
float d = Math.abs(currentLocation.distanceTo(routeNodes.get(currentRoute)) * FloatMath.sin((bearingMovement - bearing)*3.14f/180f));
if(d > 50){
proccesed = true;
}
} else {
proccesed = true;
}
if(proccesed && log.isDebugEnabled()){
log.debug("Processed distance : " + newDist + " " + dist); //$NON-NLS-1$//$NON-NLS-2$
}
} else {
// case if you are getting close to the next point after turn
// but you haven't turned before (could be checked bearing)
if(currentLocation.hasBearing() || lastFixedLocation != null){
float bearingToPoint = currentLocation.bearingTo(routeNodes.get(currentRoute));
float bearingBetweenPoints = routeNodes.get(currentRoute).bearingTo(routeNodes.get(currentRoute+1));
float bearing = currentLocation.hasBearing() ? currentLocation.getBearing() : lastFixedLocation.bearingTo(currentLocation);
if(Math.abs(bearing - bearingToPoint) >
Math.abs(bearing - bearingBetweenPoints)){
if(log.isDebugEnabled()){
log.debug("Processed point bearing : " + Math.abs(currentLocation.getBearing() - bearingToPoint) + " " //$NON-NLS-1$ //$NON-NLS-2$
+ Math.abs(currentLocation.getBearing() - bearingBetweenPoints));
}
proccesed = true;
}
}
}
}
if(proccesed){
// that node already passed
updateCurrentRoute(currentRoute + 1);
dist = newDist;
} else {
break;
}
}
// 2. check if destination found // 2. check if destination found
if(finishAtLocation(currentLocation)){ if(finishAtLocation(currentLocation)){
return; return;
@ -342,6 +293,7 @@ public class RoutingHelper {
} }
} }
// 6. + 7.
directionDetection(currentLocation); directionDetection(currentLocation);
if ((suppressTurnPrompt == false && calculateRoute == false) || makeUturnWhenPossible == true) { if ((suppressTurnPrompt == false && calculateRoute == false) || makeUturnWhenPossible == true) {
@ -355,6 +307,57 @@ public class RoutingHelper {
} }
} }
public void tryMarkPassedRoute(Location currentLocation) {
// 1. try to mark passed route (move forward)
float dist = currentLocation.distanceTo(routeNodes.get(currentRoute));
while(currentRoute + 1 < routeNodes.size()){
float newDist = currentLocation.distanceTo(routeNodes.get(currentRoute + 1));
boolean processed = false;
if (newDist < dist){
if(newDist > 150){
// may be that check is really not needed ? only for start position
if(currentRoute > 0 ){
// check that we are not far from the route (if we are on the route distance doesn't matter)
float bearing = routeNodes.get(currentRoute - 1).bearingTo(routeNodes.get(currentRoute));
float bearingMovement = currentLocation.bearingTo(routeNodes.get(currentRoute));
float d = Math.abs(currentLocation.distanceTo(routeNodes.get(currentRoute)) * FloatMath.sin((bearingMovement - bearing)*3.14f/180f));
if(d > 50){
processed = true;
}
} else {
processed = true;
}
if(processed && log.isDebugEnabled()){
log.debug("Processed distance : " + newDist + " " + dist); //$NON-NLS-1$//$NON-NLS-2$
}
} else {
// case if you are getting close to the next point after turn
// but you haven't turned before (could be checked bearing)
if(currentLocation.hasBearing() || lastFixedLocation != null){
float bearingToPoint = currentLocation.bearingTo(routeNodes.get(currentRoute));
float bearingBetweenPoints = routeNodes.get(currentRoute).bearingTo(routeNodes.get(currentRoute+1));
float bearing = currentLocation.hasBearing() ? currentLocation.getBearing() : lastFixedLocation.bearingTo(currentLocation);
if(Math.abs(bearing - bearingToPoint) >
Math.abs(bearing - bearingBetweenPoints)){
if(log.isDebugEnabled()){
log.debug("Processed point bearing : " + Math.abs(currentLocation.getBearing() - bearingToPoint) + " " //$NON-NLS-1$ //$NON-NLS-2$
+ Math.abs(currentLocation.getBearing() - bearingBetweenPoints));
}
processed = true;
}
}
}
}
if(processed){
// that node already passed
updateCurrentRoute(currentRoute + 1);
dist = newDist;
} else {
break;
}
}
}
public void directionDetection(Location currentLocation) { public void directionDetection(Location currentLocation) {
makeUturnWhenPossible = false; makeUturnWhenPossible = false;
suppressTurnPrompt = false; suppressTurnPrompt = false;
@ -394,12 +397,15 @@ public class RoutingHelper {
routeNodes = res.getLocations(); routeNodes = res.getLocations();
directionInfo = res.getDirections(); directionInfo = res.getDirections();
listDistance = res.getListDistance(); listDistance = res.getListDistance();
currentDirectionInfo = 0;
currentRoute = 0; currentRoute = 0;
currentDirectionInfo = 0;
if(isFollowingMode){ if(isFollowingMode){
tryMarkPassedRoute(start);
directionDetection(start); directionDetection(start);
voiceRouter.newRouteIsCalculated(updateRoute, suppressTurnPrompt); voiceRouter.newRouteIsCalculated(updateRoute, suppressTurnPrompt);
} }
currentRoute = 0;
currentDirectionInfo = 0;
uiHandler.post(new Runnable() { uiHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {

View file

@ -178,7 +178,7 @@ public class VoiceRouter {
} }
// the last turn say // after last turn say:
if(next == null || next.distance == 0) { if(next == null || next.distance == 0) {
if(currentStatus <= STATUS_UNKNOWN && currentDirection > 0){ if(currentStatus <= STATUS_UNKNOWN && currentDirection > 0){
CommandBuilder play = getNewCommandPlayerToPlay(); CommandBuilder play = getNewCommandPlayerToPlay();