
//[!]{------------
//[기계닉스:가상구동]
//}---------------

//[주의!!!]{------------------------------------------------------------------
//<맷돌-C> 는 구조체를 정확한 구성원 크기로 배치하지만, 다른 Compiler 는 각각 배치를 달리하며
//순서가 바뀔수도 있으므로 이점 주의 해야 한다.
//즉, 다른 Compiler 에서는 구조체를 사용하지 않고 직접 메모리 접근 방법을 사용해야 한다.
//}--------------------------------------------------------------------------

//[공통 사용]
//{
    //[흐름제어]
    //{
        //[2010.06.13.일][완료!!!]
        unsigned char _GMTDLARC_Ack(void);

        //[2010.06.13.일][완료!!!]
        unsigned char _GMTDLARC_WaitReport(void);

    //}

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_MemSet(unsigned char  p제어기번호); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_RptRqst(unsigned char  p제어기번호,
                                    unsigned char  p서보번호); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_RptTimeWr(unsigned char  p제어기번호,
                                      unsigned char  p서보번호,
                                      unsigned char  p완료보고비율); //[통과!!!]


    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_RptTimeRd(unsigned char   p제어기번호,
                                      unsigned char   p서보번호,
                                      unsigned char  *r완료보고비율); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_AccelDivWr(unsigned char  p제어기번호,
                                       unsigned char  p서보번호,
                                       unsigned char  p가감속상수); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_AccelDivRd(unsigned char   p제어기번호,
                                       unsigned char   p서보번호,
                                       unsigned char  *r가감속상수); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_SpdWr(unsigned char   p제어기번호,
                                  unsigned char   p서보번호,
                                  unsigned short  p속도,
                                  unsigned char   p즉시_임시); //[통과!!!]

    struct SPDXWR_3
    {
      //[!]{---------------------------------
      //반드시 순서대로 기술하고 크기를 변경하면 안됨.
      //<맷돌-C> 에서만 유효함.
      //}------------------------------------

      unsigned char   서보번호;  //1바이트.
      unsigned short  속도;     //2바이트.

    };
    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_SpdXWr(unsigned char     p제어기번호,
                                   unsigned char     p설정개수,
                                   struct SPDXWR_3  *p설정목록,
                                   unsigned char     p즉시_임시); //[통과!!!]

    //[부가함수]
    //{
        //[2011.02.13.일][완료!!!]
        unsigned char _GMTDLARC_SpdXWr2(unsigned char   p제어기번호,
                                        unsigned char   p설정개수,
                                        unsigned char  *p설정목록,
                                        unsigned char   p즉시_임시);

        //[2010.07.16.금][완료!!!]
        void _SpdXWr2_설정목록(unsigned char   *p설정목록,
                             int             *pr저장위치,
                             //[설정정보]{---------------
                             unsigned char    p서보번호,
                             unsigned short   p속도
                             //}-----------------------
                            );

    //}

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_SpdRd(unsigned char    p제어기번호,
                                  unsigned char    p서보번호,
                                  unsigned short  *r속도); //[통과!!!]

//}

