summaryrefslogtreecommitdiffstats
path: root/xbmc/peripherals/bus/PeripheralBus.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/peripherals/bus/PeripheralBus.h')
-rw-r--r--xbmc/peripherals/bus/PeripheralBus.h221
1 files changed, 221 insertions, 0 deletions
diff --git a/xbmc/peripherals/bus/PeripheralBus.h b/xbmc/peripherals/bus/PeripheralBus.h
new file mode 100644
index 0000000..6b67a7f
--- /dev/null
+++ b/xbmc/peripherals/bus/PeripheralBus.h
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2005-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 "peripherals/PeripheralTypes.h"
+#include "threads/Thread.h"
+
+#include <memory>
+#include <mutex>
+#include <vector>
+
+class CFileItemList;
+
+namespace KODI
+{
+namespace JOYSTICK
+{
+class IButtonMap;
+} // namespace JOYSTICK
+} // namespace KODI
+
+namespace PERIPHERALS
+{
+class CPeripheral;
+class CPeripherals;
+
+/*!
+ * @class CPeripheralBus
+ * This represents a bus on the system. By default, this bus instance will scan for changes every 5
+ * seconds. If this bus only has to be updated after a notification sent by the system, set
+ * m_bNeedsPolling to false in the constructor, and implement the OnDeviceAdded(), OnDeviceChanged()
+ * and OnDeviceRemoved() methods.
+ *
+ * The PerformDeviceScan() method has to be implemented by each specific bus implementation.
+ */
+class CPeripheralBus : protected CThread
+{
+public:
+ CPeripheralBus(const std::string& threadname, CPeripherals& manager, PeripheralBusType type);
+ ~CPeripheralBus(void) override { Clear(); }
+
+ /*!
+ * @return The bus type
+ */
+ PeripheralBusType Type(void) const { return m_type; }
+
+ /*!
+ * @return True if this bus needs to be polled for changes, false if this bus performs updates via
+ * callbacks
+ */
+ bool NeedsPolling(void) const
+ {
+ std::unique_lock<CCriticalSection> lock(m_critSection);
+ return m_bNeedsPolling;
+ }
+
+ /*!
+ * \brief Initialize the properties of a peripheral with a known location
+ */
+ virtual bool InitializeProperties(CPeripheral& peripheral);
+
+ /*!
+ * \brief Initialize a joystick buttonmap, if possible
+ */
+ virtual bool InitializeButtonMap(const CPeripheral& peripheral,
+ KODI::JOYSTICK::IButtonMap& buttonMap) const
+ {
+ return false;
+ }
+
+ /*!
+ * @brief Get the instance of the peripheral at the given location.
+ * @param strLocation The location.
+ * @return The peripheral or NULL if it wasn't found.
+ */
+ virtual PeripheralPtr GetPeripheral(const std::string& strLocation) const;
+
+ /*!
+ * @brief Check whether a peripheral is present at the given location.
+ * @param strLocation The location.
+ * @return True when a peripheral was found, false otherwise.
+ */
+ virtual bool HasPeripheral(const std::string& strLocation) const;
+
+ /*!
+ * @brief Check if the bus supports the given feature
+ * @param feature The feature to check for
+ * @return True if the bus supports the feature, false otherwise
+ */
+ virtual bool SupportsFeature(PeripheralFeature feature) const { return false; }
+
+ /*!
+ * @brief Get all peripheral instances that have the given feature.
+ * @param results The list of results.
+ * @param feature The feature to search for.
+ * @return The number of devices that have been found.
+ */
+ virtual unsigned int GetPeripheralsWithFeature(PeripheralVector& results,
+ const PeripheralFeature feature) const;
+
+ virtual unsigned int GetNumberOfPeripherals() const;
+ virtual unsigned int GetNumberOfPeripheralsWithId(const int iVendorId,
+ const int iProductId) const;
+
+ /*!
+ * @brief Get all features that are supported by devices on this bus.
+ * @param features All features.
+ */
+ virtual void GetFeatures(std::vector<PeripheralFeature>& features) const;
+
+ /*!
+ * @brief Check whether there is at least one device present with the given feature.
+ * @param feature The feature to check for.
+ * @return True when at least one device was found with this feature, false otherwise.
+ */
+ virtual bool HasFeature(const PeripheralFeature feature) const;
+
+ /*!
+ * @brief Callback method for when a device has been added. Will perform a device scan.
+ * @param strLocation The location of the device that has been added.
+ */
+ virtual void OnDeviceAdded(const std::string& strLocation);
+
+ /*!
+ * @brief Callback method for when a device has been changed. Will perform a device scan.
+ * @param strLocation The location of the device that has been changed.
+ */
+ virtual void OnDeviceChanged(const std::string& strLocation);
+
+ /*!
+ * @brief Callback method for when a device has been removed. Will perform a device scan.
+ * @param strLocation The location of the device that has been removed.
+ */
+ virtual void OnDeviceRemoved(const std::string& strLocation);
+
+ /*!
+ * @brief Initialise this bus and start a polling thread if this bus needs polling.
+ */
+ virtual void Initialise(void);
+
+ /*!
+ * @brief Stop the polling thread and clear all known devices on this bus.
+ */
+ virtual void Clear(void);
+
+ /*!
+ * @brief Scan for devices.
+ */
+ virtual void TriggerDeviceScan(void);
+
+ /*!
+ * @brief Get all fileitems for a path.
+ * @param strPath The path to the directory to get the items from.
+ * @param items The item list.
+ */
+ virtual void GetDirectory(const std::string& strPath, CFileItemList& items) const;
+
+ /*!
+ * @brief Get the instance of a peripheral given it's path.
+ * @param strPath The path to the peripheral.
+ * @return The peripheral or NULL if it wasn't found.
+ */
+ virtual PeripheralPtr GetByPath(const std::string& strPath) const;
+
+ /*!
+ * @brief Register a new peripheral on this bus.
+ * @param peripheral The peripheral to register.
+ */
+ virtual void Register(const PeripheralPtr& peripheral);
+
+ virtual bool FindComPort(std::string& strLocation) { return false; }
+
+ /*!
+ * \brief Poll for events
+ */
+ virtual void ProcessEvents(void) {}
+
+ /*!
+ * \brief Initialize button mapping
+ * \return True if button mapping is enabled for this bus
+ */
+ virtual void EnableButtonMapping() {}
+
+ /*!
+ * \brief Power off the specified device
+ * \param strLocation The device's location
+ */
+ virtual void PowerOff(const std::string& strLocation) {}
+
+protected:
+ void Process(void) override;
+ virtual bool ScanForDevices(void);
+ virtual void UnregisterRemovedDevices(const PeripheralScanResults& results);
+ virtual void RegisterNewDevices(const PeripheralScanResults& results);
+
+ /*!
+ * @brief Scan for devices on this bus and add them to the results list. This will have to be
+ * implemented for each bus.
+ * @param results The result list.
+ * @return True when the scan was successful, false otherwise.
+ */
+ virtual bool PerformDeviceScan(PeripheralScanResults& results) = 0;
+
+ PeripheralVector m_peripherals;
+ std::chrono::milliseconds m_iRescanTime;
+ bool m_bNeedsPolling; /*!< true when this bus needs to be polled for new devices, false when it
+ uses callbacks to notify this bus of changed */
+ CPeripherals& m_manager;
+ const PeripheralBusType m_type;
+ mutable CCriticalSection m_critSection;
+ CEvent m_triggerEvent;
+};
+using PeripheralBusPtr = std::shared_ptr<CPeripheralBus>;
+using PeripheralBusVector = std::vector<PeripheralBusPtr>;
+} // namespace PERIPHERALS