SFBByteBuffer.h

Go to the documentation of this file.
00001 /*                                       -*- mode:C++; fill-column: 100 -*-
00002 
00003   SFBByteBuffer.h - Circular byte buffering between the UART interrupt and the 
00004                     background packet dispatching levels
00005   Copyright (C) 2009 The Regents of the University of New Mexico.  All rights reserved.
00006 
00007   This library is free software; you can redistribute it and/or
00008   modify it under the terms of the GNU Lesser General Public
00009   License as published by the Free Software Foundation; either
00010   version 2.1 of the License, or (at your option) any later version.
00011 
00012   This library is distributed in the hope that it will be useful,
00013   but WITHOUT ANY WARRANTY; without even the implied warranty of
00014   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015   Lesser General Public License for more details.
00016 
00017   You should have received a copy of the GNU General Public License
00018   along with this library; if not, write to the Free Software
00019   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
00020   USA
00021 
00022   $Id$
00023 */
00024 
00051 #ifndef SFBBYTEBUFFER_H
00052 #define SFBBYTEBUFFER_H
00053 
00054 #include "SFBTypes.h"       /* For u8 etc */
00055 #include "SFBConstants.h"   /* For BYTE_BUFFER_BYTES */
00056 
00061 class SFBByteBuffer {
00062 
00063 protected:
00064   u8 (&buf)[BYTE_BUFFER_BYTES];
00065   u16 oldIndex;
00066   u16 newIndex;
00067 
00068 
00069   SFBByteBuffer(u8 (&buffer)[BYTE_BUFFER_BYTES]) 
00070     : buf(buffer),
00071       oldIndex(0),
00072       newIndex(0)
00073   { }
00074 
00075   u16 spaceAvailable() {
00076     return ((BYTE_BUFFER_BYTES-1)-(newIndex-oldIndex))&BYTE_BUFFER_MASK;
00077   }
00078 
00079   u16 bytesAvailable() {
00080     return (newIndex-oldIndex)&BYTE_BUFFER_MASK;
00081   }
00082 
00083   u16 wrap(u16 index) {
00084     return index&BYTE_BUFFER_MASK;
00085   }
00086   void uncheckedStoreByte(u8 data) {
00087     buf[newIndex] = data;
00088     newIndex = wrap(newIndex+1);
00089   }
00090   u8 uncheckedFetchByte() {
00091     u8 val = buf[oldIndex];
00092     oldIndex = wrap(oldIndex+1);
00093     return val;
00094   }
00095 
00096   enum {
00097     BB_ESC = 0xA5,
00098     BB_EESC = 0x00       // BB_ESC+BB_EESC -> single BB_ESC datum
00099                          // BB_ESC+anything else -> overflow and/or hw error occurred, anything else==flags
00100   };
00101 
00102 };
00103 
00114 class SFBRxByteBuffer : public SFBByteBuffer {
00115 public:
00116 
00117   enum {
00118     BBFLAG_ERRORBITS= PK_OVERRUN|PK_PARITY|PK_FRAMING|PK_BREAK, 
00119     BBFLAG_OVERFLOW=  PK_BUFFER, 
00120     BBFLAG_ZERO=      PK_DELETED|PK_BAD_ESCAPE  
00121   };
00122 
00123   SFBRxByteBuffer(u8 (&buffer)[BYTE_BUFFER_BYTES]) : SFBByteBuffer(buffer), flags(0) { }
00124 
00128   void resetBG() ;
00129 
00133   int fetchByteBG() ;
00134 
00138   void storeErrorStatusIL(u8 status) {
00139     flags |= status;            // Just add in the bits, will be flushed in storeByteIL
00140   }
00141 
00145   void storeByteIL(u8 data) ;
00146 
00147 private:
00148   u8 flags;
00149 
00150 };
00151 
00162 class SFBTxByteBuffer : public SFBByteBuffer {
00163 public:
00164   SFBTxByteBuffer(u8 (&buffer)[BYTE_BUFFER_BYTES]) : SFBByteBuffer(buffer), pendingCount(0) { }
00165 
00169   void resetBG() ;
00170 
00175   void storeByteBG(u8 data) ;
00176 
00181   bool canStoreBytesBG(u32 count) ;
00182 
00192   bool shipBytesBG() ;
00193 
00194 
00199   int fetchByteIL() ;
00200 
00201 private:
00202   int pendingCount;
00203 
00204 };
00205 
00206 #endif  /* SFBBYTEBUFFER_H */
00207 

Generated on Thu Sep 17 07:37:51 2009 for SFB by doxygen 1.5.9