For robots and stuff
RingBuffer/RingBuffer.cpp@1:05a48c038381, 2014-12-28 (annotated)
- Committer:
- jjones646
- Date:
- Sun Dec 28 06:28:42 2014 +0000
- Revision:
- 1:05a48c038381
- Parent:
- Wireless/RingBuffer/RingBuffer.cpp@0:c5afea7b9057
updating;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jjones646 | 0:c5afea7b9057 | 1 | /* |
jjones646 | 0:c5afea7b9057 | 2 | * mbed library for RingBuffer |
jjones646 | 0:c5afea7b9057 | 3 | * Copyright (c) 2010 Hiroshi Suga |
jjones646 | 0:c5afea7b9057 | 4 | * Released under the MIT License: http://mbed.org/license/mit |
jjones646 | 0:c5afea7b9057 | 5 | */ |
jjones646 | 0:c5afea7b9057 | 6 | |
jjones646 | 0:c5afea7b9057 | 7 | #include "RingBuffer.h" |
jjones646 | 0:c5afea7b9057 | 8 | |
jjones646 | 0:c5afea7b9057 | 9 | RingBuffer::RingBuffer () |
jjones646 | 0:c5afea7b9057 | 10 | { |
jjones646 | 0:c5afea7b9057 | 11 | init(0); |
jjones646 | 0:c5afea7b9057 | 12 | } |
jjones646 | 0:c5afea7b9057 | 13 | |
jjones646 | 0:c5afea7b9057 | 14 | RingBuffer::RingBuffer (unsigned int p_size) |
jjones646 | 0:c5afea7b9057 | 15 | { |
jjones646 | 0:c5afea7b9057 | 16 | init(p_size); |
jjones646 | 0:c5afea7b9057 | 17 | } |
jjones646 | 0:c5afea7b9057 | 18 | |
jjones646 | 0:c5afea7b9057 | 19 | void RingBuffer::init(unsigned int p_size) |
jjones646 | 0:c5afea7b9057 | 20 | { |
jjones646 | 0:c5afea7b9057 | 21 | size = p_size + 1; |
jjones646 | 0:c5afea7b9057 | 22 | buf = new unsigned char[size]; |
jjones646 | 0:c5afea7b9057 | 23 | addr_w = 0; |
jjones646 | 0:c5afea7b9057 | 24 | addr_r = 0; |
jjones646 | 0:c5afea7b9057 | 25 | } |
jjones646 | 0:c5afea7b9057 | 26 | |
jjones646 | 0:c5afea7b9057 | 27 | int RingBuffer::_putc (int dat) |
jjones646 | 0:c5afea7b9057 | 28 | { |
jjones646 | 0:c5afea7b9057 | 29 | int next = (addr_w + 1) % size; |
jjones646 | 0:c5afea7b9057 | 30 | if (next == addr_r) { |
jjones646 | 0:c5afea7b9057 | 31 | return -1; |
jjones646 | 0:c5afea7b9057 | 32 | } |
jjones646 | 0:c5afea7b9057 | 33 | buf[addr_w] = dat; |
jjones646 | 0:c5afea7b9057 | 34 | addr_w = next; |
jjones646 | 0:c5afea7b9057 | 35 | return dat; |
jjones646 | 0:c5afea7b9057 | 36 | } |
jjones646 | 0:c5afea7b9057 | 37 | |
jjones646 | 0:c5afea7b9057 | 38 | int RingBuffer::put (char *dat, int len) |
jjones646 | 0:c5afea7b9057 | 39 | { |
jjones646 | 0:c5afea7b9057 | 40 | int next, i; |
jjones646 | 0:c5afea7b9057 | 41 | |
jjones646 | 0:c5afea7b9057 | 42 | for (i = 0; i < len; i ++) { |
jjones646 | 0:c5afea7b9057 | 43 | next = (addr_w + 1) % size; |
jjones646 | 0:c5afea7b9057 | 44 | if (next == addr_r) { |
jjones646 | 0:c5afea7b9057 | 45 | break; |
jjones646 | 0:c5afea7b9057 | 46 | } |
jjones646 | 0:c5afea7b9057 | 47 | buf[addr_w] = dat[i]; |
jjones646 | 0:c5afea7b9057 | 48 | addr_w = next; |
jjones646 | 0:c5afea7b9057 | 49 | } |
jjones646 | 0:c5afea7b9057 | 50 | return i; |
jjones646 | 0:c5afea7b9057 | 51 | } |
jjones646 | 0:c5afea7b9057 | 52 | |
jjones646 | 0:c5afea7b9057 | 53 | int RingBuffer::_getc (void) |
jjones646 | 0:c5afea7b9057 | 54 | { |
jjones646 | 0:c5afea7b9057 | 55 | char dat; |
jjones646 | 0:c5afea7b9057 | 56 | if (addr_r == addr_w) { |
jjones646 | 0:c5afea7b9057 | 57 | return 0; |
jjones646 | 0:c5afea7b9057 | 58 | } |
jjones646 | 0:c5afea7b9057 | 59 | dat = buf[addr_r]; |
jjones646 | 0:c5afea7b9057 | 60 | addr_r = (addr_r + 1) % size; |
jjones646 | 0:c5afea7b9057 | 61 | return dat; |
jjones646 | 0:c5afea7b9057 | 62 | } |
jjones646 | 0:c5afea7b9057 | 63 | |
jjones646 | 0:c5afea7b9057 | 64 | int RingBuffer::get (char *dat, int len) |
jjones646 | 0:c5afea7b9057 | 65 | { |
jjones646 | 0:c5afea7b9057 | 66 | int i; |
jjones646 | 0:c5afea7b9057 | 67 | |
jjones646 | 0:c5afea7b9057 | 68 | for (i = 0; i < len; i ++) { |
jjones646 | 0:c5afea7b9057 | 69 | if (addr_r == addr_w) { |
jjones646 | 0:c5afea7b9057 | 70 | break; |
jjones646 | 0:c5afea7b9057 | 71 | } |
jjones646 | 0:c5afea7b9057 | 72 | dat[i] = buf[addr_r]; |
jjones646 | 0:c5afea7b9057 | 73 | addr_r = (addr_r + 1) % size; |
jjones646 | 0:c5afea7b9057 | 74 | } |
jjones646 | 0:c5afea7b9057 | 75 | return i; |
jjones646 | 0:c5afea7b9057 | 76 | } |
jjones646 | 0:c5afea7b9057 | 77 | |
jjones646 | 0:c5afea7b9057 | 78 | int RingBuffer::available () |
jjones646 | 0:c5afea7b9057 | 79 | { |
jjones646 | 0:c5afea7b9057 | 80 | if (addr_w < addr_r) { |
jjones646 | 0:c5afea7b9057 | 81 | return addr_r - addr_w - 1; |
jjones646 | 0:c5afea7b9057 | 82 | } else { |
jjones646 | 0:c5afea7b9057 | 83 | return (size - addr_w) + addr_r - 1; |
jjones646 | 0:c5afea7b9057 | 84 | } |
jjones646 | 0:c5afea7b9057 | 85 | } |
jjones646 | 0:c5afea7b9057 | 86 | |
jjones646 | 0:c5afea7b9057 | 87 | int RingBuffer::use () |
jjones646 | 0:c5afea7b9057 | 88 | { |
jjones646 | 0:c5afea7b9057 | 89 | return size - available() - 1; |
jjones646 | 0:c5afea7b9057 | 90 | } |
jjones646 | 0:c5afea7b9057 | 91 | |
jjones646 | 0:c5afea7b9057 | 92 | void RingBuffer::clear () |
jjones646 | 0:c5afea7b9057 | 93 | { |
jjones646 | 0:c5afea7b9057 | 94 | addr_w = 0; |
jjones646 | 0:c5afea7b9057 | 95 | addr_r = 0; |
jjones646 | 0:c5afea7b9057 | 96 | } |