/**@brief Function for handling the rx packets comming from hal_transport. * * @details * This function is called in serial peripheral interrupt context. Response packets are handled in * this context. Events are passed to the application and it is up to application in which context * they are handled. * * @param[in] p_data Pointer to received data. * @param[in] length Size of data. */ static void ser_sd_transport_rx_packet_handler(uint8_t * p_data, uint16_t length) { if (p_data && (length >= SER_PKT_TYPE_SIZE)) { const uint8_t packet_type = p_data[SER_PKT_TYPE_POS]; p_data += SER_PKT_TYPE_SIZE; length -= SER_PKT_TYPE_SIZE; switch (packet_type) { case SER_PKT_TYPE_RESP: case SER_PKT_TYPE_DTM_RESP: #ifdef ANT_STACK_SUPPORT_REQD case SER_PKT_TYPE_ANT_RESP: #endif // ANT_STACK_SUPPORT_REQD if (m_rsp_wait) { m_return_value = m_rsp_dec_handler(p_data, length); (void)ser_sd_transport_rx_free(p_data); /* Reset response flag - cmd_write function is pending on it.*/ m_rsp_wait = false; /* If os handler is set, signal os that response has arrived.*/ if (m_os_rsp_set_handler) { m_os_rsp_set_handler(); } } else { /* Unexpected packet. */ (void)ser_sd_transport_rx_free(p_data); APP_ERROR_HANDLER(packet_type); } break; #ifdef BLE_STACK_SUPPORT_REQD case SER_PKT_TYPE_EVT: /* It is ensured during opening that handler is not NULL. No check needed. */ NRF_LOG_DEBUG("[EVT]: %s ", (uint32_t)ser_dbg_sd_evt_str_get(uint16_decode(&p_data[SER_EVT_ID_POS]))); // p_data points to EVT_ID m_ble_evt_handler(p_data, length); break; #endif // BLE_STACK_SUPPORT_REQD #ifdef ANT_STACK_SUPPORT_REQD case SER_PKT_TYPE_ANT_EVT: /* It is ensured during opening that handler is not NULL. No check needed. */ NRF_LOG_DEBUG("[ANT_EVT_ID]: %s ", (uint32_t)ser_dbg_sd_evt_str_get(uint16_decode(&p_data[SER_EVT_ID_POS]))); // p_data points to EVT_ID m_ant_evt_handler(p_data, length); break; #endif // ANT_STACK_SUPPORT_REQD default: (void)ser_sd_transport_rx_free(p_data); APP_ERROR_HANDLER(packet_type); break; } } }
/**@brief Function for handling the rx packets comming from hal_transport. * * @details * This function is called in serial peripheral interrupt context. Response packets are handled in * this context. Events are passed to the application and it is up to application in which context * they are handled. * * @param[in] p_data Pointer to received data. * @param[in] length Size of data. */ static void ser_sd_transport_rx_packet_handler(uint8_t * p_data, uint16_t length) { if (p_data && (length >= SER_PKT_TYPE_SIZE)) { const uint8_t packet_type = p_data[SER_PKT_TYPE_POS]; p_data += SER_PKT_TYPE_SIZE; length -= SER_PKT_TYPE_SIZE; switch (packet_type) { case SER_PKT_TYPE_RESP: case SER_PKT_TYPE_DTM_RESP: if (m_rsp_wait) { m_return_value = m_rsp_dec_handler(p_data, length); (void)ser_sd_transport_rx_free(p_data); /* Reset response flag - cmd_write function is pending on it.*/ m_rsp_wait = false; /* If os handler is set, signal os that response has arrived.*/ if (m_os_rsp_set_handler) { m_os_rsp_set_handler(); } } else { /* Unexpected packet. */ (void)ser_sd_transport_rx_free(p_data); APP_ERROR_HANDLER(packet_type); } break; case SER_PKT_TYPE_EVT: /* It is ensured during opening that handler is not NULL. No check needed. */ APPL_LOG("\r\n[EVT_ID]: 0x%X \r\n", uint16_decode(&p_data[SER_EVT_ID_POS])); // p_data points to EVT_ID m_evt_handler(p_data, length); break; default: (void)ser_sd_transport_rx_free(p_data); APP_ERROR_HANDLER(packet_type); break; } } }
static void ser_softdevice_evt_handler(uint8_t * p_data, uint16_t length) { ser_sd_handler_evt_data_t item; uint32_t err_code; uint32_t len32 = sizeof (item.evt_data); err_code = ble_event_dec(p_data, length, (ble_evt_t *)item.evt_data, &len32); APP_ERROR_CHECK(err_code); err_code = ser_sd_transport_rx_free(p_data); APP_ERROR_CHECK(err_code); err_code = app_mailbox_put(&sd_ble_evt_mailbox, &item); APP_ERROR_CHECK(err_code); ser_app_hal_nrf_evt_pending(); }