Actualiza mínimo, máximo, tendencia y valor bruto en tiempo real.
Este parche hace que la interfaz gráfica actualice en tiempo real los valores de
máximo, mínimo, tendencia y valor bruto en tiempo real cuando se los está
observando.
Agrega interfaz gráfica.
Este parche agrega una interfaz gráfica modesta pero completa. Muestra los
valores de todos los sensores y permite ver máximos, mínimos, tendencias y
calibrarlos según las especificaciones. Utilizar pygtk, glade y un wrapper muy
conveniente llamado SimpleGladeApp[1] para simplificar mucho la construcción de
la interfaz y una clase Dispatcher que permite mandar mensajes asincrónicos
usando un pipe a la interfaz.
Hay varias cosas mejorable, como que los máximos, mínimos, tendencias y valores
brutos de la calibración se actualicen en tiempo real, pero es completamente
funcional y cumple los requisitos básicos.
[1] http://primates.ximian.com/~sandino/python-glade/tepache/
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