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

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

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


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

#include "main.h"

//G.M.RC.BASiC 계열을 제어하기 위한 표준함수.
#include "gmrcbasic\gmrcbasic.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 인 제어기를 대상으로 제어.
    #define  DID0     0

//}


//[VAR]
//{
    //G.M.RC.BASiC 으로 부터 전송되는것은 <ACK>, <END> 단두개로 각각 1바이트 크기.
    //따라서, 최소 2 바이트 이상이면 충분(저장소는 <실제 사용크기 + 1> 로 설정).
    unsigned char  수신저장소[5];

//}


void main(void)
{
  //[통신포트 열기]
  //{
      //[설명]{--------------------------------------
      //맷돌(G.MTDL.X) 의 [통신포트:COM0] 사용.
      //38400BOS 사용(G.M.RC.BASiC 계열과 통신을 위한것).
      //이벤트는 사용하지 않음.
      //송신/수신 전부 사용.
      //}-------------------------------------------

      _Com_열기_(COM0,     //0번포트.
                true,     //송신사용.
                true,     //수신사용.
                수신저장소,  //수신저장소 지정.
                5,        //수신저장소 크기 지정(해당 배열의 크기와 동일하게 설정).
                38400);   //38400BPS 사용.

  //}

  //[구동 확인]
  //{
      //동작 내용은 함수 내부 설명 참고.
      GMRCBASiC_동작확인();

  //}

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

}

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

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

      int           i;

  //}

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

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

      //}

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

      //}

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

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

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

      //}

  //}

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

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

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

        //}

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

            //완료보고 대기.
            GMRCBASIC_WaitReport();

        //}

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

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

        //}

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

            //완료보고 대기.
            GMRCBASIC_WaitReport();

        //}

      }

  //}

}

