/*
 *	cliprinb.c
 *
 *	柍懯傪尭傜偟偨儕儞僌僶僢僼傽
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2015 Naoyuki Sawa
 *
 *	* Mon Nov 16 21:09:12 JST 2015 Naoyuki Sawa
 *	- 1st 儕儕乕僗丅
 *	- 摉儌僕儏乕儖偼丄儕儞僌僶僢僼傽偺傾儖僑儕僘儉偺妎偊彂偒偲偟偰嶌惉偟傑偟偨丅
 *	  庡側栚揑偼丄摉儌僕儏乕儖傪捈愙傾僾儕働乕僔儑儞偱棙梡偡傞帠傛傝傕丄摉儌僕儏乕儖偺幚憰傪嶲徠偟偰屄乆偺儌僕儏乕儖偱撈帺偵儕儞僌僶僢僼傽傪幚憰偡傞帠偱偡丅
 *	  2015/11/16尰嵼丄cliptaps.c儌僕儏乕儖偑丄摉巇條偵増偭偨儕儞僌僶僢僼傽傪幚憰偟偰偄傑偡丅
 *	- 偙傟傑偱偼丄儕儞僌僶僢僼傽傪嶌惉偡傞帪偼丄師夞撉傒弌偟埵抲(iGetPos)偲梫慺奿擺悢(iElmCnt)傪娗棟偡傞傛偆偵偟偰偄傑偟偨丅
 *	  偦偆偟偰偄偨棟桼偼丄師夞撉傒弌偟埵抲(iGetPos)偲師夞彂偒崬傒埵抲(iAddPos)傪娗棟偡傞曽朄偩偲丄嬻偲僼儖偺忬懺偑椉曽偲傕(iGetPos==iAddPos)偱昞偝傟丄嬫暿弌棃側偄偐傜偱偡丅
 *	  嬫暿偡傞偨傔偵偼丄iAddPos傪iGetPos偺堦偮庤慜偺梫慺傑偱偟偐奿擺偟側偄傛偆偵偡傞昁梫偑惗偠偰丄(僶僢僼傽梕検-1)傑偱偟偐棙梡弌棃偢丄柍懯偑惗偠傑偡丅
 *	  師夞撉傒弌偟埵抲(iGetPos)偲梫慺奿擺悢(iElmCnt)傪娗棟偡傞曽朄側傜偽丄嬻偺忬懺偼(iElmCnt=0)丄僼儖偺忬懺偼(iElmCnt=nElmCnt)偱昞偝傟丄嬫暿弌棃傑偡丅
 *	- 偟偐偟丄師夞撉傒弌偟埵抲(iGetPos)偲梫慺奿擺悢(iElmCnt)傪娗棟偡傞曽朄偵傕栤戣偑桳傝傑偟偨丅
 *	  僶僢僼傽梕検傪(2^N)偲偡傞応崌丄iAddPos偺嵟戝抣偼(2^N-1)偱偡偑丄iElmCnt偺嵟戝抣偼(2^N)傪昞尰偱偒側偗傟偽偄偗傑偣傫丅
 *	  偨偲偊偽丄僶僢僼傽梕検傪256偲偡傞応崌丄iAddPos偼(uint8_t)偱嵪傒傑偡偑丄iElmCnt偼(uint16_t)偲偡傞昁梫偑桳傝丄柍懯偑惗偠傑偡丅
 *	- 埲忋偺栤戣偺夝寛嶔偲偟偰丄師夞撉傒弌偟埵抲(iGetPos)偲師夞彂偒崬傒埵抲(iAddPos)傪娗棟偡傞曽朄傪偲傞偑丄巆傝偺1梫慺傕桳岠偵妶梡偡傞曽朄傪峫偊傑偟偨丅
 *	  RinBuf_Get()偼撉傒弌偟偨梫慺傪僐僺乕偟偰曉偡偺偱偼側偔丄僶僢僼傽撪偺梫慺傊偺億僀儞僞傪曉偡帠偵偟傑偟偨丅
 *	  偙傟偑'巆傝偺1梫慺'偺梡搑偲側偭偰丄僐僺乕夞悢傪尭傜偡岠壥偑桳傝丄桳岠偵棙梡弌棃傑偡丅
 *	- 摉儌僕儏乕儖偱偼iAddPos傗iGetPos傪(int)偲偟偰偄傞偺偱丄忋婰偺夵慞偼偁傑傝堄枴偑柍偄偺偱偡偑丄iAddPos傗iGetPos傪(uint8_t)偲偡傞儌僕儏乕儖偵偼桳岠偱偡丅
 *	  崱屻丄儕儞僌僶僢僼傽傪巊梡偡傞儌僕儏乕儖偱偼丄摉儌僕儏乕儖偺幚憰傪嶲徠偟偰丄屄乆偵儕儞僌僶僢僼傽傪幚憰偟偰壓偝偄丅
 *	  偦偺嵺丄忋婰偺愢柧傪嶲徠偟偰丄iAddPos傗iGetPos傪嵟彫尷偺曄悢僒僀僘偲偟偰壓偝偄丅
 */
