Crash de l'arduino avec ardOSC

Bonjour,

Ayant découvert que l'on pouvait utiliser TouchOSC pour communiquer avec les cartes arduino, je me suis attelé à la tâche mais j'ai un petit soucis car ma carte crash lorsque j'utilise des faders sur mon interfaces.
Je pense qu'elle sature par l’afflux de données qu'elle reçoit mais je ne sais pas comment arranger ça.
J'ai mis une fonction flush mais ça ne fait rien, ça plante pareil donc si quelqu'un aurait une petite idée d'où cela pourrait provenir je suis preneur :slight_smile:

Voici mon code pour ceux que ça interesse :

#include <SPI.h>
#include <Ethernet.h>

#include <ArdOSC.h>

byte myMac[] = { 0x90, 0xA2, 0xDA, 0x06, 0x00, 0xD2 };
byte myIp[]  = { 192, 168, 0, 36 };
int  serverPort  = 10000;

int destPort=12000;
// int ledPin =  12;

//int flag=0;

OSCServer server;
OSCClient client;
OSCMessage global_mes;
int led4 = 3;
int led2 = 5;
int led3 = 8;
int led1 = 9;
int led5 = 10;
int led6 = 14;


// initialize the stepper library on pins 8 through 11:


long val1 = 0;
long val2 = 0;
long val3 = 0;
long val4 = 0;
long val5 = 0;
long val6 = 0;
long val7 = 0;
long val8 = 0;
long val9 = 0;
long val10 = 0;




void setup(){ 
  
 Serial.begin(9600);
 Serial1.begin(9600);
 
 Ethernet.begin(myMac ,myIp); 
 server.begin(serverPort);
 
 //set callback function & oscaddress
 server.addCallback("/2/red",&func1);
 server.addCallback("/1/green",&func2);
  server.addCallback("/2/blue",&func3);
   server.addCallback("/1/fpink",&func4);
    server.addCallback("/2/fred",&func5);
     server.addCallback("/1/pc1",&func6);
      server.addCallback("/1/pc2",&func7);
       server.addCallback("/1/autoset",&func8);
        server.addCallback("/1/LAN",&func9);
         server.addCallback("/1/mute",&func10);
 
 //pinMode(led6, OUTPUT);
 
 // pinMode(ledPin, OUTPUT);  
 // stepper.setSpeed(50);

 
}
  
void loop(){
  
  if(server.aviableCheck()>0){
 //    Serial.println("alive! "); 
  }
  /*analogWrite(led1, val1);
  analogWrite(led2, val2);
  analogWrite(led3, val3);
  analogWrite(led4, val4);
  analogWrite(led5, val5);
  analogWrite(led6, val6);*/

  
}

//LED 9
void func1(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val1 = (long)(value*255);
  //Serial.println(val1);
  switch (val1){
    case 0:
    digitalWrite(led1, LOW);
    break;
    
    case 255:
    digitalWrite(led1, HIGH);
    break;
  }
  global_mes.flush();
}

//VP ON
void func2(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val2 = (long)(value*255);
  //Serial.println(val2);
  switch (val2){
    case 0:
    //Serial.println ("le bouton vert est désactivé");
    Serial1.println("PWR OFF");
    Serial1.println("PWR OFF");
    delay (500);
    Serial1.println("PWR OFF");
    Serial1.println("PWR OFF");
    delay (500);
    Serial1.println("PWR OFF");
    Serial1.println("PWR OFF");
    break;
    
    case 255:
    //Serial.println ("le bouton vert est activé");
    Serial1.println("PWR ON");
    Serial1.println("PWR ON");
    delay (500);
    Serial1.println("PWR ON");
    Serial1.println("PWR ON");
    delay (500);
    Serial1.println("PWR ON");
    Serial1.println("PWR ON");
    delay (500);
    Serial1.println("PWR ON");
    Serial1.println("PWR ON");
    break;
  }
  global_mes.flush();
}

//RELAIS LIGHT
void func3(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val3 = (long)(value*255);
  //Serial.println(val3);
  switch (val3){
    case 0:
    digitalWrite(led3, LOW);
    break;
    
    case 255:
    digitalWrite(led3, HIGH);
    break;
  }
  global_mes.flush();
}

//SON PC
void func4(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val4 = (long)(value*255);
  //Serial.println(val4);
  global_mes.flush();
}

//GRADA LIGHT
void func5(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val5 = (long)(value*255);
  //Serial.println(val5);
  global_mes.flush();
}

//PC1
void func6(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val6 = (long)(value*255);
  //Serial.println(val6);
  switch (val6){
    case 0:
    //Serial.println ("le bouton vert est désactivé");
    break;
    
    case 255:
    //Serial.println ("le bouton vert est activé");
    Serial1.println("SOURCE 11");
    Serial1.println("SOURCE 11");
    Serial1.println("SOURCE 11");
    Serial1.println("SOURCE 11");
    break;
  }
  global_mes.flush();
}

