// license:BSD-3-Clause // copyright-holders:Nicola Salmoria, Aaron Giles /*************************************************************************** output.h General purpose output routines. ***************************************************************************/ #pragma once #ifndef __EMU_H__ #error Dont include this file directly; include emu.h instead. #endif #ifndef __OUTPUT_H__ #define __OUTPUT_H__ /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ class output_module; typedef void (*output_notifier_func)(const char *outname, INT32 value, void *param); // ======================> output_manager class output_manager { class output_notify { public: output_notify(output_notifier_func callback, void *param) : m_notifier(callback), m_param(param) { } output_notifier_func m_notifier; // callback to call void * m_param; // parameter to pass the callback }; class output_item { public: std::string name; // string name of the item UINT32 hash; // hash for this item name UINT32 id; // unique ID for this item INT32 value; // current value std::vector notifylist; // list of notifier callbacks }; public: // construction/destruction output_manager(running_machine &machine); // getters running_machine &machine() const { return m_machine; } // set the value for a given output void set_value(const char *outname, INT32 value); // set an indexed value for an output (concatenates basename + index) void set_indexed_value(const char *basename, int index, int value); // return the current value for a given output INT32 get_value(const char *outname); // return the current value for a given indexed output INT32 get_indexed_value(const char *outname, int index); // set a notifier on a particular output, or globally if nullptr void set_notifier(const char *outname, output_notifier_func callback, void *param); // set a notifier on a particular output, or globally if nullptr void notify_all(output_module *module); // map a name to a unique ID UINT32 name_to_id(const char *outname); // map a unique ID back to a name const char *id_to_name(UINT32 id); // helpers void set_led_value(int index, int value) { set_indexed_value("led", index, value ? 1 : 0); } void set_lamp_value(int index, int value) { set_indexed_value("lamp", index, value); } void set_digit_value(int index, int value) { set_indexed_value("digit", index, value); } INT32 get_led_value(int index) { return get_indexed_value("led", index); } INT32 get_lamp_value(int index) { return get_indexed_value("lamp", index); } INT32 get_digit_value(int index) { return get_indexed_value("digit", index); } void pause(); void resume(); private: output_item *find_item(const char *string); output_item *create_new_item(const char *outname, INT32 value); // internal state running_machine & m_machine; // reference to our machine std::unordered_map m_itemtable; std::vector m_global_notifylist; UINT32 m_uniqueid; }; #endif // __OUTPUT_H__