示例#1
0
void FMI1ModelExchangeDestructor_OMC(void* in_fmi1me)
{
  FMI1ModelExchange* FMI1ME = (FMI1ModelExchange*)in_fmi1me;
  fmi1_import_terminate(FMI1ME->FMIImportInstance);
  fmi1_import_free_model_instance(FMI1ME->FMIImportInstance);
  fmi1_import_destroy_dllfmu(FMI1ME->FMIImportInstance);
  fmi1_import_free(FMI1ME->FMIImportInstance);
  fmi_import_free_context(FMI1ME->FMIImportContext);
  free(FMI1ME->FMIWorkingDirectory);
  free(FMI1ME->FMIInstanceName);
  free(FMI1ME->FMIEventInfo);
}
示例#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;
}