From 722e23a2794cabf95d608eb8d1b28972b93bda99 Mon Sep 17 00:00:00 2001 From: Lars Ivar Hatledal Date: Thu, 26 Jun 2025 21:10:55 +0200 Subject: [PATCH] implement fmi2GetBooleanStatus #243 also return fmi2Discard, not fmi2Error on fmi2GetXXXStatus --- .../pythonfmu-export/src/pythonfmu/fmi2.cpp | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/pythonfmu/pythonfmu-export/src/pythonfmu/fmi2.cpp b/pythonfmu/pythonfmu-export/src/pythonfmu/fmi2.cpp index e99c98c..1706f28 100644 --- a/pythonfmu/pythonfmu-export/src/pythonfmu/fmi2.cpp +++ b/pythonfmu/pythonfmu-export/src/pythonfmu/fmi2.cpp @@ -44,13 +44,10 @@ struct Fmi2Component { } double lastSuccessfulTime{0}; + bool wantsToTerminate{false}; std::unique_ptr slave; std::unique_ptr logger; - - double start{0}; - std::optional stop; - std::optional tolerance; }; } // namespace @@ -165,7 +162,7 @@ fmi2Status fmi2SetupExperiment( stopTimeDefined ? std::optional(stopTime) : std::nullopt, toleranceDefined ? std::optional(tolerance) : std::nullopt); return fmi2OK; - }catch (const pythonfmu::fatal_error& e) { + } catch (const pythonfmu::fatal_error& e) { component->logger->log(fmi2Fatal, e.what()); return fmi2Fatal; } catch (const std::exception& e) { @@ -564,6 +561,7 @@ fmi2Status fmi2DoStep( } component->lastSuccessfulTime = endTime; + component->wantsToTerminate = true; return fmi2Discard; } catch (const pythonfmu::fatal_error& e) { component->logger->log(fmi2Fatal, e.what()); @@ -606,9 +604,9 @@ fmi2Status fmi2GetRealStatus( return fmi2OK; } else { component->logger->log( - fmi2Error, + fmi2Discard, "Invalid status inquiry for fmi2GetRealStatus"); - return fmi2Error; + return fmi2Discard; } } @@ -618,19 +616,24 @@ fmi2Status fmi2GetIntegerStatus( fmi2Integer*) { static_cast(c)->logger->log( - fmi2Error, + fmi2Discard, "FMI function not supported: fmi2GetIntegerStatus"); - return fmi2Error; + return fmi2Discard; } fmi2Status fmi2GetBooleanStatus( fmi2Component c, - const fmi2StatusKind, - fmi2Boolean*) + const fmi2StatusKind s, + fmi2Boolean* value) { - static_cast(c)->logger->log( - fmi2Error, "FMI function not supported: fmi2GetBooleanStatus"); - return fmi2Error; + const auto component = static_cast(c); + if (s == fmi2Terminated) { + *value = component->wantsToTerminate ? fmi2True : fmi2False; + return fmi2OK; + } + component->logger->log( + fmi2Discard, "FMI function not supported: fmi2GetBooleanStatus"); + return fmi2Discard; } fmi2Status fmi2GetStringStatus( @@ -639,7 +642,7 @@ fmi2Status fmi2GetStringStatus( fmi2String*) { static_cast(c)->logger->log( - fmi2Error, "FMI function not supported: fmi2GetStringStatus"); - return fmi2Error; + fmi2Discard, "FMI function not supported: fmi2GetStringStatus"); + return fmi2Discard; } }