bool hal_aci_tl_event_get(hal_aci_data_t *p_aci_data) { bool was_full = m_aci_q_is_full(&aci_rx_q); if (m_aci_q_dequeue(&aci_rx_q, p_aci_data)) { if (true == aci_debug_print) { Serial.print(" E"); m_print_aci_data(p_aci_data); } if (was_full) { if (true == a_pins_local_ptr->interface_is_interrupt) { /* Enable RDY line interrupt again */ //EIMSK |= (0x2); //AVR Specific - PIC32,DUE,STM32 todo } } return true; } else { return false; } }
bool hal_aci_tl_event_get(hal_aci_data_t *p_aci_data) { bool was_full = m_aci_q_is_full(&aci_rx_q); if (m_aci_q_dequeue(&aci_rx_q, p_aci_data)) { if (true == aci_debug_print) { Serial.print(" E"); m_print_aci_data(p_aci_data); } if (was_full) { toggle_eimsk(true); } return true; } else { return false; } }
hal_aci_data_t * hal_aci_tl_poll_get(void) { uint8_t byte_cnt; uint8_t byte_sent_cnt; uint8_t max_bytes; hal_aci_data_t data_to_send; digitalWrite(a_pins_local_ptr->reqn_pin, 0); // Receive from queue if (m_aci_q_dequeue(&aci_tx_q, &data_to_send) == false) { /* queue was empty, nothing to send */ data_to_send.status_byte = 0; data_to_send.buffer[0] = 0; } //Change this if your mcu has DMA for the master SPI // Send length, receive header byte_sent_cnt = 0; //Byte at index 0 sent, byte from slave is the status byte received_data.status_byte = spi_readwrite(data_to_send.buffer[byte_sent_cnt++]); // Send first byte, receive length from slave received_data.buffer[0] = spi_readwrite(data_to_send.buffer[byte_sent_cnt++]); if (0 == data_to_send.buffer[0]) { max_bytes = received_data.buffer[0]; } else { // Set the maximum to the biggest size. One command byte is already sent max_bytes = (received_data.buffer[0] > (data_to_send.buffer[0] - 1)) ? received_data.buffer[0] : (data_to_send.buffer[0] - 1); } if (max_bytes > HAL_ACI_MAX_LENGTH) { max_bytes = HAL_ACI_MAX_LENGTH; } // Transmit/receive the rest of the packet for (byte_cnt = 0; byte_cnt < max_bytes; byte_cnt++) { received_data.buffer[byte_cnt+1] = spi_readwrite(data_to_send.buffer[byte_sent_cnt++]); } //REQN/SS is set to high digitalWrite(a_pins_local_ptr->reqn_pin, 1); //RDYN should automatically follow the REQN line in approx 100ns //sleep_enable(); if (a_pins_local_ptr->interface_is_interrupt) { attachInterrupt(a_pins_local_ptr->interrupt_number, m_rdy_line_handle, LOW); } if (false == m_aci_q_is_empty(&aci_tx_q)) { //Lower the REQN line to start a new ACI transaction digitalWrite(a_pins_local_ptr->reqn_pin, 0); } /* valid Rx available or transmit finished*/ return (&received_data); }
hal_aci_data_t * hal_aci_tl_poll_get(void) { uint8_t byte_cnt; uint8_t byte_sent_cnt; uint8_t max_bytes; hal_aci_data_t data_to_send; //SPI.begin(); HAL_IO_SET_STATE(HAL_IO_RADIO_REQN, 0); // Receive from queue if (m_aci_q_dequeue(&aci_tx_q, &data_to_send) == false) { /* queue was empty, nothing to send */ data_to_send.status_byte = 0; data_to_send.buffer[0] = 0; } //Change this if your mcu has DMA for the master SPI // Send length, receive header byte_sent_cnt = 0; received_data.status_byte = spi_readwrite(data_to_send.buffer[byte_sent_cnt++]); // Send first byte, receive length from slave received_data.buffer[0] = spi_readwrite(data_to_send.buffer[byte_sent_cnt++]); if (0 == data_to_send.buffer[0]) { max_bytes = received_data.buffer[0]; } else { // Set the maximum to the biggest size. One command byte is already sent max_bytes = (received_data.buffer[0] > (data_to_send.buffer[0] - 1)) ? received_data.buffer[0] : (data_to_send.buffer[0] - 1); } if (max_bytes > HAL_ACI_MAX_LENGTH) { max_bytes = HAL_ACI_MAX_LENGTH; } // Transmit/receive the rest of the packet for (byte_cnt = 0; byte_cnt < max_bytes; byte_cnt++) { received_data.buffer[byte_cnt+1] = spi_readwrite(data_to_send.buffer[byte_sent_cnt++]); } HAL_IO_SET_STATE(HAL_IO_RADIO_REQN, 1); //SPI.end(); //RDYN should follow the REQN line in approx 100ns sleep_enable(); attachInterrupt(HAL_IO_RADIO_IRQ, m_rdy_line_handle, LOW); if (false == m_aci_q_is_empty(&aci_tx_q)) { //Lower the REQN line to start a new ACI transaction HAL_IO_SET_STATE(HAL_IO_RADIO_REQN, 0); } /* valid Rx available or transmit finished*/ return (&received_data); }