/* ###################################################################
**     THIS COMPONENT MODULE IS GENERATED BY THE TOOL. DO NOT MODIFY IT.
**     Filename    : Rx1.c
**     Project     : Landungsbruecke_KDS_v2.0.0
**     Processor   : MK20DN512VLL10
**     Component   : RingBuffer
**     Version     : Component 01.025, Driver 01.00, CPU db: 3.00.000
**     Compiler    : GNU C Compiler
**     Date/Time   : 2015-01-09, 16:27, # CodeGen: 0
**     Abstract    :
**         This component implements a ring buffer for different integer data type.
**     Settings    :
**          Component name                                 : Rx1
**          Buffer Size                                    : 1
**     Contents    :
**         Clear           - void Rx1_Clear(void);
**         Put             - byte Rx1_Put(Rx1_ElementType elem);
**         Get             - byte Rx1_Get(Rx1_ElementType *elemP);
**         NofElements     - Rx1_BufSizeType Rx1_NofElements(void);
**         NofFreeElements - Rx1_BufSizeType Rx1_NofFreeElements(void);
**         Init            - void Rx1_Init(void);
**
**     License   :  Open Source (LGPL)
**     Copyright : (c) Copyright Erich Styger, 2014, all rights reserved.
**     Web: http://www.mcuoneclipse.com
**     This an open source software of an embedded component for Processor Expert.
**     This is a free software and is opened for education,  research  and commercial developments under license policy of following terms:
**     * This is a free software and there is NO WARRANTY.
**     * No restriction on use. You can use, modify and redistribute it for personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY.
**     * Redistributions of source code must retain the above copyright notice.
** ###################################################################*/
/*!
** @file Rx1.c
** @version 01.00
** @brief
**         This component implements a ring buffer for different integer data type.
*/
/*!
**  @addtogroup Rx1_module Rx1 module documentation
**  @{
*/

/* MODULE Rx1. */

#include "Rx1.h"

#if Rx1_IS_REENTRANT
  #define Rx1_DEFINE_CRITICAL() CS1_CriticalVariable()
  #define Rx1_ENTER_CRITICAL()  CS1_EnterCritical()
  #define Rx1_EXIT_CRITICAL()   CS1_ExitCritical()
#else
  #define Rx1_DEFINE_CRITICAL() /* nothing */
  #define Rx1_ENTER_CRITICAL()  /* nothing */
  #define Rx1_EXIT_CRITICAL()   /* nothing */
#endif
static Rx1_ElementType Rx1_buffer[Rx1_BUF_SIZE]; /* ring buffer */
static Rx1_BufSizeType Rx1_inIdx;  /* input index */
static Rx1_BufSizeType Rx1_outIdx; /* output index */
static Rx1_BufSizeType Rx1_inSize; /* size data in buffer */
/*
** ===================================================================
**     Method      :  Rx1_Put (component RingBuffer)
**     Description :
**         Puts a new element into the buffer
**     Parameters  :
**         NAME            - DESCRIPTION
**         elem            - New element to be put into the buffer
**     Returns     :
**         ---             - Error code
** ===================================================================
*/
byte Rx1_Put(Rx1_ElementType elem)
{
  byte res = ERR_OK;
  Rx1_DEFINE_CRITICAL();

  Rx1_ENTER_CRITICAL();
  if(Rx1_inSize==Rx1_BUF_SIZE) {
    res = ERR_TXFULL;
  } else {
    Rx1_buffer[Rx1_inIdx] = elem;
    Rx1_inSize++;
    Rx1_inIdx++;
    if(Rx1_inIdx==Rx1_BUF_SIZE) {
      Rx1_inIdx = 0;
    }
  }
  Rx1_EXIT_CRITICAL();
  return res;
}

/*
** ===================================================================
**     Method      :  Rx1_Get (component RingBuffer)
**     Description :
**         Removes an element from the buffer
**     Parameters  :
**         NAME            - DESCRIPTION
**       * elemP           - Pointer to where to store the received
**                           element
**     Returns     :
**         ---             - Error code
** ===================================================================
*/
byte Rx1_Get(Rx1_ElementType *elemP)
{
  byte res = ERR_OK;
  Rx1_DEFINE_CRITICAL();

  Rx1_ENTER_CRITICAL();
  if(Rx1_inSize==0) {
    res = ERR_RXEMPTY;
  } else {
    *elemP = Rx1_buffer[Rx1_outIdx];
    Rx1_inSize--;
    Rx1_outIdx++;
    if(Rx1_outIdx==Rx1_BUF_SIZE) {
      Rx1_outIdx = 0;
    }
  }
  Rx1_EXIT_CRITICAL();
  return res;
}

/*
** ===================================================================
**     Method      :  Rx1_NofElements (component RingBuffer)
**     Description :
**         Returns the actual number of elements in the buffer.
**     Parameters  : None
**     Returns     :
**         ---             - Number of elements in the buffer.
** ===================================================================
*/
Rx1_BufSizeType Rx1_NofElements(void)
{
  return Rx1_inSize;
}

/*
** ===================================================================
**     Method      :  Rx1_NofFreeElements (component RingBuffer)
**     Description :
**         Returns the actual number of free elements/space in the
**         buffer.
**     Parameters  : None
**     Returns     :
**         ---             - Number of elements in the buffer.
** ===================================================================
*/
Rx1_BufSizeType Rx1_NofFreeElements(void)
{
  return (Rx1_BufSizeType)(Rx1_BUF_SIZE-Rx1_inSize);
}

/*
** ===================================================================
**     Method      :  Rx1_Init (component RingBuffer)
**     Description :
**         Initializes the data structure
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/
void Rx1_Init(void)
{
  Rx1_inIdx = 0;
  Rx1_outIdx = 0;
  Rx1_inSize = 0;
}

/*
** ===================================================================
**     Method      :  Rx1_Clear (component RingBuffer)
**     Description :
**         Clear (empty) the ring buffer.
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/
void Rx1_Clear(void)
{
  Rx1_DEFINE_CRITICAL();

  Rx1_ENTER_CRITICAL();
  Rx1_Init();
  Rx1_EXIT_CRITICAL();
}

/* END Rx1. */

/*!
** @}
*/
/*
** ###################################################################
**
**     This file was created by Processor Expert 10.4 [05.11]
**     for the Freescale Kinetis series of microcontrollers.
**
** ###################################################################
*/
