void DetachWatcher(ViReceiveDataArrayNode <TReceiveData> node, ViEntity entity) { if (node.Watcher != null) { node.Watcher.OnEnd(node.Property, entity); node.Watcher = null; } }
void AttachWatcher(ViReceiveDataArrayNode <TReceiveData> node, ViEntity entity) { if (Creator != null) { ViReceiveDataArrayNodeWatcher <TReceiveData> watcher = Creator(); node.Watcher = watcher; if (watcher != null) { watcher.OnStart(node.Property, entity); } } }
public new void Start(UInt16 channelMask, ViIStream IS, ViEntity entity) { if (!MatchChannel(channelMask)) { return; } ViArrayIdx size; IS.Read(out size); _array.Capacity = (int)size; for (ViArrayIdx idx = 0; idx < size; ++idx) { TReceiveData property = new TReceiveData(); property.StartByArray(); property.Start(channelMask, IS, entity); property.Parent = this; ViReceiveDataArrayNode <TReceiveData> newNode = new ViReceiveDataArrayNode <TReceiveData>(); newNode.Property = property; AttachWatcher(newNode, entity); _array.Add(newNode); } }
// public override void OnUpdate(UInt8 channel, ViIStream IS, ViEntity entity) { if (!MatchChannel(channel)) { return; } ViOperatorIdx op; IS.Read(out op); switch ((ViDataArrayOperator)op) { case ViDataArrayOperator.ADD_BACK: { TReceiveData property = new TReceiveData(); property.StartByArray(); property.Start(channel, IS, entity); property.Parent = this; ViReceiveDataArrayNode <TReceiveData> newNode = new ViReceiveDataArrayNode <TReceiveData>(); newNode.Property = property; AttachWatcher(newNode, entity); _array.Add(newNode); OnUpdateInvoke(null); _updateArrayCallbackList.Invoke((UInt32)ViDataArrayOperator.ADD_BACK, property); } break; case ViDataArrayOperator.ADD_FRONT: { TReceiveData property = new TReceiveData(); property.StartByArray(); property.Start(channel, IS, entity); property.Parent = this; ViReceiveDataArrayNode <TReceiveData> newNode = new ViReceiveDataArrayNode <TReceiveData>(); newNode.Property = property; AttachWatcher(newNode, entity); _array.Insert(0, newNode); OnUpdateInvoke(null); _updateArrayCallbackList.Invoke((UInt32)ViDataArrayOperator.ADD_FRONT, property); } break; case ViDataArrayOperator.INSERT: { ViArrayIdx idx; IS.Read(out idx); ViDebuger.AssertWarning(idx <= _array.Count); if (idx <= _array.Count) { TReceiveData property = new TReceiveData(); property.StartByArray(); property.Start(channel, IS, entity); property.Parent = this; ViReceiveDataArrayNode <TReceiveData> newNode = new ViReceiveDataArrayNode <TReceiveData>(); newNode.Property = property; AttachWatcher(newNode, entity); _array.Insert(idx, newNode); OnUpdateInvoke(null); _updateArrayCallbackList.Invoke((UInt32)ViDataArrayOperator.INSERT, property); } } break; case ViDataArrayOperator.DEL: { ViArrayIdx idx; IS.Read(out idx); ViDebuger.AssertWarning(idx < _array.Count); if (idx < _array.Count) { ViReceiveDataArrayNode <TReceiveData> node = _array[idx]; _array.RemoveAt(idx); OnUpdateInvoke(node.Property); _updateArrayCallbackList.Invoke((UInt32)ViDataArrayOperator.DEL, node.Property); DetachWatcher(node, entity); node.Property.End(entity); node.Property.Clear(); } } break; case ViDataArrayOperator.MOD: { ViArrayIdx idx; IS.Read(out idx); ViDebuger.AssertWarning(idx < _array.Count); if (idx < _array.Count) { ViReceiveDataArrayNode <TReceiveData> node = _array[idx]; UInt16 slot; while (IS.Read(out slot) && slot != END_SLOT) { node.Property.OnUpdate(slot, channel, IS, entity); } _updateArrayCallbackList.Invoke((UInt32)ViDataArrayOperator.MOD, node.Property); if (node.Watcher != null) { node.Watcher.OnUpdate(node.Property, entity); } } } break; case ViDataArrayOperator.CLEAR: foreach (ViReceiveDataArrayNode <TReceiveData> node in _array) { DetachWatcher(node, entity); node.Property.End(entity); node.Property.Clear(); } _array.Clear(); OnUpdateInvoke(null); _updateArrayCallbackList.Invoke((UInt32)ViDataArrayOperator.CLEAR, null); break; default: break; } }