public async Task ProcessNewAlarm(OnOffCameraContruct alarm) { using (var sync = await alarmTimersLock.LockAsync(cancellationToken).ConfigureAwait(false)) { bool sendNow = false; if (!alarmsData.TryGetValue(alarm.Id, out var alarmData)) { alarmData = new AlarmData(alarm); alarmsData.Add(alarm.Id, alarmData); //first time alarm, send sendNow = true; } if (alarm.Active) { // becoming active from inactive, send if (!sendNow && !alarmData.state) { sendNow = true; } alarmData.state = true; alarmData.CameraContruct = alarm; alarmData.lastReceived.Restart(); Trace.WriteLine($"[{cameraName}]New alarm {alarmData.CameraContruct.Id}"); } else { // do not send alarm here as need to honor interval } if (sendNow) { await SendAlarm(alarm, alarmData).ConfigureAwait(false); } } }
public AlarmData(OnOffCameraContruct cameraContruct) { CameraContruct = cameraContruct; }
private async Task SendAlarm(OnOffCameraContruct alarm, AlarmData alarmData) { alarmData.lastUpdated.Restart(); await enqueue(alarm).ConfigureAwait(false); }