113 lines
3.2 KiB
C
113 lines
3.2 KiB
C
/*****************************************************************************
|
|
* Copyright (C) 2008
|
|
* ProbeStar Telematics, LLC
|
|
* All Rights Reserved. Proprietary and Confidential.
|
|
*============================================================================
|
|
* BYTE Queue
|
|
*****************************************************************************/
|
|
|
|
/* prevent multiple inclusions */
|
|
#ifndef __EMBEDDED_BYTEQUEUE__
|
|
#define __EMBEDDED_BYTEQUEUE__
|
|
|
|
/*****************************************************************************
|
|
* includes
|
|
*****************************************************************************/
|
|
|
|
#include "embtypes.h"
|
|
|
|
/*****************************************************************************
|
|
* defines
|
|
*****************************************************************************/
|
|
|
|
/*****************************************************************************
|
|
* macros
|
|
*****************************************************************************/
|
|
|
|
#define _QueuePut(Q,D) \
|
|
{ \
|
|
*((Q).pbyBuf+((Q).byFront++)) = (D); \
|
|
(Q).byCount++; \
|
|
if ( (Q).byFront == (Q).bySize ) \
|
|
(Q).byFront = 0; \
|
|
}
|
|
|
|
#define _QueueUnput(Q) \
|
|
{ \
|
|
if ( (Q).byFront == 0 ) \
|
|
(Q).byFront = (Q).bySize; \
|
|
*((Q).pbyBuf+(--(Q).byFront)) = (0); \
|
|
(Q).byCount--; \
|
|
}
|
|
|
|
#define _QueueGet(Q,D) \
|
|
{ \
|
|
(D) = *((Q).pbyBuf+((Q).byRear++)); \
|
|
(Q).byCount--; \
|
|
if ( (Q).byRear == (Q).bySize ) \
|
|
(Q).byRear = 0; \
|
|
}
|
|
|
|
#define _QueueUnget(Q,D) \
|
|
{ \
|
|
if ( (Q).byRear == 0 ) \
|
|
(Q).byRear = (Q).bySize; \
|
|
*((Q).pbyBuf+(--(Q).byRear)) = (D); \
|
|
(Q).byCount++; \
|
|
}
|
|
|
|
#define _QueueAlloc(Q,B,N) (Q).pbyBuf=(B);(Q).bySize=(N)
|
|
#define _QueueClear(Q) (Q).byCount=(Q).byFront=(Q).byRear=0
|
|
#define _QueueCount(Q) (Q).byCount
|
|
#define _QueueSize(Q) (Q).bySize
|
|
#define _QueueEmpty(Q) ((Q).byCount==0)
|
|
#define _QueueFull(Q) ((Q).byCount>=(Q).bySize)
|
|
|
|
#define QueueCount(Q) (Q)->byCount
|
|
#define QueueSize(Q) (Q)->bySize
|
|
#define QueueEmpty(Q) ((Q)->byCount==0)
|
|
#define QueueFull(Q) ((Q)->byCount>=(Q)->bySize)
|
|
|
|
/*****************************************************************************
|
|
* structs & typedefs
|
|
*****************************************************************************/
|
|
|
|
typedef struct _Queue {
|
|
BYTE byCount;
|
|
BYTE byFront;
|
|
BYTE byRear;
|
|
BYTE bySize;
|
|
BYTE *pbyBuf;
|
|
} Queue;
|
|
|
|
/*****************************************************************************
|
|
* global constants
|
|
*****************************************************************************/
|
|
|
|
/*****************************************************************************
|
|
* global variables
|
|
*****************************************************************************/
|
|
|
|
/*****************************************************************************
|
|
* C function prototypes
|
|
*****************************************************************************/
|
|
/* export C functions to C++ */
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
void QueueAlloc( Queue *pQ, BYTE *pbyData, BYTE bySize );
|
|
void QueueClear( Queue *pQ );
|
|
|
|
BYTE QueueGet( Queue *pQ, BYTE *pbyData );
|
|
BYTE QueuePut( Queue *pQ, BYTE *pbyData );
|
|
|
|
BYTE QueueUnget( Queue *pQ, BYTE byData );
|
|
BYTE QueueUnput( Queue *pQ );
|
|
|
|
#ifdef __cpluscplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|