]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - cliente/cetherled.py
Agrego pruebas que tenía colgadas por ahí...
[z.facultad/66.09/etherled.git] / cliente / cetherled.py
index 7f41608be89815df2a4adf985bb61bb57be3dd2f..bcba0cb1e9f32cc9b9008d2d1be44049c5105b3d 100755 (executable)
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 # vim: set expandtab tabstop=4 shiftwidth=4 :
 #----------------------------------------------------------------------------
 #                               Etherled
@@ -27,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
@@ -38,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()
@@ -64,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):
@@ -74,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
+