Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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();
        }
Exemplo n.º 3
0
        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();
        }