private void Initialize(LockOptions lockOptions, IGpioPinFactory gpioPinFactory, LockDbContext lockDbContext) { DateTime now = DateTime.Now; async Task InitializeLock(LockConfiguration lockConfiguration) { LockDto lockDto = await lockDbContext.Locks.FindAsync(lockConfiguration.Id); LockState mode = lockDto?.State ?? LockState.Locked; bool timedOut = lockDto?.Timeout <= now; if (timedOut) { mode = mode.Toggle(); } Lock @lock = new Lock(lockConfiguration.Id, gpioPinFactory.CreatePin((BcmPin)lockConfiguration.Pin), (LockState)(-1)); if (!timedOut) { @lock.Timeout = lockDto?.Timeout; } await SetAsync(@lock, mode, "INITIALIZE"); IdToLock.Add(@lock.Id, @lock); } Task.WaitAll(lockOptions.LockConfigurations.Select(InitializeLock).ToArray()); UpdateTimerAsync().Wait(); }
public async Task ToggleLockAsync(string id, string reason) { if (!IdToLock.TryGetValue(id, out Lock @lock)) { throw new ArgumentException("Unknown id", nameof(id)); } await @lock.Semaphore.WaitAsync(); try { @lock.Timeout = null; LockState newState = await ToggleAsync(@lock, reason); await DbSemaphore.WaitAsync(); try { await UpdateLockDto(id, newState, null); } finally { DbSemaphore.Release(); } } finally { @lock.Semaphore.Release(); } await UpdateTimerAsync(); }
public async Task SetLockAsync(string id, LockState state, string reason, DateTime?timeout = null) { if (!IdToLock.TryGetValue(id, out Lock @lock)) { throw new ArgumentException("Unknown id", nameof(id)); } await @lock.Semaphore.WaitAsync(); try { @lock.Timeout = timeout; await SetAsync(@lock, state, reason); await DbSemaphore.WaitAsync(); try { await UpdateLockDto(id, state, timeout); } finally { DbSemaphore.Release(); } } finally { @lock.Semaphore.Release(); } await UpdateTimerAsync(); }