]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - cliente/cetherled.py
Cliente con funcionalidad básica completa. El cliente tiene una interfaz de
[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 class MainWindow(SimpleGladeApp):
46
47     def __init__(self, path="cetherled.glade", root="main_window",
48             domain=app_name, **kwargs):
49         self.columns = kwargs.get('columns', 16)
50         self.host = kwargs.get('host', 'localhost')
51         self.port = kwargs.get('port', 9876)
52         #notificar = Dispatcher(self.actualizar)
53         self.device = etherled.NetworkedDevice(self.host, self.port)
54         path = os.path.join(glade_dir, path)
55         SimpleGladeApp.__init__(self, path, root, domain, **kwargs)
56
57     def new(self):
58         self.tabla = {}
59         for i in xrange(ROWS):
60             for j in xrange(self.columns):
61                 led = Led()
62                 self.table_leds.attach(led, j, j+1, i, i+1)
63                 led.show()
64                 self.tabla[i,j] = led
65
66     def on_btn_salir_clicked(self, widget, *args):
67         self.quit()
68
69     def on_btn_enviar_clicked(self, widget, *args):
70         self.device.matrix = self.leds2matrix()
71
72     def on_btn_recibir_clicked(self, widget, *args):
73         matrix = self.device.matrix
74         for row in xrange(ROWS):
75             for col in xrange(self.columns):
76                 self.tabla[row,col].prendido = matrix[row,col]
77                 self.tabla[row,col].queue_draw()
78         etherled.protocol._print_matrix(matrix)
79
80     def on_main_window_delete_event(self, widget, event, *args):
81         self.quit()
82
83     def leds2matrix(self):
84         matrix = {}
85         for row in xrange(ROWS):
86             for col in xrange(self.columns):
87                 matrix[row,col] = int(self.tabla[row,col].prendido)
88         etherled.protocol._print_matrix(matrix)
89         return matrix
90
91
92 def parse_options():
93     parser = OptionParser(description="Cliente de etherled",
94         version="%prog " + app_version, prog='cetherled')
95     parser.add_option("-s", "--server", default='localhost', dest="host",
96         metavar="HOSTNAME", help="Nombre/IP del host del dispositivo "
97         "[default: localhost]")
98     parser.add_option("-p", "--port", default=9876, metavar="PORT",
99         type="int", help="Puerto UDP del dispositivo [default: 9876].")
100     parser.add_option("-c", "--columns", default=16, metavar="COLS",
101         type="int", help="Cantidad de columnas de la matriz [default: 16].")
102     parser.add_option("-g", "--gui", default=False, action="store_true",
103         help="Levanta la interfaz gráfica para dibujar la matriz")
104     (opts, args) = parser.parse_args()
105     return (parser, opts, args)
106
107
108 def main():
109     (parser, opts, args) = parse_options()
110     if (opts.columns < 8) or (opts.columns > 32):
111         parser.error("El número de columnas debe estar entre 8 y 32.")
112     if opts.gui:
113         gtk.threads_init()
114         main_window = MainWindow(columns=opts.columns, host=opts.host,
115             port=opts.port)
116         gtk.threads_enter()
117         main_window.run()
118         gtk.threads_leave()
119     else:
120         if len(args) < 2:
121             parser.error("Debe especificarse un comando si no se usa la GUI.")
122         type = args[0]
123         var  = args[1]
124         dev  = etherled.NetworkedDevice(opts.host, opts.port)
125         if type == 'get':
126             if len(args) > 2:
127                 parser.error("El comando get no puede llevar argumentos.")
128             if var == 'matrix':
129                 etherled.protocol._print_matrix(dev.matrix)
130             elif var == 'pause':
131                 print dev.paused
132             elif var == 'delay':
133                 print dev.delay
134             else:
135                 parser.error("Variable desconocida, debe ser una de: "
136                     "matrix, pause, delay.")
137         elif type == 'set':
138             if var == 'off':
139                 dev.turn_off()
140             elif var == 'matrix':
141                 parser.error("Use la GUI para enviar la matriz.")
142             elif var == 'pause':
143                 dev.paused = True
144             elif var == 'continue':
145                 dev.paused = False
146             elif var == 'delay':
147                 if len(args) != 3:
148                     parser.error("Delay lleva 1 argumento.")
149                 dev.delay = int(args[2])
150             else:
151                 parser.error("Variable desconocida, debe ser una de: "
152                     "off, pause, continue, delay.")
153
154
155 if __name__ == '__main__':
156     main()
157