#include "stepper_tildado.h"

uint8_t medio_paso[8][4] = // bidimentiomal array with the step sequence
    {
        {1, 0, 0, 0},
        {1, 1, 0, 0},
        {0, 1, 0, 0},
        {0, 1, 1, 0},
        {0, 0, 1, 0},
        {0, 0, 1, 1},
        {0, 0, 0, 1},
        {1, 0, 0, 1}};

uint8_t paso_completo[4][4] = // bidimentiomal array with the step sequence
    {
        {1, 1, 0, 0},
        {0, 1, 1, 0},
        {0, 0, 1, 1},
        {1, 0, 0, 1}};

int stepper_tildado ::get_nivel() {
  return this->pos_actual;
}

void stepper_tildado ::stepper_conv(int nivel)
{
  int vueltas;
  int dir;
  
  vueltas = (nivel - this->pos_actual) * DIFERENCIA_NIVELES_TILDADO;
  dir = (0 < vueltas) - (vueltas < 0);
  this->stepper_vueltas(abs(vueltas), dir);
  this->pos_actual = nivel;
}

void stepper_tildado ::stepper_vueltas(int vueltas, int dir)
{
  for (int i = 0; i < vueltas * 512; i++)
  {
    if (dir == UP)
    {
      for (int k = 0; k < 8; k++)
      {
        digitalWrite(this->IN1, medio_paso[k][0]);
        digitalWrite(this->IN2, medio_paso[k][1]);
        digitalWrite(this->IN3, medio_paso[k][2]);
        digitalWrite(this->IN4, medio_paso[k][3]);
        delay(this->demora);
      }
    }
    if (dir == DOWN)
    {
      for (int k = 7; k >= 0; k--)
      {
        digitalWrite(this->IN1, medio_paso[k][0]);
        digitalWrite(this->IN2, medio_paso[k][1]);
        digitalWrite(this->IN3, medio_paso[k][2]);
        digitalWrite(this->IN4, medio_paso[k][3]);
        delay(this->demora);
      }
    }
  }
}
