private void SendNotification() { _eventHandler.ComponentStateChangeFiring <SsrState>(new ComponentStateChange <SsrState> { CurrentState = CurrentState.Clone(), PriorState = PriorState.Clone() }); }
private void PidControllerStateRequestOccured(ComponentStateRequest <PidControllerRequestState> pidControllerStateRequest) { if (pidControllerStateRequest.Id == Id) { Logger.LogInformation($"Pid Request Received: {Id} {pidControllerStateRequest.RequestState.SetPoint} {pidControllerStateRequest.RequestState.IsEngaged}"); if (!CurrentState.IsEngaged && pidControllerStateRequest.RequestState.IsEngaged.HasValue && pidControllerStateRequest.RequestState.IsEngaged.Value) { // PID is getting engaged, disengage the others. var pidsToDisengage = ComponentHelper.PidComponentIds.Where(p => p != CurrentState.Id).ToList(); foreach (var pidToDisengage in pidsToDisengage) { _eventHandler.ComponentStateRequestFiring(new ComponentStateRequest <PidControllerRequestState> { RequestState = new PidControllerRequestState { Id = pidToDisengage, IsEngaged = false } }); } } PriorState = CurrentState; CurrentState = CurrentState.Update(pidControllerStateRequest.RequestState); _eventHandler.ComponentStateChangeFiring(new ComponentStateChange <PidControllerState> { PriorState = PriorState.Clone(), CurrentState = CurrentState.Clone() }); Process(); } }
public override async Task Run() { while (true) { try { foreach (var ssrComponentId in _ssrStateLookup.Keys.ToList()) { if (_ssrStateLookup.ContainsKey(ssrComponentId) && _thermometerStateLookup.ContainsKey(ssrComponentId)) { var ssrState = _ssrStateLookup[ssrComponentId]; var thermometerState = _thermometerStateLookup[ssrComponentId]; var newTemperature = (ssrState.Percentage == 0) ? thermometerState.Temperature - 0.05 : thermometerState.Temperature + (ssrState.Percentage * .01); if (newTemperature < 70) { newTemperature = 70; } if (newTemperature > 212) { newTemperature = 212; } //if (newTemperature != thermometerState.Temperature) { //Logger.LogInformation($"Fake: OLD: {thermometerState.Temperature} - NEW: {newTemperature}"); _eventHandler.ComponentStateChangeFiring(new ComponentStateChange <ThermocoupleState> { CurrentState = new ThermocoupleState { Id = ssrComponentId, Temperature = newTemperature } }); //} } } } catch (Exception ex) { Logger.LogError(ex.ToString()); } await Task.Delay(1000); } }
private void ThermocoupleStateChangeOccured(ComponentStateChange <ThermocoupleState> thermocoupleStateChange) { if (thermocoupleStateChange.Id == Id) { //var var currentState = new ThermometerState { Id = Id, Temperature = thermocoupleStateChange.CurrentState.Temperature, Timestamp = thermocoupleStateChange.CurrentState.Timestamp }; // Archive old shit. if (CurrentState != null) { PreviousStates.Add(currentState); PriorState = CurrentState; } CurrentState = currentState; _eventHandler.ComponentStateChangeFiring <ThermometerState>(new ComponentStateChange <ThermometerState> { CurrentState = CurrentState.Clone(), PriorState = PriorState.Clone() }); //Logger.Information($"ThermometerChangeOccured[{Id}] : {thermometerChange.Value}"); // Determin Change - Get all changes at least this old, order by newest, take first // TODO: Refactor to use previous state //var earliestTimeOfChange = DateTime.Now.AddMilliseconds(-_changeWindowInMillis); //var previousChange = ThermometerStates.Where(tc => tc.Timestamp < earliestTimeOfChange).OrderByDescending(tc => tc.Timestamp).FirstOrDefault(); //if (thermometerStateChange.PriorState != null) // Change = thermometerStateChange.CurrentState.Temperature - thermometerStateChange.PriorState.Temperature; // Determine Retention // TODO: Move this to a background thread var oldestTimeOfChange = DateTime.Now.AddMinutes(-_changeEventRetentionInMins); var changesToRemove = PreviousStates.RemoveAll(tc => tc.Timestamp < oldestTimeOfChange); } }
private async Task ProcessTemperatures() { String message = String.Empty; try { _dataReaderObject = new DataReader(EventHandlerForDevice.Current.Device.InputStream); message = await ReadAsync(_readCancellationTokenSource.Token, 200); //Debug.WriteLine($"Msg:\n{message}"); foreach (var tempReading in message.Split(_stringSeparators, StringSplitOptions.RemoveEmptyEntries)) { var tempReadingValues = tempReading.Split('|'); if (tempReadingValues.Length == 2) { int.TryParse(tempReadingValues[0], out int index); double.TryParse(tempReadingValues[1], out double temperature); var componentId = (ComponentId)Enum.Parse(typeof(ComponentId), (index).ToString()); _eventHandler.ComponentStateChangeFiring(new ComponentStateChange <ThermocoupleState> { CurrentState = new ThermocoupleState { Id = componentId, Temperature = temperature } }); } } } catch (OperationCanceledException /*exception*/) { NotifyReadTaskCanceled(); } catch (Exception exception) { Debug.WriteLine(exception.Message.ToString()); } finally { _dataReaderObject.DetachStream(); _dataReaderObject = null; } }
public FakeArduinoTemperatureControllerService(Thermometer[] thermometers, Ssr[] ssrs, IBeerFactoryEventHandler eventHandler, ILoggerFactory loggerFactory) { Logger = loggerFactory.CreateLogger <FakeArduinoTemperatureControllerService>(); _eventHandler = eventHandler; _ssrStateLookup = ssrs.ToDictionary(ssr => ssr.CurrentState.Id, ssr => ssr.CurrentState); _thermometerStateLookup = thermometers.ToDictionary(therm => therm.CurrentState.Id, therm => therm.CurrentState); _eventHandler.SubscribeToComponentStateChange <SsrState>(ssrStateChangeOccured); _eventHandler.SubscribeToComponentStateChange <ThermometerState>(thermometerStateChangeOccured); foreach (var componentId in ComponentHelper.AllComponentIds) { _eventHandler.ComponentStateChangeFiring(new ComponentStateChange <ThermocoupleState> { CurrentState = new ThermocoupleState { Id = componentId, Temperature = 70 } }); } }
private void PumpStateRequestOccured(ComponentStateRequest <PumpRequestState> pumpRequestState) { bool correctPump = pumpRequestState.Id == CurrentState.Id; if (pumpRequestState.Id == CurrentState.Id && CurrentState.IsDifferent(pumpRequestState.RequestState)) { CurrentState = CurrentState.Update(pumpRequestState.RequestState); if (CurrentState.IsEngaged) { _pin?.Write(GpioPinValue.High); } else { _pin?.Write(GpioPinValue.Low); } Logger.LogInformation($"Pump: {CurrentState.Id} - {CurrentState.IsEngaged}"); _eventHandler.ComponentStateChangeFiring(new ComponentStateChange <PumpState> { CurrentState = CurrentState.Clone() }); } }