/* Checks the RDYN line and runs the SPI transfer if required. */ static void m_aci_event_check(void) { hal_aci_data_t data_to_send; hal_aci_data_t received_data; // No room to store incoming messages if (aci_queue_is_full(&aci_rx_q)) { return; } // If the ready line is disabled and we have pending messages outgoing we enable the request line if (HIGH == mraa_gpio_read (a_pins_local_ptr->m_rdy_ctx)) // if (HIGH == digitalRead(a_pins_local_ptr->rdyn_pin)) { if (!aci_queue_is_empty(&aci_tx_q)) { m_aci_reqn_enable(); } return; } // Receive from queue if (!aci_queue_dequeue(&aci_tx_q, &data_to_send)) { /* queue was empty, nothing to send */ data_to_send.status_byte = 0; data_to_send.buffer[0] = 0; } // Receive and/or transmit data m_aci_spi_transfer(&data_to_send, &received_data); /* If there are messages to transmit, and we can store the reply, we request a new transfer */ if (!aci_queue_is_full(&aci_rx_q) && !aci_queue_is_empty(&aci_tx_q)) { m_aci_reqn_enable(); } // Check if we received data if (received_data.buffer[0] > 0) { if (!aci_queue_enqueue(&aci_rx_q, &received_data)) { /* Receive Buffer full. Should never happen. Spin in a while loop. */ while(1); } } return; }
bool hal_aci_tl_event_get(hal_aci_data_t *p_aci_data) { bool was_full; #ifdef HAL_ACI_TL_INTERRUPT if (!a_pins_local_ptr->interface_is_interrupt && !aci_queue_is_full(&aci_rx_q)) #else if (!aci_queue_is_full(&aci_rx_q)) #endif { m_aci_event_check(); } was_full = aci_queue_is_full(&aci_rx_q); if (aci_queue_dequeue(&aci_rx_q, p_aci_data)) { #ifdef HAL_ACI_TL_DEBUG if (aci_debug_print) { Serial.print(" E"); m_aci_data_print(p_aci_data); } #endif #ifdef HAL_ACI_TL_INTERRUPT if (was_full && a_pins_local_ptr->interface_is_interrupt) { /* Enable RDY line interrupt again */ attachInterrupt(a_pins_local_ptr->interrupt_number, m_aci_isr, LOW); #if defined(SPI_HAS_TRANSACTION) && defined(__SAMD21G18A__) SPI.usingInterrupt(a_pins->interrupt_number); #endif } #endif /* Attempt to pull REQN LOW since we've made room for new messages */ if (!aci_queue_is_full(&aci_rx_q) && !aci_queue_is_empty(&aci_tx_q)) { m_aci_reqn_enable(); } return true; } return false; }
bool hal_aci_tl_event_get(hal_aci_data_t *p_aci_data) { bool was_full; if (!a_pins_local_ptr->interface_is_interrupt && !aci_queue_is_full(&aci_rx_q)) { m_aci_event_check(); } was_full = aci_queue_is_full(&aci_rx_q); if (aci_queue_dequeue(&aci_rx_q, p_aci_data)) { if (aci_debug_print) { Serial.print(" E"); m_aci_data_print(p_aci_data); } if (was_full && a_pins_local_ptr->interface_is_interrupt) { /* Enable RDY line interrupt again */ attachInterrupt(a_pins_local_ptr->interrupt_number, m_aci_isr, LOW); } /* Attempt to pull REQN LOW since we've made room for new messages */ if (!aci_queue_is_full(&aci_rx_q) && !aci_queue_is_empty(&aci_tx_q)) { m_aci_reqn_enable(); } return true; } return false; }