public async Task SendEventsAsync(CancellationToken token, Func <object, Task> sendMessageAsync) { while (!token.IsCancellationRequested) { var random = new Random(); switch (_currentState) { case PresenceStateType.SensingForPresence: _logger.LogInfo("Sensing for presence {0}", DeviceId); // Is there someone in front of the vending machine? var randomNumber = random.Next(100); if (randomNumber < PROBABILITY_OF_PRESENCE) { // Detected a customer is standing in front of the machine _logger.LogInfo("Presence Started {0}", DeviceId); // How long will the customer be in front of the machine? _durationOfPresence = random.Next(SENSING_PERIOD_IN_SECONDS, MAX_DURATION_OF_PRESENCE); _startedPresence = DateTime.Now; _currentState = PresenceStateType.PresenceDetected; } else { // No presence detected // Send a non-sensing telemetry event await SendPresenceTelemetry(false, sendMessageAsync); await Task.Delay(TimeSpan.FromSeconds(SENSING_PERIOD_IN_SECONDS), token); } break; case PresenceStateType.PresenceDetected: _logger.LogInfo("Sending presence packet {0}", DeviceId); // Send a presence telemetry event await SendPresenceTelemetry(true, sendMessageAsync); // Have we passed the durationOfPresence? if (DateTime.Now > _startedPresence.AddMilliseconds(_durationOfPresence * 1000)) { _logger.LogInfo("Presence Ended {0}", DeviceId); _currentState = PresenceStateType.SensingForPresence; } else { await Task.Delay(TimeSpan.FromSeconds(SENSING_PERIOD_IN_SECONDS), token); } break; } } }
public async Task SendEventsAsync(CancellationToken token, Func<object, Task> sendMessageAsync) { while (!token.IsCancellationRequested) { var random = new Random(); switch (_currentState) { case PresenceStateType.SensingForPresence: _logger.LogInfo("Sensing for presence {0}", DeviceId); // Is there someone in front of the vending machine? var randomNumber = random.Next(100); if (randomNumber < PROBABILITY_OF_PRESENCE) { // Detected a customer is standing in front of the machine _logger.LogInfo("Presence Started {0}", DeviceId); // How long will the customer be in front of the machine? _durationOfPresence = random.Next(SENSING_PERIOD_IN_SECONDS, MAX_DURATION_OF_PRESENCE); _startedPresence = DateTime.Now; _currentState = PresenceStateType.PresenceDetected; } else { // No presence detected // Send a non-sensing telemetry event await SendPresenceTelemetry(false, sendMessageAsync); await Task.Delay(TimeSpan.FromSeconds(SENSING_PERIOD_IN_SECONDS), token); } break; case PresenceStateType.PresenceDetected: _logger.LogInfo("Sending presence packet {0}", DeviceId); // Send a presence telemetry event await SendPresenceTelemetry(true, sendMessageAsync); // Have we passed the durationOfPresence? if (DateTime.Now > _startedPresence.AddMilliseconds(_durationOfPresence * 1000)) { _logger.LogInfo("Presence Ended {0}", DeviceId); _currentState = PresenceStateType.SensingForPresence; } else { await Task.Delay(TimeSpan.FromSeconds(SENSING_PERIOD_IN_SECONDS), token); } break; } } }