Exemplo n.º 1
0
        internal void SearchFramesByMagicPhase2(OnSearchProgressDelegate progressCallback)
        {
            m_Index = new AdvFramesIndex();

            int  percentCompleted;
            int  lastPercentCompleted = -1;
            int  framesRecovered      = 0;
            long startTimeTicks       = -1;

            m_CandidateFrameOffsets.Add(new RecoveredFrameHeader()
            {
                Position = m_FileReader.BaseStream.Length
            });

            ushort[,] prevFramePixels = null;

            for (int i = 0; i < m_CandidateFrameOffsets.Count - 1; i++)
            {
                RecoveredFrameHeader frameInfo1 = m_CandidateFrameOffsets[i];
                RecoveredFrameHeader frameInfo2 = m_CandidateFrameOffsets[i + 1];

                if (startTimeTicks == -1)
                {
                    startTimeTicks = frameInfo1.StartExposureUT.Ticks;
                }

                m_Index.Index.Add(new AdvFramesIndexEntry()
                {
                    ElapsedTime = new TimeSpan(frameInfo1.StartExposureUT.Ticks - startTimeTicks),
                    Offset      = frameInfo1.Position,
                    Length      = (uint)(frameInfo2.Position - frameInfo1.Position)
                });

                try
                {
                    object[]      data        = GetFrameSectionData(framesRecovered, prevFramePixels);
                    AdvImageData  imageData   = (AdvImageData)data[0];
                    AdvStatusData statusData  = (AdvStatusData)data[1];
                    int           frameWidth  = imageData.ImageData.GetLength(0);
                    int           frameHeight = imageData.ImageData.GetLength(1);
                    Trace.WriteLine(string.Format("Recovered frame #{0} with LayoutId {1} and {2} status tags. Dimentions: {3}x{4} pixels", framesRecovered, imageData.LayoutId, statusData.TagValues.Count, frameWidth, frameHeight));

                    // NOTE: Doesn't have to be right, just need something so we read the pixels
                    prevFramePixels = imageData.ImageData;

                    framesRecovered++;
                }
                catch (Exception)
                {
                    m_Index.Index.RemoveAt(m_Index.Index.Count - 1);
                }

                percentCompleted = (int)(100.0 * i / (m_CandidateFrameOffsets.Count - 1));
                if (lastPercentCompleted < percentCompleted)
                {
                    progressCallback(percentCompleted, framesRecovered);
                    lastPercentCompleted = percentCompleted;
                }
            }
        }
Exemplo n.º 2
0
        internal void ExportStatusSectionToCSV(string fileName, int firstFrame, int lastFrame, OnSearchProgressDelegate progressCallback)
        {
            progressCallback(5, 0);

            //string folder = Path.GetDirectoryName(fileName);

            bool headerAppended = false;

            using (FileStream fsOutput = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write))
                using (TextWriter writer = new StreamWriter(fsOutput))
                {
                    for (int i = firstFrame; i <= lastFrame; i++)
                    {
                        object[]      data       = GetFrameSectionData(i, null);
                        AdvImageData  imageData  = (AdvImageData)data[0];
                        AdvStatusData statusData = (AdvStatusData)data[1];

                        //using(FileStream fs = new FileStream(string.Format("{0}\\{1}.pix", folder, i), FileMode.CreateNew, FileAccess.Write))
                        //using (BinaryWriter wrt = new BinaryWriter(fs))
                        //{
                        //	for (int y = 0; y < ImageSection.Height; y++)
                        //	{
                        //		for (int x = 0; x < ImageSection.Width; x++)
                        //		{
                        //			ushort val = imageData.ImageData[x, y];
                        //			wrt.Write(val);
                        //		}
                        //	}
                        //}

                        string headerRow;
                        string nextRow = StatusDataToCsvRow(imageData, statusData, i, out headerRow);
                        if (!headerAppended)
                        {
                            writer.WriteLine(headerRow);
                            headerAppended = true;
                        }
                        writer.WriteLine(nextRow);

                        int percDone = (int)Math.Min(90, 90 * (i - firstFrame) * 1.0 / (lastFrame - firstFrame + 1));
                        progressCallback(5 + percDone, 0);
                    }

                    progressCallback(95, 0);

                    writer.Flush();
                }
        }
