11
22#include " fmi2Functions.h"
33
4+ #include < cstring>
45#include < fstream>
56#include < limits>
67#include < memory>
@@ -473,6 +474,7 @@ fmi2Status fmi2GetDirectionalDerivative(fmi2Component,
473474
474475
475476fmi2Status fmi2GetFMUstate (fmi2Component c, fmi2FMUstate *state) {
477+
476478 const auto component = static_cast <Fmi2Component *>(c);
477479
478480 try {
@@ -491,6 +493,7 @@ fmi2Status fmi2GetFMUstate(fmi2Component c, fmi2FMUstate *state) {
491493}
492494
493495fmi2Status fmi2SetFMUstate (fmi2Component c, fmi2FMUstate state) {
496+
494497 const auto component = static_cast <Fmi2Component *>(c);
495498
496499 try {
@@ -509,6 +512,11 @@ fmi2Status fmi2SetFMUstate(fmi2Component c, fmi2FMUstate state) {
509512
510513
511514fmi2Status fmi2FreeFMUstate (fmi2Component c, fmi2FMUstate *state) {
515+
516+ if (state == nullptr || *state == nullptr ) {
517+ return fmi2OK;
518+ }
519+
512520 const auto component = static_cast <Fmi2Component *>(c);
513521
514522 try {
@@ -525,23 +533,68 @@ fmi2Status fmi2FreeFMUstate(fmi2Component c, fmi2FMUstate *state) {
525533 }
526534}
527535
528- fmi2Status fmi2SerializedFMUstateSize (fmi2Component, fmi2FMUstate, size_t *) {
536+ fmi2Status fmi2SerializedFMUstateSize (fmi2Component c , fmi2FMUstate state , size_t *size ) {
529537
530- return fmi2Error;
538+ const auto component = static_cast <Fmi2Component *>(c);
539+
540+ try {
541+
542+ component->slave ->serializedFMUStateSize (state, *size);
543+ return fmi2OK;
544+
545+ } catch (const fmu4cpp::fatal_error &ex) {
546+ component->logger ->log (fmiFatal, ex.what ());
547+ return fmi2Fatal;
548+ } catch (const std::exception &ex) {
549+ component->logger ->log (fmiError, ex.what ());
550+ return fmi2Error;
551+ }
531552}
532553
533- fmi2Status fmi2SerializeFMUstate (fmi2Component, fmi2FMUstate, fmi2Byte[], size_t ) {
554+ fmi2Status fmi2SerializeFMUstate (fmi2Component c , fmi2FMUstate state , fmi2Byte data [], size_t size ) {
534555
535- return fmi2Error;
556+ const auto component = static_cast <Fmi2Component *>(c);
557+
558+ try {
559+
560+ std::vector<uint8_t > serializedState (size);
561+ component->slave ->serializeFMUState (state, serializedState);
562+ std::memcpy (data, serializedState.data (), size);
563+ return fmi2OK;
564+
565+ } catch (const fmu4cpp::fatal_error &ex) {
566+ component->logger ->log (fmiFatal, ex.what ());
567+ return fmi2Fatal;
568+ } catch (const std::exception &ex) {
569+ component->logger ->log (fmiError, ex.what ());
570+ return fmi2Error;
571+ }
536572}
537573
538- fmi2Status fmi2DeSerializeFMUstate (fmi2Component, const fmi2Byte[], size_t , fmi2FMUstate *) {
574+ fmi2Status fmi2DeSerializeFMUstate (fmi2Component c , const fmi2Byte data [], size_t size , fmi2FMUstate *state ) {
539575
540- return fmi2Error;
576+ const auto component = static_cast <Fmi2Component *>(c);
577+
578+ try {
579+
580+ std::vector<uint8_t > serializedState (data, data + size);
581+ component->slave ->deserializeFMUState (serializedState, state);
582+ return fmi2OK;
583+
584+ } catch (const fmu4cpp::fatal_error &ex) {
585+ component->logger ->log (fmiFatal, ex.what ());
586+ return fmi2Fatal;
587+ } catch (const std::exception &ex) {
588+ component->logger ->log (fmiError, ex.what ());
589+ return fmi2Error;
590+ }
541591}
542592
543593void fmi2FreeInstance (fmi2Component c) {
544- const auto component = static_cast <Fmi2Component *>(c);
545- delete component;
594+ if (c) {
595+ const auto component = static_cast <Fmi2Component *>(c);
596+ delete component;
597+ c = nullptr ;
598+ }
546599}
547600}
0 commit comments