示例#1
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength == 168)
            {
                throw new AisMessageException("Message 23 wrong length");
            }

            base.Parse(sixState);

            Spare1 = (int)sixState.Get(2);


            NePos = new Position {
                Longitude = (int)sixState.Get(18) * 10,
                Latitude  = (int)sixState.Get(17) * 10
            };

            SwPos = new Position {
                Longitude = (int)sixState.Get(18) * 10,
                Latitude  = (int)sixState.Get(17) * 10
            };

            StationType    = (int)sixState.Get(4);
            ShipType       = (int)sixState.Get(8);
            Spare2         = sixState.Get(22);
            TxrxMode       = (int)sixState.Get(2);
            ReportInterval = (int)sixState.Get(4);
            QuietTime      = (int)sixState.Get(4);
            Spare3         = (int)sixState.Get(6);
        }
示例#2
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            var length = sixState.BitLength;

            if (length < 88 || length > 162)
            {
                throw new AisMessageException("Message 15 wrong length");
            }
            base.Parse(sixState);

            Spare1    = (int)sixState.Get(2);
            Destid1   = sixState.Get(30);
            MsgId1_1  = (int)sixState.Get(6);
            Offset1_1 = (int)sixState.Get(12);
            NumReqs   = 1;

            if (length > 88)
            {
                Spare2    = (int)sixState.Get(2);
                MsgId1_2  = (int)sixState.Get(6);
                Offset1_2 = (int)sixState.Get(12);
                NumReqs   = 2;
            }

            if (length == 160)
            {
                Spare3    = (int)sixState.Get(2);
                Destid2   = sixState.Get(30);
                MsgId2_1  = (int)sixState.Get(6);
                Offset2_1 = (int)sixState.Get(12);
                Spare4    = (int)sixState.Get(2);
                NumReqs   = 3;
            }
        }
示例#3
0
        public void TestMessage8()
        {
            var vdm_message = new Vdm();
            var msg         = new Message8();


            var result = vdm_message.Add("!AIVDM,3,1,1,A,85MwqciKf@nWshjR1VfGGDssdvT>hncBfTwcsgGKo?t,0*2E\r\n");

            AssertEquals("vdm add failed", 1, result);

            result = vdm_message.Add("!AIVDM,3,2,1,A,u1uBo`7b`1Oa>@cO0f2wr1mwb0=kf<tI2MwS;sVKU07,0*67\r\n");
            AssertEquals("vdm add failed", 1, result);

            result = vdm_message.Add("!AIVDM,3,3,1,A,8fDSaOKeP,2*0C\r\n");
            AssertEquals("vdm add failed", 0, result);

            msg.Parse(vdm_message.SixState);


            AssertEquals("msgid", 8, msg.MsgId);
            AssertEquals("repeat", 0, msg.Repeat);
            AssertEquals("userid", 366999983, msg.UserId);
            AssertEquals("spare", 0, msg.Spare);
            AssertEquals("app_id", 23481, msg.AppId);

            Sixbit data = msg.Data;

            AssertEquals("data length", 568, data.BitLength);

            // Here is where the payload would be parsed, if we knew how...
        }
示例#4
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength != 168)
            {
                throw new AisMessageException("Message 5 wrong length");
            }

            base.Parse(sixState);

            UtcYear   = (int)sixState.Get(14);
            UtcMonth  = (int)sixState.Get(4);
            UtcDay    = (int)sixState.Get(5);
            UtcHour   = (int)sixState.Get(5);
            UtcMinute = (int)sixState.Get(6);
            UtcSecond = (int)sixState.Get(6);
            PosAcc    = (int)sixState.Get(1);

            Pos           = new Position();
            Pos.Longitude = sixState.Get(28);
            Pos.Latitude  = sixState.Get(27);

            PosType     = (int)sixState.Get(4);
            Spare       = (int)sixState.Get(10);
            Raim        = (int)sixState.Get(1);
            SyncState   = (int)sixState.Get(2);
            SlotTimeout = (int)sixState.Get(3);
            SubMessage  = (int)sixState.Get(14);
        }
