Params

A Kotlin Dsl has been provided for creating Parameters to store values like primitive types, collection types or domain specific types. This Dsl is built over abstractions like Parameter, KeyType etc offered by CSW. Refer to the CSW doc for more information about this.

Keys

Following table lists all the key types, and their corresponding kotlin dsl provided.

KeyType Kotlin Dsl
Boolean booleanKey
Character charKey
Byte byteKey
Short shortKey
Long longKey
Int intKey
Float floatKey
Double doubleKey
String stringKey
UtcTime utcTimeKey
TaiTime taiTimeKey
ByteArray byteArrayKey
ShortArray shortArrayKey
LongArray longArrayKey
IntArray intArrayKey
FloatArray floatArrayKey
DoubleArray doubleArrayKey
ByteMatrix byteMatrixKey
ShortMatrix shortMatrixKey
LongMatrix longMatrixKey
IntMatrix intMatrixKey
FloatMatrix floatMatrixKey
DoubleMatrix doubleMatrixKey
Choice choiceKey
Struct structKey
RaDec raDecKey
EqCoord eqCoordKey
SolarSystemCoord solarSystemCoordKey
MinorPlanetCoord minorPlanetCoordKey
CometCoord cometCoordKey
AltAzCoord altAzCoordKey
Coord (*) coordKey

Example below shows usages of Dsl for different types of keys. Some other helper Dsl like struct, choicesOf, arrayData, matrixData etc have also been provided for ease of access. Usage of this helper Dsl is also shown in the below example.

Kotlin
// Primitive keys
val encoderKey: Key<Int> = intKey("encoder")
val flagKey: Key<Boolean> = booleanKey("flag")
val eventTimeKey: Key<UTCTime> = utcTimeKey("event-time")

// Arrays
val arrayKey: Key<ArrayData<Int>> = intArrayKey("arrayKey")
val elms: Array<Int> = arrayOf(1, 2, 3, 4)
val values1: ArrayData<Int> = arrayData(elms)
val values2: ArrayData<Int> = arrayData(5, 6, 7, 8)
val arrayParam: Parameter<ArrayData<Int>> = arrayKey.set(values1, values2)

// Matrix
val matrixKey: Key<MatrixData<Int>> = intMatrixKey("matrixKey")
val arr1: Array<Int> = arrayOf(1, 2, 3, 4)
val arr2: Array<Int> = arrayOf(5, 6, 7, 8)
val elms1: Array<Array<Int>> = arrayOf(arr1, arr2)
val data1: MatrixData<Int> = matrixData(elms1)
val data2: MatrixData<Int> = matrixData(arr1, arr2)
val matrixParameter: Parameter<MatrixData<Int>> = matrixKey.set(data1, data2)

// Domain specific types
val choiceKey: Key<Choice> = choiceKey("choice", choicesOf("A", "B", "C"))
val choiceParam: Parameter<Choice> = choiceKey.set(Choice("A"), Choice("C"))

// Struct
val intParam: Parameter<Int> = encoderKey.set(1, 2, 3)
val paramSet: Set<Parameter<*>> = setOf(intParam, choiceParam)
val complexKey: Key<Struct> = structKey("complexKey")
val struct1: Struct = struct(paramSet)
val struct2: Struct = struct(command.params)
val struct3: Struct = struct(intParam, arrayParam)
val structParam: Parameter<Struct> = complexKey.set(struct1, struct2, struct3)

Creating Parameters

Example below shows different ways of creating parameters and adding them to a command.

Kotlin
val temperatureKey: Key<Int> = intKey("temperature")
val temperatureParam: Parameter<Int> = temperatureKey.set(1, 2, 3)

// with values as Array
val encoderKey: Key<Int> = intKey("encoder")
val encoderValues: Array<Int> = arrayOf(1, 2, 3)
val encoderParam: Parameter<Int> = encoderKey.set(*encoderValues)

// with units
val powerKey: Key<Double> = doubleKey("power")
val values: Array<Double> = arrayOf(1.1, 2.2, 3.3)
val powerParam: Parameter<Double> = powerKey.set(values, JUnits.watt)

// adding a param to command or event
val setupCommand: Setup = Setup("ESW.iris_darkNight", "move").add(temperatureParam)
val systemEvent: SystemEvent = SystemEvent("ESW.iris_darkNight", "movement").add(temperatureParam)

// adding multiple params
val setupCommand2: Setup = Setup("ESW.iris_darkNight", "move").madd(temperatureParam, encoderParam)

// adding params of one command to other
val paramsFromIncomingCommand: Params = command.params
val commandForDownstream: Setup = Setup("ESW.iris_darkNight", "move").add(paramsFromIncomingCommand)

Extracting a parameter from Params/Command/Event

Extracting parameter

Finding a parameter from Params/Command/Event.

Kotlin
val params: Params = setupCommand.params
val maybeParam: Parameter<Int>? = params.kFind(temperatureParam)
val maybeParam2: Parameter<Int>? = setupCommand.kFind(temperatureParam)

Extracting parameter by key

Kotlin
// extracting a param from Params instance
val temperatureParameter: Parameter<Int>? = setupCommand.params.kGet(temperatureKey)
val temperatureParameter2: Parameter<Int> = (setupCommand.params)(temperatureKey) // alternative

// extracting a param directly from the command or event
val temperatureParameter3: Parameter<Int>? = setupCommand.kGet(temperatureKey)
val temperatureParameter4: Parameter<Int> = setupCommand(temperatureKey) // alternative

Extracting parameter by keyName and KeyType

Kotlin
val keyName = "temperature"
val keyType: KeyType<Int> = JKeyType.IntKey()
val param: Parameter<Int>? = setupCommand.params.kGet(keyName, keyType)

Extracting values from a parameter

Example below shows accessing values of a parameter, or accessing a specific value of a parameter.

Kotlin
val temperatureKey: Key<Int> = intKey("temperature")
val temperatureParam: Parameter<Int> = temperatureKey.set(1, 2, 3)

// extracting values from parameter
val temperatureValues: List<Int> = temperatureParam.values

// extracting first value from parameter
val firstValue: Int = temperatureParam.first

// extracting value of the parameter at a given index
val temperatureValue: Int? = temperatureParam.kGet(1)
val temperatureValue2: Int = temperatureParam(1) //alternative
Note

Note that the shorthand alternatives shown with // alternative comment in above examples, do not return optional values unlike their corresponding full version. Which means, with shorthand dsl, an error will occur in absence of the specified key/index.

Removing a parameter

A parameter could be removed from Params instance or from Command directly. Below example demonstrates both the dsl methods.

Kotlin
// remove param from params by key
val updatedParams: Params = setupCommand.params.remove(temperatureKey)

// remove param from params
val updatedParams2: Params = setupCommand.params.remove(temperatureParameter)

// remove param from command by key
val updatedCommand: Setup = setupCommand.remove(temperatureKey)

// remove param from command
val updatedCommand2: Setup = setupCommand.remove(temperatureParameter)

Checking if a parameter exists

Kotlin
// check if parameter with specified key exists in Params
val temperatureKeyExists: Boolean = setupCommand.params.exists(temperatureKey)

// check if parameter with specified key exists directly from command
val temperatureKeyExists2: Boolean = setupCommand.exists(temperatureKey)