Skip to content

Commit

Permalink
change vh rules
Browse files Browse the repository at this point in the history
  • Loading branch information
afischerdev committed Feb 19, 2023
1 parent 15dd1f3 commit c9ae7c8
Showing 1 changed file with 255 additions and 30 deletions.
285 changes: 255 additions & 30 deletions brouter-core/src/main/java/btools/router/VoiceHint.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ public class VoiceHint {
static final int TSHR = 7; // turn sharply right
static final int KL = 8; // keep left
static final int KR = 9; // keep right
static final int TU = 10; // U-turn
static final int TRU = 11; // Right U-turn
static final int OFFR = 12; // Off route
static final int RNDB = 13; // Roundabout
static final int RNLB = 14; // Roundabout left
static final int TLU = 10; // U-turn
static final int TU = 11; // 180 degree u-turn
static final int TRU = 12; // Right U-turn
static final int OFFR = 13; // Off route
static final int RNDB = 14; // Roundabout
static final int RNLB = 15; // Roundabout left
static final int BL = 16; // Beeline routing

int ilon;
int ilat;
Expand All @@ -39,7 +41,7 @@ public float getTime() {
return oldWay == null ? 0.f : oldWay.time;
}

float angle;
float angle = Float.MAX_VALUE;
boolean turnAngleConsumed;
boolean needsRealTurn;

Expand Down Expand Up @@ -67,8 +69,13 @@ public int getExitNumber() {
return roundaboutExit;
}

/*
* used by comment style, osmand style
*/
public String getCommandString() {
switch (cmd) {
case TLU:
return "TU"; // should be changed to TLU when osmand uses new voice hint constants
case TU:
return "TU";
case TSHL:
Expand Down Expand Up @@ -100,8 +107,51 @@ public String getCommandString() {
}
}

/*
* used by trkpt/sym style
*/
public String getCommandString(int c) {
switch (c) {
case TLU:
return "TLU";
case TU:
return "TU";
case TSHL:
return "TSHL";
case TL:
return "TL";
case TSLL:
return "TSLL";
case KL:
return "KL";
case C:
return "C";
case KR:
return "KR";
case TSLR:
return "TSLR";
case TR:
return "TR";
case TSHR:
return "TSHR";
case TRU:
return "TRU";
case RNDB:
return "RNDB" + roundaboutExit;
case RNLB:
return "RNLB" + (-roundaboutExit);
default:
return "unknown command: " + c;
}
}

/*
* used by gpsies style
*/
public String getSymbolString() {
switch (cmd) {
case TLU:
return "TU";
case TU:
return "TU";
case TSHL:
Expand Down Expand Up @@ -133,8 +183,53 @@ public String getSymbolString() {
}
}

/*
* used by new locus trkpt style
*/
public String getLocusSymbolString() {
switch (cmd) {
case TLU:
return "u-turn_left";
case TU:
return "u-turn";
case TSHL:
return "left_sharp";
case TL:
return "left";
case TSLL:
return "left_slight";
case KL:
return "stay_left"; // ?
case C:
return "straight";
case KR:
return "stay_right"; // ?
case TSLR:
return "right_slight";
case TR:
return "right";
case TSHR:
return "right_sharp";
case TRU:
return "u-turn_right";
case RNDB:
return "roundabout_e" + roundaboutExit;
case RNLB:
return "roundabout_e" + (-roundaboutExit);
case BL:
return "beeline";
default:
throw new IllegalArgumentException("unknown command: " + cmd);
}
}

/*
* used by osmand style
*/
public String getMessageString() {
switch (cmd) {
case TLU:
return "u-turn"; // should be changed to u-turn-left when osmand uses new voice hint constants
case TU:
return "u-turn";
case TSHL:
Expand All @@ -156,7 +251,7 @@ public String getMessageString() {
case TSHR:
return "sharp right";
case TRU:
return "u-turn";
return "u-turn"; // should be changed to u-turn-right when osmand uses new voice hint constants
case RNDB:
return "Take exit " + roundaboutExit;
case RNLB:
Expand All @@ -166,10 +261,15 @@ public String getMessageString() {
}
}

/*
* used by old locus style
*/
public int getLocusAction() {
switch (cmd) {
case TU:
case TLU:
return 13;
case TU:
return 12;
case TSHL:
return 5;
case TL:
Expand Down Expand Up @@ -199,8 +299,13 @@ public int getLocusAction() {
}
}

/*
* used by orux style
*/
public int getOruxAction() {
switch (cmd) {
case TLU:
return 1003;
case TU:
return 1003;
case TSHL:
Expand Down Expand Up @@ -232,6 +337,86 @@ public int getOruxAction() {
}
}

/*
* used by cruiser, equivalent to getCommandString() - osmand style - when osmand changes the voice hint constants
*/
public String getCruiserCommandString() {
switch (cmd) {
case TLU:
return "TLU";
case TU:
return "TU";
case TSHL:
return "TSHL";
case TL:
return "TL";
case TSLL:
return "TSLL";
case KL:
return "KL";
case C:
return "C";
case KR:
return "KR";
case TSLR:
return "TSLR";
case TR:
return "TR";
case TSHR:
return "TSHR";
case TRU:
return "TRU";
case RNDB:
return "RNDB" + roundaboutExit;
case RNLB:
return "RNLB" + (-roundaboutExit);
case BL:
return "BL";
default:
throw new IllegalArgumentException("unknown command: " + cmd);
}
}

/*
* used by cruiser, equivalent to getMessageString() - osmand style - when osmand changes the voice hint constants
*/
public String getCruiserMessageString() {
switch (cmd) {
case TLU:
return "u-turn left";
case TU:
return "u-turn";
case TSHL:
return "sharp left";
case TL:
return "left";
case TSLL:
return "slight left";
case KL:
return "keep left";
case C:
return "straight";
case KR:
return "keep right";
case TSLR:
return "slight right";
case TR:
return "right";
case TSHR:
return "sharp right";
case TRU:
return "u-turn right";
case RNDB:
return "Take exit " + roundaboutExit;
case RNLB:
return "Take exit " + (-roundaboutExit);
case BL:
return "Beeline";
default:
throw new IllegalArgumentException("unknown command: " + cmd);
}
}

public void calcCommand() {
float lowerBadWayAngle = -181;
float higherBadWayAngle = 181;
Expand All @@ -252,58 +437,98 @@ public void calcCommand() {
float cmdAngle = angle;

// fall back to local angle if otherwise inconsistent
if (lowerBadWayAngle > angle || higherBadWayAngle < angle) {
//if ( lowerBadWayAngle > angle || higherBadWayAngle < angle )
//{
//cmdAngle = goodWay.turnangle;
//}
if (angle == Float.MAX_VALUE) {
cmdAngle = goodWay.turnangle;
}
if (cmd == BL) return;

if (roundaboutExit > 0) {
cmd = RNDB;
} else if (roundaboutExit < 0) {
cmd = RNLB;
} else if (cmdAngle < -159.) {
} else if (is180DegAngle(cmdAngle) && cmdAngle <= -179.f && higherBadWayAngle == 181.f && lowerBadWayAngle == -181.f) {
cmd = TU;
} else if (cmdAngle < -135.) {
} else if (cmdAngle < -159.f) {
cmd = TLU;
} else if (cmdAngle < -135.f) {
cmd = TSHL;
} else if (cmdAngle < -45.) {
} else if (cmdAngle < -45.f) {
// a TL can be pushed in either direction by a close-by alternative
if (higherBadWayAngle > -90. && higherBadWayAngle < -15. && lowerBadWayAngle < -180.) {
if (cmdAngle < -95.f && higherBadWayAngle < -30.f && lowerBadWayAngle < -180.f) {
cmd = TSHL;
} else if (lowerBadWayAngle > -180. && lowerBadWayAngle < -90. && higherBadWayAngle > 0.) {
} else if (cmdAngle > -85.f && lowerBadWayAngle > -180.f && higherBadWayAngle > -10.f) {
cmd = TSLL;
} else {
cmd = TL;
if (cmdAngle < -110.f) {
cmd = TSHL;
} else if (cmdAngle > -60.f) {
cmd = TSLL;
} else {
cmd = TL;
}
}
} else if (cmdAngle < -21.) {
if (cmd != KR) // don't overwrite KR with TSLL
{
} else if (cmdAngle < -21.f) {
if (cmd != KR) { // don't overwrite KR with TSLL
cmd = TSLL;
}
} else if (cmdAngle < 21.) {
if (cmd != KR && cmd != KL) // don't overwrite KL/KR hints!
{
} else if (cmdAngle < -5.f) {
if (lowerBadWayAngle < -100.f && higherBadWayAngle < 45.f) {
cmd = TSLL;
} else if (lowerBadWayAngle >= -100.f && higherBadWayAngle < 45.f) {
cmd = KL;
} else {
cmd = C;
}
} else if (cmdAngle < 45.) {
if (cmd != KL) // don't overwrite KL with TSLR
{
cmd = TSLR;
} else if (cmdAngle < 5.f) {
if (lowerBadWayAngle > -30.f) {
cmd = KR;
} else if (higherBadWayAngle < 30.f) {
cmd = KL;
} else {
cmd = C;
}
} else if (cmdAngle < 135.) {
} else if (cmdAngle < 21.f) {
// a TR can be pushed in either direction by a close-by alternative
if (higherBadWayAngle > 90. && higherBadWayAngle < 180. && lowerBadWayAngle < 0.) {
if (lowerBadWayAngle > -45.f && higherBadWayAngle > 100.f) {
cmd = TSLR;
} else if (lowerBadWayAngle > 15. && lowerBadWayAngle < 90. && higherBadWayAngle > 180.) {
} else if (lowerBadWayAngle > -45.f && higherBadWayAngle <= 100.f) {
cmd = KR;
} else {
cmd = C;
}
} else if (cmdAngle < 45.f) {
cmd = TSLR;
} else if (cmdAngle < 135.f) {
if (cmdAngle < 85.f && higherBadWayAngle < 180.f && lowerBadWayAngle < 10.f) {
cmd = TSLR;
} else if (cmdAngle > 95.f && lowerBadWayAngle > 30.f && higherBadWayAngle > 180.f) {
cmd = TSHR;
} else {
cmd = TR;
if (cmdAngle > 110.) {
cmd = TSHR;
} else if (cmdAngle < 60.) {
cmd = TSLR;
} else {
cmd = TR;
}
}
} else if (cmdAngle < 159.) {
} else if (cmdAngle < 159.f) {
cmd = TSHR;
} else if (is180DegAngle(cmdAngle) && cmdAngle >= 179.f && higherBadWayAngle == 181.f && lowerBadWayAngle == -181.f) {
cmd = TU;
} else {
cmd = TRU;
}
}

static boolean is180DegAngle(float angle) {
return (Math.abs(angle) <= 180.f && Math.abs(angle) >= 179.f);
}

public String formatGeometry() {
float oldPrio = oldWay == null ? 0.f : oldWay.priorityclassifier;
StringBuilder sb = new StringBuilder(30);
Expand Down

0 comments on commit c9ae7c8

Please sign in to comment.