#ifndef _ENCODER_H
#define _ENCODER_H

#include "hardware.h"
#include "ksh148.h"

#define ENCODER_LEFT     180 // 0b10 11 01 00
#define ENCODER_RIGHT    120 // 0b01 11 10 00
#define ENC_LEFT_PIN     0x04
#define ENC_RIGHT_PIN    0x08
#define ENC_PORT         PIND 
//это для наглядности кода
#define b00000011 3
#define b11010010 210
#define b11100001 225
#define RIGHT_SPIN 0x01 
#define LEFT_SPIN 0xff

volatile unsigned char Param = 0;
volatile unsigned char f_WakeUP = FALSE;

void Read_Encoder(void);
void ENC_PollEncoder(void);
void EncPoll(void);

ISR(INT0_vect)
{   
   cli();  
   f_WakeUP = TRUE;
   disable_encoderIRQ();
   sei();      
}

ISR(INT1_vect)
{ 
   cli();      
   sei();  	  
}

 
void EncPoll( void )
{   
   static unsigned char stateEnc; 	//хранит последовательность состояний энкодера
   unsigned char tmp;  
   unsigned char currentState = 0;

   //проверяем состояние выводов микроконтроллера
   if ((ENC_PORT&ENC_LEFT_PIN)!= 0)  {SetBit(currentState,0);}  
   if ((ENC_PORT&ENC_RIGHT_PIN)!= 0) {SetBit(currentState,1);}

   //если равно предыдущему, то выходим
   tmp = stateEnc;
   if (currentState == (tmp & b00000011)) return;

   //если не равно, то сдвигаем и сохраняем в озу
   tmp = (tmp<<2)|currentState;
   stateEnc = tmp;

   //сравниваем получившуюся последовательность
   if (tmp == b11100001) Param = LEFT_SPIN;
   if (tmp == b11010010) Param = RIGHT_SPIN;
   return;
}

#endif