Ring Buffer

Dependents:   pseudo_comet GSwifi_sample MelInverter_sample SerialPassthrough_withRB

Committer:
okini3939
Date:
Thu Nov 11 16:04:19 2010 +0000
Revision:
0:d0e076916a0a
Child:
1:ea0c0a46dbdd

        

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 0:d0e076916a0a 7 #include "RingBuffer.h"
okini3939 0:d0e076916a0a 8
okini3939 0:d0e076916a0a 9 RingBuffer::RingBuffer (int p_size) {
okini3939 0:d0e076916a0a 10 size = p_size + 1;
okini3939 0:d0e076916a0a 11 buf = new char[size];
okini3939 0:d0e076916a0a 12 addr_w = 0;
okini3939 0:d0e076916a0a 13 addr_r = 0;
okini3939 0:d0e076916a0a 14 }
okini3939 0:d0e076916a0a 15
okini3939 0:d0e076916a0a 16 RingBuffer::~RingBuffer () {
okini3939 0:d0e076916a0a 17 delete [] buf;
okini3939 0:d0e076916a0a 18 }
okini3939 0:d0e076916a0a 19
okini3939 0:d0e076916a0a 20 int RingBuffer::put (char dat) {
okini3939 0:d0e076916a0a 21 int next;
okini3939 0:d0e076916a0a 22
okini3939 0:d0e076916a0a 23 next = (addr_w + 1) % size;
okini3939 0:d0e076916a0a 24 if (next == addr_r) {
okini3939 0:d0e076916a0a 25 return -1;
okini3939 0:d0e076916a0a 26 }
okini3939 0:d0e076916a0a 27 buf[addr_w] = dat;
okini3939 0:d0e076916a0a 28 addr_w = next;
okini3939 0:d0e076916a0a 29 return dat;
okini3939 0:d0e076916a0a 30 }
okini3939 0:d0e076916a0a 31
okini3939 0:d0e076916a0a 32 int RingBuffer::put (char *dat, int len) {
okini3939 0:d0e076916a0a 33 int next, i;
okini3939 0:d0e076916a0a 34
okini3939 0:d0e076916a0a 35
okini3939 0:d0e076916a0a 36 for (i = 0; i < len; i ++) {
okini3939 0:d0e076916a0a 37 next = (addr_w + 1) % size;
okini3939 0:d0e076916a0a 38 if (next == addr_r) {
okini3939 0:d0e076916a0a 39 break;
okini3939 0:d0e076916a0a 40 }
okini3939 0:d0e076916a0a 41 buf[addr_w] = dat[i];
okini3939 0:d0e076916a0a 42 addr_w = next;
okini3939 0:d0e076916a0a 43 }
okini3939 0:d0e076916a0a 44 return i;
okini3939 0:d0e076916a0a 45 }
okini3939 0:d0e076916a0a 46
okini3939 0:d0e076916a0a 47 int RingBuffer::get (char &dat) {
okini3939 0:d0e076916a0a 48 if (addr_r == addr_w) {
okini3939 0:d0e076916a0a 49 return -1;
okini3939 0:d0e076916a0a 50 }
okini3939 0:d0e076916a0a 51 dat = buf[addr_r];
okini3939 0:d0e076916a0a 52 addr_r = (addr_r + 1) % size;
okini3939 0:d0e076916a0a 53 return 0;
okini3939 0:d0e076916a0a 54 }
okini3939 0:d0e076916a0a 55
okini3939 0:d0e076916a0a 56 int RingBuffer::get (char *dat, int len) {
okini3939 0:d0e076916a0a 57 int i;
okini3939 0:d0e076916a0a 58
okini3939 0:d0e076916a0a 59 for (i = 0; i < len; i ++) {
okini3939 0:d0e076916a0a 60 if (addr_r == addr_w) {
okini3939 0:d0e076916a0a 61 break;
okini3939 0:d0e076916a0a 62 }
okini3939 0:d0e076916a0a 63 dat[i] = buf[addr_r];
okini3939 0:d0e076916a0a 64 addr_r = (addr_r + 1) % size;
okini3939 0:d0e076916a0a 65 }
okini3939 0:d0e076916a0a 66 return i;
okini3939 0:d0e076916a0a 67 }
okini3939 0:d0e076916a0a 68
okini3939 0:d0e076916a0a 69 int RingBuffer::available () {
okini3939 0:d0e076916a0a 70 if (addr_w < addr_r) {
okini3939 0:d0e076916a0a 71 return addr_r - addr_w - 1;
okini3939 0:d0e076916a0a 72 } else {
okini3939 0:d0e076916a0a 73 return (size - addr_w) + addr_r - 1;
okini3939 0:d0e076916a0a 74 }
okini3939 0:d0e076916a0a 75 }
okini3939 0:d0e076916a0a 76
okini3939 0:d0e076916a0a 77 int RingBuffer::use () {
okini3939 0:d0e076916a0a 78 return size - available() - 1;
okini3939 0:d0e076916a0a 79 }
okini3939 0:d0e076916a0a 80
okini3939 0:d0e076916a0a 81 void RingBuffer::clear () {
okini3939 0:d0e076916a0a 82 addr_w = 0;
okini3939 0:d0e076916a0a 83 addr_r = 0;
okini3939 0:d0e076916a0a 84 }