beautypg.com

Comtrol API (6508) for the MS-DOS User Manual

Page 39

background image

Troubleshooting

39

Troubleshooting

/* Read more data if any room left at front of buffer and if device wasn't
already emptied */
if((i != 0) &&
(Cnt == NumOpen - i))
{
In = aaRead(Dev,i,q[Dev].RxBuf); /* read balance of data */
}

/* Update Rx queue In index */
q[Dev].RxIn = In;
}

/********************************************************
Function:

EvPeriodic

Purpose:

Periodic event function, remove data from Tx queues
and write it to serial devices.

Call:

EvPeriodic(void)

Return:

void

*/
void EvPeriodic(void)
{
int Dev;

/* device number */

int i;

/* balance of bytes to copy after q wrap */

int Out;

/* Out index into Tx buffer */

int Cnt;

/* number of bytes to write */

int WCnt;

/* number of bytes actually written */

for(Dev = 0;Dev < NUMDEV;Dev++) /* check all devs for data to Tx */
{
if(!q[Dev].OpenTx) /* device not open for Tx */
continue;
Out = q[Dev].TxOut; /* local copy of Out index */

/* Get number of bytes in Tx buffer */
if((Cnt = q[Dev].TxIn - Out) < 0)
Cnt += TXBUF_SIZE; /* adjust for queue wrap */
else if(Cnt == 0)
return;

/* nothing in Tx buffer */

i = Cnt - (TXBUF_SIZE - Out); /* i = whats left after wrap around */
if(i < 0)
i = 0;

/* Write data to end of Tx buffer */
WCnt = aaWrite(Dev,Cnt - i,&q[Dev].TxBuf[Out]);

/* Updata Out index, point to start of buffer if already at end of it */
Out = (Out + WCnt) % TXBUF_SIZE;

/* Write more data if any left at front of buffer and if device wasn't
already filled */
if((i != 0) &&
(WCnt == Cnt - i))
{
Out = aaWrite(Dev,i,q[Dev].TxBuf); /* write balance of data */
}

/* Update Tx queue Out index */
q[Dev].TxOut = Out;
}
}