보관용
[Util] SlidingVal
by 크크다스
2014. 10. 29.
개요
일정 기간동안의 평균값을 지정된 시간간격으로 측정하고자 할 때 사용할 수 있는 코드이다.
= 구성
.h / .c
= 소스
/*============================================================================= // _priv_lib_util.h //============================================================================= // COMPANY : // AUTHOR : firstpw // DATE : 2013/06/09 23:19:47 // DESCRIPTION : //============================================================================= */ #ifndef _PRIV_LIB_UTIL_H #define _PRIV_LIB_UTIL_H
/*============================================================================= // I N C L U D E //============================================================================= */ #include "stdio.h" #include "stdlib.h" #include "string.h"
#include "_priv_lib_osdep.h"
/*============================================================================= // M A C R O //============================================================================= */
/*============================================================================= // C O N S T A N T //============================================================================= */ typedef enum { E_TimeUnit_NANO = 9, E_TimeUnit_MICRO = 6, E_TimeUnit_1ms = 3, E_TimeUnit_10ms = 2, E_TimeUnit_100ms = 1, E_TimeUnit_SEC = 0, E_TimeUnit_MIN = -60, E_TimeUnit_HOUR = -3600, E_TimeUnit_DAY = -3600 * 24, E_TimeUnit_WEEK = -3600 * 24 * 7 } E_TimeUnit;
typedef enum { E_DataSize_CHAR = 1, E_DataSize_SHORT = 2, E_DataSize_INT = 4, E_DataSize_LONG = 8 } E_DataSize;
/*============================================================================= // S T R U C T U R E //============================================================================= */ // Ex> // 5Min per 100ms // Val range 0 ~ 255 // ------------------------- // mSlideUnit : E_TimeUnit_100ms // mSlideTick : 1 // mSlideNum : 10(100ms : 10 ^ E_TimeUnit_100ms) * 60 * 5 typedef struct { E_DataSize mSize; E_TimeUnit mUnit; xu32 mNum; xu32 mCurIdx; xu32 mMaxCnt; // Slide Num include DATA xu32 mValTot; // Caution> OverFlow xu32 mValAve; union { xu8 mXu8[0]; xu16 mXu16[0]; xu32 mXu32[0]; // xu64 mXu64[0]; }u; } T_SlidingVal;
#define GET_SLIDING_VAL(_data, _idx) \ ( ((_data)->mSize) == E_DataSize_CHAR ? ((_data)->u.mXu8[_idx]) \ : ( ((_data)->mSize) == E_DataSize_SHORT ? ((_data)->u.mXu16[_idx]) \ : ( ((_data)->mSize) == E_DataSize_INT ? ((_data)->u.mXu32[_idx]) \ : ((_data)->u.mXu32[_idx]) ) ) )
#define SET_SLIDING_VAL(_data, _idx, _val) \ ( ((_data)->mSize) == E_DataSize_CHAR ? ((_data)->u.mXu8[_idx] = (_val)) \ : ( ((_data)->mSize) == E_DataSize_SHORT ? ((_data)->u.mXu16[_idx] = (_val)) \ : ( ((_data)->mSize) == E_DataSize_INT ? ((_data)->u.mXu32[_idx] = (_val)) \ : ((_data)->u.mXu32[_idx] = (_val)) ) ) )
/*============================================================================= // U T I L s //============================================================================= */ /*----------------------------------------------------------------------------- // M A C R O s //----------------------------------------------------------------------------- */
/*----------------------------------------------------------------------------- // F U N C s //----------------------------------------------------------------------------- */ T_SlidingVal* xSlidingValInit(E_TimeUnit unit, E_DataSize size, xu32 slideLongSec); void xSlidingValCalc(T_SlidingVal* pEnt, xu32 newVal); #define xSlidingValAve(_ent) ((_ent)->mValAve)
#endif /* _PRIV_LIB_UTIL_H */
/*============================================================================= // _priv_lib_util.c //============================================================================= // COMPANY : // AUTHOR : firstpw // DATE : 2013/06/09 23:19:47 // DESCRIPTION : Makefile > drivers/wlan/umac/Kbuild //============================================================================= */ #define UTIL_PRIV_C
/*============================================================================= // I N C L U D E //============================================================================= */ #include "_priv_lib_util.h"
/*============================================================================= // M A C R O //============================================================================= */
/*============================================================================= // C O N S T A N T //============================================================================= */
/*============================================================================= // S T R U C T U R E //============================================================================= */
/*============================================================================= // S T A T I C V A R I A B L E //============================================================================= */
/*============================================================================= // S T A T I C F U N C T I O N //============================================================================= */ T_SlidingVal* xSlidingValInit(E_TimeUnit unit, E_DataSize size, xu32 slideLongSec) { T_SlidingVal* pSlide; xu32 num;
if(unit < 0) { // sec / (-unit) num = slideLongSec / ( (-1) * unit ); } else { // sec * (10^0 ~ 10^9) num = slideLongSec * ( 10 ^ unit ); } pSlide = (T_SlidingVal*) malloc(sizeof(T_SlidingVal) + size * num); if(! pSlide) { return NULL; } pSlide->mSize = size; pSlide->mUnit = unit; pSlide->mNum = num; pSlide->mCurIdx = 0; pSlide->mMaxCnt = 0; pSlide->mValTot = 0; pSlide->mValAve = 0; memset(&pSlide->u, 0x00, size * num);
return pSlide; }
void xSlidingValCalc(T_SlidingVal* pEnt, xu32 newVal) {
if(pEnt->mMaxCnt < pEnt->mNum) { pEnt->mMaxCnt++; } pEnt->mValTot += newVal - GET_SLIDING_VAL(pEnt, pEnt->mCurIdx); #if 0 /* Worked by [FIRSTPW:2014.10.30] : Start IPQ */ pEnt->mValAve = pEnt->mValTot / pEnt->mNum; #else /* Worked by [FIRSTPW:2014.10.30] : Else IPQ */ pEnt->mValAve = pEnt->mValTot / pEnt->mMaxCnt; #endif /* Worked by [FIRSTPW:2014.10.30] : End IPQ */ SET_SLIDING_VAL(pEnt, pEnt->mCurIdx, newVal); if(pEnt->mCurIdx < pEnt->mNum - 1) { pEnt->mCurIdx ++; } else { pEnt->mCurIdx = 0; }
return; } |