]> git.llucax.com Git - z.facultad/75.59/weathemulator.git/blobdiff - src/sensor.py
Utiliza decorators.
[z.facultad/75.59/weathemulator.git] / src / sensor.py
index f073387bc98a1286818f8fa13239dbfc71cbaaa6..da386876fd462f72a521544a671c9a0a3b9b1a1e 100644 (file)
@@ -51,6 +51,7 @@ class Sensor(Synchronizable, threading.Thread):
         return self.mu
 
     def run(self):
+        #TODO Alguna forma de pausarlo
         while 1:
             # Hacer algún signal al monitor de los sensores
             self.valorActual = self.getValor()
@@ -143,17 +144,80 @@ class SensorCalibrado(Sensor):
                 self.valorAlto)
 
 
+class SensorHistorico(SensorCalibrado):
+
+    def __init__(self, valorBajo, valorAlto, sigma, periodo):
+        # Listado de los valores de las últimas 24hs (inicializado con None)
+        self.historial = [(None, None) for i in xrange(int(24 * 60 * 60 / periodo))]
+        SensorCalibrado.__init__(self, valorBajo, valorAlto, sigma, periodo)
+
+    def getValor(self):
+        "Simula la medición del dispositivo físico."
+        nuevo = SensorCalibrado.getValor(self)
+        hora = time.strftime("%c")
+        self.actualizarHistorial(nuevo, hora)
+        return nuevo
+
+    def actualizarHistorial(self, valor, hora):
+        self.historial.pop(0)
+        self.historial.append((valor, hora))
+    actualizarHistorial = synchronized('historialLock')(actualizarHistorial)
+
+    def getMin(self):
+        minimo = (None, None)
+        for (valor, hora) in self.historial:
+            if minimo[0] is None or valor <= minimo[0]:
+                minimo = (valor, hora)
+        return minimo
+    getMin = synchronized('historialLock')(getMin)
+
+    def getMax(self):
+        maximo = (None, None)
+        for (valor, hora) in self.historial:
+            if valor >= maximo[0]:
+                maximo = (valor, hora)
+        return maximo
+    getMax = synchronized('historialLock')(getMax)
+
+    valorMinimo = property(getMin, doc="Mínimo de las últimas 24hs como " \
+        "tupla (minimo, hora).")
+    valorMaximo = property(getMax, doc="Máximo de las últimas 24hs como " \
+        "tupla (maximo, hora).")
+
+
+class SensorHumedad(SensorHistorico):
+
+    def __init__(self):
+        SensorHistorico.__init__(self, (0.0, 0.0), (100.0, 100.0), 0.3, 300.0)
+
+    def initMu(self):
+        return self.rnd.gauss(70.0, 5.0)
+
+
+class SensorVelocidadViento(SensorHistorico):
+
+    def __init__(self):
+        SensorHistorico.__init__(self, (0.0, 0.0), (100.0, 100.0), 0.1, 0.5)
+
+    def initMu(self):
+        return self.rnd.gauss(30.0, 8.0)
+
+
 if __name__ == '__main__':
     DEBUG = True
     sensor = SensorDireccionViento()
     sensor.setDaemon(True)
     sensor.start()
-    SensorCalibrado.initMu = lambda self: 10
-    sensor2 = SensorCalibrado((0.0,0.0), (100.0,100.0), 0.2, 0.5)
+    sensor2 = SensorHumedad()
     sensor2.setDaemon(True)
     sensor2.start()
+    sensor3 = SensorVelocidadViento()
+    sensor3.setDaemon(True)
+    sensor3.start()
     time.sleep(2)
     sensor2.valorBajo = (0.0, -10.0)
     sensor2.valorAlto = (100.0, 10.0)
+    print sensor3.valorMinimo, sensor3.valorMaximo
     time.sleep(3)
+    print sensor3.valorMinimo, sensor3.valorMaximo