/* Copyright (c) 2014, Nordic Semiconductor ASA
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/**
* @file
* @ingroup aci
* @brief Definitions for the ACI (Application Control Interface) commands
* @remarks
*
*/
#ifndef ACI_CMDS_H__
#define ACI_CMDS_H__
#include "aci.h"
/**
* @enum aci_cmd_opcode_t
* @brief ACI command opcodes
*/
typedef enum
{
/**
* Enter test mode
*/
ACI_CMD_TEST = 0x01,
/**
* Echo (loopback) test command
*/
ACI_CMD_ECHO = 0x02,
/**
* Send a BTLE DTM command to the radio
*/
ACI_CMD_DTM_CMD = 0x03,
/**
* Put the device to sleep
*/
ACI_CMD_SLEEP = 0x04,
/**
* Wakeup the device from deep sleep
*/
ACI_CMD_WAKEUP = 0x05,
/**
* Replace the contents of the internal database with
* user provided data
*/
ACI_CMD_SETUP = 0x06,
/**
* Read the portions of memory required to be restored after a power cycle
*/
ACI_CMD_READ_DYNAMIC_DATA = 0x07,
/**
* Write back the data retrieved using ACI_CMD_READ_DYNAMIC_DATA
*/
ACI_CMD_WRITE_DYNAMIC_DATA = 0x08,
/**
* Retrieve the device's version information
*/
ACI_CMD_GET_DEVICE_VERSION = 0x09,
/**
* Request the Bluetooth address and its type
*/
ACI_CMD_GET_DEVICE_ADDRESS = 0x0A,
/**
* Request the battery level measured by nRF8001
*/
ACI_CMD_GET_BATTERY_LEVEL = 0x0B,
/**
* Request the temperature value measured by nRF8001
*/
ACI_CMD_GET_TEMPERATURE = 0x0C,
/**
* Write to the local Attribute Database
*/
ACI_CMD_SET_LOCAL_DATA = 0x0D,
/**
* Reset the baseband and radio and go back to idle
*/
ACI_CMD_RADIO_RESET = 0x0E,
/**
* Start advertising and wait for a master connection
*/
ACI_CMD_CONNECT = 0x0F,
/**
* Start advertising and wait for a master connection
*/
ACI_CMD_BOND = 0x10,
/**
* Start advertising and wait for a master connection
*/
ACI_CMD_DISCONNECT = 0x11,
/**
* Throttles the Radio transmit power
*/
ACI_CMD_SET_TX_POWER = 0x12,
/**
* Trigger a connection parameter update
*/
ACI_CMD_CHANGE_TIMING = 0x13,
/**
* Open a remote pipe for data reception
*/
ACI_CMD_OPEN_REMOTE_PIPE = 0x14,
/**
* Transmit data over an open pipe
*/
ACI_CMD_SEND_DATA = 0x15,
/**
* Send an acknowledgment of received data
*/
ACI_CMD_SEND_DATA_ACK = 0x16,
/**
* Request data over an open pipe
*/
ACI_CMD_REQUEST_DATA = 0x17,
/**
* NACK a data reception
*/
ACI_CMD_SEND_DATA_NACK = 0x18,
/**
* Set application latency
*/
ACI_CMD_SET_APP_LATENCY = 0x19,
/**
* Set a security key
*/
ACI_CMD_SET_KEY = 0x1A,
/**
* Open Advertising Pipes
*/
ACI_CMD_OPEN_ADV_PIPE = 0x1B,
/**
* Start non-connectable advertising
*/
ACI_CMD_BROADCAST = 0x1C,
/**
* Start a security request in bonding mode
*/
ACI_CMD_BOND_SECURITY_REQUEST = 0x1D,
/**
* Start Directed advertising towards a Bonded Peer
*/
ACI_CMD_CONNECT_DIRECT = 0x1E,
/**
* Close a previously opened remote pipe
*/
ACI_CMD_CLOSE_REMOTE_PIPE = 0x1F,
/**
* Invalid ACI command opcode
*/
ACI_CMD_INVALID = 0xFF
} _aci_packed_ aci_cmd_opcode_t;
ACI_ASSERT_SIZE(aci_cmd_opcode_t, 1);
/**
* @struct aci_cmd_params_test_t
* @brief Structure for the ACI_CMD_TEST ACI command parameters
*/
typedef struct
{
aci_test_mode_change_t test_mode_change; /**< enum aci_test_mode_change_t */
} _aci_packed_ aci_cmd_params_test_t;
ACI_ASSERT_SIZE(aci_cmd_params_test_t, 1);
/**
* @struct aci_cmd_params_echo_t
* @brief Structure for the ACI_CMD_ECHO ACI command parameters
*/
typedef struct
{
uint8_t echo_data[ACI_ECHO_DATA_MAX_LEN];
} _aci_packed_ aci_cmd_params_echo_t;
ACI_ASSERT_SIZE(aci_cmd_params_echo_t, ACI_ECHO_DATA_MAX_LEN);
/**
* @struct aci_cmd_params_dtm_cmd_t
* @brief Structure for the ACI_CMD_DTM_CMD ACI command parameters
*/
typedef struct
{
uint8_t cmd_msb;
uint8_t cmd_lsb;
} _aci_packed_ aci_cmd_params_dtm_cmd_t;
/**
* @struct aci_cmd_params_setup_t
* @brief Structure for the ACI_CMD_SETUP ACI command parameters
*/
typedef struct
{
uint8_t setup_data[1];
} _aci_packed_ aci_cmd_params_setup_t;
ACI_ASSERT_SIZE(aci_cmd_params_setup_t, 1);
/**
* @struct aci_cmd_params_write_dynamic_data_t
* @brief Structure for the ACI_CMD_WRITE_DYNAMIC_DATA ACI command parameters
* @note Dynamic data chunk size in this command is defined to go up to ACI_PACKET_MAX_LEN - 3
*/
typedef struct
{
uint8_t seq_no;
uint8_t dynamic_data[1];
} _aci_packed_ aci_cmd_params_write_dynamic_data_t;
/**
* @define aci_cmd_params_set_local_data_t
* @brief Structure for the ACI_CMD_SET_LOCAL_DATA ACI command parameters
*/
typedef struct
{
aci_tx_data_t tx_data;
} _aci_packed_ aci_cmd_params_set_local_data_t;
/**
* @struct aci_cmd_params_connect_t
* @brief Structure for the ACI_CMD_CONNECT ACI command parameters
*/
typedef struct
{
uint16_t timeout; /**< 0x0000 (no timeout) to 0x3FFF */
uint16_t adv_interval; /**< 16 bits of advertising interval for general discovery */
} _aci_packed_ aci_cmd_params_connect_t;
ACI_ASSERT_SIZE(aci_cmd_params_connect_t, 4);
/**
* @define aci_cmd_params_bond_t
* @brief Structure for the ACI_CMD_BOND ACI command parameters
*/
typedef struct
{
uint16_t timeout; /**< 0x0000 (no timeout) to 0x3FFF */
uint16_t adv_interval; /**< 16 bits of advertising interval for general discovery */
} _aci_packed_ aci_cmd_params_bond_t;
ACI_ASSERT_SIZE(aci_cmd_params_bond_t, 4);
/**
* @struct aci_cmd_params_disconnect_t
* @brief Structure for the ACI_CMD_DISCONNECT ACI command parameters
*/
typedef struct
{
aci_disconnect_reason_t reason; /**< enum aci_disconnect_reason_t */
} _aci_packed_ aci_cmd_params_disconnect_t;
ACI_ASSERT_SIZE(aci_cmd_params_disconnect_t, 1);
/**
* @struct aci_cmd_params_set_tx_power_t
* @brief Structure for the ACI_CMD_SET_TX_POWER ACI command parameters
*/
typedef struct
{
aci_device_output_power_t device_power; /**< enum aci_device_output_power_t */
} _aci_packed_ aci_cmd_params_set_tx_power_t;
ACI_ASSERT_SIZE(aci_cmd_params_set_tx_power_t, 1);
/**
* @struct aci_cmd_params_change_timing_t
* @brief Structure for the ACI_CMD_CHANGE_TIMING ACI command parameters
*/
typedef struct
{
aci_ll_conn_params_t conn_params;
} _aci_packed_ aci_cmd_params_change_timing_t;
ACI_ASSERT_SIZE(aci_cmd_params_change_timing_t, 8);
/**
* @struct aci_cmd_params_open_remote_pipe_t
* @brief Structure for the ACI_CMD_OPEN_REMOTE_PIPE ACI command parameters
*/
typedef struct
{
uint8_t pipe_number;
} _aci_packed_ aci_cmd_params_open_remote_pipe_t;
/**
* @struct aci_cmd_params_send_data_t
* @brief Structure for the ACI_CMD_SEND_DATA ACI command parameters
*/
typedef struct
{
aci_tx_data_t tx_data;
} _aci_packed_ aci_cmd_params_send_data_t;
/**
* @define aci_cmd_params_send_data_ack_t
* @brief Structure for the ACI_CMD_SEND_DATA_ACK ACI command parameters
*/
typedef struct
{
uint8_t pipe_number;
} _aci_packed_ aci_cmd_params_send_data_ack_t;
/**
* @struct aci_cmd_params_send_data_t
* @brief Structure for the ACI_CMD_SEND_DATA ACI command parameters
*/
typedef struct
{
uint8_t pipe_number;
} _aci_packed_ aci_cmd_params_request_data_t;
/**
* @define aci_cmd_params_send_data_nack_t
* @brief Structure for the ACI_CMD_SEND_DATA_NACK ACI command parameters
*/
typedef struct
{
uint8_t pipe_number;
uint8_t error_code;
} _aci_packed_ aci_cmd_params_send_data_nack_t;
ACI_ASSERT_SIZE(aci_cmd_params_send_data_nack_t, 2);
/**
* @define aci_cmd_params_set_app_latency_t
* @brief Structure for the ACI_CMD_SET_APP_LATENCY ACI command parameters
*/
typedef struct
{
aci_app_latency_mode_t mode;
uint16_t latency;
} _aci_packed_ aci_cmd_params_set_app_latency_t;
ACI_ASSERT_SIZE(aci_cmd_params_set_app_latency_t, 3);
/**
* @define aci_cmd_params_set_key_t
* @brief Structure for the ACI_CMD_SET_KEY ACI command parameters
*/
typedef struct
{
aci_key_type_t key_type;
union
{
uint8_t passkey[6];
uint8_t oob_key[16];
} key;
} _aci_packed_ aci_cmd_params_set_key_t;
ACI_ASSERT_SIZE(aci_cmd_params_set_key_t, 17);
/**
* @define aci_cmd_params_open_adv_pipe_t
* @brief Structure for the ACI_CMD_OPEN_ADV_PIPE ACI command parameters
*/
typedef struct
{
uint8_t pipes[8];
} _aci_packed_ aci_cmd_params_open_adv_pipe_t;
/**
* @define aci_cmd_params_broadcast_t
* @brief Structure for the ACI_CMD_BROADCAST ACI command parameters
*/
typedef struct
{
uint16_t timeout; /**< 0x0000 (no timeout) to 0x3FFF */
uint16_t adv_interval; /**< 16 bits of advertising interval for general discovery */
} _aci_packed_ aci_cmd_params_broadcast_t;
/**
* @struct aci_cmd_params_close_remote_pipe_t
* @brief Structure for the ACI_CMD_CLOSE_REMOTE_PIPE ACI command parameters
*/
typedef struct
{
uint8_t pipe_number;
} _aci_packed_ aci_cmd_params_close_remote_pipe_t;
/**
* @struct aci_cmd_t
* @brief Encapsulates a generic ACI command
*/
typedef struct
{
uint8_t len; /**< Length of the ACI command */
aci_cmd_opcode_t cmd_opcode; /**< enum aci_cmd_opcode_t -> Opcode of the ACI command */
union
{
aci_cmd_params_test_t test;
aci_cmd_params_echo_t echo;
aci_cmd_params_dtm_cmd_t dtm_cmd;
aci_cmd_params_setup_t setup;
aci_cmd_params_write_dynamic_data_t write_dynamic_data;
aci_cmd_params_set_local_data_t set_local_data;
aci_cmd_params_connect_t connect;
aci_cmd_params_bond_t bond;
aci_cmd_params_disconnect_t disconnect;
aci_cmd_params_set_tx_power_t set_tx_power;
aci_cmd_params_change_timing_t change_timing;
aci_cmd_params_open_remote_pipe_t open_remote_pipe;
aci_cmd_params_send_data_t send_data;
aci_cmd_params_send_data_ack_t send_data_ack;
aci_cmd_params_request_data_t request_data;
aci_cmd_params_send_data_nack_t send_data_nack;
aci_cmd_params_set_app_latency_t set_app_latency;
aci_cmd_params_set_key_t set_key;
aci_cmd_params_open_adv_pipe_t open_adv_pipe;
aci_cmd_params_broadcast_t broadcast;
aci_cmd_params_close_remote_pipe_t close_remote_pipe;
} params;
} _aci_packed_ aci_cmd_t;
#endif // ACI_CMDS_H__