]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - cliente/cetherled.py
Agrego pruebas que tenía colgadas por ahí...
[z.facultad/66.09/etherled.git] / cliente / cetherled.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # vim: set expandtab tabstop=4 shiftwidth=4 :
4 #----------------------------------------------------------------------------
5 #                               Etherled
6 #----------------------------------------------------------------------------
7 # This file is part of etherled.
8 #
9 # etherled is free software; you can redistribute it and/or modify it
10 # under the terms of the GNU General Public License as published by the Free
11 # Software Foundation; either version 2 of the License, or (at your option)
12 # any later version.
13 #
14 # etherled is distributed in the hope that it will be useful, but
15 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 # more details.
18 #
19 # You should have received a copy of the GNU General Public License along
20 # with etherled; if not, write to the Free Software Foundation, Inc., 59
21 # Temple Place, Suite 330, Boston, MA  02111-1307  USA
22 #----------------------------------------------------------------------------
23 # Creado:  vie oct 27 22:16:20 ART 2005
24 # Autores: Leandro Lucarella <llucare@fi.uba.ar>
25 #----------------------------------------------------------------------------
26
27 import os
28 import gtk
29 from simplegladeapp import SimpleGladeApp
30 from simplegladeapp import bindtextdomain
31 from optparse import OptionParser
32 #from dispatcher import Dispatcher
33 from led import Led
34 import etherled
35
36 app_name = "cetherled"
37 app_version = "1.0"
38 glade_dir = ""
39 locale_dir = ""
40
41 bindtextdomain(app_name, locale_dir)
42
43 ROWS = 16
44
45 usage = '''%%prog [opciones] comando [parámetros]
46 Cliente de etherled - versión %s
47
48 Comandos:
49     gui         Muestra una interfaz gráfica para dibujar la matriz.
50                 Parámetro: cantidad de columnas a dibujar (default 16).
51     off         Apaga el dispositivo.
52     pause       Pausa el dibujado de la matriz.
53     continue    Continúa el dibujado de la matriz.
54     paused      Indica si el dispositivo está en pausa o dibujando.
55     get-matrix  Imprime por pantalla la matriz cargada en el dispositivo.
56     get-delay   Obtiene el retardo del refresco de dibujado.
57     set-delay   Envía un nuevo retardo del refresco de dibujado al dispositivo.
58                 Parámetro: nuevo retardo (entre 1 y 255).
59 ''' % app_version
60
61 class MainWindow(SimpleGladeApp):
62
63     def __init__(self, path="cetherled.glade", root="main_window",
64             domain=app_name, **kwargs):
65         self.columns = kwargs.get('columns', 16)
66         self.device = kwargs.get('dev')
67         #notificar = Dispatcher(self.actualizar)
68         path = os.path.join(glade_dir, path)
69         SimpleGladeApp.__init__(self, path, root, domain, **kwargs)
70
71     def new(self):
72         self.tabla = {}
73         for i in xrange(ROWS):
74             for j in xrange(self.columns):
75                 led = Led()
76                 self.table_leds.attach(led, j, j+1, i, i+1)
77                 led.show()
78                 self.tabla[i,j] = led
79
80     def on_btn_salir_clicked(self, widget, *args):
81         self.quit()
82
83     def on_btn_enviar_clicked(self, widget, *args):
84         self.device.matrix = self.leds2matrix()
85
86     def on_btn_recibir_clicked(self, widget, *args):
87         matrix = self.device.matrix
88         for row in xrange(ROWS):
89             for col in xrange(self.columns):
90                 self.tabla[row,col].prendido = matrix[row,col]
91                 self.tabla[row,col].queue_draw()
92         etherled.protocol._print_matrix(matrix)
93
94     def on_main_window_delete_event(self, widget, event, *args):
95         self.quit()
96
97     def leds2matrix(self):
98         matrix = {}
99         for row in xrange(ROWS):
100             for col in xrange(self.columns):
101                 matrix[row,col] = int(self.tabla[row,col].prendido)
102         etherled.protocol._print_matrix(matrix)
103         return matrix
104
105
106 def parse_options():
107     parser = OptionParser(usage=usage, version=app_version, prog=app_name)
108     parser.add_option("-s", "--server", default='localhost', dest="host",
109         metavar="HOSTNAME", help="Nombre/IP del host del dispositivo "
110         "[default: localhost]")
111     parser.add_option("-p", "--port", default=9876, metavar="PORT",
112         type="int", help="Puerto UDP del dispositivo [default: 9876].")
113     (opts, args) = parser.parse_args()
114     return (parser, opts, args)
115
116
117 def main():
118     (parser, opts, args) = parse_options()
119     if len(args) < 1:
120         parser.error("Debe especificarse un comando.")
121     cmd = args[0]
122     dev  = etherled.NetworkedDevice(opts.host, opts.port)
123     if cmd == 'gui':
124         cols = 16
125         if len(args) == 2:
126             try:
127                 cols = int(args[1])
128             except ValueError:
129                 parser.error("El parámetro debe ser un número entero.")
130         elif len(args) > 2:
131             parser.error("El comando lleva sólo 1 parámetro (opcional).")
132         if (cols < 8) or (cols > 32):
133             parser.error("El número de columnas debe estar entre 8 y 32.")
134         gtk.threads_init()
135         main_window = MainWindow(columns=cols, dev=dev)
136         gtk.threads_enter()
137         main_window.run()
138         gtk.threads_leave()
139     elif cmd == 'get-matrix':
140         if len(args) != 1:
141             parser.error("El comando no lleva argumentos.")
142         etherled.protocol._print_matrix(dev.matrix)
143     elif cmd == 'paused':
144         if len(args) != 1:
145             parser.error("El comando no lleva argumentos.")
146         if dev.paused:
147             print "En pausa"
148         else:
149             print "Dibujando"
150     elif cmd == 'pause':
151         if len(args) != 1:
152             parser.error("El comando no lleva argumentos.")
153         dev.paused = True
154     elif cmd == 'continue':
155         if len(args) != 1:
156             parser.error("El comando no lleva argumentos.")
157         dev.paused = False
158     elif cmd == 'off':
159         if len(args) != 1:
160             parser.error("El comando no lleva argumentos.")
161         try:
162             dev.turn_off()
163         # Nos va a tirar un time-out porque no responde
164         except etherled.protocol.RecvError:
165             pass
166     elif cmd == 'get-delay':
167         if len(args) != 1:
168             parser.error("El comando no lleva argumentos.")
169         print dev.delay
170     elif cmd == 'set-delay':
171         if len(args) != 2:
172             parser.error("El comando lleva 1 argumento.")
173         try:
174             delay = int(args[1])
175         except ValueError:
176             parser.error("El parámetro debe ser un entero entre 1 y 255.")
177         if (delay < 1) or (delay > 255):
178             parser.error("El parámetro debe ser un entero entre 1 y 255.")
179         dev.delay = delay
180     else:
181         parser.error("Comando desconocido. Vea la ayuda con %prog -h.")
182
183
184 if __name__ == '__main__':
185     try:
186         main()
187     except etherled.protocol.RecvError, e:
188         import sys
189         print >>sys.stderr, 'Hubo un error al recibir el ACK (%s).' % e
190
191