public async Task <bool> IsOutageElement(long outageElementId) { while (!ReliableDictionariesInitialized) { await Task.Delay(1000); } return(await SimulatedOutages.ContainsKeyAsync(outageElementId)); }
public async Task <IEnumerable <SimulatedOutage> > GetAllSimulatedOutages() { while (!ReliableDictionariesInitialized) { await Task.Delay(1000); } var outagesMap = await SimulatedOutages.GetDataCopyAsync(); return(outagesMap.Values); }
public async Task <bool> EndOutage(long outageElementGid) { while (!ReliableDictionariesInitialized) { await Task.Delay(1000); } if (!await SimulatedOutages.ContainsKeyAsync(outageElementGid)) { return(false); } await RemoveNoLongerNeededMonitoredPoints(outageElementGid); await SimulatedOutages.TryRemoveAsync(outageElementGid); return(true); }
public async Task <bool> GenerateOutage(SimulatedOutage outage) { while (!ReliableDictionariesInitialized) { await Task.Delay(1000); } if (await SimulatedOutages.ContainsKeyAsync(outage.OutageElementGid)) { return(false); } await InitializeMonitoredPoints(outage); await SimulatedOutages.SetAsync(outage.OutageElementGid, outage); return(true); }
private async Task RemoveNoLongerNeededMonitoredPoints(long outageElementGid) { var enumerableSimulatedOutages = await SimulatedOutages.GetEnumerableDictionaryAsync(); if (!enumerableSimulatedOutages.ContainsKey(outageElementGid)) { return; } var removeOutage = enumerableSimulatedOutages[outageElementGid]; var measurementMapClient = MeasurementMapClient.CreateClient(); var elementToMeasurementsMap = await measurementMapClient.GetElementToMeasurementMap(); foreach (var monitoredElementGid in removeOutage.ElementsOfInteres) { bool stillNeeded = false; foreach (var outage in enumerableSimulatedOutages.Values) { if (outage.OutageElementGid != removeOutage.OutageElementGid && outage.ElementsOfInteres.Contains(monitoredElementGid)) { stillNeeded = true; break; } } if (!stillNeeded && elementToMeasurementsMap.ContainsKey(monitoredElementGid)) { var measurementGids = elementToMeasurementsMap[monitoredElementGid]; var measurementGid = measurementGids.FirstOrDefault(); await MonitoredIsolationPoints.TryRemoveAsync(measurementGid); } } }
public async Task Start() { while (!ReliableDictionariesInitialized) { await Task.Delay(1000); } var enumerableOutages = await SimulatedOutages.GetEnumerableDictionaryAsync(); var enumerableMonitoredPoints = await MonitoredIsolationPoints.GetEnumerableDictionaryAsync(); if (enumerableOutages.Count == 0 || enumerableMonitoredPoints.Count == 0) { Logger.LogVerbose($"{baseLogString} Start => No simulated outages. End of cycle."); return; } var defaultIsolationPointsToBeOpened = new Dictionary <long, DiscreteModbusData>(); var measurementMapClient = MeasurementMapClient.CreateClient(); var elementToMeasurementMap = await measurementMapClient.GetElementToMeasurementMap(); foreach (var outage in enumerableOutages.Values) { foreach (long defaultPointElementGid in outage.DefaultIsolationPointGids) { if (!elementToMeasurementMap.ContainsKey(defaultPointElementGid)) { continue; } var defaultPointMeasurementGid = elementToMeasurementMap[defaultPointElementGid].FirstOrDefault(); if (!outage.DefaultToOptimumIsolationPointMap.ContainsKey(defaultPointElementGid)) { continue; } long optimumPointElementGid = outage.DefaultToOptimumIsolationPointMap[defaultPointElementGid]; if (!elementToMeasurementMap.ContainsKey(optimumPointElementGid)) { continue; } long optimumPointMeasurementGid = elementToMeasurementMap[optimumPointElementGid].FirstOrDefault(); if (!enumerableMonitoredPoints.ContainsKey(optimumPointMeasurementGid) || !enumerableMonitoredPoints.ContainsKey(defaultPointMeasurementGid)) { continue; } var defaultIsolationPoint = enumerableMonitoredPoints[defaultPointMeasurementGid].DiscreteModbusData; ushort optimumIsolationPointValue = enumerableMonitoredPoints[optimumPointMeasurementGid].DiscreteModbusData.Value; if (optimumIsolationPointValue == (ushort)DiscreteCommandingType.CLOSE && defaultIsolationPoint.Value == (ushort)DiscreteCommandingType.CLOSE) { defaultIsolationPointsToBeOpened.Add(defaultPointMeasurementGid, defaultIsolationPoint); Logger.LogInformation($"{baseLogString} Start => preparing command to OPEN 0x{defaultPointElementGid:X16} because element 0x{optimumPointElementGid:X16} is CLOSED."); } } } await OpenIsolationPoints(defaultIsolationPointsToBeOpened); }