From 67b84311b3c18722e01ca8a29d4b2b59a5dc8864 Mon Sep 17 00:00:00 2001 From: Maschell Date: Tue, 31 Dec 2024 12:52:55 +0100 Subject: [PATCH] ButtonComboAPI: Add C++ wrapper for button combo api --- include/wups/button_combo/WUPSButtonCombo.h | 57 +++++++ include/wups/button_combo/api.h | 107 +++++++++++++ libraries/libwups/WUPSButtonCombo.cpp | 103 +++++++++++++ libraries/libwups/button_comboCPP.cpp | 161 ++++++++++++++++++++ 4 files changed, 428 insertions(+) create mode 100644 include/wups/button_combo/WUPSButtonCombo.h create mode 100644 libraries/libwups/WUPSButtonCombo.cpp create mode 100644 libraries/libwups/button_comboCPP.cpp diff --git a/include/wups/button_combo/WUPSButtonCombo.h b/include/wups/button_combo/WUPSButtonCombo.h new file mode 100644 index 0000000..56cedb0 --- /dev/null +++ b/include/wups/button_combo/WUPSButtonCombo.h @@ -0,0 +1,57 @@ +#pragma once + +#ifdef __cplusplus + +#include "defines.h" + +#include +#include + +class WUPSButtonCombo { +public: + static std::optional Create(const WUPSButtonCombo_ComboOptions &options, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept; + + static WUPSButtonCombo Create(const WUPSButtonCombo_ComboOptions &options, + WUPSButtonCombo_ComboStatus &outStatus); + + ~WUPSButtonCombo(); + WUPSButtonCombo(const WUPSButtonCombo &) = delete; + + WUPSButtonCombo(WUPSButtonCombo &&other) noexcept; + + WUPSButtonCombo &operator=(const WUPSButtonCombo &) = delete; + + WUPSButtonCombo &operator=(WUPSButtonCombo &&other) noexcept; + + [[nodiscard]] WUPSButtonCombo_ComboHandle getHandle() const; + + WUPSButtonCombo_Error GetButtonComboStatus(WUPSButtonCombo_ComboStatus &outStatus) const; + + [[nodiscard]] WUPSButtonCombo_Error UpdateButtonComboMeta(const WUPSButtonCombo_MetaOptions &metaOptions) const; + + [[nodiscard]] WUPSButtonCombo_Error UpdateButtonComboCallback(const WUPSButtonCombo_CallbackOptions &callbackOptions) const; + + [[nodiscard]] WUPSButtonCombo_Error UpdateControllerMask(WUPSButtonCombo_ControllerTypes controllerMask, + WUPSButtonCombo_ComboStatus &outStatus) const; + + [[nodiscard]] WUPSButtonCombo_Error UpdateButtonCombo(WUPSButtonCombo_Buttons combo, + WUPSButtonCombo_ComboStatus &outStatus) const; + + [[nodiscard]] WUPSButtonCombo_Error UpdateHoldDuration(uint32_t holdDurationInFrames) const; + + [[nodiscard]] WUPSButtonCombo_Error GetButtonComboMeta(WUPSButtonCombo_MetaOptionsOut &outOptions) const; + + WUPSButtonCombo_Error GetButtonComboCallback(WUPSButtonCombo_CallbackOptions &outOptions) const; + + WUPSButtonCombo_Error GetButtonComboInfoEx(WUPSButtonCombo_ButtonComboInfoEx &outOptions) const; + +private: + void ReleaseButtonComboHandle(); + + explicit WUPSButtonCombo(WUPSButtonCombo_ComboHandle handle); + + WUPSButtonCombo_ComboHandle mHandle = WUPSButtonCombo_ComboHandle(nullptr); +}; +#endif \ No newline at end of file diff --git a/include/wups/button_combo/api.h b/include/wups/button_combo/api.h index 3c598ec..64ee231 100644 --- a/include/wups/button_combo/api.h +++ b/include/wups/button_combo/api.h @@ -154,3 +154,110 @@ WUPSButtonCombo_Error WUPSButtonComboAPI_DetectButtonCombo_Blocking(const WUPSBu #ifdef __cplusplus } #endif + +#ifdef __cplusplus +namespace WUPSButtonComboAPI { + + + std::string_view GetStatusStr(WUPSButtonCombo_Error status); + + std::optional CreateComboPressDownEx(std::string_view label, + WUPSButtonCombo_ControllerTypes controllerMask, + WUPSButtonCombo_Buttons combo, + WUPSButtonCombo_ComboCallback callback, + void *context, + bool observer, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept; + + std::optional CreateComboPressDown(std::string_view label, + WUPSButtonCombo_Buttons combo, + WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept; + + std::optional CreateComboPressDownObserver(std::string_view label, + WUPSButtonCombo_Buttons combo, + WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept; + + std::optional CreateComboHoldEx(std::string_view label, + WUPSButtonCombo_ControllerTypes controllerMask, + WUPSButtonCombo_Buttons combo, + uint32_t holdDurationInMs, + WUPSButtonCombo_ComboCallback callback, + void *context, + bool observer, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept; + + std::optional CreateComboHold(std::string_view label, + WUPSButtonCombo_Buttons combo, + uint32_t holdDurationInMs, + WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept; + + std::optional CreateComboHoldObserver(std::string_view label, + WUPSButtonCombo_Buttons combo, + uint32_t holdDurationInMs, + WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept; + + + WUPSButtonCombo CreateComboPressDownEx(std::string_view label, + WUPSButtonCombo_ControllerTypes controllerMask, + WUPSButtonCombo_Buttons combo, + WUPSButtonCombo_ComboCallback callback, + void *context, + bool observer, + WUPSButtonCombo_ComboStatus &outStatus); + + WUPSButtonCombo CreateComboPressDown(std::string_view label, + WUPSButtonCombo_Buttons combo, + WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus); + + WUPSButtonCombo CreateComboPressDownObserver(std::string_view label, + WUPSButtonCombo_Buttons combo, + WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus); + + WUPSButtonCombo CreateComboHoldEx(std::string_view label, + WUPSButtonCombo_ControllerTypes controllerMask, + WUPSButtonCombo_Buttons combo, + uint32_t holdDurationInMs, + WUPSButtonCombo_ComboCallback callback, + void *context, + bool observer, + WUPSButtonCombo_ComboStatus &outStatus); + + WUPSButtonCombo CreateComboHold(std::string_view label, + WUPSButtonCombo_Buttons combo, + uint32_t holdDurationInMs, + WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus); + + WUPSButtonCombo CreateComboHoldObserver(std::string_view label, + WUPSButtonCombo_Buttons combo, + uint32_t holdDurationInMs, + WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus); + WUPSButtonCombo_Error CheckComboAvailable(const WUPSButtonCombo_ButtonComboOptions &options, + WUPSButtonCombo_ComboStatus &outStatus); + + WUPSButtonCombo_Error DetectButtonCombo_Blocking(const WUPSButtonCombo_DetectButtonComboOptions &options, + WUPSButtonCombo_Buttons &outButtons); + +} // namespace WUPSButtonComboAPI +#endif \ No newline at end of file diff --git a/libraries/libwups/WUPSButtonCombo.cpp b/libraries/libwups/WUPSButtonCombo.cpp new file mode 100644 index 0000000..dee6a16 --- /dev/null +++ b/libraries/libwups/WUPSButtonCombo.cpp @@ -0,0 +1,103 @@ +#include "wups/button_combo/WUPSButtonCombo.h" + +#include +#include +#include + + +std::optional WUPSButtonCombo::Create(const WUPSButtonCombo_ComboOptions &options, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept { + WUPSButtonCombo_ComboHandle handle; + if (outError = WUPSButtonComboAPI_AddButtonCombo(&options, &handle, &outStatus); outError == WUPS_BUTTON_COMBO_ERROR_SUCCESS) { + return WUPSButtonCombo(handle); + } + return {}; +} + +WUPSButtonCombo WUPSButtonCombo::Create(const WUPSButtonCombo_ComboOptions &options, + WUPSButtonCombo_ComboStatus &outStatus) { + WUPSButtonCombo_Error error; + auto res = Create(options, outStatus, error); + if (!res) { + throw std::runtime_error{std::string("Failed to create button combo: ").append(WUPSButtonComboAPI_GetStatusStr(error))}; + } + return std::move(*res); +} + +WUPSButtonCombo::~WUPSButtonCombo() { + ReleaseButtonComboHandle(); +} + +void WUPSButtonCombo::ReleaseButtonComboHandle() { + if (mHandle != nullptr) { + if (const auto res = WUPSButtonComboAPI_RemoveButtonCombo(mHandle); res != WUPS_BUTTON_COMBO_ERROR_SUCCESS) { + OSReport("WUPSButtonCombo::ReleaseButtonComboHandle(): WUPSButtonComboAPI_RemoveButtonCombo for %08X returned: %s\n", mHandle, WUPSButtonComboAPI_GetStatusStr(res)); + } + mHandle = WUPSButtonCombo_ComboHandle(nullptr); + } +} + +WUPSButtonCombo::WUPSButtonCombo(WUPSButtonCombo &&src) noexcept { + ReleaseButtonComboHandle(); + + mHandle = src.mHandle; + + src.mHandle = WUPSButtonCombo_ComboHandle(nullptr); +} + +WUPSButtonCombo &WUPSButtonCombo::operator=(WUPSButtonCombo &&src) noexcept { + if (this != &src) { + ReleaseButtonComboHandle(); + + mHandle = src.mHandle; + + src.mHandle = WUPSButtonCombo_ComboHandle(nullptr); + } + return *this; +} + +[[nodiscard]] WUPSButtonCombo_ComboHandle WUPSButtonCombo::getHandle() const { + return mHandle; +} + +WUPSButtonCombo_Error WUPSButtonCombo::GetButtonComboStatus(WUPSButtonCombo_ComboStatus &outStatus) const { + return WUPSButtonComboAPI_GetButtonComboStatus(mHandle, &outStatus); +} + +[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::UpdateButtonComboMeta(const WUPSButtonCombo_MetaOptions &metaOptions) const { + return WUPSButtonComboAPI_UpdateButtonComboMeta(mHandle, &metaOptions); +} + +[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::UpdateButtonComboCallback(const WUPSButtonCombo_CallbackOptions &callbackOptions) const { + return WUPSButtonComboAPI_UpdateButtonComboCallback(mHandle, &callbackOptions); +} + +[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::UpdateControllerMask(const WUPSButtonCombo_ControllerTypes controllerMask, + WUPSButtonCombo_ComboStatus &outStatus) const { + return WUPSButtonComboAPI_UpdateControllerMask(mHandle, controllerMask, &outStatus); +} + +[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::UpdateButtonCombo(const WUPSButtonCombo_Buttons combo, + WUPSButtonCombo_ComboStatus &outStatus) const { + return WUPSButtonComboAPI_UpdateButtonCombo(mHandle, combo, &outStatus); +} + +[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::UpdateHoldDuration(const uint32_t holdDurationInFrames) const { + return WUPSButtonComboAPI_UpdateHoldDuration(mHandle, holdDurationInFrames); +} + +[[nodiscard]] WUPSButtonCombo_Error WUPSButtonCombo::GetButtonComboMeta(WUPSButtonCombo_MetaOptionsOut &outOptions) const { + return WUPSButtonComboAPI_GetButtonComboMeta(mHandle, &outOptions); +} + +WUPSButtonCombo_Error WUPSButtonCombo::GetButtonComboCallback(WUPSButtonCombo_CallbackOptions &outOptions) const { + return WUPSButtonComboAPI_GetButtonComboCallback(mHandle, &outOptions); +} + +WUPSButtonCombo_Error WUPSButtonCombo::GetButtonComboInfoEx(WUPSButtonCombo_ButtonComboInfoEx &outOptions) const { + return WUPSButtonComboAPI_GetButtonComboInfoEx(mHandle, &outOptions); +} + +WUPSButtonCombo::WUPSButtonCombo(const WUPSButtonCombo_ComboHandle handle) : mHandle(handle) { +} diff --git a/libraries/libwups/button_comboCPP.cpp b/libraries/libwups/button_comboCPP.cpp new file mode 100644 index 0000000..a7b5e87 --- /dev/null +++ b/libraries/libwups/button_comboCPP.cpp @@ -0,0 +1,161 @@ +#include +#include +#include + +namespace WUPSButtonComboAPI { + std::string_view GetStatusStr(const WUPSButtonCombo_Error status) { + return WUPSButtonComboAPI_GetStatusStr(status); + } + + std::optional CreateComboPressDownEx(const std::string_view label, + const WUPSButtonCombo_ControllerTypes controllerMask, + const WUPSButtonCombo_Buttons combo, + const WUPSButtonCombo_ComboCallback callback, + void *context, + const bool observer, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept { + WUPSButtonCombo_ComboOptions options = {}; + options.metaOptions.label = label.data(); + options.callbackOptions = {.callback = callback, .context = context}; + options.buttonComboOptions.type = observer ? WUPS_BUTTON_COMBO_COMBO_TYPE_PRESS_DOWN_OBSERVER : WUPS_BUTTON_COMBO_COMBO_TYPE_PRESS_DOWN; + options.buttonComboOptions.basicCombo.combo = combo; + options.buttonComboOptions.basicCombo.controllerMask = controllerMask; + + return WUPSButtonCombo::Create(options, outStatus, outError); + } + + std::optional CreateComboPressDown(const std::string_view label, + const WUPSButtonCombo_Buttons combo, + const WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept { + return CreateComboPressDownEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, callback, context, false, outStatus, outError); + } + + std::optional CreateComboPressDownObserver(const std::string_view label, + const WUPSButtonCombo_Buttons combo, + const WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept { + return CreateComboPressDownEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, callback, context, true, outStatus, outError); + } + + + std::optional CreateComboHoldEx(const std::string_view label, + const WUPSButtonCombo_ControllerTypes controllerMask, + const WUPSButtonCombo_Buttons combo, + const uint32_t holdDurationInMs, + const WUPSButtonCombo_ComboCallback callback, + void *context, + const bool observer, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept { + WUPSButtonCombo_ComboOptions options = {}; + options.metaOptions.label = label.data(); + options.callbackOptions = {.callback = callback, .context = context}; + options.buttonComboOptions.type = observer ? WUPS_BUTTON_COMBO_COMBO_TYPE_HOLD_OBSERVER : WUPS_BUTTON_COMBO_COMBO_TYPE_HOLD; + options.buttonComboOptions.basicCombo.combo = combo; + options.buttonComboOptions.basicCombo.controllerMask = controllerMask; + options.buttonComboOptions.optionalHoldForXMs = holdDurationInMs; + + return WUPSButtonCombo::Create(options, outStatus, outError); + } + + std::optional CreateComboHold(const std::string_view label, + const WUPSButtonCombo_Buttons combo, + const uint32_t holdDurationInMs, + const WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept { + return CreateComboHoldEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, false, outStatus, outError); + } + + std::optional CreateComboHoldObserver(const std::string_view label, + const WUPSButtonCombo_Buttons combo, + const uint32_t holdDurationInMs, + const WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus, + WUPSButtonCombo_Error &outError) noexcept { + return CreateComboHoldEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, true, outStatus, outError); + } + + WUPSButtonCombo CreateComboPressDownEx(const std::string_view label, + const WUPSButtonCombo_ControllerTypes controllerMask, + const WUPSButtonCombo_Buttons combo, + const WUPSButtonCombo_ComboCallback callback, + void *context, + const bool observer, + WUPSButtonCombo_ComboStatus &outStatus) { + WUPSButtonCombo_Error error; + auto res = CreateComboPressDownEx(label, controllerMask, combo, callback, context, observer, outStatus, error); + if (!res) { + throw std::runtime_error{std::string("Failed to create press down ex button combo: ").append(WUPSButtonComboAPI_GetStatusStr(error))}; + } + return std::move(*res); + } + + WUPSButtonCombo CreatePressDown(const std::string_view label, + const WUPSButtonCombo_Buttons combo, + const WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus) { + return CreateComboPressDownEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, callback, context, false, outStatus); + } + + WUPSButtonCombo CreatePressDownObserver(const std::string_view label, + const WUPSButtonCombo_Buttons combo, + const WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus) { + return CreateComboPressDownEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, callback, context, true, outStatus); + } + + WUPSButtonCombo CreateComboHoldEx(const std::string_view label, + const WUPSButtonCombo_ControllerTypes controllerMask, + const WUPSButtonCombo_Buttons combo, + const uint32_t holdDurationInMs, + const WUPSButtonCombo_ComboCallback callback, + void *context, + const bool observer, + WUPSButtonCombo_ComboStatus &outStatus) { + WUPSButtonCombo_Error error; + auto res = CreateComboHoldEx(label, controllerMask, combo, holdDurationInMs, callback, context, observer, outStatus, error); + if (!res) { + throw std::runtime_error{std::string("Failed to create press down ex button combo: ").append(WUPSButtonComboAPI_GetStatusStr(error))}; + } + return std::move(*res); + } + + WUPSButtonCombo CreateComboHold(const std::string_view label, + const WUPSButtonCombo_Buttons combo, + const uint32_t holdDurationInMs, + const WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus) { + return CreateComboHoldEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, false, outStatus); + } + + WUPSButtonCombo CreateComboHoldObserver(const std::string_view label, + const WUPSButtonCombo_Buttons combo, + const uint32_t holdDurationInMs, + const WUPSButtonCombo_ComboCallback callback, + void *context, + WUPSButtonCombo_ComboStatus &outStatus) { + return CreateComboHoldEx(label, WUPS_BUTTON_COMBO_CONTROLLER_ALL, combo, holdDurationInMs, callback, context, true, outStatus); + } + + WUPSButtonCombo_Error CheckComboAvailable(const WUPSButtonCombo_ButtonComboOptions &options, + WUPSButtonCombo_ComboStatus &outStatus) { + return WUPSButtonComboAPI_CheckComboAvailable(&options, &outStatus); + } + + WUPSButtonCombo_Error DetectButtonCombo_Blocking(const WUPSButtonCombo_DetectButtonComboOptions &options, + WUPSButtonCombo_Buttons &outButtons) { + return WUPSButtonComboAPI_DetectButtonCombo_Blocking(&options, &outButtons); + } +} // namespace WUPSButtonComboAPI \ No newline at end of file