Dependencies:   EthernetNetIf NetServices mbed HTTPServer

Committer:
etudiant12
Date:
Mon May 23 05:40:11 2011 +0000
Revision:
0:96cf274f19bc

        

Who changed what in which revision?

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