void* FMI1ModelExchangeConstructor_OMC(int fmi_log_level, char* working_directory, char* instanceName, int debugLogging) { FMI1ModelExchange* FMI1ME = malloc(sizeof(FMI1ModelExchange)); FMI1ME->FMILogLevel = fmi_log_level; /* JM callbacks */ FMI1ME->JMCallbacks.malloc = malloc; FMI1ME->JMCallbacks.calloc = calloc; FMI1ME->JMCallbacks.realloc = realloc; FMI1ME->JMCallbacks.free = free; FMI1ME->JMCallbacks.logger = importlogger; FMI1ME->JMCallbacks.log_level = FMI1ME->FMILogLevel; FMI1ME->JMCallbacks.context = 0; FMI1ME->FMIImportContext = fmi_import_allocate_context(&FMI1ME->JMCallbacks); /* FMI callback functions */ FMI1ME->FMICallbackFunctions.logger = fmi1logger; FMI1ME->FMICallbackFunctions.allocateMemory = calloc; FMI1ME->FMICallbackFunctions.freeMemory = free; /* parse the xml file */ FMI1ME->FMIWorkingDirectory = (char*) malloc(strlen(working_directory)+1); strcpy(FMI1ME->FMIWorkingDirectory, working_directory); FMI1ME->FMIImportInstance = fmi1_import_parse_xml(FMI1ME->FMIImportContext, FMI1ME->FMIWorkingDirectory); if(!FMI1ME->FMIImportInstance) { fprintf(stderr, "Error parsing the XML file contained in %s\n", FMI1ME->FMIWorkingDirectory); return 0; } /* Load the binary (dll/so) */ jm_status_enu_t status; status = fmi1_import_create_dllfmu(FMI1ME->FMIImportInstance, FMI1ME->FMICallbackFunctions, 0); if (status == jm_status_error) { fprintf(stderr, "Could not create the DLL loading mechanism(C-API).\n"); return 0; } FMI1ME->FMIInstanceName = (char*) malloc(strlen(instanceName)+1); strcpy(FMI1ME->FMIInstanceName, instanceName); FMI1ME->FMIDebugLogging = debugLogging; fmi1_import_instantiate_model(FMI1ME->FMIImportInstance, FMI1ME->FMIInstanceName); fmi1_import_set_debug_logging(FMI1ME->FMIImportInstance, FMI1ME->FMIDebugLogging); FMI1ME->FMIToleranceControlled = fmi1_true; FMI1ME->FMIRelativeTolerance = 0.001; FMI1ME->FMIEventInfo = malloc(sizeof(fmi1_event_info_t)); fmi1_import_initialize(FMI1ME->FMIImportInstance, FMI1ME->FMIToleranceControlled, FMI1ME->FMIRelativeTolerance, FMI1ME->FMIEventInfo); return FMI1ME; }
int test_logger(fmi1_import_t* fmu) { fmi1_status_t fmistatus; jm_status_enu_t jmstatus; jmstatus = fmi1_import_instantiate_model(fmu, "LoggerTesting"); if (jmstatus == jm_status_error) { printf("fmi1_import_instantiate_model failed\n"); do_exit(CTEST_RETURN_FAIL); } /* Logger message to print: */ { fmi1_value_reference_t* vr; size_t n; size_t k; const char* str[] = { "###### Reals ######", "OK HIGHT = #r0#", /* HIGHT */ "OK HIGHT_SPEED = #r1#", /* HIGHT_SPEED */ "OK GRAVITY = #r2#", /* GRAVITY */ "OK BOUNCE_COF = #r3#", /* BOUNCE_COF */ "Bad reference #r0", "Bad reference #r-0", "Bad reference #r-1", "Bad reference #r100#", "###### Integers ######", "OK LOGGER_TEST_INTEGER = #i0#", /* LOGGER_TEST_INTEGER */ "Bad reference #i0", "Bad reference #i-0", "Bad reference #i-1", "Bad reference #i100#", "###### Booleans ######", "OK LOGGER_TEST_BOOLEAN = #b0#", /* LOGGER_TEST_BOOLEAN */ "Bad reference #b0", "Bad reference #b-0", "Bad reference #b-1", "Bad reference #b100#", "###### Strings ######", "OK LOGGER_TEST = #s0#", /* LOGGER_TEST */ "Bad reference #s0", "Bad reference #s-0", "Bad reference #s-1", "Bad reference #s100#" }; n = sizeof(str)/sizeof(*str); vr = calloc(n, sizeof(fmi1_value_reference_t)); for (k = 0; k < n; k++) { vr[k] = VAR_S_LOGGER_TEST; } fmistatus = fmi1_import_set_string(fmu, vr, n, str); if(fmistatus != fmi1_status_ok) { abort(); } { /* Print a really big message */ #define MESSAGE_SIZE_TO_EXPAND_AND_PRINT 3000 /* Using fixed size since the log message is printed to a file and compared */ #if JM_MAX_ERROR_MESSAGE_SIZE + 200 > MESSAGE_SIZE_TO_EXPAND_AND_PRINT #error This test triggers the logger function to allocate more memory than the default size JM_MAX_ERROR_MESSAGE_SIZE. If you change JM_MAX_ERROR_MESSAGE_SIZE, please update this test. #endif char longmessage[MESSAGE_SIZE_TO_EXPAND_AND_PRINT]; const char* str[1]; str[0] = (const char*)&longmessage; { fmi1_value_reference_t vr = VAR_S_LOGGER_TEST; int k; char repmsg[] = "#r0# "; /* HIGHT */ for (k = 0; k < sizeof(longmessage)/sizeof(*longmessage) - 1; k++) { longmessage[k] = repmsg[k%(sizeof(repmsg)/sizeof(*repmsg) - 1)]; } longmessage[k] = '\0'; fmistatus = fmi1_import_set_string(fmu, &vr, 1, str); if(fmistatus != fmi1_status_ok) { abort(); } } } free(vr); } fmi1_import_free_model_instance(fmu); return 0; }