예제 #1
0
        private static Meter ParseDataSource(DataSourceRecord dataSource)
        {
            Meter         meter;
            MeterLocation meterLocation;

            string name        = dataSource.DataSourceName;
            Guid   vendorID    = dataSource.VendorID;
            Guid   equipmentID = dataSource.EquipmentID;

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

            meterLocation             = new MeterLocation();
            meterLocation.AssetKey    = meter.Name;
            meterLocation.Name        = string.Format("{0} location", meter.Name);
            meterLocation.ShortName   = meterLocation.Name.Substring(0, Math.Min(meterLocation.Name.Length, 50));
            meterLocation.Description = meterLocation.Name;

            if (vendorID != Vendor.None)
            {
                meter.Make = Vendor.ToString(vendorID);
            }

            if (equipmentID != Guid.Empty)
            {
                meter.Model = Equipment.ToString(equipmentID);
            }

            return(meter);
        }
예제 #2
0
        /// <summary>
        /// Parses the file into a meter data set per meter contained in the file.
        /// </summary>
        /// <param name="filePath">The path to the file to be parsed.</param>
        /// <returns>List of meter data sets, one per meter.</returns>
        public void Parse(string filePath)
        {
            DataSourceRecord              dataSource = null;
            ObservationRecord             observation;
            IEnumerable <ChannelInstance> channelInstances;

            Meter      meter = null;
            Channel    channel;
            DataSeries dataSeries;

            DateTime[] timeData;

            while (m_parser.HasNextObservationRecord())
            {
                observation = m_parser.NextObservationRecord();

                if ((object)observation.DataSource == null)
                {
                    continue;
                }

                if ((object)dataSource == null)
                {
                    dataSource           = observation.DataSource;
                    meter                = ParseDataSource(dataSource);
                    m_meterDataSet.Meter = meter;
                }

                if (!AreEquivalent(dataSource, observation.DataSource))
                {
                    throw new InvalidDataException($"PQDIF file \"{filePath}\" defines too many data sources.");
                }

                channelInstances = observation.ChannelInstances
                                   .Where(channelInstance => QuantityType.IsQuantityTypeID(channelInstance.Definition.QuantityTypeID))
                                   .Where(channelInstance => channelInstance.SeriesInstances.Any())
                                   .Where(channelInstance => channelInstance.SeriesInstances[0].Definition.ValueTypeID == SeriesValueType.Time);

                foreach (ChannelInstance channelInstance in channelInstances)
                {
                    timeData = ParseTimeData(channelInstance);

                    foreach (SeriesInstance seriesInstance in channelInstance.SeriesInstances.Skip(1))
                    {
                        channel = ParseSeries(seriesInstance);

                        dataSeries            = new DataSeries();
                        dataSeries.DataPoints = timeData.Zip(ParseValueData(seriesInstance), (time, d) => new DataPoint()
                        {
                            Time = time, Value = d
                        }).ToList();
                        dataSeries.SeriesInfo = channel.Series[0];

                        meter.Channels.Add(channel);
                        m_meterDataSet.DataSeries.Add(dataSeries);
                    }
                }
            }
        }
예제 #3
0
        // Static Methods
        private static bool AreEquivalent(DataSourceRecord dataSource1, DataSourceRecord dataSource2)
        {
            if (ReferenceEquals(dataSource1, dataSource2))
            {
                return(true);
            }

            if ((object)dataSource1 == null || (object)dataSource2 == null)
            {
                return(false);
            }

            return(dataSource1.DataSourceName == dataSource2.DataSourceName &&
                   dataSource1.VendorID == dataSource2.VendorID &&
                   dataSource1.EquipmentID == dataSource2.EquipmentID);
        }