#include "MotorA4988.h"
#include <SD.h>

#define PIN_DIR 6
#define PIN_STEP 7

#define ZERO 48
#define NINE 57

const int stepsPerRevolution = 200;

MotorA4988 motor(stepsPerRevolution, PIN_DIR, PIN_STEP);
File programmFile;
long steps = 0;
byte direction = 0;
unsigned long delayTime = 0;

void executeNextLine()
{  
  static int line = 0;
  static bool fileFinished = false;
  if(programmFile.available())
  {  
    ++line;
    Serial.print("Line = ");
    Serial.print(line);
    skipBadSymbols();
    steps = readNumber();
    skipBadSymbols();
    direction = programmFile.read() - ZERO;
    skipBadSymbols();
    delayTime = readNumber();

    Serial.print(", steps = ");
    Serial.print(steps);
    Serial.print(", direction = ");
    Serial.print(direction);
    Serial.print(", delay = ");
    Serial.println(delayTime);

    if(direction == 1)
    {
      motor.step(steps);  
    }
    else
    {
      motor.step(-steps);  
    }    
    delay (delayTime);
  }
  else if(!fileFinished)
  {
    programmFile.close();
    fileFinished = true;
    Serial.println("Programm finished.");        
  }  
};

void skipBadSymbols()
{
  byte symbol;
  do
  {
    symbol = programmFile.read();
  }while(symbol < ZERO || symbol > NINE);
  programmFile.seek(programmFile.position() - 1);
};

long readNumber()
{
  byte symbol;
  long value = 0;
  do
  {
    symbol = programmFile.read();    
    if(symbol < ZERO || symbol > NINE) {break;}
    value = value * 10 + (symbol - ZERO);
  }while(1);
    
  return value;
};

void setup() {
  motor.setSpeed(60);
  motor.step(2);//компенсация начального сдвига  

  Serial.begin(115200);
  Serial.print("Initializing SD card... ");
  if (!SD.begin())
  {
  Serial.println("card initialization failed!");
  while (1);
  }
  Serial.println("initialization done.");
  
  Serial.print("File motor.txt opening... ");
  programmFile = SD.open("motor.txt");
    
  if(!programmFile) 
  {
    Serial.println("error opening motor.txt!");
    while (1);
  } 
  else
  {
    Serial.println("file motor.txt is open.");
  }
};

void loop() 
{
  executeNextLine();  
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
stepper1:A-
stepper1:A+
stepper1:B+
stepper1:B-
A4988
drv1:ENABLE
drv1:MS1
drv1:MS2
drv1:MS3
drv1:RESET
drv1:SLEEP
drv1:STEP
drv1:DIR
drv1:GND.1
drv1:VDD
drv1:1B
drv1:1A
drv1:2A
drv1:2B
drv1:GND.2
drv1:VMOT
vcc1:VCC
gnd1:GND
sd1:CD
sd1:DO
sd1:GND
sd1:SCK
sd1:VCC
sd1:DI
sd1:CS