fmi2_capi_t* fmi2_capi_create_dllfmu(jm_callbacks* cb, const char* dllPath, const char* modelIdentifier, const fmi2_callback_functions_t* callBackFunctions, fmi2_fmu_kind_enu_t standard) { fmi2_capi_t* fmu = NULL; jm_log_debug(cb, FMI_CAPI_MODULE_NAME, "Initializing data structures for FMICAPI."); /* Minor check for the callbacks */ if (cb == NULL) { assert(0); return NULL; } /* Allocate memory for the FMU instance */ fmu = (fmi2_capi_t*)cb->calloc(1, sizeof(fmi2_capi_t)); if (fmu == NULL) { /* Could not allocate memory for the FMU struct */ jm_log_fatal(cb, FMI_CAPI_MODULE_NAME, "Could not allocate memory for the FMU struct."); return NULL; } /* Set the import package callback functions */ fmu->callbacks = cb; /* Set the FMI callback functions */ fmu->callBackFunctions = *callBackFunctions; /* Set FMI standard to load */ fmu->standard = standard; /* Set all memory alloated pointers to NULL */ fmu->dllPath = NULL; fmu->modelIdentifier = NULL; /* Copy DLL path */ fmu->dllPath = (char*)cb->calloc(sizeof(char), strlen(dllPath) + 1); if (fmu->dllPath == NULL) { jm_log_fatal(cb, FMI_CAPI_MODULE_NAME, "Could not allocate memory for the DLL path string."); fmi2_capi_destroy_dllfmu(fmu); return NULL; } strcpy((char*)fmu->dllPath, dllPath); /* Copy the modelIdentifier */ fmu->modelIdentifier = (char*)cb->calloc(sizeof(char), strlen(modelIdentifier) + 1); if (fmu->modelIdentifier == NULL) { jm_log_fatal(cb, FMI_CAPI_MODULE_NAME, "Could not allocate memory for the modelIdentifier string."); fmi2_capi_destroy_dllfmu(fmu); return NULL; } strcpy((char*)fmu->modelIdentifier, modelIdentifier); jm_log_debug(cb, FMI_CAPI_MODULE_NAME, "Successfully initialized data structures for FMICAPI."); /* Everything was successful */ return fmu; }
void fmi2_capi_destroy_dllfmu(fmi2_capi_t* fmu) { if (fmu == NULL) { return; } fmi2_capi_free_dll(fmu); jm_log_debug(fmu->callbacks, FMI_CAPI_MODULE_NAME, "Releasing allocated memory"); fmu->callbacks->free((void*)fmu->dllPath); fmu->callbacks->free((void*)fmu->modelIdentifier); fmu->callbacks->free((void*)fmu); }
fmi1_status_t fmi1_capi_get_continuous_states(fmi1_capi_t* fmu, fmi1_real_t states[], size_t nx) { assert(fmu); jm_log_debug(fmu->callbacks, FMI_CAPI_MODULE_NAME, "Calling fmiGetContinuousStates"); return fmu->fmiGetContinuousStates(fmu->c, states, nx); }
fmi1_status_t fmi1_capi_eventUpdate(fmi1_capi_t* fmu, fmi1_boolean_t intermediateResults, fmi1_event_info_t* eventInfo) { assert(fmu); jm_log_debug(fmu->callbacks, FMI_CAPI_MODULE_NAME, "Calling fmiEventUpdate"); return fmu->fmiEventUpdate(fmu->c, intermediateResults, eventInfo); }
fmi1_status_t fmi1_capi_get_event_indicators(fmi1_capi_t* fmu, fmi1_real_t eventIndicators[], size_t ni) { assert(fmu); jm_log_debug(fmu->callbacks, FMI_CAPI_MODULE_NAME, "Calling fmiGetEventIndicators"); return fmu->fmiGetEventIndicators(fmu->c, eventIndicators, ni); }
fmi1_status_t fmi1_capi_get_derivatives(fmi1_capi_t* fmu, fmi1_real_t derivatives[], size_t nx) { assert(fmu); jm_log_debug(fmu->callbacks, FMI_CAPI_MODULE_NAME, "Calling fmiGetDerivatives"); return fmu->fmiGetDerivatives(fmu->c, derivatives, nx); }
fmi1_status_t fmi1_capi_completed_integrator_step(fmi1_capi_t* fmu, fmi1_boolean_t* callEventUpdate) { assert(fmu); jm_log_debug(fmu->callbacks, FMI_CAPI_MODULE_NAME, "Calling fmiCompletedIntegratorStep"); return fmu->fmiCompletedIntegratorStep(fmu->c, callEventUpdate); }
fmi1_status_t fmi1_capi_set_time(fmi1_capi_t* fmu, fmi1_real_t time) { assert(fmu); jm_log_debug(fmu->callbacks, FMI_CAPI_MODULE_NAME, "Calling fmiGetModelTypesPlatform"); return fmu->fmiSetTime(fmu->c, time); }
fmi1_status_t fmi1_capi_terminate(fmi1_capi_t* fmu) { assert(fmu); jm_log_debug(fmu->callbacks, FMI_CAPI_MODULE_NAME, "Calling fmiTerminate"); return fmu->fmiTerminate(fmu->c); }
fmi1_status_t fmi1_capi_get_state_value_references(fmi1_capi_t* fmu, fmi1_value_reference_t vrx[], size_t nx) { assert(fmu); jm_log_debug(fmu->callbacks, FMI_CAPI_MODULE_NAME, "Calling fmiGetStateValueReferences"); return fmu->fmiGetStateValueReferences(fmu->c, vrx, nx); }