
//--------------------
//[G.M.RC.BASiC 2.1판]
//--------------------


//[설명]{-----------------------------------------------------------
//G.M.RC.BASiC 프로그램용 키워드와 해당 인수 정의.
//한글/영문 모두 사용가능하고 대/소 문자를 구분한다.
//123
//0xae
//0b10110101
//등 16진수 2진수 표기도 가능하다.
//라벨은 한글/영문/숫자등 전부 혼용하여 사용가능하다.(키워드와 겹치지만 않으면 된다)
//}----------------------------------------------------------------

//[가감속 인수]{----------------------------------
// 아래와 같은 이름상수만사용가능하다
// 등속(AccelNo)   : 같은 속도로 기동
// 가감속(Accel)   : 가속 -> 등속 -> 감속 순으로 기동
// 가속(AccelUp)   : 가속 -> 등속 순으로 으로기동
// 감속(AccelDown) : 등속 -> 감속 순으로 기동
//}--------------------------------------------

//[판올림]{-----------------------------------
//각 명령에는 각 판올림별 수정/추가 표시가 돼있습니다.
//예) [2.0판], [2.1판] ...
//}-----------------------------------------

//[상수정의]{-------
// < ACK > : 0xAC
// < END > : 0xED
//}---------------

//[G.M.RC.BASiC 라이브러리]{---------------------------------------------------------------------------
//C 언어로 제어시 사용할수 있는 G.M.RC.BASiC 용 표준함수 라이브러리는 기계닉스 홈페이지(http://www.gigyenics.co.kr)
//G.M.C.BASiC 제품란의 "다운로드" 에서 압축파일로 내려받을수 있습니다.
//압축을 풀어 나오는 *.h 문서에는 사용되는 각종 이름상수의 값이 정의되 있습니다(속도종류 등...).
//}--------------------------------------------------------------------------------------------------


//[각도(Degree)]
//{
    //[2.0판]{-------------------------
    각도        Did  번호  속도종류  각도값
    Degree     Did  번호  속도종류  각도값
    //}-------------------------------

    //[각도] 를 설정하고 바로 반영한다. 

    //[실제 통신처리 내용]
    //{        
        //<5> + { <DID> + (MSG_DegSet) + (번호) + (속도종류) + (각도값) } + { ACK확인 } 

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_Degree( DID, 번호, 속도종류, 각도값 );

    //}

//}


//[속도(Speed)]
//{
    //[1.0판]{-----------------
    속도        DID  번호  속도값
    Speed      DID  번호  속도값
    //}-----------------------

    //[속도] 를 설정하고 바로 반영한다.

    //[실제 통신처리 내용]
    //{        
        //<4> + { <DID> + (MSG_SpdSet) + (번호) + (속도값) } + { ACK확인 }  

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_Speed( DID, 번호, 속도값 );

    //}

//}


//[각도속도(DegSpd)]
//{
    //[2.0판]{--------------------------------
    각도속도     DID  번호  속도종류  각도값  속도값
    DegSpd     DID  번호  속도종류  각도값  속도값
    //}--------------------------------------

    //[각도], [속도] 를 동시에 설정 반영한다.

    //[실제 통신처리 내용]
    //{        
        //<6> + { <DID> + (MSG_DegSpdSet) + (번호) + (속도종류) + (각도값) + (속도값) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_DegSpd( DID, 번호, 속도종류, 각도값, 속도값 );

    //}

//}


//[각도8(Degree8)]
//{
    //[2.0판]{-------------------------------------------------------------------------
    각도8       DID  속도종류  각도0값  각도1값  각도2값  각도3값  각도4값  각도5값  각도6값  각도7값
    Degree8    DID  속도종류  각도0값  각도1값  각도2값  각도3값  각도4값  각도5값  각도6값  각도7값
    //}--------------------------------------------------------------------------------

    //서보 8 개 각각의 [각도] 를 일괄 설정하고 반영한다.

    //[실제 통신처리 내용]
    //{        
        //<4 + 8> + { <DID> + (MSG_DegMemX) + (8) + (속도종류) + (각도0값) + ... + (각도7값) } + { ACK확인 }
        //<2> + { <DID> + (MSG_MemSet) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        //각도를 저장할 변수 선언.
        unsigned char  degree[8];

        //각도 할당.
        degree[0] = 각도0값;
        ...
        degree[7] = 각도7값;      

        GMRCBASIC_DegMemX( DID, 8, 속도종류, degree );
        GMRCBASIC_MemSet( DID );

    //}

