Newer
Older
#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
};
enum current_tresholds
{
OFF_TRESHOLD = 300,
ON_TRESHOLD = 50
};
enum stabilization_tresholds
{
STABILIZATION_TRESHOLD = 450 //500ms
};
enum gate_modes
{
WAITING_FOR_LOCK_SIGNAL,
OPENING_PISTON,
WAITING_FOR_CLOSING_CURRENT,
WAITING_FOR_CURRENT_REVERSATION,
WAITING_FOR_CURRENT_DROP,
WAITING_FOR_STABILIZATION,
CLOSING_PISTON
};
//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;
volatile uint8_t debug_delay;
volatile uint16_t stabilization_delay;
gate_modes gate_mode;
private:
void waiting_for_lock_signal();
void opening_piston();
void waiting_for_closing_current();
void waiting_for_current_reversation();
void waiting_for_current_drop();
void waiting_for_stabilization();
void closing_piston();
public:
Controller();
void timer0_handler()
{
adc.start_conversion();
debug_delay++;
if (gate_mode == WAITING_FOR_STABILIZATION) stabilization_delay++;
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;