//[각도 구동기]
//{
    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DegWr(unsigned char   p제어기번호,
                                  unsigned char   p서보번호,
                                  unsigned char   p속도종류,
                                  unsigned short  p각도,
                                  unsigned char   p즉시_임시); //[통과!!!]

    struct DEGXWR_4
    {
      //[!]{---------------------------------
      //반드시 순서대로 기술하고 크기를 변경하면 안됨.
      //<맷돌-C> 에서만 유효함.
      //}------------------------------------

      unsigned char   서보번호;  //1버이트.
      unsigned char   속도종류;  //1바이트.
      unsigned short  각도;     //2바이트.

    };
    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DegXWr(unsigned char     p제어기번호,
                                   unsigned char     p설정개수,
                                   struct DEGXWR_4  *p설정목록,
                                   unsigned char     p즉시_임시); //[통과!!!]

    //[부가함수]
    //{
        //[2011.02.13.일][완료!!!]
        unsigned char _GMTDLARC_DegXWr2(unsigned char   p제어기번호,
                                        unsigned char   p설정개수,
                                        unsigned char  *p설정목록,
                                        unsigned char   p즉시_임시);

        //[2010.07.16.금][완료!!!]
        void _DegXWr2_설정목록(unsigned char   *p설정목록,
                             int             *pr저장위치,
                             //[설정정보]{---------------
                             unsigned char    p서보번호,
                             unsigned char    p속도종류,
                             unsigned short   p각도
                             //}-----------------------
                            );

    //}

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DegRd(unsigned char    p제어기번호,
                                  unsigned char    p서보번호,
                                  unsigned short  *r각도); //[통과!!!]

    struct DEGSYNCMOVE_3
    {
      //[!]{---------------------------------
      //반드시 순서대로 기술하고 크기를 변경하면 안됨.
      //<맷돌-C> 에서만 유효함.
      //
      //[2010.07.28.수][수정!!!]--------------
      //[속도종류] 를 공통속성으로 만든다.
      //}------------------------------------

      unsigned char   서보번호;  //1버이트.
      unsigned short  각도;     //2바이트.

    };
    //[2011.02.13.일][완료!!!]
    unsigned char _GMTDLARC_DegSyncMove(unsigned char          p제어기번호,
                                        unsigned char          p설정개수,
                                        struct DEGSYNCMOVE_3  *p설정목록,
                                        unsigned short         p속도,
                                        unsigned char          p속도종류,
                                        unsigned char          p가감속상수,
                                        unsigned char          p완료보고비율,
                                        unsigned char          p즉시_임시);

    //[부가함수]
    //{
        //[2011.02.13.일][완료!!!]
        unsigned char  _GMTDLARC_DegSyncMove2(unsigned char    p제어기번호,
                                              unsigned char    p설정개수,
                                              unsigned char   *p설정목록,
                                              unsigned short   p속도,
                                              unsigned char    p속도종류,
                                              unsigned char    p가감속상수,
                                              unsigned char    p완료보고비율,
                                              unsigned char    p즉시_임시);

        //[2011.02.13.일][완료!!!]
        void _DegSyncMove2_설정목록(unsigned char   *p설정목록,
                                  int             *pr저장위치,
                                  //[설정정보]{---------------
                                  unsigned char    p서보번호,
                                  unsigned short   p각도
                                  //}-----------------------
                                 );

    //}

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DegSpd(unsigned char   p제어기번호,
                                   unsigned char   p서보번호,
                                   unsigned char   p속도종류,
                                   unsigned short  p각도,
                                   unsigned short  p속도,
                                   unsigned char   p즉시_임시); //[통과!!!]

    //[2010.06.16.수][완료!!!]
    unsigned char _GMTDLARC_Zero0Wr(unsigned char   p제어기번호,
                                    unsigned char   p서보번호,
                                    unsigned short  p듀티,
                                    unsigned char   p조정_설정); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_Zero0Rd(unsigned char    p제어기번호,
                                    unsigned char    p서보번호,
                                    unsigned short  *r듀티); //[통과!!!]

    //[2010.06.16.수][완료!!!]
    unsigned char _GMTDLARC_Zero180Wr(unsigned char   p제어기번호,
                                      unsigned char   p서보번호,
                                      unsigned short  p듀티,
                                      unsigned char   p조정_설정); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_Zero180Rd(unsigned char    p제어기번호,
                                      unsigned char    p서보번호,
                                      unsigned short  *r듀티); //[통과!!!]

    //[2010.07.24.토][완료!!!]
    unsigned char _GMTDLARC_Ofs90Wr(unsigned char   p제어기번호,
                                    unsigned char   p서보번호,
                                    short           p90도위치보정값,
                                    unsigned char   p조정_설정);

    //[2010.07.24.토][완료!!!]
    unsigned char _GMTDLARC_Ofs90Rd(unsigned char   p제어기번호,
                                    unsigned char   p서보번호,
                                    short          *r90도위치보정값);

    //[2010.06.17.목][완료!!!]
    unsigned char _GMTDLARC_PeriodWr(unsigned char  p제어기번호,
                                     unsigned char  p주기ms,
                                     unsigned char  p조정_설정); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_PeriodRd(unsigned char   p제어기번호,
                                     unsigned char  *r주기ms); //[통과!!!]

    //[2010.06.17.목][완료!!!]
    unsigned char _GMTDLARC_DegUnitWr(unsigned char  p제어기번호,
                                      unsigned char  p단위각도,
                                      unsigned char  p조정_설정); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DegUnitRd(unsigned char   p제어기번호,
                                      unsigned char  *r단위각도); //[통과!!!]

    //[2010.06.21.월][완료!!!]
    unsigned char _GMTDLARC_DegOrgWr(unsigned char  p제어기번호,
                                     unsigned char  p서보번호,
                                     unsigned char  p각도원점,
                                     unsigned char  p조정_설정);

    //[2010.06.20.일][완료!!!]
    unsigned char _GMTDLARC_DegOrgRd(unsigned char   p제어기번호,
                                     unsigned char   p서보번호,
                                     unsigned char  *r각도원점);

