#ifndef __FLIPFLAT_H__
#define __FLIPFLAT_H__

#include <Arduino.h>

#include <Streaming.h>
#include <EasyButton.h>
#include <AccelStepper.h>

#define DEBUG       0
#define UNIPOLAR    0

#ifdef ESP32
#define BRIGHT_PLUS GPIO_NUM_34
#define BRIGHT_MIN  GPIO_NUM_35
#define PWM         GPIO_NUM_25  
#define COER_FF     GPIO_NUM_39

#define FF_SERIAL   Serial2
#define LOG_SERIAL  Serial
#endif

#ifdef __AVR_ATmega32U4__
#define BRIGHT_PLUS 15 
#define BRIGHT_MIN  14
#define PWM         9  
#define COVER_FF    16

#define FF_SERIAL   Serial  
#define LOG_SERIAL  Serial1
#endif

#if UNIPOLAR
#define STEP_PIN1   5
#define STEP_PIN2   6
#define STEP_PIN3   7
#define STEP_PIN4   8
#define STEPS       2038
#else
#define STEP_PIN    7
#define DIR_PIN     8
#define STEPS       200 // steps per revolution for the motor
#endif

#define OPEN_ANGLE  270.0

enum devices {
  FLAT_MAN_L = 10,
  FLAT_MAN_XL = 15,
  FLAT_MAN = 19,
  FLIP_FLAT = 99
};

enum motorStatuses {
  STOPPED = 0,
  RUNNING
};

enum lightStatuses {
  OFF = 0,
  ON
};

enum shutterStatuses {
  NEITHER_OPEN_NOR_CLOSED = 0, // ie not open or closed...could be moving
  CLOSED,
  OPEN,
  TIMED_OUT
};

enum motorDirections {
  OPENING = 0,
  CLOSING,
  NONE
};


void setupSerial();
void handleSerial();
void handleCoverSwitch();

void increaseBrightness();
void decreaseBrightness();
void setBrightness(int newBrightness);
void openFlipFlat();
void closeFlipFlat();
void rotateMotor(float newAngle);

void processCommand(const char* cmd, const char *data);
void parseCommand();

#if DEBUG
#ifndef LOG
#define LOG(A) LOG_SERIAL << F(A) << endl
#define LOG1(A, B) LOG_SERIAL << F(A) << B << endl;
#endif
#else
#define LOG(A)
#define LOG1(A, B)
#endif //DEBUG

#endif //__FLIPFLAT_H__