périphérique, capteur
Peripheriques standards
Des périphériques standards existent (selon la machine et le système):
souris
audio
Ils peuvent être redéfinis par:
device(id)type("MOU"): associe la souris au périphérique id.
device(id)type("AUD")dim(n): associe l´audio au périphérique id.
device(id)type("SOR")dim(n): associe la FFT de l´audio au périphérique id.
Capteurs
Des capteurs sont associés à des entrées variées (intertrax, polhemus, caméra, ...).
Les données captées sont des vecteurs de dimension variables.
Il faut programmer des drivers en utilisant:
des fichiers fichiers écrits par le driver voir FIC
la mémoire partagée, voir un exemple dans WebCam.c.
des sockets UDP, voir un exemple dans device_UDP_serveur.func
et device_UDP_client.func.
des sockets TCP
une MIDI
Propriétés
device(id)com1 com2 ...
retourne la propriété com1 com2 ... du périphérique id.
device(id)com1 com2=p
permet de redéfinir la propriété com1 com2 du
périphérique id.
Toutes les combinaisons de commandes sont possibles, il suffit que les drivers les traitent.
clean
coe
tran
dim
module
period
time
var
clean
device(id)clean
Fait un "flush" sur le périphérique id.
coe
device(id)coe=c1,c2,c3;
Multiplie le vecteur capteur par (c1,c2,c3).
tran
device(id)tran=x,y,z;
Les valeurs de device id seront translatées de (x,y,z).
dim device(id)
Retourne le nombre np de vecteurs et leur dimension dimp.
dim device(id)=np,dimp
Modifie ces dimensions.
Remarques:
(1,3) est l´initialisation par défaut.
Pour l´intertrax ("ITR"): np=1, dimp=3 (orientation rx, ry, rz).
Pour un polhémus ("POL"): np=1, dimp=6 (positionx y z, et orientation rx, ry, rz).
Pour une image ("IMA"): np=nombre de lignes, dimp=nombre de colonnes.
module
device module;
Retourne la moyenne des amplitudes de tout les périphériques actifs.
device(id)module;
Retourne l´amplitude du device(id).
period
device(id)period=n;
Affecte un buffer de n échantillons pour calculer la période.
device(id)period(0);
Retourne le buffer des n échantillons.
device(id)period;
Retourne la période de l´amplitude du signal (stocké en FIFO dans le buffer).
time
device(id)time=t;
Précise un timeout.
var
device(id)var;
Reçoit les datas du périph id (NIL si celui-ci est en train d´écrire).
device(id)var=datas;
Envoie datas au périphérique id.
Drivers
driver_anyflo.
driver_C.
Langage anyflo
Un driver écrit en langage anyflo envoie des vecteurs par la commande:
device(id)var=v;
Ces vecteurs sont récupérés dans anyflo par la commande:
p=device(id)var;
Langage C
Des exemples sont donnés dans:
mem_part.htm.
Gestion (très simple) de la mémoire partagée.
WebCam.c
Driver d´une web cam.
itrax
kroonde
sound
webcam
itrax_mem.exe
C´est un programme permettant d´accéder à l´Intertrax via la mémoire partagée.
Il faut:
1) Lancer Isdemo32.exe
Detect -> Port 1 38400 Bauds
Accept
Quitter
2) Lancer itrax_mem.exe
3) Pour initialiser:
type("MEM")device(1)name("ITRAX");
4) Pour read:
p=device(1);
itrax_soc.exe
C´est un programme permettant d´accéder à l´Intertrax via une socket.
Il faut:
1) Lancer comme ci-dessus Isdemo32.exe
2) Lancer itrax_soc.exe
Il faut arrêter et relancer le driver chaque fois qu´anyflo est relancé
3) Pour initialiser:
type("UDP")device(1)name("host_driver")period(1)float
host_driver est le nom de l´ordinateur sur lequel tourne itrax_soc.exe
(ce peut être le même que celui sur lequel tourne anyflo.exe)
4) Pour read:
p=device(1);
kroonde_mem.exe
C´est un programme permettant d´accéder au KROONDE. Il faut:
1) Brancher le Kroonde sur le réseau.
2) Lancer kroonde_mem.exe (qui ouvre la mémoire partagée "KROONDE")
3) Pour initialiser un périphérique:
type("MEM")device(1)name("KROONDE")
4) Pour read:
p=device(1): Retourne les valeurs des capteurs présents.
sound0.exe
C´est un programme permettant d´accéder à Directx via la
mémoire partagée. Il faut:
Lancer anyflo.exe
Un fichier threadID est écrit contenant le number ID d´anyflo
Il peut être utile de faire (en général il n´y a rien à faire)
write system
Pour forcer l´écriture du fichier threadID
Lancer sound0.exe
Lit le fichier threadID, les deux programmes sont alors attachés
Initialiser:
type("MEM")name("SOUND0")device(1);
Lire les sons:
device(1)read("nom0.wav")number(0);
device(1)read("nom1.wav")number(1);
etc ...
Jouer le son number n
device(1)play(n)
Il est possible d´ajouter des sons par:
device(1)read("nomn.wav")number(n);
device(id)cut(s)
retourne 1 si le son s joue, sinon 0
device(id)STOP(s)
Coupe le son s
device(id)period(s,p)
Précise la périodicité (p=0: no, p=1: yes) pour le son s
Exemples
device(1)period(7,1): Rend le son 7 périodique
device(1)period(7,0): Rend le son 7 non périodique
device(1)no
Détache le driver d´anyflo (sound0 n´est plus accessible)
device(1)yes
Attache le driver à anyflo (sound0 est de nouveau accessible)
sound2.exe
C´est un programme permettant d´accéder à l´audio via la mémoire partagée.
Pour initialiser:
type("MEM")device(1)name("AUDIO");
Pour read:
p=device(1)read;
WebCam.exe
C´est un programme permettant d´accéder à l´image de la caméra via la
mémoire partagée. Il faut:
1) Lancer WebCam.exe avec les options:
WebCam n=c x=dx pos=x,y a=t v=m
c=cote de l´image traitee (15 par défaut)
dx=cote de l´image saisie (120 par défaut)
pos=x,y position inferieure gauche (0,0 par défaut)
ou pos=win lit y comme deuxieme valeur dans le fichier win
attend t images par secondes (0 par défaut)
v=variation minimum de la luminance (0 par défaut)
1) Lancer une web cam, ajuster la dimension de l´image à celle de WebCam.exe
et l´amener sur celle-ci. Il faudra veiller à ce qu´elle reste dessus
(en particulier
après avoit cliqué dans la fenêtre anyflo).
3) Lancer anyflo.exe avec une fenêtre telle que l´image précédente soit visible.
4) Initialiser:
type("MEM")name("WEBCAM")device(1);
5) Lire la caméra:
device(1)image: retourne l´image luminance de dimension c*c
device(1)image speed: retourne l´image vitesse
device(1)CG: retourne les 3 CG, centre, gauche et droite de l´image
device(1)CG(v): retourne v fois les vitesses des 3 CG
device(1)CG image: retourne les 3 CG et l´image
Remarque:
Les lectures sont faites à la volée pour assurer le temps réel, mais
le retour de la commande device peut être NIL, il conviendra donc
de tester la valeur lue. Par exemple:
p=device(1)CG;n=dim(p);if(n==9){cg=p;...} else return;
p=device(1)image;n=dim(p);if(n==(c*c)){im=p;...} else return;
p=device(1)CG image;n=dim(p);if(n==(9+c*c)){cg=p[0,8];im=p[9,c*c+8];...} else return;
device(1)wait permet des lectures bloquées, ce qui assure que les
valeurs sont bien retournées (il n´est pas nécessaire de faire de test)
mais ce qui peut ralentir l´interaction.
end device(id)
Clot le périphérique id
Dans le cas d´une socket UDP celle-ci est stoppée.
device traj
device traj t vol(id)
Retourne la propriété devicede la trajectoire de type t
du volume id.
device(c)traj t vol(id)
Modifie cette propriété.
Remarquee:
la trajectoire de type t du volume id est modulée par c * pos,
où pos est la valeur du device idv.
device type
syntaxe
AUD
COM
DAT
IMA
ITR
LIR
MEM
MID
MOU
SOR
TCP
UDP
XXX
Syntaxe générale: device(id)type("TYP")...
Crée le périphérique d´identificateur
id, de type TYP
et de propriétés par défaut.
Certaines propriétés propr1, propr2, ... du périphérique peuvent être déclarées au moment
de la déclaration par les options:
device(id)type("TYP")propr1(p1)propr2(p2)...;
Elles peuvent être modifiées par:
propri device(id)=pi;
propri device(id);
Retourne la propriété propri du device id.
TYP is:
AUD
COM
DAT
ITR
LIR
MEM
MID
MOU
SOR
TCP
UDP
XXX
Options:
dim(dimx,dimy,dimz):
TYP=AUD: l´audio est initialisé à 2^dimx échantillons.
TYP=IMA: dimx et dimy sont les dimensions de la fenêtre de capture.
poi(x,y,z):
TYP=IMA: x et y sont les coordonnées du coin bas gauche de la fenêtre de capture.
var(np,dimp): un buffer de np vecteurs capteurs de dimension dimp est réservé.
coe(cx,cy,cz): définit les coefficients multiplicateurs: device(id)coe(cx,cy,cz).
tran(dx,dy,dz): définit le déplacement: device(id)tran(dx,dy,dz).
debug(d): mode debug.
envelope(ne): définit le pas de l´envelope: device(id)envelope(ne).
yes(1):
TYP=IMA: la fenêtre de capture prend la position cliquée.
if TYP=MEM: la lecture est bloquante.
simple TYP=MEM: dialogue hors protocole anyflo
(il ne peut exister qu´un seul périph de ce type) voir
Comment échanger des informations entre un programme C et anyflo
device(id)type("AUD") dim(n)
L´audio (de dimension 2^n) est associé au périphérique id
device(id)var: retourne audio var.
device(id)type("COMn")
Port série n.
device(id)type("DAT")name("name")
Les valeurs du capteur sont stockées en ASCII dans le fichier name selon la matrice (np*dimp):
V0=c0,0 c0,1 ... c0,dimp-1
V1=c1,0 c1,1 ... c1,dimp-1
V2=c2,0 c2,1 ... c2,dimp-1
...
Vnp-1=cnp-1,0 cnp-1,1 ... cnp-1,dimp-1
Exemple:
1.1 1.2 1.3
2.1 2.2 2.3
A l´initialisation, ce fichier est lu et placé dans var device(id) en float,
ses dimensions (np,dimp) sont placées dans dim device(id).
read device(id): relit le fichier name (en cas de changement de celui-ci).
Par défaut np=dimp=1 (une seule valeur).
dimp est le nombre de champs (capteurs en parallèle).
np est le nombre d´echantillonnages.
dim device(id)
Retourne np,dimp,cpt (cpt est un compteur permettant de lire circulairement).
var(n)device(id)
Retourne le vecteur Vn (avec 0<=n<np).
var(n,i) device(id)
Retourne le vecteur Vn[i] (avec 0 <= i < dimp).
var(n,i1,i2)device(id)
Retourne le vecteur Vn[i1,i2] (avec 0 <= i1 < dimp && 0 <= i2 < dimp).
read device(id)
Relit le fichier name (s´il a été changé) dans le device id.
device(id)type("KIN")
KINET (EN DÉVELOPPEMENT).
device(id)type("LIR") name("fic")dim(n)
le fichier fic contenant n caractères est associée au périphérique id.
var perip(id) retourne le contenu ascii du fichier fic
Un driver écrit en permanence des valeurs ascii dans le fichier fic.
Remarque: ce type de périphérique ne peut être connu que par son numéro
(puisque son name référence le fichier à lire).
Voir device_READ.js qui lance 2 anyflos exécutant respectivement les fonctions
device_READ_1.func qui est le serveur et
device_READ_2.func qui est le client.
device(id_device)type("IMA")
Définition d´un périphérique de type image.
Options:
dim(dx,dy): dimension de l´image (15,15 par défaut).
poi(x,y): position du coin bas-gauche de l´image (0,0 par défaut).
device(id_device)var image(id_ima);
: saisit, et retourne dans
l´image id_ima, l´image de la fenêtre (x,y,dx,dy).
device(id)type("ITR") number(p)
Ouvre l´Intertrax sur le port p pour le périphérique id. Il aura fallu d´abord faire:
1) Connect Itrax on serial (USB3)
2) isdemo32.32.exe
Detect -> Port 1 38400 Bauds
Accept
Quit
Il est également possible de le lire avec la mémoire partagée:
device(id)type("MEM") number(p)
Il aura fallu d´abord lancer le driver itrax_mem2.exe
device(id)type("MEM") name("nnn")
Mémoire partagée de nom "nnn"
Options:
dim=n1,n2: de dimensions n1=dimension du buffer du serveur (14401 = 4*120*120+1 par défaut)
et n2=dimension du buffer du client (100 par défaut).
simple: communication directe hors protocole anyflo, le serveur écrit directement des
caractères dans la mémoire partagée, le client les lit directement au même endroit.
voir Comment échanger des informations entre un programme C et anyflo.
Premier xemple :
Cliquer sur shared_memory.js
Ce script java lance quatre anyflos.
Dans la fenêtre haut-gauche tourne le serveur:
il capte les positions de la souris et les envoie aux clients.
Dans les fenêtres de droitee tournent deux clients,
Ils récupèrent la position envoyée par le serveur et s´en servent pour
positionner des volumes.
Dans la fenêtre bas_gauche tourne un help.
Fonctionnement:
Déplacer la souris dans la fenêtre du serveur.
On voit alors les volumes dans les clients prendre les mêmes positions.
Les codes sont dans:
env/shared_memory_serveur.func.
env/shared_memory_client1.func.
env/shared_memory_client2.func.
env/shared_memory_help.func.
Deuxièmexemple :
Cliquer sur audio_memory.js
Ce script java lance deux anyflos.
Dans la fenêtre haut-gauche tourne le serveur:
il capte le audiuo max et l´envoie aux clients.
Dans ld fenêtre audessosu tourne le client,
Il récupère la valeur envoyée par le serveur et s´en servent pour
positionner des volumes.
Parler dans le micro.
On voit alors les volumes dans les clients prendre les mêmes positions.
Les codes sont dans:
env/audio_server.func.
env/audio_client.func.
Exemple
Un exemple programmé est le driver d´une webcam dans
WebCam.c.
device(id)type("MID") number(p)
EN DÉVELOPPEMENT
Ouvre MIDI sur le port p pour le périphérique id
device(id)type("MOU")
La souris est associée au périphérique id.
Options:
mouse(m): mouse(m().
normal: mouse normal.
device(id)var
Retourne mouse.
device(id) [number(port)]type("TCP")lead
EN DÉVELOPPEMENT
Etablit un serveur en protocole TCP/IP sur le port (12345 par défaut) de la machine
type("TCP") name("host") device(id) [number(port)] [char] [float] [time att]
Etablit un client en protocole TCP/IP communiquant avec un serveur lancé sur la machine host par
le port (12345 par défaut)
Si char est présent: Mode char (par défaut)
Si float est présent: Mode float (la string passée par la socket
est décodée en flottants)
Définit le timeout en millisecondes (1000 par défaut)
device(id)type("SOR") dim(n)
La FFT (de dimension 2^n) est associé au périphérique id.
device(id)type("UDP")
Etablit un serveur en protocole UDP communiquant avec la machine.
Options:
dim(n): dimension maximum des transferts (n=1024 par défaut).
lead: ouverture comme serveur.
texture(port): port utilisé pat la socket (port=8889 par défaut).
name("Ms"): Ms=nom du serveur.
name("Ms")name("Mc"): Ms=nom du serveur, Mc=nom du client.
name("xxx.xxx.xxx.xxx"): IP de la machine (par exemle "127.0.0.1").
Si cette option est absente le nom de l´ordinateur local est pris par défaut.
Exemple:
Si un anyflo tourne sur la machine de nom M1 et si un autre anyflo tourne
sur une autre machine de nom M2 (ou la même), les sockets permettent le dialogue entre ces 2 programmes:
Sur la machine M1 lancer un serveur UDP:
device(1)type("UDP")lead name("M1")
Sur la machine M2 lancer un client UDP:
device(2)type("UDP")name("M1")name("M2");
Sur la machine M2 envoyer un message:
device(2)var="ABC";
Sur la machine M1 recevoir ce message:
p=device(1)var; /* p contient "ABC" */
device(id)type("XXX")
Définit un périphérique de name XXX (différent des types standadrs) qui devra être géré
par l´utilisateur dans la fonction
PERIPH_UTIL(long *pd0, long *suite, long *end, long *pd_eg)
du fichier
utilb.c.
device validate
device(id)validate
Retourne 1 si le périphérique id est validé, 0 s´il est inhibé et -1 s´il n´est pas défini.
device(id)validate=v
Valide (si v=1) ou inhibe (si v=0) le périphérique id
end device(id)
Ferme le périphérique id.
Périphériques prédéfinis
mouse.
Si le système comporte une souris, il faut metter son indicateur à 1 dans
le fichier envb.h
Interactivement, ´no mouse´ déconnecte la souris et ´yes mouse´ la
connecte.
Voir aussi: