serialhelper get device status

This commit is contained in:
minjaesong
2020-10-21 21:07:33 +09:00
parent cf1430d9e9
commit eefc33a8b0
4 changed files with 21 additions and 3 deletions

View File

@@ -57,7 +57,7 @@ Description: reads status of the device, if applicable
Returns: Returns:
0x06 <status code> <0x1F> <message string> 0x17 0x06 <status code> <0x1F> <message string> 0x17
0x15 <status code> <0x1F> <message string> 0x17 0x15 <status code> <0x1F> <message string> 0x17
(see section 1.0) Status Code is single byte number. Also see section 1.0
2. Device-specific commands 2. Device-specific commands

View File

@@ -9,7 +9,7 @@ class VmFilesystemDelegate(val vm: VM, val portNo: Int) {
} }
class DiskDriveFileInputStream(vm: VM, portNo: Int, path: String) : InputStream() { class DiskDriveFileInputStream(val vm: VM, val portNo: Int, val path: String) : InputStream() {
private val contents: ByteArray private val contents: ByteArray
private var readCursor = 0 private var readCursor = 0
@@ -60,7 +60,7 @@ class DiskDriveFileInputStream(vm: VM, portNo: Int, path: String) : InputStream(
} }
override fun close() { override fun close() {
TODO() SerialHelper.sendMessage(vm, portNo, "CLOSE".toByteArray(VM.CHARSET))
} }
} }

View File

@@ -3,6 +3,7 @@ package net.torvald.tsvm
import net.torvald.UnsafeHelper import net.torvald.UnsafeHelper
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint
import net.torvald.tsvm.peripheral.BlockTransferInterface.Companion.BLOCK_SIZE import net.torvald.tsvm.peripheral.BlockTransferInterface.Companion.BLOCK_SIZE
import net.torvald.tsvm.peripheral.BlockTransferInterface.Companion.END_OF_SEND_BLOCK
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import kotlin.experimental.and import kotlin.experimental.and
import kotlin.experimental.or import kotlin.experimental.or
@@ -52,6 +53,15 @@ object SerialHelper {
return msgBuffer.toByteArray() return msgBuffer.toByteArray()
} }
fun getDeviceStatus(vm: VM, portNo: Int): DeviceStatus {
val msgStr = sendMessageGetBytes(vm, portNo, "DEVSTU$END_OF_SEND_BLOCK".toByteArray(VM.CHARSET))
return DeviceStatus(
msgStr[0] == 0x06.toByte(),
msgStr[1].toUint(),
msgStr.sliceArray(3 until msgStr.size - 1).toString(VM.CHARSET)
)
}
fun waitUntilReady(vm: VM, portNo: Int) { fun waitUntilReady(vm: VM, portNo: Int) {
while (!checkIfDeviceIsReady(vm, portNo)) { Thread.sleep(SLEEP_TIME) } while (!checkIfDeviceIsReady(vm, portNo)) { Thread.sleep(SLEEP_TIME) }
} }
@@ -87,4 +97,6 @@ object SerialHelper {
private fun Boolean.toInt() = if (this) 1 else 0 private fun Boolean.toInt() = if (this) 1 else 0
data class DeviceStatus(val isError: Boolean, val code: Int, val message: String)
} }

View File

@@ -12,6 +12,7 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t
const val STATE_CODE_STANDBY = 0 const val STATE_CODE_STANDBY = 0
const val STATE_CODE_ILLEGAL_COMMAND = 128 const val STATE_CODE_ILLEGAL_COMMAND = 128
const val STATE_CODE_FILE_NOT_FOUND = 129 const val STATE_CODE_FILE_NOT_FOUND = 129
const val STATE_CODE_FILE_ALREADY_OPENED = 130
const val STATE_CODE_SYSTEM_IO_ERROR = 192 const val STATE_CODE_SYSTEM_IO_ERROR = 192
@@ -21,6 +22,7 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t
errorMsgs[STATE_CODE_STANDBY] = "READY" errorMsgs[STATE_CODE_STANDBY] = "READY"
errorMsgs[STATE_CODE_ILLEGAL_COMMAND] = "SYNTAX ERROR" errorMsgs[STATE_CODE_ILLEGAL_COMMAND] = "SYNTAX ERROR"
errorMsgs[STATE_CODE_FILE_NOT_FOUND] = "FILE NOT FOUND" errorMsgs[STATE_CODE_FILE_NOT_FOUND] = "FILE NOT FOUND"
errorMsgs[STATE_CODE_FILE_ALREADY_OPENED] = "FILE ALREADY OPENED"
errorMsgs[STATE_CODE_SYSTEM_IO_ERROR] = "IO ERROR ON SIMULATED DRIVE" errorMsgs[STATE_CODE_SYSTEM_IO_ERROR] = "IO ERROR ON SIMULATED DRIVE"
} }
} }
@@ -139,6 +141,10 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t
//startSend { it.writeout(composePositiveAns("Testtec Virtual Disk Drive")) } //startSend { it.writeout(composePositiveAns("Testtec Virtual Disk Drive")) }
recipient?.writeout(composePositiveAns("Testtec Virtual Disk Drive")) recipient?.writeout(composePositiveAns("Testtec Virtual Disk Drive"))
else if (inputString.startsWith("OPENR\"") || inputString.startsWith("OPENW\"") || inputString.startsWith("OPENA\"")) { else if (inputString.startsWith("OPENR\"") || inputString.startsWith("OPENW\"") || inputString.startsWith("OPENA\"")) {
if (file != null) {
stateCode = STATE_CODE_FILE_ALREADY_OPENED
return
}
val openMode = inputString[4] val openMode = inputString[4]