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











operatingMode
DSOperatingMode.STANDBY (DS)
SPFOperatingMode.STANDBY_LP (SPF)
SPFRxOperatingMode.STANDBY (SPFRx)
powerState
DSPowerState.LOW_POWER (DS)
SetStandbyFPMode



STANDBY_FP



DS, SPF, SPFRx







operatingMode
DSOperatingMode.STANDBY (DS)
powerState
DSPowerState.FULL_POWER (DS)
SetStowMode




STOW




DS









operatingMode
DSOperatingMode.STOW
achievedPointing
desiredpointingel == 90 degrees

SetMaintenanceMode



MAINTAINANCE



DS, SPF, SPFRx







operatingMode
DSOperatingMode.STOW
SPFRxOperatingMode.STANDBY
SPFOperatingMode.MAINTENANCE
ConfigureBand
[1, 2, 3, 4, 5a, 5b]




OPERATE (with new Band)





DS, SPF, SPFRx











configuredBand
SPFRx.configuredband (SPF)
bandInFocus
SPF.bandinfocus (SPF)
indexerPosition
DS.indexerposition (DS)
Scan




SLEW

TRACK


DS









pointingState
PointingState.SLEW (DS)
desiredPointing
achievedPointing
achievedTargetLock
Track




SLEW
TRACK



DS









pointingState
PointingState.SLEW (DS)
desiredPointing
achievedPointing
achievedTargetLock

Slew

SLEW

DS

pointingState

TrackStop

READY

DS

PointingState.READY

TrackLoadStaticOff



DS



actstaticoffsetvaluexel
actstaticoffsetvalueel

SetKvalue

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’