Plots to kotlin. Multiple fixes to control.
This commit is contained in:
parent
d708afa5de
commit
0085ff3142
@ -190,7 +190,7 @@ class PKT8Display : DeviceDisplay<PKT8Device>(), PKT8ValueListener {
|
|||||||
if (rawDataButton.isSelected) {
|
if (rawDataButton.isSelected) {
|
||||||
TimePlot.put(this, rawValue)
|
TimePlot.put(this, rawValue)
|
||||||
} else {
|
} else {
|
||||||
if(temperature != null) {
|
if (temperature != null) {
|
||||||
TimePlot.put(this, temperature)
|
TimePlot.put(this, temperature)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -201,16 +201,13 @@ class PKT8Display : DeviceDisplay<PKT8Device>(), PKT8ValueListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getPlot(channelName: String): Plot? {
|
private fun getPlot(channelName: String): Plot? {
|
||||||
return if (plotFrame.plots.has(channelName)) {
|
return plotFrame[channelName] ?: device.channels.values.find { it.name == channelName }?.let {
|
||||||
plotFrame.get(channelName)
|
TimePlot(it.name).apply {
|
||||||
} else {
|
configure(it.meta)
|
||||||
device.channels.values.find { it.name == channelName }?.let {
|
plotFrame.add(this)
|
||||||
TimePlot(it.name).apply {
|
|
||||||
configure(it.meta)
|
|
||||||
plotFrame.add(this)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun clearPlot() {
|
private fun clearPlot() {
|
||||||
|
@ -70,7 +70,7 @@ class MspDevice(context: Context, meta: Meta) : PortSensor(context, meta) {
|
|||||||
|
|
||||||
var filament by valueState("filament") { old, value ->
|
var filament by valueState("filament") { old, value ->
|
||||||
selectFilament(value.intValue())
|
selectFilament(value.intValue())
|
||||||
}
|
}.int
|
||||||
|
|
||||||
var filamentOn: Boolean by valueState("filamentOn") { _, value ->
|
var filamentOn: Boolean by valueState("filamentOn") { _, value ->
|
||||||
setFilamentOn(value.booleanValue())
|
setFilamentOn(value.booleanValue())
|
||||||
|
@ -28,6 +28,8 @@ import hep.dataforge.plots.PlotFrame
|
|||||||
import hep.dataforge.plots.PlotGroup
|
import hep.dataforge.plots.PlotGroup
|
||||||
import hep.dataforge.plots.PlotUtils
|
import hep.dataforge.plots.PlotUtils
|
||||||
import hep.dataforge.plots.data.TimePlot
|
import hep.dataforge.plots.data.TimePlot
|
||||||
|
import hep.dataforge.plots.data.TimePlot.Companion.setMaxItems
|
||||||
|
import hep.dataforge.plots.data.TimePlot.Companion.setPrefItems
|
||||||
import hep.dataforge.plots.jfreechart.JFreeChartFrame
|
import hep.dataforge.plots.jfreechart.JFreeChartFrame
|
||||||
import hep.dataforge.values.Value
|
import hep.dataforge.values.Value
|
||||||
import inr.numass.control.DeviceDisplay
|
import inr.numass.control.DeviceDisplay
|
||||||
@ -84,24 +86,21 @@ class MspDisplay() : DeviceDisplay<MspDevice>(), DeviceListener, NamedValueListe
|
|||||||
|
|
||||||
|
|
||||||
JFreeChartFrame(basePlotConfig).apply {
|
JFreeChartFrame(basePlotConfig).apply {
|
||||||
PlotUtils.setXAxis(this, "timestamp", null, "time")
|
PlotUtils.setXAxis(this, "timestamp", "", "time")
|
||||||
configure(plotFrameMeta)
|
configure(plotFrameMeta)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val plottables = PlotGroup("peakJump").apply {
|
val plottables = PlotGroup.typed<TimePlot>("peakJump").apply {
|
||||||
|
setMaxItems(this, 1000)
|
||||||
|
setPrefItems(this, 400)
|
||||||
|
|
||||||
if (plotFrameMeta.hasMeta("peakJump.peak")) {
|
if (plotFrameMeta.hasMeta("peakJump.peak")) {
|
||||||
for (peakMeta in plotFrameMeta.getMetaList("peakJump.peak")) {
|
for (peakMeta in plotFrameMeta.getMetaList("peakJump.peak")) {
|
||||||
val mass = peakMeta.getString("mass")
|
val mass = peakMeta.getString("mass")
|
||||||
if (!this.has(mass)) {
|
get(mass) ?: TimePlot(mass, mass).also {
|
||||||
val newPlottable = TimePlot(mass, mass)
|
it.configureValue("titleBase", peakMeta.getString("title", mass))
|
||||||
newPlottable.configure(peakMeta)
|
add(it)
|
||||||
newPlottable.setMaxItems(1000)
|
}.configure(peakMeta)
|
||||||
newPlottable.setPrefItems(400)
|
|
||||||
newPlottable.configureValue("titleBase", peakMeta.getString("title", mass))
|
|
||||||
add(newPlottable)
|
|
||||||
} else {
|
|
||||||
get(mass).configure(peakMeta)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
showError("No peaks defined in config")
|
showError("No peaks defined in config")
|
||||||
@ -117,7 +116,7 @@ class MspDisplay() : DeviceDisplay<MspDevice>(), DeviceListener, NamedValueListe
|
|||||||
addListener { _, oldValue, newValue ->
|
addListener { _, oldValue, newValue ->
|
||||||
if (newValue != oldValue) {
|
if (newValue != oldValue) {
|
||||||
runAsync {
|
runAsync {
|
||||||
device.setState("filament", newValue);
|
device.filament = newValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -133,13 +132,12 @@ class MspDisplay() : DeviceDisplay<MspDevice>(), DeviceListener, NamedValueListe
|
|||||||
cellFormat {
|
cellFormat {
|
||||||
text = "Filament $it"
|
text = "Filament $it"
|
||||||
}
|
}
|
||||||
disableProperty()
|
disableProperty().bind(getBooleanBinding(PortSensor.CONNECTED_STATE).not())
|
||||||
.bind(getBooleanStateBinding(PortSensor.CONNECTED_STATE).not())
|
|
||||||
}
|
}
|
||||||
switch {
|
switch {
|
||||||
padding = Insets(5.0, 0.0, 0.0, 0.0)
|
padding = Insets(5.0, 0.0, 0.0, 0.0)
|
||||||
disableProperty()
|
disableProperty()
|
||||||
.bind(getStateBinding(PortSensor.CONNECTED_STATE).booleanBinding { !it!!.booleanValue() })
|
.bind(getBooleanBinding(PortSensor.CONNECTED_STATE))
|
||||||
bindBooleanToState("filamentOn", selectedProperty())
|
bindBooleanToState("filamentOn", selectedProperty())
|
||||||
}
|
}
|
||||||
deviceStateIndicator(this@MspDisplay, "filamentStatus", false) {
|
deviceStateIndicator(this@MspDisplay, "filamentStatus", false) {
|
||||||
@ -154,15 +152,13 @@ class MspDisplay() : DeviceDisplay<MspDevice>(), DeviceListener, NamedValueListe
|
|||||||
|
|
||||||
togglebutton("Measure") {
|
togglebutton("Measure") {
|
||||||
isSelected = false
|
isSelected = false
|
||||||
disableProperty()
|
disableProperty().bind(getBooleanBinding(PortSensor.CONNECTED_STATE).not())
|
||||||
.bind(getStateBinding(PortSensor.CONNECTED_STATE).booleanBinding { !it!!.booleanValue() })
|
|
||||||
|
|
||||||
bindBooleanToState(Sensor.MEASURING_STATE, selectedProperty())
|
bindBooleanToState(Sensor.MEASURING_STATE, selectedProperty())
|
||||||
}
|
}
|
||||||
togglebutton("Store") {
|
togglebutton("Store") {
|
||||||
isSelected = false
|
isSelected = false
|
||||||
disableProperty()
|
disableProperty().bind(getBooleanBinding(Sensor.MEASURING_STATE).not())
|
||||||
.bind(getStateBinding(Sensor.MEASURING_STATE).booleanBinding { !it!!.booleanValue() })
|
|
||||||
bindBooleanToState("storing", selectedProperty())
|
bindBooleanToState("storing", selectedProperty())
|
||||||
}
|
}
|
||||||
separator(Orientation.VERTICAL)
|
separator(Orientation.VERTICAL)
|
||||||
@ -187,7 +183,7 @@ class MspDisplay() : DeviceDisplay<MspDevice>(), DeviceListener, NamedValueListe
|
|||||||
init {
|
init {
|
||||||
table.addListener { change: MapChangeListener.Change<out String, out Value> ->
|
table.addListener { change: MapChangeListener.Change<out String, out Value> ->
|
||||||
if (change.wasAdded()) {
|
if (change.wasAdded()) {
|
||||||
val pl = plottables.get(change.key)
|
val pl = plottables[change.key] as TimePlot?
|
||||||
val value = change.valueAdded
|
val value = change.valueAdded
|
||||||
if (pl != null) {
|
if (pl != null) {
|
||||||
if (value.doubleValue() > 0) {
|
if (value.doubleValue() > 0) {
|
||||||
|
@ -11,6 +11,7 @@ import hep.dataforge.fx.bindWindow
|
|||||||
import hep.dataforge.states.State
|
import hep.dataforge.states.State
|
||||||
import hep.dataforge.states.ValueState
|
import hep.dataforge.states.ValueState
|
||||||
import hep.dataforge.values.Value
|
import hep.dataforge.values.Value
|
||||||
|
import javafx.beans.binding.BooleanBinding
|
||||||
import javafx.beans.binding.ObjectBinding
|
import javafx.beans.binding.ObjectBinding
|
||||||
import javafx.beans.property.BooleanProperty
|
import javafx.beans.property.BooleanProperty
|
||||||
import javafx.beans.property.SimpleObjectProperty
|
import javafx.beans.property.SimpleObjectProperty
|
||||||
@ -99,6 +100,10 @@ abstract class DeviceDisplay<D : Device> : Component(), Connection, DeviceListen
|
|||||||
return bindState(state)
|
return bindState(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getBooleanBinding(stateName: String): BooleanBinding{
|
||||||
|
return getValueBinding(stateName).booleanBinding{it?.booleanValue()?:false}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bind existing boolean property to writable device state
|
* Bind existing boolean property to writable device state
|
||||||
|
|
||||||
|
@ -5,14 +5,8 @@
|
|||||||
*/
|
*/
|
||||||
package inr.numass.control.readvac
|
package inr.numass.control.readvac
|
||||||
|
|
||||||
import hep.dataforge.control.devices.Device
|
|
||||||
import hep.dataforge.control.devices.PortSensor.Companion.CONNECTED_STATE
|
import hep.dataforge.control.devices.PortSensor.Companion.CONNECTED_STATE
|
||||||
import hep.dataforge.control.devices.Sensor
|
import hep.dataforge.control.devices.Sensor
|
||||||
import hep.dataforge.kodex.stringValue
|
|
||||||
import hep.dataforge.kodex.timeValue
|
|
||||||
import hep.dataforge.kodex.value
|
|
||||||
import hep.dataforge.meta.Meta
|
|
||||||
import hep.dataforge.values.Value
|
|
||||||
import inr.numass.control.DeviceDisplay
|
import inr.numass.control.DeviceDisplay
|
||||||
import inr.numass.control.switch
|
import inr.numass.control.switch
|
||||||
import javafx.application.Platform
|
import javafx.application.Platform
|
||||||
@ -66,31 +60,34 @@ open class VacDisplay : DeviceDisplay<Sensor>() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun notifyMetaStateChanged(device: Device, name: String, state: Meta) {
|
// override fun notifyMetaStateChanged(device: Device, name: String, state: Meta) {
|
||||||
super.notifyMetaStateChanged(device, name, state)
|
// super.notifyMetaStateChanged(device, name, state)
|
||||||
|
//
|
||||||
|
// when (name) {
|
||||||
|
// Sensor.MEASUREMENT_RESULT_STATE -> {
|
||||||
|
// if(state.getBoolean(Sensor.RESULT_SUCCESS)) {
|
||||||
|
// val res by state.value(Sensor.RESULT_VALUE)
|
||||||
|
// val time by state.timeValue(Sensor.RESULT_TIMESTAMP)
|
||||||
|
// onResult(res, time)
|
||||||
|
// } else{
|
||||||
|
// Platform.runLater {
|
||||||
|
// value = "Err"
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// Sensor.MEASUREMENT_ERROR_STATE -> {
|
||||||
|
// val message by state.stringValue("message")
|
||||||
|
// message(message)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// override fun notifyStateChanged(device: Device, name: String, state: Any?) {
|
||||||
|
// super.notifyStateChanged(device, name, state)
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
when (name) {
|
|
||||||
Sensor.MEASUREMENT_RESULT_STATE -> {
|
|
||||||
if(state.getBoolean(Sensor.RESULT_SUCCESS)) {
|
|
||||||
val res by state.value(Sensor.RESULT_VALUE)
|
|
||||||
val time by state.timeValue(Sensor.RESULT_TIMESTAMP)
|
|
||||||
onResult(res, time)
|
|
||||||
} else{
|
|
||||||
Platform.runLater {
|
|
||||||
value = "Err"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Sensor.MEASUREMENT_ERROR_STATE -> {
|
|
||||||
val message by state.stringValue("message")
|
|
||||||
message(message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun notifyStateChanged(device: Device, name: String, state: Value) {
|
|
||||||
super.notifyStateChanged(device, name, state)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getTitle(): String {
|
fun getTitle(): String {
|
||||||
return device.meta.getString("title", device.name);
|
return device.meta.getString("title", device.name);
|
||||||
@ -158,7 +155,7 @@ open class VacDisplay : DeviceDisplay<Sensor>() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (device.hasState("power")) {
|
if (device.stateNames.contains("power")) {
|
||||||
separator(Orientation.HORIZONTAL)
|
separator(Orientation.HORIZONTAL)
|
||||||
pane {
|
pane {
|
||||||
minHeight = 30.0
|
minHeight = 30.0
|
||||||
|
@ -6,6 +6,7 @@ import hep.dataforge.fx.runGoal
|
|||||||
import hep.dataforge.fx.ui
|
import hep.dataforge.fx.ui
|
||||||
import hep.dataforge.kodex.configure
|
import hep.dataforge.kodex.configure
|
||||||
import hep.dataforge.plots.PlotFrame
|
import hep.dataforge.plots.PlotFrame
|
||||||
|
import hep.dataforge.plots.data.DataPlot
|
||||||
import hep.dataforge.plots.data.TimePlot
|
import hep.dataforge.plots.data.TimePlot
|
||||||
import hep.dataforge.plots.jfreechart.JFreeChartFrame
|
import hep.dataforge.plots.jfreechart.JFreeChartFrame
|
||||||
import inr.numass.data.api.NumassSet
|
import inr.numass.data.api.NumassSet
|
||||||
@ -25,6 +26,15 @@ class HVView : View(title = "High voltage time plot", icon = ImageView(dfIcon))
|
|||||||
"xAxis.title" to "time"
|
"xAxis.title" to "time"
|
||||||
"xAxis.type" to "time"
|
"xAxis.type" to "time"
|
||||||
"yAxis.title" to "HV"
|
"yAxis.title" to "HV"
|
||||||
|
}.apply {
|
||||||
|
plots.configure {
|
||||||
|
"connectionType" to "step"
|
||||||
|
"thickness" to 2
|
||||||
|
"showLine" to true
|
||||||
|
"showSymbol" to false
|
||||||
|
"showErrors" to false
|
||||||
|
}
|
||||||
|
plots.setType(DataPlot::class)
|
||||||
}
|
}
|
||||||
private val container = PlotContainer(frame);
|
private val container = PlotContainer(frame);
|
||||||
|
|
||||||
@ -47,17 +57,7 @@ class HVView : View(title = "High voltage time plot", icon = ImageView(dfIcon))
|
|||||||
} ui { hvData ->
|
} ui { hvData ->
|
||||||
hvData.ifPresent {
|
hvData.ifPresent {
|
||||||
for (dp in it) {
|
for (dp in it) {
|
||||||
//val blockName = dp.getString("block", "default").replace(".", "_");
|
val plot: TimePlot = frame[change.key] as TimePlot? ?: TimePlot(change.key).apply { frame.add(this) }
|
||||||
//val opt = frame.opt(blockName)
|
|
||||||
val plot = frame.opt(change.key).orElseGet {
|
|
||||||
TimePlot(change.key).configure {
|
|
||||||
"connectionType" to "step"
|
|
||||||
"thickness" to 2
|
|
||||||
"showLine" to true
|
|
||||||
"showSymbol" to false
|
|
||||||
"showErrors" to false
|
|
||||||
}.apply { frame.add(this) }
|
|
||||||
} as TimePlot;
|
|
||||||
plot.put(dp.getValue("timestamp").timeValue(), dp.getValue("value"))
|
plot.put(dp.getValue("timestamp").timeValue(), dp.getValue("value"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ class HVView : View(title = "High voltage time plot", icon = ImageView(dfIcon))
|
|||||||
data.remove(id);
|
data.remove(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clear(){
|
fun clear() {
|
||||||
data.clear()
|
data.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,11 +165,7 @@ class SpectrumView(
|
|||||||
val totalProgress = data.values.stream().mapToLong() { it.points.count() }.sum()
|
val totalProgress = data.values.stream().mapToLong() { it.points.count() }.sum()
|
||||||
|
|
||||||
data.forEach { name, set ->
|
data.forEach { name, set ->
|
||||||
val plot = frame.opt(name).orElseGet {
|
val plot: DataPlot = frame[name] as DataPlot? ?: DataPlot(name).apply { frame.add(this) }
|
||||||
DataPlot(name).apply {
|
|
||||||
frame.add(this)
|
|
||||||
}
|
|
||||||
} as DataPlot
|
|
||||||
|
|
||||||
runGoal("spectrumData[$name]") {
|
runGoal("spectrumData[$name]") {
|
||||||
set.points.map { point ->
|
set.points.map { point ->
|
||||||
@ -200,7 +196,7 @@ class SpectrumView(
|
|||||||
data.remove(key)
|
data.remove(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clear(){
|
fun clear() {
|
||||||
data.clear()
|
data.clear()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user