Completa implemetación de sensores.
Este parche termina de cerrar la implementación de los sensores:
- Hace que al crearse los sensores ya se larguen a correr.
- Agrega una forma de parar los sensores: método stop()
- Agrega al constructor un callable que será llamado cada vez que se actualiza
un valor. De esta forma tenemos un mecanismo extremadamente genérico y
flexible para notificar cambios a quien sea.
- Se cambian los períodos de varios sensores (los que tenían períodos de 5
minutos) a valores más propicios para la emulación.
Implementa SensorTendencia, SensorTemperatura y SensorPresion.
Con esto se terminan todos los sensores. Para calcular la tendencia se aproxima
una recta por cuadrados mínimos y a la pendiente se le calcula la arcotangente
(dividido pi/2) para dejarlo en el rango (-1, 1) (siendo +/-1 pendiente infinita
positiva o negativa respectivamente y 0 constante).
Módulo para tener propiedades y métodos sincronizadas
Este módulo provee una clase Synchronized que a través de magia de metaclases
crea propiedades sincronizadas utilizando mutex. Los atributos sincronizados se
declaran como atributos de clase como instancias de SyncProp. Por ejemplo:
from sync import *
class SyncObj(Synchronized):
syncattr = SyncProp("Descripción del atributo")
o = SyncObj()
o.syncattr = 1 # está rodeado de un mutex
También se provee un wrapper para métodos que puede usarse como decorator:
class SyncObj(Synchronized):
@synchronized
def syncmethod(self):
# Hace cosas
o = SyncObj()
o.syncmethod() # está rodeado de un mutex