📄 fax.cpp
字号:
}
}
return(Send_Hmsg(NON_FINAL, ctl_byte, 20)); // send the HDLC message
}
/* ******************************************************************** *
*
* Display_ID -- display remote station ID
*
* ******************************************************************** */
void Fax::Display_ID(char *pf,BYTE *id,BOOL cr)
{
if(!cr)return;
char cw[21]; // work area
short i, j; // work variables
for (i = 20; i--;) // backscan the ID
if (id[i] != ' ') // q. blank?
break; // a. no .. get out now
if (i++ == -1) // q. ID found?
return; // a. no .. leave now
chk_char=0;
for (j = 0; i--; )
{ // copy the ID in reverse
cw[j++] = id[i];
if (strchr("0123456789+ ",id[i]) == 0)chk_char=1;
}
cw[j] = 0; // .. and end the string
strcpy(nameBuffer,cw);
sprintf(fs.f_msg, "%s %s", pf, cw); // put message in buffer
(stat)(OUT_MSGREC, &fs);
}
/* ******************************************************************** *
*
* Send_CSI -- Send the called subscriber ID signal to caller
*
* returns: -2 = User pressed ESC
* -1 - Timeout
* 0 = successful; CONNECT response from 调制解调器
* 1 = NO CARRIER response from 调制解调器
*
* ******************************************************************** */
short Fax::Send_CSI(void)
{
return(Send_Our_ID(FAX_FCF_CSI)); // send CSI frame to caller
}
/* ******************************************************************** *
*
* Send_TSI -- Send the transmitting subscriber ID signal
*
* returns: -2 = User pressed ESC
* -1 - Timeout
* 0 = successful
* 1 = unsuccessful
*
* ******************************************************************** */
short Fax::Send_TSI(void)
{
return(Send_Our_ID(FAX_FCF_TSI)); // send TSI frame
}
/* ******************************************************************** *
*
* Send_DIS -- Send the digital ID signal to caller
*
* returns: -2 = User pressed ESC
* -1 - Timeout
* 0 = successful
* 1 = unsuccesful
*
* ******************************************************************** */
short Fax::Send_DIS(void)
{
/*short i; // work variable
for (i = 6; i>=0;i--)
hmsg.data[i] = dis_msg[i];// copy the DIS to hmsg.data
*/
memcpy(hmsg.data,dis_msg,6);
return(Send_Hmsg(FINAL, FAX_FCF_DIS, 6)); // send the DIS
}
/* ******************************************************************** *
*
* Send_DCS -- Send the digital control signal to called station
*
* returns: -2 = User pressed ESC
* -1 - Timeout
* 0 = successful
* 1 = unsuccesful
*
* ******************************************************************** */
short Fax::Send_DCS(void)
{
short i; // work variable
for (i = 6; i--; hmsg.data[i] = dcs_msg[i]);// copy the DCS to hmsg.data
return(Send_Hmsg(FINAL, FAX_FCF_DCS, 6)); // send the DCS
}
/* ******************************************************************** *
*
* HDLC_Mode -- Enter HDLC mode (transmit or receive)
*
* returns: -2 = User pressed ESC
* -1 - Timeout
* 0 = successful; CONNECT response from 调制解调器
* 1 = ERROR response from 调制解调器
*
* ******************************************************************** */
short Fax::HDLC_Mode(short dir) // setup for HDLC tx or rx
// 0 = transmit, 1 = receive
{
short rc; // return code
/*
if (! connected&&dir != TRANSMIT) // q. we transmitting?
{ // a. yes ..
cp->Write("AT+FRS=8\r"); // .. request 80ms silence
rc = wait_for(cp,FAX_OK, // wait for response
FAX_ERR, 5) - 1;
if (rc) // q. any problems?
return(rc); // a. yes .. return the error
}
*/
if(connected)
{ // a. yes ..
connected = FALSE; // .. reset connect status
return(0); // .. and return ok
}
else
{
cp->Write(dir ? FAX_RX_HDLC : FAX_TX_HDLC); // start requested HDLC mode
rc = wait_for1(cp,FAX_CONN, FAX_NO_CARR,FAX_OK, 10)-1; // see if we connect
}
return(rc); // return to caller
}
/* ******************************************************************** *
*
* Data_Mode() -- Enter Fax Data mode (transmit or receive)
*
* returns: -2 = User pressed ESC
* -1 - Timeout
* 0 = successful; CONNECT response from 调制解调器
* 1 = NO CARRIER response from 调制解调器
*
* ******************************************************************** */
short Fax::Data_Mode(short dir, // 0 = transmit, 1 = receive
short speed) // speed for transfer
{
short rc; // return code
char msg[25]; // work area for message
if (/*(dir == TRANSMIT) && */! connected) // q. we transmitting?
{ // a. yes ..
/* cp->Write(FAX_SILENT); // .. request 80ms silence
rc = wait_for(cp,FAX_OK, // wait for response
FAX_ERR, 5) - 1;
if (rc) // q. any problems?
return(rc); // a. yes .. return the error*/
}
sprintf(msg, // in message area ..
dir ? FAX_RX_DATA : FAX_TX_DATA, // .. select direction of xfer
speed); // .. and build message
cp->Write(msg); // write to 调制解调器
rc = wait_for1(cp,FAX_CONN, FAX_NO_CARR,FERROR,10)-1; // see if we connect
if(rc!=0)
{
cp->Write(msg); // write to 调制解调器
rc = wait_for1(cp,FAX_CONN, FAX_NO_CARR,FERROR,10)-1; // see if we connect
}
return(rc); // return to caller
}
/* ******************************************************************** *
*
* Get_Line -- retrieve a CR-terminated line of information
*
* returns: -2 = User pressed ESC
* -1 - Timeout
* 0 = successful
* 1 = data overrun
*
* ******************************************************************** */
short Fax::Get_Line(char *buf, // buffer to contain info
short secs) // length of timeout
{
short loop = TRUE; // loop condition
DWORD timer=SECS(secs); // timer value
while(loop) // for as long as necessary ..
{
if(cp->WaitComm(timer))
switch(cp->Read(buf)) // attempting to read a byte
{
case 0xFFFF: // no character available
if ((stat)(SCAN_EXIT, &fs)) // q. user press escape?
return(-2); // a. yes.. tell the caller
ThreadSwitchWithDelay();
continue; // else .. continue loop
case 0: // character 已被确认
if (*buf == '\r') // q. character a CR?
{ // a. yes ..
*buf = 0; // .. null it out
loop = FALSE; // .. and end the loop
}
else // else ..
buf++; // .. point to next char position
break; // end this case
default: // lost characters
return(1); // .. show receive unsuccessful
}
else return(-1);
}
return(0); // show we finished ok
}
/* ******************************************************************** *
*
* Rcv_Hmsg -- receive an HDLC frame
*
* returns: -2 = User pressed ESC
* -1 - Timeout
* 0 = successfully 已被确认
* 1 = NO CARRIER or error
*
* ******************************************************************** */
short Fax::Rcv_Hmsg(void)
{
short rc, // return code
loop = 1, // loop until finished
dleflag = FALSE; // dle not seen yet
char *nxtchar;
hmsg.len = 0; // initialize length
nxtchar = (char *) cmsg; // .. and next receive pointer
if ((rc = HDLC_Mode(RECEIVE)) != 0) // q. connect ok?
return(rc); // a. no .. leave w/error
DWORD timer = SECS(20);
while(loop)
{
// enter a loop ..
if(cp->WaitComm(timer))
switch(cp->Read(nxtchar)) // attempting to read bytes
{
case 0xFFFF: // no character available
if ((stat)(SCAN_EXIT, &fs)) // q. user press escape?
return(-2); // a. yes.. tell the caller
// ThreadSwitchWithDelay();
continue; // else .. continue loop
case 0: // character 已被确认
hmsg.len++; // increment 已被确认 count
if (dleflag) // q. previous char DLE?
{ // a. yes ..
dleflag = FALSE; // .. reset the flag
if (*nxtchar == ETX) // q. DLE ETX sequence?
loop = 0; // a. yes .. exit the loop
}
else if (*nxtchar == DLE) // q. char a DLE?
dleflag = TRUE; // a. yes .. show TRUE
nxtchar++; // point at next character
break; // end this case
default: // lost characters
return(1); // .. show receive unsuccessful
}
else
return (-1);
}
rc = wait_for(cp,FAX_OK, FAX_ERR, 10) - 1; // OK should follow message
Reverse_Bytes(cmsg, hmsg.len - 2); // reverse the bits
return(rc); // return to caller
}
/* ******************************************************************** *
*
* Send_Hmsg -- send an HDLC frame
*
* returns: -2 = User pressed ESC
* -1 - Timeout
* 0 = successful; CONNECT response from 调制解调器
* 1 = NO CARRIER response from 调制解调器
*
* ******************************************************************** */
short Fax::Send_Hmsg(BYTE finalflg, // final flag
BYTE ctl_byte, // fax control field
short len) // length of data bytes
{
short rc; // return code
hmsg.addr = FAX_ADDR; // set the address field
hmsg.ctl_fld = FAX_CTL | finalflg; // .. and the control field
hmsg.fax_ctl_fld = ctl_byte; // .. and fax control field
hmsg.data[len] = DLE; // .. add DLE
hmsg.data[len+1] = ETX; // .. and ETX
Reverse_Bytes(cmsg, len+3); // reverse the bits
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -