ffs -> clz minus int size, otherwise multiple match order is broken
experiment with future masking, using ffs correctly this time
update tests to handle all branches of closest_delta, both future and past
- distinguish heading and selected menu item, apply menu item
background color after panel item is selected
for now, both heading and :first-child use a different color
- add x3 transition time to stall animation from hover & focus
otherwise, background colors may linger between clicks
Fixing inconsistent handling of group and non-group settings after rewrite.
Assuming most of the time template would be for group, manually reset
dataset field controlling automatic key${id} generation
- same as min & max delta, check the value itself before reporting
- refactor more of the report func, revert zero threshold to force the
value to be zero. move condition check to the top, causing every other
filter to check against zero.
- force zero threshold to be >= 0 in ui
- sync with base class, implement required override methods
- make sure last, max, min and sum filters reset() and restart() are the same
- find a real median over the specified reading 'window' vs. averaged medians
of every 3 elements that it was previously
- preserve list of inputs for average and median filters, handle updates
like a circular buffer and return value based on previous readings
(todo might be to have a more efficient storage instead of vector)
resolve#2543
- preserve units for cached values, remove extra process() call for webui data
- reset magnitude filter state when value units change
- min & max delta checks only for report value, remove separate checks for read and report
- zero threshold only affects reports, amend ac993c7b4b
- pending BaseFilter::available() and BaseFilter::ready(), replacing BaseFilter::status()
distinguish readiness between having *some* values and *enough* values
- pending BaseFilter::restart(), separate from BaseFilter::reset(), which
should allow filter to drop existing value when it is not possible otherwise
w/ just continuing normal BaseFilter::update()