summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/input.h
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2016-10-24 17:28:35 -0400
committer AJR <ajrhacker@users.noreply.github.com>2016-10-24 17:28:35 -0400
commit99c705f9de7d9cdb396b79ce1adfa5046dd2d08c (patch)
tree016347417c247fd404c134a7fe9fcac243d20344 /src/emu/input.h
parentaa2adc489c344dfae8dbb206695b1be8ef3ee27f (diff)
Polymorphize input_device and input_class; move to separate source file (nw)
Diffstat (limited to 'src/emu/input.h')
-rw-r--r--src/emu/input.h239
1 files changed, 4 insertions, 235 deletions
diff --git a/src/emu/input.h b/src/emu/input.h
index 42392871470..e8ed5aac5a3 100644
--- a/src/emu/input.h
+++ b/src/emu/input.h
@@ -350,61 +350,11 @@ DECLARE_ENUM_OPERATORS(input_item_id)
class input_device_item;
class input_device;
class input_class;
-class input_manager;
-// callback for getting the value of an item on a device
-typedef int32_t (*item_get_state_func)(void *device_internal, void *item_internal);
-
// controller alias table typedef
typedef std::map<std::string, std::string> devicemap_table_type;
-// ======================> joystick_map
-
-// a 9x9 joystick map
-class joystick_map
-{
-public:
- // construction/destruction
- joystick_map();
- joystick_map(const joystick_map &src) { copy(src); }
-
- // operators
- joystick_map &operator=(const joystick_map &src) { if (this != &src) copy(src); return *this; }
-
- // parse from a string
- bool parse(const char *mapstring);
-
- // create a friendly string
- std::string to_string() const;
-
- // update the state of a live map
- uint8_t update(int32_t xaxisval, int32_t yaxisval);
-
- // joystick mapping codes
- static const uint8_t JOYSTICK_MAP_NEUTRAL = 0x00;
- static const uint8_t JOYSTICK_MAP_LEFT = 0x01;
- static const uint8_t JOYSTICK_MAP_RIGHT = 0x02;
- static const uint8_t JOYSTICK_MAP_UP = 0x04;
- static const uint8_t JOYSTICK_MAP_DOWN = 0x08;
- static const uint8_t JOYSTICK_MAP_STICKY = 0x0f;
-
-private:
- // internal helpers
- void copy(const joystick_map &src)
- {
- memcpy(m_map, src.m_map, sizeof(m_map));
- m_lastmap = JOYSTICK_MAP_NEUTRAL;
- m_origstring = src.m_origstring;
- }
-
- // internal state
- uint8_t m_map[9][9]; // 9x9 grid
- uint8_t m_lastmap; // last value returned (for sticky tracking)
- std::string m_origstring; // originally parsed string
-};
-
-
// ======================> input_code
// a combined code that describes a particular input on a particular device
@@ -423,7 +373,6 @@ public:
}
input_code(const input_code &src)
: m_internal(src.m_internal) { }
- input_code(input_device &device, input_item_id itemid);
// operators
bool operator==(const input_code &rhs) const { return m_internal == rhs.m_internal; }
@@ -495,155 +444,6 @@ private:
};
-// ======================> input_device_item
-
-// a single item on an input device
-class input_device_item
-{
-protected:
- // construction/destruction
- input_device_item(input_device &device, const char *name, void *internal, input_item_id itemid, item_get_state_func getstate, input_item_class itemclass);
-
-public:
- virtual ~input_device_item();
-
- // getters
- input_device &device() const { return m_device; }
- input_manager &manager() const;
- running_machine &machine() const;
- const char *name() const { return m_name.c_str(); }
- void *internal() const { return m_internal; }
- input_item_id itemid() const { return m_itemid; }
- input_item_class itemclass() const { return m_itemclass; }
- const char *token() const { return m_token.c_str(); }
- int32_t current() const { return m_current; }
- int32_t memory() const { return m_memory; }
-
- // helpers
- int32_t update_value();
- void set_memory(int32_t value) { m_memory = value; }
-
- // readers
- virtual int32_t read_as_switch(input_item_modifier modifier) = 0;
- virtual int32_t read_as_relative(input_item_modifier modifier) = 0;
- virtual int32_t read_as_absolute(input_item_modifier modifier) = 0;
-
-protected:
- // internal state
- input_device & m_device; // reference to our owning device
- std::string m_name; // string name of item
- void * m_internal; // internal callback pointer
- input_item_id m_itemid; // originally specified item id
- input_item_class m_itemclass; // class of the item
- item_get_state_func m_getstate; // get state callback
- std::string m_token; // tokenized name for non-standard items
-
- // live state
- int32_t m_current; // current raw value
- int32_t m_memory; // "memory" value, to remember where we started during polling
-};
-
-
-// ======================> input_device
-
-// a logical device of a given class that can provide input
-class input_device
-{
- friend class input_class;
-
-public:
- // construction/destruction
- input_device(input_class &_class, int _devindex, const char *_name, const char *_id, void *_internal);
- // getters
- input_class &device_class() const { return m_class; }
- input_manager &manager() const;
- running_machine &machine() const;
- input_device_class devclass() const;
- const char *name() const { return m_name.c_str(); }
- const char *id() const { return m_id.c_str(); }
- int devindex() const { return m_devindex; }
- input_device_item *item(input_item_id index) const { return m_item[index].get(); }
- input_item_id maxitem() const { return m_maxitem; }
- void *internal() const { return m_internal; }
- joystick_map &joymap() { return m_joymap; }
- bool steadykey_enabled() const { return m_steadykey_enabled; }
- bool lightgun_reload_button() const { return m_lightgun_reload_button; }
-
- // setters
- void set_devindex(int devindex) { m_devindex = devindex; }
-
- // item management
- input_item_id add_item(const char *name, input_item_id itemid, item_get_state_func getstate, void *internal = nullptr);
- void set_joystick_map(const joystick_map &map) { m_joymap = map; }
-
- // helpers
- int32_t apply_deadzone_and_saturation(int32_t value) const;
- void apply_steadykey() const;
- bool match_device_id(const char * deviceid);
-
-private:
- // internal state
- input_class & m_class; // reference to our class
- std::string m_name; // string name of device
- std::string m_id; // id of device
- int m_devindex; // device index of this device
- std::unique_ptr<input_device_item> m_item[ITEM_ID_ABSOLUTE_MAXIMUM+1]; // array of pointers to items
- input_item_id m_maxitem; // maximum item index
- void * m_internal; // internal callback pointer
-
- // joystick information
- joystick_map m_joymap; // joystick map for this device
- int32_t m_joystick_deadzone; // deadzone for joystick
- int32_t m_joystick_saturation; // saturation position for joystick
- bool m_steadykey_enabled; // steadykey enabled for keyboards
- bool m_lightgun_reload_button; // lightgun reload hack
-};
-
-
-// ======================> input_class
-
-// a class of device that provides input
-class input_class
-{
-public:
- // construction/destruction
- input_class(input_manager &manager, input_device_class devclass, bool enabled = false, bool multi = false);
-
- // getters
- input_manager &manager() const { return m_manager; }
- running_machine &machine() const;
- input_device *device(int index) const { return (index <= m_maxindex) ? m_device[index].get() : nullptr; }
- input_device_class devclass() const { return m_devclass; }
- int maxindex() const { return m_maxindex; }
- bool enabled() const { return m_enabled; }
- bool multi() const { return m_multi; }
-
- // setters
- void enable(bool state = true) { m_enabled = state; }
- void set_multi(bool multi = true) { m_multi = multi; }
-
- // device management
- input_device *add_device(const char *name, const char *id, void *internal = nullptr);
- input_device *add_device(int devindex, const char *name, const char *id, void *internal = nullptr);
-
- // misc helpers
- input_item_class standard_item_class(input_item_id itemid);
- void remap_device_index(int oldindex, int newindex);
-
-private:
- // internal helpers
- void frame_callback();
-
- // internal state
- input_manager & m_manager; // reference to our manager
- std::unique_ptr<input_device> m_device[DEVICE_INDEX_MAXIMUM]; // array of devices in this class
- input_device_class m_devclass; // our device class
- int m_maxindex; // maximum populated index
- bool m_enabled; // is this class enabled?
- bool m_multi; // are multiple instances of this class allowed?
-};
-
-
// ======================> input_manager
// global machine-level information about devices
@@ -652,10 +452,11 @@ class input_manager
public:
// construction/destruction
input_manager(running_machine &machine);
+ ~input_manager();
// getters
running_machine &machine() const { return m_machine; }
- input_class &device_class(input_device_class devclass) { assert(devclass < ARRAY_LENGTH(m_class)); assert(m_class[devclass] != nullptr); return *m_class[devclass]; }
+ input_class &device_class(input_device_class devclass) { assert(devclass >= DEVICE_CLASS_FIRST_VALID && devclass <= DEVICE_CLASS_LAST_VALID); return *m_class[devclass]; }
// input code readers
int32_t code_value(input_code code);
@@ -675,6 +476,7 @@ public:
std::string code_name(input_code code) const;
std::string code_to_token(input_code code) const;
input_code code_from_token(const char *_token);
+ const char *standard_token(input_item_id itemid) const;
// input sequence readers
bool seq_pressed(const input_seq &seq);
@@ -691,7 +493,6 @@ public:
void seq_from_tokens(input_seq &seq, const char *_token);
// misc
- bool set_global_joystick_map(const char *mapstring);
bool map_device_to_controller(const devicemap_table_type *devicemap_table = nullptr);
private:
@@ -704,11 +505,7 @@ private:
input_code m_switch_memory[64];
// classes
- input_class m_keyboard_class;
- input_class m_mouse_class;
- input_class m_joystick_class;
- input_class m_lightgun_class;
- input_class * m_class[DEVICE_CLASS_MAXIMUM];
+ std::array<std::unique_ptr<input_class>, DEVICE_CLASS_MAXIMUM> m_class;
// sequence polling state
input_seq m_poll_seq;
@@ -1165,32 +962,4 @@ private:
-//**************************************************************************
-// GLOBAL VARIABLES
-//**************************************************************************
-
-// joystick maps
-extern const char joystick_map_8way[];
-extern const char joystick_map_4way_diagonal[];
-
-
-//**************************************************************************
-// INLINE FUNCTIONS
-//**************************************************************************
-
-// input_device_item helpers
-inline input_manager &input_device_item::manager() const { return m_device.manager(); }
-inline running_machine &input_device_item::machine() const { return m_device.machine(); }
-inline int32_t input_device_item::update_value() { return m_current = (*m_getstate)(m_device.internal(), m_internal); }
-
-// input_device helpers
-inline input_manager &input_device::manager() const { return m_class.manager(); }
-inline running_machine &input_device::machine() const { return m_class.machine(); }
-inline input_device_class input_device::devclass() const { return m_class.devclass(); }
-
-// input_class helpers
-inline running_machine &input_class::machine() const { return m_manager.machine(); }
-
-
-
#endif // __INPUT_H__