Exemple #1
0
        /// <summary>
        ///     This method is called by the ClientBase when a new value has been received for
        ///     the data object from the server. It, in turn, calls the Update() method on the
        ///     DataValue property to complete the update, and then increments the update count
        ///     for the data object.
        /// </summary>
        /// <param name="statusCode"> The DataGrpc StatusCode of the value. </param>
        /// <param name="timestampUtc"> The timestamp of the value. </param>
        /// <param name="valueObject"> The value </param>
        public void UpdateValue(object?valueObject, uint statusCode, DateTime timestampUtc)
        {
            var any = new Any(valueObject);

            _valueStatusTimestamp = new ValueStatusTimestamp(any, statusCode, timestampUtc);
            IncrementUpdateCount();
        }
Exemple #2
0
        /// <summary>
        ///     This method is called by the ClientBase when a new value has been received for
        ///     the data object from the server. It, in turn, calls the Update() method on the
        ///     DataValue property to complete the update, and then increments the update count
        ///     for the data object.
        /// </summary>
        /// <param name="statusCode"> The DataGrpc StatusCode of the value. </param>
        /// <param name="timestampUtc"> The timestamp of the value. </param>
        /// <param name="valueDouble"> The value </param>
        public void UpdateValue(double valueDouble, uint statusCode, DateTime timestampUtc)
        {
            var any = new Any();

            any.Set(valueDouble, ValueTypeCode, false);
            _valueStatusTimestamp = new ValueStatusTimestamp(any, statusCode, timestampUtc);
            IncrementUpdateCount();
        }
Exemple #3
0
        /// <summary>
        ///     This method updates the values of the value set.
        /// </summary>
        /// <param name="journalDataValues"> The new values used to update the value set. </param>
        internal void UpdateValueSet(JournalDataValues journalDataValues)
        {
            if (journalDataValues.HistoricalValues is null)
            {
                return;
            }

            ResultCode = journalDataValues.ResultCode;
            StartTime  = journalDataValues.StartTime;
            EndTime    = journalDataValues.EndTime;
            _xiValueStatusTimestampsList.Clear();

            if (journalDataValues.HistoricalValues.DoubleStatusCodes is not null &&
                journalDataValues.HistoricalValues.DoubleValues is not null &&
                journalDataValues.HistoricalValues.DoubleTimeStamps is not null)
            {
                for (int idx = 0; idx < journalDataValues.HistoricalValues.DoubleStatusCodes.Length; idx++)
                {
                    var xiValueStatusTimestamp = new ValueStatusTimestamp();
                    xiValueStatusTimestamp.Value.Set(journalDataValues.HistoricalValues.DoubleValues[idx],
                                                     _owningXiDataJournalListItem.ValueTypeCode, false);
                    xiValueStatusTimestamp.ValueStatusCode = journalDataValues.HistoricalValues.DoubleStatusCodes[idx];
                    xiValueStatusTimestamp.TimestampUtc    = journalDataValues.HistoricalValues.DoubleTimeStamps[idx];

                    _xiValueStatusTimestampsList.Add(xiValueStatusTimestamp);
                }
            }
            if (journalDataValues.HistoricalValues.UintStatusCodes is not null &&
                journalDataValues.HistoricalValues.UintValues is not null &&
                journalDataValues.HistoricalValues.UintTimeStamps is not null)
            {
                for (int idx = 0; idx < journalDataValues.HistoricalValues.UintStatusCodes.Length; idx++)
                {
                    var xiValueStatusTimestamp = new ValueStatusTimestamp();
                    xiValueStatusTimestamp.Value.Set(journalDataValues.HistoricalValues.UintValues[idx],
                                                     _owningXiDataJournalListItem.ValueTypeCode, false);
                    xiValueStatusTimestamp.ValueStatusCode = journalDataValues.HistoricalValues.UintStatusCodes[idx];
                    xiValueStatusTimestamp.TimestampUtc    = journalDataValues.HistoricalValues.UintTimeStamps[idx];

                    _xiValueStatusTimestampsList.Add(xiValueStatusTimestamp);
                }
            }
            if (journalDataValues.HistoricalValues.ObjectStatusCodes is not null &&
                journalDataValues.HistoricalValues.ObjectValues is not null &&
                journalDataValues.HistoricalValues.ObjectTimeStamps is not null)
            {
                for (int idx = 0; idx < journalDataValues.HistoricalValues.ObjectStatusCodes.Length; idx++)
                {
                    var xiValueStatusTimestamp = new ValueStatusTimestamp();
                    xiValueStatusTimestamp.Value.Set(journalDataValues.HistoricalValues.ObjectValues[idx]);
                    xiValueStatusTimestamp.ValueStatusCode = journalDataValues.HistoricalValues.ObjectStatusCodes[idx];
                    xiValueStatusTimestamp.TimestampUtc    = journalDataValues.HistoricalValues.ObjectTimeStamps[idx];

                    _xiValueStatusTimestampsList.Add(xiValueStatusTimestamp);
                }
            }
        }
