/* microkernel/pipe.h */

/*
 * Copyright (c) 1997-2014 Wind River Systems, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef PIPE_H
#define PIPE_H

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Microkernel Pipes
 * @defgroup microkernel_pipe Microkernel Pipes
 * @ingroup microkernel_services
 * @{
 */

#include <sections.h>

/**
 * @cond internal
 */
extern int _task_pipe_put(kpipe_t id,
			void *pBuffer,
			int iNbrBytesToWrite,
			int *piNbrBytesWritten,
			K_PIPE_OPTION Option,
			int32_t TimeOut);

/**
 * @internal
 * @brief Initialize a pipe struct.
 *
 * @param size Size of pipe buffer.
 * @param buffer Pointer to the buffer.
 * @endinternal
 */
#define __K_PIPE_INITIALIZER(size, buffer) \
	{ \
	  .buffer_size = size, \
	  .Buffer = buffer, \
	}

/**
 * @endcond
 */

/**
 * @brief Pipe write request
 *
 * Attempt to write data from a memory buffer area to the specified pipe.
 * Fail immediately if it is not possible.
 *
 * @param i Pipe ID
 * @param b Buffer
 * @param n Number of bytes to write
 * @param pn Pointer to number of bytes written
 * @param o Pipe options
 *
 * @return RC_OK, RC_INCOMPLETE, RC_FAIL, or RC_ALIGNMENT
 */
#define task_pipe_put(i, b, n, pn, o) \
			_task_pipe_put(i, b, n, pn, o, TICKS_NONE)

/**
 * @brief Pipe write request with unlimited wait
 *
 * Attempt to write data from a memory buffer area to the
 * specified pipe and wait forever until it succeeds.
 *
 * @param i Pipe ID
 * @param b Buffer
 * @param n Number of bytes to write
 * @param pn Pointer to number of bytes written
 * @param o Pipe options
 *
 * @return RC_OK, RC_INCOMPLETE or RC_ALIGNMENT
 */
#define task_pipe_put_wait(i, b, n, pn, o) \
			_task_pipe_put(i, b, n, pn, o, TICKS_UNLIMITED)

/**
 * @brief Pipe write request with timeout
 *
 * Attemp to write data from a memory buffer area to the
 * specified pipe with a timeout option.
 *
 * @param id Pipe ID
 * @param b Buffer
 * @param n Number of bytes to write
 * @param pn Pointer to number of bytes written
 * @param o Pipe options
 * @param t Timeout
 *
 * @return RC_OK, RC_INCOMPLETE, RC_FAIL, RC_TIME, or RC_ALIGNMENT
 */
#define task_pipe_put_wait_timeout(id, b, n, pn, o, t) \
			_task_pipe_put(id, b, n, pn, o, t)


extern int _task_pipe_get(kpipe_t id,
			void *pBuffer,
			int iNbrBytesToRead,
			int *piNbrBytesRead,
			K_PIPE_OPTION Option,
			int32_t TimeOut);

/**
 * @brief Pipe read request
 *
 * Attempt to read data into a memory buffer area from the
 * specified pipe and fail immediately if not possible.
 *
 * @param id Pipe ID
 * @param b Buffer
 * @param n Number of bytes to read
 * @param pn Pointer to number of bytes read
 * @param o Pipe options
 *
 * @return RC_OK, RC_INCOMPLETE, RC_FAIL, or RC_ALIGNMENT
 */
#define task_pipe_get(id, b, n, pn, o) \
			_task_pipe_get(id, b, n, pn, o, TICKS_NONE)
/**
 * @brief Pipe read request and wait
 *
 * Attempt to read data into a memory buffer area from the
 * specified pipe and wait forever until it succeeds.
 *
 * @param id Pipe ID
 * @param b Buffer
 * @param n Number of bytes to read
 * @param pn Pointer to number of bytes read
 * @param o Pipe options
 *
 * @return RC_OK, RC_INCOMPLETE, or RC_ALIGNMENT
 */
#define task_pipe_get_wait(id, b, n, pn, o) \
			_task_pipe_get(id, b, n, pn, o, TICKS_UNLIMITED)
/**
 * @brief Pipe read request
 *
 * This routine attempts to read data into a memory buffer area from the
 * specified pipe, with a possible timeout option.
 *
 * @param id Pipe ID
 * @param b Buffer
 * @param n Number of bytes to read
 * @param pn Pointer to number of bytes read
 * @param o Pipe options
 * @param t Timeout
 *
 * @return RC_OK, RC_INCOMPLETE, RC_FAIL, RC_TIME, or RC_ALIGNMENT
 */
#define task_pipe_get_wait_timeout(id, b, n, pn, o, t) \
			_task_pipe_get(id, b, n, pn, o, t)


extern int _task_pipe_block_put(kpipe_t id,
				struct k_block block,
				int size,
				ksem_t sema);

/**
 * @brief Asynchronous pipe write request
 *
 * This routine attempts to write data from a memory pool block to the
 * specified pipe. (Note that partial transfers and timeouts are not
 * supported, unlike the case for synchronous write requests.)
 *
 * @param id pipe ID
 * @param block Block
 * @param size Size of data to be transferred
 * @param sema Semphore ID
 *
 * @return RC_OK, RC_FAIL, or RC_ALIGNMENT
 */
#define task_pipe_block_put(id, block, size, sema) \
			_task_pipe_block_put(id, block, size, sema)


/**
 * @brief Define a private microkernel pipe.
 *
 * @param name Name of the pipe.
 * @param size Size of the pipe buffer, in bytes.
 */
#define DEFINE_PIPE(name, size) \
	char __noinit __pipe_buffer_##name[size]; \
	struct _k_pipe_struct _k_pipe_obj_##name = \
		__K_PIPE_INITIALIZER(size, __pipe_buffer_##name); \
	const kpipe_t name \
		__section(_k_pipe_ptr, private, pipe) = \
		(kpipe_t)&_k_pipe_obj_##name;

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* PIPE_H */
