#!/usr/bin/env python
+# -*- coding: utf-8 -*-
# vim: set expandtab tabstop=4 shiftwidth=4 :
#----------------------------------------------------------------------------
# Etherled
import gtk
from simplegladeapp import SimpleGladeApp
from simplegladeapp import bindtextdomain
+from optparse import OptionParser
#from dispatcher import Dispatcher
from led import Led
import etherled
bindtextdomain(app_name, locale_dir)
+ROWS = 16
+
+usage = '''%%prog [opciones] comando [parámetros]
+Cliente de etherled - versión %s
+
+Comandos:
+ gui Muestra una interfaz gráfica para dibujar la matriz.
+ Parámetro: cantidad de columnas a dibujar (default 16).
+ off Apaga el dispositivo.
+ pause Pausa el dibujado de la matriz.
+ continue Continúa el dibujado de la matriz.
+ paused Indica si el dispositivo está en pausa o dibujando.
+ get-matrix Imprime por pantalla la matriz cargada en el dispositivo.
+ get-delay Obtiene el retardo del refresco de dibujado.
+ set-delay Envía un nuevo retardo del refresco de dibujado al dispositivo.
+ Parámetro: nuevo retardo (entre 1 y 255).
+''' % app_version
+
class MainWindow(SimpleGladeApp):
def __init__(self, path="cetherled.glade", root="main_window",
domain=app_name, **kwargs):
+ self.columns = kwargs.get('columns', 16)
+ self.device = kwargs.get('dev')
#notificar = Dispatcher(self.actualizar)
- self.device = etherled.NetworkedDevice()
path = os.path.join(glade_dir, path)
SimpleGladeApp.__init__(self, path, root, domain, **kwargs)
def new(self):
self.tabla = {}
- for i in xrange(16):
- for j in xrange(16):
+ for i in xrange(ROWS):
+ for j in xrange(self.columns):
led = Led()
self.table_leds.attach(led, j, j+1, i, i+1)
led.show()
def on_btn_recibir_clicked(self, widget, *args):
matrix = self.device.matrix
- for row in xrange(16):
- for col in xrange(16):
+ for row in xrange(ROWS):
+ for col in xrange(self.columns):
self.tabla[row,col].prendido = matrix[row,col]
+ self.tabla[row,col].queue_draw()
etherled.protocol._print_matrix(matrix)
def on_main_window_delete_event(self, widget, event, *args):
def leds2matrix(self):
matrix = {}
- for row in xrange(16):
- for col in xrange(16):
+ for row in xrange(ROWS):
+ for col in xrange(self.columns):
matrix[row,col] = int(self.tabla[row,col].prendido)
etherled.protocol._print_matrix(matrix)
return matrix
+
+def parse_options():
+ parser = OptionParser(usage=usage, version=app_version, prog=app_name)
+ parser.add_option("-s", "--server", default='localhost', dest="host",
+ metavar="HOSTNAME", help="Nombre/IP del host del dispositivo "
+ "[default: localhost]")
+ parser.add_option("-p", "--port", default=9876, metavar="PORT",
+ type="int", help="Puerto UDP del dispositivo [default: 9876].")
+ (opts, args) = parser.parse_args()
+ return (parser, opts, args)
+
+
def main():
- gtk.threads_init()
- main_window = MainWindow()
- gtk.threads_enter()
- main_window.run()
- gtk.threads_leave()
+ (parser, opts, args) = parse_options()
+ if len(args) < 1:
+ parser.error("Debe especificarse un comando.")
+ cmd = args[0]
+ dev = etherled.NetworkedDevice(opts.host, opts.port)
+ if cmd == 'gui':
+ cols = 16
+ if len(args) == 2:
+ try:
+ cols = int(args[1])
+ except ValueError:
+ parser.error("El parámetro debe ser un número entero.")
+ elif len(args) > 2:
+ parser.error("El comando lleva sólo 1 parámetro (opcional).")
+ if (cols < 8) or (cols > 32):
+ parser.error("El número de columnas debe estar entre 8 y 32.")
+ gtk.threads_init()
+ main_window = MainWindow(columns=cols, dev=dev)
+ gtk.threads_enter()
+ main_window.run()
+ gtk.threads_leave()
+ elif cmd == 'get-matrix':
+ if len(args) != 1:
+ parser.error("El comando no lleva argumentos.")
+ etherled.protocol._print_matrix(dev.matrix)
+ elif cmd == 'paused':
+ if len(args) != 1:
+ parser.error("El comando no lleva argumentos.")
+ if dev.paused:
+ print "En pausa"
+ else:
+ print "Dibujando"
+ elif cmd == 'pause':
+ if len(args) != 1:
+ parser.error("El comando no lleva argumentos.")
+ dev.paused = True
+ elif cmd == 'continue':
+ if len(args) != 1:
+ parser.error("El comando no lleva argumentos.")
+ dev.paused = False
+ elif cmd == 'off':
+ if len(args) != 1:
+ parser.error("El comando no lleva argumentos.")
+ try:
+ dev.turn_off()
+ # Nos va a tirar un time-out porque no responde
+ except etherled.protocol.RecvError:
+ pass
+ elif cmd == 'get-delay':
+ if len(args) != 1:
+ parser.error("El comando no lleva argumentos.")
+ print dev.delay
+ elif cmd == 'set-delay':
+ if len(args) != 2:
+ parser.error("El comando lleva 1 argumento.")
+ try:
+ delay = int(args[1])
+ except ValueError:
+ parser.error("El parámetro debe ser un entero entre 1 y 255.")
+ if (delay < 1) or (delay > 255):
+ parser.error("El parámetro debe ser un entero entre 1 y 255.")
+ dev.delay = delay
+ else:
+ parser.error("Comando desconocido. Vea la ayuda con %prog -h.")
+
if __name__ == '__main__':
- main()
+ try:
+ main()
+ except etherled.protocol.RecvError, e:
+ import sys
+ print >>sys.stderr, 'Hubo un error al recibir el ACK (%s).' % e
+