1 /* Copyright (c) 2014, Nordic Semiconductor ASA
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining a copy
4  * of this software and associated documentation files (the "Software"), to deal
5  * in the Software without restriction, including without limitation the rights
6  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7  * copies of the Software, and to permit persons to whom the Software is
8  * furnished to do so, subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in all
11  * copies or substantial portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19  * SOFTWARE.
20  */
21 
22 /**
23  * @file
24  *
25  * @ingroup aci
26  *
27  * @brief Definitions for the ACI (Application Control Interface) events
28  */
29 
30 #ifndef ACI_EVTS_H__
31 #define ACI_EVTS_H__
32 
33 #include "aci.h"
34 
35 /**
36  * @enum aci_evt_opcode_t
37  * @brief ACI event opcodes
38  */
39 typedef enum
40 {
41  /**
42   * Invalid event code
43   */
44   ACI_EVT_INVALID                     = 0x00,
45  /**
46   * Sent every time the device starts
47   */
48   ACI_EVT_DEVICE_STARTED              = 0x81,
49  /**
50   * Mirrors the ACI_CMD_ECHO
51   */
52   ACI_EVT_ECHO                        = 0x82,
53  /**
54   * Asynchronous hardware error event
55   */
56   ACI_EVT_HW_ERROR                  = 0x83,
57  /**
58   * Event opcode used as a event response for all commands
59   */
60   ACI_EVT_CMD_RSP                     = 0x84,
61  /**
62   * Link connected
63   */
64   ACI_EVT_CONNECTED                   = 0x85,
65  /**
66   * Link disconnected
67   */
68   ACI_EVT_DISCONNECTED                = 0x86,
69  /**
70   * Bond completion result
71   */
72   ACI_EVT_BOND_STATUS                 = 0x87,
73   /**
74   * Pipe bitmap for available pipes
75   */
76   ACI_EVT_PIPE_STATUS             = 0x88,
77  /**
78   * Sent to the application when the radio enters a connected state
79   * or when the timing of the radio connection changes
80   */
81   ACI_EVT_TIMING                      = 0x89,
82  /**
83   * Notification to the application that transmit credits are
84   * available
85   */
86   ACI_EVT_DATA_CREDIT                 = 0x8A,
87  /**
88   * Data acknowledgement event
89   */
90   ACI_EVT_DATA_ACK                    = 0x8B,
91  /**
92   * Data received notification event
93   */
94   ACI_EVT_DATA_RECEIVED               = 0x8C,
95  /**
96   * Error notification event
97   */
98   ACI_EVT_PIPE_ERROR                  = 0x8D,
99  /**
100   * Display Passkey Event
101   */
102   ACI_EVT_DISPLAY_PASSKEY             = 0x8E,
103  /**
104   * Security Key request
105   */
106   ACI_EVT_KEY_REQUEST                 = 0x8F
107 
108 } _aci_packed_ aci_evt_opcode_t;
109 
110 ACI_ASSERT_SIZE(aci_evt_opcode_t, 1);
111 
112 /**
113  * @struct aci_evt_params_device_started_t
114  * @brief Structure for the ACI_EVT_DEVICE_STARTED event return parameters
115  */
116 typedef struct
117 {
118   aci_device_operation_mode_t device_mode; /**< Mode in which the device is being started */
119   aci_hw_error_t hw_error;  /**< Hardware Error if available for the start */
120   uint8_t credit_available; /**< Flow control credit available for this specific FW build */
121 } _aci_packed_ aci_evt_params_device_started_t;
122 
123 ACI_ASSERT_SIZE(aci_evt_params_device_started_t, 3);
124 
125 /**
126  * @struct aci_evt_params_hw_error_t
127  * @brief Structure for the ACI_EVT_HW_ERROR event return parameters
128  */
129 typedef struct
130 {
131   uint16_t line_num;
132   uint8_t file_name[20];
133 } _aci_packed_ aci_evt_params_hw_error_t;
134 
135 ACI_ASSERT_SIZE(aci_evt_params_hw_error_t, 22);
136 
137 /**
138  * @struct aci_evt_cmd_rsp_params_dtm_cmd_t
139  * @brief Structure for the ACI_EVT_CMD_RSP event with opcode=ACI_CMD_DTM_CMD event return parameters
140  */
141 typedef struct
142 {
143   uint8_t  evt_msb;
144   uint8_t  evt_lsb;
145 } _aci_packed_ aci_evt_cmd_rsp_params_dtm_cmd_t;
146 
147 /**
148  * @struct aci_evt_cmd_rsp_read_dynamic_data_t
149  * @brief Structure for the ACI_EVT_CMD_RSP event with opcode=ACI_CMD_READ_DYNAMIC_DATA event return parameters
150  * @note Dynamic data chunk size in this event is defined to go up to ACI_PACKET_MAX_LEN - 5
151  */
152 typedef struct
153 {
154   uint8_t seq_no;
155   uint8_t dynamic_data[1];
156 } _aci_packed_ aci_evt_cmd_rsp_read_dynamic_data_t;
157 
158 /**
159  * @struct aci_evt_cmd_rsp_params_get_device_version_t
160  * @brief Structure for the ACI_EVT_CMD_RSP event with opcode=ACI_CMD_GET_DEVICE_VERSION event return parameters
161  */
162 typedef struct
163 {
164   uint16_t  configuration_id;
165   uint8_t   aci_version;
166   uint8_t   setup_format;
167   uint32_t  setup_id;
168   uint8_t   setup_status;
169 } _aci_packed_ aci_evt_cmd_rsp_params_get_device_version_t;
170 
171 ACI_ASSERT_SIZE(aci_evt_cmd_rsp_params_get_device_version_t, 9);
172 
173 /**
174  * @struct aci_evt_cmd_rsp_params_get_device_address_t
175  * @brief Structure for the ACI_EVT_CMD_RSP event with opcode=ACI_CMD_GET_DEVICE_ADDRESS event return parameters
176  */
177 typedef struct
178 {
179   uint8_t  bd_addr_own[BTLE_DEVICE_ADDRESS_SIZE];
180   aci_bd_addr_type_t bd_addr_type;
181 } _aci_packed_ aci_evt_cmd_rsp_params_get_device_address_t;
182 
183 ACI_ASSERT_SIZE(aci_evt_cmd_rsp_params_get_device_address_t, BTLE_DEVICE_ADDRESS_SIZE + 1);
184 
185 /**
186  * @struct aci_evt_cmd_rsp_params_get_battery_level_t
187  * @brief Structure for the ACI_EVT_CMD_RSP event with opcode=ACI_CMD_GET_BATTERY_LEVEL event return parameters
188  */
189 typedef struct
190 {
191   uint16_t battery_level;
192 } _aci_packed_ aci_evt_cmd_rsp_params_get_battery_level_t;
193 
194 /**
195  * @struct aci_evt_cmd_rsp_params_get_temperature_t
196  * @brief Structure for the ACI_EVT_CMD_RSP event with opcode=ACI_CMD_GET_TEMPERATURE event return parameters
197  */
198 typedef struct
199 {
200   int16_t temperature_value;
201 } _aci_packed_ aci_evt_cmd_rsp_params_get_temperature_t;
202 
203 /**
204  * @struct aci_evt_params_cmd_rsp_t
205  * @brief Structure for the ACI_EVT_CMD_RSP event return parameters
206  */
207 typedef struct
208 {
209   aci_cmd_opcode_t cmd_opcode; /**< Command opcode for which the event response is being sent */
210   aci_status_code_t cmd_status; /**< Status of the command that was sent. Used in the context of the command. */
211   union
212   {
213     aci_evt_cmd_rsp_params_dtm_cmd_t dtm_cmd;
214     aci_evt_cmd_rsp_read_dynamic_data_t read_dynamic_data;
215     aci_evt_cmd_rsp_params_get_device_version_t get_device_version;
216     aci_evt_cmd_rsp_params_get_device_address_t get_device_address;
217     aci_evt_cmd_rsp_params_get_battery_level_t  get_battery_level;
218     aci_evt_cmd_rsp_params_get_temperature_t    get_temperature;
219     uint8_t                                     padding[29];
220   } params;
221 } _aci_packed_ aci_evt_params_cmd_rsp_t;
222 
223 ACI_ASSERT_SIZE(aci_evt_params_cmd_rsp_t, 31);
224 
225 /**
226  * @struct aci_evt_params_connected_t
227  * @brief Structure for the ACI_EVT_CONNECTED event return parameters
228  */
229 typedef struct
230 {
231   aci_bd_addr_type_t dev_addr_type;
232   uint8_t  dev_addr[BTLE_DEVICE_ADDRESS_SIZE];
233   uint16_t conn_rf_interval;  /**< rf_interval = conn_rf_interval * 1.25 ms Range:0x0006 to 0x0C80 */
234   uint16_t conn_slave_rf_latency; /**< Number of RF events the slave can skip */
235   uint16_t conn_rf_timeout; /**< Timeout as a multiple of 10ms i.e timeout = conn_rf_timeout * 10ms Range: 0x000A to 0x0C80 */
236   aci_clock_accuracy_t master_clock_accuracy; /**< Clock accuracy of Bluetooth master: Enumerated list of values from 500 ppm to 20 ppm */
237 } _aci_packed_ aci_evt_params_connected_t;
238 
239 ACI_ASSERT_SIZE(aci_evt_params_connected_t, 14);
240 
241 /**
242  * @struct aci_evt_params_disconnected_t
243  * @brief Structure for the ACI_EVT_DISCONNECTED event return parameters
244  */
245 typedef struct
246 {
247   aci_status_code_t   aci_status;
248   uint8_t btle_status;
249 } _aci_packed_ aci_evt_params_disconnected_t;
250 
251 ACI_ASSERT_SIZE(aci_evt_params_disconnected_t, 2);
252 
253 /**
254  * @struct aci_evt_params_bond_status_t
255  * @brief Structure for the ACI_EVT_BOND_STATUS event return parameters
256  */
257 typedef struct
258 {
259   aci_bond_status_code_t status_code;
260   aci_bond_status_source_t status_source;
261   uint8_t secmode1_bitmap;
262   uint8_t secmode2_bitmap;
263   uint8_t keys_exchanged_slave;
264   uint8_t keys_exchanged_master;
265 } _aci_packed_ aci_evt_params_bond_status_t;
266 
267 ACI_ASSERT_SIZE(aci_evt_params_bond_status_t, 6);
268 
269 /**
270  * @struct aci_evt_params_pipe_status_t
271  * @brief Structure for the ACI_EVT_PIPE_STATUS event return parameters
272  */
273 typedef struct
274 {
275   uint8_t  pipes_open_bitmap[8];
276   uint8_t  pipes_closed_bitmap[8];
277 } _aci_packed_ aci_evt_params_pipe_status_t;
278 
279 ACI_ASSERT_SIZE(aci_evt_params_pipe_status_t, 16);
280 
281 /**
282  * @struct aci_evt_params_timing_t
283  * @brief Structure for the ACI_EVT_TIMING event return parameters
284  */
285 typedef struct
286 {
287   uint16_t conn_rf_interval;  /**< rf_interval = conn_rf_interval * 1.25 ms Range:0x0006 to 0x0C80 */
288   uint16_t conn_slave_rf_latency; /**< Number of RF events the slave can skip */
289   uint16_t conn_rf_timeout; /**< Timeout as a multiple of 10ms i.e timeout = conn_rf_timeout * 10ms Range: 0x000A to 0x0C80 */
290 } _aci_packed_ aci_evt_params_timing_t;
291 
292 ACI_ASSERT_SIZE(aci_evt_params_timing_t, 6);
293 
294 /**
295  * @struct aci_evt_params_data_credit_t
296  * @brief Structure for the ACI_EVT_DATA_CREDIT event return parameters
297  */
298 typedef struct
299 {
300   uint8_t credit;
301 } _aci_packed_ aci_evt_params_data_credit_t;
302 
303 /**
304  * @struct aci_evt_params_data_ack_t
305  * @brief Structure for the ACI_EVT_DATA_ACK event return parameters
306  */
307 typedef struct
308 {
309   uint8_t pipe_number;
310 } _aci_packed_ aci_evt_params_data_ack_t;
311 
312 /**
313  * @struct aci_evt_params_data_received_t
314  * @brief Structure for the ACI_EVT_DATA_RECEIVED event return parameters
315  */
316 typedef struct
317 {
318   aci_rx_data_t rx_data;
319 } _aci_packed_ aci_evt_params_data_received_t;
320 
321 typedef struct
322 {
323   uint8_t content[1];
324 } _aci_packed_ error_data_t;
325 
326 /**
327  * @struct aci_evt_params_pipe_error_t
328  * @brief Structure for the ACI_EVT_PIPE_ERROR event return parameters
329  */
330 typedef struct
331 {
332   uint8_t pipe_number;
333   uint8_t error_code;
334   union
335   {
336     error_data_t  error_data;
337   } params;
338 } _aci_packed_ aci_evt_params_pipe_error_t;
339 
340 /**
341  * @struct aci_evt_params_display_passkey_t
342  * @brief Structure for the ACI_EVT_DISPLAY_PASSKEY event return parameters
343  */
344 typedef struct
345 {
346   uint8_t passkey[6];
347 } _aci_packed_ aci_evt_params_display_passkey_t;
348 
349 /**
350  * @struct aci_evt_params_key_request_t
351  * @brief Structure for the ACI_EVT_KEY_REQUEST event return parameters
352  */
353 typedef struct
354 {
355   aci_key_type_t key_type;
356 } _aci_packed_ aci_evt_params_key_request_t;
357 
358 /**
359  * @struct aci_event_params_echo_t
360  * @brief  Structure for the ACI_EVT_ECHO ACI event parameters
361  */
362 typedef struct
363 {
364   uint8_t echo_data[ACI_ECHO_DATA_MAX_LEN];
365 } _aci_packed_ aci_evt_params_echo_t;
366 
367 /**
368  * @struct aci_evt_t
369  * @brief  Encapsulates a generic ACI event
370  */
371 typedef struct
372 {
373   uint8_t len;
374   aci_evt_opcode_t evt_opcode;
375   union
376   {
377     aci_evt_params_device_started_t                     device_started;
378     aci_evt_params_echo_t                               echo;
379     aci_evt_params_hw_error_t                           hw_error;
380     aci_evt_params_cmd_rsp_t                            cmd_rsp;
381     aci_evt_params_connected_t                          connected;
382     aci_evt_params_disconnected_t                       disconnected;
383     aci_evt_params_bond_status_t                        bond_status;
384     aci_evt_params_pipe_status_t                        pipe_status;
385     aci_evt_params_timing_t                             timing;
386     aci_evt_params_data_credit_t                        data_credit;
387     aci_evt_params_data_ack_t                           data_ack;
388     aci_evt_params_data_received_t                      data_received;
389     aci_evt_params_pipe_error_t                         pipe_error;
390     aci_evt_params_display_passkey_t                    display_passkey;
391     aci_evt_params_key_request_t                        key_request;
392   } params;
393 } _aci_packed_ aci_evt_t;
394 
395 ACI_ASSERT_SIZE(aci_evt_t, 33);
396 
397 #endif // ACI_EVTS_H__
398