uint32_t sd_ble_gap_adv_stop(void)
{
    uint32_t index = 0;

    g_cmd_buffer[index++] = BLE_RPC_PKT_CMD;
    g_cmd_buffer[index++] = SD_BLE_GAP_ADV_STOP;
    
    uint32_t err_code = hci_transport_pkt_write(g_cmd_buffer, index);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }

    err_code = ble_rpc_cmd_resp_wait(SD_BLE_GAP_ADV_STOP);
    UNUSED_VARIABLE(hci_transport_rx_pkt_consume(g_cmd_response_buf));
    return err_code;
}
uint32_t sd_ble_gap_device_name_get(uint8_t * const p_dev_name, uint16_t * const p_len)
{
    uint32_t index = 0;

    g_cmd_buffer[index++] = BLE_RPC_PKT_CMD;
    g_cmd_buffer[index++] = SD_BLE_GAP_DEVICE_NAME_GET;

    if (p_len != NULL)
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;  
        index                += uint16_encode(*p_len, &g_cmd_buffer[index]);
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;  
    }

    g_cmd_buffer[index++] = (p_dev_name != NULL) ? RPC_BLE_FIELD_PRESENT :
                                                   RPC_BLE_FIELD_NOT_PRESENT;
        
    uint32_t err_code = hci_transport_pkt_write(g_cmd_buffer, index);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }   

    err_code = ble_rpc_cmd_resp_wait(SD_BLE_GAP_DEVICE_NAME_GET);
    if (p_len != NULL)
    {
        *p_len = uint16_decode(&(g_cmd_response_buf[BLE_OP_CODE_SIZE  + 
                                                    BLE_PKT_TYPE_SIZE +
                                                    RPC_ERR_CODE_SIZE]));
        if (p_dev_name != NULL)
        {
            memcpy(p_dev_name, 
                   &(g_cmd_response_buf[BLE_OP_CODE_SIZE  +
                                        BLE_PKT_TYPE_SIZE +
                                        RPC_ERR_CODE_SIZE +
                                        sizeof(*p_len)]),
                   *p_len);
        }
    }

    UNUSED_VARIABLE(hci_transport_rx_pkt_consume(g_cmd_response_buf));
    return err_code;
}
uint32_t sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_t const * const p_write_perm,
                                    uint8_t const                 * const p_dev_name,
                                    uint16_t                              len)
{
    uint32_t i;
    uint32_t index  = 0;

    g_cmd_buffer[index++] = BLE_RPC_PKT_CMD;
    g_cmd_buffer[index++] = SD_BLE_GAP_DEVICE_NAME_SET;

    if (p_write_perm != NULL)
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
        g_cmd_buffer[index++] = (uint8_t) ((p_write_perm->sm) | (p_write_perm->lv << 4));
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }

    index += uint16_encode(len, &g_cmd_buffer[index]);

    if (p_dev_name != NULL)
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
        for (i = 0; i < len; i++)
        {
            g_cmd_buffer[index++] = p_dev_name[i];
        }
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }

    uint32_t err_code = hci_transport_pkt_write(g_cmd_buffer, index);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }

    err_code = ble_rpc_cmd_resp_wait(SD_BLE_GAP_DEVICE_NAME_SET);
    UNUSED_VARIABLE(hci_transport_rx_pkt_consume(g_cmd_response_buf));
    return err_code;
}
uint32_t sd_ble_gap_appearance_set(uint16_t appearance)
{
    uint32_t index = 0;

    g_cmd_buffer[index++] = BLE_RPC_PKT_CMD;
    g_cmd_buffer[index++] = SD_BLE_GAP_APPEARANCE_SET;
    index                += uint16_encode(appearance, &g_cmd_buffer[index]);

    uint32_t err_code = hci_transport_pkt_write(g_cmd_buffer, index);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }

    err_code = ble_rpc_cmd_resp_wait(SD_BLE_GAP_APPEARANCE_SET);
    UNUSED_VARIABLE(hci_transport_rx_pkt_consume(g_cmd_response_buf));
    return err_code;
}
uint32_t sd_ble_gap_sec_info_reply(uint16_t                          conn_handle,
                                   ble_gap_enc_info_t  const * const p_enc_info,
                                   ble_gap_sign_info_t const * const p_sign_info)
{
    uint32_t index = 0;

    g_cmd_buffer[index++] = BLE_RPC_PKT_CMD;
    g_cmd_buffer[index++] = SD_BLE_GAP_SEC_INFO_REPLY;
    index                += uint16_encode(conn_handle, &g_cmd_buffer[index]);

    if (p_enc_info != NULL)
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
        index                += uint16_encode(p_enc_info->div, &g_cmd_buffer[index]);
        memcpy(&g_cmd_buffer[index], p_enc_info->ltk, BLE_GAP_SEC_KEY_LEN);
        index                += BLE_GAP_SEC_KEY_LEN;
        g_cmd_buffer[index++] = (p_enc_info->auth | (p_enc_info->ltk_len << 1));
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }

    if (p_sign_info != NULL)
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
        memcpy(&g_cmd_buffer[index], p_sign_info->csrk, BLE_GAP_SEC_KEY_LEN);
        index                += BLE_GAP_SEC_KEY_LEN;
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }

    uint32_t err_code = hci_transport_pkt_write(g_cmd_buffer, index);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }

    err_code = ble_rpc_cmd_resp_wait(SD_BLE_GAP_SEC_INFO_REPLY);
    UNUSED_VARIABLE(hci_transport_rx_pkt_consume(g_cmd_response_buf));
    return err_code;
}
uint32_t sd_ble_gap_adv_start(ble_gap_adv_params_t const * const p_adv_params)
{
    uint32_t index = 0;

    g_cmd_buffer[index++] = BLE_RPC_PKT_CMD;
    g_cmd_buffer[index++] = SD_BLE_GAP_ADV_START;
    g_cmd_buffer[index++] = p_adv_params->type;

    if (p_adv_params->p_peer_addr == NULL)
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
        index                += peer_address_encode(&g_cmd_buffer[index],
                                                    p_adv_params->p_peer_addr);
    }

    g_cmd_buffer[index++] = p_adv_params->fp;

    if (p_adv_params->p_whitelist == NULL)
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
        index                += whitelist_encode(&g_cmd_buffer[index], p_adv_params->p_whitelist);
    }

    index += uint16_encode(p_adv_params->interval, &g_cmd_buffer[index]);
    index += uint16_encode(p_adv_params->timeout, &g_cmd_buffer[index]);
    
    uint32_t err_code = hci_transport_pkt_write(g_cmd_buffer, index);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }

    err_code = ble_rpc_cmd_resp_wait(SD_BLE_GAP_ADV_START);
    UNUSED_VARIABLE(hci_transport_rx_pkt_consume(g_cmd_response_buf));
    return err_code;
}
uint32_t sd_ble_gap_disconnect(uint16_t conn_handle, uint8_t hci_status_code)
{
    uint32_t index = 0;

    g_cmd_buffer[index++] = BLE_RPC_PKT_CMD;
    g_cmd_buffer[index++] = SD_BLE_GAP_DISCONNECT;
    index                += uint16_encode(conn_handle, &g_cmd_buffer[index]);
    g_cmd_buffer[index++] = hci_status_code;

    uint32_t err_code = hci_transport_pkt_write(g_cmd_buffer, index);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }

    err_code = ble_rpc_cmd_resp_wait(SD_BLE_GAP_DISCONNECT);
    UNUSED_VARIABLE(hci_transport_rx_pkt_consume(g_cmd_response_buf));
    return err_code;
}
uint32_t sd_ble_gap_sec_params_reply(uint16_t                           conn_handle,
                                     uint8_t                            sec_status,
                                     ble_gap_sec_params_t const * const p_sec_params)
{
    uint32_t index = 0;

    g_cmd_buffer[index++] = BLE_RPC_PKT_CMD;
    g_cmd_buffer[index++] = SD_BLE_GAP_SEC_PARAMS_REPLY;
    index                += uint16_encode(conn_handle, &g_cmd_buffer[index]);
    g_cmd_buffer[index++] = sec_status;

    if (p_sec_params != NULL)
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
        index                += uint16_encode(p_sec_params->timeout, &g_cmd_buffer[index]);
        g_cmd_buffer[index++] = (
                                 (p_sec_params->oob     << 5) |
                                 (p_sec_params->io_caps << 2) |
                                 (p_sec_params->mitm    << 1) |
                                 (p_sec_params->bond    << 0)
                                );
        g_cmd_buffer[index++] = p_sec_params->min_key_size;
        g_cmd_buffer[index++] = p_sec_params->max_key_size;
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }

    uint32_t err_code = hci_transport_pkt_write(g_cmd_buffer, index);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }

    err_code = ble_rpc_cmd_resp_wait(SD_BLE_GAP_SEC_PARAMS_REPLY);
    UNUSED_VARIABLE(hci_transport_rx_pkt_consume(g_cmd_response_buf));
    return err_code;
}
Example #9
0
uint32_t ble_rpc_cmd_resp_data_send(uint8_t               op_code,
                                    uint8_t               status,
                                    const uint8_t * const p_data,
                                    uint16_t              data_len)
{
    uint8_t * p_buffer;
    uint32_t  err_code;
    uint32_t  index = 0;

    // Allocate a memory buffer from HCI transport layer for transmitting the Command Response.
    // Loop until a buffer is available.
    do
    {    
        err_code = hci_transport_tx_alloc(&p_buffer);
    }
    while (err_code == NRF_ERROR_NO_MEM);

    if (err_code == NRF_SUCCESS)
    {
        // Encode packet type.
        p_buffer[index++] = BLE_RPC_PKT_RESP;

        // Encode Op Code.
        p_buffer[index++] = op_code;

        // Encode Status.
        index += uint32_encode(status, &(p_buffer[index]));

        // Additional data in response packet.
        memcpy(&p_buffer[index], p_data, data_len);

        index += data_len;

        return hci_transport_pkt_write(p_buffer, index);
    }

    return err_code;
}
uint32_t sd_ble_gap_conn_param_update(uint16_t                            conn_handle,
                                      ble_gap_conn_params_t const * const p_conn_params)
{
    uint32_t index = 0;

    g_cmd_buffer[index++] = BLE_RPC_PKT_CMD;
    g_cmd_buffer[index++] = SD_BLE_GAP_CONN_PARAM_UPDATE;
    index                += uint16_encode(conn_handle, &g_cmd_buffer[index]);

    if (p_conn_params != NULL)
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
        index                += uint16_encode(p_conn_params->min_conn_interval, 
                                              &g_cmd_buffer[index]);
        index                += uint16_encode(p_conn_params->max_conn_interval, 
                                              &g_cmd_buffer[index]);
        index                += uint16_encode(p_conn_params->slave_latency, 
                                              &g_cmd_buffer[index]);
        index                += uint16_encode(p_conn_params->conn_sup_timeout, 
                                              &g_cmd_buffer[index]);
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }

    uint32_t err_code = hci_transport_pkt_write(g_cmd_buffer, index);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }

    err_code = ble_rpc_cmd_resp_wait(SD_BLE_GAP_CONN_PARAM_UPDATE);
    UNUSED_VARIABLE(hci_transport_rx_pkt_consume(g_cmd_response_buf));
    return err_code;
}
Example #11
0
uint32_t sd_ble_uuid_encode(ble_uuid_t const * const p_uuid,
                            uint8_t          * const p_uuid_le_len,
                            uint8_t          * const p_uuid_le)
{
    uint32_t err_code;
    uint32_t index = 0;
    
    g_cmd_buffer[index++] = BLE_RPC_PKT_CMD;
    g_cmd_buffer[index++] = SD_BLE_UUID_ENCODE;

    if (p_uuid != NULL)
    {    
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
        index                += uint16_encode(p_uuid->uuid, &g_cmd_buffer[index]);
        g_cmd_buffer[index++] = p_uuid->type;
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }
    if (p_uuid_le_len != NULL)
    {        
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }        
    if (p_uuid_le != NULL)
    {        
        g_cmd_buffer[index++] = RPC_BLE_FIELD_PRESENT;
    }
    else
    {
        g_cmd_buffer[index++] = RPC_BLE_FIELD_NOT_PRESENT;
    }            

    err_code = hci_transport_pkt_write(g_cmd_buffer, index);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }
        
    err_code = ble_rpc_cmd_resp_wait(SD_BLE_UUID_ENCODE);
    if (p_uuid_le_len != NULL)
    {
        *p_uuid_le_len = g_cmd_response_buf[BLE_OP_CODE_SIZE  +
                                            BLE_PKT_TYPE_SIZE +
                                            RPC_ERR_CODE_SIZE];
    }
    if ((p_uuid_le != NULL) && (p_uuid_le_len != NULL))
    {
        memcpy(p_uuid_le, 
               &(g_cmd_response_buf[BLE_OP_CODE_SIZE  +
                                    BLE_PKT_TYPE_SIZE +
                                    RPC_ERR_CODE_SIZE +
                                    sizeof(*p_uuid_le_len)]),
               *p_uuid_le_len);
    }

    UNUSED_VARIABLE(hci_transport_rx_pkt_consume(g_cmd_response_buf));
    
    return err_code;
}