diff --git a/src/sampled_values/sv_publisher.c b/src/sampled_values/sv_publisher.c index bc777fe8..58b4e5aa 100644 --- a/src/sampled_values/sv_publisher.c +++ b/src/sampled_values/sv_publisher.c @@ -59,6 +59,7 @@ struct sSV_ASDU { uint64_t refrTm; uint8_t smpMod; + uint16_t smpRate; uint8_t* smpCntBuf; @@ -369,7 +370,8 @@ SV_ASDU_encodeToBuffer(SV_ASDU self, uint8_t* buffer, int bufPos) buffer[bufPos++] = self->smpSynch; /* SmpRate */ - //TODO implement me + bufPos = BerEncoder_encodeTL(0x86, 2, buffer, bufPos); + bufPos = encodeUInt16FixedSize(self->smpRate, buffer, bufPos); /* Sample */ bufPos = BerEncoder_encodeTL(0x87, self->dataSize, buffer, bufPos); @@ -596,3 +598,9 @@ SV_ASDU_setSmpMod(SV_ASDU self, uint8_t smpMod) self->smpMod = smpMod; } +void +SV_ASDU_setSmpRate(SV_ASDU self, uint8_t smpRate) +{ + self->hasSmpRate = true; + self->smpRate = smpRate; +} diff --git a/src/sampled_values/sv_publisher.h b/src/sampled_values/sv_publisher.h index 458b00b2..8e843b36 100644 --- a/src/sampled_values/sv_publisher.h +++ b/src/sampled_values/sv_publisher.h @@ -121,6 +121,18 @@ SV_ASDU_setRefrTm(SV_ASDU self, uint64_t refrTm); void SV_ASDU_setSmpMod(SV_ASDU self, uint8_t smpMod); +/** + * \brief Set the sample rate of the ASDU. + * + * If not set the transmitted ASDU will not contain an smpRate value. + * + * \param self the SV_ASDU + * + * \param smpRate Amount of samples (default per nominal period, see SmpMod). + */ +void +SV_ASDU_setSmpMod(SV_ASDU self, uint8_t smpMod); + #ifdef __cplusplus } #endif