|
|
|
|
@ -40,15 +40,15 @@ extern "C" {
|
|
|
|
|
* An \ref SVSubscriber object is associated to a SV data stream that is identified by its appID
|
|
|
|
|
* and destination Ethernet address. The \reg SVSubscriber object is used to install a callback
|
|
|
|
|
* handler \ref SVUpdateListener that is invoked for each ASDU (application service data unit) received for the
|
|
|
|
|
* associated stream. An \ref SVClientASDU is an object that represents a single ASDU. Each ASDU contains
|
|
|
|
|
* associated stream. An \ref SVSubscriber_ASDU is an object that represents a single ASDU. Each ASDU contains
|
|
|
|
|
* some meta information that can be obtained by specific access functions like e.g.
|
|
|
|
|
* \ref SVClientASDU_getSmpCnt to access the "SmpCnt" (sample count) attribute of the ASDU. The actual
|
|
|
|
|
* \ref SVSubscriber_ASDU_getSmpCnt to access the "SmpCnt" (sample count) attribute of the ASDU. The actual
|
|
|
|
|
* measurement data contained in the ASDU does not consist of structured ASN.1 data but stored as raw binary
|
|
|
|
|
* data. Without a priori knowledge of the dataset associated with the ASDU data stream it is not
|
|
|
|
|
* possible to interpret the received data correctly. Therefore you have to provide the data access functions
|
|
|
|
|
* with an index value to indicate the data type and the start of the data in the data block of the ASDU.
|
|
|
|
|
* E.g. reading a data set consisting of two FLOAT32 values you can use two subsequent calls of
|
|
|
|
|
* \ref SVClientASDU_getFLOAT32 one with index = 0 and the second one with index = 4.
|
|
|
|
|
* \ref SVSubscriber_ASDU_getFLOAT32 one with index = 0 and the second one with index = 4.
|
|
|
|
|
*
|
|
|
|
|
* | IEC 61850 type | required bytes |
|
|
|
|
|
* | -------------- | -------------- |
|
|
|
|
|
@ -86,18 +86,18 @@ extern "C" {
|
|
|
|
|
* sampled value data. Each ASDU represents a single sample consisting of multiple measurement
|
|
|
|
|
* values with a single dedicated timestamp.
|
|
|
|
|
*
|
|
|
|
|
* NOTE: SVClientASDU are statically allocated and are only valid inside of the SVUpdateListener
|
|
|
|
|
* NOTE: SVSubscriber_ASDU are statically allocated and are only valid inside of the SVUpdateListener
|
|
|
|
|
* function when called by the library. If you need the data contained in the ASDU elsewhere
|
|
|
|
|
* you have to copy and store the data by yourself!
|
|
|
|
|
*/
|
|
|
|
|
typedef struct sSVClientASDU* SVClientASDU;
|
|
|
|
|
typedef struct sSVSubscriber_ASDU* SVSubscriber_ASDU;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief opaque handle to a SV subscriber instance
|
|
|
|
|
*
|
|
|
|
|
* A subscriber is an instance associated with a single stream of measurement data. It is identified
|
|
|
|
|
* by the Ethernet destination address, the appID value (both are on SV message level) and the svID value
|
|
|
|
|
* that is part of each ASDU (SVClientASDU object).
|
|
|
|
|
* that is part of each ASDU (SVSubscriber_ASDU object).
|
|
|
|
|
*/
|
|
|
|
|
typedef struct sSVSubscriber* SVSubscriber;
|
|
|
|
|
|
|
|
|
|
@ -110,7 +110,7 @@ typedef struct sSVSubscriber* SVSubscriber;
|
|
|
|
|
* \param parameter a user provided parameter that is simply passed to the callback
|
|
|
|
|
* \param asdu SV ASDU data structure. This structure is only valid inside of the callback function
|
|
|
|
|
*/
|
|
|
|
|
typedef void (*SVUpdateListener)(SVSubscriber subscriber, void* parameter, SVClientASDU asdu);
|
|
|
|
|
typedef void (*SVUpdateListener)(SVSubscriber subscriber, void* parameter, SVSubscriber_ASDU asdu);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief opaque handle to a SV receiver instance
|
|
|
|
|
@ -239,7 +239,7 @@ void
|
|
|
|
|
SVSubscriber_destroy(SVSubscriber self);
|
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|
* SVClientASDU object methods
|
|
|
|
|
* SVSubscriber_ASDU object methods
|
|
|
|
|
**************************************************************************/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -256,7 +256,7 @@ SVSubscriber_destroy(SVSubscriber self);
|
|
|
|
|
* \param self ASDU object instance
|
|
|
|
|
*/
|
|
|
|
|
uint16_t
|
|
|
|
|
SVClientASDU_getSmpCnt(SVClientASDU self);
|
|
|
|
|
SVSubscriber_ASDU_getSmpCnt(SVSubscriber_ASDU self);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief return the SvID value included in the SV ASDU
|
|
|
|
|
@ -264,7 +264,7 @@ SVClientASDU_getSmpCnt(SVClientASDU self);
|
|
|
|
|
* \param self ASDU object instance
|
|
|
|
|
*/
|
|
|
|
|
const char*
|
|
|
|
|
SVClientASDU_getSvId(SVClientASDU self);
|
|
|
|
|
SVSubscriber_ASDU_getSvId(SVSubscriber_ASDU self);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief return the ConfRev value included in the SV ASDU
|
|
|
|
|
@ -272,7 +272,7 @@ SVClientASDU_getSvId(SVClientASDU self);
|
|
|
|
|
* \param self ASDU object instance
|
|
|
|
|
*/
|
|
|
|
|
uint32_t
|
|
|
|
|
SVClientASDU_getConfRev(SVClientASDU self);
|
|
|
|
|
SVSubscriber_ASDU_getConfRev(SVSubscriber_ASDU self);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Check if RefrTm value is included in the SV ASDU
|
|
|
|
|
@ -282,7 +282,7 @@ SVClientASDU_getConfRev(SVClientASDU self);
|
|
|
|
|
* \return true if RefrTm value is present, false otherwise
|
|
|
|
|
*/
|
|
|
|
|
bool
|
|
|
|
|
SVClientASDU_hasRefrTm(SVClientASDU self);
|
|
|
|
|
SVSubscriber_ASDU_hasRefrTm(SVSubscriber_ASDU self);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get the RefrTim value included in SV ASDU as ms timestamp
|
|
|
|
|
@ -292,7 +292,7 @@ SVClientASDU_hasRefrTm(SVClientASDU self);
|
|
|
|
|
* \return the time value as ms timestamp or 0 if RefrTm is not present in the SV ASDU
|
|
|
|
|
*/
|
|
|
|
|
uint64_t
|
|
|
|
|
SVClientASDU_getRefrTmAsMs(SVClientASDU self);
|
|
|
|
|
SVSubscriber_ASDU_getRefrTmAsMs(SVSubscriber_ASDU self);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get an INT8 data value in the data part of the ASDU
|
|
|
|
|
@ -303,7 +303,7 @@ SVClientASDU_getRefrTmAsMs(SVClientASDU self);
|
|
|
|
|
* \return SV data
|
|
|
|
|
*/
|
|
|
|
|
int8_t
|
|
|
|
|
SVClientASDU_getINT8(SVClientASDU self, int index);
|
|
|
|
|
SVSubscriber_ASDU_getINT8(SVSubscriber_ASDU self, int index);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get an INT16 data value in the data part of the ASDU
|
|
|
|
|
@ -314,7 +314,7 @@ SVClientASDU_getINT8(SVClientASDU self, int index);
|
|
|
|
|
* \return SV data
|
|
|
|
|
*/
|
|
|
|
|
int16_t
|
|
|
|
|
SVClientASDU_getINT16(SVClientASDU self, int index);
|
|
|
|
|
SVSubscriber_ASDU_getINT16(SVSubscriber_ASDU self, int index);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get an INT32 data value in the data part of the ASDU
|
|
|
|
|
@ -325,7 +325,7 @@ SVClientASDU_getINT16(SVClientASDU self, int index);
|
|
|
|
|
* \return SV data
|
|
|
|
|
*/
|
|
|
|
|
int32_t
|
|
|
|
|
SVClientASDU_getINT32(SVClientASDU self, int index);
|
|
|
|
|
SVSubscriber_ASDU_getINT32(SVSubscriber_ASDU self, int index);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get an INT64 data value in the data part of the ASDU
|
|
|
|
|
@ -336,7 +336,7 @@ SVClientASDU_getINT32(SVClientASDU self, int index);
|
|
|
|
|
* \return SV data
|
|
|
|
|
*/
|
|
|
|
|
int64_t
|
|
|
|
|
SVClientASDU_getINT64(SVClientASDU self, int index);
|
|
|
|
|
SVSubscriber_ASDU_getINT64(SVSubscriber_ASDU self, int index);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get an INT8U data value in the data part of the ASDU
|
|
|
|
|
@ -347,7 +347,7 @@ SVClientASDU_getINT64(SVClientASDU self, int index);
|
|
|
|
|
* \return SV data
|
|
|
|
|
*/
|
|
|
|
|
uint8_t
|
|
|
|
|
SVClientASDU_getINT8U(SVClientASDU self, int index);
|
|
|
|
|
SVSubscriber_ASDU_getINT8U(SVSubscriber_ASDU self, int index);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get an INT16U data value in the data part of the ASDU
|
|
|
|
|
@ -358,7 +358,7 @@ SVClientASDU_getINT8U(SVClientASDU self, int index);
|
|
|
|
|
* \return SV data
|
|
|
|
|
*/
|
|
|
|
|
uint16_t
|
|
|
|
|
SVClientASDU_getINT16U(SVClientASDU self, int index);
|
|
|
|
|
SVSubscriber_ASDU_getINT16U(SVSubscriber_ASDU self, int index);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get an INT32U data value in the data part of the ASDU
|
|
|
|
|
@ -369,7 +369,7 @@ SVClientASDU_getINT16U(SVClientASDU self, int index);
|
|
|
|
|
* \return SV data
|
|
|
|
|
*/
|
|
|
|
|
uint32_t
|
|
|
|
|
SVClientASDU_getINT32U(SVClientASDU self, int index);
|
|
|
|
|
SVSubscriber_ASDU_getINT32U(SVSubscriber_ASDU self, int index);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get an INT64U data value in the data part of the ASDU
|
|
|
|
|
@ -380,7 +380,7 @@ SVClientASDU_getINT32U(SVClientASDU self, int index);
|
|
|
|
|
* \return SV data
|
|
|
|
|
*/
|
|
|
|
|
uint64_t
|
|
|
|
|
SVClientASDU_getINT64U(SVClientASDU self, int index);
|
|
|
|
|
SVSubscriber_ASDU_getINT64U(SVSubscriber_ASDU self, int index);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get an FLOAT32 data value in the data part of the ASDU
|
|
|
|
|
@ -391,7 +391,7 @@ SVClientASDU_getINT64U(SVClientASDU self, int index);
|
|
|
|
|
* \return SV data
|
|
|
|
|
*/
|
|
|
|
|
float
|
|
|
|
|
SVClientASDU_getFLOAT32(SVClientASDU self, int index);
|
|
|
|
|
SVSubscriber_ASDU_getFLOAT32(SVSubscriber_ASDU self, int index);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Get an FLOAT64 data value in the data part of the ASDU
|
|
|
|
|
@ -402,7 +402,7 @@ SVClientASDU_getFLOAT32(SVClientASDU self, int index);
|
|
|
|
|
* \return SV data
|
|
|
|
|
*/
|
|
|
|
|
double
|
|
|
|
|
SVClientASDU_getFLOAT64(SVClientASDU self, int index);
|
|
|
|
|
SVSubscriber_ASDU_getFLOAT64(SVSubscriber_ASDU self, int index);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Returns the size of the data part of the ASDU
|
|
|
|
|
@ -412,7 +412,7 @@ SVClientASDU_getFLOAT64(SVClientASDU self, int index);
|
|
|
|
|
* \return size of the ASDU data part in bytes.
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
SVClientASDU_getDataSize(SVClientASDU self);
|
|
|
|
|
SVSubscriber_ASDU_getDataSize(SVSubscriber_ASDU self);
|
|
|
|
|
|
|
|
|
|
/**@} @}*/
|
|
|
|
|
|
|
|
|
|
@ -420,5 +420,6 @@ SVClientASDU_getDataSize(SVClientASDU self);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include "sv_subscriber_deprecated.h"
|
|
|
|
|
|
|
|
|
|
#endif /* SAMPLED_VALUES_SV_SUBSCRIBER_ */
|
|
|
|
|
|