1 //
2 // Copyright (c) 2010-2018 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 using System;
8 using System.Collections.Generic;
9 
10 namespace Antmicro.Renode.Peripherals.Wireless.IEEE802_15_4
11 {
12     public class AddressInformation
13     {
AddressInformation(AddressingMode destinationAddressingMode, AddressingMode sourceAddressingMode, bool intraPan, ArraySegment<byte> data)14         public AddressInformation(AddressingMode destinationAddressingMode, AddressingMode sourceAddressingMode, bool intraPan, ArraySegment<byte> data)
15         {
16             var internalOffset = 0;
17             if(destinationAddressingMode != AddressingMode.None)
18             {
19                 DestinationPan = GetValue(data, 0);
20                 DestinationAddress = new Address(new ArraySegment<byte>(data.Array, data.Offset + 2, destinationAddressingMode.GetBytesLength()));
21                 internalOffset = 2 + DestinationAddress.Bytes.Count;
22             }
23 
24             if(sourceAddressingMode != AddressingMode.None)
25             {
26                 if(intraPan)
27                 {
28                     SourcePan = DestinationPan;
29                 }
30                 else
31                 {
32                     SourcePan = GetValue(data, internalOffset);
33                     internalOffset += 2;
34                 }
35                 SourceAddress = new Address(new ArraySegment<byte>(data.Array, data.Offset + internalOffset, sourceAddressingMode.GetBytesLength()));
36             }
37 
38             Bytes = data;
39         }
40 
41         public uint SourcePan { get; private set; }
42         public Address SourceAddress { get; private set; }
43         public uint DestinationPan { get; private set; }
44         public Address DestinationAddress { get; private set; }
45 
46         public ICollection<byte> Bytes { get; private set; }
47 
GetValue(IList<byte> data, int offset)48         private static uint GetValue(IList<byte> data, int offset)
49         {
50             return (uint)(data[offset] + (data[offset + 1] << 8));
51         }
52     }
53 }
54 
55