Przeglądaj źródła

Take only first hardware and sensor events

Nick Babcock 6 lat temu
rodzic
commit
4d301cb30e
2 zmienionych plików z 29 dodań i 16 usunięć
  1. 22 13
      OhmGraphite/SensorCollector.cs
  2. 7 3
      OhmGraphite/UpdateVisitor.cs

+ 22 - 13
OhmGraphite/SensorCollector.cs

@@ -11,7 +11,9 @@ namespace OhmGraphite
         private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
         private readonly Computer _computer;
         private readonly IVisitor _updateVisitor = new UpdateVisitor();
-        private readonly IDictionary<Identifier, ISensor> _sensors = new ConcurrentDictionary<Identifier, ISensor>();
+
+        private readonly ConcurrentDictionary<Identifier, object> _ids =
+            new ConcurrentDictionary<Identifier, object>();
 
         public SensorCollector(Computer computer) => _computer = computer;
         public void Open()
@@ -39,12 +41,18 @@ namespace OhmGraphite
 
         private void HardwareAdded(IHardware hardware)
         {
+            if (!_ids.TryAdd(hardware.Identifier, hardware))
+            {
+                Logger.Debug("Hardware previously added: {0}", hardware.Identifier);
+                return;
+            }
+
             Logger.Debug("Hardware added: {0}", hardware.Identifier);
-            hardware.SensorAdded += Hardware_SensorAdded;
-            hardware.SensorRemoved += Hardware_SensorRemoved;
+            hardware.SensorAdded += SensorAdded;
+            hardware.SensorRemoved += SensorRemoved;
             foreach (var sensor in hardware.Sensors)
             {
-                Hardware_SensorAdded(sensor);
+                SensorAdded(sensor);
             }
 
             foreach (var sub in hardware.SubHardware)
@@ -55,12 +63,13 @@ namespace OhmGraphite
 
         private void HardwareRemoved(IHardware hardware)
         {
+            _ids.TryRemove(hardware.Identifier, out _);
             Logger.Debug("Hardware removed: {0}", hardware.Identifier);
-            hardware.SensorAdded -= Hardware_SensorAdded;
-            hardware.SensorRemoved -= Hardware_SensorRemoved;
+            hardware.SensorAdded -= SensorAdded;
+            hardware.SensorRemoved -= SensorRemoved;
             foreach (var sensor in hardware.Sensors)
             {
-                Hardware_SensorRemoved(sensor);
+                SensorRemoved(sensor);
             }
 
             foreach (var sub in hardware.SubHardware)
@@ -69,22 +78,22 @@ namespace OhmGraphite
             }
         }
 
-        private void Hardware_SensorAdded(ISensor sensor)
+        private void SensorAdded(ISensor sensor)
         {
-            Logger.Debug("Sensor added: {0}", sensor.Identifier);
-            _sensors[sensor.Identifier] = sensor;
+            Logger.Debug(!_ids.TryAdd(sensor.Identifier, sensor) ?
+                    "Sensor previously added: {0}" : "Sensor added: {0}", sensor.Identifier);
         }
 
-        private void Hardware_SensorRemoved(ISensor sensor)
+        private void SensorRemoved(ISensor sensor)
         {
             Logger.Debug("Sensor removed: {0}", sensor.Identifier);
-            _sensors.Remove(sensor.Identifier);
+            _ids.TryRemove(sensor.Identifier, out _);
         }
 
         public IEnumerable<ReportedValue> ReadAllSensors()
         {
             _computer.Accept(_updateVisitor);
-            return _sensors.Values.SelectMany(ReportedValues);
+            return _ids.Values.OfType<ISensor>().SelectMany(ReportedValues);
         }
 
         private static IEnumerable<ReportedValue> ReportedValues(ISensor sensor)

+ 7 - 3
OhmGraphite/UpdateVisitor.cs

@@ -16,8 +16,12 @@ namespace OhmGraphite
                 subHardware.Accept(this);
         }
 
-        public void VisitSensor(ISensor sensor) { }
+        public void VisitSensor(ISensor sensor)
+        {
+        }
 
-        public void VisitParameter(IParameter parameter) { }
+        public void VisitParameter(IParameter parameter)
+        {
+        }
     }
-}
+}