Exemplo n.º 3
0
        private string StatusDataToCsvRow(AdvImageData imageData, AdvStatusData statusData, int frameNo, out string headerRow)
        {
            var output = new StringBuilder();
            output.AppendFormat("\"{0}\"", frameNo);
            output.AppendFormat(",\"{0}\"", imageData.MidExposureUtc.AddMilliseconds( - 1 * imageData.ExposureMilliseconds / 2.0).ToString("dd-MMM-yyyy HH:mm:ss.fff"));
            output.AppendFormat(",\"{0}\"", imageData.MidExposureUtc.AddMilliseconds(imageData.ExposureMilliseconds / 2.0).ToString("dd-MMM-yyyy HH:mm:ss.fff"));

            var header = new StringBuilder();
            header.Append("FrameNo,OCRStartTimestamp,OCREndTimestamp");

            foreach (AdvTagDefinition statusTag in statusData.TagValues.Keys)
            {
                string tagValue = statusData.TagValues[statusTag];
                if ((statusTag.Name == "SystemTime" || statusTag.Name == "NTPStartTimestamp" || statusTag.Name == "NTPEndTimestamp" || statusTag.Name == "StartTimestampSecondary" || statusTag.Name == "EndTimestampSecondary") &&
                    !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = AdvFile.ADV_ZERO_DATE_REF.AddMilliseconds(long.Parse(tagValue)).ToString("dd-MMM-yyyy HH:mm:ss.fff");
                }
                else if (statusTag.Name == "GPSTrackedSatellites" && !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = int.Parse(tagValue).ToString();
                }
                else if (statusTag.Name == "Gamma" && !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = string.Format("{0:0.000}", float.Parse(tagValue));
                }
                else if (statusTag.Name == "Gain" && !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = string.Format("{0:0} dB", float.Parse(tagValue));
                }
                else if (statusTag.Name == "Shutter" && !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = string.Format("{0:0.000} sec", float.Parse(tagValue));
                }
                else if (statusTag.Name == "Offset" && !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = string.Format("{0:0.00} %", float.Parse(tagValue));
                }
                else if ((statusTag.Name == "VideoCameraFrameId" || statusTag.Name == "HardwareTimerFrameId") &&
                         !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = int.Parse(tagValue).ToString("#,###,###,###,###");
                }
                else if (statusTag.Name == "GPSAlmanacStatus" && !string.IsNullOrEmpty(tagValue))
                {
                    int almanacStatus = int.Parse(tagValue);
                    tagValue = AdvStatusValuesHelper.TranslateGpsAlmanacStatus(almanacStatus);
                }
                else if (statusTag.Name == "GPSAlmanacOffset" && !string.IsNullOrEmpty(tagValue))
                {
                    int almanacOffset = int.Parse(tagValue);
                    if ((almanacOffset & 0x80) == 0x80)
                        almanacOffset = (short) (almanacOffset + (0xFF << 8));

                    tagValue = AdvStatusValuesHelper.TranslateGpsAlmanacOffset(1, almanacOffset, false);
                }
                else if (statusTag.Name == "GPSFixStatus" && !string.IsNullOrEmpty(tagValue))
                {
                    int fixStatus = int.Parse(tagValue);
                    tagValue = AdvStatusValuesHelper.TranslateGpsFixStatus(fixStatus);
                }

                if (!string.IsNullOrEmpty(tagValue) && (statusTag.Name == "UserCommand" || statusTag.Name == "SystemError" || statusTag.Name == "GPSFix"))
                {
                    string[] tokens = tagValue.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                    tagValue = string.Empty;
                    for (int i = 0; i < tokens.Length; i++)
                    {
                        tagValue += string.Format("{0}[{1}];", statusTag.Name, i + 1);
                    }
                }

                if (tagValue == null) tagValue = string.Empty;

                output.AppendFormat(",\"{0}\"", tagValue.Replace("\"", "\"\""));
                header.AppendFormat(",{0}", statusTag.Name);
            }

            headerRow = header.ToString();
            return output.ToString();
        }