#include "clip.h"
/****************************************************************************
 *	
 ****************************************************************************/
//儕儞僌僶僢僼傽傪摦揑偵嶌惉偡傞丅
//[out]
//	栠傝抣		儕儞僌僶僢僼傽
ST_RinBuf* RinBuf_New(int nElmSiz/*1乣*/, int nElmCnt/*2乣*/) {
	ST_RinBuf* pRinBuf;
	if((nElmSiz < 1) || (nElmCnt < 2)) { DIE(); }
	//儊儌儕傪妋曐偡傞丅
#ifndef __RENESAS__
	pRinBuf = malloc(sizeof(ST_RinBuf) + (nElmSiz *  nElmCnt));
#else //__RENESAS__
	pRinBuf = malloc(sizeof(ST_RinBuf) + (nElmSiz * (nElmCnt - 1/*ST_RinBuf.TBL_Buf[0]偺暘*/*/)));	//Hew偼梫慺悢[0]偺攝楍偵懳墳偟偰偄側偄偺偱丄梫慺悢[1]偲偟偰挷惍偟傑偟偨丅
#endif//__RENESAS__
	if(!pRinBuf) { DIE(); }
	//儕儞僌僶僢僼傽傪惷揑偵弶婜壔偡傞丅
	RinBuf_Init(pRinBuf, nElmSiz, nElmCnt);
	return pRinBuf;
}
/*---------------------------------------------------------------------------*/
//儕儞僌僶僢僼傽傪惷揑偵弶婜壔偡傞丅
//[in]
//	pRinBuf		儕儞僌僶僢僼傽
void RinBuf_Init(ST_RinBuf* pRinBuf, int nElmSiz/*1乣*/, int nElmCnt/*2乣*/) {
	if((nElmSiz < 1) || (nElmCnt < 2)) { DIE(); }
	pRinBuf->nElmSiz = nElmSiz;
	pRinBuf->iMaxPos = nElmCnt - 1;
	pRinBuf->iAddPos = 0;
	pRinBuf->iGetPos = 0;
	pRinBuf->nOvrCnt = 0;
}
/*---------------------------------------------------------------------------*/
//梫慺傪捛壛偡傞丅
//[in]
//	pRinBuf		儕儞僌僶僢僼傽
//	pElm		捛壛偡傞梫慺傊偺億僀儞僞
void RinBuf_Add(ST_RinBuf* pRinBuf, const void* pElm) {
ENTER_CS;
	{
		//崱夞偺梫慺傪彂偒崬傓埵抲傪庢摼偡傞丅
		int iAddPos = pRinBuf->iAddPos;
		//崱夞偺梫慺傪彂偒崬傓埵抲傊偺億僀儞僞傪媮傔傞丅
		void* pBuf = &pRinBuf->TBL_Buf[pRinBuf->nElmSiz * iAddPos];
		//師夞偺梫慺傪彂偒崬傓埵抲傪恑傔傞丅
		if(++iAddPos > pRinBuf->iMaxPos) { iAddPos = 0; }
		//師夞偺梫慺傪彂偒崬傓埵抲偑丄梫慺傪撉傒弌偡埵抲偵堦抳偟側偗傟偽乧
		// - 懄偪丄崱夞偺梫慺傪彂偒崬傓埵抲偑丄尰嵼傾僾儕働乕僔儑儞偑嶲徠拞(偐傕抦傟側偄)偺埵抲(=慜夞RinBuf_Get()偑曉偟偨埵抲)傛傝傕慜側傜偽乧
		if(iAddPos != pRinBuf->iGetPos) {
			//師夞偺梫慺傪彂偒崬傓埵抲傪奿擺偡傞丅
			pRinBuf->iAddPos = iAddPos;
			//崱夞偺梫慺傪彂偒崬傓丅
			memcpy(pBuf, pElm, pRinBuf->nElmSiz);
		//師夞偺梫慺傪彂偒崬傓埵抲偑丄梫慺傪撉傒弌偡埵抲偵堦抳偟偨傜乧
		// - 懄偪丄崱夞梫慺傪彂偒崬傓埵抲偑丄尰嵼傾僾儕働乕僔儑儞偑嶲徠拞(偐傕抦傟側偄)偺埵抲(=慜夞RinBuf_Get()偑曉偟偨埵抲)側傜偽乧
		} else {
			//崱夞偺梫慺傪彂偒崬傓帠偼弌棃側偄丅僆乕僶乕儔儞偑敪惗偟偨夞悢傪憹傗偡丅
			if(pRinBuf->nOvrCnt < INT_MAX) { pRinBuf->nOvrCnt++; }
		}
	}
LEAVE_CS;
}
/*---------------------------------------------------------------------------*/
//梫慺傪庢摼偡傞丅
//[in]
//	pRinBuf		儕儞僌僶僢僼傽丅
//[out]
//	栠傝抣		庢摼偟偨梫慺傊偺億僀儞僞丅
//			僶僢僼傽偑嬻側傜偽NULL億僀儞僞傪曉偡丅
//[note]
//	- 庢摼偟偨梫慺傊偺億僀儞僞偼丄僶僢僼傽撪偺梫慺傪捈愙巜偡億僀儞僞偱偡丅
//	  傾僾儕働乕僔儑儞偼偙偺億僀儞僞傪夘偟偰捈愙丄僶僢僼傽撪偺梫慺偺撪梕傪嶲徠弌棃傑偡丅
//	  晛捠偺巊偄曽偱偼嶲徠偡傞偩偗偩偲巚偄傑偡偑丄傕偟昁梫側傜偽梫慺偺撪梕傪彂偒姺偊偰傕峔偄傑偣傫丅
//	- 傾僾儕働乕僔儑儞偑師夞偵RinBuf_Get()傪撉傒弌偡傑偱丄偙偺億僀儞僞偑巜偡梫慺偺撪梕偼攋夡偝傟傑偣傫丅
//	  傕偟偦傟傑偱偺娫偵RinBuf_Add()偑屇傃弌偝傟偨応崌傕丄偙偺億僀儞僞偑巜偡梫慺偺撪梕偼攋夡偝傟傑偣傫丅
//	  傾僾儕働乕僔儑儞偑師夞偵RinBuf_Get()傪撉傒弌偡偲丄慜夞偺RinBuf_Get()偱庢摼偟偨億僀儞僞偑巜偡梫慺偺撪梕偼柍岠偵側傝傑偡丅
void* RinBuf_Get(ST_RinBuf* pRinBuf) {
	void* pBuf;
ENTER_CS;
	{
		//崱夞偺梫慺傪撉傒弌偡埵抲傪庢摼偡傞丅
		int iGetPos = pRinBuf->iGetPos;
		//僶僢僼傽偑嬻偱側偗傟偽乧
		if(iGetPos != pRinBuf->iAddPos) {
			//崱夞偺梫慺傪撉傒弌偡埵抲傊偺億僀儞僞傪媮傔傞丅
			pBuf = &pRinBuf->TBL_Buf[pRinBuf->nElmSiz * iGetPos];
			//師夞偺梫慺傪撉傒弌偡埵抲傪恑傔傞丅
			if(++iGetPos > pRinBuf->iMaxPos) { iGetPos = 0; }
			//師夞偺梫慺傪撉傒弌偡埵抲傪奿擺偡傞丅
			pRinBuf->iGetPos = iGetPos;
		//僶僢僼傽偑嬻側傜偽乧
		} else {
			//NULL億僀儞僞傪曉偡丅
			pBuf = NULL;
		}
	}
LEAVE_CS;
	return pBuf;
}
/*---------------------------------------------------------------------------*/
//僆乕僶乕儔儞偑敪惗偟偨夞悢傪庢摼偡傞丅
//[out]
//	栠傝抣		慜夞偺RinBuf_Ovr()屇傃弌偟埲崀偵敪惗偟偨丄僆乕僶乕儔儞偺夞悢傪曉偡丅
int RinBuf_Ovr(ST_RinBuf* pRinBuf) {
	int nOvrCnt;
ENTER_CS;
	{
		//僆乕僶乕儔儞偑敪惗偟偨夞悢傪庢摼偡傞丅
		nOvrCnt = pRinBuf->nOvrCnt;
		//僆乕僶乕儔儞偑敪惗偟偨夞悢傪妋幚偵僋儕傾偡傞丅
		pRinBuf->nOvrCnt = 0;
	}
LEAVE_CS;
	return nOvrCnt;
}
/****************************************************************************
 *	愢柧
 ****************************************************************************/