示例#5
0
		public void Unpack_FromStream() {
			using var input = new MemoryStream(new byte[] {0x15, 0x7a, 0xdb, 0xb8, 0x97, 0x8b, 0x74, 0xeb, 0x1a, 0x65, 0xa6, 0xaa, 0x34, 0xa6, 0xa9, 0x4a, 0x0c});

			var unpacked = Sixbit.Unpack(input);
			
			Assert.Equal("This_should_decode_:3", unpacked);
		}
示例#6
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength != 312)
            {
                throw new AisMessageException("Message 19 wrong length");
            }

            base.Parse(sixState);

            Regional1 = (int)sixState.Get(8);
            Sog       = (int)sixState.Get(10);
            PosAcc    = (int)sixState.Get(1);

            Pos = new Position {
                Longitude = sixState.Get(28),
                Latitude  = sixState.Get(27)
            };

            Cog          = (int)sixState.Get(12);
            TrueHeading  = (int)sixState.Get(9);
            UtcSec       = (int)sixState.Get(6);
            Regional2    = (int)sixState.Get(4);
            Name         = sixState.GetString(20);
            ShipType     = (int)sixState.Get(8);
            DimBow       = (int)sixState.Get(9);
            DimStern     = (int)sixState.Get(9);
            DimPort      = (int)sixState.Get(6);
            DimStarboard = (int)sixState.Get(6);
            PosType      = (int)sixState.Get(4);
            Raim         = (int)sixState.Get(1);
            Dte          = (int)sixState.Get(1);
            Spare        = (int)sixState.Get(5);
        }
示例#7
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            var length = sixState.BitLength;

            if (length < 96 || length > 144)
            {
                throw new AisMessageException("Message 16 wrong length");
            }

            base.Parse(sixState);

            Spare1     = (int)sixState.Get(2);
            DestIdA    = sixState.Get(30);
            OffsetA    = (int)sixState.Get(12);
            IncrementA = (int)sixState.Get(10);
            NumCmds    = 1;

            if (length == 144)
            {
                DestIdB    = sixState.Get(30);
                OffsetB    = (int)sixState.Get(12);
                IncrementB = (int)sixState.Get(10);
                Spare2     = (int)sixState.Get(4);
                NumCmds    = 2;
            }
        }
示例#8
0
		public void Unpack_FromArray() {
			var input = new byte[] {0x15, 0x7a, 0xdb, 0xb8, 0x97, 0x8b, 0x74, 0xeb, 0x1a, 0x65, 0xa6, 0xaa, 0x34, 0xa6, 0xa9, 0x4a, 0x0c};

			var unpacked = Sixbit.Unpack(input);

			Assert.Equal("This_should_decode_:3", unpacked);
		}
示例#9
0
		public void Pack() {
			const string input = "This_is_a_test_string";
			
			var packed = Sixbit.Pack(input);

			Assert.Equal(new byte[] {0x15, 0x7a, 0xdb, 0xb8, 0x96, 0xee, 0x25, 0x9a, 0x5e, 0x6a, 0xe3, 0x99, 0x78, 0xe7, 0x7b, 0xb3, 0xb0}, packed);
		}
示例#10
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength != 168)
            {
                throw new AisMessageException("Message 11 wrong length");
            }

            base.Parse(sixState);

            /* Parse the Message 11 */
            UtcYear   = (int)sixState.Get(14);
            UtcMonth  = (int)sixState.Get(4);
            UtcDay    = (int)sixState.Get(5);
            UtcHour   = (int)sixState.Get(5);
            UtcMinute = (int)sixState.Get(6);
            UtcSecond = (int)sixState.Get(6);
            PosAcc    = (int)sixState.Get(1);

            Pos = new Position {
                Longitude = sixState.Get(28),
                Latitude  = sixState.Get(27)
            };

            PosType     = (int)sixState.Get(4);
            Spare       = (int)sixState.Get(10);
            Raim        = (int)sixState.Get(1);
            SotdmaState = new Sotdma();
            SotdmaState.Parse(sixState);
        }
示例#11
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            var length = sixState.BitLength;

            if (length < 80 || length > 816)
            {
                throw new AisMessageException("Message 17 wrong length");
            }

            base.Parse(sixState);

            Spare1 = (int)sixState.Get(2);

            Pos           = new Position();
            Pos.Longitude = sixState.Get(18) * 10;
            Pos.Latitude  = sixState.Get(17) * 10;

            Spare2    = (int)sixState.Get(5);
            MsgType   = (int)sixState.Get(6);
            StationId = (int)sixState.Get(10);
            ZCount    = (int)sixState.Get(13);
            SeqNum    = (int)sixState.Get(3);
            NumWords  = (int)sixState.Get(5);
            Health    = (int)sixState.Get(3);

            Data = sixState;
        }
