text: /**
    ******************************************************************************
    * @file    usbd_cdc_vcp.c
    * @author  MCD Application Team
    * @version V1.0.0
    * @date    31-January-2014
    * @brief   Generic media access Layer.
    ******************************************************************************
    * @attention
    *
    * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
    *
    * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2
    *
    * 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.
    *
    ******************************************************************************
    */
  
  /* Includes ------------------------------------------------------------------*/
  #include "usbd_cdc_vcp.h"
  #include "stm32f0xx.h"
  #include "stm32f0xx_conf.h"
  #include "fifo.h"
  #include <stdio.h>
  #include <stdbool.h>
  
  /* These are external variables imported from CDC core to be used for IN
     transfer management. */
  extern uint8_t  APP_Rx_Buffer []; /* Write CDC received data in this buffer.
                                       These data will be sent over USB IN endpoint
                                       in the CDC core functions. */
  extern uint32_t APP_Rx_ptr_in;    /* Increment this pointer or roll it back to
                                       start address when writing received data
                                       in the buffer APP_Rx_Buffer. */
  
  extern fifo_t rxFifo;
  
  /* Private function prototypes -----------------------------------------------*/
  static uint16_t VCP_Init     (void);
  static uint16_t VCP_DeInit   (void);
  static uint16_t VCP_Ctrl     (uint32_t Cmd, uint8_t* Buf, uint32_t Len);
  uint16_t VCP_DataTx   (uint8_t* Buf, uint32_t Len);
  static uint16_t VCP_DataRx   (uint8_t* Buf, uint32_t Len);
  
  // static uint16_t VCP_COMConfig(uint8_t Conf);
  
  CDC_IF_Prop_TypeDef VCP_fops =
  {
    VCP_Init,
    VCP_DeInit,
    VCP_Ctrl,
    VCP_DataTx,
    VCP_DataRx
  };
  
  /* Private functions ---------------------------------------------------------*/
  /**
    * @brief  VCP_Init
    *         Initializes the Media on the STM32
    * @param  None
    * @retval Result of the operation (USBD_OK in all cases)
    */
  static uint16_t VCP_Init(void)
  {
  
  
    return USBD_OK;
  }
  
  /**
    * @brief  VCP_DeInit
    *         DeInitializes the Media on the STM32
    * @param  None
    * @retval Result of the opeartion (USBD_OK in all cases)
    */
  static uint16_t VCP_DeInit(void)
  {
  
    return USBD_OK;
  }
  
  
  /**
    * @brief  VCP_Ctrl
    *         Manage the CDC class requests
    * @param  Cmd: Command code
    * @param  Buf: Buffer containing command data (request parameters)
    * @param  Len: Number of data to be sent (in bytes)
    * @retval Result of the operation (USBD_OK in all cases)
    */
  static uint16_t VCP_Ctrl (uint32_t Cmd, uint8_t* Buf, uint32_t Len)
  {
  
    return USBD_OK;
  }
  
  /**
    * @brief  VCP_DataTx
    *         CDC received data to be send over USB IN endpoint are managed in
    *         this function.
    * @param  Buf: Buffer of data to be sent
    * @param  Len: Number of data to be sent (in bytes)
    * @retval Result of the operation: USBD_OK if all operations are OK else VCP_FAIL
    */
  uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
  {
    for (uint32_t byte = 0; byte < Len; byte++) {
      APP_Rx_Buffer[APP_Rx_ptr_in++] = Buf[byte];
      if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
      {
        APP_Rx_ptr_in = 0;
      }
    }
  
    return USBD_OK;
  }
  
  /**
    * @brief  VCP_DataRx
    *         Data received over USB OUT endpoint are sent over CDC interface
    *         through this function.
    * @note   This function will block any OUT packet reception on USB endpoint
    *         untill exiting this function. If you exit this function before transfer
    *         is complete on CDC interface (ie. using DMA controller) it will result
    *         in receiving more data while previous ones are still not sent.
    *
    * @param  Buf: Buffer of data to be received
    * @param  Len: Number of data received (in bytes)
    * @retval Result of the operation: USBD_OK if all operations are OK else VCP_FAIL
    */
  static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len)
  {
    uint32_t i;
  
    for (i = 0; i < Len; i++)
    {
      FifoPush(&rxFifo, Buf[i]);
    }
  
    return USBD_OK;
  }
  
  /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  