#include "lib7seg.h"
#include "CStateMachineRotary.h"

CStateMachineRotaryWithSpeedWithReset encoder(A0,A1,A2); 
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
Clib7Seg aff7seg(4,digitPins,8,segmentPins); //Objet en variable globale car utilisé dans l'interruption

void setup() {
  Serial.begin(115200);
  Serial.println("debut");

  setupTimer2();
}

void loop() {
  
  /*
  unsigned int periodiciteTache1=200; //100ms entre chaque incrémentation de la valeur à afficher
  unsigned int periodiciteTache2=2000;  //2s pour l'affichage entre chaque valeur de potar
  static unsigned long timerTache1 = millis();
  static unsigned long timerTache2 = millis();

  if (millis() - timerTache1 >= periodiciteTache1) {
    timerTache1 += periodiciteTache1;
    tache1bis();
  }

  if (millis() - timerTache2 >= periodiciteTache2) {
    timerTache2 += periodiciteTache2;
    tache2();
  }

  tache3();
  */

  unsigned int periodiciteTache4=200; //200ms entre chaque actualisation de l'afficheur
  static unsigned long timerTache4 = millis();
  encoder.clock();
  if (millis() - timerTache4 >= periodiciteTache4) {
    timerTache4 += periodiciteTache4;
    tache4();
  }

}

void tache4 (void)
{

    if(analogRead(A4)==1023) //affichage de la position angulaire
    {
      aff7seg.setDots(4);
      int position = encoder.getPosition();
      
      if(position<0)
      {
        analogWrite(A5, 0);
        position=~(position+1);
        aff7seg.setNumber(position);
      }
      else
      {
        analogWrite(A5, 255);
        aff7seg.setNumber(position);
      }

    }
    else
    {
      float speed = encoder.getSpeed();
      aff7seg.setDots(2);
      if ((speed>=0)&&(speed<999.9))
      {
        unsigned int uintvalue = (unsigned int)(speed*10);
        
        aff7seg.setNumber(uintvalue);
      }
      else
      {
        aff7seg.setNumber(0xEEEE);
      }  

    }

}

//Timer 2 : https://www.aranacorp.com/fr/utilisation-des-timers-de-larduino/
// timer2 (8 bits) qui est utilisé par la fonction Tone() et la génération de la PWM sur les broches 3 et 11.
void setupTimer2(){
  cli();                                   // disable all interrupts
  TCCR2A = (1<<WGM21)|(0<<WGM20);          // Mode CTC
  TIMSK2 = (1<<OCIE2A);                    // Local interruption OCIE2A
  TCCR2B = (0<<WGM22)|(1<<CS22)|(1<<CS21); // prediviser /256 
  OCR2A = 250;                             //250*256*1/16000000 = 4ms
  sei();                                   // enable all interrupts
}
 
//appelée toutes les 4ms:
ISR(TIMER2_COMPA_vect){                    // timer compare interrupt service routine  
    aff7seg.refresh();
}