#include <Wire.h>

char receive[11];
char send[11];

int dataIn[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int dataOut[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

int pinIn[10] = { 10, 11, 12, 13, A0, A1, A2, A3 };  // definice vstupních pinů OD PLC
int pinOut[10] = { 2, 3, 4, 5, 6, 7, 8, 9 };         // definice výstupních pinů DO PLC


void setup() {
  Wire.begin(10);
  Serial.begin(9600);

  for (int i = 0; i < 8; i++) {
    pinMode(pinIn[i], INPUT_PULLUP);  // piny 10-13 a A0 - A3 definované jako inputy
    pinMode(pinOut[i], OUTPUT);       //  piny 2-9 definované jako outputy
  }

  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
}

void loop() {

  for (int i = 0; i < 8; i++) {
    if (dataIn[i] == 1 || dataIn[i] == 0) digitalWrite(pinOut[i], !+dataIn[i]);  // sepnutí výstupů do PLC v závislosti na datech přijatých od Masteru
    dataOut[i] = !digitalRead(pinIn[i]);                                          // uložení dat od PLC do proměnné, pro odeslání na Master
  }

  delay(1);
}


//  Odeslání dat na Master
void requestEvent() {
  for (int i = 0; i < 10; i++) {
    send[i] = (char)dataOut[i] + 1;
  }

  Wire.write(send);
}


// Přečtení a uložení příchozích dat od Masteru
void receiveEvent(int bytes) {
  int a = 0;

  while (Wire.available() != 0) {                  // vrací počet bytů dostupných pro přijetí
    receive[a] = Wire.read();                      // do pole receive ulož to co je na sběrnici
    if (a < 10) dataIn[a] = (int)receive[a] - 1;  // převod na int
    a++;
  }
}
