Exemplo n.º 1
0
        private void DecodeReadPacket(int packetIdx, MultiServiceReply reply)
        {
            //Basically we need to find the tag(s) that this belongs to and add it to
            //a list of reply bytes at the specified offset.

            List <PacketMap> packetTags = GetTagsForPacket(packetIdx);

            for (int i = 0; i < packetTags.Count; i++)
            {
                PacketMap currentTag = packetTags[i];

                //We have to figure out what service this tag is on
                int idx        = currentTag.PacketIndex.IndexOf(packetIdx);
                int serviceNum = currentTag.ServiceIndex[idx];

                //Now get the service data out and add it to the replies
                if (reply.ServiceReplies.Count > serviceNum)
                {
                    _tags[currentTag.TagIndex].SetTagError(reply.ServiceReplies[serviceNum].FullStatus);
                    if (!_byteReplies.ContainsKey(currentTag.TagIndex))
                    {
                        _byteReplies[currentTag.TagIndex] = new List <byte[]>();
                    }
                    _byteReplies[currentTag.TagIndex].Add(reply.ServiceReplies[serviceNum].ServiceData);
                }
            }
        }
Exemplo n.º 2
0
        private void ReadAll()
        {
            //The lock object should already be held...

            List <MultiServiceReply> replies     = new List <MultiServiceReply>();
            List <LogixTag>          updatedTags = new List <LogixTag>();

            _byteReplies = new Dictionary <int, List <byte[]> >();

            CommonPacketItem addressItem = CommonPacketItem.GetConnectedAddressItem(_parent.SessionInfo.ConnectionParameters.O2T_CID);

            for (int i = 0; i < _msrPackets.Count; i++)
            {
                CommonPacketItem dataItem = CommonPacketItem.GetConnectedDataItem(_msrPackets[i].Pack(), SequenceNumberGenerator.SequenceNumber);

                EncapsReply reply = _parent.SessionInfo.SendUnitData(addressItem, dataItem);

                if (reply != null)
                {
                    //We need to suck all the replies out of the packet, and request more data if there is more
                    MultiServiceReply msReply = new MultiServiceReply(reply);

                    DecodeReadPacket(i, msReply);

                    foreach (KeyValuePair <int, List <byte[]> > kvp in _byteReplies)
                    {
                        uint offset = 0;
                        for (int i2 = 0; i2 < kvp.Value.Count; i2++)
                        {
                            if (_tags[kvp.Key].UpdateValue(kvp.Value[i2], offset))
                            {
                                updatedTags.Add(_tags[kvp.Key]);
                            }
                            offset += (uint)(kvp.Value[i2].Length + 6);
                        }
                    }

                    if (UpdateFinished != null)
                    {
                        UpdateFinished(this, new UpdateFinishedEventArgs(updatedTags));
                    }

                    updatedTags.Clear();
                    _byteReplies.Clear();
                }
            }
        }
Exemplo n.º 3
0
        private void WriteAll()
        {
            //First we are going to have to build the write requests...
            _writeMsrPackets = new List <MultiServiceRequest>();
            BuildWriteRequests();

            //Now we have to send them out...
            for (int i = 0; i < _writeMsrPackets.Count; i++)
            {
                CommonPacketItem addressItem = CommonPacketItem.GetConnectedAddressItem(_parent.SessionInfo.ConnectionParameters.O2T_CID);
                CommonPacketItem dataItem    = CommonPacketItem.GetConnectedDataItem(_writeMsrPackets[i].Pack(), SequenceNumberGenerator.SequenceNumber);

                EncapsReply reply = _parent.SessionInfo.SendUnitData(addressItem, dataItem);

                if (reply != null)
                {
                    MultiServiceReply msReply = new MultiServiceReply(reply);

                    DecodeWriteReply(i, msReply);
                }
            }
        }
Exemplo n.º 4
0
        private void DecodeWriteReply(int packetIdx, MultiServiceReply reply)
        {
            List <PacketMap> writeTags = GetTagsForWritePacket(packetIdx);

            for (int i = 0; i < writeTags.Count; i++)
            {
                PacketMap currentTag = writeTags[i];

                int idx        = currentTag.PacketIndex.IndexOf(packetIdx);
                int serviceNum = currentTag.ServiceIndex[idx];

                //TODO: This should look at all the replies for a particular tag before
                //telling the tag to clear the pending write...

                if (reply.ServiceReplies.Count > serviceNum)
                {
                    _tags[currentTag.TagIndex].SetTagError(reply.ServiceReplies[serviceNum].FullStatus);
                    if (reply.ServiceReplies[serviceNum].Status == 0x00)
                    {
                        _tags[currentTag.TagIndex].ClearPendingWrite();
                    }
                }
            }
        }