#if 0
RinBuf_New(?,3) 仺 pRinBuf
伀
           nOvrCnt=0
         劇劅劅劅劅劅劉仼iAddPos,iGetPos
      [0]劆  晄掕抣  劆
         劌劅劅劅劅劅劎
      [1]劆  晄掕抣  劆
iMaxPos仺劌劅劅劅劅劅劎
      [2]劆  晄掕抣  劆
         劋劅劅劅劅劅劊
伀
RinBuf_Get(pRinBuf) 仺 NULL
伀
           nOvrCnt=0
         劇劅劅劅劅劅劉仼iAddPos,iGetPos
      [0]劆  晄掕抣  劆
         劌劅劅劅劅劅劎
      [1]劆  晄掕抣  劆
iMaxPos仺劌劅劅劅劅劅劎
      [2]劆  晄掕抣  劆
         劋劅劅劅劅劅劊
伀
RinBuf_Add(pRinBuf,&嘆)
伀
           nOvrCnt=0
         劇劅劅劅劅劅劉仼iGetPos
      [0]劆嘆(枹嶲徠)劆
         劌劅劅劅劅劅劎仼iAddPos
      [1]劆  晄掕抣  劆
iMaxPos仺劌劅劅劅劅劅劎
      [2]劆  晄掕抣  劆
         劋劅劅劅劅劅劊
