#fichier=2 3 4 5
#appel de prog
cat fichier | awk '{
- print fonc() #affiche 3,5
function fonc(){
- for (i=1; i<=NF; i++) tot+=$(i)
return (tot/NF)
}'
#autre appel de prog
awk -f prog.awk fichier
#tests
x ~ "test" #verifie si x contient "test"
/test/ #verifie si la ligne lue ($0) contient "test"
exemple :
if ($0 ~ "error"){
print "erreur : $0"
}
substitutions
gsub(motif,expression[,variable]) #remplace tout motif par expression de la ligne ou de la variable (ou sub, non global)
exemples :
gsub("True","1")
gsub(/[ \t<>]+/,"") #supprime les caracteres espaces tab < >
tableaux
split($0,elts) #split la ligne et cree un tableau "elts" (array associatif)
for(i in elts){print elts[i]} #parcoure du tableau
if(length(x>0) #test si champ non vide
if ("test" in elts) #test si "test" est present
length(elts) #taille du tableau "elts"
separateurs
FS="<xml>|</xml>|<balise>|</balise>|[ \t]+" #separation xml
system("ls" rep) #execute commandes shell entre guillemets
a=a" "b #simple concatenation
'{ print ($1 < $2) ? "ok" : "nok" }'
changement de separateurs
(exemple, ligne = 2 3 4 5)
BEGIN{OFS=":"} #separateur de sortie (OFS)
{
$1=$1 #force le reformatage de la ligne mémorisée $0 avec OFS
print $0 #affiche 2:3:4:5
}
conversions
(exemple i=3.1415e00)
j=sprintf("%.2f";i) #j=3.14 (float, 2 decimales)
j=sprintf("%.2e";i) #j=3.14e+00 (exponentielle de base 10, 2 decimales)
j=sprintf("%d";i^i) #j=36 (entier, ii)
CONVFMT="%.2f" #conversion de format pour printf (exemple float 2 dec)
variables
FS = "[ \t\n]+" # Field Separator
OFS = ":" # Output Field Separator
ORS = "\n" # Output Record Separator
NF # Number of Fields
NR # Number of Records (nombre de lignes parcourues)
RS = "/" # Record Separator
CONVFMT="%.2f" # Conversion de format numérique pour printf
$0 # ligne lue
$1 # premier champ
The AWK Manual
The Gnu Awk User's Guide
"script exemple"
#! /bin/sh #(shebang, première ligne, interpréteur par défaut. shebang = #!. Verifiez que /bin/sh pointe vers /bin/bash et non /bin/dash)
mafonction(){ #déclaration d'une fonction
param1=$1 #parametre 1
param2=$2 #parametre 2
echo $((param1*(param2-param1))) #retour
}
res=`mafonction 2 5` #appel de la fonction, res=6
mavar=34 #affectation
mavar=6432 #réaffectation (sans espace)
long=${#mavar} #longueur de la variable
vard2=${mavar:0:2} #2 premiers caractères
varf2=${mavar:(( $long-2 ))} #2 derniers caractères
#instruction conditionelle (help if, help test)
if [ -z "$mavar" ] #test si variable est vide (attention aux guillemets et aux espaces) également [ ! -n "$mavar" ]
then
echo $mavar
elif [ -e "fichier" ] #test si fichier existe
then
cat fichier
elif [[ "$mavar" =~ "test" ]] #test si mavar contient "test" (inverse : [[ ! $x =~ "test" ]] )
then
echo $mavar contient "test"
elif [[ "$mavar" =~ ^[[:digit:]]+$ ]] #l'opérateur =~ permet les expressions régulières (man 7 regex).
then #ici : "^" = en début, "[:digit:]" = 0-9, "[[:digit:]]" = [0-9], "+" = 1 ou plusieurs [0-9], "$" = fin. Bref : que des chiffres du début à la fin de $mavar.
echo $mavar est un nombre
else
echo $mavar passe tout les tests
fi
commande=`ls ..` #affectation de commande
$? #le résultat de la dernière commande
$# #le nombre de paramètres du script
$0 #le nom du script
$1 #le premier paramètre
$@ #l'ensemble des paramètres
#exemple case : double ';;' obligatoire entre les cas (comme break; en C)
for param in "$@";do
case $param in
1) echo "un"
;;
2|3) echo -n "deux"
echo " ou trois"
;;
*) echo "?"
;;
esac
done
#rq : pour traiter les options d'un script voir getopts (help getopts)
#version liste
panier="pomme orange poire"
panier+=" kiwi" #avec espace
for fruit in $panier; do echo $fruit; done
#changement de séparateur
IFS=";" #Internal Field Separator
panier="pomme;orange sanguine;poire"
panier+=";kiwi"
for fruit in $panier; do echo $fruit; done
#version tableau
panier=("pomme" "orange" "poire") #entre parenthèses
panier+=("kiwi") #sans espace
for fruit in ${panier[@]}; do echo $fruit; done
#avantage des tableaux :
echo ${#panier[@]} #4 (nombre d'éléments)
echo ${panier[*]} #pomme orange poire kiwi (liste des éléments)
echo ${panier[0]} #pomme (premier élément)
panier[2]="poire william's" #réaffectation et espaces possibles
#boucles for
#tableau ou liste :
for element in ${panier[@]} #avec liste : in $panier
do
echo $element
done
#egalement (bash 3.1) indice sur tableaux :
for i in ${!panier[@]} #${!panier[@]} = 0 1 2 3
do
echo ${panier[i]}
done
#for incremental (help for):
for (( i=0; i<${#panier[@]}; i++ ));do
echo $i : ${panier[i]}
done
#autrement (man seq):
for i in $(seq 0 1 $((${#panier}-1));do
echo $i : ${panier[i]}
done
#sans variable sup (bash 3.1) :
for i in {0..3};do
echo $i : ${panier[i]}
done
#boucle while read (utile pour parser lignes d'un fichier)
IFS=","
cat fichier | while read fruit1 fruit2 autres; do
echo $fruit1 \ #commande multilignes
$fruit2 \
et $autres
done
#version sans pipe (utile pour récupération de variables)
while read fruit1 fruit2 autres; do
echo $fruit1 \ #commande multilignes
$fruit2 \
et $autres
done < fichier
madate=`date +%F` #date au format annee-mois-jour, +"%T" heure:minutes:secondes
cat fichier | gzip -c > fichier_$madate.gz #affiche un fichier "fichier" et le compresse vers un fichier_"date".gz
"longueur et réductions"
${#mavar} #longueur de la variable
${mavar:0:2} #les 2 premiers caractères (var:pos:nombre) ou (var:pos)
${mavar:(( ${#mavar}-2 ))} #les 2 derniers caractères
"substitution"
mavar=${1/%.*} #affectation du param1 sans le dernier .* à mavar
mavar=${variable/motif/chaîne} #avec %motif -> dernier, #motif -> premier, /motif -> tous (//motif)
mavar="test substitution"
sub1=${mavar/% sub*} #sub1=test
sub2=${mavar/#*sub/in} #sub2=institution
si extglob actif (shopt -s extglob) (extension bash) alors +(mot1|mot2|...) possibles, exemple :
test="les chaussettes de l'archiduchesse sont-elles sèches et archi-sèches?"
echo ${test//+(-sèches|et |archi|tte)} #les chausses de l'duchesse sont-elles sèches ?
Exemples de classes de caractères (man 7 regex) :
${test//[[:alpha:][:punct:]]} #sans caractere alphabetique ni de ponctuation
${test//[![:digit:]]} #uniquement les chiffres
"calculs de variables"
mavar=1
((mavar++)) #mettre entre double parenthèses. Ajoute 1 à mavar. Également : let mavar++
echo $((mavar+3)) #affiche 5
res=$((mavar+=2)) #ajoute 2 à mavar, et utilise le résultat comme une variable (préfixe $). Fonctionne aussi sous ksh.
res=$((res%2)) #$res modulo 2
pour les divisions à virgule flottante, passer par ksh 'LC_NUMERIC='C'; echo $((3.0/2))', bc 'echo "scale=1;3/2" | bc ',awk {print 3/2}, perl (print (3/2)), ruby (print 3.0/2), haskell (ghc ou hugs : print(3/2)) ...
"expressions régulières"
#utilisable avec opérateur =~
#exemples :
if [[ "$mavar" =~ ^[0-9] ]] #test si $mavar commence par un chiffre (équivalent : "^[[:digit:]]")
if [[ "$mavar" =~ ^[[:digit:]][[:alpha:]]*[[:digit:]]$ ]] #test si $mavar commence par un chiffre, contient ou non plusieurs lettres et se termine par un chiffre (exemple : "3fois4" )
#voir "man 7 regex" et "help test"
"pause"
read a #attente clavier
sleep 10 #attente 10 secondes
"cut"
echo "test cut ok" | cut -d ' ' -f2 #affiche cut
"awk"
echo "test awk ok" | awk {'print $2'} #affiche awk (parse espaces variables) ( $NF : dernier paramètre )
"groupement"
{ commande1; commande2;}& #execute les commandes dans un sous-shell (utile pour multi-proc) (attention sur une ligne : espace au debut et dernier ';'
(commande1; commande2)>fichier #execute les commandes et redirige la sortie
"hexa - decimal"
printf "%x" 10 #a (ou "%x\n" sous term)
printf "%02X" 10 #0A
printf "%d" 0x0a #10
"aide et exécution"
chmod +x script.sh #rend exécutable un script (./script.sh)
bash -xv script.sh #exécute en affichant les lignes exécutes + verbose
bash -c "help set" #aide sur les options shell
bash -c help #aide sur les commandes shell (puis bash -c "help umask" par exemple)
man bash #aide générale sur bash
man 7 regex #aide sur les expressions rationnelles
help test #aide sur les tests (dans les instructions if, for, while...)
http://tiswww.case.edu/php/chet/bash/bashtop.html
http://www.gnu.org/software/bash/manual/
http://tldp.org/LDP/abs/html/index.html
gprof Profile du programme (gcc -gp ...)
sprof Comme gprof mais pour les bibliothèques partagées (voir aussi oprofile)
oprofile Profile de tout programme ou bibliothèque (mode sudo), voir examples
sloccount Affiche des infos sur le nombre de ligne de programmation du code source (SLOC) et estimation du coût du projet (hors tests et verifications...)
Glade, Anjuta, Codeblocks, Codelite, Qtcreator, Eclipse (+ plugin CDT) IDE pour C et C++
Devhelp doc de programmation
gdb Debugguer C et C++ :
$ gdb ./programme
//si bibliothèque libtools : $ libtool --mode=execute gdb programme (depuis rep source, cf. www.gnu.org)
>l ou list ou list NUMERO_LIGNE //affiche 10 lignes de code
>break LIGNE ou break FONCTION //place un breakpoint, exemple : break MaClasse::afficher ou break 10
>r [arguments] (run) //lance le débuggage
>c ou continue //continue au prochain breakpoint
>s ou step //avance d'une instruction avec entrée vers sous fichier
>n ou next //avance d'une instruction dans le fichier courant
>bt ou backtrace //affiche la pile d'execution
>s //stop
>k //kill
>quit
ddd et cgdb interfaces graphiques pour gdb
valgrind verifie les fuites de mémoires
check tests unitaires pour C
libtool utilitaire pour bibliothèques
autotools utilitaires pour makefiles et packages.//note : configure --prefix=rep (repertoire d'installation, utile pour un package de binaires)
objdump affiche et desassemble un programme (objdump -d prog > prog.dmp)
strace <prog> pour analyser les appels systèmes d'un programme
g++ main.cpp -o prog compile un programme C++ (gcc -> erreur gxx_personality_v0)
gcc main.cpp -o prog compile un programme C
int main(int argc, char* argv[]){} fonction principale en C et C++ :
argc nombre d'arguments, argv tableau d'arguments.
argv[0] -> nom du programme.
si argv[argc+1]==0 alors argc dernier argument
Check : un framework de tests unitaires pour C
cf : http://check.sourceforge.net/doc/check_html/check_3.html#SEC4
- créer l'arborescence adequate (src, tests)
- créer les Makefile.am (en réutilisant ceux des exemples du paquage check)
- autoscan; : pour generer un premier fichier configure.ac. Ajoutez-y AM_PROG_CC_C_0 LT_INIT() et AM_PATH_CHECK()
- touch ChangeLog README AUTHORS NEWS;
- aclocal; autoreconf --install; make;
- make check; pour lancer les tests unitaires
voir aussi docs automake et autoconf
gcov avec check (uniquement gcc)
pour la couverture des tests check avec gcov :
- dans le src/Makefile.am ajoutez des CFLAGS = -O0 --coverage pour la librairie ET pour le programme source (pas celui de test),
exemple :
malib_la_CFLAGS = -O0 --coverage
monprog_CFLAGS = -O0 --coverage - faites un autoreconf --install pour recréer les Makefile
- faites un test check : make check : dans le repertoire src, gcov a mis à jour un .gcda qui contient les informations sur les lignes de codes sources de la librairie utilisée.
lcov, pour un rapport gcov html
dans le répertoire src, contenant un .gcda suite au test :
lcov --directory . -c -o coverage.info //analyse tout les .gcda du répertoire et crée un .info
genhtml -o ../coverage_report -t "coverage report" coverage.info //créé un répertoire coverage_report contenant un rapport html (index.html)
voir aussi ggcov.
les caractères spéciaux :
- espace =
& = &
€ = €
< = <
> = >
© = ©
œ = œ
à = à
â = â
ç = ç
è = è
é = é
ê = ê
ë = ë
î = î
ô = ô
² = ²
³ = ³
Pour plus de caractères :
http://www.w3.org/TR/html401/sgml/entities.html
http://www.commentcamarche.net/contents/html/htmlcarac.php3 [01/02/2009]
http://www.chami.com/tips/internet/050798I.html [29/07/2009]
*** puces ***
points :
<ul> <li> texte </li> <li> texte </li> </ul>
chiffres ordonnés :
<ol> <li> texte </li> <li> texte </li> </ol>
*** mozilla / iceape ***
pour les couleurs de fond de la balise body
mettre table principale alignée au centre
et marges à 0 auto
<body style="margin: 0 auto; background:#038">
<table align="center">
...
</table>
</body>
et rajouter un min-height sur une position absolute dans la class body
javafx : open scenebuilder 2
scenebuilder2 est disponible à l'adresse suivante:
http://www.oracle.com/technetwork/java/javafxscenebuilder-1x-archive-2199384.html#javafx-scenebuilder-2.0-oth-JPR rubrique JavaFX Scene Builder 2.0 Related Downloads
application web avec le serveur Apache Tomcat et l'IDE Eclipse
Probleme de LogFactory non trouvé : ajoutez le tomcat-juli.jar dans les propriétées du serveur tomcat sous Eclipse (voir eclipse.org).
Faites bouton-droit > Open, sur le serveur, puis "Open launch configuration". Ensuite, onglet Classpath, User Entries, ajoutez le tomcat8-juli.jar (distribué avec Tomcat8 en principe).
Probleme JSF2 java.lang.IllegalStateException: Could not find backup for factory javax.faces.context.FacesContextFactory.
Ajouter les jars jsf.api-2.xx.jar et jsf-impl-2.xx.jar (disponibles sur les dépôts Maven) dans le dossier lib de WEB-INF.
Probleme d'adaptateur serveurs Tomcat manquants : installez les packages "JST Server Adapters" et extensions depuis le repository d'eclipse (Install new software...).
keystores jks pour certificats SSL
création d'un keystore et importation d'une clé publique :
keytool -import -file server_cert.cer -keystore keyst.jks
importation d'un certificat privé pfx :
keytool -importkeystore -srckeystore cert.pfx -srcstorepass secret -destkeystore keyst.jks -srcstoretype pkcs12 -deststoretype jks
appel du keystore dans un programme java :
System.setProperty("javax.net.ssl.trustStore", "/chemin/keyst.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "password");
...
conversions
Int vers String :
String.valueOf(monInt);
String vers Int :
Integer.parseInt(leString);
Array vers List :
Arrays.asList(Array a);
List<String>liste = Arrays.asList("Alice","Bob","Charles");
plantage socket
java.net.SocketException: Network is unreachable
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
...
Editez /etc/sysctl.d/bindv6only.conf
et remplacez net.ipv6.bindv6only = 1
par net.ipv6.bindv6only = 0
puis echo 0 > /proc/sys/net/ipv6/bindv6only
plantage cxf
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/cxf.xml]; nested exception is org.springframework.beans.FatalBeanException: Invalid NamespaceHandler class [org.apache.cxf.jaxws.spring.NamespaceHandler] for namespace [http://cxf.apache.org/jaxws]: problem with handler class file or dependent class; nested exception is java.lang.NoClassDefFoundError: org/apache/cxf/frontend/spring/ClientProxyFactoryBeanDefinitionParser
avec Apache cxf 3.0.1 : copiez la bibliothèque cxf-rt-frontend-simple-3.0.1.jar dans le répertoire WEB-INF/lib/
ajout de paquet
Après un ajout d'un fichier sty dans un sous-répertoire de texmf (/usr/share/texmf/tex/latex/..., /usr/share/texmf-texlive/tex/latex/...), executer la commande texhash pour mettre à jour le réferentiel tex.
Les packages latex au format .dtx peuvent être dépaquetés si un fichier .ins est également present avec la commande latex fichier.ins. Des fichiers .sty devraient alors être present, à déplacer dans un repertoire latex puis texhash.
http://www.tex.ac.uk/cgi-bin/texfaq2html?label=installthings
docs
Des docs latex et bibtex sur :
/usr/share/textmf-texlive/doc/latex/... (les docs des paquets)
http://www.lsv.ens-cachan.fr/~markey/bibla.php (le style alpha-fr y est disponible)
http://latex.developpez.com/
http://www.grappa.univ-lille3.fr/FAQ-LaTeX/
bibtex
Les fichiers de styles bibtex (.bst) sont à placer dans un sous-répertoire /usr/share/texmf/bibtex/bst/
bibtex utilise les fichiers .aux créé par lors d'une première compilation latex et créé un fichier .bbl à partir du fichier .bib.
Le fichier .bib est à renseigner manuellement (contient les références des articles).
Exemple : bibtex memoire (utilise les fichiers memoire.aux et memoire.bib pour créer un fichier memoire.bbl). Executer la commande bibtex pour afficher d'avantage de message d'erreurs (man bibtex).
Une fois le fichier .bbl créé (bibliographie au format bibtex), recompilez en latex pour la mise en place de la bibliographie.
makeindex
Pour avoir un joli index sur 2 colonnes avec des points et afficher l'ordre alphabetique :
- creez un fichier style.ist
- ajoutez-y les lignes suivantes :
heading_prefix "{\\bfseries\\hfil "
heading_suffix "\\hfil}\\nopagebreak\n"
heading_flag 1
delim_0 "\\dotfill"
delim_1 "\\dotfill"
delim_2 "\\dotfill" - dans Kile, Configure > Tools > Build > MakeIndex modifiez l'option: -s 'style.ist' '%S.idx'
editeurs
Sous Linux, l'éditeur Latex Kile, est assez complet et agréable à l'utilisation.
Sous Windows, après avoir installé MikTex pour la base Latex (et sa gestion), l'éditeur TexMaker est du même acabit.
caractères latin
Si les \textendash (ou --) ne s'affichent pas (avec itemize par exemple), utilisez les packages lmodern, aeguill, le fontenc T1 et le french babel :
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage{aeguill}
caractères spéciaux
œ = \oe ( n\oe{}ud ou n{\oe}ud )
& = \&
... = \dots
α = \alpha
β = \beta
γ = \gamma
\ = \textbackslash
using GDB
cf. www.gnu.org
$ libtool --mode=execute gdb program
local install (for testing)
$ libtool --mode=install cp program ~/a_directory/bin/
or
$ libtool --mode=install install program ~/a_directory/bin/
may add the library too :
$ libtool --mode=install install lib_program ~/a_directory/lib/
$ export LD_LIBRARY_PATH=~/a_directory/lib
or
$ sudo ldconfig -n ~/a_directory/lib
exemple :
OBJETS= main.o //(et autres...)
CC= gcc //gpp si C++
all: prog
%.o: %.c
$(CC) -02 -Wall -ansi -pedantic -ffloat-store -c -g -o $@ $<
clean :
rm -f *.o;rm monprog;
prog: $(OBJETS)
$(CC) -g -o monprog $(OBJETS) -L/usr/X11R6/lib -lm
open (FICHIER, ">resultats"); //créer fichier en écriture ">"
open (LS, "ls -rtl |"); //récupère la sortie d'une commande "|" et place dans <LS>
while(<LS>){
print $_; //parcoure <LS>. Ligne dans $_. Affiche $_.
print FICHIER $_; //écrit $_ dans fichier résultats
}
close (LS);
close (FICHIER);
Zend Framework
Prerequis Apache
activer le module rewrite
dans le virtualhost, pour le module Zend Application Router, mettre l'option: AllowOverride All
librairies
Sous Debian, pour un site portable, copier les librairies de /usr/share/php/Zend/ vers /le_site/library/
customiser le theme claro
node compile.js apres avoir modifié les fichiers less.
Le script suivant permet de tester une WiiMote (le contrôleur sans fil en forme de télécommande de la console Wii de Nintendo) sur un PC (Linux de préférence).
Réalisé d'après le tutoriel "Programmer la WiiMote en python" de Jean-Pierre Mandon, paru dans le magazine "GNU/Linux Magazine / France" de février 2009.
Une WiiMote se connecte au PC via une clé usb-bluetooth.
Une fois la connexion bluetooth établie, la WiiMote peut être utilisé comme télécommande de contrôle, joypad avec vibration intégré, caméra infra-rouge,
mini-haut-parleur et détecteur de mouvement (le tout pour 40€ chez un revendeur de console).
Le script nécessite les éléments suivants :
- une WiiMote Nintendo
- une clé bluetooth (ou autre contrôleur bluetooth pour PC)
- le paquet bluez pour python (et l'environnement python ad hoc)
Attention aux indentations sous Python (prises en compte syntaxiquement)
Fonctionnement :
- brancher votre clé-bluetooth
- lancer le script
- appuyer sur boutons 1 et 2 en même temps de la WiiMote
- attendre la connexion (10 secondes max)
- tester (bouton A pour quitter)
#! /usr/bin/python
import bluetooth
import threading
import time
etat="deconnecte"
mode=30
pos=1
mot="off"
adresse=None
essai=0
### Recupere l'adresse MAC de la WiiMote
def lookup():
global adresse
print "en attente : pressez les touches 1 et 2 ..."
peripheriques=bluetooth.discover_devices(lookup_names=True)
for appareil in peripheriques:
print("peripherique:"+appareil[1]+" adresse:"+appareil[0])
if appareil[1]=="Nintendo RVL-CNT-01": adresse=appareil[0]
### Connexion de la WiiMote
def connect():
global etat, mode, adresse, essai, receivesocket, controlsocket
try :
if etat!="connecte" and essai<3:
essai+=1
receivesocket = bluetooth.BluetoothSocket(bluetooth.L2CAP)
controlsocket = bluetooth.BluetoothSocket(bluetooth.L2CAP)
receivesocket.connect((adresse, 0x13))
controlsocket.connect((adresse, 0x11))
except bluetooth.BluetoothError:
time.sleep(5)
print "tentative de connexion "+adresse+" ..."
connect()
if receivesocket and controlsocket and etat!="connecte":
etat="connecte"
print "connexion acceptee. Touche A pour quitter"
allumeled(1)
# thread de reception
wii_thread=threading.Thread(None,receive,None,(1,),{'nom':"cc"})
wii_thread.start()
else:
if etat!="connecte": print "connexion rejetee (adresse "+adresse+")"
return
### Réception des données
def receive(nb,nom=''):
global etat, mode, pos
receivesocket.settimeout(0.1)
while etat=="connecte":
try:
data=receivesocket.recv(23)
chaine=""
if len(data):
for valeur in data:
chaine=chaine+str(valeur).encode("hex").upper()+" " # mise en forme hexadecimale
if chaine[:12]=="A1 "+str(mode)+" 00 08 ": # touche A (attention mode 30 par def.)
etat="deconnecte"
print(chaine)
elif chaine[:12]=="A1 "+str(mode)+" 02 00 ": # pad gauche
print(chaine)
if pos < 4 : pos+=1
else : pos=1
allumeled(pos)
elif chaine[:12]=="A1 "+str(mode)+" 01 00 ": # pad droit
print(chaine)
if pos > 1 : pos+=-1
else : pos=4
allumeled(pos)
elif chaine[:12]=="A1 "+str(mode)+" 10 00 ": # touche +
print(chaine)
accelerometre("on")
elif chaine[:12]=="A1 "+str(mode)+" 00 10 ": # touche -
print(chaine)
accelerometre("off")
elif chaine[:12]=="A1 "+str(mode)+" 00 80 ": # touche home
print(chaine)
if mot == "off" : moteur("on")
else :
moteur("off")
allumeled(pos)
else:
print(chaine)
except bluetooth.BluetoothError:
pass
receivesocket.close()
controlsocket.close()
etat="deconnecte"
print "deconnexion"
return
### Active l'accéléromètre
def accelerometre(activer):
global mode
#affiche acceleromettre (mode 31)
if activer == "on" :
frame=chr(0x52)+chr(0x12)+chr(0x00)+chr(0x31)
controlsocket.send(frame)
mode=31
elif activer == "off" :
frame=chr(0x52)+chr(0x12)+chr(0x00)+chr(0x30)
controlsocket.send(frame)
mode=30
### Allume une LED
def allumeled(led):
led=0x08<<led
print hex(led)
frame=chr(0x52)+chr(0x11)+chr(led)
controlsocket.send(frame)
### Active le moteur vibreur
def moteur(activer):
global mot
if activer == "on" :
frame=chr(0x52)+chr(0x11)+chr(0x01)
controlsocket.send(frame)
mot="on"
elif activer == "off" :
frame=chr(0x52)+chr(0x11)+chr(0x00)
controlsocket.send(frame)
mot="off"
### Fonction principale
lookup()
if adresse != None : connect()
Notes :
des applications sont possibles avec la camera infrarouge de la wiimote et son tracker 4 points
telles que le tracking de pointeurs infra-rouges ou le head-tracking
(voir projet wii de Johnny Chung Lee : http://johnnylee.net/projects/wii/)