// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once namespace Input { class InputDevice; template class Factory; }; // namespace Input namespace InputCommon { class InputEngine; class OutputFactory final : public Common::Input::Factory { public: explicit OutputFactory(std::shared_ptr input_engine_); /** * Creates an output device from the parameters given. * @param params contains parameters for creating the device: * - "guid" text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique output device with the parameters specified */ std::unique_ptr Create( const Common::ParamPackage& params) override; private: std::shared_ptr input_engine; }; /** * An Input factory. It receives input events and forward them to all input devices it created. */ class InputFactory final : public Common::Input::Factory { public: explicit InputFactory(std::shared_ptr input_engine_); /** * Creates an input device from the parameters given. Identifies the type of input to be * returned if it contains the following parameters: * - button: Contains "button" or "code" * - hat_button: Contains "hat" * - analog: Contains "axis" * - trigger: Contains "button" and "axis" * - stick: Contains "axis_x" and "axis_y" * - motion: Contains "axis_x", "axis_y" and "axis_z" * - motion: Contains "motion" * - touch: Contains "button", "axis_x" and "axis_y" * - battery: Contains "battery" * - output: Contains "output" * @param params contains parameters for creating the device: * - "code": the code of the keyboard key to bind with the input * - "button": same as "code" but for controller buttons * - "hat": similar as "button" but it's a group of hat buttons from SDL * - "axis": the axis number of the axis to bind with the input * - "motion": the motion number of the motion to bind with the input * - "axis_x": same as axis but specifying horizontal direction * - "axis_y": same as axis but specifying vertical direction * - "axis_z": same as axis but specifying forward direction * - "battery": Only used as a placeholder to set the input type * @returns a unique input device with the parameters specified */ std::unique_ptr Create(const Common::ParamPackage& params) override; private: /** * Creates a button device from the parameters given. * @param params contains parameters for creating the device: * - "code": the code of the keyboard key to bind with the input * - "button": same as "code" but for controller buttons * - "toggle": press once to enable, press again to disable * - "inverted": inverts the output of the button * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateButtonDevice( const Common::ParamPackage& params); /** * Creates a hat button device from the parameters given. * @param params contains parameters for creating the device: * - "button": the controller hat id to bind with the input * - "direction": the direction id to be detected * - "toggle": press once to enable, press again to disable * - "inverted": inverts the output of the button * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateHatButtonDevice( const Common::ParamPackage& params); /** * Creates a stick device from the parameters given. * @param params contains parameters for creating the device: * - "axis_x": the controller horizontal axis id to bind with the input * - "axis_y": the controller vertical axis id to bind with the input * - "deadzone": the minimum required value to be detected * - "range": the maximum value required to reach 100% * - "threshold": the minimum required value to considered pressed * - "offset_x": the amount of offset in the x axis * - "offset_y": the amount of offset in the y axis * - "invert_x": inverts the sign of the horizontal axis * - "invert_y": inverts the sign of the vertical axis * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateStickDevice( const Common::ParamPackage& params); /** * Creates an analog device from the parameters given. * @param params contains parameters for creating the device: * - "axis": the controller axis id to bind with the input * - "deadzone": the minimum required value to be detected * - "range": the maximum value required to reach 100% * - "threshold": the minimum required value to considered pressed * - "offset": the amount of offset in the axis * - "invert": inverts the sign of the axis * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateAnalogDevice( const Common::ParamPackage& params); /** * Creates a trigger device from the parameters given. * @param params contains parameters for creating the device: * - "button": the controller hat id to bind with the input * - "direction": the direction id to be detected * - "toggle": press once to enable, press again to disable * - "inverted": inverts the output of the button * - "axis": the controller axis id to bind with the input * - "deadzone": the minimum required value to be detected * - "range": the maximum value required to reach 100% * - "threshold": the minimum required value to considered pressed * - "offset": the amount of offset in the axis * - "invert": inverts the sign of the axis * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateTriggerDevice( const Common::ParamPackage& params); /** * Creates a touch device from the parameters given. * @param params contains parameters for creating the device: * - "button": the controller hat id to bind with the input * - "direction": the direction id to be detected * - "toggle": press once to enable, press again to disable * - "inverted": inverts the output of the button * - "axis_x": the controller horizontal axis id to bind with the input * - "axis_y": the controller vertical axis id to bind with the input * - "deadzone": the minimum required value to be detected * - "range": the maximum value required to reach 100% * - "threshold": the minimum required value to considered pressed * - "offset_x": the amount of offset in the x axis * - "offset_y": the amount of offset in the y axis * - "invert_x": inverts the sign of the horizontal axis * - "invert_y": inverts the sign of the vertical axis * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateTouchDevice( const Common::ParamPackage& params); /** * Creates a battery device from the parameters given. * @param params contains parameters for creating the device: * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateBatteryDevice( const Common::ParamPackage& params); /** * Creates a color device from the parameters given. * @param params contains parameters for creating the device: * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateColorDevice( const Common::ParamPackage& params); /** * Creates a motion device from the parameters given. * @param params contains parameters for creating the device: * - "axis_x": the controller horizontal axis id to bind with the input * - "axis_y": the controller vertical axis id to bind with the input * - "axis_z": the controller forward axis id to bind with the input * - "deadzone": the minimum required value to be detected * - "range": the maximum value required to reach 100% * - "offset_x": the amount of offset in the x axis * - "offset_y": the amount of offset in the y axis * - "offset_z": the amount of offset in the z axis * - "invert_x": inverts the sign of the horizontal axis * - "invert_y": inverts the sign of the vertical axis * - "invert_z": inverts the sign of the forward axis * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateMotionDevice(Common::ParamPackage params); /** * Creates a camera device from the parameters given. * @param params contains parameters for creating the device: * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateCameraDevice( const Common::ParamPackage& params); /** * Creates a nfc device from the parameters given. * @param params contains parameters for creating the device: * - "guid": text string for identifying controllers * - "port": port of the connected device * - "pad": slot of the connected controller * @returns a unique input device with the parameters specified */ std::unique_ptr CreateNfcDevice(const Common::ParamPackage& params); std::shared_ptr input_engine; }; } // namespace InputCommon