#include "Arduino.h"
#include <Stepper.h>

/*  Trieda Motor,definuje základné parametre, a schopnosti,
    ktorými, vytvorený objekt uvedenej triedy disponuje.

    Podstatou triedy, je vytvoriť funkcie, ktrými, by bolo
    možné, ovládať krokové motory, tvoriace zariadenie
    goniofotometra, a tým umožnili proces merania.

    Zároveň, je v tejto triede definovaný aj priebeh
    meracieho procesu, kedže v sekcii "motory.cpp"
    sú vytvorené funkcie, ktoré špecifikujú krokovanie
    jednotlivých krokových motorov.
*/


/*
    Zadefinovanie konštánt, ktoré určujú čísla
    príslušných vstupno/výstupných pinov zariadenia
    Arduino UNO, ako aj zadefinovanie limitného
    počtu krokov, ktoré môžu motory dosiahnuť, a
    hodnota pauzy, medzi jednotlivými krokmi.
*/
#define MOTOR_C_PULL 8
#define MOTOR_C_DIR 9
#define MOTOR_GAMMA_PULL 10
#define MOTOR_GAMMA_DIR 11
#define SPEED_GAMMA 1
#define SPEED_CPLANE 3
#define CPLANE_RANGE_LIMIT 25560/2
#define GAMMA_RANGE_LIMIT 25560
#define DELAY_VALUE 0

/*
   Definovanie samotnej triedy MOTOR
*/
class MOTOR {
  public:
    MOTOR();
    void Cplane_MotorInit(int multiplicationOfRegularStep);
    void Gamma_MotorInit(int multiplicationOfRegularStep);
    boolean getEndOf_MeassurementProcess();
    boolean find_refPosition_C_Motor();
    boolean find_refPosition_Gamma_Motor();
    void moveGammaMotor();
    boolean gammaMotor_Move();
    boolean cMotor_Move();
    void setGammaMove(boolean flag);
    void setCplaneMove(boolean flag);
    void moveForCorrection(int stepM);
    int get_stepCplane();
    void set_ref_Position_C_Motor(boolean flag);
    void set_ref_Position_Gamma_Motor(boolean flag);

  private:
    Stepper *Cplane_Motor;
    Stepper *Gamma_Motor;
    int GAMMA_INTERRUPTOR;
    int C_PLANE_INTERRUPTOR;
    int stepCplane;
    int stepGamma;
    int gamma_Direction;
    int cPlane_Direction;
    void moveCplaneMotor();
    int gammaStepValue;
    int cPlaneStepValue;
    boolean endMeasurementFlag;
    boolean cMove;
    boolean gammaMove;
    boolean ref_Position_C_Motor;
    boolean ref_Position_Gamma_Motor;
    void slowStepGamma(int dir, int steps);
    void slowStepCplane(int dir, int steps);
};
