Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2010-08-25 17:50:05 pilotage DMX via UDP

ogre
membre
Date d'inscription: 2009-09-15
Messages: 16

pilotage DMX via UDP



hello,

Avec iMal, nous sommes en train de bosser sur la mise en place du festival http://www.imal.org/en/activity/media-f … urope-2010. Plus particulièrement sur le travail de Antoine Schmitt : http://www.citysleeplight.com/[/url]. Ici à Bruxelles, nous projetons ça avec des lampes dmx que nous pilotons via la fonction UDP de la librairie hypermedia.net de processing.

voici le bout de code que j'utilise pour envoyer le tableau de contenu DMX via UDP.

import hypermedia.net.*;

// See http://vvvv.org/sites/default/files/user-files/LCplus%20Reference%20v2.0a1.pdf (p83)
// and discussion on http://vvvv.org/forum/artnet-to-lanbox

public class DMXUDPsender {
  UDP udp;
  String pLanboxIP;
  int pPort;
  int chanR;
  
  DMXUDPsender(String aip, int achanR) {
    pLanboxIP = aip;
    // supposes that channels are in the order RGB
    chanR = achanR;
    pPort = 4777;
    udp = new UDP(this);
  }
  
  void  free() {
    if (udp != null) {
      udp.close();
      udp = null;
    }
  }
  
  // value is 0..255
  void resend(int value) {
    byte valByte = byte(value);

    // header 4 bytes
    // message length = 6 (header) + 3 (channels) + 1 padding = 10
    // total = 14 
    int nbBytes = 20;
    byte [] frame = new byte[nbBytes];
    // header
    frame[0] = byte(0xC0);
    frame[1] = byte(0xB7);
    frame[2] = byte(0x0);
    frame[3] = byte(0x0);
    // message 
    frame[4] = byte(0xCA); // type Buffer write
    frame[5] = byte(0x01); // layer A
    frame[6] = byte(0x00);  frame[7] = byte(0x05); // message length = 9
    frame[8] = (byte)(floor(chanR/256)); frame[9] = (byte)(chanR % 256); // first channel
    frame[10] = frame[11] = frame[12] = valByte; // channel value
    frame[20] = byte(0xFF); // padding
    udp.send(frame, pLanboxIP, pPort);
  }
}

Ce code fonctionne très bien pour piloter une série de spot écoutant le même canal,
mais je n'arrive pas à produire un code pour piloter plusieurs spots indépendamment -écoutant des canaux différents-.
J'ai du raté un truc du protocole DMX. Quelqu'un a-t-il des conseil à me donner pour arriver à mon but?

Hors ligne

 

#2 2010-08-31 16:32:29 Re : pilotage DMX via UDP

ogre
membre
Date d'inscription: 2009-09-15
Messages: 16

Re: pilotage DMX via UDP



voila la réponse à ma question au cas où ce poste intéresse quelqu'un un jour...

Il faut adresser les spots DMX à partir de l'adresse 7 puis 10, 13 ,16... et ainsi de suite

DMXUDPsender dmxUdpSender;

void setup() {
  String dmxupdip = "192.168.1.77";
  dmxUdpSender = new DMXUDPsender(dmxupdip);
}

void stop() {
  dmxUdpSender.free();
  dmxUdpSender = null;
}

void draw() {
  int [] ValueF={
    50,25,31,56,98,50}; /// Tableau de valeur contenant les niveaux RVB pour chaque spot
  dmxUdpSender.resend(ValueF);
}







import hypermedia.net.*;

// See http://vvvv.org/sites/default/files/user-files/LCplus%20Reference%20v2.0a1.pdf (p83)
// and discussion on http://vvvv.org/forum/artnet-to-lanbox

public class DMXUDPsender {
  UDP udp;
  String pLanboxIP;
  int pPort;

  DMXUDPsender(String aip) {
    pLanboxIP = aip;
    // supposes that channels are in the order RGB
    pPort = 4777;
    udp = new UDP(this);
  }

  void  free() {
    if (udp != null) {
      udp.close();
      udp = null;
    }
  }

  // value is 0..255
  void resend(color [] data) {

    // header 4 bytes
    // message length = 6 (header) + data.length  + 1 padding 
    // total = 14 

    int datalen = data.length;
    int bufferlen = 4 + 6 + datalen +1;

    int lngMess = 6 +datalen;

    byte [] buffer = new byte[bufferlen];
    int index=10;

    // header
    /*0*/    buffer[0]   = byte(0xC0);
    /*1*/    buffer[1] = byte(0xB7);
    /*2*/    buffer[2] = byte(0x0);
    /*3*/    buffer[3] = byte(0x0);
    // message 
    /*4*/    buffer[4] = byte(0xCA); // type Buffer write
    /*5*/    buffer[5] = byte(254); // layer A
    /*6*/    buffer[6] = (byte)(HighByte(lngMess)); // HighByte length HEXA
    /*7*/    buffer[7] = (byte)( LowByte(ngMess)); // LowByte lenght HEXA
    /*8*/    buffer[8] = (byte)(HighByte(0x03)); //HighByte first channel
    /*9*/    buffer[9] = (byte)( LowByte(0x03)); // LowByte first channel

    for(int i=10 ; i<10+datalen;i++){
      buffer[i]=byte(data[i-10]);
    }
    if((10+datalen)%2!=0)buffer[10+datalen]= byte(0xFF);
    else{
      buffer=shorten(buffer);
    }
    println(buffer);
    udp.send(buffer, pLanboxIP, pPort);
  }
}


int HighByte(int a){
  return (a >> 8);
}
int LowByte(int a){
  return (a & 0xFF);
}

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024