Dependencies:   keypad SDHCFileSystem TextLCD mbed FPointer wave_player

Committer:
daryl2110
Date:
Mon Feb 20 07:32:56 2012 +0000
Revision:
0:57ece500234e

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daryl2110 0:57ece500234e 1 //******************************************************************************
daryl2110 0:57ece500234e 2 //*
daryl2110 0:57ece500234e 3 //* FULLNAME: Single-Chip Microcontroller Real-Time Operating System
daryl2110 0:57ece500234e 4 //*
daryl2110 0:57ece500234e 5 //* NICKNAME: scmRTOS
daryl2110 0:57ece500234e 6 //*
daryl2110 0:57ece500234e 7 //* PURPOSE: User Suport Library Header
daryl2110 0:57ece500234e 8 //*
daryl2110 0:57ece500234e 9 //* Version: 3.10
daryl2110 0:57ece500234e 10 //*
daryl2110 0:57ece500234e 11 //* $Revision: 256 $
daryl2110 0:57ece500234e 12 //* $Date:: 2010-01-22 #$
daryl2110 0:57ece500234e 13 //*
daryl2110 0:57ece500234e 14 //* Copyright (c) 2003-2010, Harry E. Zhurov
daryl2110 0:57ece500234e 15 //*
daryl2110 0:57ece500234e 16 //* Permission is hereby granted, free of charge, to any person
daryl2110 0:57ece500234e 17 //* obtaining a copy of this software and associated documentation
daryl2110 0:57ece500234e 18 //* files (the "Software"), to deal in the Software without restriction,
daryl2110 0:57ece500234e 19 //* including without limitation the rights to use, copy, modify, merge,
daryl2110 0:57ece500234e 20 //* publish, distribute, sublicense, and/or sell copies of the Software,
daryl2110 0:57ece500234e 21 //* and to permit persons to whom the Software is furnished to do so,
daryl2110 0:57ece500234e 22 //* subject to the following conditions:
daryl2110 0:57ece500234e 23 //*
daryl2110 0:57ece500234e 24 //* The above copyright notice and this permission notice shall be included
daryl2110 0:57ece500234e 25 //* in all copies or substantial portions of the Software.
daryl2110 0:57ece500234e 26 //*
daryl2110 0:57ece500234e 27 //* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
daryl2110 0:57ece500234e 28 //* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
daryl2110 0:57ece500234e 29 //* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
daryl2110 0:57ece500234e 30 //* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
daryl2110 0:57ece500234e 31 //* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
daryl2110 0:57ece500234e 32 //* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
daryl2110 0:57ece500234e 33 //* THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
daryl2110 0:57ece500234e 34 //*
daryl2110 0:57ece500234e 35 //* =================================================================
daryl2110 0:57ece500234e 36 //* See http://scmrtos.sourceforge.net for documentation, latest
daryl2110 0:57ece500234e 37 //* information, license and contact details.
daryl2110 0:57ece500234e 38 //* =================================================================
daryl2110 0:57ece500234e 39 //*
daryl2110 0:57ece500234e 40 //******************************************************************************
daryl2110 0:57ece500234e 41
daryl2110 0:57ece500234e 42 #ifndef USRLIB_H
daryl2110 0:57ece500234e 43 #define USRLIB_H
daryl2110 0:57ece500234e 44
daryl2110 0:57ece500234e 45 #include <commdefs.h>
daryl2110 0:57ece500234e 46
daryl2110 0:57ece500234e 47 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 48 //
daryl2110 0:57ece500234e 49 // DESCRIPTON: user namespace for some useful types and functions
daryl2110 0:57ece500234e 50 //
daryl2110 0:57ece500234e 51 //
daryl2110 0:57ece500234e 52 namespace usr
daryl2110 0:57ece500234e 53 {
daryl2110 0:57ece500234e 54 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 55 //
daryl2110 0:57ece500234e 56 /// The Circular Buffer
daryl2110 0:57ece500234e 57 //
daryl2110 0:57ece500234e 58 /// Byte-wide FIFO.
daryl2110 0:57ece500234e 59 //
daryl2110 0:57ece500234e 60 /// Allows to:
daryl2110 0:57ece500234e 61 /// add byte,
daryl2110 0:57ece500234e 62 /// get byte,
daryl2110 0:57ece500234e 63 /// write bytes from array,
daryl2110 0:57ece500234e 64 /// read bytes to array,
daryl2110 0:57ece500234e 65 /// and some other service actions.
daryl2110 0:57ece500234e 66 //
daryl2110 0:57ece500234e 67 class TCbuf
daryl2110 0:57ece500234e 68 {
daryl2110 0:57ece500234e 69 public:
daryl2110 0:57ece500234e 70 TCbuf(byte* const Address, const byte Size);
daryl2110 0:57ece500234e 71 bool write(const byte* data, const byte Count);
daryl2110 0:57ece500234e 72 void read(byte* const data, const byte Count);
daryl2110 0:57ece500234e 73 byte get_count() const { return count; }
daryl2110 0:57ece500234e 74 byte get_free_size() const { return size - count; }
daryl2110 0:57ece500234e 75 byte get_byte(const byte index) const;
daryl2110 0:57ece500234e 76 void clear() { count = 0; last = first; }
daryl2110 0:57ece500234e 77 bool put(const byte item);
daryl2110 0:57ece500234e 78 byte get();
daryl2110 0:57ece500234e 79
daryl2110 0:57ece500234e 80 private:
daryl2110 0:57ece500234e 81 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 82 //
daryl2110 0:57ece500234e 83 // DESCRIPTON: For internal purposes
daryl2110 0:57ece500234e 84 //
daryl2110 0:57ece500234e 85 void push(const byte item); ///< Use this function with care - it doesn't perform free size check
daryl2110 0:57ece500234e 86 byte pop(); ///< Use this function with care - it doesn't perform count check
daryl2110 0:57ece500234e 87 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 88
daryl2110 0:57ece500234e 89 private:
daryl2110 0:57ece500234e 90 byte* buf;
daryl2110 0:57ece500234e 91 byte size;
daryl2110 0:57ece500234e 92 volatile byte count;
daryl2110 0:57ece500234e 93 byte first;
daryl2110 0:57ece500234e 94 byte last;
daryl2110 0:57ece500234e 95 };
daryl2110 0:57ece500234e 96 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 97
daryl2110 0:57ece500234e 98
daryl2110 0:57ece500234e 99
daryl2110 0:57ece500234e 100 //-----------------------------------------------------------------------
daryl2110 0:57ece500234e 101 //
daryl2110 0:57ece500234e 102 /// The Ring Buffer Template
daryl2110 0:57ece500234e 103 ///
daryl2110 0:57ece500234e 104 /// Carries out FIFO functionality for
daryl2110 0:57ece500234e 105 /// arbitrary data types
daryl2110 0:57ece500234e 106 ///
daryl2110 0:57ece500234e 107 /// Allows to:
daryl2110 0:57ece500234e 108 /// add item to back (default),
daryl2110 0:57ece500234e 109 /// add item to front,
daryl2110 0:57ece500234e 110 /// get item at front (default),
daryl2110 0:57ece500234e 111 /// get item from back,
daryl2110 0:57ece500234e 112 /// write items from array,
daryl2110 0:57ece500234e 113 /// read items to array and some other actions
daryl2110 0:57ece500234e 114 //
daryl2110 0:57ece500234e 115 //
daryl2110 0:57ece500234e 116 //
daryl2110 0:57ece500234e 117 template<typename T, word Size, typename S = byte>
daryl2110 0:57ece500234e 118 class ring_buffer
daryl2110 0:57ece500234e 119 {
daryl2110 0:57ece500234e 120 public:
daryl2110 0:57ece500234e 121 ring_buffer() : Count(0), First(0), Last(0) { }
daryl2110 0:57ece500234e 122
daryl2110 0:57ece500234e 123 //----------------------------------------------------------------
daryl2110 0:57ece500234e 124 //
daryl2110 0:57ece500234e 125 // Data transfer functions
daryl2110 0:57ece500234e 126 //
daryl2110 0:57ece500234e 127 bool write(const T* data, const S cnt);
daryl2110 0:57ece500234e 128 void read(T* const data, const S cnt);
daryl2110 0:57ece500234e 129
daryl2110 0:57ece500234e 130 bool push_back(const T item);
daryl2110 0:57ece500234e 131 bool push_front(const T item);
daryl2110 0:57ece500234e 132
daryl2110 0:57ece500234e 133 T pop_front();
daryl2110 0:57ece500234e 134 T pop_back();
daryl2110 0:57ece500234e 135
daryl2110 0:57ece500234e 136 bool push(const T item) { return push_back(item); }
daryl2110 0:57ece500234e 137 T pop() { return pop_front(); }
daryl2110 0:57ece500234e 138
daryl2110 0:57ece500234e 139 //----------------------------------------------------------------
daryl2110 0:57ece500234e 140 //
daryl2110 0:57ece500234e 141 // Service functions
daryl2110 0:57ece500234e 142 //
daryl2110 0:57ece500234e 143 S get_count() const { return Count; }
daryl2110 0:57ece500234e 144 S get_free_size() const { return Size - Count; }
daryl2110 0:57ece500234e 145 T& operator[](const S index);
daryl2110 0:57ece500234e 146 void flush() { Count = 0; Last = First; }
daryl2110 0:57ece500234e 147
daryl2110 0:57ece500234e 148 private:
daryl2110 0:57ece500234e 149 //--------------------------------------------------------------
daryl2110 0:57ece500234e 150 // DESCRIPTON: For internal purposes
daryl2110 0:57ece500234e 151 // Use this functions with care: it don't perform
daryl2110 0:57ece500234e 152 // free size and count check
daryl2110 0:57ece500234e 153 //
daryl2110 0:57ece500234e 154 void push_item(const T item);
daryl2110 0:57ece500234e 155 void push_item_front(const T item);
daryl2110 0:57ece500234e 156 T pop_item();
daryl2110 0:57ece500234e 157 T pop_item_back();
daryl2110 0:57ece500234e 158 //--------------------------------------------------------------
daryl2110 0:57ece500234e 159
daryl2110 0:57ece500234e 160 private:
daryl2110 0:57ece500234e 161 S Count;
daryl2110 0:57ece500234e 162 S First;
daryl2110 0:57ece500234e 163 S Last;
daryl2110 0:57ece500234e 164 T Buf[Size];
daryl2110 0:57ece500234e 165 };
daryl2110 0:57ece500234e 166 //------------------------------------------------------------------
daryl2110 0:57ece500234e 167 }
daryl2110 0:57ece500234e 168 //---------------------------------------------------------------------------
daryl2110 0:57ece500234e 169
daryl2110 0:57ece500234e 170
daryl2110 0:57ece500234e 171 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 172 //
daryl2110 0:57ece500234e 173 // The ring buffer function-member definitions
daryl2110 0:57ece500234e 174 //
daryl2110 0:57ece500234e 175 //
daryl2110 0:57ece500234e 176 //
daryl2110 0:57ece500234e 177 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 178 bool usr::ring_buffer<T, Size, S>::write(const T* data, const S cnt)
daryl2110 0:57ece500234e 179 {
daryl2110 0:57ece500234e 180 if( cnt > (Size - Count) )
daryl2110 0:57ece500234e 181 return false;
daryl2110 0:57ece500234e 182
daryl2110 0:57ece500234e 183 for(S i = 0; i < cnt; i++)
daryl2110 0:57ece500234e 184 push_item(*(data++));
daryl2110 0:57ece500234e 185
daryl2110 0:57ece500234e 186 return true;
daryl2110 0:57ece500234e 187 }
daryl2110 0:57ece500234e 188 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 189 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 190 void usr::ring_buffer<T, Size, S>::read(T* data, const S cnt)
daryl2110 0:57ece500234e 191 {
daryl2110 0:57ece500234e 192 S nItems = cnt <= Count ? cnt : Count;
daryl2110 0:57ece500234e 193
daryl2110 0:57ece500234e 194 for(S i = 0; i < nItems; i++)
daryl2110 0:57ece500234e 195 data[i] = pop_item();
daryl2110 0:57ece500234e 196 }
daryl2110 0:57ece500234e 197 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 198 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 199 T& usr::ring_buffer<T, Size, S>::operator[](const S index)
daryl2110 0:57ece500234e 200 {
daryl2110 0:57ece500234e 201 S x = First + index;
daryl2110 0:57ece500234e 202
daryl2110 0:57ece500234e 203 if(x < Size)
daryl2110 0:57ece500234e 204 return Buf[x];
daryl2110 0:57ece500234e 205 else
daryl2110 0:57ece500234e 206 return Buf[x - Size];
daryl2110 0:57ece500234e 207 }
daryl2110 0:57ece500234e 208
daryl2110 0:57ece500234e 209 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 210 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 211 bool usr::ring_buffer<T, Size, S>::push_back(const T item)
daryl2110 0:57ece500234e 212 {
daryl2110 0:57ece500234e 213 if(Count == Size)
daryl2110 0:57ece500234e 214 return false;
daryl2110 0:57ece500234e 215
daryl2110 0:57ece500234e 216 push_item(item);
daryl2110 0:57ece500234e 217 return true;
daryl2110 0:57ece500234e 218 }
daryl2110 0:57ece500234e 219 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 220 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 221 bool usr::ring_buffer<T, Size, S>::push_front(const T item)
daryl2110 0:57ece500234e 222 {
daryl2110 0:57ece500234e 223 if(Count == Size)
daryl2110 0:57ece500234e 224 return false;
daryl2110 0:57ece500234e 225
daryl2110 0:57ece500234e 226 push_item_front(item);
daryl2110 0:57ece500234e 227 return true;
daryl2110 0:57ece500234e 228 }
daryl2110 0:57ece500234e 229 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 230 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 231 T usr::ring_buffer<T, Size, S>::pop_front()
daryl2110 0:57ece500234e 232 {
daryl2110 0:57ece500234e 233 if(Count)
daryl2110 0:57ece500234e 234 return pop_item();
daryl2110 0:57ece500234e 235 else
daryl2110 0:57ece500234e 236 return Buf[First];
daryl2110 0:57ece500234e 237 }
daryl2110 0:57ece500234e 238 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 239 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 240 T usr::ring_buffer<T, Size, S>::pop_back()
daryl2110 0:57ece500234e 241 {
daryl2110 0:57ece500234e 242 if(Count)
daryl2110 0:57ece500234e 243 return pop_item_back();
daryl2110 0:57ece500234e 244 else
daryl2110 0:57ece500234e 245 return Buf[First];
daryl2110 0:57ece500234e 246 }
daryl2110 0:57ece500234e 247 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 248 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 249 void usr::ring_buffer<T, Size, S>::push_item(const T item)
daryl2110 0:57ece500234e 250 {
daryl2110 0:57ece500234e 251 Buf[Last] = item;
daryl2110 0:57ece500234e 252 Last++;
daryl2110 0:57ece500234e 253 Count++;
daryl2110 0:57ece500234e 254
daryl2110 0:57ece500234e 255 if(Last == Size)
daryl2110 0:57ece500234e 256 Last = 0;
daryl2110 0:57ece500234e 257 }
daryl2110 0:57ece500234e 258 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 259 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 260 void usr::ring_buffer<T, Size, S>::push_item_front(const T item)
daryl2110 0:57ece500234e 261 {
daryl2110 0:57ece500234e 262 if(First == 0)
daryl2110 0:57ece500234e 263 First = Size - 1;
daryl2110 0:57ece500234e 264 else
daryl2110 0:57ece500234e 265 --First;
daryl2110 0:57ece500234e 266 Buf[First] = item;
daryl2110 0:57ece500234e 267 Count++;
daryl2110 0:57ece500234e 268 }
daryl2110 0:57ece500234e 269 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 270 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 271 T usr::ring_buffer<T, Size, S>::pop_item()
daryl2110 0:57ece500234e 272 {
daryl2110 0:57ece500234e 273 T item = Buf[First];
daryl2110 0:57ece500234e 274
daryl2110 0:57ece500234e 275 Count--;
daryl2110 0:57ece500234e 276 First++;
daryl2110 0:57ece500234e 277 if(First == Size)
daryl2110 0:57ece500234e 278 First = 0;
daryl2110 0:57ece500234e 279
daryl2110 0:57ece500234e 280 return item;
daryl2110 0:57ece500234e 281 }
daryl2110 0:57ece500234e 282 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 283 template<typename T, word Size, typename S>
daryl2110 0:57ece500234e 284 T usr::ring_buffer<T, Size, S>::pop_item_back()
daryl2110 0:57ece500234e 285 {
daryl2110 0:57ece500234e 286
daryl2110 0:57ece500234e 287 if(Last == 0)
daryl2110 0:57ece500234e 288 Last = Size - 1;
daryl2110 0:57ece500234e 289 else
daryl2110 0:57ece500234e 290 --Last;
daryl2110 0:57ece500234e 291
daryl2110 0:57ece500234e 292 Count--;
daryl2110 0:57ece500234e 293 return Buf[Last];;
daryl2110 0:57ece500234e 294 }
daryl2110 0:57ece500234e 295 //------------------------------------------------------------------------------
daryl2110 0:57ece500234e 296
daryl2110 0:57ece500234e 297
daryl2110 0:57ece500234e 298 #endif // USRLIB_H