伀
RinBuf_Add(pRinBuf,&嘇)
伀
           nOvrCnt=0
         劇劅劅劅劅劅劉仼iGetPos
      [0]劆嘆(枹嶲徠)劆
         劌劅劅劅劅劅劎
      [1]劆嘇(枹嶲徠)劆
iMaxPos仺劌劅劅劅劅劅劎仼iAddPos
      [2]劆  晄掕抣  劆
         劋劅劅劅劅劅劊
伀
RinBuf_Get(pRinBuf) 仺 &[0]
伀
           nOvrCnt=0
         劇劅劅劅劅劅劉
      [0]劆嘆(嶲徠拞)劆
         劌劅劅劅劅劅劎仼iGetPos
      [1]劆嘇(枹嶲徠)劆
iMaxPos仺劌劅劅劅劅劅劎仼iAddPos
      [2]劆  晄掕抣  劆
         劋劅劅劅劅劅劊
伀
RinBuf_Add(pRinBuf,&嘊)
伀
           nOvrCnt=0
         劇劅劅劅劅劅劉仼iAddPos
      [0]劆嘆(嶲徠拞)劆
         劌劅劅劅劅劅劎仼iGetPos
      [1]劆嘇(枹嶲徠)劆
iMaxPos仺劌劅劅劅劅劅劎
      [2]劆嘊(枹嶲徠)劆
         劋劅劅劅劅劅劊
伀
RinBuf_Add(pRinBuf,&嘋)			3梫慺偺僶僢僼傽傪嶌惉偟偨応崌偼丄枹嶲徠偺梫慺傪2梫慺傑偱偟偐奿擺弌棃側偄帠偵拲堄偣傛丅巆傝1梫慺偼丄傾僾儕働乕僔儑儞偑嶲徠拞偲尒側偡丅
伀
           nOvrCnt=1			僆乕僶乕儔儞夞悢偑憹偊傞丅
         劇劅劅劅劅劅劉仼iAddPos
      [0]劆嘆(嶲徠拞)劆
         劌劅劅劅劅劅劎仼iGetPos
      [1]劆嘇(枹嶲徠)劆
iMaxPos仺劌劅劅劅劅劅劎
      [2]劆嘊(枹嶲徠)劆
         劋劅劅劅劅劅劊
伀
RinBuf_Get(pRinBuf) 仺 &[1]
伀
           nOvrCnt=1
         劇劅劅劅劅劅劉仼iAddPos
      [0]劆  晄掕抣  劆
         劌劅劅劅劅劅劎
      [1]劆嘇(嶲徠拞)劆
iMaxPos仺劌劅劅劅劅劅劎仼iGetPos
      [2]劆嘊(枹嶲徠)劆
         劋劅劅劅劅劅劊
伀
RinBuf_Add(pRinBuf,&嘍)
伀
           nOvrCnt=1
         劇劅劅劅劅劅劉
      [0]劆嘍(枹嶲徠)劆
         劌劅劅劅劅劅劎仼iAddPos
      [1]劆嘇(嶲徠拞)劆
iMaxPos仺劌劅劅劅劅劅劎仼iGetPos
      [2]劆嘊(枹嶲徠)劆
         劋劅劅劅劅劅劊
伀
RinBuf_Ovr(pRinBuf) 仺 1
伀
           nOvrCnt=0
         劇劅劅劅劅劅劉
      [0]劆嘍(枹嶲徠)劆
         劌劅劅劅劅劅劎仼iAddPos
      [1]劆嘇(嶲徠拞)劆
iMaxPos仺劌劅劅劅劅劅劎仼iGetPos
      [2]劆嘊(枹嶲徠)劆
         劋劅劅劅劅劅劊
#endif
