public NetInterface(NetworkInterface adapterIn)
        {
            // set up the adapter
            adapter = adapterIn;
            stats = adapter.GetIPv4Statistics();

            // set up the logging
            logPath = Path.Combine("logs", Path.Combine(adapter.Description, adapter.GetPhysicalAddress().ToString(), adapter.Id));
            logHandler = new LogHandler(logPath);
            loadDataInstant(DateTime.UtcNow.Ticks);

            // set up the data tracking
            dataTransferStart = currentTicks();
            bytesInSession = stats.BytesReceived;
            bytesOutSession = stats.BytesSent;
            properties = adapter.GetIPProperties();
            //Console.WriteLine(adapter.Name + " " + adapter.Description + " " + adapter.OperationalStatus);

            Tracker = new Tracker(logHandler);
        }
        public DataTransferTracker(long minutes, LogHandler logHandler)
        {
            if (minutes < 1)
            {
                throw new System.ArgumentOutOfRangeException("The number of minutes ago the track starts cannot be less than 1");
            }
            minutesIntoPast = minutes;

            // find the data transfer over the period
            setStartInstantValues(logHandler);
            DataTransferInstant currentInstant = logHandler.getDataInstant(DateTime.UtcNow.Ticks);
            bytesIn = currentInstant.bytesIn - startInstant.bytesIn;
            bytesOut = currentInstant.bytesOut - startInstant.bytesOut;

            // initialise the seconds
            second = 0;
            for (byte s = 0; s < 60; s++)
                seconds[s] = new DataTransferLump(0, 0);
        }
        /// <summary>
        /// Loads the values regarding the start instant for the tracker
        /// </summary>
        /// <param name="logHandler"></param>
        private void setStartInstantValues(LogHandler logHandler)
        {
            startInstant = logHandler.getDataInstant(ticksAtStartPoint());
            // try looking slightly after a minute ahead to account for any delays in saving
            minuteAfterStartInstant = logHandler.getDataInstant(ticksAtStartPoint() + (long)(TimeSpan.TicksPerMinute * 0.98));

            // work out how many bytes change should be made each second so there's no sudden jump when the minute changes
            long inDiff = minuteAfterStartInstant.bytesIn - startInstant.bytesIn;
            long outDiff = minuteAfterStartInstant.bytesOut - startInstant.bytesOut;
            if (inDiff < 0)
            {
                inDiff = -inDiff;
            }
            if (outDiff < 0)
            {
                outDiff = -outDiff;
            }
            bytesStartPerSecond.bytesIn = inDiff / 60;
            bytesStartPerSecond.bytesOut = outDiff / 60;

            bytesStartLeftover.bytesIn = inDiff - bytesStartPerSecond.bytesIn * 60;
            bytesStartLeftover.bytesOut = outDiff - bytesStartPerSecond.bytesOut * 60;
        }
 /// <summary>
 /// Make some additional changes to the tracker every minute
 /// </summary>
 private void updateMinute(LogHandler logHandler)
 {
     // remove any leftover bytes
     bytesIn -= bytesStartLeftover.bytesIn;
     bytesOut -= bytesStartLeftover.bytesOut;
     // update the start point
     setStartInstantValues(logHandler);
 }
        /// <summary>
        /// Update the tracker every second
        /// </summary>
        /// <param name="period"></param>
        /// <param name="logHandler"></param>
        public void updateSecond(DataTransferPeriod period, LogHandler logHandler)
        {
            if (second == 60)
            {
                second = 0;
                updateMinute(logHandler);
            }
            bytesIn -= bytesStartPerSecond.bytesIn;
            bytesOut -= bytesStartPerSecond.bytesOut;
            seconds[second].set(period.getBytesIn(), period.getBytesOut());
            bytesIn += seconds[second].bytesIn;
            bytesOut += seconds[second].bytesOut;

            // restarting seems to fix any odd numbers that are being shown
            if (bytesIn < 0 || bytesOut < 0)
            {
                /*
                String text = "Restarted from DTT at: " + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString() + Environment.NewLine +
                                    " Bytes: In: " + bytesIn + " Out: " + bytesOut + Environment.NewLine +
                                    " Per Second: In: " + bytesStartPerSecond.bytesIn + " Out: " + bytesStartPerSecond.bytesOut + Environment.NewLine +
                                    " Leftover: In: " + bytesStartLeftover.bytesIn + " Out: " + bytesStartLeftover.bytesOut + Environment.NewLine;
                File.AppendAllText(Path.Combine("restart-log.txt"), text + Environment.NewLine);

                Program.restarting = true;
                if (!Program.restarting)
                {
                    Application.Restart();
                }
                */

                bytesIn = 0;
                bytesOut = 0;
            }

            second++;
        }