//}


//[각도8T(Degree8T)]
//{
    //[2.1판]{----------------------------------------------------------------------------------
    각도8T      DID  속도종류  기준속도  각도0값  각도1값  각도2값  각도3값  각도4값  각도5값  각도6값  각도7값
    Degree8T   DID  속도종류  기준속도  각도0값  각도1값  각도2값  각도3값  각도4값  각도5값  각도6값  각도7값
    //}----------------------------------------------------------------------------------------

    //서보 8 개 각각의 [각도] 를 일괄 설정하고 반영하며 [기준속도] 로 각각의 [각도] 에 따른 [속도] 도 자동 계산 반영한다.
    //이 명령은 각각의 서보를 시간에 동기화 하기 위한 명령으로 [기준속도] 로 각 서보의 작동 [속도] 까지 자동 계산 반영되며
    //동일한 종류의 서보의 경우 동시에 기동하여 동시에 정지하게 만들어 준다.
    //서로 다른 종류의 서보는 [속도계수X/SpdRateX] 명령으로 사전에 각 서보의 [속도계수] 를 설정해 주어야 
    //시간에 완벽하게 동기화 된다(해당 명령 참고).

    //[실제 통신처리 내용]
    //{        
        //<5 + 8> + { <DID> + (MSG_DegMemXT) + (8) + (속도종류) + (기준속도) + (각도0값) + ... + (각도7값) } + { ACK확인 }
        //<2> + { <DID> + (MSG_MemSet) } + { ACK확인 } 

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        //각도를 저장할 변수 선언.
        unsigned char  degree[8];

        //각도 할당.
        degree[0] = 각도0값;
        ...
        degree[7] = 각도7값;      

        GMRCBASIC_DegMemXT( DID, 8, 속도종류, 기준속도, degree );
        GMRCBASIC_MemSet( DID );

    //}

//}


//[속도8(Speed8)]
//{
    //[1.0판]{-----------------------------------------------------------------
    속도8       DID  속도0값  속도1값  속도2값  속도3값  속도4값  속도5값  속도6값  속도7값
    Speed8     DID  속도0값  속도1값  속도2값  속도3값  속도4값  속도5값  속도6값  속도7값
    //}------------------------------------------------------------------------

    //서보 8 개 각각의 [속도] 를 일괄 설정하고 반영한다.

    //[실제 통신처리 내용]
    //{        
        //<3 + 8> + { <DID> + (MSG_SpdMemX) + (8) + (속도0값) + ... + (속도7값) } + { ACK확인 }
        //<2> + { <DID> + (MSG_MemSet) } + { ACK확인 }
    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        //속도를 저장할 변수 선언.
        unsigned char  speed[8];

        //속도 할당.
        speed[0] = 속도0값;
        ...
        speed[7] = 속도7값;      

        GMRCBASIC_SpdMemX( DID, 8, speed );
        GMRCBASIC_MemSet( DID ); 

    //}

//}


//[각도설정(DegMem)]
//{
    //[2.0판]{-------------------------
    각도설정     DID  번호  속도종류  각도값
    DegMem     DID  번호  속도종류  각도값
   //}--------------------------------

    //[각도] 를 설정만 하고 반영하지는 않는다.

    //[실제 통신처리 내용]
    //{        
        //<5> + { <DID> + (MSG_DegMem) + (번호) + (속도종류) + (각도값) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_DegMem( DID, 번호, 속도종류, 각도값 );

    //}

//}


//[각도설정X(DegMemX)]
//{
    //[2.0판]{---------------------------------------------
    각도설정X    DID  설정개수(N) 속도종류  각도값0 ... 각도값(N-1)
    DegMemX    DID  설정개수(N) 속도종류  각도값0 ... 각도값(N-1)
    //}---------------------------------------------------

    //서보 N 개 각각의 [각도] 를 일괄 설정한다.
    //단, 무조건 0 번부터 N-1 번까지 설정된다.

    //[실제 통신처리 내용]
    //{ 
        //<4 + N> + { <DID> + (MSG_DegMemX) + (N) + (속도종류) + (각도값0) + ... + (각도값(N-1)) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        //각도를 저장할 변수 선언.
        unsigned char  degree[N];

        //각도 할당.
        degree[0]   = 각도값0;
        ...
        degree[N-1] = 각도값(N-1);      

        GMRCBASIC_DegMemX( DID, N, 속도종류, degree );

    //}

