Con il passaggio del framework arduino-esp32 dalla versione 1.x alla 2.x è cambiato il modo come vengono processati e numerati gli eventi di sistema.

Come abbiamo già visto nell’articolo precedente (PlatformIO: platforms, frameworks e boards), il passaggio da una versione all’altra dei framework e delle piattaforme di sviluppo possono portarsi dietro bugs e/o breaking changes che spesso vanno ad influire sul funzionamento del nostro codice e bisogna intervenire.

Scrivo questo breve articolo perchè sono incappato in una di queste breaking changes e probabilmente migliaia di progetti presenti in rete andranno modificati per continuare a funzionare correttamente. La questione per quanto mi riguarda è anche abbastanza delicata in quanto non risultano errori di compilazione con il nuovo framework ma, semplicemente, qualcosa potrebbe non funzionare correttamente e venirne a capo in questi casi è sempre un delirio :face_with_head_bandage:

Il problema riguarda appunto gli eventi generati dal sistema al verificarsi di determinate condizioni come la connessione alla rete, la disconnessione, l’ottenimento dell’indirizzo IP ecc.

Me ne sono accorto perchè, compilando con la nuova versione (platform 4.2.0 e framework 2.0.2) il codice di esempio per l’inizializzazione della LAN8720 non avevo più i messaggi sulla seriale degli eventi. La scheda funziona, ma gli eventi non venivano più registrati.

Cercando informazioni in rete non ho trovato quasi nulla, tranne una discussione su GitHub sulla quale sono intervenuto per segnalare quanto ho verificato sulla mia pelle ed in cerca di delucidazioni, che sono arrivate nel giro di poche ore da me-no-dev, uno dei principali sviluppatori del framework arduino per ESP32. Riporto i suoi interventi chiarificatori:

We do not use SYSTEM_EVENT_ anymore

ESP-IDF changed the way it enumerates and processes events, so in order for Arduino to provide as similar API as possible, we had to change the event names and actually define them ourselves. This is since 2.0.0

ed ancora, in risposta al perchè non ci fossero errori di compilazione:

It does compile because the old enums still exist in ESP-IDF, but can not be used the same way as before anymore in Arduino.

Per semplificare, sono cambiati i nomi degli eventi da SYSTEM_EVENT_EVENT_NAME ad ARDUINO_EVENT_EVENT_NAME. Ad esempio, SYSTEM_EVENT_ETH_CONNECTED diventa ARDUINO_EVENT_ETH_CONNECTED. Sembra una stupidaggine, ma in rete ci sono migliaia di progetti, soprattutto quelli che fanno uso di connessione WIFI che andranno modificati. Ed io ci ho perso una settimana di sonno :rofl:

In definitiva il codice della funzione che utilizzavo nel progetto della LAN8720 va modificato come segue:

void WiFiEvent(WiFiEvent_t event) {
  switch (event) {
    case ARDUINO_EVENT_ETH_START:
      Serial.println("ETH Started");
      ETH.setHostname("ziotester-eth");
      break;
    case ARDUINO_EVENT_ETH_CONNECTED:
      Serial.println("ETH Connected (ARDUINO_EVENT_ETH_CONNECTED)");
      break;
    case ARDUINO_EVENT_ETH_GOT_IP:
      Serial.print("ETH MAC: ");
      Serial.print(ETH.macAddress());
      Serial.print(", IPv4: ");
      Serial.print(ETH.localIP());
      if (ETH.fullDuplex()) {
        Serial.print(", FULL_DUPLEX");
      }
      Serial.print(", ");
      Serial.print(ETH.linkSpeed());
      Serial.println("Mbps");
      eth_connected = true;
      break;
    case ARDUINO_EVENT_ETH_DISCONNECTED:
      Serial.println("ETH Disconnected");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_STOP:
      Serial.println("ETH Stopped");
      eth_connected = false;
      break;
    default:
      break;
  }
}

L’elenco completo dei nuovi eventi ARDUINO_EVENTS è sul file WiFiGeneric.h del framework.