#include <Wire.h>
#define SensorPin 8
#define RelayPin 5
bool SensorState = LOW;
bool SensorLastState = HIGH;
unsigned long T[5] = {0, 0, 0, 0, 0};
unsigned long T_start = 0;
unsigned long T_stop = 0;
unsigned long CalibStart = 0;
unsigned long CalibStop = 0;
unsigned long CalibTime = 0;
int Tindex = 0;
void setup() 
{
  pinMode(SensorPin, INPUT);
  pinMode(RelayPin, OUTPUT);
  digitalWrite(RelayPin, LOW);
  Wire.begin();
  Serial.begin(9600);
}
void loop() 
{
  Serial.println("Oczekiwanie na polecenie:");
  Serial.println("- \"kalibracja\"...");
  Serial.println("- \"pozycja 1\"...");
  Serial.println("- \"pozycja 2\"...");
  Serial.println("- \"pozycja 3\"...");
  Serial.println("- \"pozycja 4\"...");
  Serial.println("- \"pozycja 5\"...");  
  while (true) 
  {
    if (Serial.available() > 0) 
    {
      String command = Serial.readStringUntil('\n');
      command.trim();
      if (command.equals("kalibracja")) 
      {
        Serial.println("Rozpoczęcie kalibracji...");
        Calibration();
        Serial.println("Kalibracja zakończona.");
        break;
      }
      else if (command.equals("pozycja 1")) 
      {
        Serial.println("Pozycja 1...");
        Rotate_To_Position(0);
        Serial.println("Pozycja 1 osiągnięta");
        break;
      }
      else if (command.equals("pozycja 2"))
      {
        Serial.println("Pozycja 2...");
        Rotate_To_Position(1);
        Serial.println("Pozycja 2 osiągnięta");
        break;
      }
      else if (command.equals("pozycja 3"))
      {
        Serial.println("Pozycja 3...");
        Rotate_To_Position(2);
        Serial.println("Pozycja 3 osiągnięta");
        break;
      }
      else if (command.equals("pozycja 4"))
      {
        Serial.println("Pozycja 4...");
        Rotate_To_Position(3);
        Serial.println("Pozycja 4 osiągnięta");
        break;
      }
      else if (command.equals("pozycja 5"))
      {
        Serial.println("Pozycja 5...");
        Rotate_To_Position(4);
        Serial.println("Pozycja 5 osiągnięta");
        break;
      }
    }
  }
}
void Calibration()
{
  Tindex = 0;
  T_start = 0;
  T_stop = 0;
  for (int i = 0; i < 5; i++) 
  {
    T[i] = 0;
  }
  CalibStart = 0;
  CalibStop = 0;
  CalibTime = 0;
  CalibStart = millis();
  while(Tindex < 5)
  {
    TimeArray();
    digitalWrite(RelayPin, HIGH);
  }
  digitalWrite(RelayPin, LOW);
}
void TimeArray() 
{
  Serial.println(Tindex);
  SensorState = digitalRead(SensorPin);
  if (SensorState != SensorLastState)
  {
    if (SensorState == LOW) 
    {
      T_start = millis();
    }
    else if (SensorState == HIGH) 
    {
      T_stop = millis();
  
      T[Tindex] = T_stop - T_start;
      Tindex++;
      if (Tindex >= 5)
      {
        for (int i = 0; i < 5; i++) 
        {
          Serial.print("T");
          Serial.print(i + 1);
          Serial.print(" = ");
          Serial.print(T[i]);
          Serial.println(" ms");
        }
        CalibStop = millis();
        CalibTime = CalibStop - CalibStart;
        Serial.print("Czas kalibracji = ");
        Serial.print(CalibTime);
        Serial.println(" ms");
      }
    }
    SensorLastState = SensorState;
  }
}
void Rotate_To_Position(int targetIndex)
{
  bool positionFound = false;
  while (!positionFound)
  {
    digitalWrite(RelayPin, HIGH);
    unsigned long TimeCurrent = 0;
    SensorState = digitalRead(SensorPin);
    if (SensorState == LOW) 
    {
      T_start = millis();
      while(digitalRead(SensorPin) == LOW);
      T_stop = millis();
      TimeCurrent = T_stop - T_start;
    }
    if (abs(TimeCurrent - T[targetIndex]) <= 100) 
    {
      positionFound = true;
    }
  }
  digitalWrite(RelayPin, LOW);
}