Пример #1
0
uint32_t ser_sd_transport_cmd_write(const uint8_t *                p_buffer,
                                    uint16_t                       length,
                                    ser_sd_transport_rsp_handler_t cmd_rsp_decode_callback)
{
    uint32_t err_code = NRF_SUCCESS;

    m_rsp_wait        = true;
    m_rsp_dec_handler = cmd_rsp_decode_callback;
    err_code          = ser_hal_transport_tx_pkt_send(p_buffer, length);
    APP_ERROR_CHECK(err_code);

    /* Execute callback for response decoding only if one was provided.*/
    if ((err_code == NRF_SUCCESS) && cmd_rsp_decode_callback)
    {
        if (m_ot_rsp_wait_handler)
        {
            m_ot_rsp_wait_handler();
            m_ot_rsp_wait_handler = NULL;
        }

        m_os_rsp_wait_handler();
        err_code = m_return_value;
    }
    else
    {
        m_rsp_wait = false;
    }
    
    NRF_LOG_DEBUG("[SD_CALL]:%s, err_code= 0x%X\r\n", (uint32_t)ser_dbg_sd_call_str_get(p_buffer[1]), err_code);
    return err_code;
}
Пример #2
0
uint32_t ser_conn_dtm_command_process(uint8_t * p_command, uint16_t command_len)
{
    SER_ASSERT_NOT_NULL(p_command);

    uint32_t  err_code   = NRF_SUCCESS;
    uint8_t * p_tx_buf   = NULL;
    uint32_t  tx_buf_len = 0;

    /* Allocate a memory buffer from HAL Transport layer for transmitting the Command Response.
     * Loop until a buffer is available. */
    do
    {
        err_code = ser_hal_transport_tx_pkt_alloc(&p_tx_buf, (uint16_t *)&tx_buf_len);
        if (err_code == NRF_ERROR_NO_MEM)
        {
            ser_conn_on_no_mem_handler();
        }
    }
    while (NRF_ERROR_NO_MEM == err_code);

    if (err_code == NRF_SUCCESS)
    {
        p_tx_buf[SER_PKT_TYPE_POS] = SER_PKT_TYPE_DTM_RESP;
        tx_buf_len                -= SER_PKT_TYPE_SIZE;

        err_code = ble_dtm_init_req_dec(p_command, command_len, &m_comm_params);

        if (NRF_SUCCESS == err_code)
        {
            err_code = ble_dtm_init_rsp_enc(NRF_SUCCESS,
                                            &p_tx_buf[SER_PKT_TYPE_SIZE],
                                            &tx_buf_len);

            if (err_code != NRF_SUCCESS)
            {
                return NRF_ERROR_INTERNAL;
            }

            tx_buf_len += SER_PKT_TYPE_SIZE;

            /* Set a flag that device is ready to enter DTM mode. */
            m_is_ready_to_enter_dtm = true;

            err_code = ser_hal_transport_tx_pkt_send(p_tx_buf, (uint16_t)tx_buf_len);
            if (err_code != NRF_SUCCESS)
            {
                err_code = NRF_ERROR_INTERNAL;
            }

            /* TX buffer is going to be freed automatically in the HAL Transport layer. */
        }
        else
        {
            err_code = NRF_ERROR_INTERNAL;
        }
    }

    return err_code;
}
Пример #3
0
void ser_conn_ble_event_encoder(void * p_event_data, uint16_t event_size)
{
    if (NULL == p_event_data)
    {
        APP_ERROR_CHECK(NRF_ERROR_NULL);
    }
    UNUSED_PARAMETER(event_size);

    uint32_t    err_code   = NRF_SUCCESS;
    uint8_t *   p_tx_buf   = NULL;
    uint32_t    tx_buf_len = 0;
    ble_evt_t * p_ble_evt  = (ble_evt_t *)p_event_data;

    /* Allocate a memory buffer from HAL Transport layer for transmitting an event.
     * Loop until a buffer is available. */
    do
    {
        err_code = ser_hal_transport_tx_pkt_alloc(&p_tx_buf, (uint16_t *)&tx_buf_len);
    }
    while (err_code == NRF_ERROR_NO_MEM);
    APP_ERROR_CHECK(err_code);

    /* Create a new packet. */
    p_tx_buf[SER_PKT_TYPE_POS] = SER_PKT_TYPE_EVT;
    tx_buf_len                -= SER_PKT_TYPE_SIZE;

    /* Pass a memory for an event (opcode + data) and encode it. */
    err_code = ble_event_enc(p_ble_evt, 0, &p_tx_buf[SER_PKT_OP_CODE_POS], &tx_buf_len);

    if (NRF_ERROR_NOT_SUPPORTED != err_code)
    {
        APP_ERROR_CHECK(err_code);
        tx_buf_len += SER_PKT_TYPE_SIZE;
        err_code    = ser_hal_transport_tx_pkt_send(p_tx_buf, (uint16_t)tx_buf_len);
        APP_ERROR_CHECK(err_code);
        /* TX buffer is going to be freed automatically in the HAL Transport layer.
         * Scheduler must be paused because this function returns before a packet is physically sent
         * by transport layer. This can cause start processing of a next event from the application
         * scheduler queue. In result the next event reserves the TX buffer before the current
         * packet is sent. If in meantime a command arrives a command response cannot be sent in
         * result. Pausing the scheduler temporary prevents processing a next event. */
        app_sched_pause();
    }
    else
    {
        /* Event was NOT encoded, therefore the buffer is freed immediately. */
        err_code = ser_hal_transport_tx_pkt_free(p_tx_buf);
        APP_ERROR_CHECK(err_code);
        APP_ERROR_CHECK(SER_WARNING_CODE);
    }
}
Пример #4
0
uint32_t ser_conn_command_process(uint8_t * p_command, uint16_t command_len)
{
    SER_ASSERT_NOT_NULL(p_command);
    SER_ASSERT_LENGTH_LEQ(SER_OP_CODE_SIZE, command_len);

    uint32_t  err_code   = NRF_SUCCESS;
    uint8_t * p_tx_buf   = NULL;
    uint32_t  tx_buf_len = 0;
    uint8_t   opcode     = p_command[SER_CMD_OP_CODE_POS];
    uint32_t  index      = 0;

    /* Allocate a memory buffer from HAL Transport layer for transmitting the Command Response.
     * Loop until a buffer is available. */
    do
    {
        err_code = ser_hal_transport_tx_pkt_alloc(&p_tx_buf, (uint16_t *)&tx_buf_len);
    }
    while (NRF_ERROR_NO_MEM == err_code);

    if (NRF_SUCCESS == err_code)
    {
        /* Create a new response packet. */
        p_tx_buf[SER_PKT_TYPE_POS] = SER_PKT_TYPE_RESP;
        tx_buf_len                -= SER_PKT_TYPE_SIZE;

        /* Decode a request, pass a memory for a response command (opcode + data) and encode it. */
        err_code = conn_mw_handler
                       (p_command, command_len, &p_tx_buf[SER_PKT_OP_CODE_POS], &tx_buf_len);

        /* Command decoder not found. */
        if (NRF_ERROR_NOT_SUPPORTED == err_code)
        {
            APP_ERROR_CHECK(SER_WARNING_CODE);
            err_code = op_status_enc
                           (opcode, NRF_ERROR_NOT_SUPPORTED,
                           &p_tx_buf[SER_PKT_OP_CODE_POS], &tx_buf_len, &index);
            if (NRF_SUCCESS == err_code)
            {
                tx_buf_len += SER_PKT_TYPE_SIZE;
                err_code   = ser_hal_transport_tx_pkt_send(p_tx_buf, (uint16_t)tx_buf_len);
                /* TX buffer is going to be freed automatically in the HAL Transport layer. */
                if (NRF_SUCCESS != err_code)
                {
                    err_code = NRF_ERROR_INTERNAL;
                }
            }
            else
            {
                err_code = NRF_ERROR_INTERNAL;
            }
        }
        else if (NRF_SUCCESS == err_code) /* Send a response. */
        {
            tx_buf_len += SER_PKT_TYPE_SIZE;
            err_code    = ser_hal_transport_tx_pkt_send(p_tx_buf, (uint16_t)tx_buf_len);

            /* TX buffer is going to be freed automatically in the HAL Transport layer. */
            if (NRF_SUCCESS != err_code)
            {
                err_code = NRF_ERROR_INTERNAL;
            }
        }
        else
        {
            err_code = NRF_ERROR_INTERNAL;
        }
    }
    else
    {
        err_code = NRF_ERROR_INTERNAL;
    }

    return err_code;
}