SignalMonitor.cs 2.1 KB
using System;
using System.Diagnostics;

namespace OnlineStore.DeviceLibrary
{
    public class SignalMonitor
    {
        private readonly Stopwatch _stopwatch;
        private bool _lastSignalState;
        private long _lastStateChangeTicks;
        private long _lastOnDurationTicks;
        private long _lastOffDurationTicks;

        public SignalMonitor(bool initialSignalState = false)
        {
            _stopwatch = Stopwatch.StartNew();
            _lastSignalState = initialSignalState;
            _lastStateChangeTicks = _stopwatch.ElapsedTicks;
            _lastOnDurationTicks = 0;
            _lastOffDurationTicks = 0;
        }

        public void UpdateSignalState(bool currentSignalState)
        {
            if (currentSignalState == _lastSignalState)
                return;

            long currentTicks = _stopwatch.ElapsedTicks;
            long durationTicks = currentTicks - _lastStateChangeTicks;

            if (_lastSignalState)
            {
                _lastOnDurationTicks = durationTicks;
            }
            else
            {
                _lastOffDurationTicks = durationTicks;
            }

            _lastSignalState = currentSignalState;
            _lastStateChangeTicks = currentTicks;
        }

        public TimeSpan GetCurrentOnDuration()
        {
            if (_lastSignalState)
            {
                long currentTicks = _stopwatch.ElapsedTicks;
                return TicksToTimeSpan(currentTicks - _lastStateChangeTicks);
            }
            return TicksToTimeSpan(_lastOnDurationTicks);
        }

        public TimeSpan GetCurrentOffDuration()
        {
            if (!_lastSignalState)
            {
                long currentTicks = _stopwatch.ElapsedTicks;
                return TicksToTimeSpan(currentTicks - _lastStateChangeTicks);
            }
            return TicksToTimeSpan(_lastOffDurationTicks);
        }

        private TimeSpan TicksToTimeSpan(long ticks)
        {
            return TimeSpan.FromTicks(ticks * TimeSpan.TicksPerSecond / Stopwatch.Frequency);
        }
    }
}