//}


//[각도설정XT(DegMemXT)]
//{
    //[2.1판]{------------------------------------------------------
    각도설정XT    DID  설정개수(N) 속도종류  기준속도  각도값0 ... 각도값(N-1)
    DegMemXT    DID  설정개수(N) 속도종류  기준속도  각도값0 ... 각도값(N-1)
    //}------------------------------------------------------------

    //서보 N 개 각각의 [각도] 를 일괄 설정하고 반영하며 [기준속도] 로 각각의 [각도] 에 따른 [속도] 도 자동 계산 반영한다.
    //단, 무조건 0 번부터 N-1 번까지 설정된다.
    //이 명령은 각각의 서보를 시간에 동기화 하기 위한 명령으로 [기준속도] 로 각 서보의 작동 [속도] 까지 자동 계산 반영되며
    //동일한 종류의 서보의 경우 동시에 기동하여 동시에 정지하게 만들어 준다.
    //서로 다른 종류의 서보는 [속도계수X/SpdRateX] 명령으로 사전에 각 서보의 [속도계수] 를 설정해 주어야 
    //시간에 완벽하게 동기화 된다(해당 명령 참고).

    //[실제 통신처리 내용]
    //{  	
        //<5 + N> + { <DID> + (MSG_DegMemXT) + (N) + (속도종류) + (기준속도) + (각도값0) + ... + (각도값(N-1)) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        //각도를 저장할 변수 선언.
        unsigned char  degree[N];

        //각도 할당.
        degree[0]   = 각도값0;
        ...
        degree[N-1] = 각도값(N-1);      

        GMRCBASIC_DegMemXT( DID, N, 속도종류, 기준속도, degree );

    //}

//}


//[속도설정(SpdMem)]
//{
    //[1.0판]{-----------------
    속도설정     DID  번호  속도값
    SpdMem     DID  번호  속도값
    //}-----------------------

    //[속도]를 설정만 하고 반영하지는 않는다.

    //[실제 통신처리 내용]
    //{ 
        //<4> + { <DID> + (MSG_SpdMem) + (번호) + (속도값) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_SpdMem( DID, 번호, 속도값 );

    //}

//}


//[속도설정X(SpdMemX)]
//{
    //[2.0판]{-------------------------------------
    속도설정X    DID  설정개수(N) 속도값0 ... 속도값(N-1)
    SpdMemX    DID  설정개수(N) 속도값0 ... 속도값(N-1)
    //}-------------------------------------------

    //서보 N 개 각각의 [속도] 를 일괄 설정한다.
    //단, 무조건 0 번부터 N-1 번까지 설정된다.

    //[실제 통신처리 내용]
    //{ 
        //<3 + N> + { <DID> + (MSG_SpdMemX) + (N) + (속도값0) + ... + (속도값(N-1)) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        //속도를 저장할 변수 선언.
        unsigned char  speed[N];

        //속도 할당.
        speed[0]   = 속도값0;
        ...
        speed[N-1] = 속도값(N-1);      

        GMRCBASIC_SpdMemX( DID, N, speed );

    //}

//}


//[각도속도설정(DegSpdMem)]
//{
    //[2.0판]{-------------------------------    
    각도속도설정  DID  번호  속도종류  각도값  속도값
    DegSpdMem  DID  번호  속도종류  각도값  속도값
    //}--------------------------------------

    //[각도], [속도] 를 설정만 하고 반영 하지는 않는다.

    //[실제 통신처리 내용]
    //{        
        //<6> + { <DID> + (MSG_DegSpdMem) + (번호) + (속도종류) + (각도값) + (속도값) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_DegSpd( DID, 번호, 속도종류, 각도값, 속도값 );

    //}

//}


//[설정반영(MemSet)]
//{
    //[1.0판]{------    
    설정반영     DID
    MemSet     DID
    //}------------

    //설정된 [각도], [속도] 를 반영한다.

    //[실제 통신처리 내용]
    //{ 
        //<2> + { <DID> + (MSG_MemSet) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_MemSet( DID );

    //}

//}


