/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2010, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL 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.
 * ----------------------------------------------------------------------------
 */

/*---------------------------------------------------------------------------
 *      Headers
 *---------------------------------------------------------------------------*/

/* These headers were introduced in C99
   by working group ISO/IEC JTC1/SC22/WG14. */
#include <stdint.h>

#include "CDCDSerial.h"

/*---------------------------------------------------------------------------
 *         Default callback functions
 *---------------------------------------------------------------------------*/

/**
 * Invoked when the CDC LineCoding is requested to changed
 * \param port          Port number.
 * \param pLineCoding   Pointer to new LineCoding settings.
 * \return USBRC_SUCCESS if ready to receive the line coding.
 */
extern WEAK uint8_t CDCDSerial_LineCodingIsToChange(
    CDCLineCoding * pLineCoding)
{
    /* Accept any of linecoding settings */
    pLineCoding = pLineCoding;
    return USBRC_SUCCESS;
}

/**
 * Invoked when the CDC ControlLineState is changed
 * \param port  Port number.
 * \param DTR   New DTR value.
 * \param RTS   New RTS value.
 */
extern WEAK void CDCDSerial_ControlLineStateChanged(uint8_t DTR,
                                                    uint8_t RTS)
{
    /* Do nothing */
    DTR = DTR; RTS = RTS;
}

