Program to control an accelerometer, motors and a rangefinder using the ScmRTOS ported to mbed. (Work in progress and buggy)

Dependencies:   mbed

Committer:
jberry
Date:
Mon Nov 01 20:39:01 2010 +0000
Revision:
0:9b057566f9ee

        

Who changed what in which revision?

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