示例#1
0
        /// <summary>
        /// Decode single AVL data
        /// </summary>
        /// <returns></returns>
        private AvlData DecodeAvlData()
        {
            var priorityAndTimestamp = _reader.ReadInt32();

            // priority
            var priorityMapIndex = 0x03 & (priorityAndTimestamp >> 30);
            var priority         = (GhAvlDataPriority)priorityMapIndex;

            // timestamp
            var timestamp = (long)(priorityAndTimestamp & 0x3FFFFFFF);
            var dateTime  = GHepoch.AddSeconds(timestamp);

            var eventId = 0;

            IoProperty?alarmProperty = null;

            if (priority == GhAvlDataPriority.Alarm)
            {
                eventId       = Constants.AlarmPropertyId;
                alarmProperty = IoProperty.Create(Constants.AlarmPropertyId, 1);
            }

            // global mask Codec7
            var mask = (GlobalMaskCodec7)_reader.ReadByte();

            var gps = GpsElement.Default;

            var gpsIo = new IoElement();


            if (mask.HasFlag(GlobalMaskCodec7.GpsElement))
            {
                var element = DecodeGpsElement();
                gps   = element.GPS;
                gpsIo = element.IO;
            }

            var ioInt8  = GetProperties(mask, GlobalMaskCodec7.IoInt8, FieldEncoding.Int8);
            var ioInt16 = GetProperties(mask, GlobalMaskCodec7.IoInt16, FieldEncoding.Int16);
            var ioInt32 = GetProperties(mask, GlobalMaskCodec7.IoInt32, FieldEncoding.Int32);

            var properties = new List <IoProperty>();

            if (alarmProperty != null)
            {
                properties.Add(alarmProperty.Value);
            }

            properties.AddRange(gpsIo.Properties);

            properties.AddRange(ioInt8 ?? Enumerable.Empty <IoProperty>());
            properties.AddRange(ioInt16 ?? Enumerable.Empty <IoProperty>());
            properties.AddRange(ioInt32 ?? Enumerable.Empty <IoProperty>());

            var ioElement = IoElement.Create(eventId, properties.Count(), properties);

            return(AvlData.Create(priority.ToString(), dateTime, gps, ioElement));
        }
示例#2
0
        public IoElement DecodeIoElement(FieldEncoding encoding)
        {
            var count = _reader.ReadByte();

            var properties = new List <IoProperty>(count);

            for (var i = 0; i < count; i++)
            {
                properties.Add(DecodeProperty(encoding));
            }
            return(IoElement.Create(0, properties.Count(), properties));
        }
示例#3
0
        /// <summary>
        /// Decode single AVL data
        /// </summary>
        /// <returns></returns>
        private AvlData DecodeAvlData()
        {
            var timestamp = _reader.ReadInt64();
            var dateTime  = AvlEpoch.AddMilliseconds(timestamp);
            var priority  = (AvlDataPriority)_reader.ReadByte();

            // GPS element decoding
            var gpsElement = DecodeGpsElement();

            // IO Element decoding
            var eventId         = _reader.ReadByte();
            var propertiesCount = _reader.ReadByte();
            // IO Element Properties decoding
            var ioProperties = DecodeIoProperties();

            var ioElement = IoElement.Create(eventId, propertiesCount, ioProperties);

            return(AvlData.Create(priority.ToString(), dateTime, gpsElement, ioElement));
        }
示例#4
0
        /// <summary>
        /// Decode Gps element
        /// </summary>
        /// <returns></returns>
        private GpsElementExt DecodeGpsElement()
        {
            var mask = (GpsElementMaskCodec7)_reader.ReadByte();

            float x = 0;
            float y = 0;

            if (mask.HasFlag(GpsElementMaskCodec7.Coordinates))
            {
                var lat = EndianBitConverter.Int32ToSingle(_reader.ReadInt32());
                var lng = EndianBitConverter.Int32ToSingle(_reader.ReadInt32());

                if (!GpsElement.IsLatValid(lat))
                {
                    lat = 0;
                }
                if (!GpsElement.IsLngValid(lng))
                {
                    lng = 0;
                }

                y = lat;
                x = lng;
            }

            short altitude = 0;

            if (mask.HasFlag(GpsElementMaskCodec7.Altitude))
            {
                altitude = _reader.ReadInt16();
            }

            short angle = 0;

            if (mask.HasFlag(GpsElementMaskCodec7.Angle))
            {
                angle = (short)Math.Round(((double)_reader.ReadByte() * 360 / 256));
            }

            short speed = 0;

            if (mask.HasFlag(GpsElementMaskCodec7.Speed))
            {
                speed = _reader.ReadByte();
            }

            var satellites = mask.HasFlag(GpsElementMaskCodec7.Satellites) ? _reader.ReadByte() : (byte)3;

            var properties = new List <IoProperty>(3);

            if (mask.HasFlag(GpsElementMaskCodec7.CellId))
            {
                var cellId = _reader.ReadInt32();
                properties.Add(IoProperty.Create(Constants.CellIdPropertyId, cellId));
            }

            if (mask.HasFlag(GpsElementMaskCodec7.SignalQuality))
            {
                var signalQuality = _reader.ReadByte();
                properties.Add(IoProperty.Create(Constants.SignalQualityPropertyId, signalQuality));
            }

            if (mask.HasFlag(GpsElementMaskCodec7.OperatorCode))
            {
                var code = _reader.ReadInt32();
                properties.Add(IoProperty.Create(Constants.OperatorCodePropertyId, code));
            }

            // set the N/A position if it's not available
            if (x == 0 && y == 0)
            {
                speed      = GpsElement.InvalidGpsSpeed;
                satellites = 0;
            }

            var gps = GpsElement.Create(x, y, altitude, speed, angle, satellites);

            var io = IoElement.Create(0, properties.Count, properties);

            return(new GpsElementExt(gps: gps, io: io));
        }