#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4820 4514 5045)
#endif
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <foreign/fmi/fmi2Functions.h>
#include "sumo2fmi_bridge.h"
#include "libsumocpp2c.h"
#define UNUSED_PARAMETER(x) ((void)(x))
const char* fmi2GetTypesPlatform(void) {
return fmi2TypesPlatform;
}
const char* fmi2GetVersion(void) {
return fmi2Version;
}
fmi2Status
fmi2SetDebugLogging(fmi2Component c, fmi2Boolean loggingOn, size_t nCategories, const fmi2String categories[]) {
ModelInstance* comp = (ModelInstance*)c;
if (loggingOn) {
size_t i;
for (i = 0; i < nCategories; i++) {
if (categories[i] == NULL) {
sumo2fmi_logError(comp, "Log category[%d] must not be NULL", i);
return fmi2Error;
} else if (strcmp(categories[i], "logStatusError") == 0) {
comp->logErrors = true;
} else if (strcmp(categories[i], "logEvents") == 0) {
comp->logEvents = true;
} else {
sumo2fmi_logError(comp, "Log category[%d] must be one of logEvents or logStatusError but was %s", i, categories[i]);
return fmi2Error;
}
}
} else {
comp->logEvents = false;
comp->logErrors = false;
}
return fmi2OK;
}
fmi2Component
fmi2Instantiate(fmi2String instanceName, fmi2Type fmuType, fmi2String fmuGUID,
fmi2String fmuResourceLocation, const fmi2CallbackFunctions* functions,
fmi2Boolean visible, fmi2Boolean loggingOn) {
UNUSED_PARAMETER(fmuType);
UNUSED_PARAMETER(fmuGUID);
UNUSED_PARAMETER(visible);
allocateMemoryType funcAllocateMemory = (allocateMemoryType)functions->allocateMemory;
ModelInstance* comp = (ModelInstance*) funcAllocateMemory(1, sizeof(ModelInstance));
if (comp) {
comp->componentEnvironment = functions->componentEnvironment;
comp->logger = (loggerType)functions->logger;
comp->allocateMemory = (allocateMemoryType)functions->allocateMemory;
comp->freeMemory = (freeMemoryType)functions->freeMemory;
comp->instanceName = (char*)comp->allocateMemory(1 + strlen(instanceName), sizeof(char));
strcpy((char*)comp->instanceName, (char*)instanceName);
if (fmuResourceLocation) {
comp->resourceLocation = (char*)comp->allocateMemory(1 + strlen(fmuResourceLocation), sizeof(char));
strcpy((char*)comp->resourceLocation, (char*)fmuResourceLocation);
} else {
comp->resourceLocation = NULL;
}
comp->logEvents = loggingOn;
comp->logErrors = true;
}
return comp;
}
void
fmi2FreeInstance(fmi2Component c) {
ModelInstance* comp = (ModelInstance*)c;
freeMemoryType freeMemoryFunc = comp->freeMemory;
freeMemoryFunc((void*)comp->instanceName);
freeMemoryFunc((void*)comp->resourceLocation);
freeMemoryFunc((void*)comp->libsumoCallOptions);
freeMemoryFunc((void*)comp->getterParameters);
int i;
for (i = 0; i < comp->bufferArrayLength; i++) {
freeMemoryFunc((void*)comp->bufferArray[i]);
}
freeMemoryFunc((void*)comp->bufferArray);
freeMemoryFunc((void*)comp);
}
fmi2Status
fmi2SetupExperiment(fmi2Component c, fmi2Boolean toleranceDefined, fmi2Real tolerance,
fmi2Real startTime, fmi2Boolean stopTimeDefined, fmi2Real stopTime) {
UNUSED_PARAMETER(toleranceDefined);
UNUSED_PARAMETER(tolerance);
UNUSED_PARAMETER(stopTimeDefined);
ModelInstance* comp = (ModelInstance*)c;
comp->startTime = startTime;
comp->stopTime = stopTime;
sumo2fmi_set_startValues(comp);
return fmi2OK;
}
fmi2Status
fmi2EnterInitializationMode(fmi2Component c) {
UNUSED_PARAMETER(c);
return fmi2OK;
}
fmi2Status
fmi2ExitInitializationMode(fmi2Component c) {
ModelInstance* comp = (ModelInstance*)c;
sumo2fmi_logEvent(comp, "Calling libsumo with the following options: \"%s\"", comp->libsumoCallOptions);
libsumo_load(comp->libsumoCallOptions);
return fmi2OK;
}
fmi2Status
fmi2Terminate(fmi2Component c) {
UNUSED_PARAMETER(c);
libsumo_close();
return fmi2OK;
}
fmi2Status
fmi2Reset(fmi2Component c) {
UNUSED_PARAMETER(c);
return fmi2OK;
}
fmi2Status
fmi2GetReal(fmi2Component c, const fmi2ValueReference vr[], size_t nvr, fmi2Real value[]) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(vr);
UNUSED_PARAMETER(nvr);
UNUSED_PARAMETER(value);
return fmi2Error;
}
fmi2Status
fmi2GetInteger(fmi2Component c, const fmi2ValueReference vr[], size_t nvr, fmi2Integer value[]) {
ModelInstance* comp = (ModelInstance*)c;
if (nvr > 0 && (!vr || !value)) {
return fmi2Error;
}
fmi2Status status = fmi2OK;
size_t i;
for (i = 0; i < nvr; i++) {
fmi2Status s = sumo2fmi_getInteger(comp, vr[i], &(value[i]));
status = s > status ? s : status;
if (status > fmi2Warning) {
return status;
}
}
return status;
}
fmi2Status
fmi2GetBoolean(fmi2Component c, const fmi2ValueReference vr[], size_t nvr, fmi2Boolean value[]) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(vr);
UNUSED_PARAMETER(nvr);
UNUSED_PARAMETER(value);
return fmi2Error;
}
fmi2Status
fmi2GetString(fmi2Component c, const fmi2ValueReference vr[], size_t nvr, fmi2String value[]) {
ModelInstance* comp = (ModelInstance*)c;
if (nvr > 0 && (!vr || !value)) {
return fmi2Error;
}
fmi2Status status = fmi2OK;
int b;
for (b = 0; b < comp->bufferArrayLength; b++) {
comp->freeMemory((void*)comp->bufferArray[b]);
}
comp->freeMemory((void*)comp->bufferArray);
comp->bufferArray = (fmi2String*)comp->allocateMemory(nvr, sizeof(fmi2String));
comp->bufferArrayLength = (int)nvr;
size_t i;
for (i = 0; i < nvr; i++) {
fmi2Status s = sumo2fmi_getString(comp, vr[i], &(comp->bufferArray[i]));
value[i] = comp->bufferArray[i];
if (value[i] == NULL) {
s = fmi2Error;
}
status = s > status ? s : status;
if (status > fmi2Warning) {
return status;
}
}
return status;
}
fmi2Status
fmi2SetReal(fmi2Component c, const fmi2ValueReference vr[], size_t nvr, const fmi2Real value[]) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(vr);
UNUSED_PARAMETER(nvr);
UNUSED_PARAMETER(value);
return fmi2Error;
}
fmi2Status
fmi2SetInteger(fmi2Component c, const fmi2ValueReference vr[], size_t nvr, const fmi2Integer value[]) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(vr);
UNUSED_PARAMETER(nvr);
UNUSED_PARAMETER(value);
return fmi2Error;
}
fmi2Status
fmi2SetBoolean(fmi2Component c, const fmi2ValueReference vr[], size_t nvr, const fmi2Boolean value[]) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(vr);
UNUSED_PARAMETER(nvr);
UNUSED_PARAMETER(value);
return fmi2Error;
}
fmi2Status
fmi2SetString(fmi2Component c, const fmi2ValueReference vr[], size_t nvr, const fmi2String value[]) {
ModelInstance* comp = (ModelInstance*)c;
fmi2Status status = fmi2OK;
size_t i;
for (i = 0; i < nvr; i++) {
fmi2Status s = sumo2fmi_setString(comp, vr[i], value[i]);
status = s > status ? s : status;
if (status > fmi2Warning) {
return status;
}
}
return status;
}
fmi2Status
fmi2GetFMUstate(fmi2Component c, fmi2FMUstate* FMUstate) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(FMUstate);
return fmi2Error;
}
fmi2Status
fmi2SetFMUstate(fmi2Component c, fmi2FMUstate FMUstate) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(FMUstate);
return fmi2Error;
}
fmi2Status
fmi2FreeFMUstate(fmi2Component c, fmi2FMUstate* FMUstate) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(FMUstate);
return fmi2Error;
}
fmi2Status
fmi2SerializedFMUstateSize(fmi2Component c, fmi2FMUstate FMUstate, size_t* size) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(FMUstate);
UNUSED_PARAMETER(size);
return fmi2Error;
}
fmi2Status
fmi2SerializeFMUstate(fmi2Component c, fmi2FMUstate FMUstate, fmi2Byte state[], size_t size) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(FMUstate);
UNUSED_PARAMETER(state);
UNUSED_PARAMETER(size);
return fmi2Error;
}
fmi2Status
fmi2DeSerializeFMUstate(fmi2Component c, const fmi2Byte serializedState[], size_t size, fmi2FMUstate* FMUstate) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(serializedState);
UNUSED_PARAMETER(size);
UNUSED_PARAMETER(FMUstate);
return fmi2Error;
}
fmi2Status
fmi2GetDirectionalDerivative(fmi2Component c, const fmi2ValueReference vUnknown_ref[], size_t nUnknown,
const fmi2ValueReference vKnown_ref[], size_t nKnown, const fmi2Real dvKnown[], fmi2Real dvUnknown[]) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(vUnknown_ref);
UNUSED_PARAMETER(nUnknown);
UNUSED_PARAMETER(vKnown_ref);
UNUSED_PARAMETER(nKnown);
UNUSED_PARAMETER(dvKnown);
UNUSED_PARAMETER(dvUnknown);
return fmi2Error;
}
fmi2Status
fmi2SetRealInputDerivatives(fmi2Component c, const fmi2ValueReference vr[], size_t nvr, const fmi2Integer order[], const fmi2Real value[]) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(vr);
UNUSED_PARAMETER(nvr);
UNUSED_PARAMETER(order);
UNUSED_PARAMETER(value);
return fmi2Error;
}
fmi2Status
fmi2GetRealOutputDerivatives(fmi2Component c, const fmi2ValueReference vr[], size_t nvr, const fmi2Integer order[], fmi2Real value[]) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(vr);
UNUSED_PARAMETER(order);
size_t i;
for (i = 0; i < nvr; i++) {
value[i] = 0;
}
return fmi2Error;
}
fmi2Status
fmi2DoStep(fmi2Component c, fmi2Real currentCommunicationPoint, fmi2Real communicationStepSize, fmi2Boolean noSetFMUStatePriorToCurrentPoint) {
UNUSED_PARAMETER(noSetFMUStatePriorToCurrentPoint);
ModelInstance* comp = (ModelInstance*)c;
if (communicationStepSize <= 0) {
return fmi2Error;
}
return sumo2fmi_step(comp, currentCommunicationPoint + communicationStepSize);
}
fmi2Status
fmi2CancelStep(fmi2Component c) {
UNUSED_PARAMETER(c);
return fmi2Error;
}
fmi2Status
fmi2GetStatus(fmi2Component c, const fmi2StatusKind s, fmi2Status* value) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(s);
UNUSED_PARAMETER(value);
return fmi2Discard;
}
fmi2Status
fmi2GetRealStatus(fmi2Component c, const fmi2StatusKind s, fmi2Real* value) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(s);
UNUSED_PARAMETER(value);
return fmi2Discard;
}
fmi2Status
fmi2GetIntegerStatus(fmi2Component c, const fmi2StatusKind s, fmi2Integer* value) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(s);
UNUSED_PARAMETER(value);
return fmi2Discard;
}
fmi2Status
fmi2GetBooleanStatus(fmi2Component c, const fmi2StatusKind s, fmi2Boolean* value) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(s);
UNUSED_PARAMETER(value);
return fmi2Discard;
}
fmi2Status
fmi2GetStringStatus(fmi2Component c, const fmi2StatusKind s, fmi2String* value) {
UNUSED_PARAMETER(c);
UNUSED_PARAMETER(s);
UNUSED_PARAMETER(value);
return fmi2Discard;
}