//PC2
void func7(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val7 = (long)(value*255);
  //Serial.println(val6);
  switch (val7){
    case 0:
    //Serial.println ("le bouton vert est désactivé");
    break;
    
    case 255:
    //Serial.println ("le bouton vert est activé");
    Serial1.println("SOURCE 21");
    Serial1.println("SOURCE 21");
    Serial1.println("SOURCE 21");
    Serial1.println("SOURCE 21");
    break;
  }
  global_mes.flush();
}

//AUTOSET
void func8(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val8 = (long)(value*255);
  //Serial.println(val6);
  switch (val8){
    case 0:
    //Serial.println ("le bouton vert est désactivé");
    break;
    
    case 255:
    //Serial.println ("le bouton vert est activé");
    Serial1.println("KEY 4A");
    Serial1.println("KEY 4A");
    Serial1.println("KEY 4A");
    Serial1.println("KEY 4A");
    break;
  }
  global_mes.flush();
}

//LAN
void func9(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val9 = (long)(value*255);
  //Serial.println(val6);
  switch (val9){
    case 0:
    //Serial.println ("le bouton vert est désactivé");
    break;
    
    case 255:
    //Serial.println ("le bouton vert est activé");
    Serial1.println("SOURCE 50");
    Serial1.println("SOURCE 50");
    Serial1.println("SOURCE 50");
    Serial1.println("SOURCE 50");
    break;
  }
  global_mes.flush();
}

//MUTE
void func10(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val10 = (long)(value*255);
  //Serial.println(val6);
  switch (val10){
    case 0:
    //Serial.println ("le bouton vert est désactivé");
    Serial1.println("MUTE OFF");
    Serial1.println("MUTE OFF");
    Serial1.println("MUTE OFF");
    Serial1.println("MUTE OFF");
    break;
    
    case 255:
    //Serial.println ("le bouton vert est activé");
    Serial1.println("MUTE ON");
    Serial1.println("MUTE ON");
    Serial1.println("MUTE ON");
    Serial1.println("MUTE ON");
    break;
  }
  global_mes.flush();
}

ai mis une fonction flush mais ça ne fait rien

ATTENTION
La méthode flush() n'a plus la même fonctionnalité depuis la version 1.0 Serial.flush() - Arduino Reference. Dans ton cas au lieu d'accélérer le code elle peut le ralentir. Pour vider le tampon de réception il faut faire une petite boucle qui fasse des read() tant qu'il y a des données.

Bonjour,

Je rejoint fdufnews sur le "probléme" du Serial.flush() avec cependant un petit commentaire.

OSCMessage global_mes;
// ...
global_mes.flush();

Je n'est pas la librairie ArduOSC sous les yeux, mais il faudrait savoir comment est implémenté la classe OSCMessage.
Si c'est une bête classe héritant de Serial le probléme vient surement de OSCMessage::flush() sinon il faut regarde plus en profondeur le code.

Si c'est bien une classe héritant de Serial il suffit de remplacer chaque ligne "global_mes.flush()" par :

while(global_mes.available()) { global_mes.read(); }

Merci pour vos réponses cependant j'ai peut être mal compris mais mon code devrait ressemblé à ça en remplaçant "global_mes.flush()" par "while(global_mes.available()) { global_mes.read(); }"? Elle ne devrait pas plutôt se retrouver plus au-dessus ?

void func1(OSCMessage *_mes){
  float value = _mes->getArgFloat(0);
  val1 = (long)(value*255);
  //Serial.println(val1);
  switch (val1){
    case 0:
    digitalWrite(led1, LOW);
    break;
    
    case 255:
    digitalWrite(led1, HIGH);
    break;
  }
  while(global_mes.available()) { global_mes.read(); }
}

Et j'ai un autre soucis, lorsque je veux compiler le code la console me dit ça:

sketch_sep10a.cpp: In function 'void func1(OSCMessage*)':
sketch_sep10a:99: error: 'class OSCMessage' has no member named 'available'
sketch_sep10a:99: error: 'class OSCMessage' has no member named 'read'

J'ai aussi essayé de ne pas utiliser la méthode "flush()" vu que cela pourrait faire ralentir le code mais c'est pareil...

Hello,

Juste pour dire que parfois y'a des fautes d'orthographe, avialable pour available (donc le i et le a inversés).

De mon côté, j'ai problème de addCallBack. On dirait qu'il y a une limite... ????

je suis effectivement à 50 callBack, et disons que ca fonctionne pas bien du tout. A 49 callBack tout va bien.

