// This file is part of Necroware's GamePort adapter firmware.
// Copyright (C) 2021 Necroware
//
// 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 3 of the License, 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. If not, see .
#pragma once
#include
/// Base class for all joysticks.
class Joystick {
public:
static const auto MAX_AXES{16u};
/// Device description.
///
/// This structure is used to generate the HID description
/// and USB data packages
struct Description {
/// Human readable name.
const char* name;
/// Number of supported axes.
uint8_t numAxes;
/// Number of supported buttons.
uint8_t numButtons;
/// Has HAT.
bool hasHat;
};
/// Joystick state.
struct State {
/// Axes.
///
/// To keep it simple all axes are unified to 10 bits
/// resolution. Every joystick has to map it's values
/// to the values 0..1023 independent from the internal
/// resolution of the device.
uint16_t axes[MAX_AXES]{};
/// Hats.
///
/// HAT is represented through values 0..8 1 is up, 2 is
/// 45° clockwise, 3 is right etc. Center is represented
/// with zero.
uint8_t hat{};
/// Buttons.
///
/// Every bit is a button. 1 is pressed, 0 is released
uint16_t buttons{};
};
/// Initialize joystick.
///
/// @returns True on successful initialization
virtual bool init() = 0;
/// Update state.
///
/// This function is called every time the joystick
/// state has to be updated.
///
/// @returns True on successful initialization
virtual bool update() = 0;
/// Gets the State of the Joystick.
virtual const State &getState() const = 0;
/// Gets the Description of the Joystick.
virtual const Description &getDescription() const = 0;
Joystick() = default;
virtual ~Joystick() = default;
Joystick(const Joystick &) = delete;
Joystick(Joystick &&) = delete;
Joystick &operator=(const Joystick &) = delete;
Joystick &operator=(Joystick &&) = delete;
};