/*
   Created by DIYables

   This example code is in the public domain

   Product page: https://diyables.io/products/infrared-ir-remote-control-kit-with-17-key-controller-and-receiver
*/

#include <DIYables_IRcontroller.h> // DIYables_IRcontroller library
#define IR_RECEIVER_PIN 0 // The Arduino pin connected to IR controller
DIYables_IRcontroller_17 irController(IR_RECEIVER_PIN, 200); // debounce time is 200ms
#define M_IN1 2
#define M_IN2 14
#define M_IN3 15
#define M_IN4 13
#define gpLed 4

int motor_speed = 255;//모터 스피드
int motorA_vector = 1;//모터의 회전방향이 반대일시 0을 1로 1을 0으로 바꿔주시면 모터의 회전방향이 바뀝니다.
int motorB_vector = 1;//모터의 회전방향이 반대일시 0을 1로 1을 0으로 바꿔주시면 모터의 회전방향이 바뀝니다.
int readIR;//리모콘으로 부터 들어오는 값을 저장하는 변수

void setup() {
  Serial.begin(9600);
  pinMode(M_IN1, OUTPUT);
  pinMode(M_IN2, OUTPUT);
  pinMode(M_IN3, OUTPUT);
  pinMode(M_IN4, OUTPUT);
  pinMode(gpLed, OUTPUT);
  irController.begin();
  Serial.println("test");
   digitalWrite(gpLed, LOW);

}

void loop() {
  digitalWrite(gpLed, LOW);
  static unsigned char temp = 0;
  Key17 command = irController.getKey();
  if (command != Key17::NONE) {
    switch (command) {
      case Key17::KEY_UP:
        readIR = 2;
        break;

      case Key17::KEY_DOWN:
        readIR = 8;
        break;

      case Key17::KEY_LEFT:
        readIR = 4;
        break;

      case Key17::KEY_RIGHT:
        readIR = 6;
        break;

      case Key17::KEY_OK :
        readIR = 5;break;
      default:
        break;
    }
  }

      if(temp != readIR)
    {
      temp = readIR;
      if(readIR == 2)
      {
        motor_con(motor_speed, motor_speed); //전진
      }
      else if(readIR == 4)
      {
        motor_con(255, -255); //좌회전
      }
      else if(readIR == 5)
      {
        motor_con(0, 0); //정지
      }
      else if(readIR == 6)
      {
        motor_con(-255, 255); //우회전
      }
      else if(readIR == 8)
      {
        motor_con(-motor_speed, -motor_speed); //후진
      }
    }
}
void motor_con(int M1, int M2) { //모터 함수

  if (M1 > 0) { //모터A 정회전
    digitalWrite(M_IN1, motorA_vector);
    digitalWrite(M_IN2, !motorA_vector);
  }
  else if (M1 < 0) { //모터A 역회전
    digitalWrite(M_IN1, !motorA_vector);
    digitalWrite(M_IN2, motorA_vector);
  }
  else {       //모터 A 정지
    digitalWrite(M_IN1, LOW);
    digitalWrite(M_IN2, LOW);
  }

  if (M2 > 0) { //모터B 정회전
    digitalWrite(M_IN3, motorB_vector);
    digitalWrite(M_IN4, !motorB_vector);
  }
  else if (M2 < 0) { //모터B 역회전
    digitalWrite(M_IN3, !motorB_vector);
    digitalWrite(M_IN4, motorB_vector);
  }
  else {         //모터 B 정지
    digitalWrite(M_IN3, LOW);
    digitalWrite(M_IN4, LOW);
  }
}
