
#ifndef _GMRCBASIC_MSG_H_SYS_
#define _GMRCBASIC_MSG_H_SYS_


//[2007.10.04.목][생성]{---------
//IAR 용으로 만든 것을 사용한다.
//}------------------------------

//[제어명령]
//{
    //전달받은 패킷을 무사히 처리했음을 알려준다.
    //[패킷] 을 처리한 뒤에는 반드시 컨트롤러는 이 신호를 전송해야 한다.
    #define  d_ACK     0xac

    //[2008.01.19.토][추가!!!]
    //[완료보고] 값을 정의한다.
    #define  d_END     0xed

    //[2008.02.06.수][추가!!!]{--------------------
    //[속도종류] 인수를 위한 설정 상수를 정의한다.
    #define  d_AccelNo       1  //등속
    #define  d_Accel         2  //가감속
    #define  d_AccelUp       3  //가속
    #define  d_AccelDown     4  //감속
    //}--------------------------------------------

//}

//[컨트롤러병령]
//{
    //[포맷]
    //{
        //-----------------------------------
        //항상 아래의 포멧을 따른다.
        //<count> + { <DID> +     ...      }
        //   ^------|<----이 byte 수------>|
        //-----------------------------------
    //}

    //[설정]
    //{
        //설정만 해 놓은 각도 속도를 전부다 즉시 반영한다.
        #define  d_MSG_MemSet               0x01
        //{
            //<2> + { <DID> + (MSG_MemSet) }
            //                               + <ACK>
        //} 
               
    //}
    
    //[각도관련]
    //{
        //각도를 설정하고 즉시 반영한다.
        #define  d_MSG_DegSet               0x10
        //{
            //<5> + { <DID> + (DegSet) + (SID) + (속도종류) + (각도) }
            //                                                         + <ACK>
        //}        
    
        //각도를 설정하되 반영하지는 않는다.
        #define  d_MSG_DegMem               0x11
        //{
            //<5> + { <DID> + (DegMem) + (SID) + (속도종류) + (각도) }
            //                                                         + <ACK>
        //}    
  
        //[2008.01.29.화][추가!!!]
        //[각도] 설정 값 N개(최대 8개)를 동시에 설정한다.
        #define  d_MSG_DegMemX              0x12
        //{
            //<4 + N> + { <DID> + (DegMemX) + (N) + (속도종류) + (각도0) + ... + (각도(N-1)) }
            //                                                                                 + <ACK>
            // 1<= N <= 8
        //}
        
        //[각도 읽기]
        //지정 서보의 [속도] 를 읽어서 전송한다.
        //현재 내부적으로 각도는 tick 값으로 사용되고 있으므로 전송시에는
        //tick 값을 각도 값으로 변환하여 전송해야 한다.
        #define  d_MSG_DegRead              0x13
        //{
            //<3> + { <DID> + (MSG_DegRead) + (SID) }
            //                                        + (각도값) + <ACK>
        //}


        //[2008.08.17.일][추가!!!]
        //[각도] 설정 값 N개(최대 8개)를 동시에 설정하고 해당 각도 변화량에 따른 속도도 자동 설정한다.
        //즉, 시간적으로 완전히 서보의 동작을 동기화 하기 위한 고급 명령이다.
        //이를 위하여 각도의 변화량은 항상 각도가 변화되는 경우 항상 추출해서 관리해야 한다.
        #define  d_MSG_DegMemXT             0x14
        //{
            //<5 + N> + { <DID> + (DegMemXT) + (N) + (속도종류) + (속도) + (각도0) + ... + (각도(N-1)) }
            //                                                                                          + <ACK>
            // 1<= N <= 8
        //}


    //}

    //[속도 설정]
    //{
        //속도를 설정하고 즉시 반영한다.
        #define  d_MSG_SpdSet               0x20
        //{
            //<4> + { <DID> + (SpdSet) + (SID) + (속도) }
            //                                            + <ACK>
        //}
        
        //속도를 설정하나 반영하지는 않는다.
        #define  d_MSG_SpdMem               0x21
        //{
            //<4> + { <DID> + (MSG_SpdMem) + (SID) + (속도) }
            //                                                + <ACK>
        //}
        
        //[2008.01.29.화][추가!!!]
        //[속도] 설정 값 N개(최대 8개)를 동시에 설정한다.
        #define  d_MSG_SpdMemX              0x22
        //{
            //<3 + N> + { <DID> + (MSG_SpdMemX) + (N) + (속도0) + ... + (속도(N-1)) }
            //                                                                        + <ACK>
            // 1<= N <= 8
        //}        
        
        //지정 서보의 [속도] 를 읽어서 전송한다.
        #define  d_MSG_SpdRead              0x23
        //{
            //<3> + { <DID> + (MSG_SpdRead) + (SID) }
            //                                          + (속도값) + <ACK>

        //}
        
        //[시작 속도 tick 8개 동시 쓰기]
        //[2008.01.30.수][추가!!!]{---------------------------------------
        //[시작속도tick] 8 개를 한꺼번에 설정한다.
        //이 기능은 IDE 에서 eeprom 의 해당 내용을 일괄설정할때 사용된다.
        //}---------------------------------------------------------------
        
        #define  d_MSG_StartSpd8Set         0x24
        //{
            //<10> + { <DID> + (MSG_StartSpd8Set) + (속도0) + ... + (속도7) }
            //                                                                + <ACK>
        //}
        
        //[시작 속도 tick 8개 동시 읽기]
        //[2008.01.30.수][추가!!!]{------------------------------------------------
        //[시작속도tick] 8 개를 한꺼번에 읽어들인다.
        //이 기능은 IDE 에서 eeprom 의 해당 내용을 일괄적으로 읽어들일때 사용된다.
        //}------------------------------------------------------------------------

        #define  d_MSG_StartSpd8Read        0x25
        //{
            //<2> + { <DID> + (MSG_StartSpd8Read) }
            //                                      + (속도0) + ... + (속도7) + <ACK>
        //}

    //} 

    //[각도 + 속도 설정]
    //{
        //각도 속도를 설정하고 즉시 반영한다.
        #define  d_MSG_DegSpdSet            0x30
        //{
            //<6> + { <DID> + (MSG_DegSpdSet) + (SID) + (속도종류) + (각도) + (속도) }
            //                                                                         + <ACK>
        //}  
      
        //각도 속도를 설정하나 반영하지는 않는다.
        #define  d_MSG_DegSpdMem            0x31
        //{
            //<6> + { <DID> + (MSG_DegSpdMem) + (SID) + (속도종류) + (각도) + (속도) }
            //                                                                         + <ACK>
        //}
        
    //}    

    //[tick 관련]
    //{
        //[tick 으로 직접 설정]
        //{
            //서보를 미세 조정할때 사용하고 16bit 값을 가진다.
            #define  d_MSG_TickSet          0x40
            //{
                //<6> + { <DID> + (MSG_TickSet) + (SID) + (속도종류) +(tick-h) + (tick-l) }
                //                                                                          + <ACK>
            //}
            
        //}    
        
        //[영점조정]
        //{
            //서보의 정확한 조정을 위하여 영점을 설정한다.
            //현재 tick 값이 0도 위치가 된다.

            //0도 위치를 확정한다.
            #define  d_MSG_Pos0TickSet      0x41
            //{
                //<5> + { <DID> + (MSG_Pos0TickSet) + (SID) + (tick-h) + (tick-l) }
                //                                                                  + <ACK>
            //}
            
            //[영점 - 0도 tick 읽기]
            //[영점 - 0도 tick] 을 읽어서 전송한다.
            #define  d_MSG_Pos0TickRead     0x42
            //{
                //<3> + { <DID> + (MSG_Pos0TickRead) + (SID) }
                //                                             + (TICK-H) + (TICK-L) + <ACK>
            //}

            //180도 위치를 확정한다.
            //현재 tick 값이 180도 위치가 된다.
            #define  d_MSG_Pos180TickSet    0x43
            //{
                //<5> + { <DID> + (MSG_Pos180TickSet) + (SID) + (tick-h) + (tick-l) }
                //                                                                    + <ACK>
            //}
            
            //[영점 - 180도 tick 읽기]
            //[영점 - 180도 tick] 을 읽어서 전송한다.
            #define  d_MSG_Pos180TickRead   0x44
            //{
                //<3> + { <DID> + (MSG_Pos180TickRead) + (SID) }
                //                                               + (TICK-H) + (TICK-L) + <ACK>
            //}
            
        //}
        
        //[시작각도설정 관련]
        //{        
            //[시작 각도 tick 8개 동시 쓰기]
            //{
                //[2008.01.30.수][추가!!!]{-----------------------------------------
                //[시작각도tick] 8 개를 한꺼번에 설정한다.
                //이 기능은 IDE 에서 eeprom 의 해당 내용을 일괄설정할때 사용된다.
                //tick 값은 2 byte 값으로 [상위 -> 하위] byte 순으로 전달하면 된다.
                //}-----------------------------------------------------------------

                #define  d_MSG_StartDegTick8Set       0x45
                //{
                    //<18> + { <DID> + (MSG_StartDegTick8Set) + (각도0tick-H) + (각도0tick-L) + ... + (각도7tick-H) + (각도7tick-L) }
                    //                                                                                                                + <ACK>
                //}

            //}

            //[시작 각도 tick 8개 동시 읽기]
            //{
                //[2008.01.30.수][추가!!!]{-------------------------------------------------
                //[시작각도tick] 8 개를 한꺼번에 읽어들인다.
                //이 기능은 IDE 에서 eeprom 의 해당 내용을 일괄적으로 읽어 들일때 사용한다.
                //tick 값은 2 byte 값으로 [상위 -> 하위] byte 순으로 전달하면 된다.
                //}-------------------------------------------------------------------------
   
                #define  d_MSG_StartDegTick8Read       0x46
                //{
                    //<2> + { <DID> + (MSG_StartDegTick8Read })
                    //                                         + (각도0tick-H) + (각도0tick-L) + ... + (각도7tick-H) + (각도7tick-L) + <ACK>
                //}

            //}    

        //}
        
    //}
    
    //[완료보고 관련]
    //{
        //[각도 완료 보고]
        //{
            //[2008.01.20.일][추가!!!]
            //각도가 완료된 경우 [완료보고] 를 수행할것을 지시한다.
            #define  d_MSG_Report           0x50
            //{
                //<2> + { <DID> + (MSG_Report) }
                //                               + <ACK>
            //}

        //}
    
        //[완료보고시점 설정]
        //{
            //[2008.02.06.수][추가!!!]
            //[완료보고비율] 값을 설정한다.
            #define  d_MSG_ReportTimeSet    0x51
            //{
                //<4> + { <DID> + (MSG_ReportTimeSet) + (SID) + (완료보고비율) }
                //                                                               + <ACK>
            //}

            //[2008.02.06.수][추가!!!]
            //[완료보고비율] 값 N개(최대 8개)를 동시에 설정한다.
            #define  d_MSG_ReportTimeSetX   0x52
            //{
                //<3 + N> + { <DID> + (MSG_ReportTimeSetX) + (N) + (완료보고비율0) + ... + (완료보고비율(N-1)) }
                //                                                                                               + <ACK>
                // 1<= N <= 8
            //}

        //}
 
    //} 
    
    //[가감속 분할 상수 설정]
    //{
        //[2008.01.26.토][추가!!!]
        //[가감속 구간 분할 상수] 값을 설정한다.
        #define  d_MSG_AccelDivSet          0x60
        //{
            //<4> + { <DID> + (MSG_AccelDivSet) + (SID) + (DIV 값) }
            //                                                       + <ACK>
        //}

        //[2008.01.29.화][추가!!!]
        //[가감속 구간 분할 상수] 값 N개(최대 8개)를 동시에 설정한다.
        #define  d_MSG_AccelDivSetX         0x61
        //{
            //<3 + N> + { <DID> + (MSG_AccelDivSetX) + (N) + (DIV0) + ... + (DIV(N-1)) }
            //                                                                           + <ACK>
            // 1<= N <= 8
        //}

    //}

    
    //[A/D]
    //{
        //[Analog/Digital 설정]
        //{          
            //모든 서보를 동시에 설정한다.
            #define  d_MSG_AdSet            0x70
            //{
                //<3> + { <DID> + (MSG_AdSet) + (A/D값) }
                //                                        + <ACK>

                //여러개의 서보를 한꺼번에 설정할수 있는데
                //이는 각 bit 는 한개의 서보에 대응하기 때문이다.
                //즉, 실제 설정값 그대로 전달해 주는 것이다.
            //}
        //} 

        //[A/D 설정 읽기]
        //{
            //A/D 설정을 읽어서 전송한다.
            //이는 eeprom 상의 설정값을 읽어서 전송한다.
            #define  d_MSG_AdRead           0x71
            //{
                //<2> + { <DID> + (MSG_AdRead) }
                //                               + (A/D 설정 값) + <ACK>
            //}

        //}
        
    //}    
    
    //[PWM]
    //{
        //[pwm on/off]
        //{
            //pwm 의 on/off 를 설정한다.
          
            //모든 서보를 한꺼번에 설정한다.
            #define  d_MSG_PwmSet           0x80
            //{
                //<3> + { <DID> + (MSG_PwmSet) + (on/off값) }
                //                                            + <ACK>

                //여러개의 서보를 한꺼번에 설정할수 있는데
                //이는 각 bit 는 한개의 서보에 대응하기 때문이다.
                //즉, 실제 설정값 그대로 전달해 주는 것이다.
            //}
            
        //}

        //[pwm 설정 읽기]
        //{
            //pwm 설정을 읽어서 전송한다.
            //이는 eeprom 상의 설정값을 읽어서 전송한다.
            #define  d_MSG_PwmRead          0x81
            //{
                //<2> + { <DID> + (MSG_PwmRead) }
                //                                + (pwm 설정 값) + <ACK>
            //}

        //}
        
        //[pwm 출력 시작]
        //{
            //pwm 출력을 다시 시작한다.
            //단, eeprom 에는 반영하지 않고 변수만 반영하며, 사용자가 설정한 eeprom 상의
            //pwm on/off 정보를 다시 반영해 주는 것이다. (즉, 이전 설정 정보로 다시 구동시킨다.)
            //즉, 이전에 on 으로 설정된 것만 다시 구동이 되는 것이다.
            #define  d_MSG_PwmStart         0x82
            //{
                //<2> + { <DID> + (MSG_PwmStart) }
                //                                 + <ACK>
            //}

        //}

        //[pwm 출력 중단]
        //{
            //pwm 출력을 중단한다.
            //eeprom 에는 반영하지 않고 변수에만 반영한다.
            #define  d_MSG_PwmStop          0x83
            //{
                //<2> + { <DID> + (MSG_PwmStop) }
                //                                + <ACK>
            //}

        //}

    //}

    //[주기]
    //{    
        //[주기설정]
        //{
            //동작 주기를 설정한다.(12 ~ 22ms 까지 설정이 가능하다.)
            #define  d_MSG_PeriodSet        0x90
            //{
                //<3> + { <DID> + (MSG_PeriodSet) + (주기) }
                //                                           + <ACK>
            //}
        //}        
        
        //[주기 읽기]
        //{
            //현재 [주기] 값을 읽어서 전송한다.
            #define  d_MSG_PeriodRead       0x91
            //{
                //<2> + { <DID> + (MSG_PeriodRead) }
                //                                   + (주기 설정 값) + <ACK>
            //}

        //}
        
    //} 
       
    //[문자열]
    //{
        //[문자열 설정]
        //{
            //문자열을 설정한다. 450byte 크기를 넘지 않아야 한다.
            //단, 수신 버퍼크기가 255byte 크기를 갖으므로 <DID> 까지 포함하여 255 byte 크기까지만
            //한번에 전송할수 있다. 이 이상의 길이는 분할하여 전송한다.
            #define  d_MSG_StringSet        0xa0
            //{
                //<3 + 문자열길이> + { <DID> + (MSG_StringSet) + (C/S) + (문자열 ... ) }
                //                                                                       + <ACK>         
                //C(Continue : 1) ; 이전 저장된 위치 다음부터 계속 이어서 저장한다.
                //S(Start)   : 0) : 처음부터 저장한다.(기본값)

                //<count> 로 끝을 정확하게 알수 있으므로 문자열 뒤에 '\0' 까지 전송할 필요는 없다.
                //실제 3 가 제어로 들어 가므로 255-3 = 252 로 실제는 252byte 문자열만 한번에 전송할수 있다.  
            //}

        //}
        
        //[문자열 읽기]
        //{
            #define  d_MSG_StringRead       0xa1
            //{
                //<2> + { <DID> + (d_MSG_StringRead) }
                //                                     + (문자열길이-H) + (문자열길이-L) + (문자열 + '\0') + <ACK>
                //문자열 길이는 '\0' 까지 포함된 길이다.
            //}

        //}
    
    //}
    
    //[시스템 관련]
    //{    
        //[설정 저장]
        //{
            //현재의 설정 사항을 전부 컨트롤로에 저장한다.
            //[각도/속도] 정보까지 그대로 전부 저장된다.
            #define  d_MSG_Save             0xb0
            //{
                //<2> + { <DID> + (MSG_Save) }
                //                             + <ACK>
            //}
        //}

        //[제어기 SW Reset]
        //{
            //[2007.10.08.월][추가!!!]
            //[제어기] 를 SW Reset 시킨다.
            //[함수포인터] 를 사용하여 reset vector 로 점프한다.
            #define  d_MSG_CtrlReset        0xb1
            //{
                //<2> + { <DID> + (MSG_CtrlReset) }
                //                                  + <ACK>
            //}

        //}

        //[제어기 Eeprom 초기화]
        //{
            //[2007.10.08.월][추가!!!]
            //[제어기] 를 공장초기상태로 완전히 초기화한다.
            //실제는 내부 eeprom 안의 모든 정보를 초기상태로 돌려 놓는것이다.
            #define  d_MSG_EepromInit       0xb2
            //{
                //<2> + { <DID> + (MSG_EepromInit) }
                //                                   + <ACK>
            //}

        //}
        
    //}
     
//}      



#endif
