Toshihisa T
/
S1315FLogger
Skytraq S1315F-RAW-EVK Logger
libT/portable/tringbuffer.h@2:7eb11afe02bd, 2010-12-19 (annotated)
- Committer:
- tosihisa
- Date:
- Sun Dec 19 09:11:48 2010 +0000
- Revision:
- 2:7eb11afe02bd
- Parent:
- 0:e0ec137da369
Add \"SYSTEM RESTART\" at boot time.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tosihisa | 0:e0ec137da369 | 1 | |
tosihisa | 0:e0ec137da369 | 2 | #ifndef __TRINGBUFFER_H |
tosihisa | 0:e0ec137da369 | 3 | #define __TRINGBUFFER_H |
tosihisa | 0:e0ec137da369 | 4 | |
tosihisa | 0:e0ec137da369 | 5 | #include "tversion.h" |
tosihisa | 0:e0ec137da369 | 6 | |
tosihisa | 0:e0ec137da369 | 7 | namespace libT { |
tosihisa | 0:e0ec137da369 | 8 | |
tosihisa | 0:e0ec137da369 | 9 | template <class T> |
tosihisa | 0:e0ec137da369 | 10 | class tRingBuffer : public tVersion |
tosihisa | 0:e0ec137da369 | 11 | { |
tosihisa | 0:e0ec137da369 | 12 | public: |
tosihisa | 0:e0ec137da369 | 13 | |
tosihisa | 0:e0ec137da369 | 14 | tRingBuffer(void) : tVersion(0x20100721/* 2010-07-21 */,0x00000001UL),wp(0),rp(0) {} |
tosihisa | 0:e0ec137da369 | 15 | |
tosihisa | 0:e0ec137da369 | 16 | inline void reset(void){wp = rp = 0;} |
tosihisa | 0:e0ec137da369 | 17 | |
tosihisa | 0:e0ec137da369 | 18 | inline int writable(void) const |
tosihisa | 0:e0ec137da369 | 19 | { |
tosihisa | 0:e0ec137da369 | 20 | return (inc(wp) != rp) ? 1 : 0; |
tosihisa | 0:e0ec137da369 | 21 | } |
tosihisa | 0:e0ec137da369 | 22 | |
tosihisa | 0:e0ec137da369 | 23 | inline int write(T _c) |
tosihisa | 0:e0ec137da369 | 24 | { |
tosihisa | 0:e0ec137da369 | 25 | int retval = -1; /* Ringbuffer FULL */ |
tosihisa | 0:e0ec137da369 | 26 | if(writable()){ |
tosihisa | 0:e0ec137da369 | 27 | array[wp] = _c; |
tosihisa | 0:e0ec137da369 | 28 | wp = inc(wp); |
tosihisa | 0:e0ec137da369 | 29 | retval = 0; /* OK */ |
tosihisa | 0:e0ec137da369 | 30 | } |
tosihisa | 0:e0ec137da369 | 31 | return retval; |
tosihisa | 0:e0ec137da369 | 32 | } |
tosihisa | 0:e0ec137da369 | 33 | |
tosihisa | 0:e0ec137da369 | 34 | inline int readable(void) const |
tosihisa | 0:e0ec137da369 | 35 | { |
tosihisa | 0:e0ec137da369 | 36 | return (rp != wp) ? 1 : 0; |
tosihisa | 0:e0ec137da369 | 37 | } |
tosihisa | 0:e0ec137da369 | 38 | |
tosihisa | 0:e0ec137da369 | 39 | inline int read(T *_c) |
tosihisa | 0:e0ec137da369 | 40 | { |
tosihisa | 0:e0ec137da369 | 41 | int retval = -1; /* Ringbuffer empty or _c is invalid*/ |
tosihisa | 0:e0ec137da369 | 42 | if((readable()) && (_c != 0)){ |
tosihisa | 0:e0ec137da369 | 43 | *_c = array[rp]; |
tosihisa | 0:e0ec137da369 | 44 | rp = inc(rp); |
tosihisa | 0:e0ec137da369 | 45 | retval = 0; /* OK */ |
tosihisa | 0:e0ec137da369 | 46 | } |
tosihisa | 0:e0ec137da369 | 47 | return retval; |
tosihisa | 0:e0ec137da369 | 48 | } |
tosihisa | 0:e0ec137da369 | 49 | |
tosihisa | 0:e0ec137da369 | 50 | private: |
tosihisa | 0:e0ec137da369 | 51 | enum {TRINGBUFFER_SIZE=0x200}; |
tosihisa | 0:e0ec137da369 | 52 | inline unsigned short inc(unsigned short _p) const |
tosihisa | 0:e0ec137da369 | 53 | { |
tosihisa | 0:e0ec137da369 | 54 | return static_cast<unsigned short>(static_cast<unsigned short>(_p + 1) & (sizeof(array)-1)); |
tosihisa | 0:e0ec137da369 | 55 | } |
tosihisa | 0:e0ec137da369 | 56 | volatile unsigned short wp; |
tosihisa | 0:e0ec137da369 | 57 | volatile unsigned short rp; |
tosihisa | 0:e0ec137da369 | 58 | volatile T array[TRINGBUFFER_SIZE]; |
tosihisa | 0:e0ec137da369 | 59 | }; |
tosihisa | 0:e0ec137da369 | 60 | |
tosihisa | 0:e0ec137da369 | 61 | }; |
tosihisa | 0:e0ec137da369 | 62 | |
tosihisa | 0:e0ec137da369 | 63 | #endif /* __TRINGBUFFER_H */ |
tosihisa | 0:e0ec137da369 | 64 |