From 8cdf8dec703d882b46ca50a769fabb95ffc48e2c Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 24 Nov 2016 21:27:41 +0100 Subject: sync with upstream --- .../include/kodi/kodi_peripheral_utils.hpp | 178 ++++++++++----------- 1 file changed, 81 insertions(+), 97 deletions(-) (limited to 'xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_utils.hpp') diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_utils.hpp b/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_utils.hpp index 4423cb4..f01180b 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_utils.hpp +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/kodi_peripheral_utils.hpp @@ -21,6 +21,7 @@ #include "kodi_peripheral_types.h" +#include // Requires c++11 #include #include #include @@ -204,6 +205,7 @@ namespace ADDON JOYSTICK_STATE_BUTTON ButtonState(void) const { return m_event.driver_button_state; } JOYSTICK_STATE_HAT HatState(void) const { return m_event.driver_hat_state; } JOYSTICK_STATE_AXIS AxisState(void) const { return m_event.driver_axis_state; } + JOYSTICK_STATE_MOTOR MotorState(void) const { return m_event.motor_state; } void SetType(PERIPHERAL_EVENT_TYPE type) { m_event.type = type; } void SetPeripheralIndex(unsigned int index) { m_event.peripheral_index = index; } @@ -211,6 +213,7 @@ namespace ADDON void SetButtonState(JOYSTICK_STATE_BUTTON state) { m_event.driver_button_state = state; } void SetHatState(JOYSTICK_STATE_HAT state) { m_event.driver_hat_state = state; } void SetAxisState(JOYSTICK_STATE_AXIS state) { m_event.driver_axis_state = state; } + void SetMotorState(JOYSTICK_STATE_MOTOR state) { m_event.motor_state = state; } void ToStruct(PERIPHERAL_EVENT& event) const { @@ -243,7 +246,9 @@ namespace ADDON m_requestedPort(NO_PORT_REQUESTED), m_buttonCount(0), m_hatCount(0), - m_axisCount(0) + m_axisCount(0), + m_motorCount(0), + m_supportsPowerOff(false) { } @@ -258,7 +263,9 @@ namespace ADDON m_requestedPort(info.requested_port), m_buttonCount(info.button_count), m_hatCount(info.hat_count), - m_axisCount(info.axis_count) + m_axisCount(info.axis_count), + m_motorCount(info.motor_count), + m_supportsPowerOff(info.supports_poweroff) { } @@ -275,6 +282,8 @@ namespace ADDON m_buttonCount = rhs.m_buttonCount; m_hatCount = rhs.m_hatCount; m_axisCount = rhs.m_axisCount; + m_motorCount = rhs.m_motorCount; + m_supportsPowerOff = rhs.m_supportsPowerOff; } return *this; } @@ -284,6 +293,8 @@ namespace ADDON unsigned int ButtonCount(void) const { return m_buttonCount; } unsigned int HatCount(void) const { return m_hatCount; } unsigned int AxisCount(void) const { return m_axisCount; } + unsigned int MotorCount(void) const { return m_motorCount; } + bool SupportsPowerOff(void) const { return m_supportsPowerOff; } // Derived property: Counts are unknown if all are zero bool AreElementCountsKnown(void) const { return m_buttonCount != 0 || m_hatCount != 0 || m_axisCount != 0; } @@ -293,6 +304,8 @@ namespace ADDON void SetButtonCount(unsigned int buttonCount) { m_buttonCount = buttonCount; } void SetHatCount(unsigned int hatCount) { m_hatCount = hatCount; } void SetAxisCount(unsigned int axisCount) { m_axisCount = axisCount; } + void SetMotorCount(unsigned int motorCount) { m_motorCount = motorCount; } + void SetSupportsPowerOff(bool supportsPowerOff) { m_supportsPowerOff = supportsPowerOff; } void ToStruct(JOYSTICK_INFO& info) const { @@ -303,6 +316,8 @@ namespace ADDON info.button_count = m_buttonCount; info.hat_count = m_hatCount; info.axis_count = m_axisCount; + info.motor_count = m_motorCount; + info.supports_poweroff = m_supportsPowerOff; std::strcpy(info.provider, m_provider.c_str()); } @@ -320,6 +335,8 @@ namespace ADDON unsigned int m_buttonCount; unsigned int m_hatCount; unsigned int m_axisCount; + unsigned int m_motorCount; + bool m_supportsPowerOff; }; typedef PeripheralVector Joysticks; @@ -332,6 +349,7 @@ namespace ADDON * 1) a button * 2) a hat direction * 3) a semiaxis (either the positive or negative half of an axis) + * 4) a motor * * The type determines the fields in use: * @@ -345,9 +363,24 @@ namespace ADDON * Semiaxis: * - driver index * - semiaxis direction + * + * Motor: + * - driver index */ - class DriverPrimitive + struct DriverPrimitive { + protected: + /*! + * \brief Construct a driver primitive of the specified type + */ + DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE type, unsigned int driverIndex) : + m_type(type), + m_driverIndex(driverIndex), + m_hatDirection(JOYSTICK_DRIVER_HAT_UNKNOWN), + m_semiAxisDirection(JOYSTICK_DRIVER_SEMIAXIS_UNKNOWN) + { + } + public: /*! * \brief Construct an invalid driver primitive @@ -363,12 +396,9 @@ namespace ADDON /*! * \brief Construct a driver primitive representing a button */ - DriverPrimitive(unsigned int buttonIndex) : - m_type(JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON), - m_driverIndex(buttonIndex), - m_hatDirection(JOYSTICK_DRIVER_HAT_UNKNOWN), - m_semiAxisDirection(JOYSTICK_DRIVER_SEMIAXIS_UNKNOWN) + static DriverPrimitive CreateButton(unsigned int buttonIndex) { + return DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON, buttonIndex); } /*! @@ -395,6 +425,14 @@ namespace ADDON { } + /*! + * \brief Construct a driver primitive representing a motor + */ + static DriverPrimitive CreateMotor(unsigned int motorIndex) + { + return DriverPrimitive(JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR, motorIndex); + } + DriverPrimitive(const JOYSTICK_DRIVER_PRIMITIVE& primitive) : m_type(primitive.type), m_driverIndex(0), @@ -420,6 +458,11 @@ namespace ADDON m_semiAxisDirection = primitive.semiaxis.direction; break; } + case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR: + { + m_driverIndex = primitive.motor.index; + break; + } default: break; } @@ -437,6 +480,7 @@ namespace ADDON switch (m_type) { case JOYSTICK_DRIVER_PRIMITIVE_TYPE_BUTTON: + case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR: { return m_driverIndex == other.m_driverIndex; } @@ -479,11 +523,21 @@ namespace ADDON driver_primitive.semiaxis.direction = m_semiAxisDirection; break; } + case JOYSTICK_DRIVER_PRIMITIVE_TYPE_MOTOR: + { + driver_primitive.motor.index = m_driverIndex; + break; + } default: break; } } + static void FreeStruct(JOYSTICK_DRIVER_PRIMITIVE& primitive) + { + (void)primitive; + } + private: JOYSTICK_DRIVER_PRIMITIVE_TYPE m_type; unsigned int m_driverIndex; @@ -491,6 +545,8 @@ namespace ADDON JOYSTICK_DRIVER_SEMIAXIS_DIRECTION m_semiAxisDirection; }; + typedef PeripheralVector DriverPrimitives; + /*! * ADDON::JoystickFeature * @@ -499,44 +555,20 @@ namespace ADDON * 1) scalar[1] * 2) analog stick * 3) accelerometer + * 4) motor * * [1] All three driver primitives (buttons, hats and axes) have a state that * can be represented using a single scalar value. For this reason, * features that map to a single primitive are called "scalar features". - * - * Features can be mapped to a variable number of driver primitives. The names - * of the primitives for each feature are: - * - * Scalar feature: - * - primitive - * - * Analog stick: - * - up - * - down - * - right - * - left - * - * Accelerometer: - * - positive X - * - positive Y - * - positive Z */ class JoystickFeature { public: - const unsigned int MAX_PRIMITIVES = 4; - - JoystickFeature(void) : - m_type(JOYSTICK_FEATURE_TYPE_UNKNOWN) - { - m_primitives.resize(MAX_PRIMITIVES); - } - - JoystickFeature(const std::string& name, JOYSTICK_FEATURE_TYPE type) : + JoystickFeature(const std::string& name = "", JOYSTICK_FEATURE_TYPE type = JOYSTICK_FEATURE_TYPE_UNKNOWN) : m_name(name), - m_type(type) + m_type(type), + m_primitives() { - m_primitives.resize(MAX_PRIMITIVES); } JoystickFeature(const JoystickFeature& other) @@ -548,26 +580,8 @@ namespace ADDON m_name(feature.name ? feature.name : ""), m_type(feature.type) { - m_primitives.resize(MAX_PRIMITIVES); - switch (m_type) - { - case JOYSTICK_FEATURE_TYPE_SCALAR: - SetPrimitive(feature.scalar.primitive); - break; - case JOYSTICK_FEATURE_TYPE_ANALOG_STICK: - SetUp(feature.analog_stick.up); - SetDown(feature.analog_stick.down); - SetRight(feature.analog_stick.right); - SetLeft(feature.analog_stick.left); - break; - case JOYSTICK_FEATURE_TYPE_ACCELEROMETER: - SetPositiveX(feature.accelerometer.positive_x); - SetPositiveY(feature.accelerometer.positive_y); - SetPositiveZ(feature.accelerometer.positive_z); - break; - default: - break; - } + for (unsigned int i = 0; i < JOYSTICK_PRIMITIVE_MAX; i++) + m_primitives[i] = feature.primitives[i]; } JoystickFeature& operator=(const JoystickFeature& rhs) @@ -590,55 +604,25 @@ namespace ADDON const std::string& Name(void) const { return m_name; } JOYSTICK_FEATURE_TYPE Type(void) const { return m_type; } + bool IsValid() const { return m_type != JOYSTICK_FEATURE_TYPE_UNKNOWN; } void SetName(const std::string& name) { m_name = name; } void SetType(JOYSTICK_FEATURE_TYPE type) { m_type = type; } + void SetInvalid(void) { m_type = JOYSTICK_FEATURE_TYPE_UNKNOWN; } + + const DriverPrimitive& Primitive(JOYSTICK_FEATURE_PRIMITIVE which) const { return m_primitives[which]; } + void SetPrimitive(JOYSTICK_FEATURE_PRIMITIVE which, const DriverPrimitive& primitive) { m_primitives[which] = primitive; } - // Scalar methods - const DriverPrimitive& Primitive(void) const { return m_primitives[0]; } - void SetPrimitive(const DriverPrimitive& primitive) { m_primitives[0] = primitive; } - - // Analog stick methods - const DriverPrimitive& Up(void) const { return m_primitives[0]; } - const DriverPrimitive& Down(void) const { return m_primitives[1]; } - const DriverPrimitive& Right(void) const { return m_primitives[2]; } - const DriverPrimitive& Left(void) const { return m_primitives[3]; } - void SetUp(const DriverPrimitive& primitive) { m_primitives[0] = primitive; } - void SetDown(const DriverPrimitive& primitive) { m_primitives[1] = primitive; } - void SetRight(const DriverPrimitive& primitive) { m_primitives[2] = primitive; } - void SetLeft(const DriverPrimitive& primitive) { m_primitives[3] = primitive; } - - // Accelerometer methods - const DriverPrimitive& PositiveX(void) const { return m_primitives[0]; } - const DriverPrimitive& PositiveY(void) const { return m_primitives[1]; } - const DriverPrimitive& PositiveZ(void) const { return m_primitives[2]; } - void SetPositiveX(const DriverPrimitive& primitive) { m_primitives[0] = primitive; } - void SetPositiveY(const DriverPrimitive& primitive) { m_primitives[1] = primitive; } - void SetPositiveZ(const DriverPrimitive& primitive) { m_primitives[2] = primitive; } + std::array& Primitives() { return m_primitives; } + const std::array& Primitives() const { return m_primitives; } void ToStruct(JOYSTICK_FEATURE& feature) const { feature.name = new char[m_name.length() + 1]; feature.type = m_type; - switch (m_type) - { - case JOYSTICK_FEATURE_TYPE_SCALAR: - Primitive().ToStruct(feature.scalar.primitive); - break; - case JOYSTICK_FEATURE_TYPE_ANALOG_STICK: - Up().ToStruct(feature.analog_stick.up); - Down().ToStruct(feature.analog_stick.down); - Right().ToStruct(feature.analog_stick.right); - Left().ToStruct(feature.analog_stick.left); - break; - case JOYSTICK_FEATURE_TYPE_ACCELEROMETER: - PositiveX().ToStruct(feature.accelerometer.positive_x); - PositiveY().ToStruct(feature.accelerometer.positive_y); - PositiveZ().ToStruct(feature.accelerometer.positive_z); - break; - default: - break; - } + for (unsigned int i = 0; i < JOYSTICK_PRIMITIVE_MAX; i++) + m_primitives[i].ToStruct(feature.primitives[i]); + std::strcpy(feature.name, m_name.c_str()); } @@ -650,7 +634,7 @@ namespace ADDON private: std::string m_name; JOYSTICK_FEATURE_TYPE m_type; - std::vector m_primitives; + std::array m_primitives; }; typedef PeripheralVector JoystickFeatures; -- cgit v1.2.3