#include "neotimer.h"
#include <Servo.h>
//#include <VarSpeedServo.h>
Servo Olhos; //define um servo-motor para os olhos
Servo Palpebras; //define um servo-motor para as palpebras
//VarSpeedServo Olhos; //define um servo-motor para os olhos
//VarSpeedServo Palpebras; //define um servo-motor para as palpebras
Neotimer Delay_A = Neotimer(1000); //Delay utilizado na função piscar
Neotimer Delay_B = Neotimer(1000); //Delay utilizado na função Observar
#define ServoA 2 //define a porta para os Olhos
#define ServoB 3 //define a porta para as Palpebras
int PE = 0; //dá prioridade ao evento piscar, interrompendo todos os outros eventos
int P_servo1 = 35; //deefine a posição do servo-motor para os olhos
int P_servo2 = 70; //deefine a posição do servo-motor para as palpebras
int Number = 0; //atua na função piscar como "frames"
int Number1 = 0; //atua na função observar como "frames"
int Number2 = 0; //atua na função observar como "frames"
//servo dos Olhos
int MinA = 80; //valor minimo de posicionamento do servo
int InterA = 145; //valor médio de posicionamento do servo
int MaxA = 180; //valor máximo de posicionamento do servo
//servo das palpebras
int MinB = 70; //valor minimo de posicionamento do servo
int MaxB = 180; //valor máximo de posicionamento do servo
int Repeticoes = 0; //define o numero de vezes que será os servos mudarão de posição
void setup() {
Serial.begin(115200); //define a velocidade de comunicação serial
randomSeed(analogRead(A7));
Olhos.attach(ServoA); //define a porta de controle como ServoA
Palpebras.attach(ServoB); //define a porta de controle como ServoA
Palpebras.write(MaxA); //define a posição default necessária para ambos os servos
Olhos.write(MaxB);      // -
//Olhos.slowmove(255, MaxA);
//Palpebras.slowmove(255, MaxB);
delay(5000); //
}
void loop() {
Piscar(); //ok
//if (PE == 0){
observar();
//}
}
void Piscar(){
if (Delay_A.repeat()){
Delay_A.set(500); //define um tempo menor para executar a função piscar
Number++; //aumenta o valor de Number para dar continuidade aos comandos
if (Number == 1){ //verifica se Number é igual a 1
 Palpebras.write(MinB); //fecha os olhos
 Serial.println("fechar...");
 PE = 1; //pausa outros eventos para piscar os olhos
 Number++;
//Palpebras.slowmove(MaxB, 255);//fecha os olhos
} 
if (Number == 3){ //verifica se Number é igual a 3
 Palpebras.write(P_servo2); //abre os olhos
 Serial.println("abrir...");
 Number++;
//Palpebras.slowmove(P_servo2, 255); //abre os olhos
} 
if (Number >= 5){  //verifica se Number é igual a 5
Serial.println("piscar ok");
Number = 0;
PE = 0; //libera todos os eventos após a finalização do evento atual
int set = random(5, 13); //escolhe um numero de 5 a 12
int set2 = random(0, 2); //escolhe um numero de 0 ou 1
if (set2 == 1){
  set = set - 3;
}
Delay_A = set * 1000;
}
}
}
void observar(){
if (Delay_B.repeat()) { //repete os comandos dentro dele a cada 5 segundos após um periodo de espera
    int Set = random(1, 6); //escolhe um valor numerico de 1 a 5
    Delay_B = Set * 1000; //define um tempo aleatório entre 1 a 5 segundos de espera para cada frame
    //Serial.print("Tempo para proximo frame = "); Serial.println(Set * 1000);
    Number1++; //altera a posição dos "FRAMES" a cada tempo passado
    if (Number2 == 0) {
       Number2 = 1;
     //Chances = random(1, 5); //escolhe um numero de 1 a 4 e guarda o valor em "Chances"
      Repeticoes = random(3, 16); //escolhe um numero de 3 a 15 e guarda o valor em "Repeticoes"
    }
    
    if (Number1 >= 0 && Number1 <= Repeticoes) { // FRAME que repete
          P_servo1 = random(MinA, MaxA + 1);
          P_servo2 = random(MinB, MaxB + 1);
          int VelA = random(10, 256);
          int VelB = random(10, 256);
          Olhos.write(P_servo1);
          Palpebras.write(P_servo2);
          //Olhos.slowmove(P_servo1, VelA);
          //Palpebras.slowmove(P_servo2, VelB);
          Number1++;
        }
    if (Number1 > Repeticoes) { // FRAME 3
      Olhos.write(InterA);
      Palpebras.write(MinB);
      //Olhos.slowmove(InterA, 255);
      //Palpebras.slowmove(MinB, 255);
      
      int set1 = random(10, 31); //guarda em set1 um valor de 10 a 30 segundos
      int Valor = set1 * 1000; //transforma o valor de set1 em milisegundos e guarda em "Valor"
      Number1 = 0; //redefine "Number1" para ser usado novamente
      Number2 = 0; //redefine "Number2" para ser usado novamente
      Serial.println("Observar: Ok"); //imprime a confirmação da finalização de "Observation"
      Serial.print("Proximo tempo:"); Serial.println(Valor); //imprime qual será o tempo de espera para que tudo se repita
      Delay_B.set(Valor); //define o tempo escolhido em milisegundos
    }
  }
}