示例#12
0
        /// <summary>
        ///     Parse sixbit message
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public void Parse(Sixbit sixState)
        {
            if (sixState.BitLength < 19)
            {
                throw new AisMessageException("SOTDMA wrong length");
            }

            SyncState   = (char)sixState.Get(2);
            SlotTimeout = (char)sixState.Get(3);
            SubMessage  = (int)sixState.Get(14);
        }
示例#13
0
        public void Parse(Sixbit sixState)
        {
            if (sixState.BitLength < 19)
            {
                throw new AisMessageException("ITDMA wrong length");
            }

            SyncState = (char)sixState.Get(2);
            SlotInc   = (int)sixState.Get(13);
            NumSlots  = (char)sixState.Get(3);
            KeepFlag  = (char)sixState.Get(1);
        }
示例#14
0
        static void test_sixbit(Sixbit ais_sixbit)
        {
            int  msgid;
            long mmsi;

            msgid = (int)ais_sixbit.Get(6);
            ais_sixbit.Get(2);
            mmsi = ais_sixbit.Get(30);

            /*out.printf("Length = %d\n", ais_sixbit.length());
             * out.printf("msgid = %d\n", msgid);
             * out.printf("mmsi = %d\n", mmsi);*/
        }
示例#15
0
        /// <summary>
        ///     Parse sixbit message
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength != 72)
            {
                throw new AisMessageException("Message 10 wrong length");
            }

            base.Parse(sixState);

            Spare1      = (int)sixState.Get(2);
            Destination = sixState.Get(30);
            Spare2      = (int)sixState.Get(2);
        }
示例#16
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            var length = sixState.BitLength;

            if (length < 40 || length > 1008)
            {
                throw new AisMessageException("Message 14 wrong length");
            }

            base.Parse(sixState);

            Spare   = (int)sixState.Get(2);
            Message = sixState.GetString((length - 40) / 6);
        }
示例#17
0
        //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
        //ORIGINAL LINE: public void parse(Sixbit six_state) throws SixbitsExhaustedException, AISMessageException
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength != 168)
            {
                throw new AisMessageException("Message 3 wrong length");
            }

            base.Parse(sixState);

            // Parse the Message 3
            SlotIncrement = (int)sixState.Get(13);
            NumSlots      = (int)sixState.Get(3);
            Keep          = (int)sixState.Get(1);
        }
示例#18
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            var length = sixState.BitLength;

            if (length < 56 || length > 1008)
            {
                throw new AisMessageException("Message 8 wrong length");
            }

            base.Parse(sixState);

            Spare = (int)sixState.Get(2);
            AppId = (int)sixState.Get(16);

            /* Store the remaining payload of the packet for further processing */
            Data = sixState;
        }
示例#19
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength != 168)
            {
                throw new AisMessageException("Message 22 wrong length");
            }

            base.Parse(sixState);

            Spare1   = (int)sixState.Get(1);
            ChannelA = (int)sixState.Get(12);
            ChannelB = (int)sixState.Get(12);
            TxrxMode = (int)sixState.Get(4);
            Power    = (int)sixState.Get(1);

            var neLongitude = sixState.Get(18);
            var neLatitude  = sixState.Get(17);

            var swLongitude = sixState.Get(18);
            var swLatitude  = sixState.Get(17);

            Addressed = (int)sixState.Get(1);
            BwA       = (int)sixState.Get(1);
            BwB       = (int)sixState.Get(1);
            TzSize    = (int)sixState.Get(3);

            // Is the position actually an address?
            if (Addressed == 1)
            {
                // Convert the positions to addresses
                Addressed1 = (neLongitude << 12) + (neLatitude >> 5);
                Addressed2 = (swLongitude << 12) + (swLatitude >> 5);
            }
            else
            {
                NePos = new Position {
                    Longitude = neLongitude * 10,
                    Latitude  = neLatitude * 10
                };

                SwPos = new Position {
                    Longitude = swLongitude * 10,
                    Latitude  = swLatitude * 10
                };
            }
        }
