/**
 * Copyright (c) 2014, Analog Devices, Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted (subject to the limitations in the
 * disclaimer below) 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 Analog Devices, Inc. nor the names of its
 *   contributors may be used to endorse or promote products derived
 *   from this software without specific prior written permission.
 *
 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
 * GRANTED BY THIS LICENSE.  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 OWNER 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     radioeng.h
@brief    Radio Interface Engine Functions
@version  v1.0
@author   PAD CSE group, Analog Devices Inc
@date     May 08th 2013
**/

#define RIE_U32 unsigned long
#define RIE_U16 unsigned short int
#define RIE_U8  unsigned char
#define RIE_S8  signed char

/*! \enum RIE_BaseConfigs
 * Variables of this type are used to define the Base Configuration
 */
/*! \var RIE_BaseConfigs DR_1_0kbps_Dev10_0kHz
 * Base configuration of 1 kbps datarate, 10.0 kHz frequency deviation. 
   Use for achieving longer distances.
 */
/*! \var RIE_BaseConfigs DR_38_4kbps_Dev20kHz
 * Base configuration of 38.4 kbps datarate, 20 kHz frequency deviation.
   Use as a compromise of distance and power.
 */
/*! \var RIE_BaseConfigs DR_300_0kbps_Dev75_0kHz
 * Base configuration of 300 kbps datarate, 75 kHz frequency deviation.
   Use for achieving faster transmission times hence lower power.
 */
typedef enum
{
   DR_1_0kbps_Dev10_0kHz      =  0x0,
   DR_38_4kbps_Dev20kHz       =  0x1,
   DR_300_0kbps_Dev75_0kHz    =  0x2,
   UnsupportedDRDev
} RIE_BaseConfigs;

/*! \enum RIE_ModulationTypes
 * Variables of this type are used to define a tx modulation type
 */
/*! \var RIE_ModulationTypes FSK_Modulation
 * FSK Modulation
 */
/*! \var RIE_ModulationTypes GFSK_Modulation
 * GFSK Modulation
 */
typedef enum {FSK_Modulation = 0, GFSK_Modulation = 1} RIE_ModulationTypes;

/*! \enum RIE_PATypes
 * Variables of this type are used to define a PA type
 */
/*! \var RIE_PATypes DifferentialPA
 * Differential PA
 */
/*! \var RIE_PATypes SingleEndedPA
 * Single Ended PA
 */
typedef enum {DifferentialPA = 0, SingleEndedPA = 1} RIE_PATypes;



typedef enum {PowerLevel0 ,PowerLevel1 ,PowerLevel2 ,PowerLevel3,
              PowerLevel4 ,PowerLevel5 ,PowerLevel6 ,PowerLevel7,
              PowerLevel8 ,PowerLevel9 ,PowerLevel10,PowerLevel11,
              PowerLevel12,PowerLevel13,PowerLevel14,PowerLevel15
             } RIE_PAPowerLevel;


/*! \enum RIE_BOOL
 * Variables of this type are used to define a TRUE or FALSE condition
 */
/*! \var RIE_BOOL RIE_TRUE
 * TRUE condition
 */
/*! \var RIE_BOOL RIE_FALSE
 * FALSE condition
 */
typedef enum {RIE_FALSE = 0, RIE_TRUE = !RIE_FALSE} RIE_BOOL;


/*! \enum RIE_Responses
 * Variables of this type are used to define the return value from functions
 */
/*! \var RIE_Responses RIE_Success
 * Successful completion
 */
/*! \var RIE_Responses RIE_RadioSPICommsFail
 * SPI communications with the radio failure.
 */
/*! \var RIE_Responses RIE_UnsupportedRadioConfig
 *  This is an unsupported radio configuration
 */
/*! \var RIE_Responses RIE_Unimplemented
 * This feature has not been implemented
 */
/*! \var RIE_Responses RIE_InvalidParamter
 * An invaild parameter was passed
 */
typedef enum
{
   RIE_Success                 =  0x0,
   RIE_RadioSPICommsFail       =  0x1,
   RIE_UnsupportedRadioConfig  =  0x2,
   RIE_Unimplemented           =  0x3,
   RIE_InvalidParamter         =  0x4,
} RIE_Responses;

// Added in Radio Interface Engine v0.1 
RIE_Responses RadioGetAPIVersion        (RIE_U32 *pVersion);
RIE_Responses RadioInit                 (RIE_BaseConfigs BaseConfig);
RIE_Responses RadioPowerOff             (void);
RIE_Responses RadioTerminateRadioOp     (void);
RIE_Responses RadioSetFrequency         (RIE_U32 Frequency);
RIE_Responses RadioSetModulationType    (RIE_ModulationTypes ModulationType);
RIE_Responses RadioPayldManchesterEncode(RIE_BOOL bEnable);
RIE_Responses RadioPayldDataWhitening   (RIE_BOOL bEnable);
RIE_Responses RadioTxPacketFixedLen     (RIE_U8 Len, RIE_U8 *pData);
RIE_BOOL      RadioTxPacketComplete     (void);
RIE_Responses RadioTxSetPA              (RIE_PATypes PAType,RIE_PAPowerLevel Power);
RIE_Responses RadioTxCarrier            (void);
RIE_Responses RadioTxPreamble           (void);
RIE_Responses RadioRxPacketFixedLen     (RIE_U8 Len);
RIE_BOOL      RadioRxPacketAvailable    (void);
RIE_Responses RadioRxPacketRead         (RIE_U8 BufferLen,RIE_U8 *pPktLen,RIE_U8 *pData,RIE_S8 *pRSSIdBm);
RIE_Responses RadioRxBERTestMode        (void);

// Added in Radio Interface Engine v0.2 
RIE_Responses RadioSwitchConfig         (RIE_BaseConfigs BaseConfig);
RIE_Responses RadioRadioGetRSSI         (RIE_S8 *pRSSIdBm);
RIE_Responses RadioTxSetPower           (RIE_PAPowerLevel Power);

// Added in Radio Interface Engine v0.3 
RIE_Responses RadioTxPacketVariableLen  (RIE_U8 Len, RIE_U8 *pData);
RIE_Responses RadioRxPacketVariableLen  (void);

// Added in Radio Interface Engine v0.5
RIE_Responses RadioDeInit               (void);