@@ -473,6 +473,7 @@ fmi2Status fmi2GetDirectionalDerivative(fmi2Component,
473473
474474
475475fmi2Status fmi2GetFMUstate (fmi2Component c, fmi2FMUstate *state) {
476+
476477 const auto component = static_cast <Fmi2Component *>(c);
477478
478479 try {
@@ -491,6 +492,7 @@ fmi2Status fmi2GetFMUstate(fmi2Component c, fmi2FMUstate *state) {
491492}
492493
493494fmi2Status fmi2SetFMUstate (fmi2Component c, fmi2FMUstate state) {
495+
494496 const auto component = static_cast <Fmi2Component *>(c);
495497
496498 try {
@@ -509,6 +511,11 @@ fmi2Status fmi2SetFMUstate(fmi2Component c, fmi2FMUstate state) {
509511
510512
511513fmi2Status fmi2FreeFMUstate (fmi2Component c, fmi2FMUstate *state) {
514+
515+ if (state == nullptr || *state == nullptr ) {
516+ return fmi2OK;
517+ }
518+
512519 const auto component = static_cast <Fmi2Component *>(c);
513520
514521 try {
@@ -525,23 +532,68 @@ fmi2Status fmi2FreeFMUstate(fmi2Component c, fmi2FMUstate *state) {
525532 }
526533}
527534
528- fmi2Status fmi2SerializedFMUstateSize (fmi2Component, fmi2FMUstate, size_t *) {
535+ fmi2Status fmi2SerializedFMUstateSize (fmi2Component c , fmi2FMUstate state , size_t *size ) {
529536
530- return fmi2Error;
537+ const auto component = static_cast <Fmi2Component *>(c);
538+
539+ try {
540+
541+ component->slave ->serializedFMUStateSize (state, *size);
542+ return fmi2OK;
543+
544+ } catch (const fmu4cpp::fatal_error &ex) {
545+ component->logger ->log (fmiFatal, ex.what ());
546+ return fmi2Fatal;
547+ } catch (const std::exception &ex) {
548+ component->logger ->log (fmiError, ex.what ());
549+ return fmi2Error;
550+ }
531551}
532552
533- fmi2Status fmi2SerializeFMUstate (fmi2Component, fmi2FMUstate, fmi2Byte[], size_t ) {
553+ fmi2Status fmi2SerializeFMUstate (fmi2Component c , fmi2FMUstate state , fmi2Byte data [], size_t size ) {
534554
535- return fmi2Error;
555+ const auto component = static_cast <Fmi2Component *>(c);
556+
557+ try {
558+
559+ std::vector<uint8_t > serializedState (size);
560+ component->slave ->serializeFMUState (state, serializedState);
561+ std::memcpy (data, serializedState.data (), size);
562+ return fmi2OK;
563+
564+ } catch (const fmu4cpp::fatal_error &ex) {
565+ component->logger ->log (fmiFatal, ex.what ());
566+ return fmi2Fatal;
567+ } catch (const std::exception &ex) {
568+ component->logger ->log (fmiError, ex.what ());
569+ return fmi2Error;
570+ }
536571}
537572
538- fmi2Status fmi2DeSerializeFMUstate (fmi2Component, const fmi2Byte[], size_t , fmi2FMUstate *) {
573+ fmi2Status fmi2DeSerializeFMUstate (fmi2Component c , const fmi2Byte data [], size_t size , fmi2FMUstate *state ) {
539574
540- return fmi2Error;
575+ const auto component = static_cast <Fmi2Component *>(c);
576+
577+ try {
578+
579+ std::vector<uint8_t > serializedState (data, data + size);
580+ component->slave ->deserializeFMUState (serializedState, state);
581+ return fmi2OK;
582+
583+ } catch (const fmu4cpp::fatal_error &ex) {
584+ component->logger ->log (fmiFatal, ex.what ());
585+ return fmi2Fatal;
586+ } catch (const std::exception &ex) {
587+ component->logger ->log (fmiError, ex.what ());
588+ return fmi2Error;
589+ }
541590}
542591
543592void fmi2FreeInstance (fmi2Component c) {
544- const auto component = static_cast <Fmi2Component *>(c);
545- delete component;
593+ if (c) {
594+ const auto component = static_cast <Fmi2Component *>(c);
595+ delete component;
596+ c = nullptr ;
597+ }
546598}
547599}
0 commit comments