]> 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 dfc15f72396f0e7a4f18fcf0d527732d523f01ae..bcba0cb1e9f32cc9b9008d2d1be44049c5105b3d 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# -*- coding: iso-8859-1 -*-
+# -*- coding: utf-8 -*-
 # vim: set expandtab tabstop=4 shiftwidth=4 :
 #----------------------------------------------------------------------------
 #                               Etherled
@@ -28,8 +28,10 @@ import os
 import gtk
 from simplegladeapp import SimpleGladeApp
 from simplegladeapp import bindtextdomain
-from dispatcher import Dispatcher
+from optparse import OptionParser
+#from dispatcher import Dispatcher
 from led import Led
+import etherled
 
 app_name = "cetherled"
 app_version = "1.0"
@@ -38,21 +40,40 @@ 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)
         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, i, i+1, j, j+1)
+                self.table_leds.attach(led, j, j+1, i, i+1)
                 led.show()
                 self.tabla[i,j] = led
 
@@ -60,47 +81,111 @@ class MainWindow(SimpleGladeApp):
         self.quit()
 
     def on_btn_enviar_clicked(self, widget, *args):
-        print self.tabla_a_stream()
+        self.device.matrix = self.leds2matrix()
+
+    def on_btn_recibir_clicked(self, widget, *args):
+        matrix = self.device.matrix
+        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):
         self.quit()
 
-    def imprimir_tabla(self, rotada=False):
-        rango = xrange(16)
-        if rotada:
-            rango = xrange(15, -1, -1)
-        for col in rango:
-            for row in xrange(16):
-                print int(self.tabla[col,row].prendido),
-            print
-        print
-
-    def imprimir_stream(self, stream):
-        for i in stream:
-            print '0x%02x' % i
-
-    def tabla_a_stream(self):
-        stream = []
-        for col in xrange(15, -1, -1):
-            i = 0
-            for row in xrange(8):
-                i += int(self.tabla[col,row].prendido) << row
-            stream.append(i)
-            i = 0
-            for row in xrange(8, 16):
-                i += int(self.tabla[col,row].prendido) << row
-            stream.append(i)
-        return stream
+    def leds2matrix(self):
+        matrix = {}
+        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
+