Exemple #1
0
 void DetachWatcher(ViReceiveDataArrayNode <TReceiveData> node, ViEntity entity)
 {
     if (node.Watcher != null)
     {
         node.Watcher.OnEnd(node.Property, entity);
         node.Watcher = null;
     }
 }
Exemple #2
0
 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);
         }
     }
 }
Exemple #3
0
    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);
        }
    }
Exemple #4
0
    //
    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;
        }
    }