error_t hw_radio_send_packet(hw_radio_packet_t* packet, tx_packet_callback_t tx_cb, uint16_t eta, uint8_t dll_header_bg_frame[2]) { assert(eta == 0); // advertising not implemented on si4460 for now // TODO error handling EINVAL, ESIZE, EOFF if(current_state == HW_RADIO_STATE_TX) return EBUSY; uint8_t data_length = packet->length + 1; if (packet->tx_meta.tx_cfg.channel_id.channel_header.ch_coding == PHY_CODING_FEC_PN9) { DPRINT("Original packet: %d", data_length); DPRINT_DATA(packet->data, data_length); data_length = fec_encode(packet->data, data_length); DPRINT("Encoded packet: %d", data_length); DPRINT_DATA(packet->data, data_length); } else { if (has_hardware_crc) data_length -= 2; } tx_packet_callback = tx_cb; if(current_state == HW_RADIO_STATE_RX) { //pending_rx_cfg.channel_id = current_channel_id; //pending_rx_cfg.syncword_class = current_syncword_class; should_rx_after_tx_completed = true; } current_state = HW_RADIO_STATE_TX; current_packet = packet; DPRINT("Data to TX Fifo:"); DPRINT_DATA(packet->data, data_length); DPRINT("TX ch header=%x, ind=%i", packet->tx_meta.tx_cfg.channel_id.channel_header_raw, packet->tx_meta.tx_cfg.channel_id.center_freq_index); configure_channel((channel_id_t*)&(packet->tx_meta.tx_cfg.channel_id)); configure_eirp(packet->tx_meta.tx_cfg.eirp); configure_syncword_class(current_packet->tx_meta.tx_cfg.syncword_class, current_packet->tx_meta.tx_cfg.channel_id.channel_header.ch_coding); DEBUG_TX_START(); DEBUG_RX_END(); ezradioStartTx(packet, ez_channel_id, should_rx_after_tx_completed, data_length); return SUCCESS; }
error_t hw_radio_send_packet(hw_radio_packet_t* packet, tx_packet_callback_t tx_cb) { // TODO error handling EINVAL, ESIZE, EOFF if(current_state == HW_RADIO_STATE_TX) return EBUSY; uint8_t data_length = packet->length + 1; if (packet->tx_meta.tx_cfg.channel_id.channel_header.ch_coding == PHY_CODING_FEC_PN9) { DPRINT(LOG_STACK_PHY, "Original packet: %d", data_length); DPRINT_DATA(packet->data, data_length); data_length = fec_encode(packet->data, data_length); DPRINT(LOG_STACK_PHY, "Encoded packet: %d", data_length); DPRINT_DATA(packet->data, data_length); } else { if (has_hardware_crc) data_length -= 2; } tx_packet_callback = tx_cb; if(current_state == HW_RADIO_STATE_RX) { //pending_rx_cfg.channel_id = current_channel_id; //pending_rx_cfg.syncword_class = current_syncword_class; should_rx_after_tx_completed = true; } current_state = HW_RADIO_STATE_TX; current_packet = packet; DPRINT(LOG_STACK_PHY, "Data to TX Fifo:"); DPRINT_DATA(packet->data, data_length); configure_channel((channel_id_t*)&(packet->tx_meta.tx_cfg.channel_id)); configure_eirp(packet->tx_meta.tx_cfg.eirp); configure_syncword_class(current_packet->tx_meta.tx_cfg.syncword_class, current_packet->tx_meta.tx_cfg.channel_id.channel_header.ch_coding); DEBUG_TX_START(); DEBUG_RX_END(); ezradioStartTx(packet, ez_channel_id, should_rx_after_tx_completed, data_length); return SUCCESS; }