device


périphérique, capteur

Peripheriques standards
Capteurs
Propriétés
Drivers
AUD
clean       coe       COM
DAT       datas       tran       device       dim       drivers
end
fourier
IMA       ITR
KIN
fichier
MEM       MID       module       MOU
options
TCP       traj       type
UDP
validate       var
XXX
Voir aussi

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
dev(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:

clean memory
dim device
edit device