EMAX data file(s) parser that calculates timestamps based on sample rate and attempts to correct inverted values.
Inheritance: IDisposable
 public void Dispose()
 {
     if (!m_disposed)
     {
         try
         {
             if ((object)m_parser != null)
             {
                 m_parser.Dispose();
                 m_parser = null;
             }
         }
         finally
         {
             m_disposed = true;
         }
     }
 }
        public bool CanParse(string filePath, DateTime fileCreationTime)
        {
            string directory = FilePath.GetDirectoryName(filePath);
            string rootFileName = FilePath.GetFileNameWithoutExtension(filePath);
            string controlFileName = Path.Combine(directory, rootFileName + ".ctl");

            if (!File.Exists(controlFileName))
                return false;

            try
            {
                m_parser = new CorrectiveParser();
                m_parser.ControlFile = new ControlFile(controlFileName);
                m_parser.FileName = filePath;
                m_parser.OpenFiles();
            }
            catch (IOException)
            {
                return false;
            }

            return true;
        }
        private void EMAXButton_Click(object sender, EventArgs e)
        {
            string directory;
            string rootFileName;
            string controlFileName;

            DateTime? startTime = null;
            DateTime timestamp;

            using (OpenFileDialog dialog = new OpenFileDialog())
            {
                dialog.Filter = "EMAX Files|*.rcd;*.rcl|All Files|*.*";
                dialog.Title = "Browse EMAX Files";

                if (dialog.ShowDialog() == DialogResult.Cancel)
                    return;

                if (!File.Exists(dialog.FileName))
                    return;

                // EMAX parsing will require a CTL file, make sure this exists...
                directory = Path.GetDirectoryName(dialog.FileName) ?? string.Empty;
                rootFileName = FilePath.GetFileNameWithoutExtension(dialog.FileName);
                controlFileName = Path.Combine(directory, rootFileName + ".ctl");

                if (!File.Exists(controlFileName))
                    return;

                using (CorrectiveParser parser = new CorrectiveParser())
                {
                    parser.ControlFile = new ControlFile(controlFileName);
                    parser.FileName = dialog.FileName;

                    // Open EMAX data file
                    parser.OpenFiles();

                    // Parse EMAX control file into channels
                    m_channels = parser.ControlFile.AnalogChannelSettings.Values
                        .Select(channel => new ParsedChannel()
                        {
                            Index = Convert.ToInt32(channel.chanlnum),
                            Name = channel.title,
                            TimeValues = new List<DateTime>(),
                            XValues = new List<object>(),
                            YValues = new List<object>()
                        })
                        .OrderBy(channel => channel.Index)
                        .ToList();

                    // Read values from EMAX data file
                    while (parser.ReadNext())
                    {
                        timestamp = parser.CalculatedTimestamp;

                        // If this is the first frame, store this frame's
                        // timestamp as the start time of the file
                        if ((object)startTime == null)
                            startTime = timestamp;

                        // Read the values from this frame into
                        // x- and y-value collections for each channel
                        for (int i = 0; i < m_channels.Count; i++)
                        {
                            m_channels[i].TimeValues.Add(timestamp);
                            m_channels[i].XValues.Add(timestamp.Subtract(startTime.Value).TotalSeconds);
                            m_channels[i].YValues.Add(parser.CorrectedValues[i]);
                        }
                    }
                }

                // Clear the list box and data chart
                ChannelListBox.Items.Clear();
                DataChart.Series.Clear();

                // Populate the list box with channel names
                ChannelListBox.Items.AddRange(m_channels
                    .Select(channel => string.Format("[{0}] {1}", channel.Index, channel.Name))
                    .Cast<object>()
                    .ToArray());

                // Select the first channel in the list
                ChannelListBox.SelectedIndex = 0;

                // Change the title text of the window to show what file the user has open
                m_fileName = dialog.SafeFileName;
                Text = string.Format("EMAX - [{0}]", dialog.SafeFileName);
            }
        }