Esempio n. 1
0
        //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());
        }
Esempio n. 2
0
        // readers
        //-------------------------------------------------
        //  read_as_switch - return the raw switch value,
        //  modified as necessary
        //-------------------------------------------------
        public override int read_as_switch(input_item_modifier modifier)
        {
            // if we're doing a lightgun reload hack, button 1 and 2 operate differently
            input_device_class devclass = device().devclass();

            if (devclass == input_device_class.DEVICE_CLASS_LIGHTGUN && device().lightgun_reload_button())
            {
                // button 1 is pressed if either button 1 or 2 are active
                if (itemid() == input_item_id.ITEM_ID_BUTTON1)
                {
                    input_device_item button2_item = device().item(input_item_id.ITEM_ID_BUTTON2);
                    if (button2_item != null)
                    {
                        return(button2_item.update_value() | update_value());
                    }
                }

                // button 2 is never officially pressed
                if (itemid() == input_item_id.ITEM_ID_BUTTON2)
                {
                    return(0);
                }
            }

            // steadykey for keyboards
            if (devclass == input_device_class.DEVICE_CLASS_KEYBOARD && device().steadykey_enabled())
            {
                return(m_steadykey);
            }

            // everything else is just the current value as-is
            return(update_value());
        }
Esempio n. 3
0
        // helpers
        //-------------------------------------------------
        //  apply_steadykey - apply steadykey option
        //-------------------------------------------------
        public void apply_steadykey()
        {
            // ignore if not enabled
            if (!steadykey_enabled())
            {
                return;
            }

            // update the state of all the keys and see if any changed state
            bool anything_changed = false;

            for (input_item_id itemid = input_item_id.ITEM_ID_FIRST_VALID; itemid <= maxitem(); ++itemid)
            {
                input_device_item itm = item(itemid);
                if (itm != null && itm.itemclass() == input_item_class.ITEM_CLASS_SWITCH)
                {
                    if (((input_device_switch_item)itm).steadykey_changed())
                    {
                        anything_changed = true;
                    }
                }
            }

            // if the keyboard state is stable, flush the current state
            if (!anything_changed)
            {
                for (input_item_id itemid = input_item_id.ITEM_ID_FIRST_VALID; itemid <= maxitem(); ++itemid)
                {
                    input_device_item itm = item(itemid);
                    if (itm != null && itm.itemclass() == input_item_class.ITEM_CLASS_SWITCH)
                    {
                        ((input_device_switch_item)itm).steadykey_update_to_current();
                    }
                }
            }
        }
Esempio n. 4
0
        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);
        }