numass-framework/numass-control/src/main/kotlin/inr/numass/control/NumassControlApplication.kt

84 lines
2.5 KiB
Kotlin
Raw Normal View History

2017-05-31 09:53:21 +03:00
package inr.numass.control
import ch.qos.logback.classic.Level
import hep.dataforge.control.connections.Roles
import hep.dataforge.control.devices.Device
import hep.dataforge.control.devices.DeviceFactory
2017-05-31 09:53:21 +03:00
import hep.dataforge.exceptions.ControlException
2018-03-19 16:57:07 +03:00
import hep.dataforge.kodex.optional
2017-05-31 09:53:21 +03:00
import hep.dataforge.meta.Meta
import javafx.scene.Scene
import javafx.stage.Stage
import org.slf4j.LoggerFactory
import tornadofx.*
import java.util.*
/**
* Created by darksnake on 14-May-17.
*/
2017-11-13 16:56:34 +03:00
abstract class NumassControlApplication<in D : Device> : App() {
2017-05-31 09:53:21 +03:00
private var device: D by singleAssign()
override fun start(stage: Stage) {
Locale.setDefault(Locale.US)// чтобы отделение десятичных знаков было точкой
val rootLogger = LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME) as ch.qos.logback.classic.Logger
rootLogger.level = Level.INFO
device = setupDevice()
2018-03-19 16:57:07 +03:00
val controller = device.getDisplay()
2017-06-04 22:42:47 +03:00
device.connect(controller, Roles.VIEW_ROLE, Roles.DEVICE_LISTENER_ROLE)
val scene = Scene(controller.view?.root ?: controller.getBoardView())
2017-05-31 09:53:21 +03:00
stage.scene = scene
stage.show()
setupStage(stage, device)
setDFStageIcon(stage)
}
/**
* Get a device factory for given device
* @return
*/
protected abstract val deviceFactory: DeviceFactory
2017-05-31 09:53:21 +03:00
protected abstract fun setupStage(stage: Stage, device: D)
protected abstract fun acceptDevice(meta: Meta): Boolean
private fun setupDevice(): D {
2018-03-19 16:57:07 +03:00
val config = getConfig(this).optional.orElseGet { readResourceMeta("/config/devices.xml") }
2017-05-31 09:53:21 +03:00
val ctx = setupContext(config)
2018-03-19 16:57:07 +03:00
val deviceConfig = findDeviceMeta(config) { this.acceptDevice(it) }
?: throw RuntimeException("Device configuration not found")
2017-05-31 09:53:21 +03:00
try {
2017-05-31 16:53:51 +03:00
@Suppress("UNCHECKED_CAST")
2017-05-31 09:53:21 +03:00
val d = deviceFactory.build(ctx, deviceConfig) as D
d.init()
connectStorage(d, config)
return d
} catch (e: ControlException) {
throw RuntimeException("Failed to build device", e)
}
}
override fun stop() {
2017-05-31 16:53:51 +03:00
try {
device.shutdown()
} catch (ex: Exception) {
LoggerFactory.getLogger(javaClass).error("Failed to shutdown application", ex);
} finally {
device.context.close()
super.stop()
}
2017-05-31 09:53:21 +03:00
}
}