Fix and arrive at destination point

This commit is contained in:
vshcherb 2013-11-06 17:08:14 +01:00
parent a0b0ca8762
commit a6029b3f26
2 changed files with 45 additions and 41 deletions

View file

@ -857,9 +857,6 @@ public class MapActivityActions implements DialogProvider {
standardId == R.string.context_menu_item_destination_point) {
boolean dest = standardId == R.string.context_menu_item_destination_point;
String selected = mapActivity.getMapLayers().getContextMenuLayer().getSelectedObjectName();
if(selected == null){
selected = mapActivity.getString(R.string.route_descr_lat_lon, latitude, longitude);
}
targets.navigateToPoint(new LatLon(latitude, longitude), true,
dest ? -1 : targets.getIntermediatePoints().size(), selected);
if(targets.getIntermediatePoints().size() > 0) {

View file

@ -31,6 +31,7 @@ public class VoiceRouter {
private int currentStatus = STATUS_UNKNOWN;
private boolean playedAndArriveAtTarget = false;
private float playGoAheadDist = 0;
private long lastAnnouncedSpeedLimit = 0;
private long lastAnnouncedOffRoute = 0;
@ -261,6 +262,15 @@ public class VoiceRouter {
}
}
private boolean isTargetPoint(NextDirectionInfo info) {
boolean in = info != null && info.intermediatePoint;
boolean target = info == null || info.directionInfo == null
|| info.directionInfo.distance == 0;
return in || target;
}
/**
* Updates status of voice guidance
* @param currentLocation
@ -280,26 +290,8 @@ public class VoiceRouter {
NextDirectionInfo nextInfo = router.getNextRouteDirectionInfo(new NextDirectionInfo(), true);
RouteSegmentResult currentSegment = router.getCurrentSegmentResult();
// after last turn say:
if (nextInfo == null || nextInfo.directionInfo == null || nextInfo.directionInfo.distance == 0) {
// if(currentStatus <= STATUS_UNKNOWN && currentDirection > 0){ This caused this prompt to be suppressed when coming back from a
if (repeat || currentStatus <= STATUS_UNKNOWN) {
if (playGoAheadToDestination(nextInfo == null ? empty :
getSpeakableStreetName(currentSegment, nextInfo.directionInfo),
nextInfo == null ? "" : getSpeakablePointName(nextInfo.pointName))) {
currentStatus = STATUS_TOLD;
playGoAheadDist = 0;
}
}
return;
}
if(nextInfo.intermediatePoint){
if (repeat || currentStatus <= STATUS_UNKNOWN) {
if (playGoAheadToIntermediate(getSpeakableStreetName(currentSegment,
nextInfo.directionInfo), getSpeakablePointName(nextInfo.pointName))) {
currentStatus = STATUS_TOLD;
playGoAheadDist = 0;
}
}
if (nextInfo.directionInfo == null || nextInfo.directionInfo.distance == 0) {
return;
}
int dist = nextInfo.distanceTo;
@ -309,6 +301,7 @@ public class VoiceRouter {
if (next != nextRouteDirection) {
nextRouteDirection = next;
currentStatus = STATUS_UNKNOWN;
playedAndArriveAtTarget = false;
playGoAheadDist = 0;
}
@ -342,6 +335,9 @@ public class VoiceRouter {
} else {
playMakeTurn(currentSegment, next, null);
}
if(next.distance < TURN_IN_DISTANCE && isTargetPoint(nextNextInfo)) {
andSpeakArriveAtPoint(nextNextInfo);
}
nextStatusAfter(STATUS_TURN);
} else if ((repeat || statusNotPassed(STATUS_TURN_IN)) && isDistanceLess(speed, dist, TURN_IN_DISTANCE)) {
if (repeat || dist >= TURN_IN_DISTANCE_END) {
@ -351,6 +347,7 @@ public class VoiceRouter {
} else {
playMakeTurnIn(currentSegment, next, dist, null);
}
playAndArriveAtDestination(repeat, nextInfo, currentSegment);
}
nextStatusAfter(STATUS_TURN_IN);
// } else if (statusNotPassed(STATUS_PREPARE) && isDistanceLess(speed, dist, PREPARE_DISTANCE)) {
@ -361,12 +358,14 @@ public class VoiceRouter {
} else {
playPrepareTurn(currentSegment, next, dist);
}
playAndArriveAtDestination(repeat, nextInfo, currentSegment);
}
nextStatusAfter(STATUS_PREPARE);
// } else if (statusNotPassed(STATUS_LONG_PREPARE) && isDistanceLess(speed, dist, PREPARE_LONG_DISTANCE)){
} else if ((repeat || statusNotPassed(STATUS_LONG_PREPARE)) && (dist <= PREPARE_LONG_DISTANCE)) {
if (repeat || dist >= PREPARE_LONG_DISTANCE_END) {
playPrepareTurn(currentSegment, next, dist);
playAndArriveAtDestination(repeat, nextInfo, currentSegment);
}
nextStatusAfter(STATUS_LONG_PREPARE);
} else if (statusNotPassed(STATUS_UNKNOWN)) {
@ -378,6 +377,18 @@ public class VoiceRouter {
}
}
private void playAndArriveAtDestination(boolean repeat, NextDirectionInfo nextInfo,
RouteSegmentResult currentSegment) {
RouteDirectionInfo next = nextInfo.directionInfo;
if(isTargetPoint(nextInfo) && (!playedAndArriveAtTarget || repeat)) {
if(next.getTurnType().goAhead()) {
playGoAhead(nextInfo.distanceTo, getSpeakableStreetName(currentSegment, next));
}
andSpeakArriveAtPoint(nextInfo);
playedAndArriveAtTarget = true;
}
}
public void announceCurrentDirection(Location currentLocation) {
synchronized (router) {
if (currentStatus != STATUS_UTWP_TOLD) {
@ -388,24 +399,6 @@ public class VoiceRouter {
}
}
private boolean playGoAheadToDestination(Term strName, String destName) {
CommandBuilder play = getNewCommandPlayerToPlay();
if(play != null){
play.goAhead(router.getLeftDistance(), strName).andArriveAtDestination(getSpeakablePointName(destName)).play();
return true;
}
return false;
}
private boolean playGoAheadToIntermediate(Term strName, String iName) {
CommandBuilder play = getNewCommandPlayerToPlay();
if(play != null){
play.goAhead(router.getLeftDistanceNextIntermediate(), strName).andArriveAtIntermediatePoint(getSpeakablePointName(iName)).play();
return true;
}
return false;
}
private boolean playMakeUTwp() {
CommandBuilder play = getNewCommandPlayerToPlay();
@ -517,6 +510,20 @@ public class VoiceRouter {
}
}
}
private void andSpeakArriveAtPoint(NextDirectionInfo info) {
if (isTargetPoint(info)) {
String pointName = info == null ? "" : info.pointName;
CommandBuilder play = getNewCommandPlayerToPlay();
if (play != null) {
if (info != null && info.intermediatePoint) {
play.andArriveAtIntermediatePoint(getSpeakablePointName(pointName)).play();
} else {
play.andArriveAtDestination(getSpeakablePointName(pointName)).play();
}
}
}
}
private void playMakeTurn(RouteSegmentResult currentSegment, RouteDirectionInfo next, RouteDirectionInfo nextNext) {
CommandBuilder play = getNewCommandPlayerToPlay();