/// <summary> /// Attempts to get current registration information for a USB Fan, if it was registered. /// </summary> /// <param name="fan">USB Fan to query information for.</param> /// <param name="temperatureSensor">Temperature sensor fan is tied to.</param> /// <param name="celsiusThreshold">Warmest allowd reading before fan cooling is automated.</param> /// <returns>true if registration information was queried; false otherwise.</returns> internal bool TryGetRegistrationInfo(Fan fan, out TemperatureSensor temperatureSensor, out Single celsiusThreshold) { bool result = false; Tuple <TemperatureSensor, Single> value = null; temperatureSensor = null; celsiusThreshold = Single.NaN; //Parameter Validations. if (fan == null) { throw new ArgumentNullException("Fan fan"); } //Check our cache, which is synchronized. if (m_registeredFansDict.TryGetValue(fan, out value) == true) { //Set outputs. temperatureSensor = value.Item1; celsiusThreshold = value.Item2; result = true; } return(result); }
/// <summary> /// Constructor. /// </summary> /// <param name="mooseBoxRESTAPI">Instance of a versioned MooseBox REST API.</param> /// <param name="registeredAlarms">Current MooseBox temperature alarm configuration to synchronize instance to.</param> internal TemperatureAlarm(IMooseBoxRESTAPI mooseBoxRESTAPI, List <TemperatureAlarmConfig> registeredAlarms) { //Parameter Validations. if (mooseBoxRESTAPI == null) { throw new ArgumentNullException("IMooseBoxRESTAPI mooseBoxRESTAPI"); } if (registeredAlarms == null) { throw new ArgumentNullException("List<TemperatureAlarmConfig> registeredAlarms"); } //Set Members. m_mooseBoxRESTAPI = mooseBoxRESTAPI; m_registeredAlarmsDict = new Dictionary <Tuple <TemperatureSensor, string>, Tuple <Single, Single> >(); //Configure N Temperature Alarms if we have something to configure from. foreach (var registeredAlarm in registeredAlarms) { TemperatureSensor temperatureSensor = new TemperatureSensor(registeredAlarm.SerialNumber, mooseBoxRESTAPI); foreach (var subscriber in registeredAlarm.Subscribers) { m_registeredAlarmsDict.Add(new Tuple <TemperatureSensor, string>(temperatureSensor, subscriber.Email), new Tuple <Single, Single>(subscriber.CelsiusMin, subscriber.CelsiusMax)); } } }
/// <summary> /// Unregisteres a temperature alarm from MooseBox. /// </summary> /// <param name="temperatureSensor">Temperature sensor with the registered alarm.</param> /// <param name="emailAddress">Email address to unregister from sensor.</param> /// <returns>Asynchronous Processing Task.</returns> internal async Task Unregister(TemperatureSensor temperatureSensor, string emailAddress) { Tuple <TemperatureSensor, string> key = Tuple.Create(temperatureSensor, emailAddress); //Parameter Validations. if (temperatureSensor == null) { throw new ArgumentNullException("TemperatureSensor temperatureSensor"); } if (string.IsNullOrEmpty(emailAddress) == true) { throw new ArgumentNullException("string emailAddress"); } //Are we registered? if (m_registeredAlarmsDict.ContainsKey(key) == true) { //Unregister it from MooseBox. await m_mooseBoxRESTAPI.UnregisterTemperatureAlarm(emailAddress, temperatureSensor.SerialNumber); //Remove it from local cache. m_registeredAlarmsDict.Remove(key); } }
/// <summary> /// Constructor. /// </summary> /// <param name="mooseBoxRESTAPI">Instance to a versioned MooseBox REST API.</param> /// <param name="registeredFans">Current MooseBox Fan Automation config to build instance from.</param> internal FanAutomation(IMooseBoxRESTAPI mooseBoxRESTAPI, List<FanAutomationConfig> registeredFans) { //Parameter Validations. if (mooseBoxRESTAPI == null) throw new ArgumentNullException("IMooseBoxRESTAPI mooseBoxRESTAPI"); if (registeredFans == null) throw new ArgumentNullException("List<FanAutomationConfig> registeredFans"); //Set Members. m_mooseBoxRESTAPI = mooseBoxRESTAPI; m_registeredFansDict = new Dictionary<Fan, Tuple<TemperatureSensor, Single>>(); //Populate cache if we're building from a config object. foreach (var registeredFan in registeredFans) { TemperatureSensor temperatureSensor = new TemperatureSensor(registeredFan.SerialNumber, mooseBoxRESTAPI); foreach (var fanConfig in registeredFan.FansConfig) { Fan fan = new Fan(fanConfig.FanNumber, mooseBoxRESTAPI); m_registeredFansDict[fan] = new Tuple<TemperatureSensor, Single>(temperatureSensor, fanConfig.PowerOnThresholdCelsius); } } }
/// <summary> /// Constructor. /// </summary> /// <param name="mooseBoxRESTAPI">Instance to a versioned MooseBox REST API.</param> /// <param name="registeredFans">Current MooseBox Fan Automation config to build instance from.</param> internal FanAutomation(IMooseBoxRESTAPI mooseBoxRESTAPI, List <FanAutomationConfig> registeredFans) { //Parameter Validations. if (mooseBoxRESTAPI == null) { throw new ArgumentNullException("IMooseBoxRESTAPI mooseBoxRESTAPI"); } if (registeredFans == null) { throw new ArgumentNullException("List<FanAutomationConfig> registeredFans"); } //Set Members. m_mooseBoxRESTAPI = mooseBoxRESTAPI; m_registeredFansDict = new Dictionary <Fan, Tuple <TemperatureSensor, Single> >(); //Populate cache if we're building from a config object. foreach (var registeredFan in registeredFans) { TemperatureSensor temperatureSensor = new TemperatureSensor(registeredFan.SerialNumber, mooseBoxRESTAPI); foreach (var fanConfig in registeredFan.FansConfig) { Fan fan = new Fan(fanConfig.FanNumber, mooseBoxRESTAPI); m_registeredFansDict[fan] = new Tuple <TemperatureSensor, Single>(temperatureSensor, fanConfig.PowerOnThresholdCelsius); } } }
/// <summary> /// Compares this instance of TemperatureSensor against another for value equality. /// </summary> /// <param name="obj">Instance to compare against.</param> /// <returns>true if equal; false otherwise.</returns> public override bool Equals(object obj) { bool result = true; TemperatureSensor other = obj as TemperatureSensor; if (other != null) { result &= (this.m_serialNumber == other.m_serialNumber); } else { result = false; } return(result); }
/// <summary> /// Registers a temperature alarm with MooseBox. It a temperature reading goes lower or higher than /// the acceptable thresholds, MooseBox will attempt to email receipiant indicating a problem. /// </summary> /// <param name="temperatureSensor">Temperature sensor to register alarm with.</param> /// <param name="emailAddress">Email address to broadcast alerts to.</param> /// <param name="celsiusMin">Coldest acceptable temperature threshold.</param> /// <param name="celsiusMax">Warmest acceptable temperature threshold.</param> /// <returns>Asynchronous Processing Task.</returns> internal async Task Register(TemperatureSensor temperatureSensor, string emailAddress, Single celsiusMin, Single celsiusMax) { bool unregisterPrev = false; Tuple <Single, Single> value = null; //Parameter Validations. if (temperatureSensor == null) { throw new ArgumentNullException("TemperatureSensor temperatureSensor"); } if (string.IsNullOrEmpty(emailAddress) == true) { throw new ArgumentNullException("string emailAddress"); } //Is this already registered? if (m_registeredAlarmsDict.TryGetValue(Tuple.Create(temperatureSensor, emailAddress), out value) == true) { Debug.Assert(value != null); if (celsiusMin == value.Item1 && celsiusMax == value.Item2) { return; //Nothing to do! } unregisterPrev = true; } //If it's already registered, unregister it first. if (unregisterPrev == true) { await m_mooseBoxRESTAPI.UnregisterTemperatureAlarm(emailAddress, temperatureSensor.SerialNumber); } //Register the temperature alarm. await m_mooseBoxRESTAPI.RegisterTemperatureAlarm(temperatureSensor.SerialNumber, celsiusMin, celsiusMax, emailAddress); //Update local cache. m_registeredAlarmsDict[Tuple.Create(temperatureSensor, emailAddress)] = Tuple.Create(celsiusMin, celsiusMax); }
/// <summary> /// Registers a fan for automation with an associated temperature sensor. /// </summary> /// <param name="fan">USB Fan to register.</param> /// <param name="temperatureSensor">Temperature sensor to register against.</param> /// <param name="celsiusThreshold">Warmest allowable reading before automating fan cooling.</param> /// <returns>Asynchronous Processing Task.</returns> internal async Task Register(Fan fan, TemperatureSensor temperatureSensor, Single celsiusThreshold) { bool unregisterPrev = false; Tuple <TemperatureSensor, Single> value = null; //Parameter Validations. if (fan == null) { throw new ArgumentNullException("Fan fan"); } if (temperatureSensor == null) { throw new ArgumentNullException("TemperatureSensor temperatureSensor"); } //Is it already registered? Are we changing? if (m_registeredFansDict.TryGetValue(fan, out value) == true) { Debug.Assert(value != null); Debug.Assert(value.Item1 != null); if (value.Item1.Equals(temperatureSensor) == true && value.Item2 == celsiusThreshold) { return; //Nothing to do! } unregisterPrev = true; } //User is requesting an overwrite, which is an unregistration first. if (unregisterPrev == true) { await m_mooseBoxRESTAPI.UnegisterFanAutomation(fan.Number); } //Register the new fan information. await m_mooseBoxRESTAPI.RegisterFanAutomation(fan.Number, temperatureSensor.SerialNumber, celsiusThreshold); //Update the local cache. m_registeredFansDict[fan] = new Tuple <TemperatureSensor, Single>(temperatureSensor, celsiusThreshold); }
/// <summary> /// Queries all registered entries associated with a singular temperature sensor. /// </summary> /// <param name="temperatureSensor">Temperature sensor to lookup all registered alarms from.</param> /// <param name="registeredAlarms">[0...N] temperature alarms registration information.</param> /// <returns>true if registration information was queried; false otherwise.</returns> /// <remarks>O(N)</remarks> internal bool TryGetRegistrationInfo(TemperatureSensor temperatureSensor, out List <Tuple <string, Single, Single> > registeredAlarms) { registeredAlarms = new List <Tuple <string, Single, Single> >(); //Parameter Validations. if (temperatureSensor == null) { throw new ArgumentNullException("TemperatureSensor temperatureSensor"); } //Enumerate each entry in the dictionary associated with this sensor. foreach (var kvp in m_registeredAlarmsDict) { if (kvp.Key.Item1.Equals(temperatureSensor) == true) { registeredAlarms.Add(Tuple.Create(kvp.Key.Item2, kvp.Value.Item1, kvp.Value.Item2)); } } return(registeredAlarms.Count > 0); }
/// <summary> /// Constructor. /// </summary> /// <param name="mooseBoxRESTAPI">Instance of a versioned MooseBox REST API.</param> /// <param name="registeredAlarms">Current MooseBox temperature alarm configuration to synchronize instance to.</param> internal TemperatureAlarm(IMooseBoxRESTAPI mooseBoxRESTAPI, List<TemperatureAlarmConfig> registeredAlarms) { //Parameter Validations. if (mooseBoxRESTAPI == null) throw new ArgumentNullException("IMooseBoxRESTAPI mooseBoxRESTAPI"); if (registeredAlarms == null) throw new ArgumentNullException("List<TemperatureAlarmConfig> registeredAlarms"); //Set Members. m_mooseBoxRESTAPI = mooseBoxRESTAPI; m_registeredAlarmsDict = new Dictionary<Tuple<TemperatureSensor, string>, Tuple<Single, Single>>(); //Configure N Temperature Alarms if we have something to configure from. foreach (var registeredAlarm in registeredAlarms) { TemperatureSensor temperatureSensor = new TemperatureSensor(registeredAlarm.SerialNumber, mooseBoxRESTAPI); foreach (var subscriber in registeredAlarm.Subscribers) m_registeredAlarmsDict.Add(new Tuple<TemperatureSensor, string>(temperatureSensor, subscriber.Email), new Tuple<Single, Single>(subscriber.CelsiusMin, subscriber.CelsiusMax)); } }
/// <summary> /// Sets the text of the temperature indicator, in Fahrenheit. /// </summary> /// <param name="temperatureSensor">Temperature sensor associated with the indicator.</param> /// <param name="celsius">Temperature reading to display.</param> private void UpdateTemperatureIndicator(TemperatureSensor temperatureSensor, Single celsius) { Debug.Assert(temperatureSensor != null); if (temperatureSensor == TemperatureSensor._59000002A218F928) textBox59000002A218F928.Text = Math.Round(ConvertUnits.Temperature.CelsiusToFahrenheit(celsius), 2).ToString(); else if (temperatureSensor == TemperatureSensor._F7000002A215B828) textBoxF7000002A215B828.Text = Math.Round(ConvertUnits.Temperature.CelsiusToFahrenheit(celsius), 2).ToString(); else throw new ArgumentOutOfRangeException("TemperatureSensor temperatureSensor", string.Format("Invalid Temperature Sensor. Serial #: {0}", temperatureSensor.SerialNumber)); }
/// <summary> /// Registers a fan for automation with an associated temperature sensor. /// </summary> /// <param name="fan">USB Fan to register.</param> /// <param name="temperatureSensor">Temperature sensor to register against.</param> /// <param name="celsiusThreshold">Warmest allowable reading before automating fan cooling.</param> /// <returns>Asynchronous Processing Task.</returns> internal async Task Register(Fan fan, TemperatureSensor temperatureSensor, Single celsiusThreshold) { bool unregisterPrev = false; Tuple<TemperatureSensor, Single> value = null; //Parameter Validations. if (fan == null) throw new ArgumentNullException("Fan fan"); if (temperatureSensor == null) throw new ArgumentNullException("TemperatureSensor temperatureSensor"); //Is it already registered? Are we changing? if (m_registeredFansDict.TryGetValue(fan, out value) == true) { Debug.Assert(value != null); Debug.Assert(value.Item1 != null); if (value.Item1.Equals(temperatureSensor) == true && value.Item2 == celsiusThreshold) return; //Nothing to do! unregisterPrev = true; } //User is requesting an overwrite, which is an unregistration first. if (unregisterPrev == true) await m_mooseBoxRESTAPI.UnegisterFanAutomation(fan.Number); //Register the new fan information. await m_mooseBoxRESTAPI.RegisterFanAutomation(fan.Number, temperatureSensor.SerialNumber, celsiusThreshold); //Update the local cache. m_registeredFansDict[fan] = new Tuple<TemperatureSensor, Single>(temperatureSensor, celsiusThreshold); }
/// <summary> /// Attempts to get current registration information for a USB Fan, if it was registered. /// </summary> /// <param name="fan">USB Fan to query information for.</param> /// <param name="temperatureSensor">Temperature sensor fan is tied to.</param> /// <param name="celsiusThreshold">Warmest allowd reading before fan cooling is automated.</param> /// <returns>true if registration information was queried; false otherwise.</returns> internal bool TryGetRegistrationInfo(Fan fan, out TemperatureSensor temperatureSensor, out Single celsiusThreshold) { bool result = false; Tuple<TemperatureSensor, Single> value = null; temperatureSensor = null; celsiusThreshold = Single.NaN; //Parameter Validations. if (fan == null) throw new ArgumentNullException("Fan fan"); //Check our cache, which is synchronized. if (m_registeredFansDict.TryGetValue(fan, out value) == true) { //Set outputs. temperatureSensor = value.Item1; celsiusThreshold = value.Item2; result = true; } return result; }
/// <summary> /// Registers a temperature alarm with MooseBox. It a temperature reading goes lower or higher than /// the acceptable thresholds, MooseBox will attempt to email receipiant indicating a problem. /// </summary> /// <param name="temperatureSensor">Temperature sensor to register alarm with.</param> /// <param name="emailAddress">Email address to broadcast alerts to.</param> /// <param name="celsiusMin">Coldest acceptable temperature threshold.</param> /// <param name="celsiusMax">Warmest acceptable temperature threshold.</param> /// <returns>Asynchronous Processing Task.</returns> internal async Task Register(TemperatureSensor temperatureSensor, string emailAddress, Single celsiusMin, Single celsiusMax) { bool unregisterPrev = false; Tuple<Single, Single> value = null; //Parameter Validations. if (temperatureSensor == null) throw new ArgumentNullException("TemperatureSensor temperatureSensor"); if (string.IsNullOrEmpty(emailAddress) == true) throw new ArgumentNullException("string emailAddress"); //Is this already registered? if (m_registeredAlarmsDict.TryGetValue(Tuple.Create(temperatureSensor, emailAddress), out value) == true) { Debug.Assert(value != null); if (celsiusMin == value.Item1 && celsiusMax == value.Item2) return; //Nothing to do! unregisterPrev = true; } //If it's already registered, unregister it first. if (unregisterPrev == true) await m_mooseBoxRESTAPI.UnregisterTemperatureAlarm(emailAddress, temperatureSensor.SerialNumber); //Register the temperature alarm. await m_mooseBoxRESTAPI.RegisterTemperatureAlarm(temperatureSensor.SerialNumber, celsiusMin, celsiusMax, emailAddress); //Update local cache. m_registeredAlarmsDict[Tuple.Create(temperatureSensor, emailAddress)] = Tuple.Create(celsiusMin, celsiusMax); }
/// <summary> /// Queries all registered entries associated with a singular temperature sensor. /// </summary> /// <param name="temperatureSensor">Temperature sensor to lookup all registered alarms from.</param> /// <param name="registeredAlarms">[0...N] temperature alarms registration information.</param> /// <returns>true if registration information was queried; false otherwise.</returns> /// <remarks>O(N)</remarks> internal bool TryGetRegistrationInfo(TemperatureSensor temperatureSensor, out List<Tuple<string, Single, Single>> registeredAlarms) { registeredAlarms = new List<Tuple<string, Single, Single>>(); //Parameter Validations. if (temperatureSensor == null) throw new ArgumentNullException("TemperatureSensor temperatureSensor"); //Enumerate each entry in the dictionary associated with this sensor. foreach (var kvp in m_registeredAlarmsDict) if (kvp.Key.Item1.Equals(temperatureSensor) == true) registeredAlarms.Add(Tuple.Create(kvp.Key.Item2, kvp.Value.Item1, kvp.Value.Item2)); return (registeredAlarms.Count > 0); }
/// <summary> /// Unregisteres a temperature alarm from MooseBox. /// </summary> /// <param name="temperatureSensor">Temperature sensor with the registered alarm.</param> /// <param name="emailAddress">Email address to unregister from sensor.</param> /// <returns>Asynchronous Processing Task.</returns> internal async Task Unregister(TemperatureSensor temperatureSensor, string emailAddress) { Tuple<TemperatureSensor, string> key = Tuple.Create(temperatureSensor, emailAddress); //Parameter Validations. if (temperatureSensor == null) throw new ArgumentNullException("TemperatureSensor temperatureSensor"); if (string.IsNullOrEmpty(emailAddress) == true) throw new ArgumentNullException("string emailAddress"); //Are we registered? if (m_registeredAlarmsDict.ContainsKey(key) == true) { //Unregister it from MooseBox. await m_mooseBoxRESTAPI.UnregisterTemperatureAlarm(emailAddress, temperatureSensor.SerialNumber); //Remove it from local cache. m_registeredAlarmsDict.Remove(key); } }