From d293bb8b6b934b438d4007bcea9303dab26d3f75 Mon Sep 17 00:00:00 2001 From: MaximZaitsev Date: Thu, 1 Sep 2016 16:54:26 +0300 Subject: [PATCH] add exception for try get new sonar data --- .../java/Exceptions/SonarDataException.kt | 4 +++ .../main/java/algorithm/AbstractAlgorithm.kt | 31 ++++++++++++------- .../java/algorithm/RoomBypassingAlgorithm.kt | 15 ++++----- 3 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 server/src/main/java/Exceptions/SonarDataException.kt diff --git a/server/src/main/java/Exceptions/SonarDataException.kt b/server/src/main/java/Exceptions/SonarDataException.kt new file mode 100644 index 00000000000..536e13a789c --- /dev/null +++ b/server/src/main/java/Exceptions/SonarDataException.kt @@ -0,0 +1,4 @@ +package Exceptions + +class SonarDataException() : Exception() { +} \ No newline at end of file diff --git a/server/src/main/java/algorithm/AbstractAlgorithm.kt b/server/src/main/java/algorithm/AbstractAlgorithm.kt index 4c61b58a75f..65c1236509b 100644 --- a/server/src/main/java/algorithm/AbstractAlgorithm.kt +++ b/server/src/main/java/algorithm/AbstractAlgorithm.kt @@ -2,6 +2,7 @@ package algorithm import CodedOutputStream import Exceptions.InactiveCarException +import Exceptions.SonarDataException import RouteMetricRequest import SonarRequest import algorithm.geometry.Angle @@ -38,12 +39,14 @@ abstract class AbstractAlgorithm(val thisCar: Car, val exchanger: Exchanger): IntArray { @@ -115,10 +118,16 @@ abstract class AbstractAlgorithm(val thisCar: Car, val exchanger: Exchanger historySize) { + while (history.size > historySize) { history.removeAt(0) } } @@ -186,10 +195,10 @@ abstract class AbstractAlgorithm(val thisCar: Car, val exchanger: Exchanger 0 && history.size > 0) { + while (stepsRemaining > 0 && history.size > 0) { Logger.log("Step: ${steps - stepsRemaining + 1}") rollback() stepsRemaining-- @@ -207,8 +216,8 @@ abstract class AbstractAlgorithm(val thisCar: Car, val exchanger: Exchanger): CarState? - protected abstract fun getCommand(anglesDistances: Map, state: CarState): RouteMetricRequest? + protected abstract fun getCarState(anglesDistances: Map): CarState + protected abstract fun getCommand(anglesDistances: Map, state: CarState): RouteMetricRequest protected abstract fun afterGetCommand(route: RouteMetricRequest) abstract fun isCompleted(): Boolean diff --git a/server/src/main/java/algorithm/RoomBypassingAlgorithm.kt b/server/src/main/java/algorithm/RoomBypassingAlgorithm.kt index 56874d02cb2..3099c8fad8f 100644 --- a/server/src/main/java/algorithm/RoomBypassingAlgorithm.kt +++ b/server/src/main/java/algorithm/RoomBypassingAlgorithm.kt @@ -1,5 +1,6 @@ package algorithm +import Exceptions.SonarDataException import Logger.log import RouteMetricRequest import SonarRequest @@ -134,7 +135,7 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger) : Abs } } - override fun getCommand(anglesDistances: Map, state: CarState): RouteMetricRequest? { + override fun getCommand(anglesDistances: Map, state: CarState): RouteMetricRequest { val dist0 = anglesDistances[Angle(0)]!! val dist70 = anglesDistances[Angle(70)]!! val dist80 = anglesDistances[Angle(80)]!! @@ -151,7 +152,7 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger) : Abs log("Found to many -1 in angle distances, falling back") rollback() //todo Теоретически такая ситуация может быть валидной, если сразу после внутреннего угла идёт внешний - return null + throw SonarDataException() } val average = (anglesDistances.values @@ -233,7 +234,7 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger) : Abs log("") // Check if wall is too close or too far - log ("5. Check if we have to move closer or farther to the wall") + log("5. Check if we have to move closer or farther to the wall") if (dist90.distance > DISTANCE_TO_WALL_UPPER_BOUND || dist90.distance < DISTANCE_TO_WALL_LOWER_BOUND) { log("Flaw in distance to the parallel wall found, correcting") return correctDistanceToParallelWall(anglesDistances, state) @@ -242,21 +243,21 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger) : Abs // Approaching inner corner and getting spurious reflection from 2 walls on 60; // Just move forward to get closer to the corner; - log ("6. Check if we are detecting echo reflections approaching inner corner") + log("6. Check if we are detecting echo reflections approaching inner corner") if (dist70.distance - dist0.distance > ECHO_REFLECTION_DIFF) { log("Echo reflection detected, moving forward") return moveForward(dist0.distance) } - log ("") + log("") // Approaching outer corner (parallel wall is ending soon, but not yet); // Just move forward to get to the end of the wall - log ("7. Check if we are detecting far wall approaching outer corner") + log("7. Check if we are detecting far wall approaching outer corner") if (dist80.distance == -1 || Math.abs(dist100.distance - dist80.distance) > ISOSCALENESS_MAX_DIFF) { log("Approaching outer corner, moving forward") return moveForward(dist0.distance) } - log ("") + log("") // default case: everything is ok, just move forward log("8. Default case: moving forward")