X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/e5335c9876a28f215b894af99ad2ff7f55888c01..219a10127e5cf868e78d59592fc7fade4987a0ee:/cliente/cetherled.py diff --git a/cliente/cetherled.py b/cliente/cetherled.py index c242769..bcba0cb 100755 --- a/cliente/cetherled.py +++ b/cliente/cetherled.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# -*- coding: iso-8859-1 -*- +# -*- coding: utf-8 -*- # vim: set expandtab tabstop=4 shiftwidth=4 : #---------------------------------------------------------------------------- # Etherled @@ -28,6 +28,7 @@ import os import gtk from simplegladeapp import SimpleGladeApp from simplegladeapp import bindtextdomain +from optparse import OptionParser #from dispatcher import Dispatcher from led import Led import etherled @@ -39,19 +40,38 @@ locale_dir = "" 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() @@ -65,9 +85,10 @@ class MainWindow(SimpleGladeApp): 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): @@ -75,19 +96,96 @@ class MainWindow(SimpleGladeApp): 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 +