#include <Automaton.h>
#include "Atm_AccelStepper.h"


Atm_AccelStepper stepper ;
int STEPPER_STEPPIN = 25 ;
int STEPPER_DIRPIN = 26 ;
int STEPPER_MAXSPEED = 1000000 ;
int STEPPER_ACCELERATION = 100000;

Atm_timer timer;
char cmd_buffer[80];
Atm_command cmd;

enum { CMD_M, CMD_M2, CMD_R, CMD_S, CMD_P };
const char cmdlist[] = 
  "m m2 r s p";

void cmd_callback( int idx, int v, int up ) {
  int pin = atoi( cmd.arg( 1 ) );
  switch ( v ) {
    case CMD_M: 
      Serial.print("move : ");
      Serial.println(pin);
      stepper.move(pin);
      return;
    case CMD_M2:
      Serial.print("moveTo : ");
      Serial.println(pin);
      stepper.moveTo(pin);
      return;
    case CMD_R: 
      Serial.print("rotate : ");
      Serial.println(pin);
      stepper.rotate(pin);
      return;
    case CMD_S:
      Serial.println("stop");
      stepper.stop();
      return;
      case CMD_P:
      Serial.print("position : ");
      Serial.println(stepper.getPosition());
      return;
      }
}

void timer_callback( int idx, int v, int up ) {
  //Serial.println("timer");
  Serial.print("position : ");
  Serial.println(stepper.getPosition());
  stepper.rotate(50);
}

void setup() {

  Serial.begin( 9600 );
  cmd.begin( Serial, cmd_buffer, sizeof( cmd_buffer ) )
    .list( cmdlist )
    .onCommand( cmd_callback );

    
  // AccelStepper.trace( Serial );

  stepper.begin(STEPPER_STEPPIN, STEPPER_DIRPIN)
         .pinReversed(0, 0, 0)
         .setMaxSpeed(STEPPER_MAXSPEED)
         .setAcceleration(STEPPER_ACCELERATION)
         .enable();
  stepper.trace(Serial);

  stepper.limitLow_set(1, 15, 0).limitLow_isHard(1)//.limitLow_setThresholds(1200, 2300)
         .limitHigh_set(1, 2, 0).limitHigh_isHard(1)      
          // .onOnlimitlow([](int idx, int v, int up){ stepper.setPosition(0);stepper.move(1000);})
         .onOnlimitlow([](int idx, int v, int up){ Serial.println('limit low');})
          //   // .onOnlimithigh([](int idx, int v, int up){stepper.setPosition(DAY_STEPS*MICROSTEPPING);})
         .onOnlimithigh([](int idx, int v, int up){Serial.println('limit high');})
            ;

   timer.begin(2000).repeat(-1).onTimer(timer_callback).start();
   

}

void loop() {
  automaton.run();
  //Serial.println(stepper.limitLow_State);
}