#include <Streaming.h>
Print &cout {Serial};

#include "CD4051.hpp"

//
// Variante mit eigenen Select-Pins pro IC
//
// Steuerpins für den Kanal pro IC
// constexpr byte selectPins[][3] {
//     {2, 3, 4 },
//     {5, 6, 7 },
//     {8, 9, 10}
// };

// Drei IC Objekte erzeugen
// CD4051 muxIc[] {
//     {selectPins[0], A2, 8}, // Steuerpins, Analogpin, Anzahl verwendete Kanäle
//     {selectPins[1], A1, 8},
//     {selectPins[2], A0, 6}
// };

//
// Variante mit gleichen Select-Pins für alle ICs
//
constexpr byte selectPins[] {2, 3, 4 };
// Drei IC Objekte erzeugen
CD4051 muxIc[] {
    {selectPins, A2, 8}, // Steuerpins, Analogpin, Anzahl verwendete Kanäle
    {selectPins, A1, 8},
    {selectPins, A0, 6}
};

void setup() {
  Serial.begin(115200);
  for (auto &m : muxIc) { m.begin(); }   // Intialisiere PinMode und Speicher

  // Die Analogwerte sind natürlich Zufallszahlen
  cout << "Daten auslesen und speichern:" << endl;
  size_t icNr {0};
  for (auto &m : muxIc) {
    cout << "\nMuxIC Nr. : " << ++icNr << endl;
    m.readData();
  }

  icNr = 0;
  cout << "\nGelesene Daten aus dem Speicher zurücklesen:" << endl;
  for (auto &m : muxIc) {
    cout << "MuxIC Nr. : " << ++icNr << endl;
    for (size_t i = 0; i < maxChannelsPerMux; ++i) {
      cout << _WIDTH(m.getData(i), 4) << " ";
      delay(500);   // Nur damit die Ausgabe langsamer erfolgt. Muss eigentlich weg!
    }
    cout << endl;
  }

  icNr = 0;
  for (auto &m : muxIc) {
    cout << "\nLösche Daten MuxIC Nr. : " << ++icNr;
    m.clearData();
    delay(500);   // Nur damit die Ausgabe langsamer erfolgt. Muss eigentlich weg!
  }

  icNr = 0;
  cout << "\n\nDaten aus dem Speicher zurücklesen:" << endl;
  for (auto &m : muxIc) {
    cout << "MuxIC Nr. : " << ++icNr << endl;
    for (size_t i = 0; i < maxChannelsPerMux; ++i) { cout << _WIDTH(m.getData(i), 4) << " "; }
    cout << endl;
  }
}

void loop() {}