Ring Buffer

Dependents:   pseudo_comet GSwifi_sample MelInverter_sample SerialPassthrough_withRB

Committer:
okini3939
Date:
Wed May 18 14:57:36 2011 +0000
Revision:
1:ea0c0a46dbdd
Parent:
0:d0e076916a0a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:d0e076916a0a 1 /*
okini3939 0:d0e076916a0a 2 * mbed library for RingBuffer
okini3939 0:d0e076916a0a 3 * Copyright (c) 2010 Hiroshi Suga
okini3939 0:d0e076916a0a 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:d0e076916a0a 5 */
okini3939 0:d0e076916a0a 6
okini3939 1:ea0c0a46dbdd 7 /** @file RingBuffer.cpp
okini3939 1:ea0c0a46dbdd 8 * @brief Ring Buffer
okini3939 1:ea0c0a46dbdd 9 */
okini3939 1:ea0c0a46dbdd 10
okini3939 0:d0e076916a0a 11 #include "RingBuffer.h"
okini3939 0:d0e076916a0a 12
okini3939 0:d0e076916a0a 13 RingBuffer::RingBuffer (int p_size) {
okini3939 0:d0e076916a0a 14 size = p_size + 1;
okini3939 0:d0e076916a0a 15 buf = new char[size];
okini3939 0:d0e076916a0a 16 addr_w = 0;
okini3939 0:d0e076916a0a 17 addr_r = 0;
okini3939 0:d0e076916a0a 18 }
okini3939 0:d0e076916a0a 19
okini3939 0:d0e076916a0a 20 RingBuffer::~RingBuffer () {
okini3939 0:d0e076916a0a 21 delete [] buf;
okini3939 0:d0e076916a0a 22 }
okini3939 0:d0e076916a0a 23
okini3939 0:d0e076916a0a 24 int RingBuffer::put (char dat) {
okini3939 0:d0e076916a0a 25 int next;
okini3939 0:d0e076916a0a 26
okini3939 0:d0e076916a0a 27 next = (addr_w + 1) % size;
okini3939 0:d0e076916a0a 28 if (next == addr_r) {
okini3939 0:d0e076916a0a 29 return -1;
okini3939 0:d0e076916a0a 30 }
okini3939 0:d0e076916a0a 31 buf[addr_w] = dat;
okini3939 0:d0e076916a0a 32 addr_w = next;
okini3939 1:ea0c0a46dbdd 33 return -1;
okini3939 0:d0e076916a0a 34 }
okini3939 0:d0e076916a0a 35
okini3939 0:d0e076916a0a 36 int RingBuffer::put (char *dat, int len) {
okini3939 0:d0e076916a0a 37 int next, i;
okini3939 0:d0e076916a0a 38
okini3939 0:d0e076916a0a 39
okini3939 0:d0e076916a0a 40 for (i = 0; i < len; i ++) {
okini3939 0:d0e076916a0a 41 next = (addr_w + 1) % size;
okini3939 0:d0e076916a0a 42 if (next == addr_r) {
okini3939 0:d0e076916a0a 43 break;
okini3939 0:d0e076916a0a 44 }
okini3939 0:d0e076916a0a 45 buf[addr_w] = dat[i];
okini3939 0:d0e076916a0a 46 addr_w = next;
okini3939 0:d0e076916a0a 47 }
okini3939 0:d0e076916a0a 48 return i;
okini3939 0:d0e076916a0a 49 }
okini3939 0:d0e076916a0a 50
okini3939 1:ea0c0a46dbdd 51 int RingBuffer::get (char *dat) {
okini3939 0:d0e076916a0a 52 if (addr_r == addr_w) {
okini3939 0:d0e076916a0a 53 return -1;
okini3939 0:d0e076916a0a 54 }
okini3939 1:ea0c0a46dbdd 55 *dat = buf[addr_r];
okini3939 0:d0e076916a0a 56 addr_r = (addr_r + 1) % size;
okini3939 0:d0e076916a0a 57 return 0;
okini3939 0:d0e076916a0a 58 }
okini3939 0:d0e076916a0a 59
okini3939 0:d0e076916a0a 60 int RingBuffer::get (char *dat, int len) {
okini3939 0:d0e076916a0a 61 int i;
okini3939 0:d0e076916a0a 62
okini3939 0:d0e076916a0a 63 for (i = 0; i < len; i ++) {
okini3939 0:d0e076916a0a 64 if (addr_r == addr_w) {
okini3939 0:d0e076916a0a 65 break;
okini3939 0:d0e076916a0a 66 }
okini3939 0:d0e076916a0a 67 dat[i] = buf[addr_r];
okini3939 0:d0e076916a0a 68 addr_r = (addr_r + 1) % size;
okini3939 0:d0e076916a0a 69 }
okini3939 0:d0e076916a0a 70 return i;
okini3939 0:d0e076916a0a 71 }
okini3939 0:d0e076916a0a 72
okini3939 0:d0e076916a0a 73 int RingBuffer::available () {
okini3939 0:d0e076916a0a 74 if (addr_w < addr_r) {
okini3939 0:d0e076916a0a 75 return addr_r - addr_w - 1;
okini3939 0:d0e076916a0a 76 } else {
okini3939 0:d0e076916a0a 77 return (size - addr_w) + addr_r - 1;
okini3939 0:d0e076916a0a 78 }
okini3939 0:d0e076916a0a 79 }
okini3939 0:d0e076916a0a 80
okini3939 0:d0e076916a0a 81 int RingBuffer::use () {
okini3939 0:d0e076916a0a 82 return size - available() - 1;
okini3939 0:d0e076916a0a 83 }
okini3939 0:d0e076916a0a 84
okini3939 0:d0e076916a0a 85 void RingBuffer::clear () {
okini3939 0:d0e076916a0a 86 addr_w = 0;
okini3939 0:d0e076916a0a 87 addr_r = 0;
okini3939 0:d0e076916a0a 88 }