fix: add mutex to prevent multiple scenarios from running at once

This commit is contained in:
Andrew Welker
2024-07-19 13:09:47 -05:00
parent 5a9b876d80
commit d970d806c9

View File

@@ -5,6 +5,7 @@ using Serilog.Events;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
@@ -48,6 +49,8 @@ namespace PepperDash.Essentials.Core
private int _scenarioChangeDebounceTimeSeconds = 10; // default to 10s private int _scenarioChangeDebounceTimeSeconds = 10; // default to 10s
private Mutex _scenarioChange = new Mutex();
public EssentialsRoomCombiner(string key, EssentialsRoomCombinerPropertiesConfig props) public EssentialsRoomCombiner(string key, EssentialsRoomCombinerPropertiesConfig props)
: base(key) : base(key)
{ {
@@ -205,30 +208,39 @@ namespace PepperDash.Essentials.Core
} }
private set private set
{ {
if (value != _currentScenario) try
{ {
// Deactivate the old scenario first _scenarioChange.WaitOne();
if (_currentScenario != null)
if (value != _currentScenario)
{ {
_currentScenario.Deactivate(); // Deactivate the old scenario first
} if (_currentScenario != null)
{
_currentScenario = value; _currentScenario.Deactivate();
}
// Activate the new scenario
if (_currentScenario != null) _currentScenario = value;
{
_currentScenario.Activate(); // Activate the new scenario
if (_currentScenario != null)
Debug.LogMessage(LogEventLevel.Debug, $"Current Scenario: {_currentScenario.Name}", this); {
} _currentScenario.Activate();
var handler = RoomCombinationScenarioChanged; Debug.LogMessage(LogEventLevel.Debug, $"Current Scenario: {_currentScenario.Name}", this);
if (handler != null) }
{
handler(this, new EventArgs()); var handler = RoomCombinationScenarioChanged;
if (handler != null)
{
handler(this, new EventArgs());
}
} }
} }
finally
{
_scenarioChange.ReleaseMutex();
}
} }
} }