@@ -209,8 +209,8 @@ static rf_mode_e rf_mode = RF_MODE_NORMAL;
209209static bool rf_update_config = false ;
210210static uint16_t cur_packet_len = 0xffff ;
211211static uint32_t receiver_ready_timestamp;
212-
213212static int16_t rssi_threshold = RSSI_THRESHOLD;
213+ static uint32_t tx_start_time = 0 ;
214214
215215/* Channel configurations for sub-GHz */
216216static phy_rf_channel_configuration_s phy_subghz = {
@@ -276,6 +276,20 @@ static uint32_t rf_get_timestamp(void)
276276 return (uint32_t )rf->tx_timer .read_us ();
277277}
278278
279+ static void rf_update_tx_active_time (void )
280+ {
281+ if (device_driver.phy_rf_statistics ) {
282+ device_driver.phy_rf_statistics ->tx_active_time += rf_get_timestamp () - tx_start_time;
283+ }
284+ }
285+
286+ static void rf_update_rx_active_time (void )
287+ {
288+ if (device_driver.phy_rf_statistics ) {
289+ device_driver.phy_rf_statistics ->rx_active_time += rf_get_timestamp () - rx_time;
290+ }
291+ }
292+
279293static void rf_lock (void )
280294{
281295 platform_enter_critical ();
@@ -739,6 +753,7 @@ static void rf_tx_sent_handler(void)
739753 rf_disable_interrupt (TX_DATA_SENT);
740754 if (rf_state != RF_TX_ACK) {
741755 tx_finnish_time = rf_get_timestamp ();
756+ rf_update_tx_active_time ();
742757 TEST_TX_DONE
743758 rf_state = RF_IDLE;
744759 rf_receive (rf_rx_channel);
@@ -771,6 +786,7 @@ static void rf_start_tx(void)
771786 rf_disable_all_interrupts ();
772787 rf_poll_state_change (S2LP_STATE_READY);
773788 rf_state_change (S2LP_STATE_TX, false );
789+ tx_start_time = rf_get_timestamp ();
774790 // More TX data to be written in FIFO when TX threshold interrupt occurs
775791 if (tx_data_ptr) {
776792 rf_enable_interrupt (TX_FIFO_ALMOST_EMPTY);
@@ -805,6 +821,7 @@ static void rf_cca_timer_interrupt(void)
805821 }
806822 rf_flush_tx_fifo ();
807823 tx_finnish_time = rf_get_timestamp ();
824+ rf_update_tx_active_time ();
808825 if (device_driver.phy_tx_done_cb ) {
809826 device_driver.phy_tx_done_cb (rf_radio_driver_id, mac_tx_handle, PHY_LINK_CCA_FAIL, 0 , 0 );
810827 }
@@ -825,6 +842,9 @@ static void rf_cca_timer_interrupt(void)
825842 rf_start_tx ();
826843 rf_state = RF_TX_STARTED;
827844 TEST_TX_STARTED
845+ if (device_driver.phy_rf_statistics ) {
846+ device_driver.phy_rf_statistics ->tx_bytes += tx_data_length;
847+ }
828848 }
829849 }
830850}
@@ -843,10 +863,12 @@ static void rf_backup_timer_interrupt(void)
843863{
844864 tx_finnish_time = rf_get_timestamp ();
845865 if (rf_state == RF_RX_STARTED) {
866+ rf_update_rx_active_time ();
846867 if (device_driver.phy_rf_statistics ) {
847868 device_driver.phy_rf_statistics ->rx_timeouts ++;
848869 }
849870 } else {
871+ rf_update_tx_active_time ();
850872 if (device_driver.phy_rf_statistics ) {
851873 device_driver.phy_rf_statistics ->tx_timeouts ++;
852874 }
@@ -921,13 +943,17 @@ static void rf_send_ack(uint8_t seq)
921943 rf_start_tx ();
922944 TEST_ACK_TX_STARTED
923945 rf_backup_timer_start (ACK_SENDING_TIME);
946+ if (device_driver.phy_rf_statistics ) {
947+ device_driver.phy_rf_statistics ->tx_bytes += sizeof (ack_frame);
948+ }
924949}
925950
926951static void rf_handle_ack (uint8_t seq_number, uint8_t pending)
927952{
928953 phy_link_tx_status_e phy_status;
929954 if (tx_sequence == (uint16_t )seq_number) {
930955 tx_finnish_time = rf_get_timestamp ();
956+ rf_update_tx_active_time ();
931957 if (pending) {
932958 phy_status = PHY_LINK_TX_DONE_PENDING;
933959 } else {
@@ -966,6 +992,9 @@ static void rf_rx_ready_handler(void)
966992 rf_send_ack (rx_buffer[2 ]);
967993 }
968994 }
995+ if (device_driver.phy_rf_statistics ) {
996+ device_driver.phy_rf_statistics ->rx_bytes += rx_data_length;
997+ }
969998 } else {
970999 rf_state = RF_IDLE;
9711000 int8_t rssi = (rf_read_register (RSSI_LEVEL) - RSSI_OFFSET);
@@ -1072,6 +1101,7 @@ static void rf_irq_task_process_irq(void)
10721101 if ((irq_status & (1 << TX_FIFO_UNF_OVF)) && (enabled_interrupts & (1 << TX_FIFO_UNF_OVF))) {
10731102 rf_backup_timer_stop ();
10741103 tx_finnish_time = rf_get_timestamp ();
1104+ rf_update_tx_active_time ();
10751105 TEST_TX_DONE
10761106 device_driver.phy_tx_done_cb (rf_radio_driver_id, mac_tx_handle, PHY_LINK_CCA_FAIL, 1 , 0 );
10771107 rf_send_command (S2LP_CMD_SABORT);
@@ -1087,6 +1117,7 @@ static void rf_irq_task_process_irq(void)
10871117 }
10881118 } else if (rf_state == RF_RX_STARTED) {
10891119 if ((irq_status & (1 << RX_DATA_READY)) && (enabled_interrupts & (1 << RX_DATA_READY))) {
1120+ rf_update_rx_active_time ();
10901121 if (!(irq_status & (1 << CRC_ERROR))) {
10911122 rf_rx_ready_handler ();
10921123 } else {
@@ -1112,6 +1143,7 @@ static void rf_irq_task_process_irq(void)
11121143 }
11131144 }
11141145 if ((irq_status & (1 << RX_FIFO_UNF_OVF)) && (enabled_interrupts & (1 << RX_FIFO_UNF_OVF))) {
1146+ rf_update_rx_active_time ();
11151147 TEST_RX_DONE
11161148 rf_backup_timer_stop ();
11171149 rf_send_command (S2LP_CMD_SABORT);
0 commit comments