Below is an example of properly reading the FIFO status. This applies to firmware revisions specifically before 080214H (although it will still work fine for any revision 080214H or higher).
static int stx104_fifo_status_blocks[STX104_BOARDS_COUNT_MAX];
static unsigned char stx104_fifo_status_full[STX104_BOARDS_COUNT_MAX];
static unsigned char stx104_fifo_status_empty[STX104_BOARDS_COUNT_MAX];
/*****************************************************************
/ FIFO STATUS
/ Revision History:
/ 15JAN07 - read FIFO status twice to remove the possibility
/ of reading an incorrect value due to FIFO status
/ changing during a 25nSec interval.
*/
#define STX104_FIFO_STATUS_READ_COUNT_MAX 1
void STX104_FIFO_Status( int board )
{
union { unsigned int value; unsigned char octet[2]; } ff_stat[STX104_FIFO_STATUS_READ_COUNT_MAX+1];
unsigned int fbr_blocks;
unsigned int fbr_blocks_minimum;
unsigned char i;
fbr_blocks_minimum = 0x0FFF;
for ( i=0; i<=STX104_FIFO_STATUS_READ_COUNT_MAX; i++ )
{
ff_stat[i].octet[0] = inp( stx104_base_address[board] + STX104_FIFO_DATA_STATUS );
ff_stat[i].octet[1] = inp( stx104_base_address[board] + STX104_FIFO_FLAGS );
fbr_blocks = ff_stat[i].value & 0x0FFF;
if ( fbr_blocks < fbr_blocks_minimum )
{
fbr_blocks_minimum = fbr_blocks;
}
}
stx104_fifo_status_blocks[board] = (int) fbr_blocks_minimum;
if ( (ff_stat[STX104_FIFO_STATUS_READ_COUNT_MAX].value & 0x1000) != 0x0000) stx104_fifo_status_empty[board] = true;
else stx104_fifo_status_empty[board] = false;
if ( (ff_stat[STX104_FIFO_STATUS_READ_COUNT_MAX].value & 0x2000) != 0x0000) stx104_fifo_status_full[board] = true;
else stx104_fifo_status_full[board] = false;
}
For firmware revisions 080214H or higher:
static int stx104_fifo_status_blocks[STX104_BOARDS_COUNT_MAX];
static unsigned char stx104_fifo_status_full[STX104_BOARDS_COUNT_MAX];
static unsigned char stx104_fifo_status_empty[STX104_BOARDS_COUNT_MAX];
/*****************************************************************
/ FIFO STATUS
*/
void STX104_FIFO_Status( int board )
{
union { unsigned int value; unsigned char octet[2]; } ff_stat;
ff_stat.octet[0] = inp( stx104_base_address[board] + STX104_FIFO_DATA_STATUS );
ff_stat.octet[1] = inp( stx104_base_address[board] + STX104_FIFO_FLAGS );
stx104_fifo_status_blocks[board] = ff_stat.value & 0x0FFF;
if ( (ff_stat.value & 0x1000) != 0x0000) stx104_fifo_status_empty[board] = true;
else stx104_fifo_status_empty[board] = false;
if ( (ff_stat.value & 0x2000) != 0x0000) stx104_fifo_status_full[board] = true;
else stx104_fifo_status_full[board] = false;
}