diff --git a/TODO b/TODO index f57b246fb3f8602372ef66ab5ff4ab3b8fa4c41b..5aeff3336abf780985738f995abb23a1beeff96d 100644 --- a/TODO +++ b/TODO @@ -44,6 +44,8 @@ Version 1.5.0: * ethercat tool: - Data type abbreviations. - Implement ranges for slaves and domains. +* Output send errors in frame statistics. +* Output tx rate [bytes/s] in frame statistics. Future issues: diff --git a/master/device.c b/master/device.c index 5730a0e839b3f5ee594ee5418bf0c6b038bb4966..c1a2c3989f6333e7fddcee57a2304a2746b676e7 100644 --- a/master/device.c +++ b/master/device.c @@ -324,19 +324,31 @@ void ec_device_send( // frame statistics if (unlikely(jiffies - device->stats_jiffies >= HZ)) { unsigned int i; - unsigned int tx_rate = - (device->tx_count - device->last_tx_count) * 1000; - int loss = device->tx_count - device->rx_count; - int loss_rate = (loss - device->last_loss) * 1000; - for (i = 0; i < EC_RATE_COUNT; i++) { - unsigned int n = rate_intervals[i]; - device->tx_rates[i] = - (device->tx_rates[i] * (n - 1) + tx_rate) / n; - device->loss_rates[i] = - (device->loss_rates[i] * (n - 1) + loss_rate) / n; + if (device->link_state) { + unsigned int tx_rate = + (device->tx_count - device->last_tx_count) * 1000; + int loss = device->tx_count - device->rx_count; + int loss_rate = (loss - device->last_loss) * 1000; + for (i = 0; i < EC_RATE_COUNT; i++) { + unsigned int n = rate_intervals[i]; + device->tx_rates[i] = + (device->tx_rates[i] * (n - 1) + tx_rate) / n; + device->loss_rates[i] = + (device->loss_rates[i] * (n - 1) + loss_rate) / n; + } + device->last_tx_count = device->tx_count; + device->last_loss = loss; + } else { + // zero frame statistics + device->tx_count = 0; + device->rx_count = 0; + device->last_tx_count = 0; + device->last_loss = 0; + for (i = 0; i < EC_RATE_COUNT; i++) { + device->tx_rates[i] = 0; + device->loss_rates[i] = 0; + } } - device->last_tx_count = device->tx_count; - device->last_loss = loss; device->stats_jiffies = jiffies; } diff --git a/master/device.h b/master/device.h index c5c8882b979e76cbffb510b77a17362c595887a1..17e6bae8ef41965688edda0ee89cdf76cd3c4149 100644 --- a/master/device.h +++ b/master/device.h @@ -96,13 +96,19 @@ struct ec_device struct timeval timeval_poll; #endif unsigned long jiffies_poll; /**< jiffies of last poll */ - unsigned int tx_count; /**< number of frames sent */ - unsigned int rx_count; /**< number of frames received */ - unsigned int last_tx_count; - unsigned int tx_rates[EC_RATE_COUNT]; - int last_loss; /**< Tx/Rx difference of last cycle. */ - int loss_rates[EC_RATE_COUNT]; - unsigned long stats_jiffies; + + // Frame statistics + unsigned int tx_count; /**< Number of frames sent. */ + unsigned int rx_count; /**< Number of frames received. */ + unsigned int last_tx_count; /**< Number of frames sent of last statistics + cycle. */ + unsigned int tx_rates[EC_RATE_COUNT]; /**< Transmit rates for different + statistics cycle periods. */ + int last_loss; /**< Tx/Rx difference of last statistics cycle. */ + int loss_rates[EC_RATE_COUNT]; /**< Frame loss rates for different + statistics cycle periods. */ + unsigned long stats_jiffies; /**< Jiffies of last statistic cycle. */ + #ifdef EC_DEBUG_IF ec_debug_t dbg; /**< debug device */ #endif