예제 #1
0
        private void WatchdogRoutine()
        {
            while (!_cts.IsCancellationRequested)
            {
                if (_watchDogActive)
                {
                    var state = EcHL.ReadState(this.Context);

                    if (state < 8)
                    {
                        _statusCheckFailedCounter++;

                        if (_statusCheckFailedCounter >= _settings.MaxRetries)
                        {
                            try
                            {
                                lock (_lock)
                                {
                                    _isReconfiguring = true;
                                    _logger.LogInformation("reconfiguration started");
                                }

                                this.Configure();
                                _logger.LogInformation("reconfiguration successful");

                                _isReconfiguring = false;
                            }
                            catch (Exception)
                            {
                                _logger.LogWarning("reconfiguration failed");
                            }
                            finally
                            {
                                _statusCheckFailedCounter = 0;
                            }
                        }
                    }
                    else
                    {
                        if (_isReconfiguring)
                        {
                            _logger.LogInformation("communication restored");
                            _isReconfiguring = false;
                        }

                        _statusCheckFailedCounter = 0;
                    }
                }
                _cts.Token.WaitHandle.WaitOne(TimeSpan.FromSeconds(_settings.WatchdogSleepTime));
            }
        }