예제 #1
0
        /// <summary>
        /// Will write large, complex, multi-sweep CSV file
        /// </summary>
        /// <param name="sFilename"></param>
        /// <param name="cCSVDelimiter"></param>
        public void SaveFileCSV(string sFilename, char cCSVDelimiter, RFEAmplitudeTableData AmplitudeCorrection)
        {
            if (m_nUpperBound <= 0)
            {
                return;
            }

            RFESweepData objFirst = m_arrData[0];

            using (StreamWriter myFile = new StreamWriter(sFilename, false))
            {
                myFile.WriteLine("RF Explorer CSV data file: " + FileHeaderVersioned());
                myFile.WriteLine("Start Frequency: " + objFirst.StartFrequencyMHZ.ToString() + "MHZ" + Environment.NewLine +
                                 "Step Frequency: " + (objFirst.StepFrequencyMHZ * 1000).ToString() + "KHZ" + Environment.NewLine +
                                 "Total data entries: " + m_nUpperBound.ToString() + Environment.NewLine +
                                 "Steps per entry: " + objFirst.TotalSteps.ToString());

                string sHeader = "Sweep" + cCSVDelimiter + "Date" + cCSVDelimiter + "Time" + cCSVDelimiter + "Milliseconds";

                for (UInt16 nStep = 0; nStep < objFirst.TotalSteps; nStep++)
                {
                    double dFrequency = objFirst.StartFrequencyMHZ + nStep * (objFirst.StepFrequencyMHZ);
                    sHeader += cCSVDelimiter + dFrequency.ToString("0000.000");
                }

                myFile.WriteLine(sHeader);

                for (int nSweepInd = 0; nSweepInd < m_nUpperBound; nSweepInd++)
                {
                    myFile.Write(nSweepInd.ToString() + cCSVDelimiter);

                    myFile.Write(m_arrData[nSweepInd].CaptureTime.ToShortDateString() + cCSVDelimiter +
                                 m_arrData[nSweepInd].CaptureTime.ToString("HH:mm:ss") + cCSVDelimiter +
                                 m_arrData[nSweepInd].CaptureTime.ToString("\\.fff") + cCSVDelimiter);

                    if (!m_arrData[nSweepInd].IsSameConfiguration(objFirst))
                    {
                        break;
                    }

                    for (UInt16 nStep = 0; nStep < objFirst.TotalSteps; nStep++)
                    {
                        myFile.Write(m_arrData[nSweepInd].GetAmplitudeDBM(nStep, AmplitudeCorrection, AmplitudeCorrection != null));
                        if (nStep != (objFirst.TotalSteps - 1))
                        {
                            myFile.Write(cCSVDelimiter);
                        }
                    }
                    myFile.Write(Environment.NewLine);
                }
            }
        }
 /// <summary>
 /// Save a CSV file using one frequency point/dBm value per line
 /// </summary>
 /// <param name="sFilename">full path filename</param>
 /// <param name="cCSVDelimiter">comma delimiter to use</param>
 /// <param name="AmplitudeCorrection"></param>
 public void SaveFileCSV(string sFilename, char cCSVDelimiter, RFEAmplitudeTableData AmplitudeCorrection)
 {
     using (StreamWriter myFile = new StreamWriter(sFilename, false))
     {
         for (UInt16 nDataPoint = 0; nDataPoint < TotalDataPoints; nDataPoint++)
         {
             myFile.Write(GetFrequencyMHZ(nDataPoint).ToString("f3"));
             myFile.Write(cCSVDelimiter);
             myFile.Write(GetAmplitudeDBM(nDataPoint, AmplitudeCorrection, AmplitudeCorrection != null).ToString("f1"));
             myFile.Write(Environment.NewLine);
         }
     }
 }
