void IedServer_updateQuality(IedServer self, DataAttribute* dataAttribute, Quality quality) { assert(strcmp(dataAttribute->name, "q") == 0); assert(MmsValue_getType(dataAttribute->mmsValue) == MMS_BIT_STRING); assert(MmsValue_getBitStringSize(dataAttribute->mmsValue) >= 12); assert(MmsValue_getBitStringSize(dataAttribute->mmsValue) <= 15); uint32_t oldQuality = MmsValue_getBitStringAsInteger(dataAttribute->mmsValue); if (oldQuality != (uint32_t) quality) { MmsValue_setBitStringFromInteger(dataAttribute->mmsValue, (uint32_t) quality); #if (CONFIG_IEC61850_REPORT_SERVICE == 1) if (dataAttribute->triggerOptions & TRG_OPT_QUALITY_CHANGED) MmsMapping_triggerReportObservers(self->mmsMapping, dataAttribute->mmsValue, REPORT_CONTROL_QUALITY_CHANGED); #endif #if (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) MmsMapping_triggerGooseObservers(self->mmsMapping, dataAttribute->mmsValue); #endif } }
uint32_t IedServer_getBitStringAttributeValue(IedServer self, DataAttribute* dataAttribute) { assert(self != NULL); assert(dataAttribute != NULL); assert(dataAttribute->mmsValue != NULL); assert(MmsValue_getType(dataAttribute->mmsValue) == MMS_BIT_STRING); assert(MmsValue_getBitStringSize(dataAttribute->mmsValue) < 33); return MmsValue_getBitStringAsInteger(dataAttribute->mmsValue); }
Quality IedConnection_readQualityValue(IedConnection self, IedClientError* error, char* objectReference, FunctionalConstraint fc) { MmsValue* value = IedConnection_readObject(self, error, objectReference, fc); Quality quality = QUALITY_VALIDITY_GOOD; if ((MmsValue_getType(value) == MMS_BIT_STRING) && (MmsValue_getBitStringSize(value) == 13)) { quality = Quality_fromMmsValue(value); } else { if (MmsValue_getType(value) == MMS_DATA_ACCESS_ERROR) *error = iedConnection_mapDataAccessErrorToIedError(MmsValue_getDataAccessError(value)); else *error = IED_ERROR_UNEXPECTED_VALUE_RECEIVED; } MmsValue_delete(value); return quality; }