//}

//[듀티 구동기]
//{
    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DutyWr(unsigned char   p제어기번호,
                                   unsigned char   p서보번호,
                                   unsigned char   p속도종류,
                                   unsigned short  p듀티,
                                   unsigned char   p즉시_임시); //[통과!!!]

    struct DUTYXWR_4
    {
      //[!]{---------------------------------
      //반드시 순서대로 기술하고 크기를 변경하면 안됨.
      //<맷돌-C> 에서만 유효함.
      //}------------------------------------

      unsigned char   서보번호;  //1바이트.
      unsigned char   속도종류;  //1바이트.
      unsigned short  듀티;     //2바이트.

    };
    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DutyXWr(unsigned char      p제어기번호,
                                    unsigned char      p설정개수,
                                    struct DUTYXWR_4  *p설정목록,
                                    unsigned char      p즉시_임시); //[통과!!!]

    //[부가함수]
    //{
        //[2011.02.13.일][완료!!!]
        unsigned char _GMTDLARC_DutyXWr2(unsigned char   p제어기번호,
                                         unsigned char   p설정개수,
                                         unsigned char  *p설정목록,
                                         unsigned char   p즉시_임시);

        //[2010.07.16.금][완료!!!]
        void _DutyXWr2_설정목록(unsigned char   *p설정목록,
                              int             *pr저장위치,
                              //[설정정보]{---------------
                              unsigned char    p서보번호,
                              unsigned char    p속도종류,
                              unsigned short   p듀티
                              //}-----------------------
                             );

    //}

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DutyRd(unsigned char    p제어기번호,
                                   unsigned char    p서보번호,
                                   unsigned short  *r듀티); //[통과!!!]

    struct DUTYSYNCMOVE_3
    {
      //[!]{---------------------------------
      //반드시 순서대로 기술하고 크기를 변경하면 안됨.
      //<맷돌-C> 에서만 유효함.
      //
      //[2010.07.28.수][수정!!!]--------------
      //[속도종류] 를 공통속성으로 만든다.
      //}------------------------------------

      unsigned char   서보번호;  //1바이트.
      unsigned short  듀티;     //2바이트.

    };
    //[2011.02.13.일][완료!!!]
    unsigned char _GMTDLARC_DutySyncMove(unsigned char           p제어기번호,
                                         unsigned char           p설정개수,
                                         struct DUTYSYNCMOVE_3  *p설정목록,
                                         unsigned short          p속도,
                                         unsigned char           p속도종류,
                                         unsigned char           p가감속상수,
                                         unsigned char           p완료보고비율,
                                         unsigned char           p즉시_임시);

    //[부가함수]
    //{
        //[2011.02.13.일][완료!!!]
        unsigned char _GMTDLARC_DutySyncMove2(unsigned char    p제어기번호,
                                              unsigned char    p설정개수,
                                              unsigned char   *p설정목록,
                                              unsigned short   p속도,
                                              unsigned char    p속도종류,
                                              unsigned char    p가감속상수,
                                              unsigned char    p완료보고비율,
                                              unsigned char    p즉시_임시);

        //[2011.02.13.일][완료!!!]
        void _DutySyncMove2_설정목록(unsigned char   *p설정목록,
                                   int             *pr저장위치,
                                   //[설정정보]{---------------
                                   unsigned char    p서보번호,
                                   unsigned short   p듀티
                                   //}-----------------------
                                  );

    //}

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DutySpd(unsigned char   p제어기번호,
                                    unsigned char   p서보번호,
                                    unsigned char   p속도종류,
                                    unsigned short  p듀티,
                                    unsigned short  p속도,
                                    unsigned char   p즉시_임시); //[통과!!!]

    //[2010.06.17.목][완료!!!]
    unsigned char _GMTDLARC_DutyPeriodWr(unsigned char   p제어기번호,
                                         unsigned short  p주기,
                                         unsigned char   p조정_설정); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DutyPeriodRd(unsigned char    p제어기번호,
                                         unsigned short  *r주기); //[통과!!!]

    //[2010.06.17.목][완료!!!]
    unsigned char _GMTDLARC_DutyUnitWr(unsigned char  p제어기번호,
                                       unsigned char  p단위듀티,
                                       unsigned char  p조정_설정); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DutyUnitRd(unsigned char   p제어기번호,
                                       unsigned char  *r단위듀티); //[통과!!!]

