summaryrefslogtreecommitdiffstats
path: root/xbmc/peripherals/addons/PeripheralAddon.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/peripherals/addons/PeripheralAddon.h')
-rw-r--r--xbmc/peripherals/addons/PeripheralAddon.h178
1 files changed, 178 insertions, 0 deletions
diff --git a/xbmc/peripherals/addons/PeripheralAddon.h b/xbmc/peripherals/addons/PeripheralAddon.h
new file mode 100644
index 0000000..2dd9d22
--- /dev/null
+++ b/xbmc/peripherals/addons/PeripheralAddon.h
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2014-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "addons/binary-addons/AddonInstanceHandler.h"
+#include "addons/kodi-dev-kit/include/kodi/addon-instance/Peripheral.h"
+#include "input/joysticks/JoystickTypes.h"
+#include "peripherals/PeripheralTypes.h"
+#include "threads/CriticalSection.h"
+#include "threads/SharedSection.h"
+
+#include <map>
+#include <memory>
+#include <vector>
+
+class CFileItemList;
+
+namespace KODI
+{
+namespace JOYSTICK
+{
+class IButtonMap;
+class IDriverHandler;
+} // namespace JOYSTICK
+} // namespace KODI
+
+namespace PERIPHERALS
+{
+class CPeripheral;
+class CPeripheralJoystick;
+class CPeripherals;
+
+typedef std::vector<kodi::addon::DriverPrimitive> PrimitiveVector;
+typedef std::map<KODI::JOYSTICK::FeatureName, kodi::addon::JoystickFeature> FeatureMap;
+
+class CPeripheralAddon : public ADDON::IAddonInstanceHandler
+{
+public:
+ explicit CPeripheralAddon(const ADDON::AddonInfoPtr& addonInfo, CPeripherals& manager);
+ ~CPeripheralAddon(void) override;
+
+ /*!
+ * @brief Initialise the instance of this add-on
+ */
+ bool CreateAddon(void);
+
+ /*!
+ * \brief Deinitialize the instance of this add-on
+ */
+ void DestroyAddon();
+
+ bool Register(unsigned int peripheralIndex, const PeripheralPtr& peripheral);
+ void UnregisterRemovedDevices(const PeripheralScanResults& results,
+ PeripheralVector& removedPeripherals);
+ void GetFeatures(std::vector<PeripheralFeature>& features) const;
+ bool HasFeature(const PeripheralFeature feature) const;
+ PeripheralPtr GetPeripheral(unsigned int index) const;
+ PeripheralPtr GetByPath(const std::string& strPath) const;
+ bool SupportsFeature(PeripheralFeature feature) const;
+ unsigned int GetPeripheralsWithFeature(PeripheralVector& results,
+ const PeripheralFeature feature) const;
+ unsigned int GetNumberOfPeripherals(void) const;
+ unsigned int GetNumberOfPeripheralsWithId(const int iVendorId, const int iProductId) const;
+ void GetDirectory(const std::string& strPath, CFileItemList& items) const;
+
+ /** @name Peripheral add-on methods */
+ //@{
+ bool PerformDeviceScan(PeripheralScanResults& results);
+ bool ProcessEvents(void);
+ bool SendRumbleEvent(unsigned int index, unsigned int driverIndex, float magnitude);
+ //@}
+
+ /** @name Joystick methods */
+ //@{
+ bool GetJoystickProperties(unsigned int index, CPeripheralJoystick& joystick);
+ bool HasButtonMaps(void) const { return m_bProvidesButtonMaps; }
+ bool GetFeatures(const CPeripheral* device,
+ const std::string& strControllerId,
+ FeatureMap& features);
+ bool MapFeature(const CPeripheral* device,
+ const std::string& strControllerId,
+ const kodi::addon::JoystickFeature& feature);
+ bool GetIgnoredPrimitives(const CPeripheral* device, PrimitiveVector& primitives);
+ bool SetIgnoredPrimitives(const CPeripheral* device, const PrimitiveVector& primitives);
+ void SaveButtonMap(const CPeripheral* device);
+ void RevertButtonMap(const CPeripheral* device);
+ void ResetButtonMap(const CPeripheral* device, const std::string& strControllerId);
+ void PowerOffJoystick(unsigned int index);
+ //@}
+
+ void RegisterButtonMap(CPeripheral* device, KODI::JOYSTICK::IButtonMap* buttonMap);
+ void UnregisterButtonMap(KODI::JOYSTICK::IButtonMap* buttonMap);
+
+ static bool ProvidesJoysticks(const ADDON::AddonInfoPtr& addonInfo);
+ static bool ProvidesButtonMaps(const ADDON::AddonInfoPtr& addonInfo);
+
+private:
+ void UnregisterButtonMap(CPeripheral* device);
+
+ // Binary add-on callbacks
+ void TriggerDeviceScan();
+ void RefreshButtonMaps(const std::string& strDeviceName = "");
+ unsigned int FeatureCount(const std::string& controllerId, JOYSTICK_FEATURE_TYPE type) const;
+ JOYSTICK_FEATURE_TYPE FeatureType(const std::string& controllerId,
+ const std::string& featureName) const;
+
+ /*!
+ * @brief Helper functions
+ */
+ static void GetPeripheralInfo(const CPeripheral* device, kodi::addon::Peripheral& peripheralInfo);
+
+ static void GetJoystickInfo(const CPeripheral* device, kodi::addon::Joystick& joystickInfo);
+ static void SetJoystickInfo(CPeripheralJoystick& joystick,
+ const kodi::addon::Joystick& joystickInfo);
+
+ /*!
+ * @brief Reset all class members to their defaults. Called by the constructors
+ */
+ void ResetProperties(void);
+
+ /*!
+ * @brief Retrieve add-on properties from the add-on
+ */
+ bool GetAddonProperties(void);
+
+ bool LogError(const PERIPHERAL_ERROR error, const char* strMethod) const;
+
+ static std::string GetDeviceName(PeripheralType type);
+ static std::string GetProvider(PeripheralType type);
+
+ // Construction parameters
+ CPeripherals& m_manager;
+
+ /* @brief Cache for const char* members in PERIPHERAL_PROPERTIES */
+ std::string m_strUserPath; /*!< @brief translated path to the user profile */
+ std::string m_strClientPath; /*!< @brief translated path to this add-on */
+
+ /*!
+ * @brief Callback functions from addon to kodi
+ */
+ //@{
+ static void cb_trigger_scan(void* kodiInstance);
+ static void cb_refresh_button_maps(void* kodiInstance,
+ const char* deviceName,
+ const char* controllerId);
+ static unsigned int cb_feature_count(void* kodiInstance,
+ const char* controllerId,
+ JOYSTICK_FEATURE_TYPE type);
+ static JOYSTICK_FEATURE_TYPE cb_feature_type(void* kodiInstance,
+ const char* controllerId,
+ const char* featureName);
+ //@}
+
+ /* @brief Add-on properties */
+ bool m_bProvidesJoysticks;
+ bool m_bSupportsJoystickRumble;
+ bool m_bSupportsJoystickPowerOff;
+ bool m_bProvidesButtonMaps;
+
+ /* @brief Map of peripherals belonging to the add-on */
+ std::map<unsigned int, PeripheralPtr> m_peripherals;
+
+ /* @brief Button map observers */
+ std::vector<std::pair<CPeripheral*, KODI::JOYSTICK::IButtonMap*>> m_buttonMaps;
+ CCriticalSection m_buttonMapMutex;
+
+ /* @brief Thread synchronization */
+ mutable CCriticalSection m_critSection;
+
+ CSharedSection m_dllSection;
+};
+} // namespace PERIPHERALS