ring buffer
Diff: rbuf.h
- Revision:
- 0:eae8cffdd121
- Child:
- 1:cebd379d1139
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rbuf.h Thu Jun 23 19:44:23 2011 +0000 @@ -0,0 +1,131 @@ +#ifndef __ringbuffer_h_ + #define __ringbuffer_h_ + +#include "can.h" + +#define NOT_EMPTY 0x01 // Bit fuer mindestens 1 Frame im Buffer +#define FAST_VOLL 0x02 // Bit fuer Fuellstandsschwelle ueberschritten +#define FEHLER 0x04 // Bit fuer Fehler aufgetreten + +typedef struct + { + uint16_t buflen; // Max. Objektanzahl fuer den Buffer + uint16_t bufcnt; // Bufferfuellstand in Objekten + void * in; // Zeiger auf char zum Schreiben (Schreibzeiger) + void * out; // Zeiger auf char zum Lesen (Lesezeiger) + void * buf; // Zeiger auf char[LEN]-Buffer (Buffer an sich) + uint32_t anzahl; // Anzahl aller geschriebenen Elemente (Absolutanzahl Elementz�hler) + uint32_t fehleranzahl; // Anzahl aufgetretener Fehler + uint16_t Schwelle; // Schwelle fuer "fast voll" + uint16_t flags; // Status-Flags + uint16_t peak_max; // Schleppzeiger ueber den max. Fuellstand an Elementen + uint16_t blockgroesse; // Groesse eines Datenobjekts (1 Byte bis Frames) = Objektgroesse + } buffer_header_t; // + +typedef struct + { + buffer_header_t in; + buffer_header_t out; + } io_buf_s; +/** + +typedef struct + { + uint16_t buflen; // Max. Objektanzahl fuer den Buffer + uint16_t bufcnt; // Bufferfuellstand in Objekten + void * in; // Zeiger auf char zum Schreiben (Schreibzeiger) + void * out; // Zeiger auf char zum Lesen (Lesezeiger) + void * buf; // Zeiger auf char[LEN]-Buffer (Buffer an sich) + uint32_t anzahl; // Anzahl aller geschriebenen Elemente (Absolutanzahl Elementz�hler) + uint32_t fehleranzahl; // Anzahl aufgetretener Fehler + uint16_t Schwelle; // Schwelle fuer "fast voll" + uint16_t flags; // Status-Flags + uint16_t peak_max; // Schleppzeiger ueber den max. Fuellstand an Elementen + uint16_t blockgroesse; // Groesse eines Datenobjekts (1 Byte bis Frames) = Objektgroesse + } buffer_header_t; // + +typedef struct + { + buffer_header_t in; + buffer_header_t out; + } io_buf_s; + + +*/ + +#define rbuf_t buffer_header_t + +#define rbuffer_init charbuffer_init +#define rbuffer_get charbuffer_get +#define rbuffer_put charbuffer_put +#define rbuffer_look charbuffer_look + +#define rbuf_init charbuffer_init +#define rbuf_get charbuffer_get +#define rbuf_put charbuffer_put +#define rbuf_look charbuffer_look +#define rbuf_print_header print_verwaltung + +#define charbuffer_lock charbuffer_readable + + // create und init von einer doppelten Bufferstruktur, also einen I/O-Buffer +io_buf_s *create_charbuffer_io (uint16_t r_size, uint16_t s_size, uint16_t r_schwelle, uint16_t s_schwelle, uint16_t blockgroesse); + + // create und init einen einzigen Ring-Buffer +buffer_header_t *charbuffer_init (uint16_t b_size, uint16_t b_schwelle, uint16_t blockgroesse); + +void *charbuffer_readable (buffer_header_t *r); // Nur nachschauen, ob ein Frame da ist +void *charbuffer_get (buffer_header_t *r, void *target); // Einen char/Block rausholen mit Readzeiger++ +char *charbuffer_put (buffer_header_t *r, void *f); // Einen Frame in den Buffer tun mit anzahl++ + +void charbuffer_copy (void *quelle, void *ziel, uint16_t size); // Quelle -> Ziel kopieren +void charbuffer_move (void *quelle, void *ziel, uint16_t size); // Quelle -> Ziel (Move mit anschliessendem loeschen der Quelle) + +void print_verwaltung (buffer_header_t *rbk_p); +void display_rbuffer_header (io_buf_s *rb); + + +/* + * Copyright (c) 2002, 2003 Brian S. Dean <bsd@bsdhome.com> + * All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BRIAN S. DEAN ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BRIAN S. DEAN BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * + * 20060206 Kschwi: Type change of return parameter from uint8_t to unit16_t + * 20060319 Kschwi: ringbuffer_read added (read without remove) + * 20070423 Kschwi: ringbuffer becomes voltile + * 20070508 est2fe: adjusted to CAN frames + * Alles sind nur Zeiger auf CANframe-Buffer + * Wenn es geklappt hat dann kommt ein Zeiger <> 0 zurueck + * Hat es nicht geklappt, dann kommt ein Null-Pointer zurueck! + * Es wird davon ausgegangen, dass im ringbuffer + * nicht mehr als 255 Frames Platz haben -> len + cnt als uint_t. + * 20110609 est2fe: Umgebaut auf character ringbuffer + * + * + */ + + +#endif