public void Heading()
        {
            PGNSettings configuration = new PGNSettings();
            configuration.AddPGN(127250, "Vessel Heading")
                .FirstField("SID", 8)
                .NextField("Heading", 16, f=> f.SetAngle(AngleUnit.Radians, 0.0001d))
                .NextField("Deviation", 16, f => f.SetAngle(AngleUnit.Radians, 0.0001d))
                .NextField("Variation", 16, f => f.SetAngle(AngleUnit.Radians, 0.0001d))
                .NextField("Reference", 2, f => f.SetLookups
                (d =>
                    {
                        d.Add(0, "True");
                        d.Add(1, "Magnetic");
                    }
                ));

            PGNConfiguration vesselHeading = configuration.GetById(127250);
            Assert.IsNotNull(vesselHeading);
            Assert.AreEqual(127250, vesselHeading.PGN);
            Assert.AreEqual("Vessel Heading", vesselHeading.Name);

            var fields = vesselHeading.Fields;
            Assert.IsNotNull(fields);
            Assert.AreEqual(5, fields.Count);

            var deviation = fields.FirstOrDefault(f => f.Name == "Deviation");
            Assert.IsNotNull(deviation);
            Assert.AreEqual(24, deviation.BitOffset);
            Assert.AreEqual(AngleUnit.Radians, deviation.Units);
            Assert.AreEqual(0.0001d, deviation.Resolution);
        }
        public void BasicConfiguration()
        {
            PGNSettings configuration = new PGNSettings();
            configuration.AddPGN(59392, "ISO Acknowledgement")
                .FirstField("Control", 8, f =>
                    f.SetLookups(d =>
                    {
                        d.Add(0, "ACK");
                        d.Add(1, "NAK");
                        d.Add(2, "Access Denied");
                        d.Add(3, "Adress Busy");
                    }))
                .NextField("Group Function", 8)
                .NextField("Reserved", 24, f => f.IsSigned = true)
                .NextField("PGN", 24, f =>
                {
                    f.Description = "Parameter Group Number of requested information";
                    f.FieldType = PGNFieldType.Integer;
                });

            configuration.AddPGN(59904, "ISO Request")
                .FirstField("PGN", 24).IsInteger();

            PGNConfiguration result59392 = configuration.GetById(59392);
            Assert.IsNotNull(result59392);
            Assert.AreEqual(59392, result59392.PGN);
            Assert.AreEqual("ISO Acknowledgement", result59392.Name);

            var fields = result59392.Fields;
            Assert.IsNotNull(fields);
            Assert.AreEqual(4, fields.Count);

            var pgn = fields.FirstOrDefault(f => f.Name == "PGN");
            Assert.IsNotNull(pgn);
            Assert.AreEqual("Parameter Group Number of requested information", pgn.Description);
            Assert.AreEqual(4, pgn.Order);

            var signed = fields.FirstOrDefault(f => f.IsSigned);
            Assert.IsNotNull(signed);
            Assert.AreEqual("Reserved", signed.Name);

            var result59904 = configuration.GetById(59904);
            Assert.IsNotNull(result59904);
            Assert.AreEqual(59904, result59904.PGN);
            Assert.AreEqual("ISO Request", result59904.Name);
        }
        private void DecodeMessage(byte[] payload)
        {
            #region this has to be totally refactored somehow and made more efficient for loading via singleton or whatever:
            PGNSettings configuration = new PGNSettings();
            configuration.AddPGN(127250, "Vessel Heading")
                .FirstField("SID", 8)
                .NextField("Heading", 16, f => f.SetAngle(AngleUnit.Radians, 0.0001d))
                .NextField("Deviation", 16, f => f.SetAngle(AngleUnit.Radians, 0.0001d))
                .NextField("Variation", 16, f => f.SetAngle(AngleUnit.Radians, 0.0001d))
                .NextField("Reference", 2, f => f.SetLookups
                (d =>
                {
                    d.Add(0, "True");
                    d.Add(1, "Magnetic");
                }
                ));
            #endregion

            PGNConfiguration vesselHeadingConfiguration = configuration.GetById(PGN);

            var fieldInformation = new Dictionary<string, PGNFieldInformation>();
            BitArray payloadBitArray = new BitArray(payload);
            foreach (PGNField field in vesselHeadingConfiguration.Fields)
            {
                BitArray bitArray = new BitArray(field.BitLength);
                for (int i = 0; i < field.BitLength; i++)
                {
                    bitArray[i] = payloadBitArray[i + field.BitOffset];
                }

                PGNFieldInformation pgnFieldInformation = new PGNFieldInformation
                {
                    Configuration = field,
                    Data = bitArray
                };
                fieldInformation.Add(field.Name, pgnFieldInformation);
            }

            ProcessPayload(fieldInformation);
        }