示例#20
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            var length = sixState.BitLength;

            if (length < 72 || length > 162)
            {
                throw new AisMessageException("Message 20 wrong length");
            }

            base.Parse(sixState);

            Spare1     = (int)sixState.Get(2);
            Offset1    = (int)sixState.Get(12);
            Slots1     = (int)sixState.Get(4);
            Timeout1   = (int)sixState.Get(3);
            Increment1 = (int)sixState.Get(11);
            NumCmds    = 1;

            if (length > 72)
            {
                Offset2    = (int)sixState.Get(12);
                Slots2     = (int)sixState.Get(4);
                Timeout2   = (int)sixState.Get(3);
                Increment2 = (int)sixState.Get(11);
                NumCmds    = 2;
            }

            if (length > 104)
            {
                Offset3    = (int)sixState.Get(12);
                Slots3     = (int)sixState.Get(4);
                Timeout3   = (int)sixState.Get(3);
                Increment3 = (int)sixState.Get(11);
                NumCmds    = 3;
            }

            if (length > 136)
            {
                Offset4    = (int)sixState.Get(12);
                Slots4     = (int)sixState.Get(4);
                Timeout4   = (int)sixState.Get(3);
                Increment4 = (int)sixState.Get(11);
                NumCmds    = 4;
            }
        }
示例#21
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            var length = sixState.BitLength;

            if (length < 72 || length > 1008)
            {
                throw new AisMessageException("Message 12 wrong length");
            }

            base.Parse(sixState);

            Sequence    = (int)sixState.Get(2);
            Destination = sixState.Get(30);
            Retransmit  = (int)sixState.Get(1);
            Spare       = (int)sixState.Get(1);

            Message = sixState.GetString((length - 72) / 6);
        }
示例#22
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength < 88 || sixState.BitLength > 1008)
            {
                throw new AisMessageException("Message 6 wrong length");
            }

            base.Parse(sixState);

            Sequence    = (int)sixState.Get(2);
            Destination = sixState.Get(30);
            Retransmit  = (int)sixState.Get(1);
            Spare       = (int)sixState.Get(1);
            AppId       = (int)sixState.Get(16);

            /* Store the remaining payload of the packet for further processing */
            Data = sixState;
        }
示例#23
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            var length = sixState.BitLength;

            if (length != 160 && length != 168)
            {
                throw new AisMessageException("Message 24 wrong length");
            }

            base.Parse(sixState);

            PartNumber = (int)sixState.Get(2);

            if (PartNumber == 0)
            {
                /* Parse 24A */
                /* Get the Ship Name, convert to ASCII */
                Name = sixState.GetString(20);

                /* Indicate reception of part A */
                Flags |= 0x01;
            }
            else if (PartNumber == 1)
            {
                /* Parse 24B */
                ShipType = (int)sixState.Get(8);
                VendorId = sixState.GetString(7);
                Callsign = sixState.GetString(7);

                DimBow       = (int)sixState.Get(9);
                DimStern     = (int)sixState.Get(9);
                DimPort      = (int)sixState.Get(6);
                DimStarboard = (int)sixState.Get(6);
                Spare        = (int)sixState.Get(6);

                /* Indicate reception of part A */
                Flags |= 0x02;
            }
            else
            {
                throw new AisMessageException("Unknown Message 24 Part #");
            }
        }
示例#24
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength != 168)
            {
                throw new AisMessageException("Message 18 wrong length");
            }

            base.Parse(sixState);

            Regional1 = (int)sixState.Get(8);
            Sog       = (int)sixState.Get(10);
            PosAcc    = (int)sixState.Get(1);

            Pos           = new Position();
            Pos.Longitude = sixState.Get(28);
            Pos.Latitude  = sixState.Get(27);

            Cog         = (int)sixState.Get(12);
            TrueHeading = (int)sixState.Get(9);
            UtcSec      = (int)sixState.Get(6);
            Regional2   = (int)sixState.Get(2);
            UnitFlag    = (int)sixState.Get(1);
            DisplayFlag = (int)sixState.Get(1);
            DscFlag     = (int)sixState.Get(1);
            BandFlag    = (int)sixState.Get(1);
            Msg22Flag   = (int)sixState.Get(1);
            ModeFlag    = (int)sixState.Get(1);
            Raim        = (int)sixState.Get(1);
            CommState   = (int)sixState.Get(1);

            if (CommState == 0)
            {
                SotdmaState = new Sotdma(sixState);
            }
            else
            {
                ItdmaState = new Itdma(sixState);
            }
        }
