/*
 * Copyright (c) 2015, Weptech elektronik GmbH Germany
 * http://www.weptech.de
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. 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.
 * 3. 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.
 *
 * This file is part of the Contiki operating system.
 */

#ifndef CC1200_H_
#define CC1200_H_

#include "contiki.h"

/*---------------------------------------------------------------------------*/
/*
 * Can we use GPIO2 (in addition to GPIO0)?
 *
 * If this is the case, we can easily handle payloads > 125 bytes
 * (and even > 127 bytes). If GPIO2 is available, we use it as an indicator
 * pin for RX / TX FIFO threshold.
 */
#ifdef CC1200_CONF_USE_GPIO2
#define CC1200_USE_GPIO2                CC1200_CONF_USE_GPIO2
#else
#define CC1200_USE_GPIO2                1
#endif
/*---------------------------------------------------------------------------*/
/*
 * The maximum payload length the driver can handle.
 *
 * - If CC1200_MAX_PAYLOAD_LEN <= 125 and CC1200_USE_GPIO2 == 0, we read
 * out the RX FIFO at the end of the packet. RXOFF_MODE is set to RX in this
 * case.
 * - If 125 < CC1200_MAX_PAYLOAD_LEN <= 127 and CC1200_USE_GPIO2 == 0, we
 * also read out the RX FIFO at the end of the packet, but read out
 * RSSI + LQI "by hand". In this case, we also have to restart RX
 * manually because RSSI + LQI are overwritten as soon as RX re-starts.
 * This will lead to an increased RX/RX turnaround time.
 * - If CC1200_USE_GPIO2 is set, we can use an arbitrary payload length
 * (only limited by the payload length defined in the phy header).
 *
 * See below for 802.15.4g support.
 */
#ifdef CC1200_CONF_MAX_PAYLOAD_LEN
#define CC1200_MAX_PAYLOAD_LEN           CC1200_CONF_MAX_PAYLOAD_LEN
#else
#define CC1200_MAX_PAYLOAD_LEN           127
#endif
/*---------------------------------------------------------------------------*/
/*
 * Use 802.15.4g frame format? Supports frame lenghts up to 2047 bytes!
 */
#ifdef CC1200_CONF_802154G
#define CC1200_802154G                  CC1200_CONF_802154G
#else
#define CC1200_802154G                  0
#endif
/*---------------------------------------------------------------------------*/
/*
 * Do we use withening in 802.15.4g mode? Set to 1 if enabled, 0 otherwise.
 */
#ifdef CC1200_CONF_802154G_WHITENING
#define CC1200_802154G_WHITENING        CC1200_CONF_802154G_WHITENING
#else
#define CC1200_802154G_WHITENING        0
#endif
/*---------------------------------------------------------------------------*/
/*
 * Do we use CRC16 in 802.15.4g mode? Set to 1 if enabled, 0 otherwise.
 *
 * It set to 0, we use FCS type 0: CRC32.
 */
#ifdef CC1200_CONF_802154G_CRC16
#define CC1200_802154G_CRC16            CC1200_CONF_802154G_CRC16
#else
/* Use FCS type 0: CRC32 */
#define CC1200_802154G_CRC16            0
#endif
/*---------------------------------------------------------------------------*/
/* The RF configuration to be used. */
#ifdef CC1200_CONF_RF_CFG
#define CC1200_RF_CFG                   CC1200_CONF_RF_CFG
#else
#define CC1200_RF_CFG                   cc1200_802154g_863_870_fsk_50kbps
#endif
/*---------------------------------------------------------------------------*/
/*
 * The RSSI offset in dBm (int8_t)
 *
 * Might be hardware dependent, so we make it a configuration parameter.
 * This parameter is written to AGC_GAIN_ADJUST.GAIN_ADJUSTMENT
 */
