Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}