From 67e1b5fe952c70ab05a04b6ff36a60445f69e400 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Fri, 25 Oct 2024 14:02:59 -0700 Subject: [PATCH] [sim] halsim_ws_core: Store SimDeviceValueData by value --- .../main/native/cpp/WSProvider_SimDevice.cpp | 35 ++++++++++--------- .../native/include/WSProvider_SimDevice.h | 2 +- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/simulation/halsim_ws_core/src/main/native/cpp/WSProvider_SimDevice.cpp b/simulation/halsim_ws_core/src/main/native/cpp/WSProvider_SimDevice.cpp index e48de73655..81948a8f7a 100644 --- a/simulation/halsim_ws_core/src/main/native/cpp/WSProvider_SimDevice.cpp +++ b/simulation/halsim_ws_core/src/main/native/cpp/WSProvider_SimDevice.cpp @@ -69,18 +69,18 @@ void HALSimWSProviderSimDevice::OnNetValueChanged(const wpi::json& json) { auto vd = m_valueHandles.find(it.key()); if (vd != m_valueHandles.end()) { HAL_Value value; - value.type = vd->second->valueType; + value.type = vd->second.valueType; switch (value.type) { case HAL_BOOLEAN: value.data.v_boolean = static_cast(it.value()) ? 1 : 0; break; case HAL_DOUBLE: value.data.v_double = it.value(); - value.data.v_double -= vd->second->doubleOffset; + value.data.v_double -= vd->second.doubleOffset; break; case HAL_ENUM: { if (it->is_string()) { - auto& options = vd->second->options; + auto& options = vd->second.options; auto& str = it.value().get_ref(); auto optionIt = std::find_if(options.begin(), options.end(), @@ -89,7 +89,7 @@ void HALSimWSProviderSimDevice::OnNetValueChanged(const wpi::json& json) { value.data.v_enum = optionIt - options.begin(); } } else if (it->is_number()) { - auto& values = vd->second->optionValues; + auto& values = vd->second.optionValues; double num = it.value(); auto valueIt = std::find_if( values.begin(), values.end(), @@ -103,17 +103,17 @@ void HALSimWSProviderSimDevice::OnNetValueChanged(const wpi::json& json) { } case HAL_INT: value.data.v_int = it.value(); - value.data.v_int -= vd->second->intOffset; + value.data.v_int -= vd->second.intOffset; break; case HAL_LONG: value.data.v_long = it.value(); - value.data.v_long -= vd->second->intOffset; + value.data.v_long -= vd->second.intOffset; break; default: break; } - HAL_SetSimValue(vd->second->handle, &value); + HAL_SetSimValue(vd->second.handle, &value); } } } @@ -146,30 +146,31 @@ void HALSimWSProviderSimDevice::OnValueCreated(const char* name, } } std::string key = fmt::format("{}{}", prefix, name); - auto data = std::make_unique(); - data->device = this; - data->handle = handle; - data->key = key; + SimDeviceValueData data; + data.device = this; + data.handle = handle; + data.key = key; if (value->type == HAL_ENUM) { int32_t numOptions = 0; const char** options = HALSIM_GetSimValueEnumOptions(handle, &numOptions); - data->options.reserve(numOptions); + data.options.reserve(numOptions); for (int32_t i = 0; i < numOptions; ++i) { - data->options.emplace_back(options[i]); + data.options.emplace_back(options[i]); } const double* values = HALSIM_GetSimValueEnumDoubleValues(handle, &numOptions); - data->optionValues.assign(values, values + numOptions); + data.optionValues.assign(values, values + numOptions); } - data->valueType = value->type; + data.valueType = value->type; - auto param = data.get(); + SimDeviceValueData* param; { std::unique_lock lock(m_vhLock); - m_valueHandles[data->key] = std::move(data); + param = &m_valueHandles.insert_or_assign(data.key, std::move(data)) + .first->second; } int32_t cbKey = HALSIM_RegisterSimValueChangedCallback( diff --git a/simulation/halsim_ws_core/src/main/native/include/WSProvider_SimDevice.h b/simulation/halsim_ws_core/src/main/native/include/WSProvider_SimDevice.h index 3bc2df12d8..66f8303d1d 100644 --- a/simulation/halsim_ws_core/src/main/native/include/WSProvider_SimDevice.h +++ b/simulation/halsim_ws_core/src/main/native/include/WSProvider_SimDevice.h @@ -74,7 +74,7 @@ class HALSimWSProviderSimDevice : public HALSimWSBaseProvider { void CancelCallbacks(); - wpi::StringMap> m_valueHandles; + wpi::StringMap m_valueHandles; std::shared_mutex m_vhLock; HAL_SimDeviceHandle m_handle;