Minor changes to devices
This commit is contained in:
parent
da0b896d29
commit
a12ee234f9
@ -22,6 +22,7 @@ import hep.dataforge.control.collectors.RegularPointCollector
|
|||||||
import hep.dataforge.control.connections.Roles
|
import hep.dataforge.control.connections.Roles
|
||||||
import hep.dataforge.control.devices.PortSensor
|
import hep.dataforge.control.devices.PortSensor
|
||||||
import hep.dataforge.control.devices.Sensor
|
import hep.dataforge.control.devices.Sensor
|
||||||
|
import hep.dataforge.control.devices.notifyError
|
||||||
import hep.dataforge.control.ports.GenericPortController
|
import hep.dataforge.control.ports.GenericPortController
|
||||||
import hep.dataforge.control.ports.Port
|
import hep.dataforge.control.ports.Port
|
||||||
import hep.dataforge.control.ports.PortFactory
|
import hep.dataforge.control.ports.PortFactory
|
||||||
|
28
numass-control/gun/build.gradle
Normal file
28
numass-control/gun/build.gradle
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Alexander Nozik.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
apply plugin: 'application'
|
||||||
|
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
if (!hasProperty('mainClass')) {
|
||||||
|
ext.mainClass = 'inr.numass.control.magnet.fx.MagnetApp'
|
||||||
|
}
|
||||||
|
mainClassName = mainClass
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile project(':numass-control')
|
||||||
|
}
|
@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Alexander Nozik.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package inr.numass.control.gun
|
||||||
|
|
||||||
|
import hep.dataforge.context.Context
|
||||||
|
import hep.dataforge.control.devices.AbstractDevice
|
||||||
|
import hep.dataforge.control.ports.PortHelper
|
||||||
|
import hep.dataforge.meta.Meta
|
||||||
|
import hep.dataforge.states.valueState
|
||||||
|
import tornadofx.*
|
||||||
|
import java.nio.ByteBuffer
|
||||||
|
import java.nio.ByteOrder
|
||||||
|
import kotlin.experimental.and
|
||||||
|
|
||||||
|
|
||||||
|
class IT6800Device(context: Context, meta: Meta) : AbstractDevice(context, meta) {
|
||||||
|
private val portHelper = PortHelper(this)
|
||||||
|
|
||||||
|
val connected get() = portHelper.connected
|
||||||
|
|
||||||
|
val address: Byte = meta.getValue("address", 0).number.toByte()
|
||||||
|
|
||||||
|
val remoteState = valueState("remote",
|
||||||
|
setter = { value -> sendBoolean(Command.REMOTE.code, value.boolean) }
|
||||||
|
)
|
||||||
|
|
||||||
|
val outputState = valueState("output",
|
||||||
|
setter = { value -> sendBoolean(Command.OUTPUT.code, value.boolean) }
|
||||||
|
)
|
||||||
|
|
||||||
|
val voltageState = valueState("voltage",
|
||||||
|
setter = { value -> sendInt(Command.VOLTAGE.code, (value.double * 1000).toInt()) }
|
||||||
|
)
|
||||||
|
|
||||||
|
val currentState = valueState("current",
|
||||||
|
setter = { value -> sendShort(Command.CURRENT.code, (value.double * 1000).toInt().toShort()) }
|
||||||
|
)
|
||||||
|
|
||||||
|
fun connect() {
|
||||||
|
connected.set(true)
|
||||||
|
portHelper.connection.onAnyPhrase(this) {
|
||||||
|
val buffer = ByteBuffer.wrap(it.toByteArray(Charsets.US_ASCII))
|
||||||
|
buffer.order(ByteOrder.LITTLE_ENDIAN)
|
||||||
|
|
||||||
|
if (buffer.get(1) != address) {
|
||||||
|
//skip
|
||||||
|
return@onAnyPhrase
|
||||||
|
}
|
||||||
|
|
||||||
|
val code = buffer.get(2)
|
||||||
|
when (code) {
|
||||||
|
Command.REMOTE.code -> {
|
||||||
|
val value = buffer[3] > 0
|
||||||
|
remoteState.update(value)
|
||||||
|
}
|
||||||
|
Command.OUTPUT.code -> {
|
||||||
|
val value = buffer[3] > 0
|
||||||
|
outputState.update(value)
|
||||||
|
}
|
||||||
|
Command.VOLTAGE.code -> {
|
||||||
|
val value = buffer.getInt(3)
|
||||||
|
voltageState.update(value.toDouble() / 1000)
|
||||||
|
}
|
||||||
|
Command.CURRENT.code -> {
|
||||||
|
val value = buffer.getShort(3)
|
||||||
|
currentState.update(value.toDouble() / 1000)
|
||||||
|
}
|
||||||
|
Command.READ.code -> {
|
||||||
|
val current = buffer.getShort(3)
|
||||||
|
currentState.update(current.toDouble() / 1000)
|
||||||
|
val value = buffer.getInt(5)
|
||||||
|
voltageState.update(value.toDouble() / 1000)
|
||||||
|
val state = buffer.get(9)
|
||||||
|
outputState.update(state and 1 > 0)
|
||||||
|
remoteState.update(state.toInt() ushr 7 and 1 >0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun request(command: Byte, data: ByteBuffer): String {
|
||||||
|
if (data.limit() != 21) error("Wrong size of data array")
|
||||||
|
val buffer = ByteBuffer.allocate(26)
|
||||||
|
buffer.put(0, START)
|
||||||
|
buffer.put(1, address)
|
||||||
|
buffer.put(2, command)
|
||||||
|
buffer.position(3)
|
||||||
|
buffer.put(data)
|
||||||
|
val checksum = (START + address + command + data.array().sum()).rem(256).toByte()
|
||||||
|
buffer.put(25, checksum)
|
||||||
|
return String(buffer.array(), Charsets.US_ASCII)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun sendBoolean(command: Byte, value: Boolean) {
|
||||||
|
val data = ByteBuffer.allocate(21)
|
||||||
|
data.put(0, if (value) 1 else 0)
|
||||||
|
portHelper.send(request(command, data))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun sendShort(command: Byte, value: Short) {
|
||||||
|
val data = ByteBuffer.allocate(21)
|
||||||
|
data.order(ByteOrder.LITTLE_ENDIAN)
|
||||||
|
data.putShort(0, value)
|
||||||
|
portHelper.send(request(command, data))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun sendInt(command: Byte, value: Int) {
|
||||||
|
val data = ByteBuffer.allocate(21)
|
||||||
|
data.order(ByteOrder.LITTLE_ENDIAN)
|
||||||
|
data.putInt(0, value)
|
||||||
|
portHelper.send(request(command, data))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun shutdown() {
|
||||||
|
portHelper.shutdown()
|
||||||
|
super.shutdown()
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class Command(val code: Byte) {
|
||||||
|
REMOTE(0x20),
|
||||||
|
OUTPUT(0x21),
|
||||||
|
VOLTAGE(0x23),
|
||||||
|
CURRENT(0x24),
|
||||||
|
READ(0x26),
|
||||||
|
INFO(0x31)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val START = (170).toByte() // AA
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,7 @@ include ":numass-control:msp"
|
|||||||
include ":numass-control:vac"
|
include ":numass-control:vac"
|
||||||
//include ":numass-control:control-room"
|
//include ":numass-control:control-room"
|
||||||
include ":numass-control:dante"
|
include ":numass-control:dante"
|
||||||
|
include ":numass-control:gun"
|
||||||
//
|
//
|
||||||
include ":numass-main"
|
include ":numass-main"
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user