Ejemplo n.º 1
0
        private int GetLevel(DeviceStats deviceStats, int reportDay)
        {
            int    reportDayIndex       = reportDay - 1;
            double measurementsReceived = deviceStats.MeasurementsReceived[reportDayIndex];
            double measurementsExpected = deviceStats.MeasurementsExpected[reportDayIndex];

            if (measurementsExpected == 0.0D)
            {
                return(-1);
            }

            if (measurementsReceived >= (m_level4Threshold * measurementsExpected) / 100.0D)
            {
                return(4);
            }

            if (measurementsReceived >= (m_level3Threshold * measurementsExpected) / 100.0D)
            {
                return(3);
            }

            if (measurementsReceived > 0.0D)
            {
                return(2);
            }

            if (deviceStats.MeasurementsReceived.Skip(reportDay - Month).Take(ReportDays).Any(receivedStat => receivedStat > 0.0D))
            {
                return(1);
            }

            return(0);
        }
Ejemplo n.º 2
0
        private void ResetAndInit()
        {
            Log.Notice("Resetting device {0}", PciAddress);

            //Sec 4.6.3.1 - Disable all interrupts
            SetReg(IxgbeDefs.EIMC, 0x7FFFFFFF);

            //Sec 4.6.3.2 - Global reset (software + link)
            SetReg(IxgbeDefs.CTRL, IxgbeDefs.CTRL_RST_MASK);
            WaitClearReg(IxgbeDefs.CTRL, IxgbeDefs.CTRL_RST_MASK);
            //Wait 0.01 seconds for reset
            Thread.Sleep(10);

            //Sec 4.6.3.1 - Disable interrupts again after reset
            SetReg(IxgbeDefs.EIMC, 0x7FFFFFFF);

            Log.Notice("Initializing device {0}", PciAddress);

            //Sec 4.6.3 - Wait for EEPROM auto read completion
            WaitSetReg(IxgbeDefs.EEC, IxgbeDefs.EEC_ARD);

            //Sec 4.6.3 - Wait for DMA initialization to complete
            WaitSetReg(IxgbeDefs.RDRXCTL, IxgbeDefs.RDRXCTL_DMAIDONE);

            //Sec 4.6.4 - Init link (auto negotiation)
            InitLink();

            //Sec 4.6.5 - Statistical counters
            //Reset-on-read registers, just read them once
            var stats = new DeviceStats();

            ReadStats(ref stats);

            //Sec 4.6.7 - Init Rx
            InitRx();

            //Sec 4.6.8 - Init Tx
            InitTx();

            //Start each Rx/Tx queue
            for (int i = 0; i < RxQueues.Length; i++)
            {
                StartRxQueue(i);
            }
            for (int i = 0; i < TxQueues.Length; i++)
            {
                StartTxQueue(i);
            }

            //Skipping last step from 4.6.3
            SetPromisc(true);

            WaitForLink();
        }
Ejemplo n.º 3
0
        public override void ReadStats(ref DeviceStats stats)
        {
            uint  rxPackets = GetReg(IxgbeDefs.GPRC);
            uint  txPackets = GetReg(IxgbeDefs.GPTC);
            ulong rxBytes   = GetReg(IxgbeDefs.GORCL) + (((ulong)GetReg(IxgbeDefs.GORCH)) << 32);
            ulong txBytes   = GetReg(IxgbeDefs.GOTCL) + (((ulong)GetReg(IxgbeDefs.GOTCH)) << 32);

            stats.RxPackets += rxPackets;
            stats.TxPackets += txPackets;
            stats.RxBytes   += rxBytes;
            stats.TxBytes   += txBytes;
        }
