From de0277713b7bca64bf2a4fb7c29a144449e4098a Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Thu, 3 Sep 2020 10:09:01 -0700 Subject: [PATCH] [sim] Add API for extensions to discover each other (#2681) --- hal/src/main/native/include/hal/Extensions.h | 27 +++++++++++++++++++- hal/src/main/native/sim/Extensions.cpp | 20 +++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/hal/src/main/native/include/hal/Extensions.h b/hal/src/main/native/include/hal/Extensions.h index 3a435c08da..aa1b44cf51 100644 --- a/hal/src/main/native/include/hal/Extensions.h +++ b/hal/src/main/native/include/hal/Extensions.h @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2017-2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2017-2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ @@ -44,6 +44,31 @@ int HAL_LoadOneExtension(const char* library); */ int HAL_LoadExtensions(void); +/** + * Registers an extension such that other extensions can discover it. + * + * The passed data pointer is retained and the extension must keep this + * pointer valid. + * + * @param name extension name (may embed version number) + * @param data data pointer + */ +void HAL_RegisterExtension(const char* name, void* data); + +/** + * Registers an extension registration listener function. The function will + * be called immediately with any currently registered extensions, and will + * be called later when any additional extensions are registered. + * + * @param param parameter data to pass to callback function + * @param func callback function to be called for each registered extension; + * parameters are the parameter data, extension name, and extension + * data pointer passed to HAL_RegisterExtension() + */ +void HAL_RegisterExtensionListener(void* param, + void (*func)(void*, const char* name, + void* data)); + /** * Enables or disables the message saying no HAL extensions were found. * diff --git a/hal/src/main/native/sim/Extensions.cpp b/hal/src/main/native/sim/Extensions.cpp index c31e771294..38d0b2996c 100644 --- a/hal/src/main/native/sim/Extensions.cpp +++ b/hal/src/main/native/sim/Extensions.cpp @@ -7,6 +7,8 @@ #include "hal/Extensions.h" +#include + #include #include #include @@ -37,6 +39,10 @@ #define DLERROR dlerror() #endif +static std::vector> gExtensionRegistry; +static std::vector> + gExtensionListeners; + namespace hal { namespace init { void InitializeExtensions() {} @@ -116,6 +122,20 @@ int HAL_LoadExtensions(void) { return rc; } +void HAL_RegisterExtension(const char* name, void* data) { + gExtensionRegistry.emplace_back(name, data); + for (auto&& listener : gExtensionListeners) + listener.second(listener.first, name, data); +} + +void HAL_RegisterExtensionListener(void* param, + void (*func)(void*, const char* name, + void* data)) { + gExtensionListeners.emplace_back(param, func); + for (auto&& extension : gExtensionRegistry) + func(param, extension.first, extension.second); +} + void HAL_SetShowExtensionsNotFoundMessages(HAL_Bool showMessage) { GetShowNotFoundMessage() = showMessage; }