control an Alen&Heath QU-16 digital mixer by MIDI over TCP

Hello,

It is now ok!! When the network stalls for more than 1000 ms, I reset the board.
This is perfect for me!

Thank you so much! We have a concert saturday 8)

/*
  tcp client

 Arduino Ethernet shield w5100.

 * Ethernet shield attached to pins 10, 11, 12, 13
 * carte micro sd = pin 4

 */

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



// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0x25, 0x11, 0x80 };
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(192, 168, 1, 5); // numeric IP for Google (no DNS)
//char server[] = "www.google.com";    // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 1, 177);

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

int connectLoop;

void(* resetFunc) (void) = 0; //declare reset function @ address 0

class Strip
{
  public:
    int pin;
    byte CH;
    byte VX;
    byte dernierEnvoye;
    byte val;

    void init(int p, byte c, byte v)
    {
      pin = p;
      CH = c;
      VX = v;
    }

    void tester()
    {
      val = map(analogRead(pin), 0, 1023, 0x00, 0x7F);
      if (val != dernierEnvoye)
      {
        byte buf[] = { 0xB0, 0x63, CH, 0xB0, 0x62, 0x20 , 0xB0, 0x06, val, 0xB0, 0x26, VX};
        client.write(buf, 12);
        dernierEnvoye = val;
      }
    }
};

const int nbStrip = 6;
Strip strip[nbStrip];

int nbFE = 0;
const int ledVerte = 32;
const int ledRouge = 33;

void setup() {
  pinMode(ledVerte, OUTPUT);
  pinMode(ledRouge, OUTPUT);

  digitalWrite(ledVerte, HIGH);   // vert
  digitalWrite(ledRouge, HIGH);   // rouge


  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH); // disable SD SPI


  strip[0].init(A0, 0X2C, 0x03);
  strip[1].init(A1, 0X29, 0x03);
  //strip[2].init(A1, 0X2A, 0x03);
  strip[2].init(A1, 0X2B, 0x03);
  //strip[4].init(A1, 0X2C, 0x03);
  strip[3].init(A2, 0X24, 0x03);
  strip[4].init(A2, 0X25, 0x03);
  strip[5].init(A3, 0X23, 0x03);
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  Serial.println("start!");
  //  while (!Serial) {
  //   ; // wait for serial port to connect. Needed for Leonardo only
  // }

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);

  Serial.print("my ip is ");
  Serial.println(Ethernet.localIP());

  digitalWrite(ledVerte, LOW);   // vert
  digitalWrite(ledRouge, LOW);   // rouge
  Serial.println("searching for Alen&Heath QU mixer...");


  bool connexionOK = false;
  digitalWrite(ledRouge, HIGH);   // rouge

  IPAddress server(192, 168, 10, 3); // QU-16 ip
  Serial.println("192.168.10.3"); // DEFAULT IP ADRESS
  if (client.connect(server, 51325))
    connexionOK = true;

  if (!connexionOK)
  {// START AUTODETECT
    for (int j = 2; j < 256; j++)
    {
      //192.168.1.x
      digitalWrite(ledRouge, LOW);   // rouge

      IPAddress server(192, 168, 1, j); // QU-16 ip
      Serial.print("192.168.1.");
      Serial.println(j);
      if (client.connect(server, 51325))
      {
        connexionOK = true;
        break;
      }

      //192.168.10.x
      digitalWrite(ledRouge, HIGH);   // rouge

      IPAddress server2(192, 168, 10, j); // QU-16 ip
      Serial.print("192.168.10.");
      Serial.println(j);
      if (client.connect(server2, 51325))
      {
        connexionOK = true;
        break;
      }
    }
  }

  if (connexionOK) {
    connexionOK = true;
    Serial.println("connected");
    digitalWrite(ledVerte, HIGH);   // vert
  }
  else {
    digitalWrite(ledRouge, HIGH);   // rouge
    Serial.println("connection failed");
    delay(1000);               // wait for a second
    Serial.println("resetting");
    resetFunc();  //call reset
  }
}

void loop()
{
  // if there are incoming bytes available
  // from the server, read them and print them:

  bool recu = false;
  if (client.available())
  {
    connectLoop = 0;
    for (int s = 0; s < nbStrip; s++)
      strip[s].tester();
    //client.flush();

    byte c = client.read();
    Serial.print(c, HEX);
    Serial.print(" ");

    if (c == 0xFE)
    {
      nbFE++;
      if (nbFE >= 2)
      {
        digitalWrite(ledVerte, HIGH);  //vert
        nbFE = 0;

      }
      else
        digitalWrite(ledVerte, LOW);   // vert
      Serial.println();
    }
  }

  delay(1);
  connectLoop++;
  if (connectLoop > 1000)
  {
    Serial.println();
    Serial.println(F("Timeout"));
    client.stop();
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    digitalWrite(ledRouge, HIGH);   // rouge
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    //delay(1000);               // wait for a second
    Serial.println("resetting");
    resetFunc();  //call reset
/*
    // do nothing forevermore:
    while (true)
    {
      ;
    };
    */
  }


 // digitalWrite(ledVerte, LOW);   // vert
}