/// <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(); }
/// <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(); }
/// <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); } } }
/// <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); }); }
/// <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"); } }
/// <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); }