Exemple #4
0
 /// <summary>
 ///     This method is used to set PendingWriteValue to a value to be written.
 ///     If the data object is not writable, this method sets PendingWriteValue
 ///     to null. After preparing one or more data objects to be written, the
 ///     client application issues the data list CommitDataObjectWrites() method
 ///     to write them to the server in a single call.
 /// </summary>
 /// <param name="valueStatusTimestamp"> The data value to be written. </param>
 /// <returns> Returns TRUE if the data object is writable, otherwise FALSE. </returns>
 public bool PrepareForWrite(ValueStatusTimestamp valueStatusTimestamp)
 {
     if (!IsWritable)
     {
         _pendingWriteValueStatusTimestamp = null;
         return(false);
     }
     _pendingWriteValueStatusTimestamp = valueStatusTimestamp;
     return(true);
 }
 /// <summary>
 ///
 /// </summary>
 /// <param name="valueSubscription"></param>
 /// <param name="valueStatusTimestamp"></param>
 /// <param name="userFriendlyLogger"></param>
 public void Write(IValueSubscription valueSubscription, ValueStatusTimestamp valueStatusTimestamp, ILogger?userFriendlyLogger)
 {
     BeginInvoke(ct =>
     {
         if (_xiServerProxy is null)
         {
             throw new InvalidOperationException();
         }
         _xiDataListItemsManager.Subscribe(_xiServerProxy, CallbackDispatcher,
                                           XiDataListItemsManagerOnElementValuesCallback, true, ct);
         _xiDataListItemsManager.Write(valueSubscription, valueStatusTimestamp);
     });
 }
Exemple #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="clientObj"></param>
        /// <param name="valueStatusTimestamp"></param>
        public void Write(object clientObj, ValueStatusTimestamp valueStatusTimestamp)
        {
            if (DataGrpcList is null || DataGrpcList.Disposed)
            {
                return;
            }

            ClientObjectInfo?modelItem;

            if (!ModelItemsDictionary.TryGetValue(clientObj, out modelItem))
            {
                return;
            }

            if (modelItem.DataGrpcListItemWrapper is null || modelItem.DataGrpcListItemWrapper.DataGrpcListItem is null || modelItem.DataGrpcListItemWrapper.DataGrpcListItem.StatusCode != StatusCode.OK)
            {
                return;
            }

            ClientElementValueListItem dataGrpcElementValueListItem = modelItem.DataGrpcListItemWrapper.DataGrpcListItem;

            try
            {
                dataGrpcElementValueListItem.PrepareForWrite(valueStatusTimestamp);

                try
                {
                    DataGrpcList.CommitWriteElementValueListItems();
                }
                catch
                {
                }
            }
            catch (Exception ex)
            {
                Logger.LogWarning(ex, "DataGrpcList.CommitWriteElementValueListItems() exception");
            }
        }
        public void Write(object clientObj, ValueStatusTimestamp valueStatusTimestamp)
        {
            if (XiList is null || XiList.Disposed)
            {
                return;
            }

            ClientObjectInfo?modelItem;

            if (!ClientObjectInfosDictionary.TryGetValue(clientObj, out modelItem))
            {
                return;
            }

            if (modelItem.XiListItemWrapper is null || modelItem.XiListItemWrapper.XiListItem is null || modelItem.XiListItemWrapper.XiListItem.ResultCode != XiFaultCodes.S_OK)
            {
                return;
            }

            IXiDataListItem xiDataListItem = modelItem.XiListItemWrapper.XiListItem;

            try
            {
                xiDataListItem.PrepareForWrite(valueStatusTimestamp);

                try
                {
                    XiList.CommitWriteDataListItems();
                }
                catch
                {
                }
            }
            catch (Exception ex)
            {
                Logger?.LogWarning(ex, "Exception");
            }
        }
