#include "encoders.h"
#include "sonar.h"

extern "C" //sonar and encoders external interrupts
{
    void EXTI0_IRQHandler(void)
    {
        if ((EXTI->PR & EXTI_Line0) != 0) {
            if((GPIOC->IDR & GPIO_Pin_1) != 0)
            {
                enc3::pos++;
            }
            else
            {
                enc3::pos--;
            }
            EXTI->PR = EXTI_Line0;
        }
    }

    void EXTI1_IRQHandler(void)
    {
        if ((EXTI->PR & EXTI_Line1) != 0) {
            if((GPIOC->IDR & GPIO_Pin_0) != 0)
            {
                enc3::pos--;
            }
            else
            {
                enc3::pos++;
            }
            EXTI->PR = EXTI_Line1;
        }
    }

    void EXTI2_IRQHandler(void)
    {
        if ((EXTI->PR & EXTI_Line2) != 0) {
            if((GPIOC->IDR & GPIO_Pin_3) != 0)
            {
                enc4::pos++;
            }
            else
            {
                enc4::pos--;
            }
            EXTI->PR = EXTI_Line2;
        }
    }

    void EXTI3_IRQHandler(void)
    {
        if ((EXTI->PR & EXTI_Line3) != 0) {
            if((GPIOC->IDR & GPIO_Pin_2) != 0)
            {
                enc4::pos--;
            }
            else
            {
                enc4::pos++;
            }
            EXTI->PR = EXTI_Line3;
        }
    }

    void EXTI4_IRQHandler(void)
    {
        if ((EXTI->PR & EXTI_Line4) != 0) {
            if((GPIOC->IDR & GPIO_Pin_5) != 0)
            {
                enc1::pos++;
            }
            else
            {
                enc1::pos--;
            }
            EXTI->PR = EXTI_Line4;
        }
    }

    void EXTI9_5_IRQHandler(void)
    {
        if (EXTI_GetITStatus(EXTI_Line8)) { //sonar interrupt
            TIM8->CNT = 0; //start 8 timer
            EXTI_ClearITPendingBit(EXTI_Line8);
        }
        
        if ((EXTI->PR & EXTI_Line5) != 0) {
            if((GPIOC->IDR & GPIO_Pin_4) != 0)
            {
                enc1::pos--;
            }
            else
            {
                enc1::pos++;
            }
            EXTI->PR = EXTI_Line5;
        }
        if ((EXTI->PR & EXTI_Line6) != 0) {
            if((GPIOC->IDR & GPIO_Pin_7) != 0)
            {
                enc2::pos--;
            }
            else
            {
                enc2::pos++;
            }
            EXTI->PR = EXTI_Line6;
        }
        if ((EXTI->PR & EXTI_Line7) != 0) {
            if((GPIOC->IDR & GPIO_Pin_6) != 0)
            {
                enc2::pos++;
            }
            else
            {
                enc2::pos--;
            }
            EXTI->PR = EXTI_Line7;
        }
    }
}
