car_srv: add RouteMetric request

This commit is contained in:
e5l
2016-08-25 18:10:09 +03:00
parent ff5ad083a9
commit ffbccd2aa5
12 changed files with 96 additions and 59 deletions
+1
View File
@@ -3,3 +3,4 @@
.gradle/
build/
out/
node_modules
+6
View File
@@ -53,6 +53,12 @@ fun <T> 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()
+6
View File
@@ -36,6 +36,12 @@ class McTransport() : MCConnectObserver<String> {
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)
+3 -2
View File
@@ -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<String>) {
js("process.exit(1)")
}
val clArgs = js("process.argv")
var runAsEmulator = false
var runTests = false
@@ -42,11 +42,12 @@ fun main(args: Array<String>) {
runTests()
}
val handlers: MutableMap<String, AbstractHandler> = mutableMapOf()
val handlers = mutableMapOf<String, AbstractHandler>()
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())
+4 -5
View File
@@ -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)
}
@@ -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)
}
@@ -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)
}
@@ -1,9 +1,7 @@
package net.server.handlers
abstract class AbstractHandler {
fun execute(data: List<Byte>, 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)
}
@@ -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
}
}
@@ -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))
}
}
@@ -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))
}
}
@@ -9,5 +9,6 @@ message TaskRequest {
DEBUG = 0;
ROUTE = 1;
SONAR = 2;
ROUTE_METRIC = 3;
}
}