예제 #3
0
 /// <summary>
 /// Returns amplitude data in dBm. This is the value as it was read from the device or from a file
 /// so it is not adjusted by offset or additionally compensated in any way. If the value was read from a device,
 /// it may already be an adjusted value including device configured offset.
 /// </summary>
 /// <param name="nStep">Internal frequency step or bucket to read data from</param>
 /// <param name="AmplitudeCorrection">Optional parameter, can be null. If different than null, use the amplitude correction table</param>
 /// <param name="bUseCorrection">If the AmplitudeCorrection is not null, this boolean will tell whether to use it or not</param>
 /// <returns>Value in dBm</returns>
 public float GetAmplitudeDBM(UInt16 nStep, RFEAmplitudeTableData AmplitudeCorrection, bool bUseCorrection)
 {
     if (nStep < m_nTotalSteps)
     {
         if ((AmplitudeCorrection != null) && bUseCorrection)
         {
             return(m_arrAmplitude[nStep] + AmplitudeCorrection.GetAmplitudeCalibration((int)GetFrequencyMHZ(nStep)));
         }
         else
         {
             return(m_arrAmplitude[nStep]);
         }
     }
     else
     {
         return(RFECommunicator.MIN_AMPLITUDE_DBM);
     }
 }
 /// <summary>
 /// Returns amplitude data in dBm. This is the value as it was read from the device or from a file
 /// so it is not adjusted by offset or additionally compensated in any way. If the value was read from a device,
 /// it may already be an adjusted value including device configured offset.
 /// </summary>
 /// <param name="nDataPoint">Internal frequency data point to read data from</param>
 /// <param name="AmplitudeCorrection">Optional parameter, can be null. If different than null, use the amplitude correction table</param>
 /// <param name="bUseCorrection">If the AmplitudeCorrection is not null, this boolean will tell whether to use it or not</param>
 /// <returns>Value in dBm</returns>
 public float GetAmplitudeDBM(UInt16 nDataPoint, RFEAmplitudeTableData AmplitudeCorrection, bool bUseCorrection)
 {
     if (nDataPoint < m_nTotalDataPoints)
     {
         if ((AmplitudeCorrection != null) && bUseCorrection)
         {
             return(m_arrAmplitude[nDataPoint] + AmplitudeCorrection.GetAmplitudeCalibration((int)GetFrequencyMHZ(nDataPoint)));
         }
         else
         {
             return(m_arrAmplitude[nDataPoint]);
         }
     }
     else
     {
         return(RFECommunicator.MIN_AMPLITUDE_DBM + m_fOffsetDB);
     }
 }
        public void GetTopBottomDataRange(out double dTopRangeDBM, out double dBottomRangeDBM, RFEAmplitudeTableData AmplitudeCorrection)
        {
            dTopRangeDBM = RFECommunicator.MIN_AMPLITUDE_DBM;
            dBottomRangeDBM = RFECommunicator.MAX_AMPLITUDE_DBM;

            if (m_nUpperBound <= 0)
                return;

            for (UInt32 nIndSample = 0; nIndSample < m_nUpperBound; nIndSample++)
            {
                for (UInt16 nIndStep = 0; nIndStep < m_arrData[0].TotalSteps; nIndStep++)
                {
                    double dValueDBM = m_arrData[nIndSample].GetAmplitudeDBM(nIndStep,AmplitudeCorrection,AmplitudeCorrection!=null);
                    if (dTopRangeDBM < dValueDBM)
                        dTopRangeDBM = dValueDBM;
                    if (dBottomRangeDBM > dValueDBM)
                        dBottomRangeDBM = dValueDBM;
                }
            }
        }
        /// <summary>
        /// Saves a file in RFE standard format. Note it will not handle exceptions so the calling application can deal with GUI details
        /// Note: if there are sweeps with different start/stop frequencies, only the first one will be saved to disk
        /// </summary>
        /// <param name="sFilename"></param>
        public void SaveFile(string sFilename, string sModelText, string sConfigurationText, RFEAmplitudeTableData AmplitudeCorrection)
        {
            if (m_nUpperBound < 0)
            {
                return;
            }

            RFESweepData objFirst = m_arrData[0];
            int nTotalSweepsActuallySaved = 0;

            //Save file
            FileStream myFile = null;

            try
            {
                myFile = new FileStream(sFilename, FileMode.Create);

                using (BinaryWriter binStream = new BinaryWriter(myFile))
                {
                    binStream.Write((string)FileHeaderVersioned());
                    binStream.Write((double)objFirst.StartFrequencyMHZ);
                    binStream.Write((double)objFirst.StepFrequencyMHZ);
                    //NOTE: if we have different values for start/stop, we are saying we have more than we actually saved
                    //This is why we will save these parameters later again with nTotalSweepsActuallySaved
                    binStream.Write((UInt32)m_nUpperBound);

                    binStream.Write((UInt16)objFirst.TotalSteps);
                    binStream.Write((string)sConfigurationText);
                    binStream.Write((string)sModelText);

                    for (int nSweepInd = 0; nSweepInd <= m_nUpperBound; nSweepInd++)
                    {
                        if (!m_arrData[nSweepInd].IsSameConfiguration(objFirst))
                            break;

                        //new in v002 - save date/time for each captured sweep
                        string sTime = m_arrData[nSweepInd].CaptureTime.ToString("o");
                        binStream.Write((Int32)sTime.Length);
                        binStream.Write((string)sTime);

                        nTotalSweepsActuallySaved++;
                        for (UInt16 nStep = 0; nStep < objFirst.TotalSteps; nStep++)
                        {
                            binStream.Write((double)m_arrData[nSweepInd].GetAmplitudeDBM(nStep,AmplitudeCorrection,AmplitudeCorrection!=null));
                        }
                    }

                    //Save file fields again (will overwrite old ones), just to make sure nTotalSweepsActuallySaved is properly saved with actual value used
                    myFile.Seek(0, SeekOrigin.Begin);
                    binStream.Write((string)FileHeaderVersioned());
                    binStream.Write((double)objFirst.StartFrequencyMHZ);
                    binStream.Write((double)objFirst.StepFrequencyMHZ);
                    binStream.Write((Int32)nTotalSweepsActuallySaved);
                }
            }
            finally
            {
                if (myFile != null)
                    myFile.Dispose();
            }

            try
            {
                myFile = new FileStream(sFilename, FileMode.Open);

                using (BinaryWriter binStream = new BinaryWriter(myFile))
                {
                    myFile = null;

                    binStream.Write(FileHeaderVersioned());
                    binStream.Write(objFirst.StartFrequencyMHZ);
                    binStream.Write(objFirst.StepFrequencyMHZ);
                    binStream.Write(nTotalSweepsActuallySaved);
                }
            }
            finally
            {
                if (myFile != null)
                    myFile.Dispose();
            }
        }
        /// <summary>
        /// Will write large, complex, multi-sweep CSV file
        /// </summary>
        /// <param name="sFilename"></param>
        /// <param name="cCSVDelimiter"></param>
        public void SaveFileCSV(string sFilename, char cCSVDelimiter, RFEAmplitudeTableData AmplitudeCorrection)
        {
            if (m_nUpperBound <= 0)
            {
                return;
            }

            RFESweepData objFirst = m_arrData[0];

            using (StreamWriter myFile = new StreamWriter(sFilename, true))
            {
                myFile.WriteLine("RF Explorer CSV data file: " + FileHeaderVersioned());
                myFile.WriteLine("Start Frequency: " + objFirst.StartFrequencyMHZ.ToString() + "MHZ" + Environment.NewLine +
                    "Step Frequency: " + (objFirst.StepFrequencyMHZ * 1000).ToString() + "KHZ" + Environment.NewLine +
                    "Total data entries: " + m_nUpperBound.ToString() + Environment.NewLine +
                    "Steps per entry: " + objFirst.TotalSteps.ToString());

                string sHeader = "Sweep" + cCSVDelimiter + "Date" + cCSVDelimiter + "Time" + cCSVDelimiter + "Milliseconds";

                for (UInt16 nStep = 0; nStep < objFirst.TotalSteps; nStep++)
                {
                    double dFrequency = objFirst.StartFrequencyMHZ + nStep * (objFirst.StepFrequencyMHZ);
                    sHeader += cCSVDelimiter + dFrequency.ToString("0000.000");
                }

                myFile.WriteLine(sHeader);

                for (int nSweepInd = 0; nSweepInd < m_nUpperBound; nSweepInd++)
                {
                    myFile.Write(nSweepInd.ToString() + cCSVDelimiter);

                    myFile.Write(m_arrData[nSweepInd].CaptureTime.ToShortDateString() + cCSVDelimiter +
                        m_arrData[nSweepInd].CaptureTime.ToString("HH:mm:ss") + cCSVDelimiter +
                        m_arrData[nSweepInd].CaptureTime.ToString("\\.fff") + cCSVDelimiter);

                    if (!m_arrData[nSweepInd].IsSameConfiguration(objFirst))
                        break;

                    for (UInt16 nStep = 0; nStep < objFirst.TotalSteps; nStep++)
                    {
                        myFile.Write(m_arrData[nSweepInd].GetAmplitudeDBM(nStep, AmplitudeCorrection, AmplitudeCorrection!=null));
                        if (nStep != (objFirst.TotalSteps - 1))
                            myFile.Write(cCSVDelimiter);
                    }
                    myFile.Write(Environment.NewLine);
                }
            }
        }
 /// <summary>
 /// Returns amplitude data in dBm. This is the value as it was read from the device or from a file
 /// so it is not adjusted by offset or additionally compensated in any way. If the value was read from a device,
 /// it may already be an adjusted value including device configured offset.
 /// </summary>
 /// <param name="nStep">Internal frequency step or bucket to read data from</param>
 /// <param name="AmplitudeCorrection">Optional parameter, can be null. If different than null, use the amplitude correction table</param>
 /// <param name="bUseCorrection">If the AmplitudeCorrection is not null, this boolean will tell whether to use it or not</param>
 /// <returns>Value in dBm</returns>
 public float GetAmplitudeDBM(UInt16 nStep, RFEAmplitudeTableData AmplitudeCorrection, bool bUseCorrection)
 {
     if (nStep < m_nTotalSteps)
     {
         if ((AmplitudeCorrection != null) && bUseCorrection)
         {
             return m_arrAmplitude[nStep] + AmplitudeCorrection.GetAmplitudeCalibration((int)GetFrequencyMHZ(nStep));
         }
         else
         {
             return m_arrAmplitude[nStep];
         }
     }
     else
         return RFECommunicator.MIN_AMPLITUDE_DBM;
 }
