/*************************************************************************
        hdlc.h

        Contains stuff pertaining to sending and recieving HDLC frames
        that are defined in the T30 spec.
*************************************************************************/

// On PCs we should pause before ALL frames _except_ CFR & FTT (because
// those are too time critical). In IFAX we look for silence always.
// This is handled in HDLC.C

// On PCs we use TwiddleThumbs() (FTS and FRS are dangerous)
// In IFAX we must use RecvSilence (safe in IFAX) to avoid collisions
// This is handled inside the Modem driver. AWT30 always call RecvSilence
// (in HDLC.C), and the Class1 modem driver uses TwiddleThumbs()
// not FRS or FTS, while teh IFAX driver looks for real silence


// In WFW don't pause before CFR/FTT. Delay may get too long!!
#define SendCFR(pTG)       (SendSingleFrame(pTG,ifrCFR,0,0,1))
#define SendFTT(pTG)       (SendSingleFrame(pTG,ifrFTT,0,0,1))

// must pause before MCF/RTN always
#define SendMCF(pTG)       (SendSingleFrame(pTG,ifrMCF,0,0,1))
#define SendRTN(pTG)       (SendSingleFrame(pTG,ifrRTN,0,0,1))

/*** never send RTP
#define SendRTP()       (SendSingleFrame(ifrRTP,0,0))
***/

// no harm in pausing before DCN.
#define SendDCN(pTG)       (SendSingleFrame(pTG,ifrDCN,0,0,1))

#ifdef USECRP
#       define  SendCRP(pTG)                (SendSingleFrame(pTG,ifrCRP,0,0,1))
#else
#       define  SendCRP(pTG)                (0)
#endif

// we've eliminated the post-page pause, so we need to pause before these
// frames. In any case, that's all handled inside the modem driver.
// We make a single call to ModemRecSilence()
#define SendEOM(pTG)                       (SendSingleFrame(pTG,ifrEOM,0,0,1))
#define SendMPS(pTG)                       (SendSingleFrame(pTG,ifrMPS,0,0,1))
#define SendEOP(pTG)                       (SendSingleFrame(pTG,ifrEOP,0,0,1))
#define SendPRI_EOM(pTG)           (SendSingleFrame(pTG,ifrPRI_EOM,0,0,1))
#define SendPRI_MPS(pTG)           (SendSingleFrame(pTG,ifrPRI_MPS,0,0,1))
#define SendPRI_EOP(pTG)           (SendSingleFrame(pTG,ifrPRI_EOP,0,0,1))
#define SendPIP(pTG)                       (SendSingleFrame(pTG,ifrPIP,0,0.1))
#define SendPIN(pTG)                       (SendSingleFrame(pTG,ifrPIN,0,0,1))

// do we need a pause before RR/CTC/ERR/CTR etc?
// in RR & CTC we have all teh time in the world, so must pause
// ERR & CTR I dunno, so I'm pausing anyway
#define SendRR(pTG)                (SendSingleFrame(pTG,ifrRR,0,0,1))
#define SendCTC(pTG,fif)    (SendSingleFrame(pTG,ifrCTC,fif,2,1))
#define SendERR(pTG)               (SendSingleFrame(pTG,ifrERR,0,0,1))
#define SendCTR(pTG)               (SendSingleFrame(pTG,ifrCTR,0,0,1))

// PPR/RNR sent in same logical spot as MCF so use delay
#define SendPPR(pTG,fif)    (SendSingleFrame(pTG,ifrPPR,fif,32,1))
#define SendRNR(pTG)               (SendSingleFrame(pTG,ifrRNR,0,0,1))

// add this...
#define SendEOR_EOP(pTG)           (SendSingleFrame(pTG,ifrEOR_EOP, 0, 0, 1))

#define TEXTBASED

typedef struct {
        BYTE    bFCF1;
        BYTE    bFCF2;
        BYTE    fInsertDISBit;
        BYTE    wFIFLength;             // required FIF length, 0 if none, FF if variable
        char*   szName;
} FRAME;

typedef FRAME TEXTBASED *CBPFRAME;

// CBPFRAME is a based pointer to a FRAME structure, with the base as
// the current Code segment. It will only be used to access
// the frame table which is a CODESEG based constant table.


// This is everything you never wanted to know about T30 frames....
#define         ifrMAX          48
extern FRAME TEXTBASED rgFrameInfo[ifrMAX];





/****************** begin prototypes from hdlc.c *****************/
BOOL SendSingleFrame(PThrdGlbl pTG, IFR ifr, LPB lpbFIF, USHORT uFIFLen, BOOL fSleep);
BOOL SendManyFrames(PThrdGlbl pTG, LPLPFR lplpfr, USHORT uNumFrames);
BOOL SendZeros(PThrdGlbl pTG, USHORT uCount, BOOL fFinal);
BOOL SendTCF(PThrdGlbl pTG);
BOOL SendRTC(PThrdGlbl pTG, BOOL);
SWORD GetTCF(PThrdGlbl pTG);
/***************** end of prototypes from hdlc.c *****************/

