

//[2009.07.07.화][생성!!!]

#ifndef combus_h
#define combus_h


//[ComBus]
//{
    //[기본형태]{----------------------------------------------------------------
    //
    //BYTE :           1           8    2^SIZE
    //BIT  :     7   6  4:5 3:0
    //       { [W/R.T/S.AK.SIZE] [주소] [자료] }
    //
    //[각부설명]
    //
    //[W/R] Bit7
    // - Write(0)
    // - Read(1)
    //
    //[T/S] Bit6
    // - Type(1)   : 1, 2, 4, 8 의 C-Type 으로 한번에 읽기/쓰기 하는 경우.
    //               일반적으로 MCU 의 장치에 접근 하는 경우 사용된다.
    //
    // - Stream(0) : 일반적으로 사용되는 경우.
    //
    //[AK] Bit[5:4]
    // - VMOS(10) : VMOS 의 64Bit 절대주소를 대상으로 한다.
    // - MCU(01)  : MCU 의 절대주소를 대상으로 한다.
    // - BUS(00)  : [직렬버스] 의 주소(번호등)를 대상으로 한다.
    //
    //[SIZE] Bit[3:0]
    // - 2^SIZE 로 최종적으로 크기를 구할수 있다(1<<SIZE 와 같다).
    // - 즉, 4bit 로 여러 크기 종류를 표현하기 위하여 [지수] 를 크기롤 사용한다.
    // - 실제크기 = 1 << SIZEl; 로 간단히 구할수 있다.
    // - 1 Byte - 32 KByte 까지 표현 가능하다.
    //
    //[주소]
    // - 무조건 8 Byte 크기를 갖는다.
    // - [AK] 에 따라 다른 의미를 갖는다.
    //
    //[자료]
    // - 2^SIZE 의 크기를 갖는 자료열.
    //
    //}--------------------------------------------------------------------------

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

    //[정의]
    //{
        //[CTB]
        //{
            //각각의 BITMASK 를 위한 것.
            #define  d_CB_WR      0x80  
            #define  d_CB_TS      0x40  
            //{
                #define  d_CB_TS_T    0x40 
                #define  d_CB_TS_S    0x00 
                 
            //}
            
            #define  d_CB_AK      0x30  
            //{
                #define  d_CB_AK_V    0x20 
                #define  d_CB_AK_M    0x10 
                #define  d_CB_AK_B    0x00 

            //}

            #define  d_CB_SIZE    0x0f  
            //1Byte - 32KByte 까지 한번에 전송 가능하다.

        //}

        //[흐름제어]
        //{
            #define  d_CBFW_ACK     0xac  //[통신묶음] 자체 처리 완료.
            #define  d_CBFW_EOR     0xe0  //처리 오류.

            //[2009.12.09.수][추가!!!]
            #define  d_CBFW_FEOR    0xfe  //치명적 처리 오류(STM32 자체 오류인 경우),

            #define  d_CBFW_NULL    0x00  //의미없음.

            //[2009.07.14.화][추가!!!]
            #define  d_CBFW_BRK     0xbe  //검증 <Break>.

            //[2009.07.18.토][추가!!!]{----------------------------
            //[멧돌] 이 [통신묶음] 을 완전히 처리한 경우 전송한다.
            //[ROM 지우기 완료] 등의 경우.
            #define  d_CBFW_FIN     0xf1  //처리완료 <Finish>.
            //}----------------------------------------------------

        //}

        #define  d_CB_Write   0
        #define  d_CB_Read    1

    //}
    
//}

//------------------------------------------------------------------------------
//[함수]------------------------------------------------------------------------
//------------------------------------------------------------------------------

//[2011.07.25.월][완료!!!]
bool __fastcall ComBus_Error(void);

//[2009.08.01.토][완료!!!]
bool __fastcall ComBus_FwByte_Read(//확인할 [흐름제어바이트].
                                   unsigned char  pFwByte,
                                   //[시간제한] 값.
                                   int            pTimeOut);

//[2009.07.30.목][완료!!!]
bool __fastcall ComBus_FwByte_Check(unsigned char  pFwByte);


//[2009.08.01.토][완료!!!]
bool __fastcall ComBus_Write(unsigned char        pTS,
                             unsigned char        pAK,
                             unsigned char        pSizeExp,
                             unsigned long long   pAdr,
                             unsigned char       *pStream);

//[2009.08.08.토][완료!!!]
void __fastcall ComBus_Write2(unsigned char        pTS,
                              unsigned char        pAK,
                              unsigned char        pSizeExp,
                              unsigned long long   pAdr,
                              unsigned char       *pStream);

//[2009.08.01.토][완료!!!]
bool __fastcall ComBus_Read(unsigned char        pTS,
                            unsigned char        pAK,
                            unsigned char        pSizeExp,
                            unsigned long long   pAdr,
                            unsigned char       *pStream);



//[2011.07.25.월][완료!!!]
bool __fastcall ComBus_TimeOut_FwByte(//비교할 [흐름제어바이트] 값.
                                      unsigned char  pFwByte,
                                      //[시간제한] 값.
                                      int            pTimeOut);

//[2011.07.25.월][완료!!!]
bool __fastcall ComBus_TimeOut_ReadX(//읽어들일 수.
                                     int  pReadCount,
                                     //[시간제한] 값.
                                     int  pTimeOut);



//}


#endif