//[펄스(Pulse)]
//{
    //[2.0판]{-------------------------
    펄스        DID  번호  속도종류  펄스수
    Pulse      DID  번호  속도종류  펄스수
    //}-------------------------------

    //[펄스] 를 설정하고 바로 반영한다.
    //[가감속] 제어기능이 추가되었다.

    //[실제 통신처리 내용]
    //{        
        //실제 펄스수는 2 Byte 값으로 상위 Byte 를 먼저 전송하고 하위 Byte 를 전송한다.
        //<6> + { <DID> + (MSG_TickSet) + (번호) + (속도종류) +(tick-H) + (tick-L) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_Pulse( DID, 번호, 속도종류, 펄스수 );

    //}

//}


//[가감속상수(AccelDiv)]
//{
    //[2.0판]{-----------------
    가감속상수   DID  번호  DIV값
    AccelDiv   DID  번호  DIV값
    //}-----------------------

    //[가감속 구간 분할 상수] 값을 설정 한다.

    //[실제 통신처리 내용]
    //{        
        //<4> + { <DID> + (MSG_AccelDivSet) + (번호) + (DIV값) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_AccelDiv( DID, 번호, DIV값 );

    //}

//}


//[가감속상수8(AccelDiv8)]
//{
    //[2.0판]{------------------------------------------------------------------
    가감속상수8   DID  DIV0값  DIV1값  DIV2값  DIV3값  DIV4값  DIV5값  DIV6값  DIV7값
    AccelDiv8   DID  DIV0값  DIV1값  DIV2값  DIV3값  DIV4값  DIV5값  DIV6값  DIV7값
    //}------------------------------------------------------------------------- 

    //[가감속 구간 분할 상수] 값 8 개를 한꺼번에 설정 한다.

    //[실제 통신처리 내용]
    //{ 
        //<3 + 8> + { <DID> + (MSG_AccelDivSetX) + (8) + (DIV0값) + ... + (DIV7값) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        //가감속상수를 저장할 변수 선언.
        unsigned char  accelDiv[8];

        //가감속상수값 할당.
        accelDiv[0] = DIV0값;
        ...
        accelDiv[7] = DIV7값;      

        GMRCBASIC_AccelDivX( DID, 8, accelDiv );

    //}

//}


//[가감속상수X(AccelDivX)]
//{
    //[2.0판]{---------------------------------------
    가감속상수X   DID  설정개수(N)  DIV0값 ... DIV(N-1)값
    AccelDivX   DID  설정개수(N)  DIV0값 ... DIV(N-1)값
    //}----------------------------------------------

    //[가감속 구간 분할 상수] 값 N 개를 한꺼번에 설정 한다.
    //단, 무조건 0 번부터 N-1 번까지 설정된다.

    //[실제 통신처리 내용]
    //{        
        //<3 + N> + { <DID> + (MSG_AccelDivSetX) + (N) + (DIV0값) + ... + (DIV(N-1)값) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        //가감속상수를 저장할 변수 선언.
        unsigned char  accelDiv[N];

        //가감속상수값 할당.
        accelDiv[0]   = DIV0값;
        ...
        accelDiv[N-1] = DIV(N-1)값;      

        GMRCBASIC_AccelDivX( DID, N, accelDiv );

    //}

//}


//[완료보고시점(ReportTime)]
//{
    //[2.0판]{---------------------
    완료보고시점   DID  번호  완료비율값
    ReportTime  DID  번호  완료비율값
    //}---------------------------

    //[완료보고시점] 값을 설정 한다.
    //이 값은 백분율(%) 값으로 시작부터 종료까지의 구간을 100% 로 보고
    //어느 정도 기동 완료 후 보고 할지 해당 시점을 백분율(%) 값으로 지정하는 것이다.   
    // 1 <= [완료비율값] <= 100 의 범위를 갖는다.

    //[실제 통신처리 내용]
    //{        
        //<4> + { <DID> + (MSG_ReportTimeSet) + (번호) + (완료비율값) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_ReportTime( DID, 번호, 완료비율값 );

    //}

//}


//[완료보고시점X(ReportTimeX)]
//{
    //[2.0판]{----------------------------------------------
    완료보고시점X   DID  설정개수(N)  완료비율0값 ... 완료비율(N-1)값
    ReportTimeX  DID  설정개수(N)  완료비율0값 ... 완료비율(N-1)값
    //}-----------------------------------------------------

    //[완료보고시점] 값 N 개를 한꺼번에 설정 한다.
    //이 값은 백분율(%)값으로 시작부터 종료까지의 구간을 100% 로 보고
    //어느 정도 기동 완료 후 보고 할지 해당 시점을 % 값으로 지정하는 것이다.   
    // 1 <= [완료비율값] <= 100 의 범위를 갖는다.
    //단, 무조건 0 번부터 N-1 번까지 설정된다.

    //[실제 통신처리 내용]
    //{        
        //<3 + N> + { <DID> + (MSG_ReportTimeSetX) + (N) + (완료비율0값) + ... + (완료비율(N-1)값) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        //완료비율값를 저장할 변수 선언.
        unsigned char  reportTime[N];

        //완료비율값 할당.
        reportTime[0]   = 완료비율0값;
        ...
        reportTime[N-1] = 완료비율(N-1)값;      

        GMRCBASIC_ReportTimeX( DID, N, reportTime );

    //}

