diff --git a/car_srv/kotlinSrv/src/net/server/Server.kt b/car_srv/kotlinSrv/src/net/server/Server.kt index 17084777afc..a3f15324ec4 100644 --- a/car_srv/kotlinSrv/src/net/server/Server.kt +++ b/car_srv/kotlinSrv/src/net/server/Server.kt @@ -1,46 +1,33 @@ -package server +package net.server import require -import server.handlers.AbstractHandler +import net.server.handlers.AbstractHandler /** * Created by user on 7/27/16. */ -class Server(handlers: MutableMap) { - - val http: dynamic - val url: dynamic - val handlers: MutableMap - - init { - http = require("http") - url = require("url") - this.handlers = handlers - } - - - fun start() { - - http.createServer({ request, response -> - val content = mutableListOf() - val urlName = url.parse(request.url).pathname; - val handler = handlers.get(urlName) - request.on("data", { - data -> - for (i in 0..data.length - 1) { - content.add(data[i]) - } - }) - request.on("end", { - if (handler != null) { - handler.execute(content, response) - } else { - //todo write error on incorrect url - response.end() - } - }) - }).listen(8888) - } +fun start(handlers: MutableMap, port:Int) { + val http = require("http") + val url = require("url") + http.createServer({ request, response -> + val content = mutableListOf() + val urlName = url.parse(request.url).pathname; + val handler = handlers.get(urlName) + request.on("data", { + data -> + for (i in 0..data.length - 1) { + content.add(data[i]) + } + }) + request.on("end", { + if (handler != null) { + handler.execute(content, response) + } else { + //todo write error on incorrect url + response.end() + } + }) + }).listen(port) } \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt b/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt index 69f327a9d5f..f144a1ce355 100644 --- a/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt +++ b/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt @@ -1,4 +1,6 @@ -package server.handlers +package net.server.handlers + +import trimBuffer /** * Created by user on 7/27/16. @@ -16,25 +18,23 @@ abstract class AbstractHandler(protoDecoder: dynamic, protoEncoder: dynamic) { fun execute(data: List, response: dynamic) { - val message = protoDecoder.decode(data.toByteArray()) + + val message = if (protoDecoder != null) protoDecoder.decode(data.toByteArray()) else null val resultMessage: dynamic = {} js("resultMessage = {}")//todo bad? val afterExecute: () -> Unit = { - val protoEn = this.protoEncoder//temporarily:) - val resultMsg = resultMessage - val resultObject = js("new protoEn(resultMsg)") - - val resultBuffer = resultObject.encode() - val byteArray = ByteArray(resultBuffer.limit); - for (i in 0..resultBuffer.limit - 1) { - byteArray[i] = resultBuffer.buffer[i] + if (this.protoEncoder != null) { + val protoEn = this.protoEncoder//temporarily:) + val resultMsg = resultMessage + val resultObject = js("new protoEn(resultMsg)") + val resultBuffer = resultObject.encode() + response.write(trimBuffer(resultBuffer.buffer, resultBuffer.limit)) } - response.write(js("new Buffer(byteArray)")) response.end() } - makeResult(message, resultMessage, afterExecute) + makeResponse(message, resultMessage, afterExecute) } - abstract fun makeResult(message: dynamic, resultMessage: dynamic, finalCallback: () -> Unit) + abstract fun makeResponse(message: dynamic, responseMessage: dynamic, finalCallback: () -> Unit) } \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/flash/LoadBin.kt b/car_srv/kotlinSrv/src/net/server/handlers/flash/LoadBin.kt index 577fcece933..52ab64e835a 100644 --- a/car_srv/kotlinSrv/src/net/server/handlers/flash/LoadBin.kt +++ b/car_srv/kotlinSrv/src/net/server/handlers/flash/LoadBin.kt @@ -1,6 +1,6 @@ -package server.handlers.flash +package net.server.handlers.flash -import server.handlers.AbstractHandler +import net.server.handlers.AbstractHandler import require /** @@ -9,12 +9,43 @@ import require class LoadBin : AbstractHandler { val fs: dynamic + val exec: dynamic constructor(protoDecoder: dynamic, protoEncoder: dynamic) : super(protoDecoder, protoEncoder) { this.fs = require("fs") + this.exec = require("child_process").exec } - override fun makeResult(message: dynamic, resultList: dynamic, finalCallback: () -> Unit) { - throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. + override fun makeResponse(message: dynamic, responseMessage: dynamic, finalCallback: () -> Unit) { + var stdOut: String = "" + var strErr: String = "" + var resultCode = 0 + fs.writeFile("./flash.bin", message.data.buffer, "binary", { error -> + if (error != null) { + resultCode = 14 + strErr = error.toString() + responseMessage.stdOut = stdOut + responseMessage.strErr = strErr + responseMessage.resultCode = resultCode + finalCallback.invoke() + } else { + val stFlashCommand = "./st-flash write ./flash.bin " + message.base + exec(stFlashCommand, { err, stdOutRes, stdErrRes -> + if (err != null) { + resultCode = 15 + strErr = stdErrRes.toString() + "\n" + err.toString() + stdOut = stdOutRes.toString() + } else { + resultCode = 0 + strErr = stdErrRes.toString() + stdOut = stdOutRes.toString() + } + responseMessage.stdOut = stdOut + responseMessage.strErr = strErr + responseMessage.resultCode = resultCode + finalCallback.invoke() + }) + } + }) } -} +} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/rc/Connect.kt b/car_srv/kotlinSrv/src/net/server/handlers/rc/Connect.kt index 71cde01438e..7d322a0b8d2 100644 --- a/car_srv/kotlinSrv/src/net/server/handlers/rc/Connect.kt +++ b/car_srv/kotlinSrv/src/net/server/handlers/rc/Connect.kt @@ -1,7 +1,33 @@ -package server.handlers.rc +package net.server.handlers.rc + +import exceptions.RcControlException +import net.server.handlers.AbstractHandler /** * Created by user on 7/27/16. */ -class Connect { +class Connect : AbstractHandler { + + constructor(protoDecoder: dynamic, protoEncoder: dynamic) : super(protoDecoder, protoEncoder) + + override fun makeResponse(message: dynamic, responseMessage: dynamic, finalCallback: () -> Unit) { + val resultCode: Int + val resultMsg: String + val sid: Int; + try { + sid = MicroController.instance.connectRC() + resultCode = 0 + resultMsg = "" + } catch (e: RcControlException) { + resultCode = 13 + resultMsg = "car already controlled by RC" + sid = 0 + } + + responseMessage.sid = sid + responseMessage.code = resultCode + responseMessage.errorMsg = resultMsg + + finalCallback.invoke() + } } \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/rc/Control.kt b/car_srv/kotlinSrv/src/net/server/handlers/rc/Control.kt index 14fdc14c247..6e93ddb4a33 100644 --- a/car_srv/kotlinSrv/src/net/server/handlers/rc/Control.kt +++ b/car_srv/kotlinSrv/src/net/server/handlers/rc/Control.kt @@ -1,9 +1,9 @@ -package server.handlers.rc +package net.server.handlers.rc -import carControl.RouteExecutorImpl -import server.handlers.AbstractHandler -import thisCar +import MicroController import carControl.RouteExecutorImpl.MoveDirection +import exceptions.RcControlException +import net.server.handlers.AbstractHandler /** * Created by user on 7/27/16. @@ -12,10 +12,9 @@ class Control : AbstractHandler { constructor(protoDecoder: dynamic, protoEncoder: dynamic) : super(protoDecoder, protoEncoder) - override fun makeResult(message: dynamic, resultMessage: dynamic, finalCallback: () -> Unit) { + override fun makeResponse(message: dynamic, responseMessage: dynamic, finalCallback: () -> Unit) { val commandNumber = message.command - resultMessage.code = 0 - resultMessage.errorMsg = "" + val sid = message.sid val command = when (commandNumber) { protoDecoder.Command.stop -> { MoveDirection.STOP @@ -34,7 +33,18 @@ class Control : AbstractHandler { } else -> MoveDirection.STOP } - thisCar.move(command, 0.0, {}) + val resultCode:Int + val resultMsg:String + try { + MicroController.instance.RcMove(command, sid) + resultCode = 0 + resultMsg = "" + } catch (e: RcControlException) { + resultCode = 12 + resultMsg = "incorrect remote control sid" + } + responseMessage.code = resultCode + responseMessage.errorMsg = resultMsg finalCallback.invoke() } } \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/rc/Disconnect.kt b/car_srv/kotlinSrv/src/net/server/handlers/rc/Disconnect.kt index 7f8d7bf43e3..213263daf38 100644 --- a/car_srv/kotlinSrv/src/net/server/handlers/rc/Disconnect.kt +++ b/car_srv/kotlinSrv/src/net/server/handlers/rc/Disconnect.kt @@ -1,8 +1,30 @@ -package server.handlers.rc +package net.server.handlers.rc + +import exceptions.RcControlException +import net.server.handlers.AbstractHandler /** * Created by user on 7/27/16. */ -class Disconnect { +class Disconnect : AbstractHandler{ + constructor(protoDecoder: dynamic, protoEncoder: dynamic) : super(protoDecoder, protoEncoder) + + override fun makeResponse(message: dynamic, responseMessage: dynamic, finalCallback: () -> Unit) { + + val resultCode: Int + val resultMsg: String + try { + MicroController.instance.disconnectRC(message.sid) + resultCode = 0 + resultMsg = "" + } catch (e: RcControlException) { + resultCode = 12 + resultMsg = "incorrect remote control sid" + } + responseMessage.code = resultCode + responseMessage.errorMsg = resultMsg + + finalCallback.invoke() + } } \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/rc/Heartbeat.kt b/car_srv/kotlinSrv/src/net/server/handlers/rc/Heartbeat.kt index e66d9af048b..0de633968ba 100644 --- a/car_srv/kotlinSrv/src/net/server/handlers/rc/Heartbeat.kt +++ b/car_srv/kotlinSrv/src/net/server/handlers/rc/Heartbeat.kt @@ -1,8 +1,28 @@ -package server.handlers.rc +package net.server.handlers.rc + +import exceptions.RcControlException +import net.server.handlers.AbstractHandler /** * Created by user on 7/27/16. */ -class Heartbeat { +class Heartbeat : AbstractHandler { + constructor(protoDecoder: dynamic, protoEncoder: dynamic) : super(protoDecoder, protoEncoder) + + override fun makeResponse(message: dynamic, responseMessage: dynamic, finalCallback: () -> Unit) { + val resultCode: Int + val resultMsg: String + try { + MicroController.instance.rcHeartBeat(message.sid) + resultCode = 0 + resultMsg = "" + } catch (e: RcControlException) { + resultCode = 12 + resultMsg = "incorrect remote control sid" + } + responseMessage.code = resultCode + responseMessage.errorMsg = resultMsg + finalCallback.invoke() + } } \ No newline at end of file