[457] | 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 group_acilib
|
---|
| 26 | *
|
---|
| 27 | * @brief Implementation of the acilib module.
|
---|
| 28 | */
|
---|
| 29 |
|
---|
| 30 |
|
---|
| 31 | #include "hal_platform.h"
|
---|
| 32 | #include "aci.h"
|
---|
| 33 | #include "aci_cmds.h"
|
---|
| 34 | #include "aci_evts.h"
|
---|
| 35 | #include "acilib.h"
|
---|
| 36 | #include "aci_protocol_defines.h"
|
---|
| 37 | #include "acilib_defs.h"
|
---|
| 38 | #include "acilib_if.h"
|
---|
| 39 | #include "acilib_types.h"
|
---|
| 40 |
|
---|
| 41 |
|
---|
| 42 | void acil_encode_cmd_set_test_mode(uint8_t *buffer, aci_cmd_params_test_t *p_aci_cmd_params_test)
|
---|
| 43 | {
|
---|
| 44 | *(buffer + OFFSET_ACI_CMD_T_LEN) = 2;
|
---|
| 45 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_TEST;
|
---|
| 46 | *(buffer + OFFSET_ACI_CMD_T_TEST + OFFSET_ACI_CMD_PARAMS_TEST_T_TEST_MODE_CHANGE) = p_aci_cmd_params_test->test_mode_change;
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | void acil_encode_cmd_sleep(uint8_t *buffer)
|
---|
| 50 | {
|
---|
| 51 | *(buffer + OFFSET_ACI_CMD_T_LEN) = 1;
|
---|
| 52 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_SLEEP;
|
---|
| 53 | }
|
---|
| 54 |
|
---|
| 55 | void acil_encode_cmd_get_device_version(uint8_t *buffer)
|
---|
| 56 | {
|
---|
| 57 | *(buffer + OFFSET_ACI_CMD_T_LEN) = 1;
|
---|
| 58 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_GET_DEVICE_VERSION;
|
---|
| 59 | }
|
---|
| 60 |
|
---|
| 61 | void acil_encode_cmd_set_local_data(uint8_t *buffer, aci_cmd_params_set_local_data_t *p_aci_cmd_params_set_local_data, uint8_t data_size)
|
---|
| 62 | {
|
---|
| 63 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_SET_LOCAL_DATA_BASE_LEN + data_size;
|
---|
| 64 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_SET_LOCAL_DATA;
|
---|
| 65 | *(buffer + OFFSET_ACI_CMD_T_SET_LOCAL_DATA + OFFSET_ACI_CMD_PARAMS_SEND_DATA_T_TX_DATA + OFFSET_ACI_TX_DATA_T_PIPE_NUMBER) = p_aci_cmd_params_set_local_data->tx_data.pipe_number;
|
---|
| 66 | memcpy(buffer + OFFSET_ACI_CMD_T_SET_LOCAL_DATA + OFFSET_ACI_CMD_PARAMS_SEND_DATA_T_TX_DATA + OFFSET_ACI_TX_DATA_T_ACI_DATA, &(p_aci_cmd_params_set_local_data->tx_data.aci_data[0]), data_size);
|
---|
| 67 | }
|
---|
| 68 |
|
---|
| 69 | void acil_encode_cmd_connect(uint8_t *buffer, aci_cmd_params_connect_t *p_aci_cmd_params_connect)
|
---|
| 70 | {
|
---|
| 71 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_CONNECT_LEN;
|
---|
| 72 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_CONNECT;
|
---|
| 73 | *(buffer + OFFSET_ACI_CMD_T_CONNECT + OFFSET_ACI_CMD_PARAMS_CONNECT_T_TIMEOUT_MSB) = (uint8_t)(p_aci_cmd_params_connect->timeout >> 8);
|
---|
| 74 | *(buffer + OFFSET_ACI_CMD_T_CONNECT + OFFSET_ACI_CMD_PARAMS_CONNECT_T_TIMEOUT_LSB) = (uint8_t)(p_aci_cmd_params_connect->timeout);
|
---|
| 75 | *(buffer + OFFSET_ACI_CMD_T_CONNECT + OFFSET_ACI_CMD_PARAMS_CONNECT_T_ADV_INTERVAL_MSB) = (uint8_t)(p_aci_cmd_params_connect->adv_interval >> 8);
|
---|
| 76 | *(buffer + OFFSET_ACI_CMD_T_CONNECT + OFFSET_ACI_CMD_PARAMS_CONNECT_T_ADV_INTERVAL_LSB) = (uint8_t)(p_aci_cmd_params_connect->adv_interval);
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | void acil_encode_cmd_bond(uint8_t *buffer, aci_cmd_params_bond_t *p_aci_cmd_params_bond)
|
---|
| 80 | {
|
---|
| 81 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_BOND_LEN;
|
---|
| 82 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_BOND;
|
---|
| 83 | *(buffer + OFFSET_ACI_CMD_T_BOND + OFFSET_ACI_CMD_PARAMS_BOND_T_TIMEOUT_MSB) = (uint8_t)(p_aci_cmd_params_bond->timeout >> 8);
|
---|
| 84 | *(buffer + OFFSET_ACI_CMD_T_BOND + OFFSET_ACI_CMD_PARAMS_BOND_T_TIMEOUT_LSB) = (uint8_t)(p_aci_cmd_params_bond->timeout);
|
---|
| 85 | *(buffer + OFFSET_ACI_CMD_T_BOND + OFFSET_ACI_CMD_PARAMS_BOND_T_ADV_INTERVAL_MSB) = (uint8_t)(p_aci_cmd_params_bond->adv_interval >> 8);
|
---|
| 86 | *(buffer + OFFSET_ACI_CMD_T_BOND + OFFSET_ACI_CMD_PARAMS_BOND_T_ADV_INTERVAL_LSB) = (uint8_t)(p_aci_cmd_params_bond->adv_interval);
|
---|
| 87 | }
|
---|
| 88 |
|
---|
| 89 | void acil_encode_cmd_disconnect(uint8_t *buffer, aci_cmd_params_disconnect_t *p_aci_cmd_params_disconnect)
|
---|
| 90 | {
|
---|
| 91 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_DISCONNECT_LEN;
|
---|
| 92 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_DISCONNECT;
|
---|
| 93 | *(buffer + OFFSET_ACI_CMD_T_DISCONNECT + OFFSET_ACI_CMD_PARAMS_DISCONNECT_T_REASON) = (uint8_t)(p_aci_cmd_params_disconnect->reason);
|
---|
| 94 | }
|
---|
| 95 |
|
---|
| 96 | void acil_encode_baseband_reset(uint8_t *buffer)
|
---|
| 97 | {
|
---|
| 98 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_BASEBAND_RESET_LEN;
|
---|
| 99 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_RADIO_RESET;
|
---|
| 100 | }
|
---|
| 101 |
|
---|
| 102 | void acil_encode_direct_connect(uint8_t *buffer)
|
---|
| 103 | {
|
---|
| 104 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_DIRECT_CONNECT_LEN;
|
---|
| 105 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_CONNECT_DIRECT;
|
---|
| 106 | }
|
---|
| 107 |
|
---|
| 108 | void acil_encode_cmd_wakeup(uint8_t *buffer)
|
---|
| 109 | {
|
---|
| 110 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_WAKEUP_LEN;
|
---|
| 111 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_WAKEUP;
|
---|
| 112 | }
|
---|
| 113 |
|
---|
| 114 | void acil_encode_cmd_set_radio_tx_power(uint8_t *buffer, aci_cmd_params_set_tx_power_t *p_aci_cmd_params_set_tx_power)
|
---|
| 115 | {
|
---|
| 116 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_SET_RADIO_TX_POWER_LEN;
|
---|
| 117 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_SET_TX_POWER;
|
---|
| 118 | *(buffer + OFFSET_ACI_CMD_T_SET_TX_POWER + OFFSET_ACI_CMD_PARAMS_SET_TX_POWER_T_DEVICE_POWER) = (uint8_t)p_aci_cmd_params_set_tx_power->device_power;
|
---|
| 119 | }
|
---|
| 120 |
|
---|
| 121 | void acil_encode_cmd_get_address(uint8_t *buffer)
|
---|
| 122 | {
|
---|
| 123 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_GET_DEVICE_ADDR_LEN;
|
---|
| 124 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_GET_DEVICE_ADDRESS;
|
---|
| 125 | }
|
---|
| 126 |
|
---|
| 127 | void acil_encode_cmd_send_data(uint8_t *buffer, aci_cmd_params_send_data_t *p_aci_cmd_params_send_data_t, uint8_t data_size)
|
---|
| 128 | {
|
---|
| 129 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_SEND_DATA_BASE_LEN + data_size;
|
---|
| 130 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_SEND_DATA;
|
---|
| 131 | *(buffer + OFFSET_ACI_CMD_T_SEND_DATA + OFFSET_ACI_CMD_PARAMS_SEND_DATA_T_TX_DATA + OFFSET_ACI_TX_DATA_T_PIPE_NUMBER) = p_aci_cmd_params_send_data_t->tx_data.pipe_number;
|
---|
| 132 | memcpy((buffer + OFFSET_ACI_CMD_T_SEND_DATA + OFFSET_ACI_CMD_PARAMS_SEND_DATA_T_TX_DATA + OFFSET_ACI_TX_DATA_T_ACI_DATA), &(p_aci_cmd_params_send_data_t->tx_data.aci_data[0]), data_size);
|
---|
| 133 | }
|
---|
| 134 |
|
---|
| 135 | void acil_encode_cmd_request_data(uint8_t *buffer, aci_cmd_params_request_data_t *p_aci_cmd_params_request_data)
|
---|
| 136 | {
|
---|
| 137 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_DATA_REQUEST_LEN;
|
---|
| 138 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_REQUEST_DATA;
|
---|
| 139 | *(buffer + OFFSET_ACI_CMD_T_REQUEST_DATA + OFFSET_ACI_CMD_PARAMS_REQUEST_DATA_T_PIPE_NUMBER) = p_aci_cmd_params_request_data->pipe_number;
|
---|
| 140 | }
|
---|
| 141 |
|
---|
| 142 | void acil_encode_cmd_open_remote_pipe(uint8_t *buffer, aci_cmd_params_open_remote_pipe_t *p_aci_cmd_params_open_remote_pipe)
|
---|
| 143 | {
|
---|
| 144 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_OPEN_REMOTE_PIPE_LEN;
|
---|
| 145 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_OPEN_REMOTE_PIPE;
|
---|
| 146 | *(buffer + OFFSET_ACI_CMD_T_OPEN_REMOTE_PIPE + OFFSET_ACI_CMD_PARAMS_OPEN_REMOTE_PIPE_T_PIPE_NUMBER) = p_aci_cmd_params_open_remote_pipe->pipe_number;
|
---|
| 147 | }
|
---|
| 148 |
|
---|
| 149 | void acil_encode_cmd_close_remote_pipe(uint8_t *buffer, aci_cmd_params_close_remote_pipe_t *p_aci_cmd_params_close_remote_pipe)
|
---|
| 150 | {
|
---|
| 151 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_CLOSE_REMOTE_PIPE_LEN;
|
---|
| 152 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_CLOSE_REMOTE_PIPE;
|
---|
| 153 | *(buffer + OFFSET_ACI_CMD_T_CLOSE_REMOTE_PIPE + OFFSET_ACI_CMD_PARAMS_CLOSE_REMOTE_PIPE_T_PIPE_NUMBER) = p_aci_cmd_params_close_remote_pipe->pipe_number;
|
---|
| 154 | }
|
---|
| 155 |
|
---|
| 156 | void acil_encode_cmd_echo_msg(uint8_t *buffer, aci_cmd_params_echo_t *p_cmd_params_echo, uint8_t msg_size)
|
---|
| 157 | {
|
---|
| 158 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_ECHO_MSG_CMD_BASE_LEN + msg_size;
|
---|
| 159 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_ECHO;
|
---|
| 160 | memcpy((buffer + OFFSET_ACI_CMD_T_ECHO + OFFSET_ACI_CMD_PARAMS_ECHO_T_ECHO_DATA), &(p_cmd_params_echo->echo_data[0]), msg_size);
|
---|
| 161 | }
|
---|
| 162 |
|
---|
| 163 | void acil_encode_cmd_battery_level(uint8_t *buffer)
|
---|
| 164 | {
|
---|
| 165 | *(buffer + OFFSET_ACI_CMD_T_LEN) = 1;
|
---|
| 166 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_GET_BATTERY_LEVEL;
|
---|
| 167 | }
|
---|
| 168 |
|
---|
| 169 | void acil_encode_cmd_temparature(uint8_t *buffer)
|
---|
| 170 | {
|
---|
| 171 | *(buffer + OFFSET_ACI_CMD_T_LEN) = 1;
|
---|
| 172 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_GET_TEMPERATURE;
|
---|
| 173 | }
|
---|
| 174 |
|
---|
| 175 | void acil_encode_cmd_read_dynamic_data(uint8_t *buffer)
|
---|
| 176 | {
|
---|
| 177 | *(buffer + OFFSET_ACI_CMD_T_LEN) = 1;
|
---|
| 178 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_READ_DYNAMIC_DATA;
|
---|
| 179 | }
|
---|
| 180 |
|
---|
| 181 | void acil_encode_cmd_write_dynamic_data(uint8_t *buffer, uint8_t seq_no, uint8_t* dynamic_data, uint8_t dynamic_data_size)
|
---|
| 182 | {
|
---|
| 183 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_WRITE_DYNAMIC_DATA_BASE_LEN + dynamic_data_size;
|
---|
| 184 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_WRITE_DYNAMIC_DATA;
|
---|
| 185 | *(buffer + OFFSET_ACI_CMD_T_WRITE_DYNAMIC_DATA + OFFSET_ACI_CMD_PARAMS_WRITE_DYNAMIC_DATA_T_SEQ_NO) = seq_no;
|
---|
| 186 | memcpy((buffer + OFFSET_ACI_CMD_T_WRITE_DYNAMIC_DATA + OFFSET_ACI_CMD_PARAMS_WRITE_DYNAMIC_DATA_T_DYNAMIC_DATA), dynamic_data, dynamic_data_size);
|
---|
| 187 | }
|
---|
| 188 |
|
---|
| 189 | void acil_encode_cmd_change_timing_req(uint8_t *buffer, aci_cmd_params_change_timing_t *p_aci_cmd_params_change_timing)
|
---|
| 190 | {
|
---|
| 191 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_CHANGE_TIMING_LEN;
|
---|
| 192 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_CHANGE_TIMING;
|
---|
| 193 | *(buffer + OFFSET_ACI_CMD_T_CHANGE_TIMING + OFFSET_ACI_CMD_PARAMS_CHANGE_TIMING_T_CONN_PARAMS + OFFSET_ACI_LL_CONN_PARAMS_T_MIN_CONN_INTERVAL_MSB) = (uint8_t)(p_aci_cmd_params_change_timing->conn_params.min_conn_interval >> 8);
|
---|
| 194 | *(buffer + OFFSET_ACI_CMD_T_CHANGE_TIMING + OFFSET_ACI_CMD_PARAMS_CHANGE_TIMING_T_CONN_PARAMS + OFFSET_ACI_LL_CONN_PARAMS_T_MIN_CONN_INTERVAL_LSB) = (uint8_t)(p_aci_cmd_params_change_timing->conn_params.min_conn_interval);
|
---|
| 195 | *(buffer + OFFSET_ACI_CMD_T_CHANGE_TIMING + OFFSET_ACI_CMD_PARAMS_CHANGE_TIMING_T_CONN_PARAMS + OFFSET_ACI_LL_CONN_PARAMS_T_MAX_CONN_INTERVAL_MSB) = (uint8_t)(p_aci_cmd_params_change_timing->conn_params.max_conn_interval >> 8);
|
---|
| 196 | *(buffer + OFFSET_ACI_CMD_T_CHANGE_TIMING + OFFSET_ACI_CMD_PARAMS_CHANGE_TIMING_T_CONN_PARAMS + OFFSET_ACI_LL_CONN_PARAMS_T_MAX_CONN_INTERVAL_LSB) = (uint8_t)(p_aci_cmd_params_change_timing->conn_params.max_conn_interval);
|
---|
| 197 | *(buffer + OFFSET_ACI_CMD_T_CHANGE_TIMING + OFFSET_ACI_CMD_PARAMS_CHANGE_TIMING_T_CONN_PARAMS + OFFSET_ACI_LL_CONN_PARAMS_T_SLAVE_LATENCY_MSB ) = (uint8_t)(p_aci_cmd_params_change_timing->conn_params.slave_latency >> 8);
|
---|
| 198 | *(buffer + OFFSET_ACI_CMD_T_CHANGE_TIMING + OFFSET_ACI_CMD_PARAMS_CHANGE_TIMING_T_CONN_PARAMS + OFFSET_ACI_LL_CONN_PARAMS_T_SLAVE_LATENCY_LSB ) = (uint8_t)(p_aci_cmd_params_change_timing->conn_params.slave_latency);
|
---|
| 199 | *(buffer + OFFSET_ACI_CMD_T_CHANGE_TIMING + OFFSET_ACI_CMD_PARAMS_CHANGE_TIMING_T_CONN_PARAMS + OFFSET_ACI_LL_CONN_PARAMS_T_TIMEOUT_MULT_MSB ) = (uint8_t)(p_aci_cmd_params_change_timing->conn_params.timeout_mult >> 8);
|
---|
| 200 | *(buffer + OFFSET_ACI_CMD_T_CHANGE_TIMING + OFFSET_ACI_CMD_PARAMS_CHANGE_TIMING_T_CONN_PARAMS + OFFSET_ACI_LL_CONN_PARAMS_T_TIMEOUT_MULT_LSB ) = (uint8_t)(p_aci_cmd_params_change_timing->conn_params.timeout_mult);
|
---|
| 201 | }
|
---|
| 202 |
|
---|
| 203 | void acil_encode_cmd_set_app_latency(uint8_t *buffer, aci_cmd_params_set_app_latency_t *p_aci_cmd_params_set_app_latency)
|
---|
| 204 | {
|
---|
| 205 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_SET_APP_LATENCY_LEN;
|
---|
| 206 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_SET_APP_LATENCY;
|
---|
| 207 | *(buffer + OFFSET_ACI_CMD_T_SET_APP_LATENCY + OFFSET_ACI_CMD_PARAMS_SET_APP_LATENCY_T_MODE) = (uint8_t)( p_aci_cmd_params_set_app_latency->mode);
|
---|
| 208 | *(buffer + OFFSET_ACI_CMD_T_SET_APP_LATENCY + OFFSET_ACI_CMD_PARAMS_SET_APP_LATENCY_T_LATENCY_MSB) = (uint8_t)( p_aci_cmd_params_set_app_latency->latency>>8);
|
---|
| 209 | *(buffer + OFFSET_ACI_CMD_T_SET_APP_LATENCY + OFFSET_ACI_CMD_PARAMS_SET_APP_LATENCY_T_LATENCY_LSB) = (uint8_t)( p_aci_cmd_params_set_app_latency->latency);
|
---|
| 210 | }
|
---|
| 211 |
|
---|
| 212 | void acil_encode_cmd_change_timing_req_GAP_PPCP(uint8_t *buffer)
|
---|
| 213 | {
|
---|
| 214 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_CHANGE_TIMING_LEN_GAP_PPCP;
|
---|
| 215 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_CHANGE_TIMING;
|
---|
| 216 | }
|
---|
| 217 |
|
---|
| 218 |
|
---|
| 219 | void acil_encode_cmd_setup(uint8_t *buffer, aci_cmd_params_setup_t *p_aci_cmd_params_setup, uint8_t setup_data_size)
|
---|
| 220 | {
|
---|
| 221 | *(buffer + OFFSET_ACI_CMD_T_LEN) = setup_data_size + MSG_SETUP_CMD_BASE_LEN;
|
---|
| 222 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_SETUP;
|
---|
| 223 | memcpy((buffer + OFFSET_ACI_CMD_T_SETUP), &(p_aci_cmd_params_setup->setup_data[0]), setup_data_size);
|
---|
| 224 | }
|
---|
| 225 |
|
---|
| 226 | void acil_encode_cmd_dtm_cmd(uint8_t *buffer, aci_cmd_params_dtm_cmd_t *p_aci_cmd_params_dtm_cmd)
|
---|
| 227 | {
|
---|
| 228 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_DTM_CMD;
|
---|
| 229 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_DTM_CMD;
|
---|
| 230 | *(buffer + OFFSET_ACI_CMD_T_DTM_CMD) = p_aci_cmd_params_dtm_cmd->cmd_msb;
|
---|
| 231 | *(buffer + OFFSET_ACI_CMD_T_DTM_CMD + 1) = p_aci_cmd_params_dtm_cmd->cmd_lsb;
|
---|
| 232 | }
|
---|
| 233 |
|
---|
| 234 | void acil_encode_cmd_send_data_ack(uint8_t *buffer, const uint8_t pipe_number )
|
---|
| 235 | {
|
---|
| 236 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_ACK_LEN;
|
---|
| 237 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_SEND_DATA_ACK;
|
---|
| 238 | *(buffer + OFFSET_ACI_CMD_T_SEND_DATA_ACK + OFFSET_ACI_CMD_PARAMS_SEND_DATA_ACK_T_PIPE_NUMBER) = pipe_number;
|
---|
| 239 | }
|
---|
| 240 |
|
---|
| 241 | void acil_encode_cmd_send_data_nack(uint8_t *buffer, const uint8_t pipe_number, const uint8_t err_code )
|
---|
| 242 | {
|
---|
| 243 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_NACK_LEN;
|
---|
| 244 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_SEND_DATA_NACK;
|
---|
| 245 | *(buffer + OFFSET_ACI_CMD_T_SEND_DATA_NACK + OFFSET_ACI_CMD_PARAMS_SEND_DATA_NACK_T_PIPE_NUMBER) = pipe_number;
|
---|
| 246 | *(buffer + OFFSET_ACI_CMD_T_SEND_DATA_NACK + OFFSET_ACI_CMD_PARAMS_SEND_DATA_NACK_T_ERROR_CODE) = err_code;
|
---|
| 247 | }
|
---|
| 248 |
|
---|
| 249 | void acil_encode_cmd_bond_security_request(uint8_t *buffer)
|
---|
| 250 | {
|
---|
| 251 | *(buffer + OFFSET_ACI_CMD_T_LEN) = 1;
|
---|
| 252 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_BOND_SECURITY_REQUEST;
|
---|
| 253 | }
|
---|
| 254 |
|
---|
| 255 | void acil_encode_cmd_broadcast(uint8_t *buffer, aci_cmd_params_broadcast_t * p_aci_cmd_params_broadcast)
|
---|
| 256 | {
|
---|
| 257 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_BROADCAST_LEN;
|
---|
| 258 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_BROADCAST;
|
---|
| 259 | *(buffer + OFFSET_ACI_CMD_T_BROADCAST + OFFSET_ACI_CMD_PARAMS_BROADCAST_T_TIMEOUT_LSB) = (p_aci_cmd_params_broadcast->timeout & 0xff);
|
---|
| 260 | *(buffer + OFFSET_ACI_CMD_T_BROADCAST + OFFSET_ACI_CMD_PARAMS_BROADCAST_T_TIMEOUT_MSB) = (uint8_t)(p_aci_cmd_params_broadcast->timeout >> 8);
|
---|
| 261 | *(buffer + OFFSET_ACI_CMD_T_BROADCAST + OFFSET_ACI_CMD_PARAMS_BROADCAST_T_ADV_INTERVAL_LSB) = (p_aci_cmd_params_broadcast->adv_interval & 0xff);
|
---|
| 262 | *(buffer + OFFSET_ACI_CMD_T_BROADCAST + OFFSET_ACI_CMD_PARAMS_BROADCAST_T_ADV_INTERVAL_MSB) = (uint8_t)(p_aci_cmd_params_broadcast->adv_interval >> 8);
|
---|
| 263 | }
|
---|
| 264 |
|
---|
| 265 | void acil_encode_cmd_open_adv_pipes(uint8_t *buffer, aci_cmd_params_open_adv_pipe_t * p_aci_cmd_params_open_adv_pipe)
|
---|
| 266 | {
|
---|
| 267 | *(buffer + OFFSET_ACI_CMD_T_LEN) = MSG_OPEN_ADV_PIPES_LEN;
|
---|
| 268 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_OPEN_ADV_PIPE;
|
---|
| 269 | memcpy(buffer + OFFSET_ACI_CMD_T_OPEN_ADV_PIPE + OFFSET_ACI_CMD_PARAMS_OPEN_ADV_PIPE_T_PIPES, p_aci_cmd_params_open_adv_pipe->pipes, 8);
|
---|
| 270 | }
|
---|
| 271 |
|
---|
| 272 |
|
---|
| 273 | void acil_encode_cmd_set_key(uint8_t *buffer, aci_cmd_params_set_key_t *p_aci_cmd_params_set_key)
|
---|
| 274 | {
|
---|
| 275 | /*
|
---|
| 276 | The length of the key is computed based on the type of key transaction.
|
---|
| 277 | - Key Reject
|
---|
| 278 | - Key type is passkey
|
---|
| 279 | */
|
---|
| 280 | uint8_t len;
|
---|
| 281 |
|
---|
| 282 | switch (p_aci_cmd_params_set_key->key_type)
|
---|
| 283 | {
|
---|
| 284 | case ACI_KEY_TYPE_INVALID:
|
---|
| 285 | len = MSG_SET_KEY_REJECT_LEN;
|
---|
| 286 | break;
|
---|
| 287 | case ACI_KEY_TYPE_PASSKEY:
|
---|
| 288 | len = MSG_SET_KEY_PASSKEY_LEN;
|
---|
| 289 | break;
|
---|
| 290 | default:
|
---|
| 291 | len=0;
|
---|
| 292 | break;
|
---|
| 293 | }
|
---|
| 294 | *(buffer + OFFSET_ACI_CMD_T_LEN) = len;
|
---|
| 295 | *(buffer + OFFSET_ACI_CMD_T_CMD_OPCODE) = ACI_CMD_SET_KEY;
|
---|
| 296 | *(buffer + OFFSET_ACI_CMD_T_SET_KEY + OFFSET_ACI_CMD_PARAMS_SET_KEY_T_KEY_TYPE) = p_aci_cmd_params_set_key->key_type;
|
---|
| 297 | memcpy((buffer + OFFSET_ACI_CMD_T_SET_KEY + OFFSET_ACI_CMD_PARAMS_SET_KEY_T_PASSKEY), (uint8_t * )&(p_aci_cmd_params_set_key->key), len-2);//Reducing 2 for the opcode byte and type
|
---|
| 298 | }
|
---|
| 299 |
|
---|
| 300 | bool acil_encode_cmd(uint8_t *buffer, aci_cmd_t *p_aci_cmd)
|
---|
| 301 | {
|
---|
| 302 | bool ret_val = false;
|
---|
| 303 |
|
---|
| 304 | switch((aci_cmd_opcode_t)p_aci_cmd->cmd_opcode)
|
---|
| 305 | {
|
---|
| 306 | case ACI_CMD_TEST:
|
---|
| 307 | acil_encode_cmd_set_test_mode(buffer, &(p_aci_cmd->params.test));
|
---|
| 308 | break;
|
---|
| 309 | case ACI_CMD_SLEEP:
|
---|
| 310 | acil_encode_cmd_sleep(buffer);
|
---|
| 311 | break;
|
---|
| 312 | case ACI_CMD_GET_DEVICE_VERSION:
|
---|
| 313 | acil_encode_cmd_get_device_version(buffer);
|
---|
| 314 | break;
|
---|
| 315 | case ACI_CMD_WAKEUP:
|
---|
| 316 | acil_encode_cmd_wakeup(buffer);
|
---|
| 317 | break;
|
---|
| 318 | case ACI_CMD_ECHO:
|
---|
| 319 | acil_encode_cmd_echo_msg(buffer, &(p_aci_cmd->params.echo), (p_aci_cmd->len - MSG_ECHO_MSG_CMD_BASE_LEN));
|
---|
| 320 | break;
|
---|
| 321 | case ACI_CMD_GET_BATTERY_LEVEL:
|
---|
| 322 | acil_encode_cmd_battery_level(buffer);
|
---|
| 323 | break;
|
---|
| 324 | case ACI_CMD_GET_TEMPERATURE:
|
---|
| 325 | acil_encode_cmd_temparature(buffer);
|
---|
| 326 | break;
|
---|
| 327 | case ACI_CMD_GET_DEVICE_ADDRESS:
|
---|
| 328 | acil_encode_cmd_get_address(buffer);
|
---|
| 329 | break;
|
---|
| 330 | case ACI_CMD_SET_TX_POWER:
|
---|
| 331 | acil_encode_cmd_set_radio_tx_power(buffer, &(p_aci_cmd->params.set_tx_power));
|
---|
| 332 | break;
|
---|
| 333 | case ACI_CMD_CONNECT:
|
---|
| 334 | acil_encode_cmd_connect(buffer, &(p_aci_cmd->params.connect));
|
---|
| 335 | break;
|
---|
| 336 | case ACI_CMD_BOND:
|
---|
| 337 | acil_encode_cmd_bond(buffer, &(p_aci_cmd->params.bond));
|
---|
| 338 | break;
|
---|
| 339 | case ACI_CMD_DISCONNECT:
|
---|
| 340 | acil_encode_cmd_disconnect(buffer, &(p_aci_cmd->params.disconnect));
|
---|
| 341 | break;
|
---|
| 342 | case ACI_CMD_RADIO_RESET:
|
---|
| 343 | acil_encode_baseband_reset(buffer);
|
---|
| 344 | break;
|
---|
| 345 | case ACI_CMD_CHANGE_TIMING:
|
---|
| 346 | acil_encode_cmd_change_timing_req(buffer, &(p_aci_cmd->params.change_timing));
|
---|
| 347 | break;
|
---|
| 348 | case ACI_CMD_SETUP:
|
---|
| 349 | acil_encode_cmd_setup(buffer, &(p_aci_cmd->params.setup), (p_aci_cmd->len - MSG_SETUP_CMD_BASE_LEN));
|
---|
| 350 | break;
|
---|
| 351 | case ACI_CMD_DTM_CMD:
|
---|
| 352 | acil_encode_cmd_dtm_cmd(buffer, &(p_aci_cmd->params.dtm_cmd));
|
---|
| 353 | break;
|
---|
| 354 | case ACI_CMD_READ_DYNAMIC_DATA:
|
---|
| 355 | acil_encode_cmd_read_dynamic_data(buffer);
|
---|
| 356 | break;
|
---|
| 357 | case ACI_CMD_WRITE_DYNAMIC_DATA:
|
---|
| 358 | acil_encode_cmd_write_dynamic_data(buffer, p_aci_cmd->params.write_dynamic_data.seq_no, &(p_aci_cmd->params.write_dynamic_data.dynamic_data[0]), (p_aci_cmd->len - MSG_WRITE_DYNAMIC_DATA_BASE_LEN));
|
---|
| 359 | break;
|
---|
| 360 | case ACI_CMD_OPEN_REMOTE_PIPE:
|
---|
| 361 | acil_encode_cmd_open_remote_pipe(buffer, &(p_aci_cmd->params.open_remote_pipe));
|
---|
| 362 | break;
|
---|
| 363 | case ACI_CMD_SEND_DATA:
|
---|
| 364 | acil_encode_cmd_send_data(buffer, &(p_aci_cmd->params.send_data), (p_aci_cmd->len - MSG_SEND_DATA_BASE_LEN));
|
---|
| 365 | break;
|
---|
| 366 | case ACI_CMD_SEND_DATA_ACK:
|
---|
| 367 | acil_encode_cmd_send_data_ack(buffer, p_aci_cmd->params.send_data_ack.pipe_number );
|
---|
| 368 | break;
|
---|
| 369 | case ACI_CMD_REQUEST_DATA:
|
---|
| 370 | acil_encode_cmd_request_data(buffer, &(p_aci_cmd->params.request_data));
|
---|
| 371 | break;
|
---|
| 372 | case ACI_CMD_SET_LOCAL_DATA:
|
---|
| 373 | acil_encode_cmd_set_local_data(buffer, (aci_cmd_params_set_local_data_t *)(&(p_aci_cmd->params.send_data)), (p_aci_cmd->len - MSG_SET_LOCAL_DATA_BASE_LEN));
|
---|
| 374 | break;
|
---|
| 375 | case ACI_CMD_BOND_SECURITY_REQUEST:
|
---|
| 376 | acil_encode_cmd_bond_security_request(buffer);
|
---|
| 377 | break;
|
---|
| 378 | default:
|
---|
| 379 | break;
|
---|
| 380 | }
|
---|
| 381 | return ret_val;
|
---|
| 382 | }
|
---|
| 383 |
|
---|
| 384 | void acil_decode_evt_command_response(uint8_t *buffer_in, aci_evt_params_cmd_rsp_t *p_evt_params_cmd_rsp)
|
---|
| 385 | {
|
---|
| 386 | aci_evt_cmd_rsp_params_get_device_version_t *p_device_version;
|
---|
| 387 | aci_evt_cmd_rsp_params_get_device_address_t *p_device_address;
|
---|
| 388 | aci_evt_cmd_rsp_params_get_temperature_t *p_temperature;
|
---|
| 389 | aci_evt_cmd_rsp_params_get_battery_level_t *p_batt_lvl;
|
---|
| 390 | aci_evt_cmd_rsp_read_dynamic_data_t *p_read_dyn_data;
|
---|
| 391 | aci_evt_cmd_rsp_params_dtm_cmd_t *p_dtm_evt;
|
---|
| 392 |
|
---|
| 393 | p_evt_params_cmd_rsp->cmd_opcode = (aci_cmd_opcode_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_CMD_OPCODE);
|
---|
| 394 | p_evt_params_cmd_rsp->cmd_status = (aci_status_code_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_CMD_STATUS);
|
---|
| 395 |
|
---|
| 396 | switch ((aci_cmd_opcode_t)p_evt_params_cmd_rsp->cmd_opcode)
|
---|
| 397 | {
|
---|
| 398 | case ACI_CMD_GET_DEVICE_VERSION:
|
---|
| 399 | p_device_version = &(p_evt_params_cmd_rsp->params.get_device_version);
|
---|
| 400 | p_device_version->configuration_id = (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_VERSION + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_VERSION_T_CONFIGURATION_ID_LSB);
|
---|
| 401 | p_device_version->configuration_id |= (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_VERSION + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_VERSION_T_CONFIGURATION_ID_MSB) << 8;
|
---|
| 402 | p_device_version->aci_version = *(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_VERSION + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_VERSION_T_ACI_VERSION);
|
---|
| 403 | p_device_version->setup_format = *(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_VERSION + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_VERSION_T_SETUP_FORMAT);
|
---|
| 404 | p_device_version->setup_id = (uint32_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_VERSION + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_VERSION_T_SETUP_ID_LSB0);
|
---|
| 405 | p_device_version->setup_id |= (uint32_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_VERSION + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_VERSION_T_SETUP_ID_LSB1) << 8;
|
---|
| 406 | p_device_version->setup_id |= (uint32_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_VERSION + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_VERSION_T_SETUP_ID_MSB0) << 16;
|
---|
| 407 | p_device_version->setup_id |= (uint32_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_VERSION + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_VERSION_T_SETUP_ID_MSB1) << 24;
|
---|
| 408 | p_device_version->setup_status = *(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_VERSION + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_VERSION_T_SETUP_STATUS);
|
---|
| 409 | break;
|
---|
| 410 |
|
---|
| 411 | case ACI_CMD_GET_DEVICE_ADDRESS:
|
---|
| 412 | p_device_address = &(p_evt_params_cmd_rsp->params.get_device_address);
|
---|
| 413 | memcpy((uint8_t *)(p_device_address->bd_addr_own), (buffer_in + OFFSET_ACI_EVT_T_CMD_RSP+OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_ADDRESS+OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_ADDRESS_T_BD_ADDR_OWN), BTLE_DEVICE_ADDRESS_SIZE);
|
---|
| 414 | p_device_address->bd_addr_type = (aci_bd_addr_type_t) *(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP+OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_DEVICE_ADDRESS+OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_DEVICE_ADDRESS_T_BD_ADDR_TYPE);
|
---|
| 415 | break;
|
---|
| 416 |
|
---|
| 417 | case ACI_CMD_GET_TEMPERATURE:
|
---|
| 418 | p_temperature = &(p_evt_params_cmd_rsp->params.get_temperature);
|
---|
| 419 | p_temperature->temperature_value = (int16_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_TEMPERATURE + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_TEMPERATURE_T_TEMPERATURE_VALUE_LSB);
|
---|
| 420 | p_temperature->temperature_value |= (int16_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_TEMPERATURE + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_TEMPERATURE_T_TEMPERATURE_VALUE_MSB) << 8;
|
---|
| 421 | break;
|
---|
| 422 |
|
---|
| 423 | case ACI_CMD_GET_BATTERY_LEVEL:
|
---|
| 424 | p_batt_lvl = &(p_evt_params_cmd_rsp->params.get_battery_level);
|
---|
| 425 | p_batt_lvl->battery_level = (int16_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_BATTERY_LEVEL + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_BATTERY_LEVEL_T_BATTERY_LEVEL_LSB);
|
---|
| 426 | p_batt_lvl->battery_level |= (int16_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_GET_BATTERY_LEVEL + OFFSET_ACI_EVT_CMD_RSP_PARAMS_GET_BATTERY_LEVEL_T_BATTERY_LEVEL_MSB) << 8;
|
---|
| 427 | break;
|
---|
| 428 |
|
---|
| 429 | case ACI_CMD_READ_DYNAMIC_DATA:
|
---|
| 430 | p_read_dyn_data = &(p_evt_params_cmd_rsp->params.read_dynamic_data);
|
---|
| 431 | p_read_dyn_data->seq_no = (uint8_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_READ_DYNAMIC_DATA + OFFSET_ACI_EVT_CMD_RSP_READ_DYNAMIC_DATA_T_SEQ_NO);
|
---|
| 432 | memcpy((uint8_t *)(p_read_dyn_data->dynamic_data), (buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_READ_DYNAMIC_DATA + OFFSET_ACI_CMD_PARAMS_WRITE_DYNAMIC_DATA_T_DYNAMIC_DATA), ACIL_DECODE_EVT_GET_LENGTH(buffer_in) - 3); // 3 bytes subtracted account for EventCode, CommandOpCode and Status bytes.
|
---|
| 433 | // Now that the p_read_dyn_data->dynamic_data will be pointing to memory location with enough space to accommodate upto 27 bytes of dynamic data received. This is because of the padding element in aci_evt_params_cmd_rsp_t
|
---|
| 434 | break;
|
---|
| 435 |
|
---|
| 436 | case ACI_CMD_DTM_CMD:
|
---|
| 437 | p_dtm_evt = &(p_evt_params_cmd_rsp->params.dtm_cmd);
|
---|
| 438 | p_dtm_evt->evt_msb = (uint8_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_DTM_CMD + OFFSET_ACI_EVT_CMD_RSP_PARAMS_DTM_CMD_T_EVT_MSB);
|
---|
| 439 | p_dtm_evt->evt_lsb = (uint8_t)*(buffer_in + OFFSET_ACI_EVT_T_CMD_RSP + OFFSET_ACI_EVT_PARAMS_CMD_RSP_T_DTM_CMD + OFFSET_ACI_EVT_CMD_RSP_PARAMS_DTM_CMD_T_EVT_LSB);
|
---|
| 440 | break;
|
---|
| 441 | default:
|
---|
| 442 | break;
|
---|
| 443 | }
|
---|
| 444 | }
|
---|
| 445 |
|
---|
| 446 | void acil_decode_evt_device_started(uint8_t *buffer_in, aci_evt_params_device_started_t *p_evt_params_device_started)
|
---|
| 447 | {
|
---|
| 448 | p_evt_params_device_started->device_mode = (aci_device_operation_mode_t) *(buffer_in + OFFSET_ACI_EVT_T_DEVICE_STARTED+OFFSET_ACI_EVT_PARAMS_DEVICE_STARTED_T_DEVICE_MODE);
|
---|
| 449 | p_evt_params_device_started->hw_error = (aci_hw_error_t) *(buffer_in + OFFSET_ACI_EVT_T_DEVICE_STARTED+OFFSET_ACI_EVT_PARAMS_DEVICE_STARTED_T_HW_ERROR);
|
---|
| 450 | p_evt_params_device_started->credit_available = *(buffer_in + OFFSET_ACI_EVT_T_DEVICE_STARTED+OFFSET_ACI_EVT_PARAMS_DEVICE_STARTED_T_CREDIT_AVAILABLE);
|
---|
| 451 | }
|
---|
| 452 |
|
---|
| 453 | void acil_decode_evt_pipe_status(uint8_t *buffer_in, aci_evt_params_pipe_status_t *p_aci_evt_params_pipe_status)
|
---|
| 454 | {
|
---|
| 455 | memcpy((uint8_t *)p_aci_evt_params_pipe_status->pipes_open_bitmap, (buffer_in + OFFSET_ACI_EVT_T_PIPE_STATUS + OFFSET_ACI_EVT_PARAMS_PIPE_STATUS_T_PIPES_OPEN_BITMAP), 8);
|
---|
| 456 | memcpy((uint8_t *)p_aci_evt_params_pipe_status->pipes_closed_bitmap, (buffer_in + OFFSET_ACI_EVT_T_PIPE_STATUS + OFFSET_ACI_EVT_PARAMS_PIPE_STATUS_T_PIPES_CLOSED_BITMAP), 8);
|
---|
| 457 | }
|
---|
| 458 |
|
---|
| 459 | void acil_decode_evt_disconnected(uint8_t *buffer_in, aci_evt_params_disconnected_t *p_aci_evt_params_disconnected)
|
---|
| 460 | {
|
---|
| 461 | p_aci_evt_params_disconnected->aci_status = (aci_status_code_t)*(buffer_in + OFFSET_ACI_EVT_T_DISCONNECTED + OFFSET_ACI_EVT_PARAMS_DISCONNECTED_T_ACI_STATUS);
|
---|
| 462 | p_aci_evt_params_disconnected->btle_status = *(buffer_in + OFFSET_ACI_EVT_T_DISCONNECTED + OFFSET_ACI_EVT_PARAMS_DISCONNECTED_T_BTLE_STATUS);
|
---|
| 463 | }
|
---|
| 464 |
|
---|
| 465 | void acil_decode_evt_bond_status(uint8_t *buffer_in, aci_evt_params_bond_status_t *p_aci_evt_params_bond_status)
|
---|
| 466 | {
|
---|
| 467 | p_aci_evt_params_bond_status->status_code = (aci_bond_status_code_t)*(buffer_in + OFFSET_ACI_EVT_T_BOND_STATUS + OFFSET_ACI_EVT_PARAMS_BOND_STATUS_T_STATUS_CODE);
|
---|
| 468 | p_aci_evt_params_bond_status->status_source = (aci_bond_status_source_t)*(buffer_in + OFFSET_ACI_EVT_T_BOND_STATUS + OFFSET_ACI_EVT_PARAMS_BOND_STATUS_T_STATUS_SOURCE);
|
---|
| 469 | p_aci_evt_params_bond_status->secmode1_bitmap = *(buffer_in + OFFSET_ACI_EVT_T_BOND_STATUS + OFFSET_ACI_EVT_PARAMS_BOND_STATUS_T_SECMODE1_BITMAP);
|
---|
| 470 | p_aci_evt_params_bond_status->secmode2_bitmap = *(buffer_in + OFFSET_ACI_EVT_T_BOND_STATUS + OFFSET_ACI_EVT_PARAMS_BOND_STATUS_T_SECMODE2_BITMAP);
|
---|
| 471 | p_aci_evt_params_bond_status->keys_exchanged_slave = *(buffer_in + OFFSET_ACI_EVT_T_BOND_STATUS + OFFSET_ACI_EVT_PARAMS_BOND_STATUS_T_KEYS_EXCHANGED_SLAVE);
|
---|
| 472 | p_aci_evt_params_bond_status->keys_exchanged_master = *(buffer_in + OFFSET_ACI_EVT_T_BOND_STATUS + OFFSET_ACI_EVT_PARAMS_BOND_STATUS_T_KEYS_EXCHANGED_MASTER);
|
---|
| 473 | }
|
---|
| 474 |
|
---|
| 475 | uint8_t acil_decode_evt_data_received(uint8_t *buffer_in, aci_evt_params_data_received_t *p_evt_params_data_received)
|
---|
| 476 | {
|
---|
| 477 | uint8_t size = *( buffer_in + OFFSET_ACI_EVT_T_LEN) - (OFFSET_ACI_EVT_T_DATA_RECEIVED + OFFSET_ACI_RX_DATA_T_ACI_DATA) + 1 ;
|
---|
| 478 | p_evt_params_data_received->rx_data.pipe_number = *(buffer_in + OFFSET_ACI_EVT_T_DATA_RECEIVED + OFFSET_ACI_RX_DATA_T_PIPE_NUMBER);
|
---|
| 479 | memcpy((uint8_t *)p_evt_params_data_received->rx_data.aci_data, (buffer_in + OFFSET_ACI_EVT_T_DATA_RECEIVED + OFFSET_ACI_RX_DATA_T_ACI_DATA), size);
|
---|
| 480 | return size;
|
---|
| 481 | }
|
---|
| 482 |
|
---|
| 483 | void acil_decode_evt_data_ack(uint8_t *buffer_in, aci_evt_params_data_ack_t *p_evt_params_data_ack)
|
---|
| 484 | {
|
---|
| 485 | p_evt_params_data_ack->pipe_number = *(buffer_in + OFFSET_ACI_EVT_T_DATA_ACK + OFFSET_ACI_EVT_PARAMS_DATA_ACK_T_PIPE_NUMBER);
|
---|
| 486 | }
|
---|
| 487 |
|
---|
| 488 | uint8_t acil_decode_evt_hw_error(uint8_t *buffer_in, aci_evt_params_hw_error_t *p_aci_evt_params_hw_error)
|
---|
| 489 | {
|
---|
| 490 | uint8_t size = *(buffer_in + OFFSET_ACI_EVT_T_LEN) - (OFFSET_ACI_EVT_T_HW_ERROR + OFFSET_ACI_EVT_PARAMS_HW_ERROR_T_FILE_NAME) + 1;
|
---|
| 491 | p_aci_evt_params_hw_error->line_num = (uint16_t)(*(buffer_in + OFFSET_ACI_EVT_T_HW_ERROR + OFFSET_ACI_EVT_PARAMS_HW_ERROR_T_LINE_NUM_MSB)) << 8;
|
---|
| 492 | p_aci_evt_params_hw_error->line_num |= (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_HW_ERROR + OFFSET_ACI_EVT_PARAMS_HW_ERROR_T_LINE_NUM_LSB);
|
---|
| 493 | memcpy((uint8_t *)p_aci_evt_params_hw_error->file_name, (buffer_in + OFFSET_ACI_EVT_T_HW_ERROR + OFFSET_ACI_EVT_PARAMS_HW_ERROR_T_FILE_NAME), size);
|
---|
| 494 | return size;
|
---|
| 495 | }
|
---|
| 496 |
|
---|
| 497 | void acil_decode_evt_credit(uint8_t *buffer_in, aci_evt_params_data_credit_t *p_evt_params_data_credit)
|
---|
| 498 | {
|
---|
| 499 | p_evt_params_data_credit->credit = *(buffer_in + OFFSET_ACI_EVT_T_DATA_CREDIT + OFFSET_ACI_EVT_PARAMS_DATA_CREDIT_T_CREDIT);
|
---|
| 500 | }
|
---|
| 501 |
|
---|
| 502 | void acil_decode_evt_connected(uint8_t *buffer_in, aci_evt_params_connected_t *p_aci_evt_params_connected)
|
---|
| 503 | {
|
---|
| 504 | p_aci_evt_params_connected->dev_addr_type = (aci_bd_addr_type_t)*(buffer_in + OFFSET_ACI_EVT_T_CONNECTED + OFFSET_ACI_EVT_PARAMS_CONNECTED_T_DEV_ADDR_TYPE);
|
---|
| 505 | memcpy(&(p_aci_evt_params_connected->dev_addr[0]), (buffer_in + OFFSET_ACI_EVT_T_CONNECTED + OFFSET_ACI_EVT_PARAMS_CONNECTED_T_DEV_ADDR), BTLE_DEVICE_ADDRESS_SIZE);
|
---|
| 506 | p_aci_evt_params_connected->conn_rf_interval = (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_CONNECTED + OFFSET_ACI_EVT_PARAMS_CONNECTED_T_CONN_RF_INTERVAL_MSB) << 8;
|
---|
| 507 | p_aci_evt_params_connected->conn_rf_interval |= (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_CONNECTED + OFFSET_ACI_EVT_PARAMS_CONNECTED_T_CONN_RF_INTERVAL_LSB);
|
---|
| 508 | p_aci_evt_params_connected->conn_slave_rf_latency = (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_CONNECTED + OFFSET_ACI_EVT_PARAMS_CONNECTED_T_CONN_SLAVE_RF_LATENCY_MSB) << 8;
|
---|
| 509 | p_aci_evt_params_connected->conn_slave_rf_latency |= (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_CONNECTED + OFFSET_ACI_EVT_PARAMS_CONNECTED_T_CONN_SLAVE_RF_LATENCY_LSB);
|
---|
| 510 | p_aci_evt_params_connected->conn_rf_timeout = (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_CONNECTED + OFFSET_ACI_EVT_PARAMS_CONNECTED_T_CONN_RF_TIMEOUT_MSB) << 8;
|
---|
| 511 | p_aci_evt_params_connected->conn_rf_timeout |= (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_CONNECTED + OFFSET_ACI_EVT_PARAMS_CONNECTED_T_CONN_RF_TIMEOUT_LSB);
|
---|
| 512 | p_aci_evt_params_connected->master_clock_accuracy = (aci_clock_accuracy_t)*(buffer_in + OFFSET_ACI_EVT_T_CONNECTED + OFFSET_ACI_EVT_PARAMS_CONNECTED_T_MASTER_CLOCK_ACCURACY);
|
---|
| 513 |
|
---|
| 514 | }
|
---|
| 515 |
|
---|
| 516 | void acil_decode_evt_timing(uint8_t *buffer_in, aci_evt_params_timing_t *p_evt_params_timing)
|
---|
| 517 | {
|
---|
| 518 | p_evt_params_timing->conn_rf_interval = *(buffer_in + OFFSET_ACI_EVT_T_TIMING + OFFSET_ACI_EVT_PARAMS_TIMING_T_CONN_RF_INTERVAL_MSB) << 8;
|
---|
| 519 | p_evt_params_timing->conn_rf_interval |= (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_TIMING + OFFSET_ACI_EVT_PARAMS_TIMING_T_CONN_RF_INTERVAL_LSB);
|
---|
| 520 | p_evt_params_timing->conn_slave_rf_latency = (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_TIMING + OFFSET_ACI_EVT_PARAMS_TIMING_T_CONN_SLAVE_RF_LATENCY_MSB) << 8;
|
---|
| 521 | p_evt_params_timing->conn_slave_rf_latency |= (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_TIMING + OFFSET_ACI_EVT_PARAMS_TIMING_T_CONN_SLAVE_RF_LATENCY_LSB);
|
---|
| 522 | p_evt_params_timing->conn_rf_timeout = (uint16_t)*(buffer_in + OFFSET_ACI_EVT_T_TIMING + OFFSET_ACI_EVT_PARAMS_TIMING_T_CONN_RF_TIMEOUT_MSB) << 8;
|
---|
| 523 | p_evt_params_timing->conn_rf_timeout |= *(buffer_in + OFFSET_ACI_EVT_T_TIMING + OFFSET_ACI_EVT_PARAMS_TIMING_T_CONN_RF_TIMEOUT_LSB);
|
---|
| 524 | }
|
---|
| 525 |
|
---|
| 526 | void acil_decode_evt_pipe_error(uint8_t *buffer_in, aci_evt_params_pipe_error_t *p_evt_params_pipe_error)
|
---|
| 527 | {
|
---|
| 528 | //volatile uint8_t size = *(buffer_in + OFFSET_ACI_EVT_T_LEN) - (OFFSET_ACI_EVT_T_PIPE_ERROR + OFFSET_ACI_EVT_PARAMS_PIPE_ERROR_T_ERROR_DATA) + 1;
|
---|
| 529 | p_evt_params_pipe_error->pipe_number = *(buffer_in + OFFSET_ACI_EVT_T_PIPE_ERROR + OFFSET_ACI_EVT_PARAMS_PIPE_ERROR_T_PIPE_NUMBER);
|
---|
| 530 | p_evt_params_pipe_error->error_code = *(buffer_in + OFFSET_ACI_EVT_T_PIPE_ERROR + OFFSET_ACI_EVT_PARAMS_PIPE_ERROR_T_ERROR_CODE);
|
---|
| 531 | p_evt_params_pipe_error->params.error_data.content[0] = *(buffer_in + OFFSET_ACI_EVT_T_PIPE_ERROR + OFFSET_ACI_EVT_PARAMS_PIPE_ERROR_T_ERROR_DATA + OFFSET_ERROR_DATA_T_CONTENT);
|
---|
| 532 | }
|
---|
| 533 |
|
---|
| 534 | void acil_decode_evt_key_request(uint8_t *buffer_in, aci_evt_params_key_request_t *p_evt_params_key_request)
|
---|
| 535 | {
|
---|
| 536 | p_evt_params_key_request->key_type = (aci_key_type_t)*(buffer_in + OFFSET_ACI_EVT_T_KEY_REQUEST + OFFSET_ACI_EVT_PARAMS_KEY_REQUEST_T_KEY_TYPE);
|
---|
| 537 | }
|
---|
| 538 |
|
---|
| 539 | uint8_t acil_decode_evt_echo(uint8_t *buffer_in, aci_evt_params_echo_t *aci_evt_params_echo)
|
---|
| 540 | {
|
---|
| 541 | uint8_t size = *(buffer_in + OFFSET_ACI_EVT_T_LEN) - 1;
|
---|
| 542 | memcpy(&aci_evt_params_echo->echo_data[0], (buffer_in + OFFSET_ACI_EVT_T_EVT_OPCODE + 1), size);
|
---|
| 543 | return size;
|
---|
| 544 | }
|
---|
| 545 |
|
---|
| 546 | void acil_decode_evt_display_passkey(uint8_t *buffer_in, aci_evt_params_display_passkey_t *p_aci_evt_params_display_passkey)
|
---|
| 547 | {
|
---|
| 548 | p_aci_evt_params_display_passkey->passkey[0] = *(buffer_in + OFFSET_ACI_EVT_T_DISPLAY_PASSKEY + OFFSET_ACI_EVT_PARAMS_DISPLAY_PASSKEY_T_PASSKEY + 0);
|
---|
| 549 | p_aci_evt_params_display_passkey->passkey[1] = *(buffer_in + OFFSET_ACI_EVT_T_DISPLAY_PASSKEY + OFFSET_ACI_EVT_PARAMS_DISPLAY_PASSKEY_T_PASSKEY + 1);
|
---|
| 550 | p_aci_evt_params_display_passkey->passkey[2] = *(buffer_in + OFFSET_ACI_EVT_T_DISPLAY_PASSKEY + OFFSET_ACI_EVT_PARAMS_DISPLAY_PASSKEY_T_PASSKEY + 2);
|
---|
| 551 | p_aci_evt_params_display_passkey->passkey[3] = *(buffer_in + OFFSET_ACI_EVT_T_DISPLAY_PASSKEY + OFFSET_ACI_EVT_PARAMS_DISPLAY_PASSKEY_T_PASSKEY + 3);
|
---|
| 552 | p_aci_evt_params_display_passkey->passkey[4] = *(buffer_in + OFFSET_ACI_EVT_T_DISPLAY_PASSKEY + OFFSET_ACI_EVT_PARAMS_DISPLAY_PASSKEY_T_PASSKEY + 4);
|
---|
| 553 | p_aci_evt_params_display_passkey->passkey[5] = *(buffer_in + OFFSET_ACI_EVT_T_DISPLAY_PASSKEY + OFFSET_ACI_EVT_PARAMS_DISPLAY_PASSKEY_T_PASSKEY + 5);
|
---|
| 554 | }
|
---|
| 555 |
|
---|
| 556 | bool acil_decode_evt(uint8_t *buffer_in, aci_evt_t *p_aci_evt)
|
---|
| 557 | {
|
---|
| 558 | bool ret_val = true;
|
---|
| 559 |
|
---|
| 560 | p_aci_evt->len = ACIL_DECODE_EVT_GET_LENGTH(buffer_in);
|
---|
| 561 | p_aci_evt->evt_opcode = (aci_evt_opcode_t)ACIL_DECODE_EVT_GET_OPCODE(buffer_in);
|
---|
| 562 |
|
---|
| 563 | switch(p_aci_evt->evt_opcode)
|
---|
| 564 | {
|
---|
| 565 | case ACI_EVT_DEVICE_STARTED:
|
---|
| 566 | acil_decode_evt_device_started(buffer_in, &(p_aci_evt->params.device_started));
|
---|
| 567 | break;
|
---|
| 568 | case ACI_EVT_HW_ERROR:
|
---|
| 569 | acil_decode_evt_hw_error(buffer_in, &(p_aci_evt->params.hw_error));
|
---|
| 570 | break;
|
---|
| 571 | case ACI_EVT_CMD_RSP:
|
---|
| 572 | acil_decode_evt_command_response(buffer_in, &(p_aci_evt->params.cmd_rsp));
|
---|
| 573 | break;
|
---|
| 574 | case ACI_EVT_DATA_CREDIT:
|
---|
| 575 | acil_decode_evt_credit(buffer_in, &(p_aci_evt->params.data_credit));
|
---|
| 576 | break;
|
---|
| 577 | case ACI_EVT_CONNECTED:
|
---|
| 578 | acil_decode_evt_connected(buffer_in, &(p_aci_evt->params.connected));
|
---|
| 579 | break;
|
---|
| 580 | case ACI_EVT_PIPE_STATUS:
|
---|
| 581 | acil_decode_evt_pipe_status(buffer_in, &(p_aci_evt->params.pipe_status));
|
---|
| 582 | break;
|
---|
| 583 | case ACI_EVT_DISCONNECTED:
|
---|
| 584 | acil_decode_evt_disconnected(buffer_in, &(p_aci_evt->params.disconnected));
|
---|
| 585 | break;
|
---|
| 586 | case ACI_EVT_BOND_STATUS:
|
---|
| 587 | acil_decode_evt_bond_status(buffer_in, &(p_aci_evt->params.bond_status));
|
---|
| 588 | break;
|
---|
| 589 | case ACI_EVT_TIMING:
|
---|
| 590 | acil_decode_evt_timing(buffer_in, &(p_aci_evt->params.timing));
|
---|
| 591 | break;
|
---|
| 592 | case ACI_EVT_DATA_ACK:
|
---|
| 593 | acil_decode_evt_data_ack(buffer_in, &(p_aci_evt->params.data_ack));
|
---|
| 594 | break;
|
---|
| 595 | case ACI_EVT_DATA_RECEIVED:
|
---|
| 596 | acil_decode_evt_data_received(buffer_in, &(p_aci_evt->params.data_received));
|
---|
| 597 | break;
|
---|
| 598 | case ACI_EVT_PIPE_ERROR:
|
---|
| 599 | acil_decode_evt_pipe_error(buffer_in, &(p_aci_evt->params.pipe_error));
|
---|
| 600 | break;
|
---|
| 601 | case ACI_EVT_KEY_REQUEST:
|
---|
| 602 | acil_decode_evt_key_request(buffer_in, &(p_aci_evt->params.key_request));
|
---|
| 603 | break;
|
---|
| 604 | case ACI_EVT_DISPLAY_PASSKEY:
|
---|
| 605 | acil_decode_evt_display_passkey(buffer_in, &(p_aci_evt->params.display_passkey));
|
---|
| 606 | break;
|
---|
| 607 | default:
|
---|
| 608 | ret_val = false;
|
---|
| 609 | break;
|
---|
| 610 | }
|
---|
| 611 | return ret_val;
|
---|
| 612 | }
|
---|