@@ -602,48 +602,122 @@ fmi3Status fmi3GetDirectionalDerivative(fmi3Instance instance,
602602fmi3Status fmi3GetFMUState (fmi3Instance c, fmi3FMUState *state) {
603603 const auto component = static_cast <Fmi3Component *>(c);
604604
605- if (auto s = component->slave ->getFMUState ()) {
605+ try {
606+
607+ const auto s = component->slave ->getFMUState ();
606608 *state = s;
607609 return fmi3OK;
608- }
609610
610- return fmi3Error;
611+ } catch (const fmu4cpp::fatal_error &ex) {
612+ component->logger ->log (fmiFatal, ex.what ());
613+ component->state = Fmi3Component::State::Invalid;
614+ return fmi3Fatal;
615+ } catch (const std::exception &ex) {
616+ component->logger ->log (fmiError, ex.what ());
617+ component->state = Fmi3Component::State::Terminated;
618+ return fmi3Error;
619+ }
611620}
612621
613622fmi3Status fmi3SetFMUState (fmi3Instance c, fmi3FMUState state) {
614623 const auto component = static_cast <Fmi3Component *>(c);
615624
616- if (component->slave ->setFmuState (state)) {
625+ try {
626+
627+ component->slave ->setFmuState (state);
617628 return fmi3OK;
618- }
619629
620- return fmi3Error;
630+ } catch (const fmu4cpp::fatal_error &ex) {
631+ component->logger ->log (fmiFatal, ex.what ());
632+ component->state = Fmi3Component::State::Invalid;
633+ return fmi3Fatal;
634+ } catch (const std::exception &ex) {
635+ component->logger ->log (fmiError, ex.what ());
636+ component->state = Fmi3Component::State::Terminated;
637+ return fmi3Error;
638+ }
621639}
622640
623641
624642fmi3Status fmi3FreeFMUState (fmi3Instance c, fmi3FMUState *state) {
625643 const auto component = static_cast <Fmi3Component *>(c);
626644
627- if (component->slave ->freeFmuState (state)) {
645+ try {
646+
647+ component->slave ->freeFmuState (state);
628648 return fmi3OK;
629- }
630649
631- return fmi3Error;
650+ } catch (const fmu4cpp::fatal_error &ex) {
651+ component->logger ->log (fmiFatal, ex.what ());
652+ component->state = Fmi3Component::State::Invalid;
653+ return fmi3Fatal;
654+ } catch (const std::exception &ex) {
655+ component->logger ->log (fmiError, ex.what ());
656+ component->state = Fmi3Component::State::Terminated;
657+ return fmi3Error;
658+ }
632659}
633660
634- fmi3Status fmi3SerializedFMUStateSize (fmi3Instance, fmi3FMUState, size_t *) {
661+ fmi3Status fmi3SerializedFMUStateSize (fmi3Instance c, fmi3FMUState state, size_t *size) {
662+ const auto component = static_cast <Fmi3Component *>(c);
635663
636- return fmi3Error;
664+ try {
665+
666+ component->slave ->serializedFMUStateSize (state, *size);
667+ return fmi3OK;
668+
669+ } catch (const fmu4cpp::fatal_error &ex) {
670+ component->logger ->log (fmiFatal, ex.what ());
671+ component->state = Fmi3Component::State::Invalid;
672+ return fmi3Fatal;
673+ } catch (const std::exception &ex) {
674+ component->logger ->log (fmiError, ex.what ());
675+ component->state = Fmi3Component::State::Terminated;
676+ return fmi3Error;
677+ }
637678}
638679
639- fmi3Status fmi3SerializeFMUState (fmi3Instance, fmi3FMUState, fmi3Byte[], size_t ) {
680+ fmi3Status fmi3SerializeFMUState (fmi3Instance c , fmi3FMUState state , fmi3Byte data [], size_t size ) {
640681
641- return fmi3Error;
682+ const auto component = static_cast <Fmi3Component *>(c);
683+
684+ try {
685+
686+ std::vector<uint8_t > serializedState (size);
687+ component->slave ->serializeFMUState (state, serializedState);
688+ std::memcpy (data, serializedState.data (), size);
689+ return fmi3OK;
690+
691+ } catch (const fmu4cpp::fatal_error &ex) {
692+ component->logger ->log (fmiFatal, ex.what ());
693+ component->state = Fmi3Component::State::Invalid;
694+ return fmi3Fatal;
695+ } catch (const std::exception &ex) {
696+ component->logger ->log (fmiError, ex.what ());
697+ component->state = Fmi3Component::State::Terminated;
698+ return fmi3Error;
699+ }
642700}
643701
644- fmi3Status fmi3DeserializeFMUState (fmi3Instance, const fmi3Byte[], size_t , fmi3FMUState *) {
702+ fmi3Status fmi3DeserializeFMUState (fmi3Instance c , const fmi3Byte data [], size_t size , fmi3FMUState *state ) {
645703
646- return fmi3Error;
704+ const auto component = static_cast <Fmi3Component *>(c);
705+
706+ try {
707+
708+ std::vector serializedState (data, data + size);
709+ component->slave ->deserializeFMUState (serializedState, state);
710+ return fmi3OK;
711+
712+ } catch (const fmu4cpp::fatal_error &ex) {
713+ component->logger ->log (fmiFatal, ex.what ());
714+ component->state = Fmi3Component::State::Invalid;
715+ return fmi3Fatal;
716+ } catch (const std::exception &ex) {
717+ component->logger ->log (fmiError, ex.what ());
718+ component->state = Fmi3Component::State::Terminated;
719+ return fmi3Error;
720+ }
647721}
648722
649723fmi3Status fmi3GetClock (fmi3Instance instance,
0 commit comments