#pragma once

#include "servo.h"
#include "lib/adc.h"
#include "lib/usart.h"

//Working from 25° to 140°

class Controller
{
    //Enums
    public:
        enum servo_positions
        {
            OPEN_POSITION  = 40,
            CLOSE_POSITION = 120
        };

    //Instances
    public:
        servo_class servo;
        adc_class adc;
        usart uart;

    //Variables
    public:
        volatile uint16_t current_positive;
        volatile uint16_t current_negative;
        volatile uint8_t  channel;

        volatile bool lock_signal;
        volatile uint8_t lock_signal_delay;

    //Methods
    public:
        Controller();

        void timer0_handler()
        {
            adc.start_conversion();
        }

        void lock_signal_delay_handler()
        {
            lock_signal_delay++;

            if (lock_signal_delay > 224)    //cca 4s
            {
                if (PIND & (1<<PD3))
                {
                    lock_signal_delay = 0;
                    TCCR2 = 0;
                    TCNT2 = 0;
                    lock_signal = false;
                }

                else lock_signal_delay = 0;

            }
        }

        void lock_signal_handler()
        {
            if (!lock_signal)
            {
                lock_signal = true;
                TCCR2 = (1<<CS22) | (1<<CS21) | (1<<CS20);
            }
        }

        void adc_handler()
        {
            switch (channel)
            {
                case 0: current_positive = ADC;
                        channel++;
                        adc.set_channel(adc.ADC1);
                        adc.start_conversion();
                    break;

                case 1: current_negative = ADC;
                        channel = 0;
                        adc.set_channel(adc.ADC0);

                default: channel = 0;
                    break;
            }
        }

        void print_debug();
};

extern Controller controller;