
//[구동선택]{****
//[ ]맷돌가상구동
//[v]맷돌직접연결
//}************

//[설명]{-----------------------------------------------------------
//
//맷돌(G.MTDL.X)로 G.M.RC.BASiC(범용 RC서보 제어기)계열을 제어하는 기본 예제.
//
//맷돌(G.MTDL.X)에 내장된 통신포트(COM0)와 G.M.RC.BASiC 계열용 API 를 사용.
//
//G.M.RC.BASiC 을 보다 정확한 각도로 제어하기 위해서는 반드시 [영점조정] 필요.
//이는 [G.M.RC.BASiC-통합개발환경] 에서 수행가능.
//자세한 내용은 G.M.RC.BASiC 제품 페이지를 참고.
//
//각 API 마다 존재하는 자세한 설명문서를 꼭 참고 바람.
//
//2012.03.21.수
//기계닉스 첨단 대장장이 김갑철(金甲哲)
//}----------------------------------------------------------------

//[방법]{---------------------------------------------------------------
//
//1) { 설계묶음->참고자료->회로도 } 대로 연결 후 예제로 만들어진 가상기계(GVMX) 설치.
//
//2) 맷돌(G.MTDL.X) 재기동 후 G.M.RC.BASiC 에 연결된 RC서보 동작 확인.
//}--------------------------------------------------------------------


//[함수묶음] 에 등록된 API 를 사용하기 위한것.
#include "함수묶음.h"

#include "main.h"


//[내부정의]
//{
    #define  true     1
    #define  false    0

    //I/O 포트번호 정의.
    #define  P0       0
    #define  P1       1
    #define  P2       2

    //통신포트번호 정의.
    #define  COM0     0
    #define  COM1     1

    //DID:0 인 [G.M.RC.BASiC:제어기] 를 대상으로 제어.
    #define  DID0     0

    //속도종류 정의.
    #define  등속     1
    #define  가감속    2
    #define  가속     3
    #define  감속     4

//}


//[VAR]
//{
    //G.M.RC.BASiC 과 통신에 사용할 수신저장소 선언.
    //수신저장소는 반드시 [전역변수] 로 선언.
    unsigned char  서보수신저장소[10];

//}


void main(void)
{
  //[통신포트 열기]
  //{
      //G.M.RC.BASiC 과 통신할 맷돌(G.MTDL.X) 의 [통신포트:COM0] 열기.
      _GMRCBASIC_통신포트열기(COM0, 서보수신저장소);

  //}

  //[구동 확인]
  //{
      //간단한 동작 실행(동작 내용은 함수내 설명 참고).
      GMRCBASiC_동작확인();

  //}

  //main() 함수 종료 방지(검증시 편의를 위한것).
  while(1);

}

void GMRCBASiC_동작확인(void)
{
  //[!]{-------------------------------------------------
  //[맷돌모듈] 과 G.M.RC.BASiC 지원 API 를 사용하여 RC서보 제어.
  //단순하게 정해진 각도를 지정 횟수만큼 반복.
  //}----------------------------------------------------

  //[VAR]
  //{
      //8 개의 값을 포인터로 한번에 넘겨 주기 위한 임시 저장소.
      //여러 함수에서 사용하나 한개만 선언.
      unsigned char tempVal[8];

      int           i;

  //}

  //[사전 설정]
  //{
      //[!]{--------------------------------------------
      //G.M.RC.BASiC 에 연결된 각 RC서보에 맞게 설정.
      //각각의 자세한 정보는 홈페이지의 G.M.RC.BASiC 제품란 참고.
      //http://www.gigyenics.co.kr
      //}-----------------------------------------------

      //[완료보고시간:설정]
      //{
          //100%(기본값)로 지정 각도에 완전히 도달했을때 완료보고 하도록 설정.
          tempVal[0] = 100;
          tempVal[1] = 100;
          _GMRCBASIC_ReportTimeX(COM0, DID0, 2, tempVal);

      //}

      //[가감속상수:설정]
      //{
          //[가감속상수] 는 완전 독립적으로 적용되며 각 RC서보의 동작에 맞게 설정.
          tempVal[0] = 10;
          tempVal[1] = 5;
          _GMRCBASIC_AccelDivX(COM0, DID0, 2, tempVal);

      //}

      //[속도:설정]
      //{
          //[!]{--------------------------------------------
          //[속도] 는 작을수록 [고속] 임에 주의.
          //예제는 각도만 계속 변화되므로 [속도] 는 여기서 한번만 설정.
          //RC서보 마다 다른 속도를 적용해도 무관.
          //최고속(0) - 최저속(255) 사이의 값 사용.
          //}-----------------------------------------------

          tempVal[0] = 5;
          tempVal[1] = 5;
          //여기서는 설정만 하고 [반영] 하지 않는다.
          _GMRCBASIC_SpdMemX(COM0, DID0, 2, tempVal);

          //설정해 놓은 [속도] 를 일괄적으로 즉시 반영.
          _GMRCBASIC_MemSet(COM0, DID0);

      //}

  //}

  //[RC서보 구동]
  //{
      //[!]{---------------------------
      //두개 RC서보를 지정 횟수만큼 반복 구동.
      //}------------------------------

      for(i = 0; i < 3; i++)
      {
        //[반복 시작 위치로 이동]
        //{
            //각도 [기억].
            tempVal[0] = 15;
            tempVal[1] = 25;
            //여기서는 설정만 하고 [반영] 하지 않는다.
            _GMRCBASIC_DegMemX(COM0, DID0, 2, 등속, tempVal);

            //기억 시킨 각도 즉시 [반영](서보 구동 시작).
            _GMRCBASIC_MemSet(COM0, DID0);

        //}

        //[완료보고]
        //{
            //위에서 지정한 각도 위치에 도달한 경우 보고할것.
            _GMRCBASIC_Report(COM0, DID0);

            //완료보고 대기.
            _GMRCBASIC_WaitReport(COM0);

        //}

        //[반복 끝위치로 이동]
        //{
            //각도 [기억].
            tempVal[0] = 170;
            tempVal[1] = 165;
            //여기서는 설정만 하고 [반영] 하지 않는다.
            _GMRCBASIC_DegMemX(COM0, DID0, 2, 가감속, tempVal);

            //기억 시킨 각도 즉시 [반영](서보 구동 시작).
            _GMRCBASIC_MemSet(COM0, DID0);

        //}

        //[완료보고]
        //{
            //위에서 지정한 각도 위치에 도달한 경우 보고할것.
            _GMRCBASIC_Report(COM0, DID0);

            //완료보고 대기.
            _GMRCBASIC_WaitReport(COM0);

        //}

      }

  //}

}

