#ifndef _LANS_TASK_H_
#define _LANS_TASK_H_

/**
 ****************************************************************************************
 * @addtogroup LANSTASK Task
 * @ingroup LANS
 * @brief Location and Navigation Profile Task.
 * @{
 ****************************************************************************************
 */

/*
 * INCLUDE FILES
 ****************************************************************************************
 */

#include "lan_common.h"
#include "rwip_task.h" // Task definitions

/*
 * DEFINES
 ****************************************************************************************
 */


/*
 * ENUMERATIONS
 ****************************************************************************************
 */


/// Messages for Location and Navigation Profile Sensor
enum lans_msg_id
{
    /// Start the Location and Navigation Profile Server profile
    LANS_ENABLE_REQ = TASK_FIRST_MSG(TASK_ID_LANS),
    /// Confirm profile
    LANS_ENABLE_RSP,

    /// Update Position Quality
    LANS_UPD_POS_Q_REQ,
    /// Update Position Quality
    LANS_UPD_POS_Q_RSP,

    /// Send a Location and Speed to the peer device (Notification)
    LANS_NTF_LOC_SPEED_REQ,
    /// Response of Send a Location and Speed request
    LANS_NTF_LOC_SPEED_RSP,

    /// Send a LN Vector to the peer device (Notification)
    LANS_NTF_NAVIGATION_REQ,
    /// Response of Send LN Vector request
    LANS_NTF_NAVIGATION_RSP,

    /// Send a complete event status to the application
    LANS_CMP_EVT,

    /// Indicate that an attribute value has been written
    LANS_CFG_NTFIND_IND,

    /// Indicate that Control Point characteristic value has been written
    LANS_LN_CTNL_PT_REQ_IND,
    /// Application response after receiving a LANS_CTNL_PT_REQ_IND message
    LANS_LN_CTNL_PT_CFM,
};

/// Operation Code used in the profile state machine
enum lans_op_code
{
    /// Reserved Operation Code
    LANS_RESERVED_OP_CODE          = 0x00,

    /// Enable Profile Operation Code
    LANS_ENABLE_REQ_OP_CODE,

    /// Send Location and Speed Operation Code
    LANS_NTF_LOC_SPEED_OP_CODE,

    /// Update Position quality
    LANS_UPD_POS_Q_OP_CODE,

    /// Send Navigation Operation Code
    LANS_NTF_NAVIGATION_OP_CODE,

    /**
     * Control Point Operation
     */
    /// Set Cumulative Value
    LANS_SET_CUMUL_VALUE_OP_CODE,
    /// Mask Location and Speed Characteristic Content
    LANS_MASK_LSPEED_CHAR_CT_OP_CODE,
    /// Navigation Control
    LANS_NAVIGATION_CONTROL_OP_CODE,
    /// Request Number of Routes
    LANS_REQ_NUMBER_OF_ROUTES_OP_CODE,
    /// Request Name of Route
    LANS_REQ_NAME_OF_ROUTE_OP_CODE,
    /// Select Route
    LANS_SELECT_ROUTE_OP_CODE,
    /// Set Fix Rate
    LANS_SET_FIX_RATE_OP_CODE,
    /// Set Elevation
    LANS_SET_ELEVATION_OP_CODE,

    /// Error Indication Sent Operation Code
    LANS_LN_CTNL_ERR_IND_OP_CODE,
};

/*
 * STRUCTURES
 ****************************************************************************************
 */

/// Parameters of the @ref LANS_CREATE_DB_REQ message
struct lans_db_cfg
{
    /**
     * LN Feature Value - Not supposed to be modified during the lifetime of the device
     * This bit field is set in order to decide which features are supported:
     */
    uint32_t ln_feature;

    /**
     * Bit 0 - Enable LN Control Point
     * Bit 1 - Enable Navigation Feature
     */
    uint8_t prfl_config;
};

/// Parameters of the @ref LANS_ENABLE_REQ message
struct lans_enable_req
{
    /// Connection index
    uint8_t conidx;
    /**
     * Profile characteristic configuration:
     *   Location and speed Characteristic NTF config -- Bit 0
     *   LN Control Point Characteristic IND config ---- Bit 1
     *   Navigation Characteristic NTF config ---------- Bit 2
     */
    uint16_t prfl_ntf_ind_cfg;
};

/// Parameters of the @ref LANS_ENABLE_RSP message
struct lans_enable_rsp
{
    /// Connection index
    uint8_t conidx;
    /// status
    uint8_t status;
};

/// Parameters of the @ref LANS_CMP_EVT message
struct lans_cmp_evt
{
    /// Connection index
    uint8_t conidx;
    /// Operation Code
    uint8_t operation;
    /// Operation Status
    uint8_t status;
};

/// Parameters of the @ref LANS_CFG_NTFIND_IND message
struct lans_cfg_ntfind_ind
{
    /// Connection index
    uint8_t conidx;
    /// Characteristic Code (Location and speed, Control Point or navigation)
    uint8_t char_code;
    /// Char. Client Characteristic Configuration
    uint16_t ntf_cfg;
};

/// Parameters of the @ref LANS_NTF_LOC_SPEED_REQ message
struct  lans_ntf_loc_speed_req
{
    ///Parameters
    struct lanp_loc_speed parameters;
};

/// Parameters of the @ref LANS_NTF_LOC_SPEED_RSP message
struct  lans_ntf_loc_speed_rsp
{
    /// Operation Status
    uint8_t status;
};

/// Parameters of the @ref LANS_NTF_NAVIGATION_REQ message
struct  lans_ntf_navigation_req
{
    ///Parameters
    struct lanp_navigation parameters;
};

/// Parameters of the @ref LANS_NTF_NAVIGATION_RSP message
struct  lans_ntf_navigation_rsp
{
    /// Operation Status
    uint8_t status;
};

/// Parameters of the @ref LANS_UPD_POS_Q_REQ message
struct  lans_upd_pos_q_req
{
    ///Parameters
    struct lanp_posq parameters;
};

/// Parameters of the @ref LANS_UPD_POS_Q_RSP message
struct  lans_upd_pos_q_rsp
{
    /// Operation Status
    uint8_t status;
};

/// Parameters of the @ref LANS_LN_CTNL_PT_REQ_IND message
struct lans_ln_ctnl_pt_req_ind
{
    /// Connection index
    uint8_t conidx;
    /// Operation Code
    uint8_t op_code;
    /// Value
    union lans_ln_ctnl_pt_req_ind_value
    {
        /// Cumulative Value (24 bits)
        uint32_t cumul_val;
        /// Mask Content
        uint16_t mask_content;
        /// Navigation Control
        uint8_t control_value;
        /// Route number
        uint16_t route_number;
        /// Fix rate
        uint8_t fix_rate;
        /// Elevation
        int32_t elevation;
    } value;
};

/// Parameters of the @ref LANS_CTNL_PT_CFM message
struct lans_ln_ctnl_pt_cfm
{
    /// Connection index
    uint8_t conidx;
    /// Operation Code
    uint8_t op_code;
    /// Status
    uint8_t status;
    /// Value
    union lans_ln_ctnl_pt_cfm_value
    {
        /// Number of routes
        uint16_t number_of_routes;
        /// Mask content
        uint16_t mask_lspeed_content;
        struct lan_route_name
        {
            uint8_t length;
            /// Name of Route UTF-8
            uint8_t name[__ARRAY_EMPTY];
        } route;
    } value;
};

/// @} LANSTASK

#endif //(_LANS_TASK_H_)