示例#25
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            var length = sixState.BitLength;

            if (length < 272 || length > 360)
            {
                throw new AisMessageException("Message 21 wrong length");
            }

            base.Parse(sixState);

            AtonType = (int)sixState.Get(5);
            Name     = sixState.GetString(20);
            PosAcc   = (int)sixState.Get(1);

            Pos = new Position {
                Longitude = sixState.Get(28),
                Latitude  = sixState.Get(27)
            };

            DimBow         = (int)sixState.Get(9);
            DimStern       = (int)sixState.Get(9);
            DimPort        = (int)sixState.Get(6);
            DimStarboard   = (int)sixState.Get(6);
            PosType        = (int)sixState.Get(4);
            UtcSec         = (int)sixState.Get(6);
            OffPosition    = (int)sixState.Get(1);
            Regional       = (int)sixState.Get(8);
            Raim           = (int)sixState.Get(1);
            VirtualRenamed = (int)sixState.Get(1);
            Assigned       = (int)sixState.Get(1);
            Spare1         = (int)sixState.Get(1);

            if (length > 272)
            {
                NameExt = sixState.GetString((length - 272) / 6);
            }
        }
示例#26
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength != 424)
            {
                throw new AisMessageException("Message 5 wrong length");
            }

            base.Parse(sixState);

            Version      = (int)sixState.Get(2);
            Imo          = sixState.Get(30);
            Callsign     = sixState.GetString(7);
            Name         = sixState.GetString(20);
            ShipType     = (int)sixState.Get(8);
            DimBow       = (int)sixState.Get(9);
            DimStern     = (int)sixState.Get(9);
            DimPort      = (int)sixState.Get(6);
            DimStarboard = (int)sixState.Get(6);
            PosType      = (int)sixState.Get(4);
            Eta          = sixState.Get(20);
            Draught      = (int)sixState.Get(8);
            Dest         = sixState.GetString(20);
        }
示例#27
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            var length = sixState.BitLength;

            if (length < 72 || length > 168)
            {
                throw new AisMessageException("Message 7 wrong length");
            }

            base.Parse(sixState);

            Spare     = (int)sixState.Get(2);
            Destid1   = sixState.Get(30);
            Sequence1 = (int)sixState.Get(2);
            NumAcks   = 1;

            if (length > 72)
            {
                Destid2   = sixState.Get(30);
                Sequence2 = (int)sixState.Get(2);
                NumAcks++;
            }

            if (length > 104)
            {
                Destid3   = sixState.Get(30);
                Sequence3 = (int)sixState.Get(2);
                NumAcks++;
            }

            if (length > 136)
            {
                Destid4   = sixState.Get(30);
                Sequence4 = (int)sixState.Get(2);
                NumAcks++;
            }
        }
示例#28
0
        /// <summary>
        ///     Subclasses need to override with their own parsing method
        /// </summary>
        /// <param name="sixState"></param>
        /// <exception cref="SixbitsExhaustedException"></exception>
        /// <exception cref="AisMessageException"></exception>
        public override void Parse(Sixbit sixState)
        {
            if (sixState.BitLength != 168)
            {
                throw new AisMessageException("Message 9 wrong length");
            }

            base.Parse(sixState);

            Altitude = (int)sixState.Get(12);
            Sog      = (int)sixState.Get(10);
            PosAcc   = (int)sixState.Get(1);

            Pos = new Position {
                Longitude = sixState.Get(28),
                Latitude  = sixState.Get(27)
            };

            Cog       = (int)sixState.Get(12);
            UtcSec    = (int)sixState.Get(6);
            Regional  = (char)sixState.Get(8);
            Dte       = (char)sixState.Get(1);
            Spare     = (char)sixState.Get(3);
            Assigned  = (char)sixState.Get(1);
            Raim      = (char)sixState.Get(1);
            CommState = (char)sixState.Get(1);

            if (CommState == 0)
            {
                SotdmaState = new Sotdma(sixState);
            }
            else
            {
                ItdmaState = new Itdma(sixState);
            }
        }