//}

//[제어기 설정]
//{
    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DidWr(unsigned char  p제어기번호,
                                  unsigned char  p새제어기번호); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_DidRd(unsigned char   p제어기번호,
                                  unsigned char  *r새제어기번호); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_BaudWr(unsigned char  p제어기번호,
                                   unsigned int   p전송률); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_BaudRd(unsigned char   p제어기번호,
                                   unsigned int   *r전송률); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_ChiefWr(unsigned char  p제어기번호,
                                    unsigned char  p보고자_구성원); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_ChiefRd(unsigned char   p제어기번호,
                                    unsigned char  *r보고자_구성원); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_ModeWr(unsigned char  p제어기번호,
                                   unsigned char  p각도_듀티); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_ModeRd(unsigned char   p제어기번호,
                                   unsigned char  *r각도_듀티); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_PwmOnOffWr(unsigned char  p제어기번호,
                                       unsigned char  p서보번호,
                                       unsigned char  p켜기_끄기,
                                       unsigned char  p조정_설정); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_PwmOnOffRd(unsigned char   p제어기번호,
                                       unsigned char   p서보번호,
                                       unsigned char  *r켜기_끄기); //[통과!!!]


    struct CONFIG_SERVO
    {
      //[2010.06.06.일][생성!!!]{-----------------------------------------
      //서보 1개의 설정 정보중 [설정정보] 에 기록하는데 사용하는 것만 관리한다.
      //
      //[주의!!!]---------------------------------------------------------
      //<맷돌-C> 의 구조체는 선언 그대로 배치되므로 절대 순서/내용/크기를 바꾸면 안된다.
      //이는 IAR 쪽의 배치와 일치 시키기 위한 것이다.
      //둘 중 한군데만 수정하면 다른 곳도 동일하게 수정해 주어야 한다.
      //}----------------------------------------------------------------

      //[설정]
      //{
          //[!]{---------------------------------------
          //[설정] 을 위한 값으로 [영구보존] 되어야 하는 값이다.
          //}------------------------------------------

          //회전 방향을 갖는다.
          //시계방향(0), 반시계방향(1).
          //이는 0 도 위치를 180 도 위치와 서로 바꿀수 있도록 하기 위한 것이다.
          unsigned char   setOrg;

          //영점 0도 듀티값.
          unsigned short  setZero0Duty;

          //영점 180도 듀티값.
          unsigned short  setZero180Duty;

          //[2010.07.25.일][추가!!!]
          //90도 위치 보정값(음수도 될수있다).
          short           setOfs90Duty;

      //}

      //[초기고정]
      //{
          //[!]{-------------------------------------
          //초기 시작상태를 복구하는 값으로 [설정] 과는 다르다.
          //}----------------------------------------

          //설정 속도.
          unsigned short  setSpeed;

          //가감속상수값(가감속 분할 구간을 설정한다).
          unsigned char   setAccelDiv;

          //완료보고 시점 설정 값(0 - 100% 로 0 이면 사용하지 않는다).
          //0 이 아닌 경우는 [완료보고 이벤트] 를 발생시킨다.
          unsigned char   setReport;

          //설정 각도값.
          unsigned short  setDeg;

          //설정 듀티값.
          unsigned short  setDuty;

      //}

    };

    struct CONFIG_SAVE
    {
      //[2010.06.06.일][수정!!!]{-----------------------------------------------
      //실제 [제어기] 의 Flash 의 지정 영역에 저장되는 [설정정보] 를 관리한다.
      //<맷돌-C> 는 선언 그대로 배치되므로 실제 통신에서도 구조체 그대로 적용하지만,
      //IAR 에서는 크기나 배치가 달라지므로 [제어기] 내부적으로는 직접 주소를 지정하여 처리한다.
      //
      //[주의!!!]---------------------------------------------------------------
      //<맷돌-C> 의 구조체는 선언 그대로 배치되므로 절대 순서/내용/크기를 바꾸면 안된다.
      //이는 IAR 쪽의 배치와 일치 시키기 위한 것이다.
      //둘 중 한군데만 수정하면 다른 곳도 동일하게 수정해 주어야 한다.
      //}----------------------------------------------------------------------

      //[설정 정보 유/무]{***************************************************
      //설정 정보가 있는 경우는 0 이 된다.
      //이는 Flash 가 지워진 후에는 0xff 가 되므로 이를 이용하여 [설정정보] 가
      //Flash 영역에 있는지 확인하기 위한 것이다.
      //즉, OS 를 처음 설치한 경우는 사용자가 설정한 정보가 없을수 있기 때문이다.
      //
      //[2010.06.06.일][수정!!!]-------------------------------------------
      //Flash 상에 2바이트 단위로 독립적으로 기록할수 있도록 2바이트 크기로 수정하고
      //가장 앞에 배치한다.
      //(사실 순서는 큰 상관 없으나 가장 마지막에 별도 기록해야 하므로 가장 앞에 배치한다.
      //
      unsigned short  exist; //(0 : 설정정보가 있음)
      //}*****************************************************************

      unsigned char   did;

      unsigned int    baud;

      unsigned char   chief;

      unsigned char   mode;

      unsigned int    pwmPeriod;

      unsigned int    pwmOnOff;

      unsigned char   degUnit;

      unsigned char   dutyUnit;

      //28개 서보 전체의 정보를 모두 저장한다.
      struct  CONFIG_SERVO   svo[28];

    };
    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_ConfigWr(unsigned char        p제어기번호,
                                     struct CONFIG_SAVE  *p설정정보); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_ConfigRd(unsigned char        p제어기번호,
                                     struct CONFIG_SAVE  *r설정정보); //[통과!!!]

//}

//[제어기 특수 기능]
//{
    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_PwmRun(unsigned char  p제어기번호); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_PwmStop(unsigned char  p제어기번호); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_Save(unsigned char  p제어기번호); //[통과!!!]

    //[2010.06.13.일][완료!!!]
    unsigned char _GMTDLARC_Reset(unsigned char  p제어기번호); //[통과!!!]

//}


