Owner manual

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;
}
}