

//[설명!!!]{-----------------------------------------------------------
//기계닉스 표준 [직렬버스] 를 다루기 위한 API 를 기술한다.
//<맷돌-C> 로 만든 API 가 속도가 느린 경우는 BCB 를 이용하여 내장 API 로 교체한다.
//}-------------------------------------------------------------------


#include "함수묶음.h"

#include "직렬버스.h"


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

//}


unsigned char _ComBus_쓰기(unsigned char   p기록방법,
                          unsigned char   p주소종류,
                          unsigned char   p크기지수,
                          unsigned long   p주소,
                          unsigned char  *p자료)
{
  //[2010.06.07.월][재생성!!!]{------------------------------------
  //이전에 만든것을 G.MTDl.A.RC 개발을 위하여 새로 정리한다(변동사항은 없음).
  //
  //[2010.06.13.일][수정!!!]---------------------------------------
  //수신시 [시간제한] 을 적용하는 것으로 수정한다.
  //}------------------------------------------------------------

  //[쓰기]{***********************************
  //                            size
  //         1           8     2
  // { [W.T/S.AK.SIZE] [주소] [자료] }
  //                                   [ACK]
  //}****************************************

  //[VAR]
  //{
      unsigned char  저장소[9];
      unsigned char  흐름제어바이트;
      int            크기;

  //}

  //[실제 Byte 크기 얻기]{------------------------------------
  //2^지수 형태로 지정되므로 "<<" 연산자로 간단하고 빠르게 구할수 있다.
  크기 = 1 << p크기지수;
  //}------------------------------------------------------

  //[자료] 를 제외한 9 Byte 는 먼저 정리한뒤 한번에 출력한다.
  //[시간제한] 에 걸리지 않기 위하여, 전체를 한번에 저장해서 전송하는 것으로 추후 수정해야한다.

  //[CTB]
  //{
      //일단 저장소에 저장만 한다.
      //<쓰기>----v
      저장소[0] = (0<<7)|(p기록방법)|(p주소종류)|(p크기지수);

  //}

  //[주소]
  //{
      //일단 저장소에 저장만 한다.
      *((unsigned long *)(&(저장소[1]))) = p주소;

      //이제까지의 9 Byte 를 한꺼번에 출력한다.
      _Ide_통신포트_XByte출력_(저장소, 9);

  //}

  //[자료쓰기]
  //{
      //자료열을 일괄 출력한다.
      _Ide_통신포트_XByte출력_(p자료, 크기);

  //}

  //[흐름제어]
  //{
      //수신 시간 제한을 3초로 설정한다.
      _Ide_시간제한설정_(d_시간제한);


      //모든 처리가 완료됐는지 확인한다.
      while(!((_Ide_통신포트_1Byte입력_(&흐름제어바이트) != 0) &&
              (흐름제어바이트 == d_CBFW_ACK)))
      {
        //시간제한 동안 수신이 되지 않은 것으로 오류로 간주한다.
        if(_Ide_시간제한완료_() == true) { return(false); }

      }


      //이상없이 수신되었으므로 시간제한을 해제한다.
      _Ide_시간제한해제_();

  //}

  //이상없이 처리된 것이다.
  return(true);

}

unsigned char _ComBus_읽기(unsigned char   p기록방법,
                          unsigned char   p주소종류,
                          unsigned char   p크기지수,
                          unsigned long   p주소,
                          unsigned char  *r자료)
{
  //[2010.06.07.월][재생성!!!]{------------------------------------
  //이전에 만든것을 G.MTDl.A.RC 개발을 위하여 새로 정리한다(변동사항은 없음).
  //
  //[2010.06.13.일][수정!!!]---------------------------------------
  //수신시 [시간제한] 을 적용하는 것으로 수정한다.
  //}------------------------------------------------------------

  //[읽기]***********************************
  //                            size
  //         1           8     2
  // { [R.T/S.AK.SIZE] [주소]
  //                          [자료] } [ACK]
  //}***************************************

  //[VAR]
  //{
      unsigned char  저장소[9];
      unsigned char  흐름제어바이트;
      int            크기;

  //}

  //[실제 Byte 크기 얻기]{------------------------------------
  //2^지수 형태로 지정되므로 "<<" 연산자로 간단하고 빠르게 구할수 있다.
  크기 = 1 << p크기지수;
  //}------------------------------------------------------

  //[자료] 를 제외한 9 Byte 는 먼저 정리한뒤 한번에 출력한다.
  //[시간제한] 에 걸리지 않기 위하여, 전체를 한번에 저장해서 전송하는 것으로 추후 수정해야한다.

  //[CTB]
  //{
      //일단 저장소에 저장만 한다.
      //<읽기>----v
      저장소[0] = (1<<7)|(p기록방법)|(p주소종류)|(p크기지수);

  //}

  //[주소]
  //{
      //일단 저장소에 저장만 한다.
      *((unsigned long *)(&(저장소[1]))) = p주소;

      //이제까지의 9 Byte 를 한꺼번에 출력한다.
      _Ide_통신포트_XByte출력_(저장소, 9);

  //}

  //[자료읽기]
  //{
      //수신 시간 제한을 3초로 설정한다.
      _Ide_시간제한설정_(d_시간제한);


      //자료열을 지정 크기만큼 읽어 들인다.
      while(_Ide_통신포트_XByte입력_(r자료, 크기) == 0)
      {
        //시간제한 동안 수신이 되지 않은 것으로 오류로 간주한다.
        if(_Ide_시간제한완료_() == true) { return(false); }

      }


      //이상없이 수신되었으므로 시간제한을 해제한다.
      _Ide_시간제한해제_();

  //}

  //[흐름제어]
  //{
      //수신 시간 제한을 3초로 설정한다.
      _Ide_시간제한설정_(d_시간제한);


      //모든 처리가 완료됐는지 확인한다.
      while(!((_Ide_통신포트_1Byte입력_(&흐름제어바이트) != 0) &&
              (흐름제어바이트 == d_CBFW_ACK)))
      {
        //시간제한 동안 수신이 되지 않은 것으로 오류로 간주한다.
        if(_Ide_시간제한완료_() == true) { return(false); }

      }


      //이상없이 수신되었으므로 시간제한을 해제한다.
      _Ide_시간제한해제_();

  //}

  //이상없이 처리된 것이다.
  return(true);

}








