// // ActivityObserver.h // Clock Signal // // Created by Thomas Harte on 07/05/2018. // Copyright 2018 Thomas Harte. All rights reserved. // #pragma once #include #include namespace Activity { /*! Provides a purely virtual base class for anybody that wants to receive notifications of 'activity': any feedback from an emulated system which a user could perceive other than through the machine's native audio and video outputs. So: status LEDs, drive activity, etc. A receiver may choose to make appropriate noises and/or to show or unshow status indicators. */ class Observer { public: virtual ~Observer() = default; /// Provides hints as to the sort of information presented on an LED. enum LEDPresentation: uint8_t { /// This LED informs the user of some sort of persistent state, e.g. scroll lock. /// If this flag is absent then the LED describes an ephemeral state, such as media access. Persistent = (1 << 0), }; /// Announces to the receiver that there is an LED of name @c name. virtual void register_led([[maybe_unused]] const std::string &name, [[maybe_unused]] uint8_t presentation = 0) {} /// Announces to the receiver that there is a drive of name @c name. /// /// If a drive has the same name as an LED, that LED goes with this drive. virtual void register_drive([[maybe_unused]] const std::string &name) {} /// Informs the receiver of the new state of the LED with name @c name. virtual void set_led_status([[maybe_unused]] const std::string &name, [[maybe_unused]] bool lit) {} enum class DriveEvent { StepNormal, StepBelowZero, StepBeyondMaximum }; /// Informs the receiver that the named event just occurred for the drive with name @c name. virtual void announce_drive_event([[maybe_unused]] const std::string &name, [[maybe_unused]] DriveEvent event) {} /// Informs the receiver of the motor-on status of the drive with name @c name. virtual void set_drive_motor_status([[maybe_unused]] const std::string &name, [[maybe_unused]] bool is_on) {} }; }