#include "Encoder.h"
#include <avr/io.h>

static int encoder_state, prev_encoder_state = 3, state = 1, total_state; 

void read_encoder_state(void) 
{ 
 int  pin_clk_2, pin_dt_2; 
    // Устанавливаем начальные значения переменных равное 0 
    pin_clk_2 = 0; 
    pin_dt_2 = 0; 
 
    // Устанавливаем значение PIN_CLK_2 в зависимости от установки бита PIND_CLK в PIND 
    pin_clk_2 = (PIND & PIND_CLK) ? 1 : 0; 
    // Устанавливаем значение PIN_DT_2 в зависимости от установки бита PIND_DT в PIND 
    pin_dt_2 = (PIND & PIND_DT) ? 1 : 0; 
    // Получаем состояние энкодера
    encoder_state = (pin_clk_2 << 1) | pin_dt_2;

     // Проверяем, изменилось ли состояние энкодера

    if (encoder_state != prev_encoder_state)

    {

      switch (encoder_state)

      {
        case 0: // Поворот против часовой стрелки (CCW)
            if (prev_encoder_state == 2) 
                state++;
            else if (prev_encoder_state == 1) 
                state--;
            break;

        case 1: // Поворот по часовой стрелке (CW)
            if (prev_encoder_state == 0) 
                state++;
            else if (prev_encoder_state == 3) 
                state--;
            break;

        case 2: // Поворот против часовой стрелки (CCW)
            if (prev_encoder_state == 3) 
                state++;
            else if (prev_encoder_state == 0) 
                state--;
            break;

        case 3: // Поворот по часовой стрелке (CW)
            if (prev_encoder_state == 1) 
                state++;
            else if (prev_encoder_state == 2) 
                state--;
            break;
      }
    // Устанавливаем значение prev_encoder_state равным текущему состоянию энкодера
      prev_encoder_state = encoder_state;
      if ( state ==  4 )
      { 
        total_state++;
        state=0;
      }
      if ( state == -4 )
      { 
        total_state--;
        state=0;
      }
    }
}

void encoder_setup(void) 
{ 
    // Настройка портов ввода-вывода 
    DDRD = 0x00; 
    PORTD = (PIND_CLK + PIND_DT); 
} 
 
int encoder_value(void) 
{ 
    // Читаем состояние энкодера 
    read_encoder_state(); 
    return total_state; 
}