Beispiel #1
0
        // Shamelessly copy pasted from the XDAWaveFormDataParser
        // Thanks other Stephen
        private void ParseEMAX(string controlFileName)
        {
            try
            {
                DateTime?startTime = null;
                DateTime timestamp;

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

                    // 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]);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                e.Source = m_currentFileRootName;
                ExceptionList.Add(e);
            }
        }
Beispiel #2
0
        public void Parse(string filePath)
        {
            ControlFile controlFile;
            string      identityString;
            string      deviceName;

            Channel    channel;
            DataSeries series;

            List <ANLG_CHNL_NEW> analogChannels;

            controlFile    = m_parser.ControlFile;
            identityString = controlFile.IdentityString.value;
            deviceName     = identityString.Substring(0, IndexOf(identityString, "\r\n", "\n", "\r"));

            m_meterDataSet.Meter           = new Meter();
            m_meterDataSet.Meter.AssetKey  = deviceName;
            m_meterDataSet.Meter.Name      = deviceName;
            m_meterDataSet.Meter.ShortName = deviceName.Substring(0, Math.Min(deviceName.Length, 50));

            analogChannels = controlFile.AnalogChannelSettings
                             .OrderBy(kvp => kvp.Key)
                             .Select(kvp => kvp.Value)
                             .ToList();

            // Add an empty data series for 1-based indexing
            m_meterDataSet.DataSeries.Add(new DataSeries());

            foreach (ANLG_CHNL_NEW analogChannel in analogChannels)
            {
                channel = ParseSeries(analogChannel);
                channel.Series.Single().SourceIndexes = m_meterDataSet.DataSeries.Count.ToString();
                series            = new DataSeries();
                series.SeriesInfo = channel.Series[0];
                m_meterDataSet.Meter.Channels.Add(channel);
                m_meterDataSet.DataSeries.Add(series);
            }

            while (m_parser.ReadNext())
            {
                for (int i = 0; i < analogChannels.Count; i++)
                {
                    m_meterDataSet.DataSeries[i + 1].DataPoints.Add(new DataPoint()
                    {
                        Time = m_parser.CalculatedTimestamp, Value = m_parser.CorrectedValues[i]
                    });
                }
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        public void Parse(string filePath)
        {
            ControlFile controlFile    = m_parser.ControlFile;
            string      identityString = controlFile.IdentityString.value;
            string      deviceName     = identityString.Substring(0, IndexOf(identityString, "\r\n", "\n", "\r"));

            Meter meter = new Meter();

            meter.Location  = new Location();
            meter.Channels  = new List <Channel>();
            meter.AssetKey  = deviceName;
            meter.Name      = deviceName;
            meter.ShortName = deviceName.Substring(0, Math.Min(deviceName.Length, 50));

            Location meterLocation = meter.Location;

            meterLocation.Meters = new List <Meter>()
            {
                meter
            };
            meterLocation.LocationKey = deviceName;
            meterLocation.Name        = deviceName;
            meterLocation.ShortName   = meter.ShortName;
            meterLocation.Description = deviceName;

            List <ANLG_CHNL_NEW> analogChannels = controlFile.AnalogChannelSettings
                                                  .OrderBy(kvp => kvp.Key)
                                                  .Select(kvp => kvp.Value)
                                                  .ToList();

            List <EVNT_CHNL_NEW> digitalChannels = controlFile.EventChannelSettings
                                                   .OrderBy(kvp => kvp.Key)
                                                   .Select(kvp => kvp.Value)
                                                   .ToList();

            // Add an empty data series for 1-based indexing
            m_meterDataSet.DataSeries.Add(new DataSeries());
            m_meterDataSet.Digitals.Add(new DataSeries());

            foreach (ANLG_CHNL_NEW analogChannel in analogChannels)
            {
                Channel channel = ParseSeries(analogChannel);
                channel.Meter = meter;
                channel.Series.Single().SourceIndexes = m_meterDataSet.DataSeries.Count.ToString();

                DataSeries dataSeries = new DataSeries();
                dataSeries.SeriesInfo = channel.Series[0];

                meter.Channels.Add(channel);

                m_meterDataSet.DataSeries.Add(dataSeries);
            }

            foreach (EVNT_CHNL_NEW digitalChannel in digitalChannels)
            {
                Channel channel = ParseSeries(digitalChannel);
                channel.Series.Single().SourceIndexes = m_meterDataSet.Digitals.Count.ToString();

                DataSeries series = new DataSeries();
                series.SeriesInfo = channel.Series[0];

                meter.Channels.Add(channel);

                m_meterDataSet.Digitals.Add(series);
            }

            while (m_parser.ReadNext())
            {
                DateTime timestamp = m_emaxSettings.ApplyTimestampCorrection ? m_parser.CalculatedTimestamp : m_parser.ParsedTimestamp;

                for (int i = 0; i < analogChannels.Count; i++)
                {
                    double value = m_emaxSettings.ApplyValueCorrection ? m_parser.CorrectedValues[i] : m_parser.Values[i];
                    m_meterDataSet.DataSeries[i + 1].DataPoints.Add(new DataPoint()
                    {
                        Time = timestamp, Value = value
                    });
                }

                for (int i = 0; i < digitalChannels.Count; i++)
                {
                    int    bitCount   = sizeof(ushort) * 8;
                    int    groupIndex = i / bitCount;
                    int    bitIndex   = i % bitCount;
                    ushort mask       = (ushort)~(0x8000u >> bitIndex);
                    double value      = m_parser.EventGroups[groupIndex] & mask;
                    m_meterDataSet.Digitals[i + 1].DataPoints.Add(new DataPoint()
                    {
                        Time = timestamp, Value = value
                    });
                }
            }

            if (!string.IsNullOrEmpty(m_emaxSettings.COMTRADEExportDirectory))
            {
                TryExportToCOMTRADE(filePath, controlFile, identityString, analogChannels, digitalChannels);
            }

            m_meterDataSet.Meter = meter;
        }