public input_device add_device(input_device new_device) { assert(new_device.devclass() == m_devclass); // find the next empty index for (int devindex = 0; devindex < input_global.DEVICE_INDEX_MAXIMUM; devindex++) { if (m_device[devindex] == null) { // update the device and maximum index found new_device.set_devindex(devindex); m_maxindex = Math.Max(m_maxindex, devindex); if (new_device.id()[0] == 0) { osd_printf_verbose("Input: Adding {0} #{1}: {2}\n", m_name, devindex, new_device.name()); } else { osd_printf_verbose("Input: Adding {0} #{1}: {2} (device id: {3})\n", m_name, devindex, new_device.name(), new_device.id()); } m_device[devindex] = new_device; return(m_device[devindex]); } } throw new emu_fatalerror("Input: Too many {0} devices\n", m_name); }
//virtual ~input_code_poller(); public virtual void reset() { // iterate over device classes and devices m_axis_memory.clear(); m_switch_memory.clear(); for (input_device_class classno = input_device_class.DEVICE_CLASS_FIRST_VALID; input_device_class.DEVICE_CLASS_LAST_VALID >= classno; ++classno) { input_class devclass = m_manager.device_class(classno); if (devclass.enabled()) { for (int devnum = 0; devclass.maxindex() >= devnum; ++devnum) { // fetch the device; ignore if nullptr input_device device = devclass.device(devnum); if (device != null) { // iterate over items within each device for (input_item_id itemid = input_item_id.ITEM_ID_FIRST_VALID; device.maxitem() >= itemid; ++itemid) { // for any non-switch items, set memory to the current value input_device_item item = device.item(itemid); if (item != null && (item.itemclass() != input_item_class.ITEM_CLASS_SWITCH)) { m_axis_memory.emplace_back(new std.pair <input_device_item, s32>(item, m_manager.code_value(item.code()))); } } } } } } m_axis_memory.Sort(); //std::sort(m_axis_memory.begin(), m_axis_memory.end()); }
s32 m_memory; // "memory" value, to remember where we started during polling // construction/destruction //------------------------------------------------- // input_device_item - constructor //------------------------------------------------- protected input_device_item(input_device device, string name, object internalobj, input_item_id itemid, item_get_state_func getstate, input_item_class itemclass) { m_device = device; m_name = name; m_internal = internalobj; m_itemid = itemid; m_itemclass = itemclass; m_getstate = getstate; m_current = 0; m_memory = 0; // use a standard token name for know item IDs string standard_token = manager().standard_token(itemid); if (standard_token != null) { m_token = standard_token; } // otherwise, create a tokenized name else { m_token = name; m_token = m_token.ToUpper(); m_token = m_token.Replace(" ", ""); //strdelchr(m_token, ' '); m_token = m_token.Replace("_", ""); //strdelchr(m_token, '_'); } }
public override input_code poll() { // iterate over device classes and devices, skipping disabled classes for (input_device_class classno = input_device_class.DEVICE_CLASS_FIRST_VALID; input_device_class.DEVICE_CLASS_LAST_VALID >= classno; ++classno) { input_class devclass = m_manager.device_class(classno); if (!devclass.enabled()) { continue; } for (int devnum = 0; devclass.maxindex() >= devnum; ++devnum) { // fetch the device; ignore if nullptr input_device device = devclass.device(devnum); if (device == null) { continue; } // iterate over items within each device for (input_item_id itemid = input_item_id.ITEM_ID_FIRST_VALID; device.maxitem() >= itemid; ++itemid) { input_device_item item = device.item(itemid); if (item == null) { continue; } input_code code = item.code(); if (item.itemclass() == input_item_class.ITEM_CLASS_SWITCH) { // item is natively a switch, poll it if (code_pressed_once(code, true)) { return(code); } else { continue; } } throw new emu_unimplemented(); #if false var memory = std.lower_bound( m_axis_memory, item, (std.pair <input_device_item, s32> x, input_device_item y) => { return(x.first < y); }); if ((m_axis_memory.end() == memory) || (item != memory.first)) //if ((m_axis_memory.end() == memory) || (item != memory->first)) { continue; } // poll axes digitally bool moved = item.check_axis(code.item_modifier(), memory.second); code.set_item_class(input_item_class.ITEM_CLASS_SWITCH); if ((classno == input_device_class.DEVICE_CLASS_JOYSTICK) && (code.item_id() == input_item_id.ITEM_ID_XAXIS)) { // joystick X axis - check with left/right modifiers code.set_item_modifier(input_item_modifier.ITEM_MODIFIER_LEFT); if (code_pressed_once(code, moved)) { return(code); } code.set_item_modifier(input_item_modifier.ITEM_MODIFIER_RIGHT); if (code_pressed_once(code, moved)) { return(code); } } else if ((classno == input_device_class.DEVICE_CLASS_JOYSTICK) && (code.item_id() == input_item_id.ITEM_ID_YAXIS)) { // if this is a joystick Y axis, check with up/down modifiers code.set_item_modifier(input_item_modifier.ITEM_MODIFIER_UP); if (code_pressed_once(code, moved)) { return(code); } code.set_item_modifier(input_item_modifier.ITEM_MODIFIER_DOWN); if (code_pressed_once(code, moved)) { return(code); } } else { // any other axis, check with pos/neg modifiers code.set_item_modifier(input_item_modifier.ITEM_MODIFIER_POS); if (code_pressed_once(code, moved)) { return(code); } code.set_item_modifier(input_item_modifier.ITEM_MODIFIER_NEG); if (code_pressed_once(code, moved)) { return(code); } } #endif } } } // if nothing, return an invalid code return(input_code.INPUT_CODE_INVALID); }
int m_oldkey; // old live state // construction/destruction //------------------------------------------------- // input_device_switch_item - constructor //------------------------------------------------- public input_device_switch_item(input_device device, string name, object internalobj, input_item_id itemid, item_get_state_func getstate) : base(device, name, internalobj, itemid, getstate, input_item_class.ITEM_CLASS_SWITCH) { m_steadykey = 0; m_oldkey = 0; }
// construction/destruction //------------------------------------------------- // input_device_absolute_item - constructor //------------------------------------------------- public input_device_absolute_item(input_device device, string name, object internalobj, input_item_id itemid, item_get_state_func getstate) : base(device, name, internalobj, itemid, getstate, input_item_class.ITEM_CLASS_ABSOLUTE) { }
// construction/destruction //------------------------------------------------- // input_device_relative_item - constructor //------------------------------------------------- public input_device_relative_item(input_device device, string name, object internalobj, input_item_id itemid, item_get_state_func getstate) : base(device, name, internalobj, itemid, getstate, input_item_class.ITEM_CLASS_RELATIVE) { }