#include "74C922.h"
#include <avr/io.h>
#include <stdbool.h>
#include <util/delay.h>

void prepare_interrupt() {
    EICRA |= (1 << ISC00); // Any logical change triggers interrupt
    EIMSK |= (1 << INT0);  // INT0 external interrupt
    PCICR |= (1 << PCIE0);
}

// Encoder Module
void encoder_init() {
    // Set A, B, C, D, and DA pins as inputs
    DDRD &=
        ~((1 << ENCODER_A_PIN) | (1 << ENCODER_B_PIN) | (1 << ENCODER_C_PIN) |
          (1 << ENCODER_D_PIN) | (1 << ENCODER_DA_PIN));

    // Set OE as output
    DDRD |= (1 << ENCODER_OE_PIN);

    // Enable internal pull-up resistors for A, B, C, D, and OE pins
    PORTD |= (1 << ENCODER_A_PIN) | (1 << ENCODER_B_PIN) |
             (1 << ENCODER_C_PIN) | (1 << ENCODER_D_PIN) |
             (1 << ENCODER_DA_PIN);
}

uint8_t encoder_read() {
    uint8_t encoder_data = 0;

    // Set OE (Output Enable) pin low to enable the encoder
    PORTD &= ~(1 << ENCODER_OE_PIN);
    _delay_us(1);

    // Read the state of the encoder
    encoder_data = PIND >> (ENCODER_A_PIN - 3);
    encoder_data &= 0x0F;

    // Set OE pin high to disable the encoder
    PORTD |= (1 << ENCODER_OE_PIN);

    return encoder_data;
}

bool encoder_available() { return (PIND & (1 << ENCODER_DA_PIN)); }