/* SPDX-License-Identifier: LGPL-2.1-only OR BSD-3-Clause */
/******************************************************************************
 *
 * This file is provided under a dual license.  When you use or
 * distribute this software, you may choose to be licensed under
 * version 2.1 of the GNU Lesser General Public License
 * ("LGPLv2.1 License") or BSD License.
 *
 * LGPLv2.1 License
 *
 * Copyright(C) 2019 MediaTek Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2.1 of the GNU Lesser General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html for more
 * details.
 *
 * BSD LICENSE
 *
 * Copyright(C) 2019 MediaTek Inc.
 * 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 following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS 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.
 *
 *****************************************************************************/

/*----------------------------------------------------------------------------*/
/*! @file u_time_msrt.h 
 *  $RCSfile: $
 *  $Revision: #1 $
 *  $Date: 2015/11/10 $
 *  $Author: dtvbm11 $
 *  
 *  @par Description:
 */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/*! @defgroup groupMW_TIMEMEASUREMENT Time Measurement
 *
 *  @ingroup groupMW
 *  @brief Provides constant,type definitions and function of the  time measurement
 *   ..  Time measurement is a middleware component that is responsible for measure time
 *
 *  %MW Application API would be used by TV Application, lot of these APIs 
 *  would
 *   be wrapped from Exported API
 *
 *  @see groupMW
 *  @{
 */
/*----------------------------------------------------------------------------*/

#ifndef _U_TIME_MSRT_H_
#define _U_TIME_MSRT_H_

/*-----------------------------------------------------------------------------
                    include files
-----------------------------------------------------------------------------*/

#include "u_common.h"
/*-----------------------------------------------------------------------------
                    macros, defines, typedefs, enums
-----------------------------------------------------------------------------*/

#define TMS_LEVEL_NONE          ((UINT16) 0)    /**<default real time measurement         */
#define TMS_LEVEL_REAL_TIME     MAKE_BIT_MASK_16(0)    /**<real time measurement        */
#define TMS_LEVEL_OFF_LINE      MAKE_BIT_MASK_16(1)    /**<off line time measurement        */

#define TMS_NAME_MAX_LENGTH     ((SIZE_T) 31)    /**<max name length        */
#define TMS_COMMENT_MAX_LENGTH  ((SIZE_T) 31)    /**<max comment length        */
#define TMS_REC_CNT_MAX         ((UINT16) 256)    /**<max record number        */
#define TMS_SPOT_REC_CNT_MAX    ((UINT16) 64)    /**<max spot record count        */

#define TMS_FLAG_NONE           ((UINT32) 0)    /**<default flag        */
#define TMS_FLAG_BOOT           MAKE_BIT_MASK_32(0)    /**<        */
#define TMS_FLAG_CHG_CHL        MAKE_BIT_MASK_32(1)    /**<        */
#define TMS_FLAG_AUTO_SCN       MAKE_BIT_MASK_32(2)    /**<        */
#define TMS_FLAG_INP_CHG        MAKE_BIT_MASK_32(3)    /**<        */
#define TMS_FLAG_WFD_LATENCY    MAKE_BIT_MASK_32(4)    /**<        */
#define TMS_FLAG_POWER_OFF      MAKE_BIT_MASK_32(5)    /**<        */
#define TMS_FLAG_COMMON         MAKE_BIT_MASK_32(6)    /**<        */

/* Common macros to perform CLI controlled time measurement statements. */
/* Note that an individual SW Module MUST set the macro                 */
/* TMS_MODULE_LEVEL else a compile error will occur.                    */
#undef TMS_SPOT
#undef TMS_BEGIN
#undef TMS_END


#define TMS_SPOT( _name )                                                     \
    TIME_MSRT_SPOT(                                                           \
        TMS_MODULE_LEVEL,                                                     \
        _name)    /**<  TMS_SPOT macro records a spot of time-stamp      */

/* TMS_DIFF macro records the differences of time-stamps */
#define TMS_DIFF( _name )                                                     \
    TIME_MSRT_DIFF(                                                           \
        TMS_MODULE_LEVEL,                                                     \
        _name)    /**< TMS_DIFF macro records the differences of time-stamps        */

/* TMS_BEGIN macro record the begin time-stamp */
#define TMS_BEGIN( _name )                                                    \
    TIME_MSRT_BEGIN(                                                          \
        TMS_MODULE_LEVEL,                                                     \
        _name)    /**<  TMS_BEGIN macro record the begin time-stamp      */

/* TMS_END macro record the end time-stamp */
#define TMS_END( _name )                                                      \
    TIME_MSRT_END(                                                            \
        TMS_MODULE_LEVEL,                                                     \
        _name)    /**<  TMS_END macro record the end time-stamp      */

/* TMS_SPOT macro records a spot of time-stamp */
#define TMS_SPOT_EX( _flag, _name, _comment )                                 \
    TIME_MSRT_SPOT_EX(                                                        \
        TMS_MODULE_LEVEL,                                                     \
        _flag,                                                                \
        _name,                                                                \
        _comment)    /**< TMS_SPOT macro records a spot of time-stamp        */

/* TMS_DIFF macro records the differences of time-stamps */
#define TMS_DIFF_EX( _flag, _name, _comment )                                 \
    TIME_MSRT_DIFF_EX(                                                        \
        TMS_MODULE_LEVEL,                                                     \
        _flag,                                                                \
        _name,                                                                \
        _comment)    /**< TMS_DIFF macro records the differences of time-stamps        */

/* TMS_BEGIN macro record the begin time-stamp */
#define TMS_BEGIN_EX( _flag, _name, _comment )                                \
    TIME_MSRT_BEGIN_EX(                                                       \
        TMS_MODULE_LEVEL,                                                     \
        _flag,                                                                \
        _name,                                                                \
        _comment)    /**< TMS_BEGIN macro record the begin time-stamp       */

/* TMS_END macro record the end time-stamp */
#define TMS_END_EX( _flag, _name, _comment )                                  \
    TIME_MSRT_END_EX(                                                         \
        TMS_MODULE_LEVEL,                                                     \
        _flag,                                                                \
        _name,                                                                \
        _comment)    /**< TMS_END macro record the end time-stamp       */

#define TMSR_OK                         ((INT32)   0)    /**<  return value ok      */
#define TMSR_FAIL                       ((INT32)   -1)    /**< return failed       */
#define TMSR_NOT_INIT                   ((INT32)   -2)    /**< not init       */
#define TMSR_INSUFFICIENT_MEMORY        ((INT32)   -3)    /**< insufficient memory       */



/* TMS selection */
typedef enum
{
    TMS_SEL_INDIVIDUAL = 0,
    TMS_SEL_COMMON,
    TMS_SEL_INDIVIDUAL_COMMON
}   TMS_SEL_T;

/*-----------------------------------------------------------------------------
                    functions declarations
-----------------------------------------------------------------------------*/


#endif /* _U_TIME_MSRT_H_ */

/*----------------------------------------------------------------------------*/
/*! @} */   /* end of  groupMW_TIMEMEASUREMENT*/
/*----------------------------------------------------------------------------*/