Ejemplo n.º 4
0
        public unsafe Forwarder(string pci1, string pci2)
        {
            GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
            if (String.IsNullOrEmpty(pci1) || String.IsNullOrEmpty(pci2))
            {
                Log.Error("Please provide two pci addresses");
                Environment.Exit(1);
            }

            var dev1 = new IxgbeDevice(pci1, 1, 1);
            var dev2 = new IxgbeDevice(pci2, 1, 1);

            // TODO: switch to C# 7.3 and replace with Span<PacketBuffer> buffers = stackalloc PacketBuffer[BatchSize];
            var buffersArray = stackalloc PacketBuffer[BatchSize];
            var buffers      = new Span <PacketBuffer>(buffersArray, BatchSize);

            ulong counter   = 0;
            var   stopWatch = new Stopwatch();
            var   stats1    = new DeviceStats(dev1);
            var   stats1Old = new DeviceStats(dev1);
            var   stats2    = new DeviceStats(dev2);
            var   stats2Old = new DeviceStats(dev2);

            stopWatch.Start();
            while (true)
            {
                Forward(dev1, 0, dev2, 0, buffers);
                Forward(dev2, 0, dev1, 0, buffers);
                stats1.Reset();
                stats1Old.Reset();
                stats2.Reset();
                stats2Old.Reset();

                //Periodically measure time
                if (((counter++ % 500000) == 0) && stopWatch.ElapsedMilliseconds > 1000)
                {
                    stopWatch.Stop();
                    var nanos = stopWatch.ElapsedTicks;
                    dev1.ReadStats(ref stats1);
                    stats1.PrintStatsDiff(ref stats1Old, (ulong)nanos);
                    stats1Old = stats1;
                    if (dev1 != dev2)
                    {
                        dev2.ReadStats(ref stats2);
                        stats2.PrintStatsDiff(ref stats2Old, (ulong)nanos);
                        stats2Old = stats2;
                    }
                    counter = 0;
                    stopWatch.Restart();
                }
            }
        }
Ejemplo n.º 5
0
        public unsafe PacketGenerator(string pciAddr)
        {
            InitMempool();

            var dev = new IxgbeDevice(pciAddr, 1, 1);

            // TODO: switch to C# 7.3 and replace with Span<PacketBuffer> buffers = stackalloc PacketBuffer[BatchSize];
            var buffersArray = stackalloc PacketBuffer[BatchSize];
            var buffers      = new Span <PacketBuffer>(buffersArray, BatchSize);

            var   statsOld  = new DeviceStats(dev);
            var   statsNew  = new DeviceStats(dev);
            ulong counter   = 0;
            var   stopWatch = new Stopwatch();

            stopWatch.Start();

            int seqNum = 0;

            while (true)
            {
                var batchCount = _mempool.GetPacketBuffers(buffers);
                var batch      = buffers.Slice(0, batchCount);
                foreach (var buf in batch)
                {
                    buf.WriteData(PacketSize - 4, seqNum++);
                }
                dev.TxBatchBusyWait(0, batch);

                if ((counter++ & 0xFFF) == 0 && stopWatch.ElapsedMilliseconds > 100)
                {
                    stopWatch.Stop();
                    var nanos = stopWatch.ElapsedTicks;
                    dev.ReadStats(ref statsNew);
                    statsNew.PrintStatsDiff(ref statsOld, (ulong)nanos);
                    statsOld = statsNew;
                    counter  = 0;
                    stopWatch.Restart();
                }
            }
        }