//}


//[완료보고(Report)]
//{
    //[2.0판]{------
    완료보고     DID
    Report     DID
    //}------------

    //각도변경이 완료된 경우 [완료보고] 할 것을 지시한다.

    //[실제 통신처리 내용]
    //{        
        //<2> + { <DID> + (MSG_Report) } + { ACK확인 }

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_Report( DID );

    //}

//}


//[완료보고대기(WaitReport)]
//{
    //[2.0판]{---    
    완료보고대기
    WaitReport
    //}---------

    //[완료보고] 가 수신 될때까지 대기한다.

    //[실제 통신처리 내용]
    //{        
        //통신으로 < END > 값이 수신될 때까지 대기.

    //}

    //[C 언어와 G.M.RC.BASiC 표준함수 사용시]
    //{
        GMRCBASIC_WaitReport();

    //}

//}


//-------------------------
//[통합개발 환경 자체 제공 기능]
//-------------------------


//아래는 [G.M.RC.BASiC] 자체 명령이 아닌 [통합개발환경] 에서 지원하는 기능들이며 편의를 위한 것임.
//MCU 등을 사용하는 경우는 자체적으로 구현하기 바람.


//[#이름상수(#NameConstant)]
//{
    #이름상수        [이름]    [상수값]
    #NameConstant  [이름]    [상수값] 
 
    //[통합개발환경 : 2.1판] 에서 부터 지원되는 기능.     
    //[이름상수] 는 [상수] 를 [이름] 으로 다루고자 할 경우 사용되며 중복 정의 되는 경우는 가장 나중에 
    //정의된 값이 유효하며 문장 어디에나 사용가능함.
    //[이름] 에는 [한글], [ a ~ z, A ~ Z, _ ] 의 [영문] 이 사용될 수 있으며 처음에 숫자로 시작 할수 없음.
    //[상수값] 에는 10진수, 16진수, 2진수 모두 사용 가능함.

    //[ANSI-C]
    //{
        #define   [이름]    [상수값]

        //단, ANSI-C 는 [한글이름] 을 지원하지 않음에 유의바람.

    //}

//}


//[시간지연(Delay)]
//{    
    시간지연     지연시간값(10ms 단위)
    Delay      지연시간값(10ms 단위)

    //10ms 단위(0.01초)로 시간을 지연 시킨다.
    //MCU 를 사용하는 경우는 사용자가 해당 MCU 에 맞게 만든 함수를 사용하기 바람.

    //예) 시간지연 100   //1초 동안 대기.    

//}


//[이동(Goto)]
//{   
    이동        라벨이름
    Goto       라벨이름

    //문서에서 지정 [라벨] 을 찾아 [라벨] 이 위치한 행으로 이동한다.
    //[라벨] 은 같은 이름이 여러개 있어도 상관은 없으나 이 경우 문서시작부터 가장 처음에 발견된 
    //[라벨] 이 지정하는 실행 문장행으로 이동하게 된다.

//}


//[끝(End)]
//{ 
    끝
    End

    //즉시 프로그램 실행을 종료한다. 
    //[인터프리타] 방식으로 실행 중 이 명령을 만나면 바로 실행을 중단하게 된다.
    //문서 어디에 와도 상관은 없으며 중복 사용되는 것도 허용된다.

//}


//[라벨선언]
//{    
    라벨이름:

    //[라벨이름] 에는 [한글], [ a ~ z, A ~ Z, _ ] 의 [영문] 이 사용될 수 있으며 
    //처음에는 숫자로 시작 할수 없고 뒤에 ':' 를 붙여 주면 된다.
    //같은 [이름] 이 중복 선언되어도 상관없으며 이 경우 문서 시작부터 가장 처음에 발견되는 [라벨이름] 이 유효하다.

//}



