From 778c8bd9180ce4ca5e86f6c88409558cbb11dd32 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 28 Oct 2020 11:28:07 +0900 Subject: [PATCH] testdiskdrive minor fixes, working directory listing --- assets/serialtest.js | 16 ++++++ .../tsvm/peripheral/BlockTransferInterface.kt | 3 ++ .../torvald/tsvm/peripheral/TestDiskDrive.kt | 52 +++++++++++-------- .../tsvm/peripheral/TestFunctionGenerator.kt | 2 +- 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/assets/serialtest.js b/assets/serialtest.js index 726ddcf..58ca288 100644 --- a/assets/serialtest.js +++ b/assets/serialtest.js @@ -5,4 +5,20 @@ ba = com.pullMessage(0) serial.print(ba); serial.println("# END OF MSG"); + + +ba = com.sendMessageGetBytes(1, "DEVNAM"+String.fromCharCode(0x17)); +serial.println(ba); + +ba = com.sendMessageGetBytes(1, "DEVSTU"+String.fromCharCode(0x17)); +serial.println(ba); + +ba = com.sendMessageGetBytes(1, "LIST"); +ba = com.pullMessage(1); +println(ba); + +ba = com.sendMessageGetBytes(1, "DEVSTU"+String.fromCharCode(0x17)); +serial.println(ba); + + serial.println("k bye") \ No newline at end of file diff --git a/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt b/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt index 24f3a12..0e0715a 100644 --- a/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt +++ b/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt @@ -75,6 +75,9 @@ abstract class BlockTransferInterface(val isMaster: Boolean, val isSlave: Boolea companion object { const val BLOCK_SIZE = 4096 + + // these consts are UNUSABLE on writeoutImpl because wtf + // still possible to use on stringbuilder tho const val GOOD_NEWS = 0x06.toByte() const val BAD_NEWS = 0x15.toByte() const val UNIT_SEP = 0x1F.toByte() diff --git a/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt b/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt index 5f61fad..63f4d94 100644 --- a/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt +++ b/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt @@ -31,7 +31,7 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t val sb = ArrayList() sb.add(GOOD_NEWS) sb.addAll(msg[0].toByteArray().toTypedArray()) - for (k in 1 until msg.lastIndex) { + for (k in 1 until msg.size) { sb.add(UNIT_SEP) sb.addAll(msg[k].toByteArray().toTypedArray()) } @@ -43,7 +43,7 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t val sb = ArrayList() sb.add(BAD_NEWS) sb.addAll(msg[0].toByteArray().toTypedArray()) - for (k in 1 until msg.lastIndex) { + for (k in 1 until msg.size) { sb.add(UNIT_SEP) sb.addAll(msg[k].toByteArray().toTypedArray()) } @@ -51,8 +51,10 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t return sb.toByteArray() } + private val rootPath = File("test_assets/test_drive_$driveNum") + private var fileOpen = false - private var file: File? = null + private var file = File(rootPath.toURI()) //private var readModeLength = -1 // always 4096 private var stateCode = STATE_CODE_STANDBY private var writeMode = false @@ -62,8 +64,6 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t private var blockSendBuffer = ByteArray(1) private var blockSendCount = 0 - private val rootPath = File("test_assets/test_drive_$driveNum") - init { if (!rootPath.exists()) { @@ -112,18 +112,18 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t * Disk drive must create desired side effects in accordance with the input message. */ override fun writeoutImpl(inputData: ByteArray) { - val inputString = inputData.toString() + val inputString = inputData.toString(VM.CHARSET) - if (inputString.startsWith("DEVRST$END_OF_SEND_BLOCK")) { + if (inputString.startsWith("DEVRST\u0017")) { //readModeLength = -1 fileOpen = false - file = null + file = File(rootPath.toURI()) blockSendCount = 0 stateCode = STATE_CODE_STANDBY writeMode = false writeModeLength = -1 } - else if (inputString.startsWith("DEVSTU$END_OF_SEND_BLOCK")) { + else if (inputString.startsWith("DEVSTU\u0017")) { if (stateCode < 128) { recipient?.writeout(composePositiveAns("${stateCode.toChar()}", errorMsgs[stateCode])) } @@ -131,12 +131,12 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t recipient?.writeout(composeNegativeAns("${stateCode.toChar()}", errorMsgs[stateCode])) } } - else if (inputString.startsWith("DEVTYP$END_OF_SEND_BLOCK")) + else if (inputString.startsWith("DEVTYP\u0017")) recipient?.writeout(composePositiveAns("STOR")) - else if (inputString.startsWith("DEVNAM$END_OF_SEND_BLOCK")) + else if (inputString.startsWith("DEVNAM\u0017")) recipient?.writeout(composePositiveAns("Testtec Virtual Disk Drive")) else if (inputString.startsWith("OPENR\"") || inputString.startsWith("OPENW\"") || inputString.startsWith("OPENA\"")) { - if (file != null) { + if (fileOpen) { stateCode = STATE_CODE_FILE_ALREADY_OPENED return } @@ -156,7 +156,7 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t file = File(rootPath, filePath) - if (openMode == 'R' && !file!!.exists()) { + if (openMode == 'R' && !file.exists()) { stateCode = STATE_CODE_FILE_NOT_FOUND return } @@ -167,18 +167,19 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t // temporary behaviour to ignore any arguments resetBuf() messageComposeBuffer.write(getReadableLs().toByteArray(VM.CHARSET)) + stateCode = STATE_CODE_STANDBY } else if (inputString.startsWith("CLOSE")) { - file = null fileOpen = false + stateCode = STATE_CODE_STANDBY } else if (inputString.startsWith("READ")) { //readModeLength = inputString.substring(4 until inputString.length).toInt() resetBuf() - if (file?.isFile == true) { + if (file.isFile) { try { - messageComposeBuffer.write(file!!.readBytes()) + messageComposeBuffer.write(file.readBytes()) stateCode = STATE_CODE_STANDBY } catch (e: IOException) { @@ -191,26 +192,35 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t val diskID: UUID = UUID(0, 0) private fun getReadableLs(): String { - if (file == null) throw IllegalStateException("No file is opened") - val sb = StringBuilder() + val isRoot = (file.absolutePath == rootPath.absolutePath) - if (file!!.isFile) sb.append(file!!.name) + if (file.isFile) sb.append(file.name) else { + sb.append("Current directory: ") + sb.append(if (isRoot) "(root)" else file.path) + sb.append('\n') + sb.append(".\n") - if (file!!.absolutePath != rootPath.absolutePath) sb.append("..\n") + if (isRoot) sb.append("..\n") // actual entries - file!!.listFiles()!!.forEach { + file.listFiles()!!.forEach { var filenameLen = it.name.length + sb.append(it.name) + if (it.isDirectory) { sb.append("/") filenameLen += 1 } + sb.append(" ".repeat(40 - filenameLen)) + if (it.isFile) { sb.append("${it.length()} B") } + + sb.append('\n') } sb.append('\n') } diff --git a/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt b/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt index e3d6ede..55abe11 100644 --- a/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt +++ b/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt @@ -134,7 +134,7 @@ Nunc mollis nibh vitae sapien consequat, ut vestibulum sem pharetra. Aliquam iac else if (inputString.startsWith("DEVTYP\u0017")) recipient?.writeout(composeSerialAns("STOR")) else if (inputString.startsWith("DEVNAM\u0017")) - recipient?.writeout(composeSerialAns("Testtec Virtual Disk Drive")) + recipient?.writeout(composeSerialAns("Testtec Signal Generator")) else if (inputString.startsWith("OPENR\"")) fileOpen = true else if (inputString.startsWith("CLOSE"))