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.host = kwargs.get('host', 'localhost')
- self.port = kwargs.get('port', 9876)
+ self.device = kwargs.get('dev')
#notificar = Dispatcher(self.actualizar)
- self.device = etherled.NetworkedDevice(self.host, self.port)
path = os.path.join(glade_dir, path)
SimpleGladeApp.__init__(self, path, root, domain, **kwargs)
def parse_options():
- parser = OptionParser(description="Cliente de etherled",
- version="%prog " + app_version, prog='cetherled')
+ 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].")
- parser.add_option("-c", "--columns", default=16, metavar="COLS",
- type="int", help="Cantidad de columnas de la matriz [default: 16].")
- parser.add_option("-g", "--gui", default=False, action="store_true",
- help="Levanta la interfaz gráfica para dibujar la matriz")
(opts, args) = parser.parse_args()
return (parser, opts, args)
def main():
(parser, opts, args) = parse_options()
- if (opts.columns < 8) or (opts.columns > 32):
- parser.error("El número de columnas debe estar entre 8 y 32.")
- if opts.gui:
+ 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=opts.columns, host=opts.host,
- port=opts.port)
+ 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:
- if len(args) < 2:
- parser.error("Debe especificarse un comando si no se usa la GUI.")
- type = args[0]
- var = args[1]
- dev = etherled.NetworkedDevice(opts.host, opts.port)
- if type == 'get':
- if len(args) > 2:
- parser.error("El comando get no puede llevar argumentos.")
- if var == 'matrix':
- etherled.protocol._print_matrix(dev.matrix)
- elif var == 'pause':
- print dev.paused
- elif var == 'delay':
- print dev.delay
- else:
- parser.error("Variable desconocida, debe ser una de: "
- "matrix, pause, delay.")
- elif type == 'set':
- if var == 'off':
- dev.turn_off()
- elif var == 'matrix':
- parser.error("Use la GUI para enviar la matriz.")
- elif var == 'pause':
- dev.paused = True
- elif var == 'continue':
- dev.paused = False
- elif var == 'delay':
- if len(args) != 3:
- parser.error("Delay lleva 1 argumento.")
- dev.delay = int(args[2])
- else:
- parser.error("Variable desconocida, debe ser una de: "
- "off, pause, continue, delay.")
+ 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
+