| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | using System.Collections.Generic;namespace InABox.DigitalMatter{    public enum GPSStatus    {        Valid,        ThreeDimensional,        NoSignal    }    public class DMGPSField : DMField    {        public override byte Type => 0x00;        public uint TimeStamp { get; set; }        public int Latitude { get; set; }        public int Longitude { get; set; }        public short Altitude { get; set; }        public ushort Speed { get; set; }        public byte SpeedAccuracy { get; set; }        public byte Heading { get; set; }        public byte PDOP { get; set; }        public byte GPSAccuracy { get; set; }        public byte Status { get; set; }        public GPSStatus[] StatusFlags()        {            var result = new List<GPSStatus>();            var flags = IDMBuffer.DecodeByte(Status, 1, 8);            if (flags[0])                result.Add(GPSStatus.Valid);            if (flags[1])                result.Add(GPSStatus.ThreeDimensional);            if (flags[2])                result.Add(GPSStatus.NoSignal);            return result.ToArray();        }        public override bool IsValid()        {            return Status != 0;        }        public override string ToString()        {            return string.Format("{0:dd MMM yy hh-mm-ss} Lat: {1:F6} Lng: {2:F6} Status: {3}", TimeStampToDateTime(TimeStamp),                (double)Latitude / 10000000.0F, (double)Longitude / 10000000.0F, string.Join(",", StatusFlags()));        }        protected override void DoDecode(IDMReadBuffer buffer)        {            TimeStamp = buffer.TakeUInt32();            Latitude = buffer.TakeInt32();            Longitude = buffer.TakeInt32();            Altitude = buffer.TakeInt16();            Speed = buffer.TakeByte();            SpeedAccuracy = buffer.TakeByte();            Heading = buffer.TakeByte();            PDOP = buffer.TakeByte();            GPSAccuracy = buffer.TakeByte();            Status = buffer.TakeByte();        }        protected override void DoEncode(IDMWriteBuffer buffer)        {            buffer.AddUInt32(TimeStamp);            buffer.AddInt32(Latitude);            buffer.AddInt32(Longitude);            buffer.AddInt16(Altitude);            buffer.AddUInt16(Speed);            buffer.AddByte(SpeedAccuracy);            buffer.AddByte(Heading);            buffer.AddByte(PDOP);            buffer.AddByte(GPSAccuracy);            buffer.AddByte(Status);        }    }}
 |