diff --git a/car_srv/kotlinSrv/.gitignore b/car_srv/kotlinSrv/.gitignore index 01d5de8a24e..3ff91b1dba1 100644 --- a/car_srv/kotlinSrv/.gitignore +++ b/car_srv/kotlinSrv/.gitignore @@ -3,3 +3,4 @@ .gradle/ build/ out/ +node_modules diff --git a/car_srv/kotlinSrv/src/JSImport.kt b/car_srv/kotlinSrv/src/JSImport.kt index 24667236b51..6e96ef0eb3d 100644 --- a/car_srv/kotlinSrv/src/JSImport.kt +++ b/car_srv/kotlinSrv/src/JSImport.kt @@ -53,6 +53,12 @@ fun encodeProtoBuf(protoMessage: T): ByteArray { val codedOutput = CodedOutputStream(routeBytes) protoMessage.writeTo(codedOutput) } + is RouteMetricRequest -> { + val protoSize = protoMessage.getSizeNoTag() + routeBytes = ByteArray(protoSize) + val codedOutput = CodedOutputStream(routeBytes) + protoMessage.writeTo(codedOutput) + } is TaskRequest -> { val protoSize = protoMessage.getSizeNoTag() diff --git a/car_srv/kotlinSrv/src/MCConnection.kt b/car_srv/kotlinSrv/src/MCConnection.kt index 21c4a86783a..b769584b44b 100644 --- a/car_srv/kotlinSrv/src/MCConnection.kt +++ b/car_srv/kotlinSrv/src/MCConnection.kt @@ -36,6 +36,12 @@ class McTransport() : MCConnectObserver { sendBytes(encodeProtoBuf(message)) } + fun sendProtoBuf(request: RouteMetricRequest) { + val typeMessage = getProtoBufTypeMessage(TaskRequest.Type.ROUTE_METRIC) + sendProtoBufType(typeMessage) + sendBytes(encodeProtoBuf(request)) + } + private fun sendProtoBufType(messageType: TaskRequest) { val typeBytes = encodeProtoBuf(messageType) sendBytes(typeBytes) diff --git a/car_srv/kotlinSrv/src/Main.kt b/car_srv/kotlinSrv/src/Main.kt index 6619287a8bb..55dedcd738a 100644 --- a/car_srv/kotlinSrv/src/Main.kt +++ b/car_srv/kotlinSrv/src/Main.kt @@ -7,6 +7,7 @@ import net.server.handlers.flash.LoadBin import net.server.handlers.main.GetLocation import net.server.handlers.main.GetSonarData import net.server.handlers.main.SetRoute +import net.server.handlers.main.SetRouteMetric import net.server.handlers.rc.Control val carServerPort: Int = 8888 @@ -20,7 +21,6 @@ fun main(args: Array) { js("process.exit(1)") } - val clArgs = js("process.argv") var runAsEmulator = false var runTests = false @@ -42,11 +42,12 @@ fun main(args: Array) { runTests() } - val handlers: MutableMap = mutableMapOf() + val handlers = mutableMapOf() handlers.put("/rc/control", Control()) handlers.put("/loadBin", LoadBin()) handlers.put("/sonar", GetSonarData(carController)) handlers.put("/route", SetRoute(carController)) + handlers.put("/routeMetric", SetRouteMetric(carController)) handlers.put("/getLocation", GetLocation()) handlers.put("/debug/memory", Memory()) diff --git a/car_srv/kotlinSrv/src/control/Controller.kt b/car_srv/kotlinSrv/src/control/Controller.kt index 32120dbbd77..6721b5b17a3 100644 --- a/car_srv/kotlinSrv/src/control/Controller.kt +++ b/car_srv/kotlinSrv/src/control/Controller.kt @@ -1,12 +1,11 @@ package control +import RouteMetricRequest import RouteRequest import SonarRequest interface Controller { - - fun executeRoute(route: RouteRequest, callBack: (ByteArray) -> Unit) - - fun executeRequestSensorData(sonarRequest: SonarRequest, callBack: (ByteArray) -> Unit) - + fun executeRoute(route: RouteRequest, callback: (ByteArray) -> Unit) + fun executeMetricRoute(request: RouteMetricRequest, callback: (ByteArray) -> Unit) + fun executeRequestSensorData(sonarRequest: SonarRequest, callback: (ByteArray) -> Unit) } \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/control/car/ControllerToUsb.kt b/car_srv/kotlinSrv/src/control/car/ControllerToUsb.kt index 507de2a6b23..634cc9ae352 100644 --- a/car_srv/kotlinSrv/src/control/car/ControllerToUsb.kt +++ b/car_srv/kotlinSrv/src/control/car/ControllerToUsb.kt @@ -1,26 +1,36 @@ package control.car +import RouteMetricRequest import RouteRequest +import SonarRequest import control.Controller import mcTransport -import SonarRequest class ControllerToUsb : Controller { - - override fun executeRoute(route: RouteRequest, callBack: (ByteArray) -> Unit) { + override fun executeRoute(route: RouteRequest, callback: (ByteArray) -> Unit) { println("Execute Route:") mcTransport.setCallBack { bytes -> - callBack.invoke(bytes) + callback.invoke(bytes) } mcTransport.sendProtoBuf(route) } - override fun executeRequestSensorData(sonarRequest: SonarRequest, callBack: (ByteArray) -> Unit) { + override fun executeMetricRoute(request: RouteMetricRequest, callback: (ByteArray) -> Unit) { + println("Execute Route:") + + mcTransport.setCallBack { bytes -> + callback.invoke(bytes) + } + + mcTransport.sendProtoBuf(request) + } + + override fun executeRequestSensorData(sonarRequest: SonarRequest, callback: (ByteArray) -> Unit) { println("sonar data") mcTransport.setCallBack { bytes -> - callBack.invoke(bytes) + callback.invoke(bytes) } mcTransport.sendProtoBuf(sonarRequest) } diff --git a/car_srv/kotlinSrv/src/control/emulator/ControllerEmulator.kt b/car_srv/kotlinSrv/src/control/emulator/ControllerEmulator.kt index fb3f461926b..679d83dfb07 100644 --- a/car_srv/kotlinSrv/src/control/emulator/ControllerEmulator.kt +++ b/car_srv/kotlinSrv/src/control/emulator/ControllerEmulator.kt @@ -1,6 +1,7 @@ package control.emulator import CarState +import RouteMetricRequest import RouteRequest import RouteResponse import SonarRequest @@ -10,11 +11,8 @@ import encodeProtoBuf import geometry.Line import geometry.Vector import room.Room -import setTimeout -import kotlin.Pair class ControllerEmulator : Controller { - private val MOVE_VELOCITY = 32.78//sm/s private val ROTATION_VELOCITY = 12.3//degrees/s @@ -26,7 +24,7 @@ class ControllerEmulator : Controller { ERROR } - override fun executeRoute(route: RouteRequest, callBack: (ByteArray) -> Unit) { + override fun executeRoute(route: RouteRequest, callback: (ByteArray) -> Unit) { val moveTimes = route.times val moveDirections = route.directions //list of move direction and time to this move in ms @@ -44,11 +42,14 @@ class ControllerEmulator : Controller { commands.add(Pair(moveDirection, value)) } - executeCommand(commands, 0, callBack) + executeCommand(commands, 0, callback) } - override fun executeRequestSensorData(sonarRequest: SonarRequest, callBack: (ByteArray) -> Unit) { + override fun executeMetricRoute(request: RouteMetricRequest, callback: (ByteArray) -> Unit) { + throw UnsupportedOperationException() + } + override fun executeRequestSensorData(sonarRequest: SonarRequest, callback: (ByteArray) -> Unit) { val angles = sonarRequest.angles val xSensor0 = CarState.instance.x val ySensor0 = CarState.instance.y @@ -92,7 +93,7 @@ class ControllerEmulator : Controller { } val responseMessage = SonarResponse.BuilderSonarResponse(distances.toIntArray()).build() val bytesMessage = encodeProtoBuf(responseMessage) - callBack.invoke(bytesMessage) + callback.invoke(bytesMessage) } private fun getDistance(xSensor0: Int, ySensor0: Int, sensorLine: Line, sensorVector: Vector): Int { @@ -169,7 +170,7 @@ class ControllerEmulator : Controller { } // setTimeout({ - executeCommand(commands, currentCommandIdx + 1, callBack) + executeCommand(commands, currentCommandIdx + 1, callBack) // }, currentCommand.second) } diff --git a/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt b/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt index aac80663e5f..836a069feb3 100644 --- a/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt +++ b/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt @@ -1,9 +1,7 @@ package net.server.handlers abstract class AbstractHandler { - fun execute(data: List, response: dynamic) { - val callBack = { resultBytes: ByteArray -> val resultBuffer = js("new Buffer(resultBytes)") response.write(resultBuffer) @@ -19,6 +17,5 @@ abstract class AbstractHandler { } } - abstract fun getBytesResponse(data: ByteArray, callback: (b: ByteArray) -> Unit) } \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/main/GetSonarData.kt b/car_srv/kotlinSrv/src/net/server/handlers/main/GetSonarData.kt index cc7ee2af314..8512aa95ccc 100644 --- a/car_srv/kotlinSrv/src/net/server/handlers/main/GetSonarData.kt +++ b/car_srv/kotlinSrv/src/net/server/handlers/main/GetSonarData.kt @@ -8,28 +8,21 @@ import control.Controller import encodeProtoBuf import net.server.handlers.AbstractHandler -class GetSonarData : AbstractHandler { - - val fromServerObjectBuilder: SonarRequest.BuilderSonarRequest - val toServerObjectBuilder: SonarResponse.BuilderSonarResponse - val controller: Controller - - constructor(routeExecutor: Controller) : super() { - this.controller = routeExecutor - this.fromServerObjectBuilder = SonarRequest.BuilderSonarRequest(IntArray(0)) - this.toServerObjectBuilder = SonarResponse.BuilderSonarResponse(IntArray(0)) - } - +class GetSonarData(val controller: Controller): AbstractHandler() { + val fromServerObjectBuilder = SonarRequest.BuilderSonarRequest(IntArray(0)) + val toServerObjectBuilder = SonarResponse.BuilderSonarResponse(IntArray(0)) override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) { val message = fromServerObjectBuilder.build() message.mergeFrom(CodedInputStream(data)) - if (!McState.instance.isConnected()) { - println("mc is disconnected!") - val responseMessage = toServerObjectBuilder.build() - callback.invoke(encodeProtoBuf(responseMessage)) - return + + if (McState.instance.isConnected()) { + controller.executeRequestSensorData(message, callback) } - controller.executeRequestSensorData(message, callback) + + println("mc is disconnected!") + val responseMessage = toServerObjectBuilder.build() + callback.invoke(encodeProtoBuf(responseMessage)) + return } } \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/main/SetRoute.kt b/car_srv/kotlinSrv/src/net/server/handlers/main/SetRoute.kt index 5d8cef5fc0a..abd2b918a0a 100644 --- a/car_srv/kotlinSrv/src/net/server/handlers/main/SetRoute.kt +++ b/car_srv/kotlinSrv/src/net/server/handlers/main/SetRoute.kt @@ -8,27 +8,21 @@ import control.Controller import encodeProtoBuf import net.server.handlers.AbstractHandler -class SetRoute : AbstractHandler { - - val fromServerObjectBuilder: RouteRequest.BuilderRouteRequest - val toServerObjectBuilder: RouteResponse.BuilderRouteResponse - val controller: Controller - - constructor(routeExecutor: Controller) : super() { - this.controller = routeExecutor - this.fromServerObjectBuilder = RouteRequest.BuilderRouteRequest(IntArray(0), IntArray(0)) - this.toServerObjectBuilder = RouteResponse.BuilderRouteResponse(0) - } +class SetRoute(var controller: Controller) : AbstractHandler() { + val requestBuilder = RouteRequest.BuilderRouteRequest(IntArray(0), IntArray(0)) + val responseBuilder = RouteResponse.BuilderRouteResponse(0) override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) { - val message = fromServerObjectBuilder.build() + val message = requestBuilder.build() message.mergeFrom(CodedInputStream(data)) - if (!McState.instance.isConnected()) { - println("mc is disconnected!") - val responseMessage = toServerObjectBuilder.setCode(16).build() - callback.invoke(encodeProtoBuf(responseMessage)) + + if (McState.instance.isConnected()) { + controller.executeRoute(message, callback) return } - controller.executeRoute(message, callback) + + println("mc is disconnected!") + val responseMessage = responseBuilder.setCode(16).build() + callback.invoke(encodeProtoBuf(responseMessage)) } } \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/main/SetRouteMetric.kt b/car_srv/kotlinSrv/src/net/server/handlers/main/SetRouteMetric.kt new file mode 100644 index 00000000000..26d01cc5be0 --- /dev/null +++ b/car_srv/kotlinSrv/src/net/server/handlers/main/SetRouteMetric.kt @@ -0,0 +1,28 @@ +package net.server.handlers.main + +import CodedInputStream +import McState +import RouteResponse +import control.Controller +import encodeProtoBuf +import net.server.handlers.AbstractHandler + + +class SetRouteMetric(val controller: Controller) : AbstractHandler() { + val requestBuilder = RouteMetricRequest.BuilderRouteMetricRequest(IntArray(0), IntArray(0)) + val responseBuilder = RouteResponse.BuilderRouteResponse(0) + + override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) { + val message = requestBuilder.build() + message.mergeFrom(CodedInputStream(data)) + + if (McState.instance.isConnected()) { + controller.executeMetricRoute(message, callback) + return + } + + println("mc is disconnected!") + val responseMessage = responseBuilder.setCode(16).build() + callback.invoke(encodeProtoBuf(responseMessage)) + } +} diff --git a/proto/protofiles_sources/server_car/task.proto b/proto/protofiles_sources/server_car/task.proto index b61e72a90b0..8e6384bbb73 100644 --- a/proto/protofiles_sources/server_car/task.proto +++ b/proto/protofiles_sources/server_car/task.proto @@ -9,5 +9,6 @@ message TaskRequest { DEBUG = 0; ROUTE = 1; SONAR = 2; + ROUTE_METRIC = 3; } }