|
|
|
/* -*- mode: c++ -*-
|
|
|
|
* Kaleidoscope-CycleTimeReport -- Scan cycle time reporting
|
|
|
|
* Copyright (C) 2017, 2018 Keyboard.io, Inc
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify it under
|
|
|
|
* the terms of the GNU General Public License as published by the Free Software
|
|
|
|
* Foundation, version 3.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
|
|
* details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along with
|
|
|
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
Rewrite CycleTimeReport plugin
The plugin was both more complex and less accurate than it could have been. For
simplicity, it used a weighted average, with each cycle getting twice the weight
of the previous one. As a result, the reported average really only took into
account the last three or four cycles. On a keyboard with LEDs, some cycles
take much longer than others because of relatively rare updates, so this could
lead to misleading results, with the "average" cycle time usually being reported
as lower than it really should have been, and occasionally much higher.
This new version computes an evenly-weighted mean cycle time for each interval,
and runs more efficiently, by dividing the total elapsed time by the number of
cycles that has passed since the last report, rather than computing the time for
each individual cycle.
Signed-off-by: Michael Richters <gedankenexperimenter@gmail.com>
3 years ago
|
|
|
#include <stdint.h> // for uint16_t, uint32_t
|
|
|
|
|
|
|
|
#include "kaleidoscope/event_handler_result.h" // for EventHandlerResult
|
|
|
|
#include "kaleidoscope/plugin.h" // for Plugin
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// Deprecation warning messages
|
|
|
|
#include "kaleidoscope_internal/deprecations.h" // for DEPRECATED
|
|
|
|
|
|
|
|
#define _DEPRECATED_MESSAGE_CYCLETIMEREPORT_AVG_TIME \
|
|
|
|
"The `CycleTimeReport.average_loop_time` variable is deprecated. See\n" \
|
|
|
|
"the current documentation for CycleTimeReport for details.\n" \
|
|
|
|
"This variable will be removed after 2022-09-01."
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
namespace kaleidoscope {
|
|
|
|
namespace plugin {
|
|
|
|
class CycleTimeReport : public kaleidoscope::Plugin {
|
|
|
|
public:
|
|
|
|
EventHandlerResult beforeEachCycle();
|
|
|
|
|
|
|
|
#ifndef NDEPRECATED
|
|
|
|
DEPRECATED(CYCLETIMEREPORT_AVG_TIME)
|
|
|
|
static uint32_t average_loop_time;
|
|
|
|
#endif
|
|
|
|
|
Rewrite CycleTimeReport plugin
The plugin was both more complex and less accurate than it could have been. For
simplicity, it used a weighted average, with each cycle getting twice the weight
of the previous one. As a result, the reported average really only took into
account the last three or four cycles. On a keyboard with LEDs, some cycles
take much longer than others because of relatively rare updates, so this could
lead to misleading results, with the "average" cycle time usually being reported
as lower than it really should have been, and occasionally much higher.
This new version computes an evenly-weighted mean cycle time for each interval,
and runs more efficiently, by dividing the total elapsed time by the number of
cycles that has passed since the last report, rather than computing the time for
each individual cycle.
Signed-off-by: Michael Richters <gedankenexperimenter@gmail.com>
3 years ago
|
|
|
/// Set the length of time between reports (in milliseconds)
|
|
|
|
void setReportInterval(uint16_t interval) {
|
|
|
|
report_interval_ = interval;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Report the given mean cycle time in microseconds
|
|
|
|
void report(uint16_t mean_cycle_time);
|
|
|
|
|
|
|
|
private:
|
Rewrite CycleTimeReport plugin
The plugin was both more complex and less accurate than it could have been. For
simplicity, it used a weighted average, with each cycle getting twice the weight
of the previous one. As a result, the reported average really only took into
account the last three or four cycles. On a keyboard with LEDs, some cycles
take much longer than others because of relatively rare updates, so this could
lead to misleading results, with the "average" cycle time usually being reported
as lower than it really should have been, and occasionally much higher.
This new version computes an evenly-weighted mean cycle time for each interval,
and runs more efficiently, by dividing the total elapsed time by the number of
cycles that has passed since the last report, rather than computing the time for
each individual cycle.
Signed-off-by: Michael Richters <gedankenexperimenter@gmail.com>
3 years ago
|
|
|
// Interval between reports, in milliseconds
|
|
|
|
uint16_t report_interval_ = 1000;
|
|
|
|
|
|
|
|
// Timestamps recording when the last report was sent
|
|
|
|
uint16_t last_report_millis_ = 0;
|
|
|
|
uint32_t last_report_micros_ = 0;
|
|
|
|
};
|
Standardize namespace block closing comments
This standardizes namespace closing brackets for namespace blocks. Each one is
on its own line, with a comment clearly marking which namespace it closes.
Consecutive lines closing namespace blocks have no whitespace between them, but
there is one blank line before and after a set of namespace block closing lines.
To generate the namespace comments, I used clang-format, with
`FixNamespaceComments: true`. But since clang-format can't exactly duplicate
our astyle formatting, it made lots of other changes, too. To isolate the
namespace comments from the other formatting changes, I first ran clang-format
with `FixNamespaceComments: false`, committed those changes, then ran it again
to generate the namespace comments. Then I stashed the namespace comments,
reset `HEAD` to remove the other changes, applied the stashed namespace
comments, and committed the results (after examining them and making a few minor
adjustments by hand).
Signed-off-by: Michael Richters <gedankenexperimenter@gmail.com>
3 years ago
|
|
|
|
|
|
|
} // namespace plugin
|
|
|
|
} // namespace kaleidoscope
|
|
|
|
|
|
|
|
extern kaleidoscope::plugin::CycleTimeReport CycleTimeReport;
|