Monitor for IT6800

This commit is contained in:
Alexander Nozik 2018-11-26 13:59:03 +03:00
parent a12ee234f9
commit 8e1dfe19b4

View File

@ -17,19 +17,27 @@
package inr.numass.control.gun package inr.numass.control.gun
import hep.dataforge.context.Context import hep.dataforge.context.Context
import hep.dataforge.context.launch
import hep.dataforge.control.devices.AbstractDevice import hep.dataforge.control.devices.AbstractDevice
import hep.dataforge.control.ports.PortHelper import hep.dataforge.control.ports.PortHelper
import hep.dataforge.meta.Meta import hep.dataforge.meta.Meta
import hep.dataforge.nullable
import hep.dataforge.states.valueState import hep.dataforge.states.valueState
import hep.dataforge.values.ValueType
import kotlinx.coroutines.Job
import kotlinx.coroutines.time.delay
import tornadofx.* import tornadofx.*
import java.nio.ByteBuffer import java.nio.ByteBuffer
import java.nio.ByteOrder import java.nio.ByteOrder
import java.time.Duration
import kotlin.experimental.and import kotlin.experimental.and
class IT6800Device(context: Context, meta: Meta) : AbstractDevice(context, meta) { class IT6800Device(context: Context, meta: Meta) : AbstractDevice(context, meta) {
private val portHelper = PortHelper(this) private val portHelper = PortHelper(this)
private var monitorJob: Job? = null
val connected get() = portHelper.connected val connected get() = portHelper.connected
val address: Byte = meta.getValue("address", 0).number.toByte() val address: Byte = meta.getValue("address", 0).number.toByte()
@ -46,12 +54,17 @@ class IT6800Device(context: Context, meta: Meta) : AbstractDevice(context, meta)
setter = { value -> sendInt(Command.VOLTAGE.code, (value.double * 1000).toInt()) } setter = { value -> sendInt(Command.VOLTAGE.code, (value.double * 1000).toInt()) }
) )
val voltage by voltageState.doubleDelegate
val currentState = valueState("current", val currentState = valueState("current",
setter = { value -> sendShort(Command.CURRENT.code, (value.double * 1000).toInt().toShort()) } setter = { value -> sendShort(Command.CURRENT.code, (value.double * 1000).toInt().toShort()) }
) )
val current by currentState.doubleDelegate
fun connect() { fun connect() {
connected.set(true) connected.set(true)
remoteState.set(true)
portHelper.connection.onAnyPhrase(this) { portHelper.connection.onAnyPhrase(this) {
val buffer = ByteBuffer.wrap(it.toByteArray(Charsets.US_ASCII)) val buffer = ByteBuffer.wrap(it.toByteArray(Charsets.US_ASCII))
buffer.order(ByteOrder.LITTLE_ENDIAN) buffer.order(ByteOrder.LITTLE_ENDIAN)
@ -86,12 +99,17 @@ class IT6800Device(context: Context, meta: Meta) : AbstractDevice(context, meta)
voltageState.update(value.toDouble() / 1000) voltageState.update(value.toDouble() / 1000)
val state = buffer.get(9) val state = buffer.get(9)
outputState.update(state and 1 > 0) outputState.update(state and 1 > 0)
remoteState.update(state.toInt() ushr 7 and 1 >0) remoteState.update(state.toInt() ushr 7 and 1 > 0)
} }
} }
} }
} }
override fun init() {
super.init()
connect()
}
private fun request(command: Byte, data: ByteBuffer): String { private fun request(command: Byte, data: ByteBuffer): String {
if (data.limit() != 21) error("Wrong size of data array") if (data.limit() != 21) error("Wrong size of data array")
val buffer = ByteBuffer.allocate(26) val buffer = ByteBuffer.allocate(26)
@ -127,9 +145,41 @@ class IT6800Device(context: Context, meta: Meta) : AbstractDevice(context, meta)
override fun shutdown() { override fun shutdown() {
portHelper.shutdown() portHelper.shutdown()
stopMonitor()
super.shutdown() super.shutdown()
} }
/**
* send update request
*/
fun update() {
portHelper.send(request(Command.READ.code, ByteBuffer.allocate(21)))
}
/**
* Start regular state check
*/
fun startMonitor() {
val interval: Duration = meta.optValue("monitor.interval").nullable?.let {
if (it.type == ValueType.STRING) {
Duration.parse(it.string)
} else {
Duration.ofMillis(it.long)
}
} ?: Duration.ofMinutes(1)
monitorJob = launch {
while (true) {
update()
delay(interval)
}
}
}
fun stopMonitor() {
monitorJob?.cancel()
}
enum class Command(val code: Byte) { enum class Command(val code: Byte) {
REMOTE(0x20), REMOTE(0x20),
OUTPUT(0x21), OUTPUT(0x21),