#include "Arduino.h"

//motor spot
const int spinENA = 11;
const int spinPUL = 9;
const int spinDIR = 10;

//motor Y
const int ypinENA = 8;
const int ypinPUL = 12;
const int ypinDIR = 13;

//motor cam
const int fpinENA = 3;
const int fpinPUL = 4;
const int fpinDIR  = 5;

//positions (сверять с детекторами)
long xP = 0;
long yP = 0;
long bP = 0;

//Vrefx = 0.7 * 1.68 * 0.100 * 8 = 0.9408
//Vrefy = 0.7 * 2.8 * 0.100 * 8 =  1.568
//steps
const float st = 1.8;
int stepsf = 30;
int stepsy = 2;
int stepss = 1;


//line mode
int wig_del = 4500;

int wig_st = 2;


//delays
const int dED = 6000; // 8000
const int dDP = 6000; // 8000 для сканирования
int slP = 6000; // 
int sdP = 12000; //

//ENA: HIGH - open, LOW - closed



long stepY(int del1, int del2, int del3, int del4, int d) {
  float start = millis();
  digitalWrite(ypinENA, LOW);
  digitalWrite(fpinENA, LOW);
  delayMicroseconds(del1);
  digitalWrite(ypinDIR, d);
  digitalWrite(fpinDIR, d);
  delayMicroseconds(del2);

  digitalWrite(ypinPUL, HIGH);
  digitalWrite(fpinPUL, HIGH);
  delayMicroseconds(del3);
  digitalWrite(ypinPUL, LOW);
  digitalWrite(fpinPUL, LOW);
  delayMicroseconds(del4);
  
  switch (d) {
    case 1:
      yP += 1;
      break;
    case 0:
      yP -= 1;
      break;
  }
  digitalWrite(ypinENA, HIGH);
  float end = millis();
  float diff = end - start;
  return (diff);
}

long stepS(int del1, int del2, int del3, int del4, int d) {
  float start = millis();

  digitalWrite(spinENA, LOW);
  delayMicroseconds(del1);
  digitalWrite(spinDIR, d);
  delayMicroseconds(del2);

  digitalWrite(spinPUL, HIGH);
  delayMicroseconds(del3);
  digitalWrite(spinPUL, LOW);
  delayMicroseconds(del4);
  

  digitalWrite(spinENA, HIGH);
  float end = millis();
  float diff = end - start;
  return (diff);
}

long stepF(int del1, int del2, int del3, int del4, int d) {
  float start = millis();
  //total_step_time = del1 / 1000000 + del2 / 1000000 + del3 / 1000000 + del4 / 1000000
  digitalWrite(fpinENA, LOW);
  delayMicroseconds(del1);
  digitalWrite(fpinDIR, d);
  delayMicroseconds(del2);

  digitalWrite(fpinPUL, HIGH);
  delayMicroseconds(del3);
  digitalWrite(fpinPUL, LOW);
  delayMicroseconds(del4);
  
 
  digitalWrite(fpinENA, HIGH);
  float end = millis();
  float diff = end - start;
  return (diff);
}




void setup() {
  Serial.begin(115200);

  pinMode(spinENA, OUTPUT);
  pinMode(spinDIR, OUTPUT);
  pinMode(spinPUL, OUTPUT);
  
  pinMode(ypinENA, OUTPUT);
  pinMode(ypinDIR, OUTPUT);
  pinMode(ypinPUL, OUTPUT);
  
  pinMode(fpinENA, OUTPUT);
  pinMode(fpinDIR, OUTPUT);
  pinMode(fpinPUL, OUTPUT);

  
  digitalWrite(spinENA, LOW);
  digitalWrite(fpinENA, LOW);
  digitalWrite(ypinENA, LOW);

  digitalWrite(11, HIGH);
  Serial.println('AMOGUS');
}

void loop() {


  int req = Serial.read();
  
  switch(req) {
    case '1':
      wig_del = 4500;
      Serial.println("> Line mode delay set to: 4500 microsec.");
      break;
    case '2':
      wig_del = 3000;
      Serial.println("> Line mode delay set to: 3000 microsec.");
      break;
    case '3': 
      if ( wig_st > 2) {Serial.println("> Prohibited delay for this steps mode!");}
      else {
        wig_del = 2500;
        Serial.println("> Line mode delay set to: 2500 microsec.");
      }
      break; 
    case 'w':
      for (int yu = 0; yu < stepsy; yu++) {
        stepY(dED, dDP, slP, sdP, LOW);
      }
      break;
    case 's':
      for (int yd = 0; yd < stepsy; yd++) {
        stepY(dED, dDP, slP, sdP, HIGH);
      }
      break;
    case '-':
      for (int sc = 0; sc < stepss; sc++)
      {
        stepS(dED, dDP, wig_del*2, wig_del*2, HIGH);
      }
      break;
    case '+':
      for (int fc = 0; fc < stepss; fc++)
      {
        stepS(dED, dDP, slP, sdP, LOW);
      }
      break;
    case 'f':
      int req2 = Serial.read();
      int sw2 = HIGH;
      float k = 0.4;
      while (1) {
        req2 = Serial.read();
        if (req2 == 'F') {
          break;
        }
        for (int a = 0; a < wig_st; a++) {
          stepY(dED, dDP, wig_del, wig_del, sw2); 
        }
        if (sw2 == HIGH) {sw2 = LOW;}
        else {sw2 = HIGH;}
      }     
  }
}
A4988