Ejemplo n.º 6
0
        internal DeviceStats loadDeviceStats(DateTime fromdate, String fromtime, DateTime todate, String totime, string deviceid, string roomname, bool loadroommap, bool loadheathmap, double xlen, double ylen, double htresolution, double filteruncertainity)
        {
            DeviceStats ds = new DeviceStats();

            if (loadheathmap)
            {
                ds.heatmap = new int[(int)(htresolution * xlen) + 1, (int)(htresolution * ylen) + 1];
            }
            if (loadroommap)
            {
                ds.roommap.Add("__OVERALL__", 0);
            }
            ds.timeperday = new Double[(int)todate.Subtract(fromdate).TotalDays + 1];
            String query;

            if (loadroommap)
            {
                query = "select xpos,ypos,tm,roomname,uncertainty from devicespositions where identifier=@identifier and tm>=@tmstart and tm<=@tmend and roomname not in (select roomname from rooms where archived=True) order by tm asc";
            }
            else
            {
                query = "select xpos,ypos,tm,roomname,uncertainty from devicespositions where identifier=@identifier and tm>=@tmstart and tm<=@tmend and roomname=@roomname and outmovement=false order by tm asc";
            }
            DateTime pre = DateTime.MinValue;

            using (ConnectionHandle conn = new ConnectionHandle(connectionpool, connectionstring, false))
            {
                try
                {
                    if (!connectioncheck(conn))
                    {
                        throw new Exception("Connection is not open");
                    }
                    using (var cmd = new NpgsqlCommand(query, conn.conn))
                    {
                        if (!loadroommap)
                        {
                            cmd.Parameters.AddWithValue("roomname", roomname);
                        }
                        addParameters(cmd,
                                      "identifier", deviceid,
                                      "tmstart", new DateTime(fromdate.Year, fromdate.Month, fromdate.Day, Convert.ToInt32(fromtime.Split(':')[0]), Convert.ToInt32(fromtime.Split(':')[1]), 0),
                                      "tmend", new DateTime(todate.Year, todate.Month, todate.Day, Convert.ToInt32(totime.Split(':')[0]), Convert.ToInt32(totime.Split(':')[1]), 0));
                        using (var reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                if (loadheathmap && reader.GetDouble(4) < filteruncertainity)
                                {
                                    int xpos = (int)(htresolution * reader.GetDouble(0));
                                    int ypos = (int)(htresolution * reader.GetDouble(1));
                                    if (xpos < ds.heatmap.GetLength(0) && ypos < ds.heatmap.GetLength(1))
                                    {
                                        ds.heatmap[xpos, ypos] += 1;
                                    }
                                }
                                if (loadroommap)
                                {
                                    ds.roommap["__OVERALL__"] += 1;
                                    String room = reader.GetString(3);
                                    if (!ds.roommap.ContainsKey(room))
                                    {
                                        ds.roommap.Add(room, 0);
                                    }
                                    ds.roommap[room] += 1;
                                }
                                DateTime detectiontime = reader.GetDateTime(2);
                                if (detectiontime.Subtract(pre).TotalMinutes < 15)
                                {
                                    ds.timeperday[(int)detectiontime.Subtract(fromdate).TotalDays] += detectiontime.Subtract(pre).TotalMinutes;
                                }
                                else if (ds.timeperday[(int)detectiontime.Subtract(fromdate).TotalDays] == 0)
                                {
                                    ds.timeperday[(int)detectiontime.Subtract(fromdate).TotalDays] = 0.001;
                                }
                                ds.pingsperhour[detectiontime.Hour * 6 + detectiontime.Minute / 10]++;
                                pre = detectiontime;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    pre = DateTime.MinValue;
                    manageDbException(ex, conn.conn, true);
                }
            }
            return(pre != DateTime.MinValue?ds:null);
        }
Ejemplo n.º 7
0
        // Reads statistics from the archive and stores them in a format that can
        // be easily manipulated to determine which devices belong in which levels.
        private void ReadStatistics()
        {
            Dictionary<string, DeviceStats> deviceStatsLookup = new Dictionary<string, DeviceStats>();
            DateTime startTime;
            DateTime endTime;

            ArchiveLocator locator;
            Dictionary<MetadataRecord, IEnumerable<IDataPoint>> measurementsReceived;
            Dictionary<MetadataRecord, IEnumerable<IDataPoint>> measurementsExpected;
            Dictionary<MetadataRecord, IEnumerable<IDataPoint>> dataQualityErrors;
            Dictionary<MetadataRecord, IEnumerable<IDataPoint>> timeQualityErrors;

            MetadataRecord dataQualityRecord;
            MetadataRecord timeQualityRecord;

            DeviceStats deviceStats;
            string signalReference;
            string deviceName;
            int index;

            // Create the statistics reader for reading statistics from the archive
            using (StatisticsReader statisticsReader = new StatisticsReader())
            {
                // Create the archive locator to
                // determine the location of the archive
                locator = new ArchiveLocator()
                {
                    ArchiveLocation = m_archiveLocation,
                    ArchiveLocationName = "Statistics",
                    ArchiveName = "STAT"
                };

                endTime = m_reportDate + TimeSpan.FromDays(1);
                startTime = endTime - TimeSpan.FromDays(ReportDays);

                // Set up and open the statistics reader
                statisticsReader.StartTime = startTime;
                statisticsReader.EndTime = endTime;
                statisticsReader.ArchiveFilePath = locator.ArchiveFilePath;
                statisticsReader.Open();

                measurementsReceived = statisticsReader.Read("PMU", 4);
                measurementsExpected = statisticsReader.Read("PMU", 5);
                dataQualityErrors = statisticsReader.Read("PMU", 1);
                timeQualityErrors = statisticsReader.Read("PMU", 2);

                // Determine which devices in the archive have stats for both measurements received and measurements expected
                foreach (Tuple<MetadataRecord, MetadataRecord> tuple in measurementsReceived.Keys.Join(measurementsExpected.Keys, GetDeviceName, GetDeviceName, Tuple.Create))
                {
                    signalReference = tuple.Item1.Synonym1;
                    deviceName = GetDeviceName(tuple.Item1);

                    // Ignore statistics that were calculated by an intermediate gateway
                    if (!signalReference.StartsWith("LOCAL$") && signalReference.Contains("LOCAL$"))
                        continue;

                    // Make sure LOCAL$ statistics take precedence over other statistics calculated for the same device
                    if (deviceStatsLookup.ContainsKey(deviceName) && !signalReference.StartsWith("LOCAL$"))
                        continue;

                    dataQualityRecord = dataQualityErrors.Keys.FirstOrDefault(record => GetDeviceName(record) == deviceName);
                    timeQualityRecord = timeQualityErrors.Keys.FirstOrDefault(record => GetDeviceName(record) == deviceName);

                    // Create arrays to hold the total sum of the stats for each day being reported
                    deviceStats = new DeviceStats()
                    {
                        Name = deviceName,
                        DataQualityErrors = new double[ReportDays],
                        TimeQualityErrors = new double[ReportDays],
                        MeasurementsReceived = new double[ReportDays],
                        MeasurementsExpected = new double[ReportDays]
                    };

                    if ((object)dataQualityRecord != null)
                    {
                        // Calculate the total data quality errors for each day being reported
                        foreach (IDataPoint dataPoint in dataQualityErrors[dataQualityRecord])
                        {
                            index = (dataPoint.Time.ToDateTime() - startTime).Days;

                            if (index >= 0 && index < ReportDays)
                                deviceStats.DataQualityErrors[index] += dataPoint.Value;
                        }
                    }

                    if ((object)timeQualityRecord != null)
                    {
                        // Calculate the total time quality errors for each day being reported
                        foreach (IDataPoint dataPoint in timeQualityErrors[timeQualityRecord])
                        {
                            index = (dataPoint.Time.ToDateTime() - startTime).Days;

                            if (index >= 0 && index < ReportDays)
                                deviceStats.TimeQualityErrors[index] += dataPoint.Value;
                        }
                    }

                    // Calculate the total measurements received for each day being reported
                    foreach (IDataPoint dataPoint in measurementsReceived[tuple.Item1])
                    {
                        index = (dataPoint.Time.ToDateTime() - startTime).Days;

                        if (index >= 0 && index < ReportDays)
                            deviceStats.MeasurementsReceived[index] += dataPoint.Value;
                    }

                    // Calculate the total measurements expected for each day being reported
                    foreach (IDataPoint dataPoint in measurementsExpected[tuple.Item2])
                    {
                        index = (dataPoint.Time.ToDateTime() - startTime).Days;

                        if (index >= 0 && index < ReportDays)
                            deviceStats.MeasurementsExpected[index] += dataPoint.Value;
                    }

                    // Store the calculated stats per device
                    deviceStatsLookup[deviceName] = deviceStats;
                }
            }

            // Store the statistics data to be used in the report
            m_deviceStatsList = deviceStatsLookup.Values.ToList();
        }
Ejemplo n.º 8
0
        private int GetLevel(DeviceStats deviceStats, int reportDay)
        {
            int reportDayIndex = reportDay - 1;
            double measurementsReceived = deviceStats.MeasurementsReceived[reportDayIndex];
            double measurementsExpected = deviceStats.MeasurementsExpected[reportDayIndex];

            if (measurementsExpected == 0.0D)
                return -1;

            if (measurementsReceived >= (m_level4Threshold * measurementsExpected) / 100.0D)
                return 4;

            if (measurementsReceived >= (m_level3Threshold * measurementsExpected) / 100.0D)
                return 3;

            if (measurementsReceived > 0.0D)
                return 2;

            if (deviceStats.MeasurementsReceived.Skip(reportDay - Month).Take(ReportDays).Any(receivedStat => receivedStat > 0.0D))
                return 1;

            return 0;
        }
Ejemplo n.º 9
0
        private void ReadCompletenessData()
        {
            Dictionary <string, DeviceStats> deviceStatsLookup = new Dictionary <string, DeviceStats>();
            DateTime startTime;
            DateTime endTime;

            Dictionary <MetadataRecord, IEnumerable <IDataPoint> > measurementsReceived;
            Dictionary <MetadataRecord, IEnumerable <IDataPoint> > measurementsExpected;

            List <DeviceStats>[] todaysStats;
            List <DeviceStats>[] yesterdaysStats;

            string signalReference;
            string deviceName;
            int    index;

            // Create the statistics reader for reading statistics from the archive
            using (StatisticsReader statisticsReader = new StatisticsReader())
            {
                endTime   = DateTime.Today.AddDays(1.0D); // Tomorrow
                startTime = endTime - TimeSpan.FromDays(ReportDays);

                // Set up and open the statistics reader
                statisticsReader.StartTime = startTime;
                statisticsReader.EndTime   = endTime;

                statisticsReader.ArchiveFilePath = FilePath.GetAbsolutePath("Statistics\\stat_archive.d");
                statisticsReader.Open();

                measurementsReceived = statisticsReader.Read("PMU", 4);
                measurementsExpected = statisticsReader.Read("PMU", 5);

                // Determine which devices in the archive have stats for both measurements received and measurements expected
                foreach (Tuple <MetadataRecord, MetadataRecord> tuple in measurementsReceived.Keys.Join(measurementsExpected.Keys, GetDeviceName, GetDeviceName, Tuple.Create))
                {
                    DeviceStats deviceStats;
                    signalReference = tuple.Item1.Synonym1;
                    deviceName      = GetDeviceName(tuple.Item1);

                    // Ignore statistics that were calculated by an intermediate gateway
                    if (!signalReference.StartsWith("LOCAL$") && signalReference.Contains("LOCAL$"))
                    {
                        continue;
                    }

                    // Make sure LOCAL$ statistics take precedence over other statistics calculated for the same device
                    if (deviceStatsLookup.ContainsKey(deviceName) && !signalReference.StartsWith("LOCAL$"))
                    {
                        continue;
                    }

                    // Create arrays to hold the total sum of the stats for each day being reported
                    deviceStats = new DeviceStats()
                    {
                        Name = deviceName,
                        MeasurementsReceived = new double[ReportDays],
                        MeasurementsExpected = new double[ReportDays]
                    };

                    // Calculate the total measurements received for each day being reported
                    foreach (IDataPoint dataPoint in measurementsReceived[tuple.Item1])
                    {
                        index = (dataPoint.Time.ToDateTime() - startTime).Days;

                        if (index >= 0 && index < ReportDays)
                        {
                            deviceStats.MeasurementsReceived[index] += dataPoint.Value;
                        }
                    }

                    // Calculate the total measurements expected for each day being reported
                    foreach (IDataPoint dataPoint in measurementsExpected[tuple.Item2])
                    {
                        index = (dataPoint.Time.ToDateTime() - startTime).Days;

                        if (index >= 0 && index < ReportDays)
                        {
                            deviceStats.MeasurementsExpected[index] += dataPoint.Value;
                        }
                    }

                    // Store the calculated stats per device
                    deviceStatsLookup[deviceName] = deviceStats;
                }
            }

            // Store the statistics data to be used in the UI
            m_deviceStatsList = deviceStatsLookup.Values.ToList();

            todaysStats     = GetLevels(ReportDays);
            yesterdaysStats = GetLevels(ReportDays - 1);

            Dispatcher.BeginInvoke(new Action(() =>
            {
                int total = yesterdaysStats[0].Count + yesterdaysStats[1].Count + yesterdaysStats[2].Count + yesterdaysStats[3].Count + yesterdaysStats[4].Count;
                CreateGridTextItem(1, 1, HorizontalAlignment.Right, yesterdaysStats[4].Count.ToString(), CompletenessGrid);
                CreateGridTextItem(2, 1, HorizontalAlignment.Right, yesterdaysStats[3].Count.ToString(), CompletenessGrid);
                CreateGridTextItem(3, 1, HorizontalAlignment.Right, yesterdaysStats[2].Count.ToString(), CompletenessGrid);
                CreateGridTextItem(4, 1, HorizontalAlignment.Right, yesterdaysStats[1].Count.ToString(), CompletenessGrid);
                CreateGridTextItem(5, 1, HorizontalAlignment.Right, yesterdaysStats[0].Count.ToString(), CompletenessGrid);
                CreateGridTextItem(7, 1, HorizontalAlignment.Right, total.ToString(), CompletenessGrid);

                total = todaysStats[0].Count + todaysStats[1].Count + todaysStats[2].Count + todaysStats[3].Count + todaysStats[4].Count;
                CreateGridTextItem(1, 2, HorizontalAlignment.Right, todaysStats[4].Count.ToString(), CompletenessGrid);
                CreateGridTextItem(2, 2, HorizontalAlignment.Right, todaysStats[3].Count.ToString(), CompletenessGrid);
                CreateGridTextItem(3, 2, HorizontalAlignment.Right, todaysStats[2].Count.ToString(), CompletenessGrid);
                CreateGridTextItem(4, 2, HorizontalAlignment.Right, todaysStats[1].Count.ToString(), CompletenessGrid);
                CreateGridTextItem(5, 2, HorizontalAlignment.Right, todaysStats[0].Count.ToString(), CompletenessGrid);
                CreateGridTextItem(7, 2, HorizontalAlignment.Right, total.ToString(), CompletenessGrid);
            }));
        }