States and Mode Transitions
The Dish Manager acts as the high-level orchestration TANGO device for the Dish. As such, it does not have a physical statits own; instead, it aggregates and computes its states, modes, and configurations based on the statuses of its underlying sub-elements:
DS (Dish Structure)
SPF (Single Pixel Feed Controller)
SPFRx (Single Pixel Feed Receiver)
State computation is handled dynamically by
evaluating a set of predefined
transition rules using the rule_engine library.
These rules are housed in the
ska_mid_dish_manager.models.transition_rules directory.
Commands, Target States, and Aggregated Attributes
When the Dish Manager receives a command, it does not immediately change its own state. Instead, it delegates the command down to the relevant sub-elements and monitors their telemetry. The Dish Manager only transitions to the Desired State once the transition rules calculate that the Aggregated Attributes from the specific Target Sub-devices have reached their required values.
Commands |
Desired dishMode |
Target Sub-device(s) |
Additional dishMode attribute(s) |
Attributes to watch and their expected values |
|---|---|---|---|---|
SetStandbyLPMode |
STANDBY_LP |
DS, SPF, SPFRx
|
operatingModeDSOperatingMode.STANDBY (DS)
SPFOperatingMode.STANDBY_LP (SPF)
SPFRxOperatingMode.STANDBY (SPFRx)
powerStateDSPowerState.LOW_POWER (DS)
|
|
SetStandbyFPMode |
STANDBY_FP |
DS, SPF, SPFRx
|
operatingModeDSOperatingMode.STANDBY (DS)
powerStateDSPowerState.FULL_POWER (DS)
|
|
SetStowMode |
STOW |
DS
|
operatingModeDSOperatingMode.STOW
achievedPointingdesiredpointingel == 90 degrees
|
|
SetMaintenanceMode |
MAINTAINANCE |
DS, SPF, SPFRx
|
operatingModeDSOperatingMode.STOW
SPFRxOperatingMode.STANDBY
SPFOperatingMode.MAINTENANCE
|
|
ConfigureBand[1, 2, 3, 4, 5a, 5b]
|
OPERATE (with new Band) |
DS, SPF, SPFRx
|
configuredBandSPFRx.configuredband (SPF)
bandInFocusSPF.bandinfocus (SPF)
indexerPositionDS.indexerposition (DS)
|
|
Scan |
SLEWTRACK |
DS
|
pointingStatePointingState.SLEW (DS)
desiredPointingachievedPointingachievedTargetLock |
|
Track |
SLEWTRACK |
DS
|
pointingStatePointingState.SLEW (DS)
desiredPointingachievedPointingachievedTargetLock |
|
|
|
DS |
|
|
|
|
DS |
PointingState.READY |
|
TrackLoadStaticOff |
DS
|
actstaticoffsetvaluexel
actstaticoffsetvalueel
|
||
|
SPFRx |
KValue updated |
Transition Logic and ignored sub-elements
To support engineering, maintenance, and partial-system operations, the Dish Manager allows operators to “ignore” certain sub-elements. The transition engine dynamically swaps the rule sets based on which devices are currently active or ignored. For every aggregated state, the Dish Manager defines specific rule sets such as:
RULES_ALL_DEVICES: Evaluated when all sub-elements are communicating and monitored.RULES_SPF_IGNORED: Evaluated when the SPF controller is ignored.RULES_SPFRX_IGNORED: Evaluated when the SPFRx device is ignored.RULES_DS_ONLY: Evaluated when only the Dish Structure is monitor
Note
- Users can configure the sub-element(s) actively being controlled and monitored by Dish Manager by setting the following boolean attributes on the dish manager interface;
‘ignorespf’
‘ignorespfrx’
Power State Transitions
The overall Dish Manager Power State (e.g., UPS, LOW_POWER, FULL_POWER, OFF) is computed by checking the power states of the sub-elements.
Power State Rule Evaluation
When calculating the aggregated Power State, the Dish Manager uses different rule dictionaries depending on whether there are any sub-elements monitored or ignored.
Below are the decision tables based on transition rules evaluated by the engine when all devices are active, as well as when sub-device(s) are ignored:
POWER_STATE_RULES_ALL_DEVICES
Rule |
Condition |
|---|---|
UPS |
DS.powerstate in [‘DSPowerState.UPS’, ‘DSPowerState.OFF’] |
LOW (Case 1)
LOW (Case 2)
LOW (Case 3)
|
DS.powerstate == ‘DSPowerState.LOW_POWER’
|
DS.powerstate == ‘DSPowerState.UNKNOWN’ and
SPF.powerstate == ‘SPFPowerState.LOW_POWER’
|
|
DS.powerstate == ‘DSPowerState.UNKNOWN’ and
SPF.powerstate == ‘SPFPowerState.UNKNOWN’
|
|
FULL (Case 1)
FULL (Case 2)
|
DS.powerstate == ‘DSPowerState.FULL_POWER’
|
DS.powerstate == ‘DSPowerState.UNKNOWN’ and
|SPF.powerstate == ‘SPFPowerState.FULL_POWER’ |
|
POWER_STATE_RULES_SPF_IGNORED
Rule |
Condition |
|---|---|
UPS |
DS.powerstate in [‘DSPowerState.UPS’, ‘DSPowerState.OFF’] |
LOW |
DS.powerstate in [‘DSPowerState.LOW_POWER’, ‘DSPowerState.UNKNOWN’] |
FULL |
DS.powerstate == ‘DSPowerState.FULL_POWER’ |
Dish Mode Transitions
Dish Mode transitions (e.g., STARTUP, STANDBY_LP, STANDBY_FP, OPERATE, STOW, MAINT) are determined by a combination of the sub-element Operating Modes, Power States, and Indexer Positions.
Dish Mode Rule Evaluation
DISH_MODE_RULES_ALL_DEVICES
Rule |
Condition |
|---|---|
STARTUP |
DS.operatingmode == ‘DSOperatingMode.STARTUP’ or SPF.operatingmode == ‘SPFOperatingMode.STARTUP’ or SPFRX.operatingmode == ‘SPFRxOperatingMode.STARTUP’ |
STOW |
DS.operatingmode == ‘DSOperatingMode.STOW’ |
CONFIG |
SPFRX.operatingmode == ‘SPFRxOperatingMode.CONFIGURE’ or DS.indexerposition == ‘IndexerPosition.MOVING’ |
OPERATE |
DS.operatingmode == ‘DSOperatingMode.POINT’ and SPF.operatingmode == ‘SPFOperatingMode.OPERATE’ and SPFRX.operatingmode == ‘SPFRxOperatingMode.OPERATE’ |
STANDBY_LP |
DS.operatingmode == ‘DSOperatingMode.STANDBY’ and DS.powerstate == ‘DSPowerState.LOW_POWER’ and SPF.operatingmode != ‘SPFOperatingMode.OPERATE’ |
STANDBY_FP |
DS.operatingmode == ‘DSOperatingMode.STANDBY’ and DS.powerstate == ‘DSPowerState.FULL_POWER’ |
DISH_MODE_RULES_SPF_IGNORED
Rule |
Condition |
|---|---|
STARTUP |
DS.operatingmode == ‘DSOperatingMode.STARTUP’ or SPFRX.operatingmode == ‘SPFRxOperatingMode.STARTUP’ |
STOW |
DS.operatingmode == ‘DSOperatingMode.STOW’ |
CONFIG |
SPFRX.operatingmode == ‘SPFRxOperatingMode.CONFIGURE’ or DS.indexerposition == ‘IndexerPosition.MOVING’ |
OPERATE |
DS.operatingmode == ‘DSOperatingMode.POINT’ and SPFRX.operatingmode == ‘SPFRxOperatingMode.OPERATE’ |
STANDBY_LP |
DS.operatingmode == ‘DSOperatingMode.STANDBY’ and DS.powerstate == ‘DSPowerState.LOW_POWER’ |
STANDBY_FP |
DS.operatingmode == ‘DSOperatingMode.STANDBY’ and DS.powerstate == ‘DSPowerState.FULL_POWER’ |
DISH_MODE_RULES_SPFRX_IGNORED
Rule |
Condition |
|---|---|
STARTUP |
DS.operatingmode == ‘DSOperatingMode.STARTUP’ or SPF.operatingmode == ‘SPFOperatingMode.STARTUP’ |
STOW |
DS.operatingmode == ‘DSOperatingMode.STOW’ |
CONFIG |
DS.indexerposition == ‘IndexerPosition.MOVING’ |
OPERATE |
DS.operatingmode == ‘DSOperatingMode.POINT’ and SPF.operatingmode == ‘SPFOperatingMode.OPERATE’ |
STANDBY_LP |
DS.operatingmode == ‘DSOperatingMode.STANDBY’ and DS.powerstate == ‘DSPowerState.LOW_POWER’ and SPF.operatingmode != ‘SPFOperatingMode.OPERATE’ |
STANDBY_FP |
DS.operatingmode == ‘DSOperatingMode.STANDBY’ and DS.powerstate == ‘DSPowerState.FULL_POWER’ |
DISH_MODE_RULES_DS_ONLY
Rule |
Condition |
|---|---|
STARTUP |
DS.operatingmode == ‘DSOperatingMode.STARTUP’ |
STOW |
DS.operatingmode == ‘DSOperatingMode.STOW’ |
CONFIG |
DS.indexerposition == ‘IndexerPosition.MOVING’ |
OPERATE |
DS.operatingmode == ‘DSOperatingMode.POINT’ |
STANDBY_LP |
DS.operatingmode == ‘DSOperatingMode.STANDBY’ and DS.powerstate == ‘DSPowerState.LOW_POWER’ |
STANDBY_FP |
DS.operatingmode == ‘DSOperatingMode.STANDBY’ and DS.powerstate == ‘DSPowerState.FULL_POWER’ |
Band and Pointing Configurations
Dish Band Configuration rules
The Band Configuration state (e.g., OPERATE with a specific band) is determined by evaluating the configured band on the SPFRx, the band in focus on the
SPF, and the indexer position on the DS. A transient change to the CONFIG mode may also occur during band changes.
CONFIGURED_BAND_RULES_ALL_DEVICES
Rule |
Condition |
|---|---|
NONE |
SPFRX.configuredband == ‘Band.NONE’ |
B1 |
DS.indexerposition == ‘IndexerPosition.B1’ and SPFRX.configuredband == ‘Band.B1’ and SPF.bandinfocus == ‘SPFBandInFocus.B1’ |
B2 |
DS.indexerposition == ‘IndexerPosition.B2’ and SPFRX.configuredband == ‘Band.B2’ and SPF.bandinfocus == ‘SPFBandInFocus.B2’ |
B3 |
DS.indexerposition == ‘IndexerPosition.B3’ and SPFRX.configuredband == ‘Band.B3’ and SPF.bandinfocus == ‘SPFBandInFocus.B3’ |
B4 |
DS.indexerposition == ‘IndexerPosition.B4’ and SPFRX.configuredband == ‘Band.B4’ and SPF.bandinfocus == ‘SPFBandInFocus.B4’ |
B5a |
DS.indexerposition == ‘IndexerPosition.B5a’ and SPFRX.configuredband == ‘Band.B5a’ and SPF.bandinfocus == ‘SPFBandInFocus.B5a’ |
B5b |
DS.indexerposition == ‘IndexerPosition.B5b’ and SPFRX.configuredband == ‘Band.B1’ and SPF.bandinfocus == ‘SPFBandInFocus.B5b’ |
CONFIGURED_BAND_RULES_SPF_IGNORED
Rule |
Condition |
|---|---|
NONE |
SPFRX.configuredband == ‘Band.NONE’ |
B1 |
DS.indexerposition == ‘IndexerPosition.B1’ and SPFRX.configuredband == ‘Band.B1’ |
B2 |
DS.indexerposition == ‘IndexerPosition.B2’ and SPFRX.configuredband == ‘Band.B2’ |
B3 |
DS.indexerposition == ‘IndexerPosition.B3’ and SPFRX.configuredband == ‘Band.B3’ |
B4 |
DS.indexerposition == ‘IndexerPosition.B4’ and SPFRX.configuredband == ‘Band.B4’ |
B5a |
DS.indexerposition == ‘IndexerPosition.B5a’ and SPFRX.configuredband == ‘Band.B5a’ |
B5b |
DS.indexerposition == ‘IndexerPosition.B5b’ and SPFRX.configuredband == ‘Band.B1’ |
CONFIGURED_BAND_RULES_SPFRX_IGNORED
Rule |
Condition |
|---|---|
B1 |
DS.indexerposition == ‘IndexerPosition.B1’ and SPF.bandinfocus == ‘SPFBandInFocus.B1’ |
B2 |
DS.indexerposition == ‘IndexerPosition.B2’ and SPF.bandinfocus == ‘SPFBandInFocus.B2’ |
B3 |
DS.indexerposition == ‘IndexerPosition.B3’ and SPF.bandinfocus == ‘SPFBandInFocus.B3’ |
B4 |
DS.indexerposition == ‘IndexerPosition.B4’ and SPF.bandinfocus == ‘SPFBandInFocus.B4’ |
B5a |
DS.indexerposition == ‘IndexerPosition.B5a’ and SPF.bandinfocus == ‘SPFBandInFocus.B5a’ |
B5b |
DS.indexerposition == ‘IndexerPosition.B5b’ and SPF.bandinfocus == ‘SPFBandInFocus.B5b’ |
CONFIGURED_BAND_RULES_DS_ONLY
Rule |
Condition |
|---|---|
B1 |
DS.indexerposition == ‘IndexerPosition.B1’ |
B2 |
DS.indexerposition == ‘IndexerPosition.B2’ |
B3 |
DS.indexerposition == ‘IndexerPosition.B3’ |
B4 |
DS.indexerposition == ‘IndexerPosition.B4’ |
B5a |
DS.indexerposition == ‘IndexerPosition.B5a’ |
B5b |
DS.indexerposition == ‘IndexerPosition.B5b’ |
Pointing State
Reflects whether the Dish is READY, SLEW, or TRACK. This state relies almost entirely on the Dish Structure (DS) tracking telemetry.
Dish Health States
The Dish Manager also computes aggregated health states such as OK, DEGRADED, FAILED, and UNKNOWN based on the health states of the sub-devices.
Dish Health State Rule Evaluation
HEALTH_STATE_RULES_ALL_DEVICES
Rule |
Condition |
|---|---|
DEGRADED
|
DS.healthstate == ‘HealthState.DEGRADED’ and
SPF.healthstate in [‘HealthState.OK’, ‘HealthState.DEGRADED’, ‘HealthState.UNKNOWN’] and
SPFRX.healthstate in [‘HealthState.OK’, ‘HealthState.DEGRADED’, ‘HealthState.UNKNOWN’]
|
or |
|
DS.healthstate in [‘HealthState.OK’, ‘HealthState.DEGRADED’, ‘HealthState.UNKNOWN’] and
SPF.healthstate == ‘HealthState.DEGRADED’ and
SPFRX.healthstate in [‘HealthState.OK’, ‘HealthState.DEGRADED’, ‘HealthState.UNKNOWN’]
|
|
or |
|
DS.healthstate in [‘HealthState.OK’, ‘HealthState.DEGRADED’, ‘HealthState.UNKNOWN’] and
SPF.healthstate in [‘HealthState.OK’, ‘HealthState.DEGRADED’, ‘HealthState.UNKNOWN’] and
SPFRX.healthstate == ‘HealthState.DEGRADED’
|
|
FAILED |
DS.healthstate == ‘HealthState.FAILED’ or SPF.healthstate == ‘HealthState.FAILED’ or SPFRX.healthstate == ‘HealthState.FAILED’ |
OK |
DS.healthstate == ‘HealthState.OK’ and SPF.healthstate == ‘HealthState.OK’ and SPFRX.healthstate == ‘HealthState.OK’ |
UNKNOWN |
DS.healthstate == ‘HealthState.UNKNOWN’ or SPF.healthstate == ‘HealthState.UNKNOWN’ or SPFRX.healthstate == ‘HealthState.UNKNOWN’ |
HEALTH_STATE_RULES_SPF_IGNORED
Rule |
Condition |
|---|---|
DEGRADED
|
DS.healthstate == ‘HealthState.DEGRADED’ and
|SPFRX.healthstate in [‘HealthState.OK’, ‘HealthState.DEGRADED’, ‘HealthState.UNKNOWN’] |
or
|
|
DS.healthstate in [‘HealthState.OK’, ‘HealthState.DEGRADED’, ‘HealthState.UNKNOWN’] and SPFRX.healthstate == ‘HealthState.DEGRADED’
|
|
FAILED |
DS.healthstate == ‘HealthState.FAILED’ or SPFRX.healthstate == ‘HealthState.FAILED’ |
OK |
DS.healthstate == ‘HealthState.OK’ and SPFRX.healthstate == ‘HealthState.OK’ |
UNKNOWN |
DS.healthstate == ‘HealthState.UNKNOWN’ or SPFRX.healthstate == ‘HealthState.UNKNOWN’ |
HEALTH_STATE_RULES_SPFRX_IGNORED
Rule |
Condition |
|---|---|
DEGRADED
|
DS.healthstate == ‘HealthState.DEGRADED’ and SPF.healthstate == ‘HealthState.DEGRADED’
SPF.healthstate in [‘HealthState.OK’, ‘HealthState.DEGRADED’, ‘HealthState.UNKNOWN’]
|
or
|
|
DS.healthstate in [‘HealthState.OK’, ‘HealthState.DEGRADED’, ‘HealthState.UNKNOWN’] and SPF.healthstate == ‘HealthState.DEGRADED’
|
|
FAILED |
DS.healthstate == ‘HealthState.FAILED’ or SPF.healthstate == ‘HealthState.FAILED’ |
OK |
DS.healthstate == ‘HealthState.OK’ and SPF.healthstate == ‘HealthState.OK’ |
UNKNOWN |
DS.healthstate == ‘HealthState.UNKNOWN’ or SPF.healthstate == ‘HealthState.UNKNOWN’ |
HEALTH_STATE_RULES_DS_ONLY
Rule |
Condition |
|---|---|
DEGRADED |
DS.healthstate == ‘HealthState.DEGRADED’ |
FAILED |
DS.healthstate == ‘HealthState.FAILED’ |
OK |
DS.healthstate == ‘HealthState.OK’ |
UNKNOWN |
DS.healthstate == ‘HealthState.UNKNOWN’ |