1 /*********************************************************************************
\r
3 * --------------------------------------------------------------------------------
\r
5 * This file is part of MiMic
\r
6 * Copyright (C)2011 Ryo Iizuka
\r
8 * MiMic is free software: you can redistribute it and/or modify
\r
9 * it under the terms of the GNU Lesser General Public License as published
\r
10 * by the Free Software Foundation, either version 3 of the License, or
\r
11 * (at your option) any later version.
\r
13 * This program is distributed in the hope that it will be useful,
\r
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
16 * GNU General Public License for more details.
\r
18 * You should have received a copy of the GNU Lesser General Public License
\r
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
\r
21 * For further information please contact.
\r
23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
\r
25 *********************************************************************************/
\r
26 #include "NyLPC_cRingBuffer.h"
\r
29 #if NyLPC_ARCH==NyLPC_ARCH_FREERTOS
\r
30 #elif NyLPC_ARCH==NyLPC_ARCH_WIN32
\r
31 void NyLPC_cRingBuffer_dump(NyLPC_TcRingBuffer_t* i_inst)
\r
33 NyLPC_TUInt8* s=((NyLPC_TUInt8*)(i_inst+1));//バッファ開始位置
\r
35 if(i_inst->ro<=i_inst->wo){
\r
36 for(i=0;i<i_inst->ro;i++){
\r
39 for(i=i_inst->ro;i<i_inst->wo;i++){
\r
40 printf("%02X ",*(s+i));
\r
42 for(i=i_inst->wo;i<i_inst->bl;i++){
\r
46 for(i=0;i<i_inst->wo;i++){
\r
47 printf("%02X ",*(s+i));
\r
49 for(i=i_inst->wo;i<i_inst->ro;i++){
\r
52 for(i=i_inst->ro;i<i_inst->bl;i++){
\r
53 printf("%02X ",*(s+i));
\r
61 void NyLPC_cRingBuffer_reset(NyLPC_TcRingBuffer_t* i_inst)
\r
63 i_inst->ro=i_inst->wo=0;
\r
66 NyLPC_TInt16 NyLPC_cRingBuffer_getReadableSize(NyLPC_TcRingBuffer_t* i_inst)
\r
68 volatile NyLPC_TUInt16 wo=(i_inst)->wo;
\r
69 volatile NyLPC_TUInt16 ro=(i_inst)->ro;
\r
74 return (i_inst)->bl-ro;
\r
78 NyLPC_TInt16 NyLPC_cRingBuffer_getWritableSize(const NyLPC_TcRingBuffer_t* i_inst)
\r
80 volatile NyLPC_TUInt16 wo=(i_inst)->wo;
\r
81 volatile NyLPC_TUInt16 ro=(i_inst)->ro;
\r
84 return i_inst->bl-(wo-ro)-1;
\r
91 void NyLPC_cRingBuffer_initialize(NyLPC_TcRingBuffer_t* i_inst,void* i_buf,NyLPC_TUInt16 sizeof_buf)
\r
94 i_inst->bl=sizeof_buf;
\r
100 int NyLPC_cRingBuffer_write(NyLPC_TcRingBuffer_t* i_inst,NyLPC_TUInt8* i_data,const int i_len)
\r
102 NyLPC_TUInt8* s=(NyLPC_TUInt8*)i_inst->buf;
\r
104 NyLPC_TUInt16 wo=i_inst->wo;
\r
105 NyLPC_TUInt16 ro=i_inst->ro;
\r
106 NyLPC_TUInt16 wsize;//書込み可能サイズ
\r
112 wsize=i_inst->bl-(wo-ro)-1;
\r
122 l=(wsize<rw)?wsize:rw;
\r
125 for(i=l-1;i>=0;i--){
\r
126 *(p++)=*(i_data++);
\r
129 wo=(wo+l)%i_inst->bl;
\r
130 l=wsize-l;//lに左側の書込みサイズストア
\r
141 for(i=l-1;i>=0;i--){
\r
142 *(p++)=*(i_data++);
\r
150 NyLPC_TUInt8* NyLPC_cRingBuffer_pread(NyLPC_TcRingBuffer_t* i_inst,NyLPC_TUInt16 *len)
\r
152 NyLPC_TUInt16 ro=i_inst->ro;
\r
153 *len=NyLPC_cRingBuffer_getReadableSize(i_inst);
\r
154 return ((NyLPC_TUInt8*)(i_inst->buf))+ro;
\r
158 void NyLPC_cRingBuffer_preadSeek(NyLPC_TcRingBuffer_t* i_inst,NyLPC_TUInt16 i_seek)
\r
160 NyLPC_Assert(NyLPC_cRingBuffer_getReadableSize(i_inst)>=i_seek);
\r
161 i_inst->ro=(i_inst->ro+i_seek)%i_inst->bl;
\r
171 char buf[sizeof(NyLPC_TcRingBuffer_t)+5];
\r
172 NyLPC_TcRingBuffer_t* s;
\r
173 s=NyLPC_cRingBuffer_initialize(buf,sizeof(buf));
\r
175 b=NyLPC_cRingBuffer_getReadPtr(s,&l);
\r
176 printf("readable:%d\n",l);
\r
177 c=NyLPC_cRingBuffer_write(s,"0123456789",3);
\r
178 NyLPC_cRingBuffer_dump(s);
\r
179 b=NyLPC_cRingBuffer_getReadPtr(s,&l);
\r
180 printf("readable:%d\n",l);
\r
181 NyLPC_cRingBuffer_seekReadPtr(s,(l>1)?l-1:1);
\r
182 printf("read:%d\n",(l>1)?l-1:1);
\r
183 NyLPC_cRingBuffer_dump(s);
\r