/** * @RDE_HEADER@ * RtState * $Id$ * $HeadURL$ * $Author$ * Created by Christian Fröbel, NLE, 2018-12-16 */ #pragma once #include "avm_export.h" #include "ava_types.h" #include #include #include #include #include #include namespace AudioVideoManagement { /** * RtState is part of AvaState. It mirrors the state of AVS_Workstation related * to the radio circuits. * It has two perspectives or users: * 1. AvaState itself. As AvaState observes the back-channel of the communication with AVS_Workstation, * it takes note of all changes in state notified by AVS_Workstation. * The observed state changes are: * - the currently selected sum channel * - the volume for each radio circuit * - the currently selected radio circuit (for each position) * - the current state of the buttons (for each position) * 2. RtProfileObserver. It observes changes in the user's profile and also changes of the names of * the radio circuits. It then issues commands via AvaControl which in turn determine the * wanted target state which is then sent to AVS_Workstation. * A target state is determined by copying the current state and then modify it by calling * setRadioCircuits() or changeName(). * * @see AvaState * @see RtProfileObserver * @see SetRtProfile * @see ChangeRtProfileCircuitName * * @author Christian Fröbel */ class AVM_COMMON_EXPORT RtState { public: struct RadioCircuit { RadioSystem radioSystem; int32_t id; std::string name; }; /** * Initially set the radio circuits accessible by the user in AVS_Workstation. * Is also called whenever the profile is changed by the user. * In case the new radio circuit is already known, the state is kept (volume setting and button state). * The order in the vector corresponds to the position in AVS_Workstation. */ void setRadioCircuits(const QVector &radioCircuits); void changeName(const RadioCircuit &radioCircuit); void setSumChannel(AvaSumChannel sumChannel); /** Empty name means de-selection. */ void setSelection(AvaRtPos pos, const std::string &name, AvaRtButtonState s); void setVolume(const std::string &name, AvaVolume volume); /** * Return the command representing the current state. * The command is a valid RCP_AVA command (setRtProfile). */ std::string toCommand() const; AvaSumChannel sumChannel() const { return m_sumChannel; } std::vector allRadioCircuits() const; /** * Returns the radio circuits currently selected in AVS_Workstation. * Thus the size of the returned vector is always <= 8. * The order in the vector corresponds to the order of ComboBoxes (from top-left to bottom-right). */ std::vector selectedRadioCircuits() const; private: /** * We store a radio circuit under such a key in order to identify * the radio circuit. */ struct Key { static Key createFrom(const RadioCircuit &radioCircuit); RadioSystem radioSystem; int32_t id; bool operator==(const Key &other) const; bool operator!=(const Key &other) const { return !(*this == other); } bool operator<(const Key &other) const; }; struct CircuitState { explicit CircuitState(const std::string &name_); std::string name; AvaVolume volume{0}; std::string toCommandPart() const; }; struct PosState { PosState() = default; explicit PosState(const Key &key_, AvaRtButtonState s = AvaRtButtonState::None); boost::optional key; AvaRtButtonState buttonState{AvaRtButtonState::None}; std::string toCommandSelectionPart(const std::map &radioCircuits) const; std::string toCommandStatePart() const; }; std::map::iterator findRadioCircuit(const std::string &name); std::map m_radioCircuits; std::array m_states; AvaSumChannel m_sumChannel{AvaSumChannel::Right}; }; } // namespace AudioVideoManagement