Exemplo n.º 4
0
        internal Pixelmap GetFrameData(int index, out AdvImageData imageData, out AdvStatusData statusData, out Bitmap displayBitmap)
        {
            imageData = null;

            if (index < NumberOfFrames)
            {
                byte layoutId;
                AdvImageLayout.GetByteMode byteMode;

                GetFrameImageSectionHeader(index, out layoutId, out byteMode);

                AdvImageLayout layout = ImageSection.GetImageLayoutFromLayoutId(layoutId);

                if (layout.IsDiffCorrLayout && byteMode == AdvImageLayout.GetByteMode.DiffCorrBytes && prevFrameNo != index - 1)
                {
                    // Move back and find the nearest previous key frame
                    int keyFrameIdx = index;
                    do
                    {
                        keyFrameIdx--;
                        GetFrameImageSectionHeader(keyFrameIdx, out layoutId, out byteMode);
                    }
                    while (keyFrameIdx > 0 && byteMode != AdvImageLayout.GetByteMode.KeyFrameBytes);

                    object[] keyFrameData = GetFrameSectionData(keyFrameIdx, null);
                    prevFramePixels = ((AdvImageData)keyFrameData[0]).ImageData;

                    if (layout.DiffCorrFrame == DiffCorrFrameMode.PrevFrame)
                    {
                        for (int i = keyFrameIdx + 1; i < index; i++)
                        {
                            object[] frameData = GetFrameSectionData(i, prevFramePixels);

                            prevFramePixels = ((AdvImageData)frameData[0]).ImageData;
                        }
                    }
                }

                object[] data;

                data = GetFrameSectionData(index, prevFramePixels);

                imageData = (AdvImageData)data[0];
                statusData = (AdvStatusData)data[1];

                if (prevFramePixels == null)
                    prevFramePixels = new ushort[ImageSection.Width, ImageSection.Height];

                if (layout.IsDiffCorrLayout)
                {
                    for (int x = 0; x < ImageSection.Width; x++)
                        for (int y = 0; y < ImageSection.Height; y++)
                        {
                            prevFramePixels[x, y] = imageData.ImageData[x, y];
                        }
                }

                prevFrameNo = index;

                Pixelmap rv = ImageSection.CreatePixelmap(imageData);

                //Pixelmap rv = new Pixelmap((int)m_AdvFile.ImageSection.Width, (int)m_AdvFile.ImageSection.Height, m_AdvFile.ImageSection.BitsPerPixel, null, null, null);
                //rv.Width = (int) m_AdvFile.ImageSection.Width;
                //rv.Height = (int) m_AdvFile.ImageSection.Height;
                //rv.BitPixCamera = m_AdvFile.ImageSection.BitsPerPixel;
                //rv.Array = new uint[Width * Height];
                //rv.CopyPixelsFrom(imageData.ImageData, imageData.Bpp);
                //displayBitmap = PixelmapFactory.ConstructBitmapFrom12BitPixelmap(rv);

                displayBitmap = rv.DisplayBitmap;

                return rv;
            }
            else
            {
                displayBitmap = null;
                statusData = null;
                return null;
            }
        }
