From fca65447801df35a6f23e24d6b241cce35a016a2 Mon Sep 17 00:00:00 2001 From: kvetinac97 Date: Sun, 11 Jul 2021 02:34:04 +0200 Subject: [PATCH] 4th semester: BI-PSI --- BI-PSI/README.adoc | 11 + BI-PSI/grades.pdf | Bin 0 -> 103449 bytes BI-PSI/semestral/pom.xml | 98 ++++++ BI-PSI/semestral/src/main/kotlin/main.kt | 412 +++++++++++++++++++++++ README.adoc | 2 +- 5 files changed, 522 insertions(+), 1 deletion(-) create mode 100644 BI-PSI/README.adoc create mode 100644 BI-PSI/grades.pdf create mode 100644 BI-PSI/semestral/pom.xml create mode 100644 BI-PSI/semestral/src/main/kotlin/main.kt diff --git a/BI-PSI/README.adoc b/BI-PSI/README.adoc new file mode 100644 index 0000000..e73c6ab --- /dev/null +++ b/BI-PSI/README.adoc @@ -0,0 +1,11 @@ += Computer Networks + +Got 10 bonus points from semester for activity. + +Found critical bug in homework submission server Bouda. + +Got 90 % from exam, resulting in grade A. + +== Semestral task + +In Computer Networks, in order to get assessment, we had to develop a simple program for simulating communication with Robots. + +I chose to develop it in Kotlin, and you can link:semestral/[see the semestral task here]. diff --git a/BI-PSI/grades.pdf b/BI-PSI/grades.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5cfa7dbdc2f6e1b2d4c2eb7da9502a9efe3d5a31 GIT binary patch literal 103449 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 literal 0 HcmV?d00001 diff --git a/BI-PSI/semestral/pom.xml b/BI-PSI/semestral/pom.xml new file mode 100644 index 0000000..24363a6 --- /dev/null +++ b/BI-PSI/semestral/pom.xml @@ -0,0 +1,98 @@ + + + 4.0.0 + + sem + cz.fit.cvut.wrzecond + 1.0.0 + jar + + sem + + + UTF-8 + official + 1.8 + + + + + mavenCentral + https://repo1.maven.org/maven2/ + + + + + src/main/kotlin + src/test/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + 1.4.31 + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + maven-assembly-plugin + + + package + + single + + + + + + + true + MainKt + + + + jar-with-dependencies + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + 1.4.31 + + + org.jetbrains.kotlinx + kotlinx-coroutines-core + 1.4.3 + + + + \ No newline at end of file diff --git a/BI-PSI/semestral/src/main/kotlin/main.kt b/BI-PSI/semestral/src/main/kotlin/main.kt new file mode 100644 index 0000000..4c49104 --- /dev/null +++ b/BI-PSI/semestral/src/main/kotlin/main.kt @@ -0,0 +1,412 @@ +import java.io.* +import java.net.* +import kotlin.math.max +import kotlinx.coroutines.* + +// === CONSTANTS === +const val END = "${7.toChar()}${8.toChar()}" +const val SERVER_PORT = 19132 +const val MESSAGE_TIMEOUT = 1000 + +const val RECHARGING_MESSAGE = "RECHARGING" +const val FULL_POWER_MESSAGE = "FULL POWER" +const val RECHARGING_TIMEOUT = 5000 + +// Allowed server-client keypair +val KEYS = arrayOf ( + Pair(23019, 32037), + Pair(32037, 29295), + Pair(18789, 13603), + Pair(16443, 29533), + Pair(18189, 21952), +) + +// Obstacle move sequence +val OBSTACLE_MOVES_LEFT = arrayOf( + ServerResponse.TURN_LEFT, + ServerResponse.MOVE, + ServerResponse.TURN_RIGHT, + ServerResponse.MOVE, +) +val OBSTACLE_MOVES_RIGHT = arrayOf( + ServerResponse.TURN_RIGHT, + ServerResponse.MOVE, + ServerResponse.TURN_LEFT, + ServerResponse.MOVE, +) + +/** + * Extension function allowing to hash string + * @param key the server/client key used for hashing + */ +fun String.hash (key: Int) : Int { + val sum = ( this.toCharArray().sumBy { it.toInt() } * 1000 ) % 65536 + return ( sum + key ) % 65536 +} + +/** + * Helper enum class for robot phases + * each phase includes maximum allowed message length + */ +enum class RobotPhase (val maxLength: Int) { + // Login + WAITING_FOR_NAME (20), + WAITING_FOR_KEY_ID (5), + WAITING_FOR_CONFIRMATION (7), + // Moving + WAITING_FOR_MOVE_RESPONSE (12), + WAITING_FOR_SECRET (100), + // Recharging + RECHARGING (12) +} + +/** Helper enum class for server response */ +enum class ServerResponse (private val text: String) { + // Move + MOVE ("102 MOVE"), + TURN_LEFT ("103 TURN LEFT"), + TURN_RIGHT ("104 TURN RIGHT"), + // General + PICK_UP ("105 GET MESSAGE"), + LOGOUT ("106 LOGOUT"), + KEY_REQUEST ("107 KEY REQUEST"), + SERVER_OK ("200 OK"), + // Error + LOGIN_FAILED ("300 LOGIN FAILED"), + SYNTAX_ERROR ("301 SYNTAX ERROR"), + LOGIC_ERROR ("302 LOGIC ERROR"), + KEY_OUT_OF_RANGE_ERROR ("303 KEY OUT OF RANGE"); + + override fun toString() = text +} + +/** Helper enum class to hold direction information */ +enum class Direction { + NORTH, EAST, SOUTH, WEST; + fun turnLeft () = when(this) { + NORTH -> WEST + WEST -> SOUTH + SOUTH -> EAST + EAST -> NORTH + } +} + +/** Helper data class for robot position */ +data class Position (val x: Int, val y: Int, val dir: Direction? = null) { + fun obstacleMoves () : Array { + val rightMoves = (x > 0 && y > 0 && dir == Direction.SOUTH) || + (x > 0 && y < 0 && dir == Direction.WEST ) || + (x < 0 && y < 0 && dir == Direction.NORTH) || + (x < 0 && y > 0 && dir == Direction.EAST) + return if (rightMoves) OBSTACLE_MOVES_RIGHT else OBSTACLE_MOVES_LEFT + } + fun detectPosition (diff: Position) : Position? { + val direction = when (diff) { + Position(1, 0) -> Direction.EAST + Position(-1, 0) -> Direction.WEST + Position(0, 1) -> Direction.NORTH + Position(0, -1) -> Direction.SOUTH + else -> return null + } + return Position(x, y, direction) + } + fun bestMove () : ServerResponse { + val shouldMove = when (dir) { + Direction.NORTH -> y < 0 + Direction.SOUTH -> y > 0 + Direction.WEST -> x > 0 + Direction.EAST -> x < 0 + else -> false + } + return if (shouldMove) ServerResponse.MOVE else ServerResponse.TURN_LEFT + } + fun turnLeft () = Position(x, y, dir?.turnLeft()) + operator fun minus (other: Position) = Position(x - other.x, y - other.y, dir) +} + +/** Helper message reader class */ +class Reader (private val reader: BufferedReader) { + + /** + * Tries to read message from socket + * valid: recharging / expected length + correct ending + */ + private fun readBuffer (maxLength: Int) : String? { + val builder = StringBuilder() + while ( !builder.endsWith(END) && builder.length < max(maxLength, RECHARGING_MESSAGE.length + 2) ) + builder.append(reader.read().toChar()) + + val valid = ( builder.length <= maxLength || "$RECHARGING_MESSAGE$END" == builder.toString() ) + return if ( builder.endsWith(END) && valid ) builder.substring(0, builder.length - 2) else null + } + + /** + * Reads message for robot + * returns null and closes connection if read failed + */ + fun readMessage (robot: Robot) : String? { + val message : String? + try { message = readBuffer(robot.phase.maxLength) } + catch (timeout: SocketTimeoutException) { + println("[SERVER] Error: Timeout, closing connection...") + robot.socket.close() + return null + } + if (message == null) { + println("[SERVER] Syntax error, closing connection...") + robot.endConnection(ServerResponse.SYNTAX_ERROR) + } + return message + } + +} + +/** Robot move logic helper class */ +class MoveLogic { + + // Current and last positions + var position: Position? = null + private var previous: Position? = null + + // Obstacle solving data + private var initialObstacle = false + private var obstacleSolving: Int? = null + private var obstacleMoves: Array = OBSTACLE_MOVES_LEFT + + /** + * Detects direction based on first two requests + * schedules one more request if there is an obstacle + */ + private fun detectDirection () : ServerResponse? { + val position = position ?: return null + val previous = previous ?: return null + val diff = position - previous + + // obstacle at the beginning + if (diff.x == 0 && diff.y == 0) { + initialObstacle = !initialObstacle + this.previous = this.position + return if (initialObstacle) ServerResponse.TURN_LEFT else ServerResponse.MOVE + } + + // update position based on diff + this.position = position.detectPosition(diff) + return null + } + + /** + * Handles moving when there is/was an obstacle + * (continue in avoiding obstacle) + */ + private fun avoidObstacle () : ServerResponse? { + val position = position ?: return null + val osn: Int + + if (obstacleSolving == null) { + obstacleMoves = position.obstacleMoves() // start avoiding + osn = 0 + } + else osn = (obstacleSolving ?: 0) + 1 // continue avoiding + obstacleSolving = if (osn == obstacleMoves.size - 1) null else osn + return obstacleMoves[osn] + } + + /** + * Finds the best move and returns it + * 1. handles initial position and direction detecting + * 2. handles classic moving + * 3. detects obstacles and avoids it + */ + fun execute () : ServerResponse? { + // Position not set yet, move once again + if (previous == null) { + previous = position + return ServerResponse.MOVE + } + + // Direction is not known = detect it + if (position?.dir == null) { + val response = detectDirection() + if (response != null) return response + } + + // We know the direction and position, we can act + val position = position ?: return null + if ( obstacleSolving != null || previous == position ) + return avoidObstacle() + + // Find the best move and execute it + val move = position.bestMove() + this.position = if (move == ServerResponse.TURN_LEFT) position.turnLeft() else position + this.previous = position + return move + } + +} + +/** Robot controller class */ +class Robot (val socket: Socket) { + + // Socket utilities + private val reader: Reader + private val writer: BufferedWriter + + // Current phase information + var phase = RobotPhase.WAITING_FOR_NAME + private lateinit var backupPhase: RobotPhase + + // Current robot information + private lateinit var name: String + private lateinit var key: Pair + private val moveLogic = MoveLogic() + + init { + println("[SERVER] Client login") + reader = Reader(BufferedReader(InputStreamReader(socket.getInputStream()))) + writer = BufferedWriter(OutputStreamWriter(socket.getOutputStream())) + waitForResponse() + } + + // Output tools + private fun sendResponse (response: Any) { + println("[SERVER] Sending $response") + writer.write("$response$END") + writer.flush() + } + fun endConnection (response: ServerResponse) { + println("[SERVER] Ending connection (reason $response)") + sendResponse(response) + socket.close() + } + + /** Set recharging phase and backup current phase */ + private fun startRecharging () { + backupPhase = phase + phase = RobotPhase.RECHARGING + waitForResponse() + } + + /** Remove recharging phase and return backup phase */ + private fun stopRecharging (message: String) { + if (message != FULL_POWER_MESSAGE) { + endConnection(ServerResponse.LOGIC_ERROR) + return + } + + phase = backupPhase + waitForResponse() + } + + /** Initial login setup (get robot's name) */ + private fun waitingForName (message: String) { + name = message + phase = RobotPhase.WAITING_FOR_KEY_ID + sendResponse(ServerResponse.KEY_REQUEST) + waitForResponse() + } + + /** Initial key setup (get and validate robot key) */ + private fun waitingForKeyID (message: String) { + val keyId = message.toIntOrNull() + if (keyId == null || keyId !in KEYS.indices) { + endConnection( if (keyId == null) ServerResponse.SYNTAX_ERROR else ServerResponse.KEY_OUT_OF_RANGE_ERROR ) + return + } + + key = KEYS[keyId] + phase = RobotPhase.WAITING_FOR_CONFIRMATION + sendResponse(name.hash(key.first).toString()) + waitForResponse() + } + + /** Finish key setup (get and validate key confirmation) */ + private fun waitingConfirmation (message: String) { + val keyConfirmation = message.toIntOrNull() + if ( keyConfirmation != name.hash(key.second) ) { + endConnection( if (keyConfirmation == null) ServerResponse.SYNTAX_ERROR else ServerResponse.LOGIN_FAILED ) + return + } + + sendResponse(ServerResponse.SERVER_OK) + sendResponse(ServerResponse.MOVE) + phase = RobotPhase.WAITING_FOR_MOVE_RESPONSE + waitForResponse() + } + + /** Handle robot moving */ + private fun waitingMoveResponse (message: String) { + val position = if (message.startsWith("OK ")) parseMoveResponse(message) else null + if (position == null) { + endConnection(ServerResponse.SYNTAX_ERROR) + return + } + + // We're on center coordinates, pick it up + if (position == Position(0, 0)) { + sendResponse(ServerResponse.PICK_UP) + phase = RobotPhase.WAITING_FOR_SECRET + waitForResponse() + return + } + + // Update position coordinates + val movePos = moveLogic.position + moveLogic.position = if (movePos == null) position else Position(position.x, position.y, movePos.dir) + + // Get move command and execute it + val command = moveLogic.execute() ?: return + sendResponse(command) + waitForResponse() + } + private fun parseMoveResponse (message: String) : Position? { + val nums = message.substring(3).split(" ") + if (nums.size == 2) { + val x = nums[0].toIntOrNull() + val y = nums[1].toIntOrNull() + if (x != null && y != null) + return Position(x, y) + } + return null + } + + /** Main waiting function, reacts based on current phase */ + private fun waitForResponse () { + // Read message, if there was an error, skip + socket.soTimeout = if (phase == RobotPhase.RECHARGING) RECHARGING_TIMEOUT else MESSAGE_TIMEOUT + val message = reader.readMessage(this) ?: return + println("[SERVER] Read $message whilst in phase $phase") + + // Recharging + if (message == RECHARGING_MESSAGE) { + startRecharging() + return + } + + // Execute commands based on current phase + when (phase) { + RobotPhase.WAITING_FOR_NAME -> waitingForName(message) + RobotPhase.WAITING_FOR_KEY_ID -> waitingForKeyID(message) + RobotPhase.WAITING_FOR_CONFIRMATION -> waitingConfirmation(message) + RobotPhase.RECHARGING -> stopRecharging(message) + RobotPhase.WAITING_FOR_MOVE_RESPONSE -> waitingMoveResponse(message) + RobotPhase.WAITING_FOR_SECRET -> endConnection(ServerResponse.LOGOUT) + } + } + +} + +/** + * Server class listening for incoming connections + * for each connection, new coroutine created + */ +class Server (private val server: ServerSocket = ServerSocket(SERVER_PORT)) { + fun run () { + println("[SERVER] Listening on port $SERVER_PORT") + while (true) { + val socket = server.accept() + GlobalScope.launch { Robot(socket) } + } + } +} + +fun main () = Server().run() \ No newline at end of file diff --git a/README.adoc b/README.adoc index 993b2fb..0dabf6a 100644 --- a/README.adoc +++ b/README.adoc @@ -90,7 +90,7 @@ link:BI-ANG/[English Exam after A2L Course (BI-ANG)] - exam essay link:BI-OSY/[Operating Systems (BI-OSY)] - homeworks on ProgTest -BI-PSI - semestral task, grades export +link:BI-PSI/[Computer Networks (BI-PSI)] - semestral task and grades export BI-BEZ - lab wolfram notebooks, programming tasks, grades and MARAST export