예제 #9
0
        public void GetTopBottomDataRange(out double dTopRangeDBM, out double dBottomRangeDBM, RFEAmplitudeTableData AmplitudeCorrection)
        {
            dTopRangeDBM    = RFECommunicator.MIN_AMPLITUDE_DBM;
            dBottomRangeDBM = RFECommunicator.MAX_AMPLITUDE_DBM;

            if (m_nUpperBound <= 0)
            {
                return;
            }

            for (UInt32 nIndSample = 0; nIndSample < m_nUpperBound; nIndSample++)
            {
                for (UInt16 nIndStep = 0; nIndStep < m_arrData[0].TotalSteps; nIndStep++)
                {
                    double dValueDBM = m_arrData[nIndSample].GetAmplitudeDBM(nIndStep, AmplitudeCorrection, AmplitudeCorrection != null);
                    if (dTopRangeDBM < dValueDBM)
                    {
                        dTopRangeDBM = dValueDBM;
                    }
                    if (dBottomRangeDBM > dValueDBM)
                    {
                        dBottomRangeDBM = dValueDBM;
                    }
                }
            }
        }
예제 #10
0
        /// <summary>
        /// Saves a file in RFE standard format. Note it will not handle exceptions so the calling application can deal with GUI details
        /// Note: if there are sweeps with different start/stop frequencies, only the first one will be saved to disk
        /// </summary>
        /// <param name="sFilename"></param>
        public void SaveFile(string sFilename, string sModelText, string sConfigurationText, RFEAmplitudeTableData AmplitudeCorrection)
        {
            if (m_nUpperBound < 0)
            {
                return;
            }

            RFESweepData objFirst = m_arrData[0];
            int          nTotalSweepsActuallySaved = 0;

            //Save file
            FileStream myFile = null;

            try
            {
                myFile = new FileStream(sFilename, FileMode.Create);

                using (BinaryWriter binStream = new BinaryWriter(myFile))
                {
                    binStream.Write((string)FileHeaderVersioned());
                    binStream.Write((double)objFirst.StartFrequencyMHZ);
                    binStream.Write((double)objFirst.StepFrequencyMHZ);
                    //NOTE: if we have different values for start/stop, we are saying we have more than we actually saved
                    //This is why we will save these parameters later again with nTotalSweepsActuallySaved
                    binStream.Write((UInt32)m_nUpperBound);

                    binStream.Write((UInt16)objFirst.TotalSteps);
                    binStream.Write((string)sConfigurationText);
                    binStream.Write((string)sModelText);

                    for (int nSweepInd = 0; nSweepInd <= m_nUpperBound; nSweepInd++)
                    {
                        if (!m_arrData[nSweepInd].IsSameConfiguration(objFirst))
                        {
                            break;
                        }

                        //new in v002 - save date/time for each captured sweep
                        string sTime = m_arrData[nSweepInd].CaptureTime.ToString("o");
                        binStream.Write((Int32)sTime.Length);
                        binStream.Write((string)sTime);

                        nTotalSweepsActuallySaved++;
                        for (UInt16 nStep = 0; nStep < objFirst.TotalSteps; nStep++)
                        {
                            binStream.Write((double)m_arrData[nSweepInd].GetAmplitudeDBM(nStep, AmplitudeCorrection, AmplitudeCorrection != null));
                        }
                    }

                    //Save file fields again (will overwrite old ones), just to make sure nTotalSweepsActuallySaved is properly saved with actual value used
                    myFile.Seek(0, SeekOrigin.Begin);
                    binStream.Write((string)FileHeaderVersioned());
                    binStream.Write((double)objFirst.StartFrequencyMHZ);
                    binStream.Write((double)objFirst.StepFrequencyMHZ);
                    binStream.Write((Int32)nTotalSweepsActuallySaved);
                }
            }
            finally
            {
                if (myFile != null)
                {
                    myFile.Dispose();
                }
            }

            try
            {
                myFile = new FileStream(sFilename, FileMode.Open);

                using (BinaryWriter binStream = new BinaryWriter(myFile))
                {
                    myFile = null;

                    binStream.Write(FileHeaderVersioned());
                    binStream.Write(objFirst.StartFrequencyMHZ);
                    binStream.Write(objFirst.StepFrequencyMHZ);
                    binStream.Write(nTotalSweepsActuallySaved);
                }
            }
            finally
            {
                if (myFile != null)
                {
                    myFile.Dispose();
                }
            }
        }
        /// <summary>
        /// Saves a file in RFE standard format. Note it will not handle exceptions so the calling application can deal with GUI details
        /// Note: if there are sweeps with different start/stop frequencies, only the first one will be saved to disk
        /// </summary>
        /// <param name="sFilename"></param>
        public void SaveFile(string sFilename, string sModelText, string sConfigurationText, RFEAmplitudeTableData AmplitudeCorrection)
        {
            if (m_nUpperBound < 0)
            {
                return;
            }

            RFESweepData objFirst = m_arrData[0];
            int          nTotalSweepsActuallySaved = 0;

            //Save file
            FileStream myFile = null;

            try
            {
                myFile = new FileStream(sFilename, FileMode.Create);

                using (BinaryWriter binStream = new BinaryWriter(myFile))
                {
                    binStream.Write((string)FileHeaderVersioned());
                    binStream.Write((double)objFirst.StartFrequencyMHZ);
                    binStream.Write((double)objFirst.StepFrequencyMHZ);
                    //NOTE: if we have different values for start/stop, we are saying we have more than we actually saved
                    //This is why we will save these parameters later again with nTotalSweepsActuallySaved
                    binStream.Write((UInt32)m_nUpperBound);

                    binStream.Write((UInt16)objFirst.TotalDataPoints);
                    binStream.Write((string)sConfigurationText);
                    binStream.Write((string)sModelText);

                    var memoryStream = new MemoryStream();
                    using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
                    {
                        int nUncompressedSize = 0;
                        using (BinaryWriter ZipStream = new BinaryWriter(gZipStream))
                        {
                            //Save all the sweeps consecutively
                            for (int nSweepInd = 0; nSweepInd <= m_nUpperBound; nSweepInd++)
                            {
                                if (!m_arrData[nSweepInd].IsSameConfiguration(objFirst))
                                {
                                    break;
                                }

                                //new in v002 - save date/time for each captured sweep
                                string sTime = m_arrData[nSweepInd].CaptureTime.ToString("o");
                                ZipStream.Write((Int32)sTime.Length);
                                byte[] arrText = Encoding.ASCII.GetBytes(sTime); //From v003 we encode string to byte for Date/time data
                                ZipStream.Write(arrText, 0, arrText.Length);
                                nUncompressedSize += arrText.Length + sizeof(System.Int32);

                                nTotalSweepsActuallySaved++;
                                for (UInt16 nDataPoint = 0; nDataPoint < objFirst.TotalDataPoints; nDataPoint++)
                                {
                                    ZipStream.Write((double)m_arrData[nSweepInd].GetAmplitudeDBM(nDataPoint, AmplitudeCorrection, AmplitudeCorrection != null));
                                }
                                nUncompressedSize += sizeof(System.Double) * objFirst.TotalDataPoints;
                            }
                        }
                        memoryStream.Position = 0;

                        byte[] arrCompressedBuffer = new byte[memoryStream.Length];
                        memoryStream.Read(arrCompressedBuffer, 0, arrCompressedBuffer.Length);

                        binStream.Write(nUncompressedSize);
                        binStream.Write(arrCompressedBuffer.Length);
                        binStream.Write(arrCompressedBuffer, 0, arrCompressedBuffer.Length);
                    }

                    //Save file fields again (will overwrite old ones), just to make sure nTotalSweepsActuallySaved is properly saved with actual value used
                    myFile.Seek(0, SeekOrigin.Begin);
                    binStream.Write((string)FileHeaderVersioned());
                    binStream.Write((double)objFirst.StartFrequencyMHZ);
                    binStream.Write((double)objFirst.StepFrequencyMHZ);
                    binStream.Write((Int32)nTotalSweepsActuallySaved);
                }
            }
            finally
            {
                if (myFile != null)
                {
                    myFile.Dispose();
                }
            }
        }
 public void SaveFileXML(string sFilename, char cCSVDelimiter, RFEAmplitudeTableData AmplitudeCorrection)
 {
     //TODO: create a self-contained structure, including all member variables, and a list of all amplitude values in a single element <ScanData>y1,y2,...</ScanData>
 }