J'ai nommé mes callBack du plus petit nom possible ( "/m ou /H/1) et c'est de cette manière que j'ai pu récupérer quelques callBack supplémentaire.

Il me reste 30 callBack à ajouter (ceux en gris /** **/ ou //). Comment faire??

Ci dessous un extrait du code, vous voyez les addCallBack, c'est pour les multisliders de TouchOsc qui ne fournissent pas de listes..

#include <DmxSimple.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>
#include <ArdOSC.h>
#include <Metro.h>

byte myMac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte myIp[]  = { 192, 168, 0, 177 };
  int  serverPort  = 10000;
OSCServer server;
OSCClient client;
OSCMessage global_mes;

Metro ledMetro= Metro(500);
Metro InMetro= Metro(40);
Metro delMetro= Metro(0);

int destPort   =  12000;
byte destIp[]  = { 192, 168, 0, 255 }; //adresse IPAD

void setup() {
  
 Ethernet.begin(myMac ,myIp);
 server.begin(serverPort);

  server.addCallback("/c",&coldF);
  server.addCallback("/h",&hotF); 
  server.addCallback("/m",&masterF); 
  server.addCallback("/f",&fading); 
  server.addCallback("/ref",&refresh); 
  //server.addCallback("/rL",&refLed);
  /**server.addCallback("/p",&positIt);
  server.addCallback("/l",&large);
  server.addCallback("/d",&degrad);**/
  server.addCallback("/s/1/1",&scenario1); 
  server.addCallback("/s/2/1",&scenario2); 
  server.addCallback("/s/3/1",&scenario3); 
  server.addCallback("/s/4/1",&scenario4); 
  server.addCallback("/s/5/1",&scenario5); 
  server.addCallback("/s/6/1",&scenario6); 
  
  server.addCallback("/st",&buttonStore);
  
  /**server.addCallback("/sC",&sasC);
  server.addCallback("/sH",&sasH);
  server.addCallback("/cC",&couloirC);
  server.addCallback("/cH",&couloirH);**/
  
  server.addCallback("/C/1",&slideC1);
  server.addCallback("/C/2",&slideC2);
  server.addCallback("/C/3",&slideC3);
  server.addCallback("/C/4",&slideC4);
  server.addCallback("/C/5",&slideC5);
  server.addCallback("/C/6",&slideC6);
  server.addCallback("/C/7",&slideC7);
  server.addCallback("/C/8",&slideC8);
  server.addCallback("/C/9",&slideC9);
  server.addCallback("/C/10",&slideC10);
  server.addCallback("/C/11",&slideC11);
  server.addCallback("/C/12",&slideC12);
  server.addCallback("/C/13",&slideC13);
  server.addCallback("/C/14",&slideC14);
  server.addCallback("/C/15",&slideC15);
  server.addCallback("/C/16",&slideC16);
  server.addCallback("/C/17",&slideC17);
  server.addCallback("/C/18",&slideC18);
  server.addCallback("/C/19",&slideC19);
  server.addCallback("/C/20",&slideC20);
  server.addCallback("/C/21",&slideC21);
  server.addCallback("/C/22",&slideC22);
  server.addCallback("/C/23",&slideC23);
  server.addCallback("/C/24",&slideC24);
  server.addCallback("/C/25",&slideC25);
  server.addCallback("/C/26",&slideC26);
  server.addCallback("/C/27",&slideC27);
  server.addCallback("/C/28",&slideC28);
  server.addCallback("/C/29",&slideC29);
  server.addCallback("/C/30",&slideC30);

  server.addCallback("/H/1",&slideH1);
  server.addCallback("/H/2",&slideH2);
  server.addCallback("/H/3",&slideH3);
  server.addCallback("/H/4",&slideH4);
  server.addCallback("/H/5",&slideH5);
  server.addCallback("/H/6",&slideH6);
  server.addCallback("/H/7",&slideH7);
  server.addCallback("/H/8",&slideH8);
  /**server.addCallback("/H/9",&slideH9);
  server.addCallback("/H/10",&slideH10);
  server.addCallback("/H/11",&slideH11);
  server.addCallback("/H/12",&slideH12);
  server.addCallback("/H/13",&slideH13);
  server.addCallback("/H/14",&slideH14);
  server.addCallback("/H/15",&slideH15);
  server.addCallback("/H/16",&slideH16);
  server.addCallback("/H/17",&slideH17);
  server.addCallback("/H/18",&slideH18);
  server.addCallback("/H/19",&slideH19);
  server.addCallback("/H/20",&slideH20);
  server.addCallback("/H/21",&slideH21);
  server.addCallback("/H/22",&slideH22);
  server.addCallback("/H/23",&slideH23);
  server.addCallback("/H/24",&slideH24);
  server.addCallback("/H/25",&slideH25);
  server.addCallback("/H/26",&slideH26);
  server.addCallback("/H/27",&slideH27);
  server.addCallback("/H/28",&slideH28);
  server.addCallback("/H/29",&slideH29);
  server.addCallback("/H/30",&slideH30);**/
  
  DmxSimple.usePin(3);
  DmxSimple.maxChannel(80);
  scene(0);
}

void loop() {
   
  if(server.aviableCheck()>0){}
    
  if (digitalRead(helpPin)==LOW) 
  {  if (secours==1) {scene(scenario); secours=0;}
    digitalWrite(ledPingreen,HIGH);
    digitalWrite(ledPinred,LOW);
    if (InMetro.check() == 1) {
    setList(); 
  }
    if (delMetro.check() == 1) { 
       inc();
       delMetro.interval(fade/38.);
    }
    /**
    if (analogRead(button1)!=0){scene1();}
    if (analogRead(button2)!=0){scene2();}
    if (analogRead(button3)!=0){scene3();}
    if (analogRead(button4)!=0){scene4();}
    if (analogRead(button5)!=0){scene5();}
    if (analogRead(button6)!=0){scene6();}
    **/
  }
 else 
 {  
 digitalWrite(scene1Led,LOW);
 digitalWrite(scene2Led,LOW);
 digitalWrite(scene3Led,LOW);
 digitalWrite(scene4Led,LOW);
 digitalWrite(scene5Led,LOW);
 digitalWrite(scene6Led,LOW);
 cold  = 1.;
 hot   = 1.;
 master =1.;
 sasCold =1.;
 sasHot =1.;
 couloirCold =1.;
 couloirHot =1.;
 fade=0;
 secours=1;
 for (int i=0; i<=37; i++){ virtualCold[i]=1.; virtualHot[i]=1.;}
 digitalWrite(ledPinred,HIGH);
 digitalWrite(ledPingreen,LOW);
 setList();
 if (delMetro.check() == 1) { 
       inc();
       delMetro.interval(0);
    }
  }
}


void coldF(OSCMessage *_mes) { cold = _mes->getArgFloat(0);  }
void hotF(OSCMessage *_mes) { hot = _mes->getArgFloat(0);  }
void masterF(OSCMessage *_mes) { master = _mes->getArgFloat(0);  }
void fading(OSCMessage *_mes) { fade = _mes->getArgFloat(0);  }
void refresh(OSCMessage *_mes) { if(_mes->getArgFloat(0)!=0) setOSCRes();}
//void refLed(OSCMessage *_mes) { if(_mes->getArgFloat(0)!=0) setOSCRes();}

void positIt(OSCMessage *_mes) { posit = _mes->getArgFloat(0);  }
void large(OSCMessage *_mes) { largeur = _mes->getArgFloat(0);  }
void degrad(OSCMessage *_mes) { degrade = _mes->getArgFloat(0);  }

void slideC1(OSCMessage *_mes) { virtualCold[0] = _mes->getArgFloat(0); }
void slideC2(OSCMessage *_mes) { virtualCold[1] = _mes->getArgFloat(0); }
void slideC3(OSCMessage *_mes) { virtualCold[2] = _mes->getArgFloat(0); }
//etc...

Le nombre de Callback est limité à 50 apparemment

#define kMaxPatternMatch 50

Et il n'y a aucune vérification de débordement !!!!
A la 51eme ca fait n'importe quoi (jardinage)

Par contre tu devrais pouvoir aller jusqu'à 50.

RTFC

Merci, c'est donc bon à savoir, je ne l'avais lu nul part.

ce kMaxPatternMatch 50 est inchangeable (pattern.h) ?? (je viens d'essayé ca ne marche effectivement pas)

Tu penses à quelques solutions pour passer à 100 adresses? ou ce n'est tout simplement pas possible. (limit du shield ethernet?)

Ciao

Ca devrait être possible en théorie de le changer
Mais après attention à la mémoire...

En théorie, mais ca doit être un peu complexe ( ou en tout cas risqué) pour moi d'entrée dans cette lib.

Merci en tous les cas pour ces réponses.

Si quelqu'un est capable de modifier la library ArdOSC pour d'avantage de callBack... Allez y .

Astuce possible, toujours en modifiant la lib, on pourrait s'offrir la possibilité d'utiliser le * . Ex /fade/*

pour dire tous les callBack commencant par /fade/

A plus.

PS si TouchOSC pouvait également offrir la possibilité d'envoyer les multiFader et Multipush et MultiToggle en mode Liste, ca serait pas mal.

Ciao

Hello,
J'ai trouvé d'où provient le soucis pour les crashs intempestifs :slight_smile:
C'était en fait la micro SD que je me servait avant pour mon webserveur qui faisait planté :fearful:

Si ça peut aider quelqu'un...