The dome and mount locks

The domes and the mounts of an observatory lock each other’s park. While an Observatory has a Dome, a mount refuses to unpark while the dome is parked or moving, and a dome refuses to park while the mount of a reserved telescope in the observatory is unparked or moving. No field turns these locks off. INDI’s drivers enforce both locks. The operator sets the policy in each driver and passes each driver the state it needs to read:

In an observatory with no dome, each mount’s DOME_POLICY is DOME_IGNORED. INDI’s mount starts locked and unlocks only when a dome reports that it is unparked, so with no dome to report, a mount under DOME_LOCKS never unparks. The observatory then has no LocksRelayed condition. The policy follows the domes at once: when an observatory’s last Dome is deleted, the operator writes DOME_IGNORED to each running mount of the observatory, and when a Dome is declared, DOME_LOCKS. It saves each driver’s configuration after the write. Without that, a mount would stay locked to the last park state that the operator relayed from the deleted dome.

A driver reads another device’s park state through its own INDI server, but the dome runs on the observatory’s server and each mount on its telescope’s. So the operator relays the park states between the servers. Each mount receives the domes’ state under the name in its ACTIVE_DEVICES.ACTIVE_DOME. The dome receives one state for every mount under the name in its ACTIVE_DEVICES.ACTIVE_TELESCOPE: unparked while any mount is unparked, moving, or silent. A mount that does not report its park state counts as unparked until the Deactivation step of its reservation has ended. A dome that does not report counts as parked.

The Observatory’s LocksRelayed condition reports the relay. It is True while the operator relays each state, and its message names what it relays. It is False with the reason Waiting while a device does not report what the relay needs, and with the reason Idle while no dome or mount runs. While the operator is down, each driver keeps the last state that the operator relayed, and a later park or unpark is not relayed. A driver that restarts forgets that state, and the operator relays it again when the driver connects.

When a driver refuses a move under a lock, it answers with Alert, and the operator posts a Warning on the device: MountUnparkRefused on the Mount, or DomeParkRefused on the Dome. A procedure’s action that asked for the move fails, and its summary gives the same explanation as the Warning, such as state: Parked: Dome lab refused to park, because Mount east is unparked or moving. In a trigger’s run, the summary of a refused dome park adds that after: [{kind: Mount}] orders the dome’s park after the mounts' parks, because the tree gives a trigger no order.