본문 바로가기
보관용

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




반응형

'보관용' 카테고리의 다른 글

[HTTPs] POST form  (0) 2014.11.07
[전시회] 사물 인터넷 - 코엑스  (0) 2014.11.04
[GDM] 전반  (0) 2014.10.28
[프로그램_분석] 정의  (0) 2014.10.24
[Oops 분석] 예제  (0) 2014.10.24