|
|
@ -1,7 +1,7 @@
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* MmsValue.c
|
|
|
|
* MmsValue.c
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Copyright 2013 Michael Zillgith
|
|
|
|
* Copyright 2013-2015 Michael Zillgith
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* This file is part of libIEC61850.
|
|
|
|
* This file is part of libIEC61850.
|
|
|
|
*
|
|
|
|
*
|
|
|
@ -1968,6 +1968,22 @@ MmsValue_getTypeString(MmsValue* self)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
|
|
msTimeToGeneralizedTime(uint64_t msTime, uint8_t* buffer, size_t bufferSize)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
time_t unixTime = (msTime / 1000);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct tm tmTime;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int msPart = (msTime % 1000);
|
|
|
|
|
|
|
|
gmtime_r(&unixTime, &tmTime);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
snprintf((char*) buffer, bufferSize, "%04d%02d%02d%02d%02d%02d.%03dZ", tmTime.tm_year + 1900, tmTime.tm_mon + 1,
|
|
|
|
|
|
|
|
tmTime.tm_mday, tmTime.tm_hour, tmTime.tm_min, tmTime.tm_sec, msPart);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char*
|
|
|
|
char*
|
|
|
|
MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize)
|
|
|
|
MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -1995,19 +2011,32 @@ MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
buffer[bufPos++] = '}';
|
|
|
|
if (bufPos < (bufferSize - 1)) {
|
|
|
|
buffer[bufPos] = 0;
|
|
|
|
buffer[bufPos++] = '}';
|
|
|
|
|
|
|
|
buffer[bufPos] = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
buffer[bufferSize - 1] = 0;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_BINARY_TIME:
|
|
|
|
case MMS_BINARY_TIME:
|
|
|
|
Conversions_msTimeToGeneralizedTime(MmsValue_getBinaryTimeAsUtcMs(self), (uint8_t*) buffer);
|
|
|
|
msTimeToGeneralizedTime(MmsValue_getBinaryTimeAsUtcMs(self), (uint8_t*) buffer, bufferSize);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_BIT_STRING:
|
|
|
|
case MMS_BIT_STRING:
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int bufPos = 0;
|
|
|
|
int bufPos = 0;
|
|
|
|
|
|
|
|
|
|
|
|
int size = MmsValue_getBitStringSize(self);
|
|
|
|
int size = MmsValue_getBitStringSize(self);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Behave like strncpy and fill buffer with zeros */
|
|
|
|
|
|
|
|
if (size > bufferSize) {
|
|
|
|
|
|
|
|
memset(buffer, 0, bufferSize);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
for (i = 0; i < size; i++) {
|
|
|
|
for (i = 0; i < size; i++) {
|
|
|
|
if (MmsValue_getBitStringBit(self, i))
|
|
|
|
if (MmsValue_getBitStringBit(self, i))
|
|
|
@ -2018,24 +2047,40 @@ MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize)
|
|
|
|
buffer[bufPos] = 0;
|
|
|
|
buffer[bufPos] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_BOOLEAN:
|
|
|
|
case MMS_BOOLEAN:
|
|
|
|
if (MmsValue_getBoolean(self))
|
|
|
|
if (MmsValue_getBoolean(self))
|
|
|
|
strncpy(buffer, "true", bufferSize);
|
|
|
|
strncpy(buffer, "true", bufferSize);
|
|
|
|
else
|
|
|
|
else
|
|
|
|
strncpy(buffer, "false", bufferSize);
|
|
|
|
strncpy(buffer, "false", bufferSize);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Ensure buffer is always 0 terminated */
|
|
|
|
|
|
|
|
if (bufferSize > 0)
|
|
|
|
|
|
|
|
buffer[bufferSize - 1] = 0;
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_DATA_ACCESS_ERROR:
|
|
|
|
case MMS_DATA_ACCESS_ERROR:
|
|
|
|
snprintf(buffer, bufferSize, "error %i", self->value.dataAccessError);
|
|
|
|
snprintf(buffer, bufferSize, "error %i", self->value.dataAccessError);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_FLOAT:
|
|
|
|
case MMS_FLOAT:
|
|
|
|
snprintf(buffer, bufferSize, "%f", MmsValue_toFloat(self));
|
|
|
|
snprintf(buffer, bufferSize, "%f", MmsValue_toFloat(self));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case MMS_GENERALIZED_TIME:
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_GENERALIZED_TIME: /* type not supported */
|
|
|
|
strncpy(buffer, "generalized time", bufferSize);
|
|
|
|
strncpy(buffer, "generalized time", bufferSize);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Ensure buffer is always 0 terminated */
|
|
|
|
|
|
|
|
if (bufferSize > 0)
|
|
|
|
|
|
|
|
buffer[bufferSize - 1] = 0;
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_INTEGER:
|
|
|
|
case MMS_INTEGER:
|
|
|
|
snprintf(buffer, bufferSize, "%i", MmsValue_toInt32(self));
|
|
|
|
snprintf(buffer, bufferSize, "%i", MmsValue_toInt32(self));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_OCTET_STRING:
|
|
|
|
case MMS_OCTET_STRING:
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int size = MmsValue_getOctetStringSize(self);
|
|
|
|
int size = MmsValue_getOctetStringSize(self);
|
|
|
@ -2049,20 +2094,33 @@ MmsValue_printToBuffer(MmsValue* self, char* buffer, int bufferSize)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_UNSIGNED:
|
|
|
|
case MMS_UNSIGNED:
|
|
|
|
snprintf(buffer, bufferSize, "%u", MmsValue_toUint32(self));
|
|
|
|
snprintf(buffer, bufferSize, "%u", MmsValue_toUint32(self));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_UTC_TIME:
|
|
|
|
case MMS_UTC_TIME:
|
|
|
|
Conversions_msTimeToGeneralizedTime(MmsValue_getUtcTimeInMs(self), (uint8_t*) buffer);
|
|
|
|
msTimeToGeneralizedTime(MmsValue_getUtcTimeInMs(self), (uint8_t*) buffer, bufferSize);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_STRING:
|
|
|
|
case MMS_STRING:
|
|
|
|
case MMS_VISIBLE_STRING:
|
|
|
|
case MMS_VISIBLE_STRING:
|
|
|
|
strncpy(buffer, MmsValue_toString(self), bufferSize);
|
|
|
|
strncpy(buffer, MmsValue_toString(self), bufferSize);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Ensure buffer is always 0 terminated */
|
|
|
|
|
|
|
|
if (bufferSize > 0)
|
|
|
|
|
|
|
|
buffer[bufferSize - 1] = 0;
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
strncpy(buffer, "unknown type", bufferSize);
|
|
|
|
strncpy(buffer, "unknown type", bufferSize);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Ensure buffer is always 0 terminated */
|
|
|
|
|
|
|
|
if (bufferSize > 0)
|
|
|
|
|
|
|
|
buffer[bufferSize - 1] = 0;
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|