2020-12-25 16:10:38 -08:00
|
|
|
#include "airtime.h"
|
|
|
|
|
#include <Arduino.h>
|
2020-12-24 22:12:59 -08:00
|
|
|
|
2020-12-27 10:50:52 -08:00
|
|
|
#define periodsToLog 48
|
2020-12-24 22:12:59 -08:00
|
|
|
|
2020-12-26 22:39:43 -08:00
|
|
|
// A reminder that there are 3600 seconds in an hour so I don't have
|
|
|
|
|
// to keep googling it.
|
|
|
|
|
// This can be changed to a smaller number to speed up testing.
|
|
|
|
|
//
|
2020-12-27 10:50:52 -08:00
|
|
|
uint32_t secondsPerPeriod = 3600;
|
2020-12-26 22:39:43 -08:00
|
|
|
uint32_t lastMillis = 0;
|
|
|
|
|
uint32_t secSinceBoot = 0;
|
2020-12-24 22:12:59 -08:00
|
|
|
|
2020-12-25 16:10:38 -08:00
|
|
|
// Don't read out of this directly. Use the helper functions.
|
|
|
|
|
struct airtimeStruct {
|
2020-12-27 10:50:52 -08:00
|
|
|
uint16_t periodTX[periodsToLog];
|
|
|
|
|
uint16_t periodRX[periodsToLog];
|
|
|
|
|
uint16_t periodRX_ALL[periodsToLog];
|
|
|
|
|
uint8_t lastPeriodIndex;
|
2020-12-25 16:10:38 -08:00
|
|
|
} airtimes;
|
2020-12-24 22:12:59 -08:00
|
|
|
|
2020-12-25 16:10:38 -08:00
|
|
|
void logAirtime(reportTypes reportType, uint32_t airtime_ms)
|
2020-12-24 22:12:59 -08:00
|
|
|
{
|
|
|
|
|
|
2020-12-25 16:10:38 -08:00
|
|
|
if (reportType == TX_LOG) {
|
2020-12-27 10:50:52 -08:00
|
|
|
airtimes.periodTX[0] = airtimes.periodTX[0] + round(airtime_ms / 1000);
|
2020-12-25 16:10:38 -08:00
|
|
|
} else if (reportType == RX_LOG) {
|
2020-12-27 10:50:52 -08:00
|
|
|
airtimes.periodRX[0] = airtimes.periodRX[0] + round(airtime_ms / 1000);
|
2020-12-25 16:10:38 -08:00
|
|
|
} else if (reportType == RX_ALL_LOG) {
|
2020-12-27 10:50:52 -08:00
|
|
|
airtimes.periodRX_ALL[0] = airtimes.periodRX_ALL[0] + round(airtime_ms / 1000);
|
2020-12-25 16:10:38 -08:00
|
|
|
} else {
|
|
|
|
|
// Unknown report type
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-12-24 22:12:59 -08:00
|
|
|
|
2020-12-27 10:50:52 -08:00
|
|
|
uint8_t currentPeriodIndex()
|
2020-12-25 16:10:38 -08:00
|
|
|
{
|
2020-12-27 10:50:52 -08:00
|
|
|
return ((getSecondsSinceBoot() / secondsPerPeriod) % periodsToLog);
|
2020-12-25 16:10:38 -08:00
|
|
|
}
|
2020-12-24 22:12:59 -08:00
|
|
|
|
2020-12-26 22:39:43 -08:00
|
|
|
void airtimeCalculator()
|
2020-12-25 16:10:38 -08:00
|
|
|
{
|
2020-12-26 22:39:43 -08:00
|
|
|
if (millis() - lastMillis > 1000) {
|
|
|
|
|
lastMillis = millis();
|
|
|
|
|
secSinceBoot++;
|
2020-12-27 10:50:52 -08:00
|
|
|
if (airtimes.lastPeriodIndex != currentPeriodIndex()) {
|
|
|
|
|
for (int i = periodsToLog - 2; i >= 0; --i) {
|
|
|
|
|
airtimes.periodTX[i + 1] = airtimes.periodTX[i];
|
|
|
|
|
airtimes.periodRX[i + 1] = airtimes.periodRX[i];
|
|
|
|
|
airtimes.periodRX_ALL[i + 1] = airtimes.periodRX_ALL[i];
|
2020-12-26 22:39:43 -08:00
|
|
|
}
|
2020-12-27 10:50:52 -08:00
|
|
|
airtimes.periodTX[0] = 0;
|
|
|
|
|
airtimes.periodRX[0] = 0;
|
|
|
|
|
airtimes.periodRX_ALL[0] = 0;
|
2020-12-24 22:12:59 -08:00
|
|
|
|
2020-12-27 10:50:52 -08:00
|
|
|
airtimes.lastPeriodIndex = currentPeriodIndex();
|
2020-12-26 22:39:43 -08:00
|
|
|
}
|
2020-12-25 16:10:38 -08:00
|
|
|
}
|
2020-12-24 22:12:59 -08:00
|
|
|
}
|
|
|
|
|
|
2020-12-25 16:10:38 -08:00
|
|
|
uint16_t *airtimeReport(reportTypes reportType)
|
2020-12-24 22:12:59 -08:00
|
|
|
{
|
2020-12-26 22:39:43 -08:00
|
|
|
// currentHourIndexReset();
|
2020-12-25 16:10:38 -08:00
|
|
|
|
2020-12-26 22:39:43 -08:00
|
|
|
if (reportType == TX_LOG) {
|
2020-12-27 10:50:52 -08:00
|
|
|
return airtimes.periodTX;
|
2020-12-26 22:39:43 -08:00
|
|
|
} else if (reportType == RX_LOG) {
|
2020-12-27 10:50:52 -08:00
|
|
|
return airtimes.periodRX;
|
2020-12-26 22:39:43 -08:00
|
|
|
} else if (reportType == RX_ALL_LOG) {
|
2020-12-27 10:50:52 -08:00
|
|
|
return airtimes.periodRX_ALL;
|
2020-12-25 16:10:38 -08:00
|
|
|
}
|
2020-12-26 22:39:43 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
2020-12-25 16:10:38 -08:00
|
|
|
|
2020-12-27 10:50:52 -08:00
|
|
|
uint8_t getPeriodsToLog()
|
|
|
|
|
{
|
|
|
|
|
return periodsToLog;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t getSecondsPerPeriod()
|
2020-12-26 22:39:43 -08:00
|
|
|
{
|
2020-12-27 10:50:52 -08:00
|
|
|
return secondsPerPeriod;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t getSecondsSinceBoot()
|
|
|
|
|
{
|
|
|
|
|
return secSinceBoot;
|
|
|
|
|
}
|