Esempio n. 1
0
        public static string GetStringValue(ArraySegment <byte> arraySegment, DataType dataType)
        {
            var subArray = arraySegment.Array.Skip(arraySegment.Offset).Take(arraySegment.Count).ToArray();

            switch (dataType)
            {
            // Avl Data types
            case DataType.CodecId:
            case DataType.AvlDataCount:
            case DataType.Priority:
            case DataType.Satellites:
            case DataType.EventIoId:
            case DataType.IoCount:
            case DataType.IoCount1B:
            case DataType.IoId1B:
            case DataType.IoValue1B:
            case DataType.IoCount2B:
            case DataType.IoId2B:
            case DataType.IoCount4B:
            case DataType.IoId4B:
            case DataType.IoCount8B:
            case DataType.IoId8B:
                return(subArray[0].ToString());

            case DataType.Latitude:
            case DataType.Longitude:
                return(BytesSwapper.Swap(BitConverter.ToInt32(subArray, 0)).ToString());

            case DataType.IoValue4B:
                return(GetSignedUnsigned32(subArray));

            case DataType.Altitude:
            case DataType.Angle:
            case DataType.Speed:
                return(BytesSwapper.Swap(BitConverter.ToInt16(subArray, 0)).ToString());

            case DataType.IoValue2B:
                return(GetSignedUnsigned16(subArray));

            case DataType.IoValue8B:
                return(GetSignedUnsigned64(subArray));

            case DataType.Timestamp:
                return(AvlEpoch.AddMilliseconds(BytesSwapper.Swap(BitConverter.ToInt64(subArray, 0))).ToString());

            // Codec7 types
            case DataType.TimestampGh:
            {
                var priorityAndTimeStamp = BytesSwapper.Swap(BitConverter.ToInt32(subArray, 0));
                var timeStamp            = (long)(priorityAndTimeStamp & 0x3FFFFFFF);
                return(GHepoch.AddSeconds(timeStamp).ToString());
            }

            case DataType.PriorityGh:
            {
                string priorityAndTimestampBits = string.Join(" ", subArray.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')));
                return(((GhAvlDataPriority)Convert.ToInt16(priorityAndTimestampBits.Substring(0, 2))).ToString());
            }

            case DataType.GlobalMask:
                return(((GlobalMaskCodec7)subArray[0]).ToString());

            case DataType.GpsElementMask:
                return(((GpsElementMaskCodec7)subArray[0]).ToString());

            case DataType.LongitudeGh:
            case DataType.LatitudeGh:
            {
                var coordinate = EndianBitConverter.ToSingle(subArray, 0);
                if (!GpsElement.IsLatValid(coordinate))
                {
                    return(0.ToString());
                }
                return(coordinate.ToString());
            }

            case DataType.AngleGh:
            case DataType.SpeedGh:
                return(subArray[0].ToString());

            case DataType.CellIdAndLocalAreaGh:
            case DataType.OperatorCodeGh:
                return(BytesSwapper.Swap(BitConverter.ToInt32(subArray, 0)).ToString());

            case DataType.SignalQualityGh:
                return(subArray[0].ToString());

            // Tcp types
            case DataType.Preamble:
            case DataType.AvlDataArrayLength:
            case DataType.Crc:
                return(GetSignedUnsigned32(subArray));

            // Udp types
            case DataType.Length:
            case DataType.PacketId:
            case DataType.ImeiLength:
                return(GetSignedUnsigned16(subArray));

            case DataType.PacketType:
            case DataType.AvlPacketId:
                return(subArray[0].ToString());

            case DataType.Imei:
                return(Encoding.UTF8.GetString(subArray));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 2
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));
        }