Added all the necessary code to run js (except js core)
This commit is contained in:
parent
9500ceb91f
commit
cd1235be8a
7 changed files with 372 additions and 59 deletions
|
@ -363,6 +363,8 @@ dependencies {
|
||||||
implementation 'com.vividsolutions:jts-core:1.14.0'
|
implementation 'com.vividsolutions:jts-core:1.14.0'
|
||||||
|
|
||||||
implementation 'com.squareup.picasso:picasso:2.71828'
|
implementation 'com.squareup.picasso:picasso:2.71828'
|
||||||
|
// JS core
|
||||||
|
//implementation 'com.github.LiquidPlayer:LiquidCore:0.4.6'
|
||||||
// size restrictions
|
// size restrictions
|
||||||
// implementation 'com.ibm.icu:icu4j:50.1'
|
// implementation 'com.ibm.icu:icu4j:50.1'
|
||||||
// implementation 'net.sf.trove4j:trove4j:3.0.3'
|
// implementation 'net.sf.trove4j:trove4j:3.0.3'
|
||||||
|
|
324
OsmAnd/src/net/osmand/plus/routing/JSVoiceRouter.java
Normal file
324
OsmAnd/src/net/osmand/plus/routing/JSVoiceRouter.java
Normal file
|
@ -0,0 +1,324 @@
|
||||||
|
package net.osmand.plus.routing;
|
||||||
|
|
||||||
|
import net.osmand.Location;
|
||||||
|
import net.osmand.binary.RouteDataObject;
|
||||||
|
import net.osmand.plus.OsmandSettings;
|
||||||
|
import net.osmand.plus.voice.CommandBuilder;
|
||||||
|
import net.osmand.plus.voice.JSCommandBuilder;
|
||||||
|
import net.osmand.router.RouteSegmentResult;
|
||||||
|
import net.osmand.router.TurnType;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class JSVoiceRouter extends VoiceRouter {
|
||||||
|
|
||||||
|
public JSVoiceRouter(RoutingHelper router, OsmandSettings settings) {
|
||||||
|
super(router, settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getSpeakableJSStreetName(RouteSegmentResult currentSegment, RouteDirectionInfo i, boolean includeDest) {
|
||||||
|
Map<String, String> result = new HashMap<>();
|
||||||
|
if (i == null || !router.getSettings().SPEAK_STREET_NAMES.get()) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (player != null && player.supportsStructuredStreetNames()) {
|
||||||
|
|
||||||
|
// Issue 2377: Play Dest here only if not already previously announced, to avoid repetition
|
||||||
|
if (includeDest == true) {
|
||||||
|
result.put("toRef", getSpeakablePointName(i.getRef()));
|
||||||
|
result.put("toStreetName", getSpeakablePointName(i.getStreetName()));
|
||||||
|
result.put("toDest", getSpeakablePointName(i.getDestinationName()));
|
||||||
|
} else {
|
||||||
|
result.put("toRef", getSpeakablePointName(i.getRef()));
|
||||||
|
result.put("toStreetName", getSpeakablePointName(i.getStreetName()));
|
||||||
|
result.put("toDest", "");
|
||||||
|
}
|
||||||
|
if (currentSegment != null) {
|
||||||
|
// Issue 2377: Play Dest here only if not already previously announced, to avoid repetition
|
||||||
|
if (includeDest == true) {
|
||||||
|
RouteDataObject obj = currentSegment.getObject();
|
||||||
|
result.put("fromRef", getSpeakablePointName(obj.getRef(settings.MAP_PREFERRED_LOCALE.get(),
|
||||||
|
settings.MAP_TRANSLITERATE_NAMES.get(), currentSegment.isForwardDirection())));
|
||||||
|
result.put("fromStreetName", getSpeakablePointName(obj.getName(settings.MAP_PREFERRED_LOCALE.get(),
|
||||||
|
settings.MAP_TRANSLITERATE_NAMES.get())));
|
||||||
|
result.put("fromDest", getSpeakablePointName(obj.getDestinationName(settings.MAP_PREFERRED_LOCALE.get(),
|
||||||
|
settings.MAP_TRANSLITERATE_NAMES.get(), currentSegment.isForwardDirection())));
|
||||||
|
} else {
|
||||||
|
RouteDataObject obj = currentSegment.getObject();
|
||||||
|
result.put("fromRef", getSpeakablePointName(obj.getRef(settings.MAP_PREFERRED_LOCALE.get(),
|
||||||
|
settings.MAP_TRANSLITERATE_NAMES.get(), currentSegment.isForwardDirection())));
|
||||||
|
result.put("fromStreetName", getSpeakablePointName(obj.getName(settings.MAP_PREFERRED_LOCALE.get(),
|
||||||
|
settings.MAP_TRANSLITERATE_NAMES.get())));
|
||||||
|
result.put("fromDest", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
result.put("toRef", getSpeakablePointName(i.getRef()));
|
||||||
|
result.put("toStreetName", getSpeakablePointName(i.getStreetName()));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates status of voice guidance
|
||||||
|
* @param currentLocation
|
||||||
|
*/
|
||||||
|
protected void updateStatus(Location currentLocation, boolean repeat) {
|
||||||
|
// Directly after turn: goAhead (dist), unless:
|
||||||
|
// < PREPARE_LONG_DISTANCE (e.g. 3500m): playPrepareTurn (-not played any more-)
|
||||||
|
// < PREPARE_DISTANCE (e.g. 1500m): playPrepareTurn ("Turn after ...")
|
||||||
|
// < TURN_IN_DISTANCE (e.g. 390m or 30sec): playMakeTurnIn ("Turn in ...")
|
||||||
|
// < TURN_DISTANCE (e.g. 50m or 7sec): playMakeTurn ("Turn ...")
|
||||||
|
float speed = DEFAULT_SPEED;
|
||||||
|
if (currentLocation != null && currentLocation.hasSpeed()) {
|
||||||
|
speed = Math.max(currentLocation.getSpeed(), speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
RouteCalculationResult.NextDirectionInfo nextInfo = router.getNextRouteDirectionInfo(new RouteCalculationResult.NextDirectionInfo(), true);
|
||||||
|
RouteSegmentResult currentSegment = router.getCurrentSegmentResult();
|
||||||
|
if (nextInfo == null || nextInfo.directionInfo == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int dist = nextInfo.distanceTo;
|
||||||
|
RouteDirectionInfo next = nextInfo.directionInfo;
|
||||||
|
|
||||||
|
// If routing is changed update status to unknown
|
||||||
|
if (next != nextRouteDirection) {
|
||||||
|
nextRouteDirection = next;
|
||||||
|
currentStatus = STATUS_UNKNOWN;
|
||||||
|
suppressDest = false;
|
||||||
|
playedAndArriveAtTarget = false;
|
||||||
|
announceBackOnRoute = false;
|
||||||
|
if (playGoAheadDist != -1) {
|
||||||
|
playGoAheadDist = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!repeat) {
|
||||||
|
if (dist <= 0) {
|
||||||
|
return;
|
||||||
|
} else if (needsInforming()) {
|
||||||
|
playGoAhead(dist, getSpeakableJSStreetName(currentSegment, next, false));
|
||||||
|
return;
|
||||||
|
} else if (currentStatus == STATUS_TOLD) {
|
||||||
|
// nothing said possibly that's wrong case we should say before that
|
||||||
|
// however it should be checked manually ?
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentStatus == STATUS_UNKNOWN) {
|
||||||
|
// Play "Continue for ..." if (1) after route calculation no other prompt is due, or (2) after a turn if next turn is more than PREPARE_LONG_DISTANCE away
|
||||||
|
if ((playGoAheadDist == -1) || (dist > PREPARE_LONG_DISTANCE)) {
|
||||||
|
playGoAheadDist = dist - 3 * TURN_DISTANCE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RouteCalculationResult.NextDirectionInfo nextNextInfo = router.getNextRouteDirectionInfoAfter(nextInfo, new RouteCalculationResult.NextDirectionInfo(), true); //I think "true" is correct here, not "!repeat"
|
||||||
|
// Note: getNextRouteDirectionInfoAfter(nextInfo, x, y).distanceTo is distance from nextInfo, not from current position!
|
||||||
|
|
||||||
|
// STATUS_TURN = "Turn (now)"
|
||||||
|
if ((repeat || statusNotPassed(STATUS_TURN)) && isDistanceLess(speed, dist, TURN_DISTANCE, TURN_DEFAULT_SPEED)) {
|
||||||
|
if (nextNextInfo.distanceTo < TURN_IN_DISTANCE_END && nextNextInfo != null) {
|
||||||
|
playMakeTurn(currentSegment, next, nextNextInfo);
|
||||||
|
} else {
|
||||||
|
playMakeTurn(currentSegment, next, null);
|
||||||
|
}
|
||||||
|
if (!next.getTurnType().goAhead() && isTargetPoint(nextNextInfo)) { // !goAhead() avoids isolated "and arrive.." prompt, as goAhead() is not pronounced
|
||||||
|
if (nextNextInfo.distanceTo < TURN_IN_DISTANCE_END) {
|
||||||
|
// Issue #2865: Ensure a distance associated with the destination arrival is always announced, either here, or in subsequent "Turn in" prompt
|
||||||
|
// Distance fon non-straights already announced in "Turn (now)"'s nextnext code above
|
||||||
|
if ((nextNextInfo != null) && (nextNextInfo.directionInfo != null) && nextNextInfo.directionInfo.getTurnType().goAhead()) {
|
||||||
|
playThen();
|
||||||
|
playGoAhead(nextNextInfo.distanceTo, new HashMap<String, String>());
|
||||||
|
}
|
||||||
|
playAndArriveAtDestination(nextNextInfo);
|
||||||
|
} else if (nextNextInfo.distanceTo < 1.2f * TURN_IN_DISTANCE_END) {
|
||||||
|
// 1.2 is safety margin should the subsequent "Turn in" prompt not fit in amy more
|
||||||
|
playThen();
|
||||||
|
playGoAhead(nextNextInfo.distanceTo, new HashMap<String, String>());
|
||||||
|
playAndArriveAtDestination(nextNextInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nextStatusAfter(STATUS_TURN);
|
||||||
|
|
||||||
|
// STATUS_TURN_IN = "Turn in ..."
|
||||||
|
} else if ((repeat || statusNotPassed(STATUS_TURN_IN)) && isDistanceLess(speed, dist, TURN_IN_DISTANCE, 0f)) {
|
||||||
|
if (repeat || dist >= TURN_IN_DISTANCE_END) {
|
||||||
|
if ((isDistanceLess(speed, nextNextInfo.distanceTo, TURN_DISTANCE, 0f) || nextNextInfo.distanceTo < TURN_IN_DISTANCE_END) &&
|
||||||
|
nextNextInfo != null) {
|
||||||
|
playMakeTurnIn(currentSegment, next, dist - (int) btScoDelayDistance, nextNextInfo.directionInfo);
|
||||||
|
} else {
|
||||||
|
playMakeTurnIn(currentSegment, next, dist - (int) btScoDelayDistance, null);
|
||||||
|
}
|
||||||
|
playGoAndArriveAtDestination(repeat, nextInfo, currentSegment);
|
||||||
|
}
|
||||||
|
nextStatusAfter(STATUS_TURN_IN);
|
||||||
|
|
||||||
|
// STATUS_PREPARE = "Turn after ..."
|
||||||
|
} else if ((repeat || statusNotPassed(STATUS_PREPARE)) && (dist <= PREPARE_DISTANCE)) {
|
||||||
|
if (repeat || dist >= PREPARE_DISTANCE_END) {
|
||||||
|
if (!repeat && (next.getTurnType().keepLeft() || next.getTurnType().keepRight())) {
|
||||||
|
// Do not play prepare for keep left/right
|
||||||
|
} else {
|
||||||
|
playPrepareTurn(currentSegment, next, dist);
|
||||||
|
playGoAndArriveAtDestination(repeat, nextInfo, currentSegment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nextStatusAfter(STATUS_PREPARE);
|
||||||
|
|
||||||
|
// STATUS_LONG_PREPARE = also "Turn after ...", we skip this now, users said this is obsolete
|
||||||
|
} else if ((repeat || statusNotPassed(STATUS_LONG_PREPARE)) && (dist <= PREPARE_LONG_DISTANCE)) {
|
||||||
|
if (repeat || dist >= PREPARE_LONG_DISTANCE_END) {
|
||||||
|
playPrepareTurn(currentSegment, next, dist);
|
||||||
|
playGoAndArriveAtDestination(repeat, nextInfo, currentSegment);
|
||||||
|
}
|
||||||
|
nextStatusAfter(STATUS_LONG_PREPARE);
|
||||||
|
|
||||||
|
// STATUS_UNKNOWN = "Continue for ..." if (1) after route calculation no other prompt is due, or (2) after a turn if next turn is more than PREPARE_LONG_DISTANCE away
|
||||||
|
} else if (statusNotPassed(STATUS_UNKNOWN)) {
|
||||||
|
// Strange how we get here but
|
||||||
|
nextStatusAfter(STATUS_UNKNOWN);
|
||||||
|
} else if (repeat || (statusNotPassed(STATUS_PREPARE) && dist < playGoAheadDist)) {
|
||||||
|
playGoAheadDist = 0;
|
||||||
|
playGoAhead(dist, getSpeakableJSStreetName(currentSegment, next, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void playPrepareTurn(RouteSegmentResult currentSegment, RouteDirectionInfo next, int dist) {
|
||||||
|
JSCommandBuilder play = (JSCommandBuilder) getNewCommandPlayerToPlay();
|
||||||
|
if (play != null) {
|
||||||
|
String tParam = getTurnType(next.getTurnType());
|
||||||
|
if (tParam != null) {
|
||||||
|
notifyOnVoiceMessage();
|
||||||
|
play.prepareTurn(tParam, dist, getSpeakableJSStreetName(currentSegment, next, true)).play();
|
||||||
|
} else if (next.getTurnType().isRoundAbout()) {
|
||||||
|
notifyOnVoiceMessage();
|
||||||
|
play.prepareRoundAbout(dist, next.getTurnType().getExitOut(), getSpeakableJSStreetName(currentSegment, next, true)).play();
|
||||||
|
} else if (next.getTurnType().getValue() == TurnType.TU || next.getTurnType().getValue() == TurnType.TRU) {
|
||||||
|
notifyOnVoiceMessage();
|
||||||
|
play.prepareMakeUT(dist, getSpeakableJSStreetName(currentSegment, next, true)).play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void playMakeTurnIn(RouteSegmentResult currentSegment, RouteDirectionInfo next, int dist, RouteDirectionInfo pronounceNextNext) {
|
||||||
|
JSCommandBuilder play = (JSCommandBuilder) getNewCommandPlayerToPlay();
|
||||||
|
if (play != null) {
|
||||||
|
String tParam = getTurnType(next.getTurnType());
|
||||||
|
boolean isPlay = true;
|
||||||
|
if (tParam != null) {
|
||||||
|
play.turn(tParam, dist, getSpeakableJSStreetName(currentSegment, next, true));
|
||||||
|
suppressDest = true;
|
||||||
|
} else if (next.getTurnType().isRoundAbout()) {
|
||||||
|
play.roundAbout(dist, next.getTurnType().getTurnAngle(), next.getTurnType().getExitOut(), getSpeakableJSStreetName(currentSegment, next, true));
|
||||||
|
// Other than in prepareTurn, in prepareRoundabout we do not announce destination, so we can repeat it one more time
|
||||||
|
suppressDest = false;
|
||||||
|
} else if (next.getTurnType().getValue() == TurnType.TU || next.getTurnType().getValue() == TurnType.TRU) {
|
||||||
|
play.makeUT(dist, getSpeakableJSStreetName(currentSegment, next, true));
|
||||||
|
suppressDest = true;
|
||||||
|
} else {
|
||||||
|
isPlay = false;
|
||||||
|
}
|
||||||
|
// 'then keep' preparation for next after next. (Also announces an interim straight segment, which is not pronounced above.)
|
||||||
|
if (pronounceNextNext != null) {
|
||||||
|
TurnType t = pronounceNextNext.getTurnType();
|
||||||
|
isPlay = true;
|
||||||
|
if (t.getValue() != TurnType.C && next.getTurnType().getValue() == TurnType.C) {
|
||||||
|
play.goAhead(dist, getSpeakableJSStreetName(currentSegment, next, true));
|
||||||
|
}
|
||||||
|
if (t.getValue() == TurnType.TL || t.getValue() == TurnType.TSHL || t.getValue() == TurnType.TSLL
|
||||||
|
|| t.getValue() == TurnType.TU || t.getValue() == TurnType.KL ) {
|
||||||
|
play.then().bearLeft( getSpeakableJSStreetName(currentSegment, next, false));
|
||||||
|
} else if (t.getValue() == TurnType.TR || t.getValue() == TurnType.TSHR || t.getValue() == TurnType.TSLR
|
||||||
|
|| t.getValue() == TurnType.TRU || t.getValue() == TurnType.KR) {
|
||||||
|
play.then().bearRight( getSpeakableJSStreetName(currentSegment, next, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isPlay) {
|
||||||
|
notifyOnVoiceMessage();
|
||||||
|
play.play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void playGoAhead(int dist, Map<String, String> streetName) {
|
||||||
|
CommandBuilder play = getNewCommandPlayerToPlay();
|
||||||
|
JSCommandBuilder playJs = (JSCommandBuilder) play;
|
||||||
|
if (play != null) {
|
||||||
|
notifyOnVoiceMessage();
|
||||||
|
playJs.goAhead(dist, streetName).play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void playMakeTurn(RouteSegmentResult currentSegment, RouteDirectionInfo next, RouteCalculationResult.NextDirectionInfo nextNextInfo) {
|
||||||
|
JSCommandBuilder play = (JSCommandBuilder) getNewCommandPlayerToPlay();
|
||||||
|
if (play != null) {
|
||||||
|
String tParam = getTurnType(next.getTurnType());
|
||||||
|
boolean isplay = true;
|
||||||
|
if (tParam != null) {
|
||||||
|
play.turn(tParam, getSpeakableJSStreetName(currentSegment, next, !suppressDest));
|
||||||
|
} else if (next.getTurnType().isRoundAbout()) {
|
||||||
|
play.roundAbout(next.getTurnType().getTurnAngle(), next.getTurnType().getExitOut(), getSpeakableJSStreetName(currentSegment, next, !suppressDest));
|
||||||
|
} else if (next.getTurnType().getValue() == TurnType.TU || next.getTurnType().getValue() == TurnType.TRU) {
|
||||||
|
play.makeUT(getSpeakableJSStreetName(currentSegment, next, !suppressDest));
|
||||||
|
// Do not announce goAheads
|
||||||
|
//} else if (next.getTurnType().getValue() == TurnType.C)) {
|
||||||
|
// play.goAhead();
|
||||||
|
} else {
|
||||||
|
isplay = false;
|
||||||
|
}
|
||||||
|
// Add turn after next
|
||||||
|
if ((nextNextInfo != null) && (nextNextInfo.directionInfo != null)) {
|
||||||
|
|
||||||
|
// This case only needed should we want a prompt at the end of straight segments (equivalent of makeTurn) when nextNextInfo should be announced again there.
|
||||||
|
if (nextNextInfo.directionInfo.getTurnType().getValue() != TurnType.C && next.getTurnType().getValue() == TurnType.C) {
|
||||||
|
play.goAhead();
|
||||||
|
isplay = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String t2Param = getTurnType(nextNextInfo.directionInfo.getTurnType());
|
||||||
|
if (t2Param != null) {
|
||||||
|
if (isplay) {
|
||||||
|
play.then();
|
||||||
|
play.turn(t2Param, nextNextInfo.distanceTo, new HashMap<String, String>());
|
||||||
|
}
|
||||||
|
} else if (nextNextInfo.directionInfo.getTurnType().isRoundAbout()) {
|
||||||
|
if (isplay) {
|
||||||
|
play.then();
|
||||||
|
play.roundAbout(nextNextInfo.distanceTo, nextNextInfo.directionInfo.getTurnType().getTurnAngle(),
|
||||||
|
nextNextInfo.directionInfo.getTurnType().getExitOut(), new HashMap<String, String>());
|
||||||
|
}
|
||||||
|
} else if (nextNextInfo.directionInfo.getTurnType().getValue() == TurnType.TU) {
|
||||||
|
if (isplay) {
|
||||||
|
play.then();
|
||||||
|
play.makeUT(nextNextInfo.distanceTo, new HashMap<String, String>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isplay) {
|
||||||
|
notifyOnVoiceMessage();
|
||||||
|
play.play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void playGoAndArriveAtDestination(boolean repeat, RouteCalculationResult.NextDirectionInfo nextInfo, RouteSegmentResult currentSegment) {
|
||||||
|
RouteDirectionInfo next = nextInfo.directionInfo;
|
||||||
|
if (isTargetPoint(nextInfo) && (!playedAndArriveAtTarget || repeat)) {
|
||||||
|
if (next.getTurnType().goAhead()) {
|
||||||
|
playGoAhead(nextInfo.distanceTo, getSpeakableJSStreetName(currentSegment, next, false));
|
||||||
|
playAndArriveAtDestination(nextInfo);
|
||||||
|
playedAndArriveAtTarget = true;
|
||||||
|
} else if (nextInfo.distanceTo <= 2 * TURN_IN_DISTANCE) {
|
||||||
|
playAndArriveAtDestination(nextInfo);
|
||||||
|
playedAndArriveAtTarget = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -97,7 +97,8 @@ public class RoutingHelper {
|
||||||
public RoutingHelper(OsmandApplication context){
|
public RoutingHelper(OsmandApplication context){
|
||||||
this.app = context;
|
this.app = context;
|
||||||
settings = context.getSettings();
|
settings = context.getSettings();
|
||||||
voiceRouter = new VoiceRouter(this, settings);
|
voiceRouter = settings.USE_JS_VOICE_GUIDANCE.get() ?new JSVoiceRouter(this, settings)
|
||||||
|
: new VoiceRouter(this, settings);
|
||||||
provider = new RouteProvider();
|
provider = new RouteProvider();
|
||||||
setAppMode(settings.APPLICATION_MODE.get());
|
setAppMode(settings.APPLICATION_MODE.get());
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,27 +28,27 @@ import android.media.SoundPool;
|
||||||
|
|
||||||
public class VoiceRouter {
|
public class VoiceRouter {
|
||||||
private static final int STATUS_UTWP_TOLD = -1;
|
private static final int STATUS_UTWP_TOLD = -1;
|
||||||
private static final int STATUS_UNKNOWN = 0;
|
static final int STATUS_UNKNOWN = 0;
|
||||||
private static final int STATUS_LONG_PREPARE = 1;
|
static final int STATUS_LONG_PREPARE = 1;
|
||||||
private static final int STATUS_PREPARE = 2;
|
static final int STATUS_PREPARE = 2;
|
||||||
private static final int STATUS_TURN_IN = 3;
|
static final int STATUS_TURN_IN = 3;
|
||||||
private static final int STATUS_TURN = 4;
|
static final int STATUS_TURN = 4;
|
||||||
private static final int STATUS_TOLD = 5;
|
static final int STATUS_TOLD = 5;
|
||||||
|
|
||||||
private final RoutingHelper router;
|
protected final RoutingHelper router;
|
||||||
private static CommandPlayer player;
|
protected static CommandPlayer player;
|
||||||
private final OsmandSettings settings;
|
protected final OsmandSettings settings;
|
||||||
|
|
||||||
private static boolean mute = false;
|
private static boolean mute = false;
|
||||||
private static int currentStatus = STATUS_UNKNOWN;
|
static int currentStatus = STATUS_UNKNOWN;
|
||||||
private static boolean playedAndArriveAtTarget = false;
|
static boolean playedAndArriveAtTarget = false;
|
||||||
private static float playGoAheadDist = 0;
|
static float playGoAheadDist = 0;
|
||||||
private static long lastAnnouncedSpeedLimit = 0;
|
private static long lastAnnouncedSpeedLimit = 0;
|
||||||
private static long waitAnnouncedSpeedLimit = 0;
|
private static long waitAnnouncedSpeedLimit = 0;
|
||||||
private static long lastAnnouncedOffRoute = 0;
|
private static long lastAnnouncedOffRoute = 0;
|
||||||
private static long waitAnnouncedOffRoute = 0;
|
private static long waitAnnouncedOffRoute = 0;
|
||||||
private static boolean suppressDest = false;
|
static boolean suppressDest = false;
|
||||||
private static boolean announceBackOnRoute = false;
|
static boolean announceBackOnRoute = false;
|
||||||
// private static long lastTimeRouteRecalcAnnounced = 0;
|
// private static long lastTimeRouteRecalcAnnounced = 0;
|
||||||
// Remember when last announcement was made
|
// Remember when last announcement was made
|
||||||
private static long lastAnnouncement = 0;
|
private static long lastAnnouncement = 0;
|
||||||
|
@ -66,7 +66,7 @@ public class VoiceRouter {
|
||||||
protected int TURN_DISTANCE = 0;
|
protected int TURN_DISTANCE = 0;
|
||||||
|
|
||||||
protected static VoiceCommandPending pendingCommand = null;
|
protected static VoiceCommandPending pendingCommand = null;
|
||||||
private static RouteDirectionInfo nextRouteDirection;
|
static RouteDirectionInfo nextRouteDirection;
|
||||||
private Term empty;
|
private Term empty;
|
||||||
|
|
||||||
private boolean useJS;
|
private boolean useJS;
|
||||||
|
@ -167,7 +167,7 @@ public class VoiceRouter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private double btScoDelayDistance = 0;
|
double btScoDelayDistance = 0;
|
||||||
|
|
||||||
public boolean isDistanceLess(float currentSpeed, double dist, double etalon, float defSpeed) {
|
public boolean isDistanceLess(float currentSpeed, double dist, double etalon, float defSpeed) {
|
||||||
if (defSpeed <= 0) {
|
if (defSpeed <= 0) {
|
||||||
|
@ -204,7 +204,7 @@ public class VoiceRouter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void nextStatusAfter(int previousStatus) {
|
void nextStatusAfter(int previousStatus) {
|
||||||
//STATUS_UNKNOWN=0 -> STATUS_LONG_PREPARE=1 -> STATUS_PREPARE=2 -> STATUS_TURN_IN=3 -> STATUS_TURN=4 -> STATUS_TOLD=5
|
//STATUS_UNKNOWN=0 -> STATUS_LONG_PREPARE=1 -> STATUS_PREPARE=2 -> STATUS_TURN_IN=3 -> STATUS_TURN=4 -> STATUS_TOLD=5
|
||||||
if (previousStatus != STATUS_TOLD) {
|
if (previousStatus != STATUS_TOLD) {
|
||||||
this.currentStatus = previousStatus + 1;
|
this.currentStatus = previousStatus + 1;
|
||||||
|
@ -213,7 +213,7 @@ public class VoiceRouter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean statusNotPassed(int statusToCheck) {
|
boolean statusNotPassed(int statusToCheck) {
|
||||||
return currentStatus <= statusToCheck;
|
return currentStatus <= statusToCheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,14 +398,14 @@ public class VoiceRouter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isTargetPoint(NextDirectionInfo info) {
|
boolean isTargetPoint(NextDirectionInfo info) {
|
||||||
boolean in = info != null && info.intermediatePoint;
|
boolean in = info != null && info.intermediatePoint;
|
||||||
boolean target = info == null || info.directionInfo == null
|
boolean target = info == null || info.directionInfo == null
|
||||||
|| info.directionInfo.distance == 0;
|
|| info.directionInfo.distance == 0;
|
||||||
return in || target;
|
return in || target;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean needsInforming() {
|
boolean needsInforming() {
|
||||||
final Integer repeat = settings.KEEP_INFORMING.get();
|
final Integer repeat = settings.KEEP_INFORMING.get();
|
||||||
if (repeat == null || repeat == 0) return false;
|
if (repeat == null || repeat == 0) return false;
|
||||||
|
|
||||||
|
@ -560,7 +560,7 @@ public class VoiceRouter {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void playThen() {
|
void playThen() {
|
||||||
CommandBuilder play = getNewCommandPlayerToPlay();
|
CommandBuilder play = getNewCommandPlayerToPlay();
|
||||||
if (play != null) {
|
if (play != null) {
|
||||||
notifyOnVoiceMessage();
|
notifyOnVoiceMessage();
|
||||||
|
@ -718,7 +718,7 @@ public class VoiceRouter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void playAndArriveAtDestination(NextDirectionInfo info) {
|
void playAndArriveAtDestination(NextDirectionInfo info) {
|
||||||
if (isTargetPoint(info)) {
|
if (isTargetPoint(info)) {
|
||||||
String pointName = info == null ? "" : info.pointName;
|
String pointName = info == null ? "" : info.pointName;
|
||||||
CommandBuilder play = getNewCommandPlayerToPlay();
|
CommandBuilder play = getNewCommandPlayerToPlay();
|
||||||
|
@ -784,7 +784,7 @@ public class VoiceRouter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getTurnType(TurnType t) {
|
String getTurnType(TurnType t) {
|
||||||
if (TurnType.TL == t.getValue()) {
|
if (TurnType.TL == t.getValue()) {
|
||||||
return AbstractPrologCommandPlayer.A_LEFT;
|
return AbstractPrologCommandPlayer.A_LEFT;
|
||||||
} else if (TurnType.TSHL == t.getValue()) {
|
} else if (TurnType.TSHL == t.getValue()) {
|
||||||
|
|
|
@ -39,7 +39,7 @@ public class AbstractJSCommandPlayer implements CommandPlayer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLanguage() {
|
public String getLanguage() {
|
||||||
return null;
|
return "en";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -3,7 +3,12 @@ package net.osmand.plus.voice;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
//import org.liquidplayer.javascript.JSContext;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -13,45 +18,25 @@ public class JSCommandBuilder extends CommandBuilder {
|
||||||
|
|
||||||
private static final Log log = PlatformUtil.getLog(JSCommandBuilder.class);
|
private static final Log log = PlatformUtil.getLog(JSCommandBuilder.class);
|
||||||
|
|
||||||
protected static final String C_PREPARE_TURN = "prepare_turn"; //$NON-NLS-1$
|
// private JSContext jsContext;
|
||||||
protected static final String C_PREPARE_ROUNDABOUT = "prepare_roundabout"; //$NON-NLS-1$
|
|
||||||
protected static final String C_PREPARE_MAKE_UT = "prepare_make_ut"; //$NON-NLS-1$
|
|
||||||
protected static final String C_ROUNDABOUT = "roundabout"; //$NON-NLS-1$
|
|
||||||
protected static final String C_GO_AHEAD = "go_ahead"; //$NON-NLS-1$
|
|
||||||
protected static final String C_TURN = "turn"; //$NON-NLS-1$
|
|
||||||
protected static final String C_MAKE_UT = "make_ut"; //$NON-NLS-1$
|
|
||||||
protected static final String C_MAKE_UTWP = "make_ut_wp"; //$NON-NLS-1$
|
|
||||||
protected static final String C_AND_ARRIVE_DESTINATION = "and_arrive_destination"; //$NON-NLS-1$
|
|
||||||
protected static final String C_REACHED_DESTINATION = "reached_destination"; //$NON-NLS-1$
|
|
||||||
protected static final String C_AND_ARRIVE_INTERMEDIATE = "and_arrive_intermediate"; //$NON-NLS-1$
|
|
||||||
protected static final String C_REACHED_INTERMEDIATE = "reached_intermediate"; //$NON-NLS-1$
|
|
||||||
protected static final String C_AND_ARRIVE_WAYPOINT = "and_arrive_waypoint"; //$NON-NLS-1$
|
|
||||||
protected static final String C_AND_ARRIVE_FAVORITE = "and_arrive_favorite"; //$NON-NLS-1$
|
|
||||||
protected static final String C_AND_ARRIVE_POI_WAYPOINT = "and_arrive_poi"; //$NON-NLS-1$
|
|
||||||
protected static final String C_REACHED_WAYPOINT = "reached_waypoint"; //$NON-NLS-1$
|
|
||||||
protected static final String C_REACHED_FAVORITE = "reached_favorite"; //$NON-NLS-1$
|
|
||||||
protected static final String C_REACHED_POI = "reached_poi"; //$NON-NLS-1$
|
|
||||||
protected static final String C_THEN = "then"; //$NON-NLS-1$
|
|
||||||
protected static final String C_SPEAD_ALARM = "speed_alarm"; //$NON-NLS-1$
|
|
||||||
protected static final String C_ATTENTION = "attention"; //$NON-NLS-1$
|
|
||||||
protected static final String C_OFF_ROUTE = "off_route"; //$NON-NLS-1$
|
|
||||||
protected static final String C_BACK_ON_ROUTE ="back_on_route"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
|
|
||||||
protected static final String C_BEAR_LEFT = "bear_left"; //$NON-NLS-1$
|
|
||||||
protected static final String C_BEAR_RIGHT = "bear_right"; //$NON-NLS-1$
|
|
||||||
protected static final String C_ROUTE_RECALC = "route_recalc"; //$NON-NLS-1$
|
|
||||||
protected static final String C_ROUTE_NEW_CALC = "route_new_calc"; //$NON-NLS-1$
|
|
||||||
protected static final String C_LOCATION_LOST = "location_lost"; //$NON-NLS-1$
|
|
||||||
protected static final String C_LOCATION_RECOVERED = "location_recovered"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
|
|
||||||
private List<String> listStruct = new ArrayList<>();
|
private List<String> listStruct = new ArrayList<>();
|
||||||
|
|
||||||
public JSCommandBuilder(CommandPlayer commandPlayer) {
|
public JSCommandBuilder(CommandPlayer commandPlayer) {
|
||||||
super(commandPlayer);
|
super(commandPlayer);
|
||||||
|
// jsContext = new JSContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setJSContext(String path) {
|
||||||
|
// String script = null;
|
||||||
|
// try {
|
||||||
|
// byte[] encoded = Files.readAllBytes(Paths.get(path));
|
||||||
|
// script = new String(encoded, "UTF-8");
|
||||||
|
// } catch (IOException e) {
|
||||||
|
// log.error(e.getMessage());
|
||||||
|
// }
|
||||||
|
// if (script != null)
|
||||||
|
//// jsContext.evaluateScript(script);
|
||||||
|
}
|
||||||
|
|
||||||
public void setParameters(String metricCons, boolean tts) {
|
public void setParameters(String metricCons, boolean tts) {
|
||||||
// TODO Set the parameters to js context
|
// TODO Set the parameters to js context
|
||||||
|
|
|
@ -46,6 +46,7 @@ public class JSTTSCommandPlayerImpl extends AbstractJSCommandPlayer {
|
||||||
@Override
|
@Override
|
||||||
public JSCommandBuilder newCommandBuilder() {
|
public JSCommandBuilder newCommandBuilder() {
|
||||||
JSCommandBuilder commandBuilder = new JSCommandBuilder(this);
|
JSCommandBuilder commandBuilder = new JSCommandBuilder(this);
|
||||||
|
commandBuilder.setJSContext(app.getSettings().VOICE_PROVIDER.get() + "en_tts.js");
|
||||||
commandBuilder.setParameters(app.getSettings().METRIC_SYSTEM.get().toHumanString(app), true);
|
commandBuilder.setParameters(app.getSettings().METRIC_SYSTEM.get().toHumanString(app), true);
|
||||||
return commandBuilder;
|
return commandBuilder;
|
||||||
}
|
}
|
||||||
|
@ -91,7 +92,7 @@ public class JSTTSCommandPlayerImpl extends AbstractJSCommandPlayer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLanguage() {
|
public String getLanguage() {
|
||||||
return null;
|
return "en";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in a new issue