RedBearLab / BLE_nRF8001

Dependents:   nRF8001_SimpleChat nRF8001_SimpleControls mbed_BLE2 mbed_BLEtry2 ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers aci.h Source File

aci.h

Go to the documentation of this file.
00001 /* Copyright (c) 2014, Nordic Semiconductor ASA
00002  *
00003  * Permission is hereby granted, free of charge, to any person obtaining a copy
00004  * of this software and associated documentation files (the "Software"), to deal
00005  * in the Software without restriction, including without limitation the rights
00006  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00007  * copies of the Software, and to permit persons to whom the Software is
00008  * furnished to do so, subject to the following conditions:
00009  *
00010  * The above copyright notice and this permission notice shall be included in all
00011  * copies or substantial portions of the Software.
00012  *
00013  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00014  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00015  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00016  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00017  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00018  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
00019  * SOFTWARE.
00020  */
00021 
00022 /**
00023  * @file
00024  *
00025  * @defgroup aci aci
00026  * @{
00027  * @ingroup lib
00028  *
00029  * @brief Definitions for the ACI (Application Control Interface)
00030  * @remarks
00031  *
00032  * Flow control from application mcu to nRF8001
00033  *
00034  * Data flow control:
00035  * The flow control is credit based and the credit is initally given using the "device started" event.
00036  * A credit of more than 1 is given to the application mcu.
00037  * These credits are used only after the "ACI Connected Event" is sent to the application mcu.
00038  *
00039  * every send_data that is used decrements the credit available by 1. This is to be tracked by the application mcu.
00040  * When the credit available reaches 0, the application mcu shall not send any more send_data.
00041  * Credit is returned using the "credit event", this returned credit can then be used to send more send_data.
00042  * This flow control is not necessary and not available for Broadcast.
00043  * The entire credit available with the external mcu expires when a "disconnected" event arrives.
00044  *
00045  * Command flow control:
00046  * When a command is sent over the ACI, the next command shall not be sent until after a response
00047  * for the command sent has arrived.
00048  *
00049  */
00050 
00051 #ifndef ACI_H__
00052 #define ACI_H__
00053 
00054 /**
00055  * Define an _aci_packed_ macro we can use in structure and enumerated type
00056  * declarations so that the types are sized consistently across different
00057  * platforms. In particular Arduino platforms using the GCC compiler and the
00058  * Nordic processors using the Keil compiler.
00059  *
00060  * It's really the GNU compiler platforms that need a special keyword to get
00061  * tight packing of values. On GNU platforms we can use the keyword:
00062  *     __attribute__((__packed__))
00063  * The thing is that while this keyword does the right thing with old and new
00064  * versions of the gcc (C) compiler it only works right with g++ (C++) compiler
00065  * versions that are version 4 or newer.
00066  */
00067 #ifdef __GNUC__
00068 #  if __GNUC__ >= 4
00069 #    define _aci_packed_ __attribute__((__packed__))
00070 #  else
00071 #    error "older g++ versions don't handle packed attribute in typedefs"
00072 #  endif
00073 #else
00074 #  define _aci_packed_
00075 #endif
00076 
00077 /*
00078  * Define a macro that compares the size of the first parameter to the integer
00079  * value of the second parameter. If they do not match, a compile time error
00080  * for negative array size occurs (even gnu chokes on negative array size).
00081  *
00082  * This compare is done by creating a typedef for an array. No variables are
00083  * created and no memory is consumed with this check. The created type is
00084  * used for checking only and is not for use by any other code. The value
00085  * of 10 in this macro is arbitrary, it just needs to be a value larger
00086  * than one to result in a positive number for the array size.
00087  */
00088 #define ACI_ASSERT_SIZE(x,y) typedef char x ## _assert_size_t[-1+10*(sizeof(x) == (y))]
00089 
00090 /**
00091  * @def ACI_VERSION
00092  * @brief Current ACI protocol version. 0 means a device that is not yet released.
00093  * A numer greater than 0 refers to a specific ACI version documented and released.
00094  * The ACI consists of the ACI commands, ACI events and error codes.
00095  */
00096 #define ACI_VERSION   (0x02)
00097 /**
00098  * @def BTLE_DEVICE_ADDRESS_SIZE
00099  * @brief Size in bytes of a Bluetooth Address
00100  */
00101 #define BTLE_DEVICE_ADDRESS_SIZE                 (6)
00102 /**
00103  * @def ACI_PACKET_MAX_LEN
00104  * @brief Maximum length in bytes of a full ACI packet, including length prefix, opcode and payload
00105  */
00106 #define ACI_PACKET_MAX_LEN                       (32)
00107 /**
00108  * @def ACI_ECHO_DATA_MAX_LEN
00109  * @brief Maximum length in bytes of the echo data portion
00110  */
00111 #define ACI_ECHO_DATA_MAX_LEN                    (ACI_PACKET_MAX_LEN - 3)
00112 /**
00113  * @def ACI_DEVICE_MAX_PIPES
00114  * @brief Maximum number of ACI pipes
00115  */
00116 #define ACI_DEVICE_MAX_PIPES                       (62)
00117 /**
00118  * @def ACI_PIPE_TX_DATA_MAX_LEN
00119  * @brief Maximum length in bytes of a transmission data pipe packet
00120  */
00121 #define ACI_PIPE_TX_DATA_MAX_LEN                   (20)
00122 /**
00123  * @def ACI_PIPE_RX_DATA_MAX_LEN
00124  * @brief Maximum length in bytes of a reception data pipe packet
00125  */
00126 #define ACI_PIPE_RX_DATA_MAX_LEN                   (22)
00127 /**
00128  * @def ACI_GAP_DEVNAME_MAX_LEN
00129  * @brief Maximum length in bytes of the GAP device name
00130  */
00131 #define ACI_GAP_DEVNAME_MAX_LEN                 (20)
00132 /**
00133  * @def ACI_AD_PACKET_MAX_LEN
00134  * @brief Maximum length in bytes of an AD packet
00135  */
00136 #define ACI_AD_PACKET_MAX_LEN                   (31)
00137 /**
00138  * @def ACI_AD_PACKET_MAX_USER_LEN
00139  * @brief Maximum usable length in bytes of an AD packet
00140  */
00141 #define ACI_AD_PACKET_MAX_USER_LEN              (31 - 3)
00142 /**
00143  * @def ACI_PIPE_INVALID
00144  * @brief Invalid pipe number
00145  */
00146 #define ACI_PIPE_INVALID                        (0xFF)
00147 
00148 /**
00149  * @enum aci_pipe_store_t
00150  * @brief Storage type identifiers: local and remote
00151  */
00152 typedef enum
00153 {
00154   ACI_STORE_INVALID = 0x0,
00155   ACI_STORE_LOCAL= 0x01,
00156   ACI_STORE_REMOTE= 0x02
00157 } _aci_packed_ aci_pipe_store_t;
00158 
00159 /**
00160  * @enum aci_pipe_type_t
00161  * @brief Pipe types
00162  */
00163 typedef enum
00164 {
00165   ACI_TX_BROADCAST = 0x0001,
00166   ACI_TX           = 0x0002,
00167   ACI_TX_ACK       = 0x0004,
00168   ACI_RX           = 0x0008,
00169   ACI_RX_ACK       = 0x0010,
00170   ACI_TX_REQ       = 0x0020,
00171   ACI_RX_REQ       = 0x0040,
00172   ACI_SET          = 0x0080,
00173   ACI_TX_SIGN      = 0x0100,
00174   ACI_RX_SIGN      = 0x0200,
00175   ACI_RX_ACK_AUTO  = 0x0400
00176 } _aci_packed_ aci_pipe_type_t;
00177 
00178 ACI_ASSERT_SIZE(aci_pipe_type_t, 2);
00179 
00180 /**
00181  * @enum aci_bd_addr_type_t
00182  * @brief Bluetooth Address types
00183  */
00184 typedef enum
00185 {
00186   ACI_BD_ADDR_TYPE_INVALID  = 0x00,
00187   ACI_BD_ADDR_TYPE_PUBLIC  = 0x01,
00188   ACI_BD_ADDR_TYPE_RANDOM_STATIC  = 0x02,
00189   ACI_BD_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE  = 0x03,
00190   ACI_BD_ADDR_TYPE_RANDOM_PRIVATE_UNRESOLVABLE  = 0x04
00191 } _aci_packed_ aci_bd_addr_type_t;
00192 
00193 /**
00194  * @enum aci_device_output_power_t
00195  * @brief Radio output power levels
00196  */
00197 typedef enum
00198 {
00199   ACI_DEVICE_OUTPUT_POWER_MINUS_18DBM = 0x00, /**< Output power set to -18dBm */
00200   ACI_DEVICE_OUTPUT_POWER_MINUS_12DBM = 0x01, /**< Output power set to -12dBm */
00201   ACI_DEVICE_OUTPUT_POWER_MINUS_6DBM  = 0x02, /**< Output power set to -6dBm  */
00202   ACI_DEVICE_OUTPUT_POWER_0DBM  = 0x03  /**< Output power set to 0dBm   - DEFAULT*/
00203 } _aci_packed_ aci_device_output_power_t;
00204 
00205 /**
00206  * @enum aci_device_operation_mode_t
00207  * @brief Device operation modes
00208  */
00209 typedef enum
00210 {
00211   ACI_DEVICE_INVALID   =0x00,
00212   ACI_DEVICE_TEST      =0x01,
00213   ACI_DEVICE_SETUP     =0x02,
00214   ACI_DEVICE_STANDBY   =0x03,
00215   ACI_DEVICE_SLEEP     =0x04
00216 } _aci_packed_ aci_device_operation_mode_t;
00217 
00218 /**
00219  * @enum aci_disconnect_reason_t
00220  * @brief Reason enumeration for ACI_CMD_DISCONNECT
00221  */
00222 typedef enum
00223 {
00224   ACI_REASON_TERMINATE      =0x01, /**< Use this to disconnect (does a terminate request), you need to wait for the "disconnected" event */
00225   ACI_REASON_BAD_TIMING     =0x02 /*<Use this to disconnect and inform the peer, that the timing on the link is not acceptable for the device, you need to wait for the "disconnected" event */
00226 } _aci_packed_ aci_disconnect_reason_t;
00227 
00228 /**
00229  * @enum aci_test_mode_change_t
00230  * @brief Device test mode control
00231  */
00232 typedef enum
00233 {
00234   ACI_TEST_MODE_DTM_UART    = 0x01,
00235   ACI_TEST_MODE_DTM_ACI     = 0x02,
00236   ACI_TEST_MODE_EXIT        = 0xFF
00237 
00238 } _aci_packed_ aci_test_mode_change_t;
00239 
00240 ACI_ASSERT_SIZE(aci_test_mode_change_t, 1);
00241 
00242 /**
00243  * @enum aci_permissions_t
00244  * @brief Data store permissions
00245  */
00246 typedef enum
00247 {
00248   ACI_PERMISSIONS_NONE               =0x00,
00249   ACI_PERMISSIONS_LINK_AUTHENTICATED =0x01
00250 } _aci_packed_ aci_permissions_t;
00251 
00252 /**
00253  * @def ACI_VS_UUID_128_MAX_COUNT
00254  * @brief Maximum number of 128-bit Vendor Specific
00255  *        UUIDs that can be set
00256  */
00257 #define ACI_VS_UUID_128_MAX_COUNT  64 /** #0 reserved for invalid, #1 reservered for BT SIG and a maximum of 1024 bytes (16*64) */
00258 
00259 /**
00260  * @struct aci_ll_conn_params_t
00261  * @brief Link Layer Connection Parameters
00262  */
00263 typedef struct
00264 {
00265   uint16_t min_conn_interval;   /**< Minimum connection interval requested from peer */
00266     #define ACI_PPCP_MIN_CONN_INTVL_NONE  0xFFFF
00267     #define ACI_PPCP_MIN_CONN_INTVL_MIN   0x0006
00268     #define ACI_PPCP_MIN_CONN_INTVL_MAX   0x0C80
00269   uint16_t max_conn_interval;   /**< Maximum connection interval requested from peer */
00270     #define ACI_PPCP_MAX_CONN_INTVL_NONE  0xFFFF
00271     #define ACI_PPCP_MAX_CONN_INTVL_MIN   0x0006
00272     #define ACI_PPCP_MAX_CONN_INTVL_MAX   0x0C80
00273   uint16_t slave_latency;       /**< Connection interval latency requested from peer */
00274     #define ACI_PPCP_SLAVE_LATENCY_MAX    0x03E8
00275   uint16_t timeout_mult;        /**< Link supervisor timeout multiplier requested from peer */
00276     #define ACI_PPCP_TIMEOUT_MULT_NONE    0xFFFF
00277     #define ACI_PPCP_TIMEOUT_MULT_MIN     0x000A
00278     #define ACI_PPCP_TIMEOUT_MULT_MAX     0x0C80
00279 } _aci_packed_ aci_ll_conn_params_t;
00280 
00281 /**
00282  * @def aci_gap_ppcp_t
00283  * @brief GAP Peripheral Preferred Connection Parameters
00284  */
00285 #define aci_gap_ppcp_t aci_ll_conn_params_t
00286 
00287 /**
00288  * @def ACI_AD_LOC_SVCUUID_16_MAX_COUNT
00289  * @brief Maximum number of 16-bit UUIDs that can
00290  *        be inserted in the Services tag of AD
00291  */
00292 #define ACI_AD_LOC_SVCUUID_16_MAX_COUNT  5
00293 
00294 /**
00295  * @def ACI_AD_LOC_SVCUUID_128_MAX_COUNT
00296  * @brief Maximum number of 128-bit UUIDs that can
00297  *        be inserted in the Services tag of AD
00298  */
00299 #define ACI_AD_LOC_SVCUUID_128_MAX_COUNT  1
00300 
00301 /**
00302  * @def ACI_AD_SOL_SVCUUID_16_MAX_COUNT
00303  * @brief Maximum number of UUIDs that can
00304  *        be inserted in the Solicited Services tag of AD
00305  */
00306 #define ACI_AD_SOL_SVCUUID_16_MAX_COUNT  5
00307 
00308 /**
00309  * @def ACI_AD_SOL_SVCUUID_128_MAX_COUNT
00310  * @brief Maximum number of UUIDs that can
00311  *        be inserted in the Solicited Services tag of AD
00312  */
00313 #define ACI_AD_SOL_SVCUUID_128_MAX_COUNT  1
00314 
00315 /**
00316  * @def ACI_SEC_ENCKEY_SIZE_MIN
00317  * @brief Minimum encryption key size
00318  */
00319 #define ACI_SEC_ENCKEY_SIZE_MIN        7
00320 /**
00321  * @def ACI_SEC_ENCKEY_SIZE_MAX
00322  * @brief Maximum encryption key size
00323  */
00324 #define ACI_SEC_ENCKEY_SIZE_MAX        16
00325 /**
00326  * @def ACI_CUSTOM_AD_TYPE_MAX_COUNT
00327  * @brief Maximum number of custom ad types
00328  */
00329 #define ACI_CUSTOM_AD_TYPE_MAX_COUNT 8
00330 /**
00331  * @def ACI_CUSTOM_AD_TYPE_MAX_DATA_LENGTH
00332  * @brief Maximum custom ad type data size
00333  */
00334 #define ACI_CUSTOM_AD_TYPE_MAX_DATA_LENGTH 20
00335 
00336 /**
00337  * @struct aci_tx_data_t
00338  * @brief Generic ACI transmit data structure
00339  */
00340 typedef struct
00341 {
00342   uint8_t pipe_number;
00343   uint8_t aci_data[ACI_PIPE_TX_DATA_MAX_LEN];
00344 } _aci_packed_ aci_tx_data_t;
00345 
00346 ACI_ASSERT_SIZE(aci_tx_data_t, ACI_PIPE_TX_DATA_MAX_LEN + 1);
00347 
00348 /**
00349  * @struct aci_rx_data_t
00350  * @brief Generic ACI receive data structure
00351  */
00352 typedef struct
00353 {
00354   uint8_t pipe_number;
00355   uint8_t aci_data[ACI_PIPE_RX_DATA_MAX_LEN];
00356 } _aci_packed_ aci_rx_data_t;
00357 
00358 ACI_ASSERT_SIZE(aci_rx_data_t, ACI_PIPE_RX_DATA_MAX_LEN + 1);
00359 
00360 /**
00361  * @enum aci_hw_error_t
00362  * @brief Hardware Error codes
00363  */
00364 typedef enum
00365 {
00366   ACI_HW_ERROR_NONE     = 0x00,
00367   ACI_HW_ERROR_FATAL    = 0x01
00368 } _aci_packed_ aci_hw_error_t;
00369 
00370 /**
00371  * @enum aci_clock_accuracy_t
00372  * @brief Bluetooth Low Energy Clock Accuracy
00373  */
00374 typedef enum
00375 {
00376   ACI_CLOCK_ACCURACY_500_PPM = 0x00,
00377   ACI_CLOCK_ACCURACY_250_PPM = 0x01,
00378   ACI_CLOCK_ACCURACY_150_PPM = 0x02,
00379   ACI_CLOCK_ACCURACY_100_PPM = 0x03,
00380   ACI_CLOCK_ACCURACY_75_PPM  = 0x04,
00381   ACI_CLOCK_ACCURACY_50_PPM  = 0x05,
00382   ACI_CLOCK_ACCURACY_30_PPM  = 0x06,
00383   ACI_CLOCK_ACCURACY_20_PPM  = 0x07
00384 } _aci_packed_ aci_clock_accuracy_t;
00385 
00386 /**
00387  * @enum aci_app_latency_mode_t
00388  * @brief Application latency modes
00389  */
00390 typedef enum
00391 {
00392   ACI_APP_LATENCY_DISABLE = 0,
00393   ACI_APP_LATENCY_ENABLE = 1
00394 } _aci_packed_ aci_app_latency_mode_t;
00395 
00396 /**
00397  * @enum gatt_format_t
00398  * @brief GATT format definitions
00399  */
00400 typedef enum
00401 {
00402   ACI_GATT_FORMAT_NONE        = 0x00, /**< No characteristic format available */
00403   ACI_GATT_FORMAT_BOOLEAN     = 0x01, /**< Not Supported */
00404   ACI_GATT_FORMAT_2BIT        = 0x02, /**< Not Supported */
00405   ACI_GATT_FORMAT_NIBBLE      = 0x03, /**< Not Supported */
00406   ACI_GATT_FORMAT_UINT8       = 0x04,
00407   ACI_GATT_FORMAT_UINT12      = 0x05,
00408   ACI_GATT_FORMAT_UINT16      = 0x06,
00409   ACI_GATT_FORMAT_UINT24      = 0x07,
00410   ACI_GATT_FORMAT_UINT32      = 0x08,
00411   ACI_GATT_FORMAT_UINT48      = 0x09,
00412   ACI_GATT_FORMAT_UINT64      = 0x0A,
00413   ACI_GATT_FORMAT_UINT128     = 0x0B,
00414   ACI_GATT_FORMAT_SINT8       = 0x0C,
00415   ACI_GATT_FORMAT_SINT12      = 0x0D,
00416   ACI_GATT_FORMAT_SINT16      = 0x0E,
00417   ACI_GATT_FORMAT_SINT24      = 0x0F,
00418   ACI_GATT_FORMAT_SINT32      = 0x10,
00419   ACI_GATT_FORMAT_SINT48      = 0x11,
00420   ACI_GATT_FORMAT_SINT64      = 0x12,
00421   ACI_GATT_FORMAT_SINT128     = 0x13,
00422   ACI_GATT_FORMAT_FLOAT32     = 0x14,
00423   ACI_GATT_FORMAT_FLOAT64     = 0x15,
00424   ACI_GATT_FORMAT_SFLOAT      = 0x16,
00425   ACI_GATT_FORMAT_FLOAT       = 0x17,
00426   ACI_GATT_FORMAT_DUINT16     = 0x18,
00427   ACI_GATT_FORMAT_UTF8S       = 0x19,
00428   ACI_GATT_FORMAT_UTF16S      = 0x1A,
00429   ACI_GATT_FORMAT_STRUCT      = 0x1B
00430 } _aci_packed_ aci_gatt_format_t;
00431 
00432 /**
00433  * @brief GATT Bluetooth namespace
00434  */
00435 typedef enum
00436 {
00437   ACI_GATT_NAMESPACE_INVALID  = 0x00,
00438   ACI_GATT_NAMESPACE_BTSIG    = 0x01 /**< Bluetooth SIG */
00439 } _aci_packed_ aci_gatt_namespace_t;
00440 
00441 /**
00442  * @brief Security key types
00443  */
00444 typedef enum
00445 {
00446   ACI_KEY_TYPE_INVALID  = 0x00,
00447   ACI_KEY_TYPE_PASSKEY  = 0x01
00448 } _aci_packed_ aci_key_type_t;
00449 
00450 /**
00451  * @enum aci_bond_status_code_t
00452  * @brief Bond status code
00453  */
00454 typedef enum
00455 {
00456  /**
00457   * Bonding succeeded
00458   */
00459   ACI_BOND_STATUS_SUCCESS                             = 0x00,
00460  /**
00461   * Bonding failed
00462   */
00463   ACI_BOND_STATUS_FAILED                              = 0x01,
00464  /**
00465   * Bonding error: Timeout can occur when link termination is unexpected or did not get connected OR SMP timer expired
00466   */
00467   ACI_BOND_STATUS_FAILED_TIMED_OUT                    = 0x02,
00468  /**
00469   * Bonding error: Passkey entry failed
00470   */
00471   ACI_BOND_STATUS_FAILED_PASSKEY_ENTRY_FAILED        = 0x81,
00472  /**
00473   * Bonding error: OOB unavailable
00474   */
00475   ACI_BOND_STATUS_FAILED_OOB_UNAVAILABLE             = 0x82,
00476  /**
00477   * Bonding error: Authentication request failed
00478   */
00479   ACI_BOND_STATUS_FAILED_AUTHENTICATION_REQ          = 0x83,
00480  /**
00481   * Bonding error: Confirm value failed
00482   */
00483   ACI_BOND_STATUS_FAILED_CONFIRM_VALUE               = 0x84,
00484  /**
00485   * Bonding error: Pairing unsupported
00486   */
00487   ACI_BOND_STATUS_FAILED_PAIRING_UNSUPPORTED         = 0x85,
00488  /**
00489   * Bonding error: Invalid encryption key size
00490   */
00491   ACI_BOND_STATUS_FAILED_ENCRYPTION_KEY_SIZE         = 0x86,
00492  /**
00493   * Bonding error: Unsupported SMP command
00494   */
00495   ACI_BOND_STATUS_FAILED_SMP_CMD_UNSUPPORTED         = 0x87,
00496  /**
00497   * Bonding error: Unspecified reason
00498   */
00499   ACI_BOND_STATUS_FAILED_UNSPECIFIED_REASON          = 0x88,
00500  /**
00501   * Bonding error: Too many attempts
00502   */
00503   ACI_BOND_STATUS_FAILED_REPEATED_ATTEMPTS           = 0x89,
00504  /**
00505   * Bonding error: Invalid parameters
00506   */
00507   ACI_BOND_STATUS_FAILED_INVALID_PARAMETERS          = 0x8A
00508 
00509 } _aci_packed_ aci_bond_status_code_t;
00510 
00511 ACI_ASSERT_SIZE(aci_bond_status_code_t, 1);
00512 
00513 /**
00514  * @enum aci_bond_status_source_t
00515  * @brief Source of a bond status code
00516  */
00517 typedef enum
00518 {
00519   ACI_BOND_STATUS_SOURCE_INVALID                  = 0x00,
00520   ACI_BOND_STATUS_SOURCE_LOCAL                    = 0x01,
00521   ACI_BOND_STATUS_SOURCE_REMOTE                   = 0x02
00522 
00523 } _aci_packed_ aci_bond_status_source_t;
00524 
00525 /**
00526  * @enum aci_status_code_t
00527  * @brief ACI status codes
00528  */
00529 typedef enum
00530 {
00531  /**
00532   * Success
00533   */
00534   ACI_STATUS_SUCCESS                                        = 0x00,
00535  /**
00536   * Transaction continuation status
00537   */
00538   ACI_STATUS_TRANSACTION_CONTINUE                           = 0x01,
00539  /**
00540   * Transaction completed
00541   */
00542   ACI_STATUS_TRANSACTION_COMPLETE                           = 0x02,
00543  /**
00544   * Extended status, further checks needed
00545   */
00546   ACI_STATUS_EXTENDED                                       = 0x03,
00547  /**
00548   * Unknown error.
00549   */
00550   ACI_STATUS_ERROR_UNKNOWN                                  = 0x80,
00551  /**
00552   * Internal error.
00553   */
00554   ACI_STATUS_ERROR_INTERNAL                                 = 0x81,
00555  /**
00556   * Unknown command
00557   */
00558   ACI_STATUS_ERROR_CMD_UNKNOWN                              = 0x82,
00559  /**
00560   * Command invalid in the current device state
00561   */
00562   ACI_STATUS_ERROR_DEVICE_STATE_INVALID                     = 0x83,
00563  /**
00564   * Invalid length
00565   */
00566   ACI_STATUS_ERROR_INVALID_LENGTH                           = 0x84,
00567  /**
00568   * Invalid input parameters
00569   */
00570   ACI_STATUS_ERROR_INVALID_PARAMETER                        = 0x85,
00571  /**
00572   * Busy
00573   */
00574   ACI_STATUS_ERROR_BUSY                                     = 0x86,
00575  /**
00576   * Invalid data format or contents
00577   */
00578   ACI_STATUS_ERROR_INVALID_DATA                             = 0x87,
00579  /**
00580   * CRC mismatch
00581   */
00582   ACI_STATUS_ERROR_CRC_MISMATCH                             = 0x88,
00583  /**
00584   * Unsupported setup format
00585   */
00586   ACI_STATUS_ERROR_UNSUPPORTED_SETUP_FORMAT                 = 0x89,
00587  /**
00588   * Invalid sequence number during a write dynamic data sequence
00589   */
00590   ACI_STATUS_ERROR_INVALID_SEQ_NO                           = 0x8A,
00591  /**
00592   * Setup data is locked and cannot be modified
00593   */
00594   ACI_STATUS_ERROR_SETUP_LOCKED                             = 0x8B,
00595  /**
00596   * Setup error due to lock verification failure
00597   */
00598   ACI_STATUS_ERROR_LOCK_FAILED                              = 0x8C,
00599  /**
00600   * Bond required: Local Pipes need bonded/trusted peer
00601   */
00602   ACI_STATUS_ERROR_BOND_REQUIRED                            = 0x8D,
00603  /**
00604   * Command rejected as a transaction is still pending
00605   */
00606   ACI_STATUS_ERROR_REJECTED                                 = 0x8E,
00607   /**
00608   * Pipe Error Event : Data size exceeds size specified for pipe : Transmit failed
00609   */
00610   ACI_STATUS_ERROR_DATA_SIZE                                = 0x8F,
00611  /**
00612   * Pipe Error Event : Invalid pipe
00613   */
00614   ACI_STATUS_ERROR_PIPE_INVALID                             = 0x90,
00615  /**
00616   * Pipe Error Event : Credit not available
00617   */
00618   ACI_STATUS_ERROR_CREDIT_NOT_AVAILABLE                     = 0x91,
00619  /**
00620   * Pipe Error Event : Peer device has sent an error on an pipe operation on the remote characteristic
00621   */
00622   ACI_STATUS_ERROR_PEER_ATT_ERROR                           = 0x92,
00623  /**
00624   * Connection was not established before the BTLE advertising was stopped
00625   */
00626   ACI_STATUS_ERROR_ADVT_TIMEOUT                             = 0x93,
00627  /**
00628   * Peer has triggered a Security Manager Protocol Error
00629   */
00630   ACI_STATUS_ERROR_PEER_SMP_ERROR                           = 0x94,
00631  /**
00632   * Pipe Error Event : Pipe type invalid for the selected operation
00633   */
00634   ACI_STATUS_ERROR_PIPE_TYPE_INVALID                        = 0x95,
00635  /**
00636   * Pipe Error Event : Pipe state invalid for the selected operation
00637   */
00638   ACI_STATUS_ERROR_PIPE_STATE_INVALID                       = 0x96,
00639  /**
00640   * Invalid key size provided
00641   */
00642   ACI_STATUS_ERROR_INVALID_KEY_SIZE                         = 0x97,
00643  /**
00644   * Invalid key data provided
00645   */
00646   ACI_STATUS_ERROR_INVALID_KEY_DATA                         = 0x98,
00647  /**
00648   * Reserved range start
00649   */
00650   ACI_STATUS_RESERVED_START                                 = 0xF0,
00651  /**
00652   * Reserved range end
00653   */
00654   ACI_STATUS_RESERVED_END                                   = 0xFF
00655 
00656 } _aci_packed_ aci_status_code_t;
00657 
00658 ACI_ASSERT_SIZE(aci_status_code_t, 1);
00659 
00660 /**
00661  * @}
00662  */
00663 
00664 #endif // ACI_H__