diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index 7b60ed4..354802a 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -82,7 +82,7 @@ public final class OsmTrack public void copyDetours( OsmTrack source ) { - detourMap = new FrozenLongMap( source.detourMap ); + detourMap = source.detourMap == null ? null : new FrozenLongMap( source.detourMap ); } public void buildMap() @@ -317,15 +317,29 @@ public final class OsmTrack { sb.append( " " ) - .append( "" ).append( hint.message ).append( "" ) - .append( "" ).append( hint.symbol ).append( "" ) - .append( "" ).append( hint.symbol ).append( "" ) - .append( "\n" ); + .append( "" ).append( hint.message ).append( "" ); + if ( hint.turnInstructionMode == 2 ) + { + sb.append( "" ).append( hint.distanceToNext ).append( "" ) + .append( "" ).append( hint.locusAction ).append( "" ); + } + else + { + sb.append( "" ).append( hint.symbol.toLowerCase() ).append( "" ) + .append( "" ).append( hint.symbol ).append( "" ); + } + sb.append( "\n" ); } } sb.append( " \n" ); sb.append( " " ).append( name ).append( "\n" ); + + if ( voiceHints != null && voiceHints.size() > 0 && voiceHints.get(0).turnInstructionMode == 2 ) + { + sb.append( " " ).append( voiceHints.get(0).locusRouteType ).append( "\n" ); + } + sb.append( " \n" ); for ( OsmPathElement n : nodes ) @@ -563,8 +577,12 @@ public final class OsmTrack voiceHints.add( hint ); } - public void processVoiceHints() + public void processVoiceHints( RoutingContext rc ) { + if ( detourMap == null ) + { + return; + } OsmPathElement node = nodes.get( nodes.size() - 1 ); List inputs = new ArrayList(); while (node != null) @@ -575,6 +593,8 @@ public final class OsmTrack inputs.add( input ); input.ilat = node.origin.getILat(); input.ilon = node.origin.getILon(); + input.locusRouteType = rc.carMode ? 4 : 5; + input.turnInstructionMode = rc.turnInstructionMode; input.goodWay = node.message; OsmPathElementHolder detours = detourMap.get( node.origin.getIdFromPos() ); diff --git a/brouter-core/src/main/java/btools/router/RoutingContext.java b/brouter-core/src/main/java/btools/router/RoutingContext.java index d79143f..c3626e3 100644 --- a/brouter-core/src/main/java/btools/router/RoutingContext.java +++ b/brouter-core/src/main/java/btools/router/RoutingContext.java @@ -95,6 +95,8 @@ public final class RoutingContext implements DistanceChecker trafficDirectionFactor = expctxGlobal.getVariableValue( "trafficDirectionFactor", 0.9f ); trafficSourceExponent = expctxGlobal.getVariableValue( "trafficSourceExponent", -0.7f ); trafficSourceMinDist = expctxGlobal.getVariableValue( "trafficSourceMinDist", 3000.f ); + + turnInstructionMode = (int)expctxGlobal.getVariableValue( "turnInstructionMode", 0.f ); } public RoutingMessageHandler messageHandler = new RoutingMessageHandler(); @@ -123,6 +125,8 @@ public final class RoutingContext implements DistanceChecker public double trafficSourceExponent; public double trafficSourceMinDist; + public int turnInstructionMode; // 0=none, 1=osmand, 2=locus + public static void prepareNogoPoints( List nogos ) { for( OsmNodeNamed nogo : nogos ) diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index eeeab79..8bbbace 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -934,10 +934,13 @@ public class RoutingEngine extends Thread if ( nextId != guideNode.getIdFromPos() ) { // not along the guide-track, discard, but register for voice-hint processing - OsmPath detour = new OsmPath( currentNode, path, link, refTrack, true, routingContext ); - if ( detour.cost >= 0. && nextId != startNodeId1 && nextId != startNodeId2 ) + if ( routingContext.turnInstructionMode > 0 ) { - guideTrack.registerDetourForId( currentNode.getIdFromPos(), OsmPathElement.create( detour, false ) ); + OsmPath detour = new OsmPath( currentNode, path, link, refTrack, true, routingContext ); + if ( detour.cost >= 0. && nextId != startNodeId1 && nextId != startNodeId2 ) + { + guideTrack.registerDetourForId( currentNode.getIdFromPos(), OsmPathElement.create( detour, false ) ); + } } continue; } @@ -1121,7 +1124,7 @@ public class RoutingEngine extends Thread if ( guideTrack != null ) { track.copyDetours( guideTrack ); - track.processVoiceHints(); + track.processVoiceHints( routingContext ); } return track; } diff --git a/brouter-core/src/main/java/btools/router/VoiceHint.java b/brouter-core/src/main/java/btools/router/VoiceHint.java index fe85ace..2636a05 100644 --- a/brouter-core/src/main/java/btools/router/VoiceHint.java +++ b/brouter-core/src/main/java/btools/router/VoiceHint.java @@ -18,6 +18,9 @@ public class VoiceHint int locusAction; MessageData goodWay; List badWays; + double distanceToNext; + int locusRouteType; + int turnInstructionMode; public void addBadWay( MessageData badWay ) { diff --git a/brouter-core/src/main/java/btools/router/VoiceHintProcessor.java b/brouter-core/src/main/java/btools/router/VoiceHintProcessor.java index 6c7d6de..5d111b8 100644 --- a/brouter-core/src/main/java/btools/router/VoiceHintProcessor.java +++ b/brouter-core/src/main/java/btools/router/VoiceHintProcessor.java @@ -14,9 +14,11 @@ public final class VoiceHintProcessor public static List process( List inputs ) { List results = new ArrayList(); + double distance = 0.; for ( VoiceHint input : inputs ) { // System.out.println( "***** processing: " + input.ilat + " " + input.ilon + " goodWay=" + input.goodWay ); + distance += input.goodWay.linkdist; if ( input.badWays != null ) { float maxprio = 0.f; @@ -33,6 +35,8 @@ public final class VoiceHintProcessor boolean isTurn = input.setTurnAngle( input.goodWay.turnangle ); if ( isTurn || input.goodWay.priorityclassifier < maxprio ) { + input.distanceToNext = distance; + distance = 0.; results.add( input ); } }