car_srv: add RouteMetric request
This commit is contained in:
@@ -3,3 +3,4 @@
|
||||
.gradle/
|
||||
build/
|
||||
out/
|
||||
node_modules
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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())
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user