/************************************************************************ Project: Welling Motor Control Paltform Filename: queue.c Partner Filename: queue.h Description: The math function Complier: IAR Embedded Workbench for ARM 7.80, IAR Systems. CPU TYPE : GD32F3x0 ************************************************************************* Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd. All rights reserved. ************************************************************************* ************************************************************************* Revising History (ECL of this file): ************************************************************************/ /************************************************************************ Beginning of File, do not put anything above here except notes Compiler Directives: *************************************************************************/ #ifndef _QUEUE_C_ #define _QUEUE_C_ #endif /************************************************************************ Included File: *************************************************************************/ #include "queue.h" #include "string.h" /****************************************************************************************************************************************************** ** \brief parameter ******************************************************************************************************************************************************/ ERROR_LOG que_stErrorLog; FLASH_ERROR_QUEUE que_stFlashErrorLog; /****************************************************************************************************************************************************** ** \brief ******************************************************************************************************************************************************/ void que_voInit(FLASH_ERROR_QUEUE *Q) { Q->ubHead = 0; Q->ubRear = 0; memset(Q->stLog, 0, sizeof(ERROR_LOG) * QUEUE_SIZE); } /****************************************************************************************************************************************************** ** \brief ******************************************************************************************************************************************************/ static BOOL que_fgEmpty(const FLASH_ERROR_QUEUE *Q) { BOOL ret = FALSE; if (Q->ubHead == Q->ubRear) { ret = TRUE; } return ret; } /****************************************************************************************************************************************************** ** \brief ** \return ******************************************************************************************************************************************************/ static BOOL que_fgFull(const FLASH_ERROR_QUEUE *Q) { BOOL ret = FALSE; if (((Q->ubHead - Q->ubRear) + QUEUE_SIZE) % QUEUE_SIZE == 1) { ret = TRUE; } return ret; } /****************************************************************************************************************************************************** ** \brief ******************************************************************************************************************************************************/ static UBYTE que_voEnter(FLASH_ERROR_QUEUE *Q, ERROR_LOG x) { memcpy(&(Q->stLog[Q->ubRear]), &x, sizeof(ERROR_LOG)); Q->ubRear = (Q->ubRear + 1) % QUEUE_SIZE; if (que_fgFull(Q) != FALSE) //队列满,覆盖队头数据 { Q->ubHead = (Q->ubHead + 1) % QUEUE_SIZE; return (UBYTE)0; } else { return (UBYTE)1; } } /****************************************************************************************************************************************************** ** \brief ** \return if queue is empty return 0 ,if not return 1 ******************************************************************************************************************************************************/ static UBYTE que_voDelete(FLASH_ERROR_QUEUE *Q, ERROR_LOG *dat) { if (que_fgEmpty(Q) != FALSE) { return (UBYTE)0; } *dat = Q->stLog[Q->ubHead]; Q->ubHead = (Q->ubHead + 1) % QUEUE_SIZE; return (UBYTE)1; } /****************************************************************************************************************************************************** ** \brief ******************************************************************************************************************************************************/ UBYTE que_ubPushIn(FLASH_ERROR_QUEUE *Q, const ERROR_LOG *rxdata, UBYTE length) { for (UBYTE i = 0; i < length; i++) { que_voEnter(Q, *rxdata); rxdata++; } return (UBYTE)1; } /****************************************************************************************************************************************************** ** \brief Variable Defination ******************************************************************************************************************************************************/ UBYTE que_ubPopOut(FLASH_ERROR_QUEUE *Q, ERROR_LOG buf[], UBYTE length) { if (que_fgEmpty(Q) != FALSE) { return (UBYTE)0; } for (UBYTE i = 0; i < length; i++) { que_voDelete(Q, &buf[i]); } return (UBYTE)1; } /****************************************************************************************************************************************************** ** @brief ** @param[in] ** @Param[out] ** @returns ******************************************************************************************************************************************************/ /****************************************************************************************************************************************************** ** end of file ******************************************************************************************************************************************************/