From b520c554bdbe4cf4c71ea43d28561e2ec2371de6 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Wed, 30 Oct 2024 15:37:07 +0200 Subject: [PATCH 1/3] Attempt to fix https://github.com/osmandapp/OsmAnd/issues/16752\#issuecomment-1592644516 --- .../osmand/router/RouteResultPreparation.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java index 37ae3173f16..f8517ded1fc 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java @@ -2467,20 +2467,19 @@ private boolean hasAllowedLanes(int mainTurnType, int[] lanesArray, int startAct int turnType = TurnType.getPrimaryTurn(activeLines[i]); if (turnType == mainTurnType) { return true; - } - if (TurnType.isLeftTurnNoUTurn(mainTurnType) && TurnType.isLeftTurnNoUTurn(turnType)) { + } else if (TurnType.isLeftTurnNoUTurn(turnType) && TurnType.isLeftTurnNoUTurn(mainTurnType)) { return true; - } - if (TurnType.isRightTurnNoUTurn(mainTurnType) && TurnType.isRightTurnNoUTurn(turnType)) { + } else if (TurnType.isLeftTurnNoUTurn(turnType) && possibleSharpLeftOrUTurn && mainTurnType == TurnType.C) { return true; - } - if (mainTurnType == TurnType.C && TurnType.isSlightTurn(turnType)) { + } else if (TurnType.isRightTurnNoUTurn(turnType) && TurnType.isRightTurnNoUTurn(mainTurnType)) { return true; - } - if (possibleSharpLeftOrUTurn && TurnType.isSharpLeftOrUTurn(mainTurnType) && TurnType.isSharpLeftOrUTurn(turnType)) { + } else if (TurnType.isRightTurnNoUTurn(turnType) && possibleSharpRightOrUTurn && mainTurnType == TurnType.C) { return true; - } - if (possibleSharpRightOrUTurn && TurnType.isSharpRightOrUTurn(mainTurnType) && TurnType.isSharpRightOrUTurn(turnType)) { + } else if (mainTurnType == TurnType.C && TurnType.isSlightTurn(turnType)) { + return true; + } else if (TurnType.isSharpLeftOrUTurn(turnType) && possibleSharpLeftOrUTurn && TurnType.isSharpLeftOrUTurn(mainTurnType)) { + return true; + } else if (TurnType.isSharpRightOrUTurn(turnType) && possibleSharpRightOrUTurn && TurnType.isSharpRightOrUTurn(mainTurnType)) { return true; } } From 5384d66bf0e54b91fdb3412aafd551c2a6112d38 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Wed, 30 Oct 2024 15:49:28 +0200 Subject: [PATCH 2/3] Fix test 62 but requires new icon and other changes --- OsmAnd-java/src/main/java/net/osmand/router/TurnType.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/router/TurnType.java b/OsmAnd-java/src/main/java/net/osmand/router/TurnType.java index 7d9a6df6211..ff3d67b571d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/TurnType.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/TurnType.java @@ -21,6 +21,7 @@ public class TurnType { public static final int OFFR = 12; // Off route //$NON-NLS-1$ public static final int RNDB = 13; // Roundabout public static final int RNLB = 14; // Roundabout left + public static final int NONE = 15; // U-turn //$NON-NLS-1$ private static final int[] TURNS_ORDER = {TU, TSHL, TL, TSLL, C, TSLR, TR, TSHR, TRU}; public static TurnType straight() { @@ -587,7 +588,7 @@ public static int convertType(String lane) { turn = TurnType.TU; } else { // Unknown string - turn = TurnType.C; + turn = TurnType.NONE; // continue; } return turn; From 1a49681d3fac3fc96dff64297ef37b31a9e081a9 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Wed, 30 Oct 2024 16:09:14 +0200 Subject: [PATCH 3/3] Fix test 50 --- .../osmand/router/RouteResultPreparation.java | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java index f8517ded1fc..0ef1adae65e 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteResultPreparation.java @@ -2457,29 +2457,29 @@ private boolean hasAllowedLanes(int mainTurnType, int[] lanesArray, int startAct if (lanesArray.length == 0 || startActiveIndex > endActiveIndex) { return false; } - int[] activeLines = new int[endActiveIndex - startActiveIndex + 1]; + int[] activeLanes = new int[endActiveIndex - startActiveIndex + 1]; for (int i = startActiveIndex, j = 0; i <= endActiveIndex; i++, j++) { - activeLines[j] = lanesArray[i]; + activeLanes[j] = lanesArray[i]; } boolean possibleSharpLeftOrUTurn = startActiveIndex == 0; boolean possibleSharpRightOrUTurn = endActiveIndex == lanesArray.length - 1; - for (int i = 0; i < activeLines.length; i++) { - int turnType = TurnType.getPrimaryTurn(activeLines[i]); - if (turnType == mainTurnType) { + for (int i = 0; i < activeLanes.length; i++) { + int primaryTurn = TurnType.getPrimaryTurn(activeLanes[i]); + if (primaryTurn == mainTurnType) { return true; - } else if (TurnType.isLeftTurnNoUTurn(turnType) && TurnType.isLeftTurnNoUTurn(mainTurnType)) { + } else if (mainTurnType == TurnType.C && TurnType.isSlightTurn(primaryTurn)) { return true; - } else if (TurnType.isLeftTurnNoUTurn(turnType) && possibleSharpLeftOrUTurn && mainTurnType == TurnType.C) { + } else if (TurnType.isLeftTurnNoUTurn(primaryTurn) && TurnType.isLeftTurnNoUTurn(mainTurnType)) { return true; - } else if (TurnType.isRightTurnNoUTurn(turnType) && TurnType.isRightTurnNoUTurn(mainTurnType)) { + } else if (TurnType.isLeftTurnNoUTurn(primaryTurn) && possibleSharpLeftOrUTurn && mainTurnType == TurnType.C) { return true; - } else if (TurnType.isRightTurnNoUTurn(turnType) && possibleSharpRightOrUTurn && mainTurnType == TurnType.C) { + } else if (TurnType.isRightTurnNoUTurn(primaryTurn) && TurnType.isRightTurnNoUTurn(mainTurnType)) { return true; - } else if (mainTurnType == TurnType.C && TurnType.isSlightTurn(turnType)) { + } else if (TurnType.isRightTurnNoUTurn(primaryTurn) && possibleSharpRightOrUTurn && mainTurnType == TurnType.C) { return true; - } else if (TurnType.isSharpLeftOrUTurn(turnType) && possibleSharpLeftOrUTurn && TurnType.isSharpLeftOrUTurn(mainTurnType)) { + } else if (TurnType.isSharpLeftOrUTurn(primaryTurn) && possibleSharpLeftOrUTurn && TurnType.isSharpLeftOrUTurn(mainTurnType)) { return true; - } else if (TurnType.isSharpRightOrUTurn(turnType) && possibleSharpRightOrUTurn && TurnType.isSharpRightOrUTurn(mainTurnType)) { + } else if (TurnType.isSharpRightOrUTurn(primaryTurn) && possibleSharpRightOrUTurn && TurnType.isSharpRightOrUTurn(mainTurnType)) { return true; } } @@ -2491,20 +2491,27 @@ private TurnType getActiveTurnType(int[] lanes, boolean leftSide, TurnType oldTu return oldTurnType; } int tp = oldTurnType.getValue(); - int cnt = 0; for (int k = 0; k < lanes.length; k++) { - int ln = lanes[k]; - if ((ln & 1) > 0) { + if ((lanes[k] & 1) > 0) { + if (TurnType.hasAnyTurnLane(lanes[k], oldTurnType.getValue())) { + tp = oldTurnType.getValue(); + break; + } int[] oneActiveLane = {lanes[k]}; if (hasAllowedLanes(oldTurnType.getValue(), oneActiveLane, 0, 0)) { tp = TurnType.getPrimaryTurn(lanes[k]); } - cnt++; + } + } + int cntActiveLanes = 0; + for (int k = 0; k < lanes.length; k++) { + if ((lanes[k] & 1) > 0) { + cntActiveLanes++; } } TurnType t = TurnType.valueOf(tp, leftSide); // mute when most lanes have a straight/slight direction - if (cnt >= 3 && TurnType.isSlightTurn(t.getValue())) { + if (cntActiveLanes >= 3 && TurnType.isSlightTurn(t.getValue())) { t.setSkipToSpeak(true); } return t;