ChibiOS/RT Architecture - Reference Manual - Guides |
00001 /* 00002 ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio. 00003 00004 This file is part of ChibiOS/RT. 00005 00006 ChibiOS/RT is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 3 of the License, or 00009 (at your option) any later version. 00010 00011 ChibiOS/RT is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program. If not, see <http://www.gnu.org/licenses/>. 00018 00019 --- 00020 00021 A special exception to the GPL can be applied should you wish to distribute 00022 a combined work that includes ChibiOS/RT, without being obliged to provide 00023 the source code for any proprietary components. See the file exception.txt 00024 for full details of how and when the exception can be applied. 00025 */ 00026 00027 /** 00028 * @file chstreams.h 00029 * @brief Data streams. 00030 * @details This header defines abstract interfaces useful to access generic 00031 * data streams in a standardized way. 00032 * 00033 * @addtogroup data_streams 00034 * @details This module define an abstract interface for generic data streams. 00035 * Note that no code is present, streams are just abstract interfaces 00036 * like structures, you should look at the systems as to a set of 00037 * abstract C++ classes (even if written in C). This system has the 00038 * advantage to make the access to streams independent from the 00039 * implementation logic.<br> 00040 * The stream interface can be used as base class for high level 00041 * object types such as files, sockets, serial ports, pipes etc. 00042 * @{ 00043 */ 00044 00045 #ifndef _CHSTREAMS_H_ 00046 #define _CHSTREAMS_H_ 00047 00048 /** 00049 * @brief BaseSequentialStream specific methods. 00050 */ 00051 #define _base_sequental_stream_methods \ 00052 /* Stream write buffer method.*/ \ 00053 size_t (*write)(void *instance, const uint8_t *bp, size_t n); \ 00054 /* Stream read buffer method.*/ \ 00055 size_t (*read)(void *instance, uint8_t *bp, size_t n); 00056 00057 /** 00058 * @brief @p BaseSequentialStream specific data. 00059 * @note It is empty because @p BaseSequentialStream is only an interface 00060 * without implementation. 00061 */ 00062 #define _base_sequental_stream_data 00063 00064 /** 00065 * @brief @p BaseSequentialStream virtual methods table. 00066 */ 00067 struct BaseSequentialStreamVMT { 00068 _base_sequental_stream_methods 00069 }; 00070 00071 /** 00072 * @brief Base stream class. 00073 * @details This class represents a generic blocking unbuffered sequential 00074 * data stream. 00075 */ 00076 typedef struct { 00077 /** @brief Virtual Methods Table.*/ 00078 const struct BaseSequentialStreamVMT *vmt; 00079 _base_sequental_stream_data 00080 } BaseSequentialStream; 00081 00082 /** 00083 * @brief Sequential Stream write. 00084 * @details The function writes data from a buffer to a stream. 00085 * 00086 * @param[in] ip pointer to a @p BaseSequentialStream or derived class 00087 * @param[in] bp pointer to the data buffer 00088 * @param[in] n the maximum amount of data to be transferred 00089 * @return The number of bytes transferred. The return value can 00090 * be less than the specified number of bytes if the 00091 * stream reaches a physical end of file and cannot be 00092 * extended. 00093 */ 00094 #define chSequentialStreamWrite(ip, bp, n) ((ip)->vmt->write(ip, bp, n)) 00095 00096 /** 00097 * @brief Sequential Stream read. 00098 * @details The function reads data from a stream into a buffer. 00099 * 00100 * @param[in] ip pointer to a @p BaseSequentialStream or derived class 00101 * @param[out] bp pointer to the data buffer 00102 * @param[in] n the maximum amount of data to be transferred 00103 * @return The number of bytes transferred. The return value can 00104 * be less than the specified number of bytes if the 00105 * stream reaches the end of the available data. 00106 */ 00107 #define chSequentialStreamRead(ip, bp, n) ((ip)->vmt->read(ip, bp, n)) 00108 00109 #endif /* _CHSTREAMS_H_ */ 00110 00111 /** @} */