#!/usr/bin/python import bluetooth import threading import time import sys import wave from threading import Thread from visual import * wiimote_adress="00:21:BD:01:68:92" receiveSocket = bluetooth.BluetoothSocket(bluetooth.L2CAP) controlSocket = bluetooth.BluetoothSocket(bluetooth.L2CAP) etat = "deconnecte" def connect() : global etat receiveSocket.connect((wiimote_adress, 0x13)) controlSocket.connect((wiimote_adress, 0x11)) if receiveSocket and controlSocket : etat = "connecte" wiiThread = threading.Thread(None, receive, None, (1,), None) wiiThread.start() return True else : print "connexion rejetee" return False def actionsOnButtons(etat, data) : octet1 = ord(data[2]) octet2 = ord(data[3]) if (octet1 & 0x01) == 1 : print "pad gauche" if (octet1 & 0x02) == 2 : print "pad droit" if (octet1 & 0x04) == 4 : print "pad bas : playing increment" playUp(); if (octet1 & 0x08) == 8 : print "pad haut : playing sound from file" playSound() if (octet1 & 0x10) == 0x10 : print "plus" if (octet2 & 0x01) == 1 : print "2" if (octet2 & 0x02) == 2 : print "1" if (octet2 & 0x04) == 4 : print "B : playing little sound" controlSocket.send(chr(0x52) + chr(0x18) + chr(20 << 3) + chr(0xCC) +chr(0x33) +chr(0xCC) +chr(0x33) +chr(0xCC) +chr(0x33) +chr(0xCC) +chr(0x33) +chr(0xCC) +chr(0x33) + chr(0xCC) +chr(0x33) +chr(0xCC) +chr(0x33) +chr(0xCC) +chr(0x33) +chr(0xCC) +chr(0x33) +chr(0xCC) +chr(0x33)) if (octet2 & 0x08) == 8 : print "deconnection" etat = "deconnecte" return etat def playUp() : for i in range(256) : controlSocket.send(chr(0x52) + chr(0x18) + chr(1 << 3) + chr(i % 256) + " ") def playSound() : sound = wave.open("crocodile.wav", "r") i = 0 nframes = sound.getnframes() frames = sound.readframes(nframes) while i < nframes : controlSocket.send(chr(0x52) + chr(0x18) + chr(20 << 3) + frames[i:i+20]) i += 20 print "end of " + str(i) + " frames" time.sleep(1) def actionsOnMode30(etat) : while etat == "connecte" : try : data = receiveSocket.recv(23) chaine = "" if len(data) == 4 : etat = actionsOnButtons(etat, data) except bluetooth.BluetoothError : pass receiveSocket.close() controlSocket.close() etat = "deconnecte" return def intsToString(ints) : string = "" for i in ints : string += chr(i) return string def intsToHexString(ints) : string = "hex " for i in ints : string += str(hex(i)) + " " return string def writeRegister(adress, size, data) : message = [0x52] # read message.append(0x16) # registers message.append(0x04) # adress message.extend(adress) # size message.append(size) # message message.extend(data) message.extend([0 for i in range(16-size)]) controlSocket.send(intsToString(message)) # print intsToHexString(message) # printAcknoledgment() def askForRegisterValue(adress, size) : message = [0x52] # read message.append(0x17) # registers message.append(0x04) # adress message.extend(adress) # size message.extend(size) print intsToHexString(message) controlSocket.send(intsToString(message)) def enableSpeaker() : controlSocket.send(chr(0x52) + chr(0x14) + chr(0x04)) def muteSpeaker() : controlSocket.send(chr(0x52) + chr(0x19) + chr(0x04)) def unmuteSpeaker() : controlSocket.send(chr(0x52) + chr(0x19) + chr(0x00)) def test() : writeRegister([0xa2, 0x00, 0x09], 1, [1]) etat = "connecte" print "lauching main loop" askForRegisterValue([0xa2, 0x00, 0x09], [0,1]) while etat == "connecte" : data = receiveSocket.recv(22) chaine = "" for valeur in data : chaine += str(valeur).encode("hex").upper() + " " print chaine print "eos" if len(data) == 4 and (ord(data[3]) & 0x08) == 8 : etat = "deconnecte" print "deconnection" receiveSocket.close() controlSocket.close() def initializeSpeaker() : print "initializing speaker" enableSpeaker() muteSpeaker() writeRegister([0xa2, 0x00, 0x09], 1, [1]) writeRegister([0xa2, 0x00, 0x01], 1, [8]) writeRegister([0xa2, 0x00, 0x01], 1, [0]) writeRegister([0xa2, 0x00, 0x02], 1, [0x40]) writeRegister([0xa2, 0x00, 0x03], 1, [0x05]) writeRegister([0xa2, 0x00, 0x04], 1, [0xdc]) writeRegister([0xa2, 0x00, 0x05], 1, [0x40]) writeRegister([0xa2, 0x00, 0x06], 1, [0]) writeRegister([0xa2, 0x00, 0x07], 1, [0]) writeRegister([0xa2, 0x00, 0x08], 1, [1]) unmuteSpeaker() print "speaker initialized" def printAcknoledgment() : data = receiveSocket.recv(23) while ord(data[1]) != 0x22 : data = receiveSocket.recv(23) chaine = "" for valeur in data : chaine += str(valeur).encode("hex").upper() + " " print "ACK " + chaine def actionsOnMode31(etat, mode) : try : initializeSpeaker() while etat == "connecte" : data = receiveSocket.recv(23) chaine = "" if len(data) == 4 : etat = actionsOnButtons(etat, data) except bluetooth.BluetoothError, inst : print "bluetooth error" print inst pass receiveSocket.close() controlSocket.close() etat = "deconnecte" return def receive(nb) : global etat global mode #receiveSocket.settimeout(2) controlSocket.send(chr(0x52) + chr(0x12) + chr(0x00) + chr(0x22)) return actionsOnMode31(etat, mode) print "pad up : crocodile.wav (http://www.gatorland.com/sounds/crocodile.wav)" print "pad down : plays increment modulo 256" print "B : plays square" mode = 0x30 if mode : connect()