Advertisement
Guest User

Untitled

a guest
Oct 10th, 2010
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.01 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Written By kenkeiras <kenkeiras@gmail.com>
  4. # This program is free software. It comes without any warranty, to
  5. # the extent permitted by applicable law. You can redistribute it
  6. # and/or modify it under the terms of the Do What The Fuck You Want
  7. # To Public License, Version 2, as published by Sam Hocevar. See
  8. # http://sam.zoy.org/wtfpl/COPYING for more details.
  9.  
  10. import bluetooth, time, string
  11. from select import select
  12.  
  13. # Rellena los datos
  14. def padd(data, n, b = "\0"):
  15.     l = len(data)
  16.     while (l < n):
  17.         data.append(b)
  18.         l += 1
  19.     return data
  20.  
  21. # Pasa un número de 3 bytes a str
  22. def uint24str(n):
  23.     data = []
  24.     data.append( chr(n & 255) )
  25.     n >>= 8
  26.  
  27.     data.append( chr(n & 255) )
  28.     n >>= 8
  29.  
  30.     data.append( chr(n & 255) )
  31.  
  32.     data.reverse() # Little endian
  33.  
  34.     return ''.join(data)
  35.  
  36.  
  37. # El controlador del mando
  38. class pymote:
  39.  
  40.     writing_port = 0x11  # Puerto L2CAP de envío de información
  41.  
  42.     reading_port = 0x13  # Puerto L2CAP de recepción de información
  43.  
  44.     max_packet_size = 36 # Tamaño máximo de un paquete
  45.  
  46.     # Prepara el byte del led
  47.     def get_led_byte(self):
  48.         b = 0
  49.         if (self.rumble):
  50.             b |= 1
  51.  
  52.         if (self.led[ 0 ] != 0):
  53.             b |= 0x10
  54.  
  55.         if (self.led[ 1 ] != 0):
  56.             b |= 0x20
  57.  
  58.         if (self.led[ 2 ] != 0):
  59.             b |= 0x40
  60.  
  61.         if (self.led[ 3 ] != 0):
  62.             b |= 0x80
  63.         return b
  64.  
  65.     # Ajusta los leds
  66.     def set_leds(self):
  67.         self.send(string.join([chr(0x52), chr(0x11),\
  68.                                     chr(self.get_led_byte()) ], ""))
  69.  
  70.  
  71.     # Activa/Desactiva los leds del mando
  72.     def toogle_led(self, d = None):
  73.         d = int(d)
  74.         self.led[d - 1] ^= 1
  75.         self.set_leds()
  76.         pass
  77.  
  78.     # Pregunta el estado del mando
  79.     def req_stat(self, d = None):
  80.         b = 0
  81.         if (self.rumble):
  82.             b |= 1
  83.  
  84.         self.send(string.join([chr(0x52), chr(0x15), chr(b)], ""))
  85.  
  86.     # Activa/desactiva la vibración
  87.     def toogle_rumble(self, d = None):
  88.         if (self.rumble):
  89.             self.rumble = False
  90.         else:
  91.             self.rumble = True
  92.         self.req_stat(d)
  93.  
  94.     # Activa/desactiva el speaker
  95.     def toogle_speaker(self, d = None):
  96.         b = 0
  97.         if (self.rumble):
  98.             b |= 1
  99.  
  100.         if (not self.speaker):
  101.             self.speaker = True
  102.             b |= 4
  103.             if (self.debug):
  104.                 print "Activado"
  105.         else:
  106.             self.speaker = False
  107.             if (self.debug):
  108.                 print "Desactivado"
  109.  
  110.         self.send(string.join([chr(0x52), chr(0x14), chr(b)], ""))
  111.         if (self.speaker):
  112.             time.sleep(0.1)
  113.             self.speaker_init()
  114.  
  115.     # Activa/desactiva la cámara IR
  116.     # Esto es algo más complicado, aún sin implementar
  117.     def toogle_ir(self, d = None):
  118.         b = 0
  119.         if (self.rumble):
  120.             b |= 1
  121.  
  122.         if (not self.ir):
  123.             self.ir = True
  124.             b |= 4
  125.             if (self.debug):
  126.                 print "Activado"
  127.         else:
  128.             self.ir = False
  129.             if (self.debug):
  130.                 print "Desactivado"
  131.  
  132.         self.send(string.join([chr(0x52), chr(0x13), chr(b)], ""))
  133.         time.sleep(0.1)
  134.         self.send(string.join([chr(0x52), chr(0x1a), chr(b)], ""))
  135.         time.sleep(0.1)
  136.  
  137.     # Escribe en un registro
  138.     def reg_write(self, pos, data):
  139.         b = 4
  140.         if (self.rumble):
  141.             b |= 1
  142.  
  143.         l = len(data)
  144.         if (l > 16):
  145.             raise Exception("Data too big =_=")
  146.         data = ''.join(padd(data, 16))
  147.         self.send(chr(0x52) + chr(0x16) + chr(b) + uint24str(pos) +
  148.                    chr(l) + data)
  149.  
  150.  
  151.     # Envia audio al mando
  152.     def send_audio(self, data):
  153.         l = len(data)
  154.         if (l > 20):
  155.             raise Exception("Data too big =_=")
  156.         self.send(chr(0x52) + chr(0x18) + chr(l) + data)
  157.  
  158.     # Inicia el speaker
  159.     # Con un bus de 4 Bits ADPCM y un framerate de 3000Hz
  160.     def speaker_init(self):
  161.  
  162.         # Lo silencia
  163.         self.mute = False
  164.         self.toogle_mute()
  165.         time.sleep(0.1)
  166.  
  167.         # Escribe 1 en el registro 0xa20009
  168.         self.reg_write(0xa20009, [chr(0x01)])
  169.         time.sleep(0.1)
  170.  
  171.         # Escribe 8 en el registro 0xa20001
  172.         self.reg_write(0xa20001, [chr(0x08)])
  173.         time.sleep(0.1)
  174.  
  175.         self.reg_write(0xa2001, [chr(0), chr(0x00), chr(0xD0), chr(0x07),\
  176.                                  chr(0x40), chr(0), chr(0)])
  177.  
  178.         # Escribe 1 en el registro 0xa20008
  179.         self.reg_write(0xa20008, [chr(0x01)])
  180.         time.sleep(0.1)
  181.  
  182.         # Le devuelve el sonido
  183.         self.toogle_mute()
  184.  
  185.     # Silencia/Da voz al speaker
  186.     def toogle_mute(self, d = None):
  187.         b = 0
  188.         if (self.rumble):
  189.             b |= 1
  190.  
  191.         if (not self.mute):
  192.             self.mute = True
  193.             b |= 4
  194.             if (self.debug):
  195.                 print "Silenciado"
  196.         else:
  197.             self.mute = False
  198.             if (self.debug):
  199.                 print "Con voz"
  200.  
  201.         self.send(string.join([chr(0x52), chr(0x19), chr(b)], ""))
  202.  
  203.  
  204.     # Inicia el objeto y establece las conexiones
  205.     def __init__(self, baddr, name = None, debug = False, client = True):
  206.  
  207.         self.debug = False
  208.         self.led = [0, 1, 1, 0] # LED's
  209.         self.rumble = False     # Vibración
  210.         self.speaker = False    # Speaker
  211.         self.mute = False       # Speaker silenciado
  212.         self.ir = False         # Cámara IR
  213.         self.baddr = baddr      # Dirección bluetooth
  214.         self.name = None        # Nombre (no se usa)
  215.         if (client):
  216.             self.client_connect(baddr)
  217.         else:
  218.             self.server_connect(baddr)
  219.  
  220.         self.toogle_speaker()
  221.  
  222.     # Recibe el siguiente paquete de información
  223.     def get_next(self):
  224.  
  225.         data = None
  226.         (r, w, e) = select([self.r_s, self.w_s], [], [])
  227.         if (self.r_s in r):
  228.             data = self.r_s.recv(self.max_packet_size )
  229.             if (len(data) < 1):
  230.                 self.connected = False
  231.  
  232.         elif (self.w_s in r):
  233.             data = self.w_s.recv(self.max_packet_size )
  234.             if (len(data) < 1):
  235.                 self.connected = False
  236.  
  237.         else:
  238.             self.connected = False
  239.  
  240.         return data
  241.  
  242.     # Establece las conexiones directamente
  243.     def client_connect(self, baddr):
  244.         try:
  245.  
  246.             # Socket de escritura, envía información
  247.             self.w_s = bluetooth.BluetoothSocket( bluetooth.L2CAP )
  248.             self.w_s.connect((baddr, self.writing_port))
  249.  
  250.             # Socket de lectura, recibe información
  251.             self.r_s = bluetooth.BluetoothSocket( bluetooth.L2CAP )
  252.             self.r_s.connect((baddr, self.reading_port))
  253.  
  254.             self.connected = True
  255.  
  256.         except:
  257.             raise Exception("Fallo al conectar")
  258.  
  259.     # Acepta conexiones nuevas
  260.     def server_connect(self, baddr):
  261.         try:
  262.  
  263.             # Socket de escritura, envía información
  264.             self.w_s = bluetooth.BluetoothSocket( bluetooth.L2CAP )
  265.             self.w_s.bind(("", self.writing_port))
  266.             self.w_s.listen(1)
  267.             (self.w_s, self.baddr) = self.w_s.accept()
  268.  
  269.             # Socket de escritura, envía información
  270.             self.r_s = bluetooth.BluetoothSocket( bluetooth.L2CAP )
  271.             self.r_s.bind(("", self.reading_port))
  272.             self.r_s.listen(1)
  273.             (self.r_s, self.baddr) = self.r_s.accept()
  274.  
  275.             self.connected = True
  276.  
  277.         except:
  278.             raise Exception("¿Seguro que puedes abrir un puerto? ¬¬")
  279.  
  280.     # Envía algo
  281.     def send(self, data):
  282.         l = len(data)
  283.         c = 0
  284.         while (c < l):
  285.             c += self.w_s.send(data[ c : ])
  286.  
  287.     # Cierra las conexiones
  288.     def close(self):
  289.         self.w_s.close()
  290.         self.r_s.close()
  291.  
  292.     # Comprueba si está conectado
  293.     def is_connected(self):
  294.         return self.connected
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement