car_srv: add RouteMetric request
This commit is contained in:
@@ -3,3 +3,4 @@
|
|||||||
.gradle/
|
.gradle/
|
||||||
build/
|
build/
|
||||||
out/
|
out/
|
||||||
|
node_modules
|
||||||
|
|||||||
@@ -53,6 +53,12 @@ fun <T> encodeProtoBuf(protoMessage: T): ByteArray {
|
|||||||
val codedOutput = CodedOutputStream(routeBytes)
|
val codedOutput = CodedOutputStream(routeBytes)
|
||||||
protoMessage.writeTo(codedOutput)
|
protoMessage.writeTo(codedOutput)
|
||||||
}
|
}
|
||||||
|
is RouteMetricRequest -> {
|
||||||
|
val protoSize = protoMessage.getSizeNoTag()
|
||||||
|
routeBytes = ByteArray(protoSize)
|
||||||
|
val codedOutput = CodedOutputStream(routeBytes)
|
||||||
|
protoMessage.writeTo(codedOutput)
|
||||||
|
}
|
||||||
|
|
||||||
is TaskRequest -> {
|
is TaskRequest -> {
|
||||||
val protoSize = protoMessage.getSizeNoTag()
|
val protoSize = protoMessage.getSizeNoTag()
|
||||||
|
|||||||
@@ -36,6 +36,12 @@ class McTransport() : MCConnectObserver<String> {
|
|||||||
sendBytes(encodeProtoBuf(message))
|
sendBytes(encodeProtoBuf(message))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun sendProtoBuf(request: RouteMetricRequest) {
|
||||||
|
val typeMessage = getProtoBufTypeMessage(TaskRequest.Type.ROUTE_METRIC)
|
||||||
|
sendProtoBufType(typeMessage)
|
||||||
|
sendBytes(encodeProtoBuf(request))
|
||||||
|
}
|
||||||
|
|
||||||
private fun sendProtoBufType(messageType: TaskRequest) {
|
private fun sendProtoBufType(messageType: TaskRequest) {
|
||||||
val typeBytes = encodeProtoBuf(messageType)
|
val typeBytes = encodeProtoBuf(messageType)
|
||||||
sendBytes(typeBytes)
|
sendBytes(typeBytes)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import net.server.handlers.flash.LoadBin
|
|||||||
import net.server.handlers.main.GetLocation
|
import net.server.handlers.main.GetLocation
|
||||||
import net.server.handlers.main.GetSonarData
|
import net.server.handlers.main.GetSonarData
|
||||||
import net.server.handlers.main.SetRoute
|
import net.server.handlers.main.SetRoute
|
||||||
|
import net.server.handlers.main.SetRouteMetric
|
||||||
import net.server.handlers.rc.Control
|
import net.server.handlers.rc.Control
|
||||||
|
|
||||||
val carServerPort: Int = 8888
|
val carServerPort: Int = 8888
|
||||||
@@ -20,7 +21,6 @@ fun main(args: Array<String>) {
|
|||||||
js("process.exit(1)")
|
js("process.exit(1)")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
val clArgs = js("process.argv")
|
val clArgs = js("process.argv")
|
||||||
var runAsEmulator = false
|
var runAsEmulator = false
|
||||||
var runTests = false
|
var runTests = false
|
||||||
@@ -42,11 +42,12 @@ fun main(args: Array<String>) {
|
|||||||
runTests()
|
runTests()
|
||||||
}
|
}
|
||||||
|
|
||||||
val handlers: MutableMap<String, AbstractHandler> = mutableMapOf()
|
val handlers = mutableMapOf<String, AbstractHandler>()
|
||||||
handlers.put("/rc/control", Control())
|
handlers.put("/rc/control", Control())
|
||||||
handlers.put("/loadBin", LoadBin())
|
handlers.put("/loadBin", LoadBin())
|
||||||
handlers.put("/sonar", GetSonarData(carController))
|
handlers.put("/sonar", GetSonarData(carController))
|
||||||
handlers.put("/route", SetRoute(carController))
|
handlers.put("/route", SetRoute(carController))
|
||||||
|
handlers.put("/routeMetric", SetRouteMetric(carController))
|
||||||
handlers.put("/getLocation", GetLocation())
|
handlers.put("/getLocation", GetLocation())
|
||||||
handlers.put("/debug/memory", Memory())
|
handlers.put("/debug/memory", Memory())
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
package control
|
package control
|
||||||
|
|
||||||
|
import RouteMetricRequest
|
||||||
import RouteRequest
|
import RouteRequest
|
||||||
import SonarRequest
|
import SonarRequest
|
||||||
|
|
||||||
interface Controller {
|
interface Controller {
|
||||||
|
fun executeRoute(route: RouteRequest, callback: (ByteArray) -> Unit)
|
||||||
fun executeRoute(route: RouteRequest, callBack: (ByteArray) -> Unit)
|
fun executeMetricRoute(request: RouteMetricRequest, callback: (ByteArray) -> Unit)
|
||||||
|
fun executeRequestSensorData(sonarRequest: SonarRequest, callback: (ByteArray) -> Unit)
|
||||||
fun executeRequestSensorData(sonarRequest: SonarRequest, callBack: (ByteArray) -> Unit)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,26 +1,36 @@
|
|||||||
package control.car
|
package control.car
|
||||||
|
|
||||||
|
import RouteMetricRequest
|
||||||
import RouteRequest
|
import RouteRequest
|
||||||
|
import SonarRequest
|
||||||
import control.Controller
|
import control.Controller
|
||||||
import mcTransport
|
import mcTransport
|
||||||
import SonarRequest
|
|
||||||
|
|
||||||
class ControllerToUsb : Controller {
|
class ControllerToUsb : Controller {
|
||||||
|
override fun executeRoute(route: RouteRequest, callback: (ByteArray) -> Unit) {
|
||||||
override fun executeRoute(route: RouteRequest, callBack: (ByteArray) -> Unit) {
|
|
||||||
println("Execute Route:")
|
println("Execute Route:")
|
||||||
|
|
||||||
mcTransport.setCallBack { bytes ->
|
mcTransport.setCallBack { bytes ->
|
||||||
callBack.invoke(bytes)
|
callback.invoke(bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
mcTransport.sendProtoBuf(route)
|
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")
|
println("sonar data")
|
||||||
mcTransport.setCallBack { bytes ->
|
mcTransport.setCallBack { bytes ->
|
||||||
callBack.invoke(bytes)
|
callback.invoke(bytes)
|
||||||
}
|
}
|
||||||
mcTransport.sendProtoBuf(sonarRequest)
|
mcTransport.sendProtoBuf(sonarRequest)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package control.emulator
|
package control.emulator
|
||||||
|
|
||||||
import CarState
|
import CarState
|
||||||
|
import RouteMetricRequest
|
||||||
import RouteRequest
|
import RouteRequest
|
||||||
import RouteResponse
|
import RouteResponse
|
||||||
import SonarRequest
|
import SonarRequest
|
||||||
@@ -10,11 +11,8 @@ import encodeProtoBuf
|
|||||||
import geometry.Line
|
import geometry.Line
|
||||||
import geometry.Vector
|
import geometry.Vector
|
||||||
import room.Room
|
import room.Room
|
||||||
import setTimeout
|
|
||||||
import kotlin.Pair
|
|
||||||
|
|
||||||
class ControllerEmulator : Controller {
|
class ControllerEmulator : Controller {
|
||||||
|
|
||||||
private val MOVE_VELOCITY = 32.78//sm/s
|
private val MOVE_VELOCITY = 32.78//sm/s
|
||||||
private val ROTATION_VELOCITY = 12.3//degrees/s
|
private val ROTATION_VELOCITY = 12.3//degrees/s
|
||||||
|
|
||||||
@@ -26,7 +24,7 @@ class ControllerEmulator : Controller {
|
|||||||
ERROR
|
ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun executeRoute(route: RouteRequest, callBack: (ByteArray) -> Unit) {
|
override fun executeRoute(route: RouteRequest, callback: (ByteArray) -> Unit) {
|
||||||
val moveTimes = route.times
|
val moveTimes = route.times
|
||||||
val moveDirections = route.directions
|
val moveDirections = route.directions
|
||||||
//list of move direction and time to this move in ms
|
//list of move direction and time to this move in ms
|
||||||
@@ -44,11 +42,14 @@ class ControllerEmulator : Controller {
|
|||||||
|
|
||||||
commands.add(Pair(moveDirection, value))
|
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 angles = sonarRequest.angles
|
||||||
val xSensor0 = CarState.instance.x
|
val xSensor0 = CarState.instance.x
|
||||||
val ySensor0 = CarState.instance.y
|
val ySensor0 = CarState.instance.y
|
||||||
@@ -92,7 +93,7 @@ class ControllerEmulator : Controller {
|
|||||||
}
|
}
|
||||||
val responseMessage = SonarResponse.BuilderSonarResponse(distances.toIntArray()).build()
|
val responseMessage = SonarResponse.BuilderSonarResponse(distances.toIntArray()).build()
|
||||||
val bytesMessage = encodeProtoBuf(responseMessage)
|
val bytesMessage = encodeProtoBuf(responseMessage)
|
||||||
callBack.invoke(bytesMessage)
|
callback.invoke(bytesMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getDistance(xSensor0: Int, ySensor0: Int, sensorLine: Line, sensorVector: Vector): Int {
|
private fun getDistance(xSensor0: Int, ySensor0: Int, sensorLine: Line, sensorVector: Vector): Int {
|
||||||
@@ -169,7 +170,7 @@ class ControllerEmulator : Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setTimeout({
|
// setTimeout({
|
||||||
executeCommand(commands, currentCommandIdx + 1, callBack)
|
executeCommand(commands, currentCommandIdx + 1, callBack)
|
||||||
// }, currentCommand.second)
|
// }, currentCommand.second)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
package net.server.handlers
|
package net.server.handlers
|
||||||
|
|
||||||
abstract class AbstractHandler {
|
abstract class AbstractHandler {
|
||||||
|
|
||||||
fun execute(data: List<Byte>, response: dynamic) {
|
fun execute(data: List<Byte>, response: dynamic) {
|
||||||
|
|
||||||
val callBack = { resultBytes: ByteArray ->
|
val callBack = { resultBytes: ByteArray ->
|
||||||
val resultBuffer = js("new Buffer(resultBytes)")
|
val resultBuffer = js("new Buffer(resultBytes)")
|
||||||
response.write(resultBuffer)
|
response.write(resultBuffer)
|
||||||
@@ -19,6 +17,5 @@ abstract class AbstractHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
abstract fun getBytesResponse(data: ByteArray, callback: (b: ByteArray) -> Unit)
|
abstract fun getBytesResponse(data: ByteArray, callback: (b: ByteArray) -> Unit)
|
||||||
}
|
}
|
||||||
@@ -8,28 +8,21 @@ import control.Controller
|
|||||||
import encodeProtoBuf
|
import encodeProtoBuf
|
||||||
import net.server.handlers.AbstractHandler
|
import net.server.handlers.AbstractHandler
|
||||||
|
|
||||||
class GetSonarData : AbstractHandler {
|
class GetSonarData(val controller: Controller): AbstractHandler() {
|
||||||
|
val fromServerObjectBuilder = SonarRequest.BuilderSonarRequest(IntArray(0))
|
||||||
val fromServerObjectBuilder: SonarRequest.BuilderSonarRequest
|
val toServerObjectBuilder = SonarResponse.BuilderSonarResponse(IntArray(0))
|
||||||
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))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) {
|
override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) {
|
||||||
val message = fromServerObjectBuilder.build()
|
val message = fromServerObjectBuilder.build()
|
||||||
message.mergeFrom(CodedInputStream(data))
|
message.mergeFrom(CodedInputStream(data))
|
||||||
if (!McState.instance.isConnected()) {
|
|
||||||
println("mc is disconnected!")
|
if (McState.instance.isConnected()) {
|
||||||
val responseMessage = toServerObjectBuilder.build()
|
controller.executeRequestSensorData(message, callback)
|
||||||
callback.invoke(encodeProtoBuf(responseMessage))
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
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 encodeProtoBuf
|
||||||
import net.server.handlers.AbstractHandler
|
import net.server.handlers.AbstractHandler
|
||||||
|
|
||||||
class SetRoute : AbstractHandler {
|
class SetRoute(var controller: Controller) : AbstractHandler() {
|
||||||
|
val requestBuilder = RouteRequest.BuilderRouteRequest(IntArray(0), IntArray(0))
|
||||||
val fromServerObjectBuilder: RouteRequest.BuilderRouteRequest
|
val responseBuilder = RouteResponse.BuilderRouteResponse(0)
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) {
|
override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) {
|
||||||
val message = fromServerObjectBuilder.build()
|
val message = requestBuilder.build()
|
||||||
message.mergeFrom(CodedInputStream(data))
|
message.mergeFrom(CodedInputStream(data))
|
||||||
if (!McState.instance.isConnected()) {
|
|
||||||
println("mc is disconnected!")
|
if (McState.instance.isConnected()) {
|
||||||
val responseMessage = toServerObjectBuilder.setCode(16).build()
|
controller.executeRoute(message, callback)
|
||||||
callback.invoke(encodeProtoBuf(responseMessage))
|
|
||||||
return
|
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;
|
DEBUG = 0;
|
||||||
ROUTE = 1;
|
ROUTE = 1;
|
||||||
SONAR = 2;
|
SONAR = 2;
|
||||||
|
ROUTE_METRIC = 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user