/* ******************************************************************************* * [curebuffer.c] * This module is for FIFO buffer. * * This program is under the terms of the GPLv3. * https://www.gnu.org/licenses/gpl-3.0.html * * Copyright(c) 2017 Keshikan (www.keshikan.net) ******************************************************************************* */ #include "curebuffer.h" #include #include ///////////////////////////// //methods for uint8_t FIFO. ///////////////////////////// BUFFER_STATUS cureRingBufferU8Init(RingBufferU8 *rbuf, uint16_t buflen) { uint32_t i; cureRingBufferU8Free(rbuf); rbuf->buffer = (uint8_t *)malloc( buflen * sizeof(uint8_t) ); if(NULL == rbuf->buffer){ return BUFFER_FAILURE; } for(i=0; ibuffer[i] = 0; } rbuf->length = buflen; return BUFFER_SUCCESS; } BUFFER_STATUS cureRingBufferU8Free(RingBufferU8 *rbuf) { if(NULL != rbuf->buffer){ free(rbuf->buffer); } rbuf->idx_front = rbuf->idx_rear = 0; rbuf->length = 0; return BUFFER_SUCCESS; } BUFFER_STATUS cureRingBufferU8Enqueue(RingBufferU8 *rbuf, uint8_t *inputc) { if( ((rbuf->idx_front +1)&(rbuf->length -1)) == rbuf->idx_rear ){//buffer overrun error occurs. return BUFFER_FAILURE; }else{ rbuf->buffer[rbuf->idx_front]= *inputc; rbuf->idx_front++; rbuf->idx_front &= (rbuf->length -1); return BUFFER_SUCCESS; } } BUFFER_STATUS cureRingBufferU8Dequeue(RingBufferU8 *rbuf, uint8_t *ret) { if(rbuf->idx_front == rbuf->idx_rear){//if buffer underrun error occurs. return BUFFER_FAILURE; }else{ *ret = (rbuf->buffer[rbuf->idx_rear]); rbuf->idx_rear++; rbuf->idx_rear &= (rbuf->length -1); return BUFFER_SUCCESS; } } //debug uint16_t _cureRingBufferU8GetUsedSize(RingBufferU8 *rbuf) { if(rbuf->idx_front >= rbuf->idx_rear){ return rbuf->idx_front - rbuf->idx_rear; }else{ return rbuf->idx_front + rbuf->length - rbuf->idx_rear; } } ///////////////////////////// //methods for int16_t FIFO. ///////////////////////////// BUFFER_STATUS cureRingBuffer16Init(RingBuffer16 *rbuf, uint16_t buflen) { uint32_t i; cureRingBuffer16Free(rbuf); rbuf->buffer = (int16_t *)malloc( buflen * sizeof(int16_t) ); if(NULL == rbuf->buffer){ return BUFFER_FAILURE; } for(i=0; ibuffer[i] = 0; } rbuf->length = buflen; return BUFFER_SUCCESS; } BUFFER_STATUS cureRingBuffer16Free(RingBuffer16 *rbuf) { if(NULL != rbuf->buffer){ free(rbuf->buffer); } rbuf->idx_front = rbuf->idx_rear = 0; rbuf->length = 0; return BUFFER_SUCCESS; } BUFFER_STATUS cureRingBuffer16Enqueue(RingBuffer16 *rbuf, int16_t *inputc) { if( ((rbuf->idx_front +1)&(rbuf->length -1)) == rbuf->idx_rear ){//buffer overrun error occurs. return BUFFER_FAILURE; }else{ rbuf->buffer[rbuf->idx_front]= *inputc; rbuf->idx_front++; rbuf->idx_front &= (rbuf->length -1); return BUFFER_SUCCESS; } } BUFFER_STATUS cureRingBuffer16EnqueueIgnoreErr(RingBuffer16 *rbuf, int16_t *inputc) { rbuf->buffer[rbuf->idx_front]= *inputc; rbuf->idx_front++; rbuf->idx_front &= (rbuf->length -1); return BUFFER_SUCCESS; } BUFFER_STATUS cureRingBuffer16Dequeue(RingBuffer16 *rbuf, int16_t *ret) { if(rbuf->idx_front == rbuf->idx_rear){//if buffer underrun error occurs. return BUFFER_FAILURE; }else{ *ret = (rbuf->buffer[rbuf->idx_rear]); rbuf->idx_rear++; rbuf->idx_rear &= (rbuf->length -1); return BUFFER_SUCCESS; } } BUFFER_STATUS cureRingBuffer16GetElement(RingBuffer16 *rbuf, int16_t *ret, uint16_t delaynum, uint16_t delay_buffer_length) { if(rbuf->idx_front >= delaynum){ rbuf->idx_rear = rbuf->idx_front - delaynum; }else{ rbuf->idx_rear = delay_buffer_length - (delaynum - rbuf->idx_front); } *ret = (rbuf->buffer[rbuf->idx_rear]); return BUFFER_SUCCESS; } ///////////////////////////// //methods for uint32_t FIFO. ///////////////////////////// BUFFER_STATUS cureRingBufferU32Init(RingBuffer32 *rbuf, uint16_t buflen) { uint32_t i; cureRingBufferU32Free(rbuf); rbuf->buffer = (uint32_t *)malloc( buflen * sizeof(uint32_t) ); if(NULL == rbuf->buffer){ return BUFFER_FAILURE; } for(i=0; ibuffer[i] = 0; } rbuf->length = buflen; return BUFFER_SUCCESS; } BUFFER_STATUS cureRingBufferU32Free(RingBuffer32 *rbuf) { if(NULL != rbuf->buffer){ free(rbuf->buffer); } rbuf->idx_front = rbuf->idx_rear = 0; rbuf->length = 0; return BUFFER_SUCCESS; } BUFFER_STATUS cureRingBufferU32Enqueue(RingBuffer32 *rbuf, uint32_t *inputc) { if( ((rbuf->idx_front +1)&(rbuf->length -1)) == rbuf->idx_rear ){//buffer overrun error occurs. return BUFFER_FAILURE; }else{ rbuf->buffer[rbuf->idx_front]= *inputc; rbuf->idx_front++; rbuf->idx_front &= (rbuf->length -1); return BUFFER_SUCCESS; } } BUFFER_STATUS cureRingBufferU32EnqueueIgnoreErr(RingBuffer32 *rbuf, uint32_t *inputc) { rbuf->buffer[rbuf->idx_front]= *inputc; rbuf->idx_front++; rbuf->idx_front &= (rbuf->length -1); return BUFFER_SUCCESS; } BUFFER_STATUS cureRingBufferU32Dequeue(RingBuffer32 *rbuf, uint32_t *ret) { if(rbuf->idx_front == rbuf->idx_rear){//if buffer underrun error occurs. return BUFFER_FAILURE; }else{ *ret = (rbuf->buffer[rbuf->idx_rear]); rbuf->idx_rear++; rbuf->idx_rear &= (rbuf->length -1); return BUFFER_SUCCESS; } } BUFFER_STATUS cureRingBufferU32GetElement(RingBuffer32 *rbuf, uint32_t *ret, uint16_t delaynum, uint16_t delay_buffer_length) { uint16_t buf; if(rbuf->idx_front >= delaynum){ buf = rbuf->idx_front - delaynum; }else{ buf = delay_buffer_length - (delaynum - rbuf->idx_front); } *ret = (rbuf->buffer[buf]); return BUFFER_SUCCESS; } //BUFFER_STATUS cureRingBufferU32GetElement(RingBuffer32 *rbuf, uint32_t *ret, uint16_t delaynum, uint16_t delay_buffer_length) //{ // // // if(rbuf->idx_front >= delaynum){ // rbuf->idx_rear = rbuf->idx_front - delaynum; // }else{ // rbuf->idx_rear = delay_buffer_length - (delaynum - rbuf->idx_front); // } // *ret = (rbuf->buffer[rbuf->idx_rear]); // return BUFFER_SUCCESS; // //}