sampled values: add support for 64 bit integers

pull/30/head
Steffen Vogel 8 years ago
parent c291db5d95
commit 09d5daf0b5

@ -220,6 +220,34 @@ encodeInt32FixedSize(int32_t value, uint8_t* buffer, int bufPos)
return bufPos; return bufPos;
} }
static int
encodeInt64FixedSize(int64_t value, uint8_t* buffer, int bufPos)
{
uint8_t* valueArray = (uint8_t*) &value;
#if (ORDER_LITTLE_ENDIAN == 1)
buffer[bufPos++] = valueArray[7];
buffer[bufPos++] = valueArray[6];
buffer[bufPos++] = valueArray[5];
buffer[bufPos++] = valueArray[4];
buffer[bufPos++] = valueArray[3];
buffer[bufPos++] = valueArray[2];
buffer[bufPos++] = valueArray[1];
buffer[bufPos++] = valueArray[0];
#else
buffer[bufPos++] = valueArray[0];
buffer[bufPos++] = valueArray[1];
buffer[bufPos++] = valueArray[2];
buffer[bufPos++] = valueArray[3];
buffer[bufPos++] = valueArray[4];
buffer[bufPos++] = valueArray[5];
buffer[bufPos++] = valueArray[6];
buffer[bufPos++] = valueArray[7];
#endif
return bufPos;
}
static int static int
encodeUtcTime(uint64_t timeval, uint8_t* buffer, int bufPos) encodeUtcTime(uint64_t timeval, uint8_t* buffer, int bufPos)
{ {
@ -508,6 +536,22 @@ SV_ASDU_setINT32(SV_ASDU self, int index, int32_t value)
encodeInt32FixedSize(value, self->_dataBuffer, index); encodeInt32FixedSize(value, self->_dataBuffer, index);
} }
int
SV_ASDU_addINT64(SV_ASDU self)
{
int index = self->dataSize;
self->dataSize += 8;
return index;
}
void
SV_ASDU_setINT64(SV_ASDU self, int index, int64_t value)
{
encodeInt64FixedSize(value, self->_dataBuffer, index);
}
int int
SV_ASDU_addFLOAT(SV_ASDU self) SV_ASDU_addFLOAT(SV_ASDU self)
{ {
@ -523,7 +567,6 @@ SV_ASDU_setFLOAT(SV_ASDU self, int index, float value)
{ {
uint8_t* buf = (uint8_t*) &value; uint8_t* buf = (uint8_t*) &value;
#if (ORDER_LITTLE_ENDIAN == 1) #if (ORDER_LITTLE_ENDIAN == 1)
BerEncoder_revertByteOrder(buf, 4); BerEncoder_revertByteOrder(buf, 4);
#endif #endif
@ -550,11 +593,15 @@ void
SV_ASDU_setFLOAT64(SV_ASDU self, int index, double value) SV_ASDU_setFLOAT64(SV_ASDU self, int index, double value)
{ {
uint8_t* buf = (uint8_t*) &value; uint8_t* buf = (uint8_t*) &value;
#if (ORDER_LITTLE_ENDIAN == 1) #if (ORDER_LITTLE_ENDIAN == 1)
BerEncoder_revertByteOrder(buf, 8); BerEncoder_revertByteOrder(buf, 8);
#endif #endif
int i; int i;
uint8_t* buffer = self->_dataBuffer + index; uint8_t* buffer = self->_dataBuffer + index;
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
buffer[i] = buf[i]; buffer[i] = buf[i];
} }

@ -85,6 +85,12 @@ SV_ASDU_addINT32(SV_ASDU self);
void void
SV_ASDU_setINT32(SV_ASDU self, int index, int32_t value); SV_ASDU_setINT32(SV_ASDU self, int index, int32_t value);
int
SV_ASDU_addINT64(SV_ASDU self);
void
SV_ASDU_setINT64(SV_ASDU self, int index, int64_t value);
int int
SV_ASDU_addFLOAT(SV_ASDU self); SV_ASDU_addFLOAT(SV_ASDU self);

@ -637,6 +637,20 @@ SVClientASDU_getINT32(SVClientASDU self, int index)
return retVal; return retVal;
} }
int64_t
SVClientASDU_getINT64(SVClientASDU self, int index)
{
int64_t retVal = *((int64_t*) (self->dataBuffer + index));
#if (ORDER_LITTLE_ENDIAN == 1)
uint8_t* buf = (uint8_t*) (&retVal);
BerEncoder_revertByteOrder(buf, 8);
#endif
return retVal;
}
uint8_t uint8_t
SVClientASDU_getINT8U(SVClientASDU self, int index) SVClientASDU_getINT8U(SVClientASDU self, int index)
{ {
@ -673,6 +687,19 @@ SVClientASDU_getINT32U(SVClientASDU self, int index)
return retVal; return retVal;
} }
uint64_t
SVClientASDU_getINT64U(SVClientASDU self, int index)
{
uint64_t retVal = *((uint64_t*) (self->dataBuffer + index));
#if (ORDER_LITTLE_ENDIAN == 1)
uint8_t* buf = (uint8_t*) (&retVal);
BerEncoder_revertByteOrder(buf, 8);
#endif
return retVal;
}
float float
SVClientASDU_getFLOAT32(SVClientASDU self, int index) SVClientASDU_getFLOAT32(SVClientASDU self, int index)

@ -52,24 +52,25 @@ extern "C" {
* *
* | IEC 61850 type | required bytes | * | IEC 61850 type | required bytes |
* | -------------- | -------------- | * | -------------- | -------------- |
* | BOOLEAN | 1 byte | * | BOOLEAN | 1 byte |
* | INT8 | 1 byte | * | INT8 | 1 byte |
* | INT16 | 2 byte | * | INT16 | 2 byte |
* | INT32 | 4 byte | * | INT32 | 4 byte |
* | INT64 | 8 byte | * | INT64 | 8 byte |
* | INT8U | 1 byte | * | INT8U | 1 byte |
* | INT16U | 2 byte | * | INT16U | 2 byte |
* | INT24U | 3 byte | * | INT24U | 3 byte |
* | INT32U | 4 byte | * | INT32U | 4 byte |
* | FLOAT32 | 4 byte | * | INT64U | 8 byte |
* | FLOAT64 | 8 byte | * | FLOAT32 | 4 byte |
* | ENUMERATED | 4 byte | * | FLOAT64 | 8 byte |
* | CODED ENUM | 4 byte | * | ENUMERATED | 4 byte |
* | OCTET STRING | 20 byte | * | CODED ENUM | 4 byte |
* | VISIBLE STRING | 35 byte | * | OCTET STRING | 20 byte |
* | TimeStamp | 8 byte | * | VISIBLE STRING | 35 byte |
* | EntryTime | 6 byte | * | TimeStamp | 8 byte |
* | BITSTRING | 4 byte | * | EntryTime | 6 byte |
* | BITSTRING | 4 byte |
* *
* The SV subscriber API can be used independent of the IEC 61850 client API. In order to access the SVCB via MMS you * The SV subscriber API can be used independent of the IEC 61850 client API. In order to access the SVCB via MMS you
* have to use the IEC 61850 client API. Please see \ref ClientSVControlBlock object in section \ref IEC61850_CLIENT_SV. * have to use the IEC 61850 client API. Please see \ref ClientSVControlBlock object in section \ref IEC61850_CLIENT_SV.
@ -321,6 +322,17 @@ SVClientASDU_getINT16(SVClientASDU self, int index);
int32_t int32_t
SVClientASDU_getINT32(SVClientASDU self, int index); SVClientASDU_getINT32(SVClientASDU self, int index);
/**
* \brief Get an INT64 data value in the data part of the ASDU
*
* \param self ASDU object instance
* \param index the index (byte position of the start) of the data in the data part
*
* \return SV data
*/
int64_t
SVClientASDU_getINT64(SVClientASDU self, int index);
/** /**
* \brief Get an INT8U data value in the data part of the ASDU * \brief Get an INT8U data value in the data part of the ASDU
* *
@ -354,6 +366,17 @@ SVClientASDU_getINT16U(SVClientASDU self, int index);
uint32_t uint32_t
SVClientASDU_getINT32U(SVClientASDU self, int index); SVClientASDU_getINT32U(SVClientASDU self, int index);
/**
* \brief Get an INT64U data value in the data part of the ASDU
*
* \param self ASDU object instance
* \param index the index (byte position of the start) of the data in the data part
*
* \return SV data
*/
uint64_t
SVClientASDU_getINT64U(SVClientASDU self, int index);
/** /**
* \brief Get an FLOAT32 data value in the data part of the ASDU * \brief Get an FLOAT32 data value in the data part of the ASDU
* *

Loading…
Cancel
Save