Exemplo n.º 5
0
        internal bool FixAavFile18Aug(string fileName, int firstFrame, int lastFrame)
        {
            fileName = m_FileName;
            string newFile = Path.ChangeExtension(fileName, ".new.aav");

            File.Copy(fileName, newFile, true);

            using (FileStream fsr = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                using (BinaryReader reader = new BinaryReader(fsr))
                    using (FileStream fs = new FileStream(newFile, FileMode.Open, FileAccess.Write))
                        using (BinaryWriter writer = new BinaryWriter(fs))
                        {
                            uint numFrames = m_Index.NumberOfFrames;

                            long ZEROTICKS = (new DateTime(2013, 8, 18).Ticks - ADV_ZERO_DATE_REF.Ticks) / 10000;

                            for (int i = 0; i < numFrames; i++)
                            {
                                AdvFramesIndexEntry entry = m_Index.Index[i];

                                uint elapsedMiliseconds = (uint)entry.ElapsedTime.TotalMilliseconds;
                                long offset             = entry.Offset;
                                uint length             = entry.Length;

                                object[]      data       = GetFrameSectionData(i, null);
                                AdvImageData  imageData  = (AdvImageData)data[0];
                                AdvStatusData statusData = (AdvStatusData)data[1];

                                AdvTagDefinition startTS = StatusSection.TagDefinitions[3];
                                AdvTagDefinition endTS   = StatusSection.TagDefinitions[4];
                                AdvTagDefinition gpsFix  = StatusSection.TagDefinitions[7];

                                string startTSString = statusData.TagValues[startTS];
                                string endTSString   = statusData.TagValues[endTS];
                                string gpsFixString  = statusData.TagValues[gpsFix];

                                long ticksStart = FixOSD(ref startTSString, true);
                                long ticksEnd   = FixOSD(ref endTSString, false);

                                long midTicks     = ZEROTICKS + (ticksStart - 20 * 10000 + ticksEnd) / 20000;
                                long exposureMs10 = new TimeSpan(ticksEnd - ticksStart + 20 * 10000).Milliseconds * 10;

                                fsr.Seek(12 + (4 + entry.Offset), SeekOrigin.Begin);
                                int bytesToSkip = reader.ReadInt32();

                                WriteInt16((short)exposureMs10, 8 + (4 + entry.Offset), writer, reader);
                                WriteInt64(midTicks, (4 + entry.Offset), writer, reader);

                                WriteString(startTSString, 16 + (4 + entry.Offset) + bytesToSkip + 0x22, writer, reader);
                                WriteString(endTSString, 16 + (4 + entry.Offset) + bytesToSkip + 0x43, writer, reader);

                                int gspFixByte = int.Parse(gpsFixString);
                                if (gspFixByte >= 1)
                                {
                                    gspFixByte++;
                                }

                                WriteInt8((byte)gspFixByte, 16 + (4 + entry.Offset) + bytesToSkip + 0x1f, writer, reader);
                                //writer.Write(elapsedMiliseconds);
                                //writer.Write(offset);
                                //writer.Write(length);
                            }

                            fs.Flush();
                        }

            return(false);
        }
Exemplo n.º 6
0
        private string StatusDataToCsvRow(AdvImageData imageData, AdvStatusData statusData, int frameNo, out string headerRow)
        {
            var output = new StringBuilder();

            output.AppendFormat("\"{0}\"", frameNo);
            output.AppendFormat(",\"{0}\"", imageData.MidExposureUtc.AddMilliseconds(-1 * imageData.ExposureMilliseconds / 2.0).ToString("dd-MMM-yyyy HH:mm:ss.fff"));
            output.AppendFormat(",\"{0}\"", imageData.MidExposureUtc.AddMilliseconds(imageData.ExposureMilliseconds / 2.0).ToString("dd-MMM-yyyy HH:mm:ss.fff"));

            var header = new StringBuilder();

            header.Append("FrameNo,OCRStartTimestamp,OCREndTimestamp");

            foreach (AdvTagDefinition statusTag in statusData.TagValues.Keys)
            {
                string tagValue = statusData.TagValues[statusTag];
                if ((statusTag.Name == "SystemTime" || statusTag.Name == "NTPStartTimestamp" || statusTag.Name == "NTPEndTimestamp" || statusTag.Name == "StartTimestampSecondary" || statusTag.Name == "EndTimestampSecondary") &&
                    !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = AdvFile.ADV_ZERO_DATE_REF.AddMilliseconds(long.Parse(tagValue)).ToString("dd-MMM-yyyy HH:mm:ss.fff");
                }
                else if (statusTag.Name == "GPSTrackedSatellites" && !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = int.Parse(tagValue).ToString();
                }
                else if (statusTag.Name == "Gamma" && !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = string.Format("{0:0.000}", float.Parse(tagValue));
                }
                else if (statusTag.Name == "Gain" && !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = string.Format("{0:0} dB", float.Parse(tagValue));
                }
                else if (statusTag.Name == "Shutter" && !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = string.Format("{0:0.000} sec", float.Parse(tagValue));
                }
                else if (statusTag.Name == "Offset" && !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = string.Format("{0:0.00} %", float.Parse(tagValue));
                }
                else if ((statusTag.Name == "VideoCameraFrameId" || statusTag.Name == "HardwareTimerFrameId") &&
                         !string.IsNullOrEmpty(tagValue))
                {
                    tagValue = int.Parse(tagValue).ToString("#,###,###,###,###");
                }
                else if (statusTag.Name == "GPSAlmanacStatus" && !string.IsNullOrEmpty(tagValue))
                {
                    int almanacStatus = int.Parse(tagValue);
                    tagValue = AdvStatusValuesHelper.TranslateGpsAlmanacStatus(almanacStatus);
                }
                else if (statusTag.Name == "GPSAlmanacOffset" && !string.IsNullOrEmpty(tagValue))
                {
                    int almanacOffset = int.Parse(tagValue);
                    if ((almanacOffset & 0x80) == 0x80)
                    {
                        almanacOffset = (short)(almanacOffset + (0xFF << 8));
                    }

                    tagValue = AdvStatusValuesHelper.TranslateGpsAlmanacOffset(1, almanacOffset, false);
                }
                else if (statusTag.Name == "GPSFixStatus" && !string.IsNullOrEmpty(tagValue))
                {
                    int fixStatus = int.Parse(tagValue);
                    tagValue = AdvStatusValuesHelper.TranslateGpsFixStatus(fixStatus);
                }

                if (!string.IsNullOrEmpty(tagValue) && (statusTag.Name == "UserCommand" || statusTag.Name == "SystemError" || statusTag.Name == "GPSFix"))
                {
                    string[] tokens = tagValue.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                    tagValue = string.Empty;
                    for (int i = 0; i < tokens.Length; i++)
                    {
                        tagValue += string.Format("{0}[{1}];", statusTag.Name, i + 1);
                    }
                }

                if (tagValue == null)
                {
                    tagValue = string.Empty;
                }

                output.AppendFormat(",\"{0}\"", tagValue.Replace("\"", "\"\""));
                header.AppendFormat(",{0}", statusTag.Name);
            }

            headerRow = header.ToString();
            return(output.ToString());
        }
Exemplo n.º 7
0
        internal Pixelmap GetFrameData(int index, out AdvImageData imageData, out AdvStatusData statusData, out Bitmap displayBitmap)
        {
            imageData = null;

            if (index < NumberOfFrames)
            {
                byte layoutId;
                AdvImageLayout.GetByteMode byteMode;

                GetFrameImageSectionHeader(index, out layoutId, out byteMode);

                AdvImageLayout layout = ImageSection.GetImageLayoutFromLayoutId(layoutId);

                if (layout.IsDiffCorrLayout && byteMode == AdvImageLayout.GetByteMode.DiffCorrBytes && prevFrameNo != index - 1)
                {
                    // Move back and find the nearest previous key frame
                    int keyFrameIdx = index;
                    do
                    {
                        keyFrameIdx--;
                        GetFrameImageSectionHeader(keyFrameIdx, out layoutId, out byteMode);
                    }while (keyFrameIdx > 0 && byteMode != AdvImageLayout.GetByteMode.KeyFrameBytes);

                    object[] keyFrameData = GetFrameSectionData(keyFrameIdx, null);
                    prevFramePixels = ((AdvImageData)keyFrameData[0]).ImageData;

                    if (layout.DiffCorrFrame == DiffCorrFrameMode.PrevFrame)
                    {
                        for (int i = keyFrameIdx + 1; i < index; i++)
                        {
                            object[] frameData = GetFrameSectionData(i, prevFramePixels);

                            prevFramePixels = ((AdvImageData)frameData[0]).ImageData;
                        }
                    }
                }

                object[] data;

                data = GetFrameSectionData(index, prevFramePixels);

                imageData  = (AdvImageData)data[0];
                statusData = (AdvStatusData)data[1];

                if (prevFramePixels == null)
                {
                    prevFramePixels = new ushort[ImageSection.Width, ImageSection.Height];
                }

                if (layout.IsDiffCorrLayout)
                {
                    for (int x = 0; x < ImageSection.Width; x++)
                    {
                        for (int y = 0; y < ImageSection.Height; y++)
                        {
                            prevFramePixels[x, y] = imageData.ImageData[x, y];
                        }
                    }
                }

                prevFrameNo = index;

                Pixelmap rv = ImageSection.CreatePixelmap(imageData);

                //Pixelmap rv = new Pixelmap((int)m_AdvFile.ImageSection.Width, (int)m_AdvFile.ImageSection.Height, m_AdvFile.ImageSection.BitsPerPixel, null, null, null);
                //rv.Width = (int) m_AdvFile.ImageSection.Width;
                //rv.Height = (int) m_AdvFile.ImageSection.Height;
                //rv.BitPixCamera = m_AdvFile.ImageSection.BitsPerPixel;
                //rv.Array = new uint[Width * Height];
                //rv.CopyPixelsFrom(imageData.ImageData, imageData.Bpp);
                //displayBitmap = PixelmapFactory.ConstructBitmapFrom12BitPixelmap(rv);

                displayBitmap = rv.DisplayBitmap;

                return(rv);
            }
            else
            {
                displayBitmap = null;
                statusData    = null;
                return(null);
            }
        }
Exemplo n.º 8
0
        public object GetDataFromDataBytes(byte[] bytes, ushort[,] prevFrame, int size, int startIndex)
        {
            var rv = new AdvStatusData();

            if (size > 0)
            {
                byte tagValuesCount = bytes[startIndex];
                startIndex++;

                for (int i = 0; i < tagValuesCount; i++)
                {
                    int tagId = bytes[startIndex];
                    AdvTagDefinition tagDef = m_TagDefinitions[tagId];

                    if (tagDef.Type == AdvTagType.UInt8)
                    {
                        byte value = bytes[startIndex + 1];
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 2;
                    }
                    else if (tagDef.Type == AdvTagType.UInt16)
                    {
                        byte   b1    = bytes[startIndex + 1];
                        byte   b2    = bytes[startIndex + 2];
                        ushort value = (ushort)((b2 << 8) + b1);
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 3;
                    }
                    else if (tagDef.Type == AdvTagType.UInt32)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        byte b3 = bytes[startIndex + 3];
                        byte b4 = bytes[startIndex + 4];

                        uint value = (uint)((b4 << 24) + (b3 << 16) + (b2 << 8) + b1);
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 5;
                    }
                    else if (tagDef.Type == AdvTagType.Real)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        byte b3 = bytes[startIndex + 3];
                        byte b4 = bytes[startIndex + 4];

                        uint value = (uint)((b4 << 24) + (b3 << 16) + (b2 << 8) + b1);

                        IntToFloatStruct converter = new IntToFloatStruct();
                        converter.UInt32Value = value;
                        float realValue = converter.RealValue;

                        rv.TagValues[tagDef] = realValue.ToString();

                        startIndex += 5;
                    }
                    else if (tagDef.Type == AdvTagType.ULong64)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        byte b3 = bytes[startIndex + 3];
                        byte b4 = bytes[startIndex + 4];
                        byte b5 = bytes[startIndex + 5];
                        byte b6 = bytes[startIndex + 6];
                        byte b7 = bytes[startIndex + 7];
                        byte b8 = bytes[startIndex + 8];

                        uint valLo = (uint)((b4 << 24) + (b3 << 16) + (b2 << 8) + b1);
                        uint valHi = (uint)((b8 << 24) + (b7 << 16) + (b6 << 8) + b5);
                        long value = (((long)valHi) << 32) + (long)valLo;
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 9;
                    }
                    else if (tagDef.Type == AdvTagType.AnsiString254)
                    {
                        byte   len           = bytes[startIndex + 1];
                        byte[] tagValuebytes = new byte[len];
                        Array.Copy(bytes, startIndex + 2, tagValuebytes, 0, len);

                        rv.TagValues[tagDef] = Encoding.ASCII.GetString(tagValuebytes);

                        startIndex += 2 + len;
                    }
                    else if (tagDef.Type == AdvTagType.List16AnsiString254)
                    {
                        StringBuilder bld   = new StringBuilder();
                        byte          count = bytes[startIndex + 1];
                        startIndex += 2;
                        for (int j = 0; j < count; j++)
                        {
                            byte   len           = bytes[startIndex];
                            byte[] tagValuebytes = new byte[len];
                            Array.Copy(bytes, startIndex + 1, tagValuebytes, 0, len);

                            bld.AppendLine(Encoding.ASCII.GetString(tagValuebytes));

                            startIndex += 1 + len;
                        }

                        rv.TagValues[tagDef] = bld.ToString();
                    }
                }
            }

            return(rv);
        }
