/*
* Copyright (C) 2014-2017 Team Kodi
* http://kodi.tv
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this Program; see the file COPYING. If not, see
* .
*
*/
#ifndef __PERIPHERAL_DLL_H__
#define __PERIPHERAL_DLL_H__
#include "kodi_peripheral_types.h"
#define PERIPHERAL_ADDON_JOYSTICKS //! @todo
#ifdef __cplusplus
extern "C"
{
#endif
/// @name Peripheral operations
///{
/*!
* @brief Get the list of features that this add-on provides
* @param pCapabilities The add-on's capabilities.
* @return PERIPHERAL_NO_ERROR if the properties were fetched successfully.
* @remarks Valid implementation required.
*
* Called by the frontend to query the add-on's capabilities and supported
* peripherals. All capabilities that the add-on supports should be set to true.
*
*/
PERIPHERAL_ERROR GetAddonCapabilities(PERIPHERAL_CAPABILITIES *pCapabilities);
/*!
* @brief Perform a scan for joysticks
* @param peripheral_count Assigned to the number of peripherals allocated
* @param scan_results Assigned to allocated memory
* @return PERIPHERAL_NO_ERROR if successful; peripherals must be freed using
* FreeScanResults() in this case
*
* The frontend calls this when a hardware change is detected. If an add-on
* detects a hardware change, it can trigger this function using the
* TriggerScan() callback.
*/
PERIPHERAL_ERROR PerformDeviceScan(unsigned int* peripheral_count, PERIPHERAL_INFO** scan_results);
/*!
* @brief Free the memory allocated in PerformDeviceScan()
*
* Must be called if PerformDeviceScan() returns PERIPHERAL_NO_ERROR.
*
* @param peripheral_count The number of events allocated for the events array
* @param scan_results The array of allocated peripherals
*/
void FreeScanResults(unsigned int peripheral_count, PERIPHERAL_INFO* scan_results);
/*!
* @brief Get all events that have occurred since the last call to GetEvents()
* @return PERIPHERAL_NO_ERROR if successful; events must be freed using
* FreeEvents() in this case
*/
PERIPHERAL_ERROR GetEvents(unsigned int* event_count, PERIPHERAL_EVENT** events);
/*!
* @brief Free the memory allocated in GetEvents()
*
* Must be called if GetEvents() returns PERIPHERAL_NO_ERROR.
*
* @param event_count The number of events allocated for the events array
* @param events The array of allocated events
*/
void FreeEvents(unsigned int event_count, PERIPHERAL_EVENT* events);
/*!
* @brief Send an input event to the specified peripheral
* @param peripheralIndex The index of the device receiving the input event
* @param event The input event
* @return true if the event was handled, false otherwise
*/
bool SendEvent(const PERIPHERAL_EVENT* event);
///}
/// @name Joystick operations
/*!
* @note #define PERIPHERAL_ADDON_JOYSTICKS before including kodi_peripheral_dll.h
* in the add-on if the add-on provides joysticks and add provides_joysticks="true"
* to the kodi.peripheral extension point node in addon.xml.
*/
///{
#ifdef PERIPHERAL_ADDON_JOYSTICKS
/*!
* @brief Get extended info about an attached joystick
* @param index The joystick's driver index
* @param info The container for the allocated joystick info
* @return PERIPHERAL_NO_ERROR if successful; array must be freed using
* FreeJoystickInfo() in this case
*/
PERIPHERAL_ERROR GetJoystickInfo(unsigned int index, JOYSTICK_INFO* info);
/*!
* @brief Free the memory allocated in GetJoystickInfo()
*/
void FreeJoystickInfo(JOYSTICK_INFO* info);
/*!
* @brief Get the features that allow translating the joystick into the controller profile
* @param joystick The device's joystick properties; unknown values may be left at their default
* @param controller_id The controller profile being requested, e.g. game.controller.default
* @param feature_count The number of features allocated for the features array
* @param features The array of allocated features
* @return PERIPHERAL_NO_ERROR if successful; array must be freed using
* FreeButtonMap() in this case
*/
PERIPHERAL_ERROR GetFeatures(const JOYSTICK_INFO* joystick, const char* controller_id,
unsigned int* feature_count, JOYSTICK_FEATURE** features);
/*!
* @brief Free the memory allocated in GetFeatures()
*
* Must be called if GetFeatures() returns PERIPHERAL_NO_ERROR.
*
* @param feature_count The number of features allocated for the features array
* @param features The array of allocated features
*/
void FreeFeatures(unsigned int feature_count, JOYSTICK_FEATURE* features);
/*!
* @brief Add or update joystick features
* @param joystick The device's joystick properties; unknown values may be left at their default
* @param controller_id The game controller profile being updated
* @param feature_count The number of features in the features array
* @param features The array of features
* @return PERIPHERAL_NO_ERROR if successful
*/
PERIPHERAL_ERROR MapFeatures(const JOYSTICK_INFO* joystick, const char* controller_id,
unsigned int feature_count, const JOYSTICK_FEATURE* features);
/*!
* @brief Get the driver primitives that should be ignored while mapping the device
* @param joystick The device's joystick properties; unknown values may be left at their default
* @param primitive_count The number of features allocated for the primitives array
* @param primitives The array of allocated driver primitives to be ignored
* @return PERIPHERAL_NO_ERROR if successful; array must be freed using
* FreePrimitives() in this case
*/
PERIPHERAL_ERROR GetIgnoredPrimitives(const JOYSTICK_INFO* joystick,
unsigned int* primitive_count,
JOYSTICK_DRIVER_PRIMITIVE** primitives);
/*!
* @brief Free the memory allocated in GetIgnoredPrimitives()
*
* Must be called if GetIgnoredPrimitives() returns PERIPHERAL_NO_ERROR.
*
* @param primitive_count The number of driver primitives allocated for the primitives array
* @param primitives The array of allocated driver primitives
*/
void FreePrimitives(unsigned int primitive_count, JOYSTICK_DRIVER_PRIMITIVE* primitives);
/*!
* @brief Set the list of driver primitives that are ignored for the device
* @param joystick The device's joystick properties; unknown values may be left at their default
* @param primitive_count The number of driver features in the primitives array
* @param primitives The array of driver primitives to ignore
* @return PERIPHERAL_NO_ERROR if successful
*/
PERIPHERAL_ERROR SetIgnoredPrimitives(const JOYSTICK_INFO* joystick,
unsigned int primitive_count,
const JOYSTICK_DRIVER_PRIMITIVE* primitives);
/*!
* @brief Save the button map for the given joystick
* @param joystick The device's joystick properties
*/
void SaveButtonMap(const JOYSTICK_INFO* joystick);
/*!
* @brief Revert the button map to the last time it was loaded or committed to disk
* @param joystick The device's joystick properties
*/
void RevertButtonMap(const JOYSTICK_INFO* joystick);
/*!
* @brief Reset the button map for the given joystick and controller profile ID
* @param joystick The device's joystick properties
* @param controller_id The game controller profile being reset
*/
void ResetButtonMap(const JOYSTICK_INFO* joystick, const char* controller_id);
/*!
* @brief Powers off the given joystick if supported
* @param index The joystick's driver index
*/
void PowerOffJoystick(unsigned int index);
#endif
///}
/*!
* Called by the frontend to assign the function pointers of this add-on to
* pClient. Note that get_addon() is defined here, so it will be available in
* all compiled peripheral add-ons.
*/
void __declspec(dllexport) get_addon(void* ptr)
{
AddonInstance_Peripheral* pClient = static_cast(ptr);
pClient->toAddon.GetAddonCapabilities = GetAddonCapabilities;
pClient->toAddon.PerformDeviceScan = PerformDeviceScan;
pClient->toAddon.FreeScanResults = FreeScanResults;
pClient->toAddon.GetEvents = GetEvents;
pClient->toAddon.FreeEvents = FreeEvents;
pClient->toAddon.SendEvent = SendEvent;
#ifdef PERIPHERAL_ADDON_JOYSTICKS
pClient->toAddon.GetJoystickInfo = GetJoystickInfo;
pClient->toAddon.FreeJoystickInfo = FreeJoystickInfo;
pClient->toAddon.GetFeatures = GetFeatures;
pClient->toAddon.FreeFeatures = FreeFeatures;
pClient->toAddon.MapFeatures = MapFeatures;
pClient->toAddon.GetIgnoredPrimitives = GetIgnoredPrimitives;
pClient->toAddon.FreePrimitives = FreePrimitives;
pClient->toAddon.SetIgnoredPrimitives = SetIgnoredPrimitives;
pClient->toAddon.SaveButtonMap = SaveButtonMap;
pClient->toAddon.RevertButtonMap = RevertButtonMap;
pClient->toAddon.ResetButtonMap = ResetButtonMap;
pClient->toAddon.PowerOffJoystick = PowerOffJoystick;
#endif
}
#ifdef __cplusplus
}
#endif
#endif // __PERIPHERAL_DLL_H__