Exemple #8
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public IEnumerable <ClientElementValueListItem> CommitWriteElementValueListItems()
        {
            if (Disposed)
            {
                throw new ObjectDisposedException("Cannot access a disposed ClientElementValueList.");
            }

            var fullElementValuesCollection = new ElementValuesCollection();

            using (var memoryStream = new MemoryStream(1024))
            {
                using (var writer = new SerializationWriter(memoryStream))
                {
                    foreach (ClientElementValueListItem item in ListItemsManager)
                    {
                        if (item.PendingWriteValueStatusTimestamp is null)
                        {
                            continue;
                        }

                        uint alias = item.ServerAlias;
                        ValueStatusTimestamp valueStatusTimestamp = item.PendingWriteValueStatusTimestamp.Value;

                        switch (valueStatusTimestamp.Value.ValueStorageType)
                        {
                        case Ssz.Utils.Any.StorageType.Double:
                            fullElementValuesCollection.DoubleAliases.Add(alias);
                            fullElementValuesCollection.DoubleValueStatusCodes.Add(valueStatusTimestamp.ValueStatusCode);
                            fullElementValuesCollection.DoubleTimestamps.Add(DateTimeHelper.ConvertToTimestamp(valueStatusTimestamp.TimestampUtc));
                            fullElementValuesCollection.DoubleValues.Add(valueStatusTimestamp.Value.StorageDouble);
                            break;

                        case Ssz.Utils.Any.StorageType.UInt32:
                            fullElementValuesCollection.UintAliases.Add(alias);
                            fullElementValuesCollection.UintValueStatusCodes.Add(valueStatusTimestamp.ValueStatusCode);
                            fullElementValuesCollection.UintTimestamps.Add(DateTimeHelper.ConvertToTimestamp(valueStatusTimestamp.TimestampUtc));
                            fullElementValuesCollection.UintValues.Add(valueStatusTimestamp.Value.StorageUInt32);
                            break;

                        case Ssz.Utils.Any.StorageType.Object:
                            fullElementValuesCollection.ObjectAliases.Add(alias);
                            fullElementValuesCollection.ObjectValueStatusCodes.Add(valueStatusTimestamp.ValueStatusCode);
                            fullElementValuesCollection.ObjectTimestamps.Add(DateTimeHelper.ConvertToTimestamp(valueStatusTimestamp.TimestampUtc));
                            writer.WriteObject(valueStatusTimestamp.Value.StorageObject);
                            break;
                        }
                        item.HasWritten(StatusCode.OK);
                    }
                }
                memoryStream.Position = 0;
                fullElementValuesCollection.ObjectValues = Google.Protobuf.ByteString.FromStream(memoryStream);
            }

            var result = new List <ClientElementValueListItem>();

            foreach (ElementValuesCollection elementValuesCollection in fullElementValuesCollection.SplitForCorrectGrpcMessageSize())
            {
                AliasResult[] listAliasesResult = Context.WriteElementValues(ListServerAlias, elementValuesCollection);
                foreach (AliasResult aliasResult in listAliasesResult)
                {
                    ClientElementValueListItem?item = null;
                    if (ListItemsManager.TryGetValue(aliasResult.ClientAlias, out item))
                    {
                        item.HasWritten((StatusCode)aliasResult.StatusCode);
                        result.Add(item);
                    }
                }
            }
            return(result);
        }