OLD

OLD

Committer:
gsfan
Date:
Thu Nov 08 01:35:37 2012 +0000
Revision:
21:1270827d431a
Parent:
0:2f6062c6d018
fix

Who changed what in which revision?

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