#ifdef CC1200_CONF_RSSI_OFFSET
#define CC1200_RSSI_OFFSET              CC1200_CONF_RSSI_OFFSET
#else
#define CC1200_RSSI_OFFSET              (-81)
#endif
/*---------------------------------------------------------------------------*/
/*
 * The frequency offset
 *
 * Might be hardware dependent (e.g. depending on crystal load capacitances),
 * so we make it a configuration parameter. Written to FREQOFF1 / FREQOFF2.
 * Signed 16 bit number, see cc1200 user's guide.
 *
 * TODO: Make it a parameter for set_value() / get_value()
 */
#ifdef CC1200_CONF_FREQ_OFFSET
#define CC1200_FREQ_OFFSET              CC1200_CONF_FREQ_OFFSET
#else
#define CC1200_FREQ_OFFSET              (0)
#endif
/*---------------------------------------------------------------------------*/
/*
 * The default channel to use. 
 *
 * Permitted values depending on the data rate + band used are defined
 * in the appropriate rf configuration file. Make sure the default value
 * is within these limits!
 */
#ifdef CC1200_CONF_DEFAULT_CHANNEL
#define CC1200_DEFAULT_CHANNEL          CC1200_CONF_DEFAULT_CHANNEL
#else
/* 868.325 MHz */
//#define CC1200_DEFAULT_CHANNEL      26
/* 865.725 MHz */
#define CC1200_DEFAULT_CHANNEL          13
#endif
/*---------------------------------------------------------------------------*/
/*
 * Wether to use auto calibration or not.
 *
 * If set to 0, calibration is performed manually when turning the radio
 * on (on()), when transmitting (transmit()) or when changing the channel.
 * Enabling auto calibration will increase turn around times +
 * energy consumption. If enabled, we calibrate every time we go from
 * IDLE to RX or TX.
 * When RDC or channel hopping is used, there is no need to turn calibration
 * on because either on() is called frequently or the channel is updated.
 */
#ifdef CC1200_CONF_AUTOCAL
#define CC1200_AUTOCAL                  CC1200_CONF_AUTOCAL
#else
#define CC1200_AUTOCAL                  0
#endif
/*---------------------------------------------------------------------------*/
/*
 * If CC1200_AUTOCAL is 0, a timeout is used to decide when to calibrate when
 * going to TX.
 *
 * Therefore, we don't calibrate every time we transmit. Set this parameter
 * to 0 when this feature is not used.
 */
#ifdef CC1200_CONF_CAL_TIMEOUT_SECONDS
#define CC1200_CAL_TIMEOUT_SECONDS      CC1200_CONF_CAL_TIMEOUT_SECONDS
#else
/* Calibrate at the latest every 15 minutes */
#define CC1200_CAL_TIMEOUT_SECONDS      900
#endif
/*---------------------------------------------------------------------------*/
/*
 * If defined, use these LEDS to indicate TX activity
 *
 * The LEDs are turned on once the radio enters TX mode
 * (together with ENERGEST_ON(ENERGEST_TYPE_TRANSMIT),
 * and turned of as soon as TX has completed.
 */
#ifdef CC1200_CONF_TX_LEDS
#define CC1200_TX_LEDS                  CC1200_CONF_TX_LEDS
#endif
/*---------------------------------------------------------------------------*/
/*
 * If defined, use these LEDS to indicate RX activity
 *
 * The LEDs are turned on as soon as the first byte is read out from
 * the RX FIFO
 */
#ifdef CC1200_CONF_RX_LED
#define CC1200_RX_LEDS                  CC1200_CONF_RX_LEDS
#endif
/*---------------------------------------------------------------------------*/
/*
 * If set, enable sniff mode: turn radio on (and keep it on), disable
 * address filter and auto ack
 */
#ifdef CC1200_CONF_SNIFFER
#define CC1200_SNIFFER                  CC1200_CONF_SNIFFER
#else
#define CC1200_SNIFFER                  0
#endif
/*---------------------------------------------------------------------------*/

#endif /* CC1200_H_ */