/*
* Copyright (C) 2018 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
* .
*
*/
#include "GameClientController.h"
#include "GameClientInput.h"
#include "games/controllers/Controller.h"
#include "games/controllers/ControllerLayout.h"
#include "games/controllers/input/PhysicalFeature.h"
#include "games/controllers/input/PhysicalTopology.h"
#include
#include
using namespace KODI;
using namespace GAME;
CGameClientController::CGameClientController(CGameClientInput& input, ControllerPtr controller)
: m_input(input), m_controller(std::move(controller)), m_controllerId(m_controller->ID())
{
// Generate arrays of features
for (const CPhysicalFeature& feature : m_controller->Features())
{
// Skip feature if not supported by the game client
if (!m_input.HasFeature(m_controller->ID(), feature.Name()))
continue;
// Add feature to array of the appropriate type
switch (feature.Type())
{
case FEATURE_TYPE::SCALAR:
{
switch (feature.InputType())
{
case JOYSTICK::INPUT_TYPE::DIGITAL:
m_digitalButtons.emplace_back(const_cast(feature.Name().c_str()));
break;
case JOYSTICK::INPUT_TYPE::ANALOG:
m_analogButtons.emplace_back(const_cast(feature.Name().c_str()));
break;
default:
break;
}
break;
}
case FEATURE_TYPE::ANALOG_STICK:
m_analogSticks.emplace_back(const_cast(feature.Name().c_str()));
break;
case FEATURE_TYPE::ACCELEROMETER:
m_accelerometers.emplace_back(const_cast(feature.Name().c_str()));
break;
case FEATURE_TYPE::KEY:
m_keys.emplace_back(const_cast(feature.Name().c_str()));
break;
case FEATURE_TYPE::RELPOINTER:
m_relPointers.emplace_back(const_cast(feature.Name().c_str()));
break;
case FEATURE_TYPE::ABSPOINTER:
m_absPointers.emplace_back(const_cast(feature.Name().c_str()));
break;
case FEATURE_TYPE::MOTOR:
m_motors.emplace_back(const_cast(feature.Name().c_str()));
break;
default:
break;
}
}
//! @todo Sort vectors
}
game_controller_layout CGameClientController::TranslateController() const
{
game_controller_layout controllerStruct{};
controllerStruct.controller_id = const_cast(m_controllerId.c_str());
controllerStruct.provides_input = m_controller->Layout().Topology().ProvidesInput();
if (!m_digitalButtons.empty())
{
controllerStruct.digital_buttons = const_cast(m_digitalButtons.data());
controllerStruct.digital_button_count = static_cast(m_digitalButtons.size());
}
if (!m_analogButtons.empty())
{
controllerStruct.analog_buttons = const_cast(m_analogButtons.data());
controllerStruct.analog_button_count = static_cast(m_analogButtons.size());
}
if (!m_analogSticks.empty())
{
controllerStruct.analog_sticks = const_cast(m_analogSticks.data());
controllerStruct.analog_stick_count = static_cast(m_analogSticks.size());
}
if (!m_accelerometers.empty())
{
controllerStruct.accelerometers = const_cast(m_accelerometers.data());
controllerStruct.accelerometer_count = static_cast(m_accelerometers.size());
}
if (!m_keys.empty())
{
controllerStruct.keys = const_cast(m_keys.data());
controllerStruct.key_count = static_cast(m_keys.size());
}
if (!m_relPointers.empty())
{
controllerStruct.rel_pointers = const_cast(m_relPointers.data());
controllerStruct.rel_pointer_count = static_cast(m_relPointers.size());
}
if (!m_absPointers.empty())
{
controllerStruct.abs_pointers = const_cast(m_absPointers.data());
controllerStruct.abs_pointer_count = static_cast(m_absPointers.size());
}
if (!m_motors.empty())
{
controllerStruct.motors = const_cast(m_motors.data());
controllerStruct.motor_count = static_cast(m_motors.size());
}
return controllerStruct;
}