// Controlling multiple servo motors with the Arduino Uno.
// Version 1:   https://wokwi.com/projects/369705616834606081
// Version 2:   https://wokwi.com/projects/370198618373197825
// Version 3:   https://wokwi.com/projects/370260137667236865
// Version 4:   https://wokwi.com/projects/370269233463345153  Added separate callback functions for each button.
// Version 4.1: https://wokwi.com/projects/370440521607948289  Added buttons and servos for turntables.
// Version 5:   https://wokwi.com/projects/370269233463345153  Modified turnLeft() and turnRight() to remember the current turn.
#include <slowServo.h>
#include <mechButton.h>
#define TURN_1 180
#define TURN_2 0
#define CLOSE_1 30
#define CLOSE_2 150
#define OPEN_1 90
#define OPEN_2 90
#define MS_DEG 30
mechButton  turntableLeftBtn(13);
mechButton  turntableRightBtn(10);
slowServo   turntableLeftServo(12);
slowServo   turntableRightServo(11);
mechButton  closeLockABtn(2);
mechButton  openLockABtn(3);
slowServo   lockA1Servo(5);
slowServo   lockA2Servo(4);
mechButton  closeLockBBtn(9);
mechButton  openLockBBtn(8);
slowServo   lockB1Servo(6);
slowServo   lockB2Servo(7);
void turnServo(slowServo& servo, uint8_t turn)
{
  int deg = turn == 1 ? TURN_1 : TURN_2;
  servo.setDeg(deg);
}
void turnLeft()
{
  if (!turntableLeftBtn.getState())
  {
    static uint8_t turn = 1;
    turn = turn == 1 ? 2 : 1;
    turnServo(turntableLeftServo, turn);
  }
}
void turnRight()
{
  if (!turntableRightBtn.getState())
  {
    static uint8_t turn = 1;
    turn = turn == 1 ? 2 : 1;
    turnServo(turntableRightServo, turn);
  }
}
void closeLockA()
{
  if (!closeLockABtn.getState())
  {
    lockA1Servo.setDeg(CLOSE_1);
    lockA2Servo.setDeg(CLOSE_2);
  }
}
void closeLockB()
{
  if (!closeLockBBtn.getState())
  {
    lockB1Servo.setDeg(CLOSE_1);
    lockB2Servo.setDeg(CLOSE_2);
  }
}
void openLockA()
{
  if (!openLockABtn.getState())
  {
    lockA1Servo.setDeg(OPEN_1);
    lockA2Servo.setDeg(OPEN_2);
  }
}
void openLockB()
{
  if (!openLockBBtn.getState())
  {
    lockB1Servo.setDeg(OPEN_1);
    lockB2Servo.setDeg(OPEN_2);
  }
}
void setup()
{
  Serial.begin(115200);
  turntableLeftBtn.setCallback(turnLeft);
  turntableRightBtn.setCallback(turnRight);
  turntableLeftServo.begin();
  turntableRightServo.begin();
  turntableLeftServo.setDeg(TURN_1);
  turntableRightServo.setDeg(TURN_1);
  sleep(1000);
  turntableLeftServo.setMsPerDeg(MS_DEG);
  turntableRightServo.setMsPerDeg(MS_DEG);
  closeLockABtn.setCallback(closeLockA);
  openLockABtn.setCallback(openLockA);
  lockA1Servo.begin();
  lockA2Servo.begin();
  lockA1Servo.setDeg(OPEN_1);
  lockA2Servo.setDeg(OPEN_2);
  sleep(1000);
  lockA1Servo.setMsPerDeg(MS_DEG);
  lockA2Servo.setMsPerDeg(MS_DEG);
  closeLockBBtn.setCallback(closeLockB);
  openLockBBtn.setCallback(openLockB);
  lockB1Servo.begin();
  lockB2Servo.begin();
  lockB1Servo.setDeg(CLOSE_1);
  lockB2Servo.setDeg(CLOSE_2);
  sleep(1000);
  lockB1Servo.setMsPerDeg(MS_DEG);
  lockB2Servo.setMsPerDeg(MS_DEG);
}
void loop()
{
  idle();
}