Exemplo n.º 9
0
        public object GetDataFromDataBytes(byte[] bytes, ushort[,] prevFrame, int size, int startIndex)
        {
            var rv = new AdvStatusData();

            if (size > 0)
            {
                byte tagValuesCount = bytes[startIndex];
                startIndex++;

                for (int i = 0; i < tagValuesCount; i++)
                {
                    int tagId = bytes[startIndex];
                    AdvTagDefinition tagDef = m_TagDefinitions[tagId];

                    if (tagDef.Type == AdvTagType.UInt8)
                    {
                        byte value = bytes[startIndex + 1];
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 2;
                    }
                    else if (tagDef.Type == AdvTagType.UInt16)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        ushort value = (ushort)((b2 << 8) + b1);
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 3;
                    }
                    else if (tagDef.Type == AdvTagType.UInt32)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        byte b3 = bytes[startIndex + 3];
                        byte b4 = bytes[startIndex + 4];

                        uint value = (uint)((b4 << 24) + (b3 << 16) + (b2 << 8) + b1);
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 5;
                    }
                    else if (tagDef.Type == AdvTagType.Real)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        byte b3 = bytes[startIndex + 3];
                        byte b4 = bytes[startIndex + 4];

                        uint value = (uint)((b4 << 24) + (b3 << 16) + (b2 << 8) + b1);

                        IntToFloatStruct converter = new IntToFloatStruct();
                        converter.UInt32Value = value;
                        float realValue = converter.RealValue;

                        rv.TagValues[tagDef] = realValue.ToString();

                        startIndex += 5;
                    }
                    else if (tagDef.Type == AdvTagType.ULong64)
                    {
                        byte b1 = bytes[startIndex + 1];
                        byte b2 = bytes[startIndex + 2];
                        byte b3 = bytes[startIndex + 3];
                        byte b4 = bytes[startIndex + 4];
                        byte b5 = bytes[startIndex + 5];
                        byte b6 = bytes[startIndex + 6];
                        byte b7 = bytes[startIndex + 7];
                        byte b8 = bytes[startIndex + 8];

                        uint valLo = (uint)((b4 << 24) + (b3 << 16) + (b2 << 8) + b1);
                        uint valHi = (uint)((b8 << 24) + (b7 << 16) + (b6 << 8) + b5);
                        long value = (((long)valHi) << 32) + (long)valLo;
                        rv.TagValues[tagDef] = value.ToString();

                        startIndex += 9;
                    }
                    else if (tagDef.Type == AdvTagType.AnsiString254)
                    {
                        byte len = bytes[startIndex + 1];
                        byte[] tagValuebytes = new byte[len];
                        Array.Copy(bytes, startIndex + 2, tagValuebytes, 0, len);

                        rv.TagValues[tagDef] = Encoding.ASCII.GetString(tagValuebytes);

                        startIndex += 2 + len;
                    }
                    else if (tagDef.Type == AdvTagType.List16AnsiString254)
                    {
                        StringBuilder bld = new StringBuilder();
                        byte count = bytes[startIndex + 1];
                        startIndex += 2;
                        for (int j = 0; j < count; j++)
                        {
                            byte len = bytes[startIndex];
                            byte[] tagValuebytes = new byte[len];
                            Array.Copy(bytes, startIndex + 1, tagValuebytes, 0, len);

                            bld.AppendLine(Encoding.ASCII.GetString(tagValuebytes));

                            startIndex += 1 + len;
                        }

                        rv.TagValues[tagDef] = bld.ToString();
                    }
                }
            }

            return rv;
        }