Improve rotary encoder velocity support (#78)

This commit is contained in:
Raphael Coeffic
2022-10-19 20:37:27 +10:00
committed by GitHub
parent 4255642e7d
commit 4b85830ea2
3 changed files with 33 additions and 4 deletions
+22
View File
@@ -78,6 +78,26 @@ class BaseNumberEdit: public FormField
return step;
}
void setFastStep(int value)
{
fastStep = value;
}
int32_t getFastStep() const
{
return fastStep;
}
void setAccelFactor(int value)
{
accelFactor = value;
}
int32_t getAccelFactor() const
{
return accelFactor;
}
void setValue(int value)
{
auto newValue = limit(vmin, value, vmax);
@@ -190,6 +210,8 @@ class BaseNumberEdit: public FormField
int vmin;
int vmax;
int step = 1;
int fastStep = 10;
int accelFactor = 4;
int currentValue;
bool instantChange = true;
std::string prefix;
@@ -30,6 +30,9 @@ void DMACopyAlphaMask(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t
void onKeyError();
void killEvents(event_t event);
// multiplication factor between 0 and 25
int8_t rotaryEncoderGetAccel();
//
// These colors MUST be defined
//
+8 -4
View File
@@ -66,8 +66,10 @@ void NumberEdit::onEvent(event_t event)
#if defined(HARDWARE_KEYS)
case EVT_ROTARY_RIGHT: {
int value = getValue();
auto step = getStep();
step += (rotaryEncoderGetAccel() * getAccelFactor()) / 8;
do {
value += ROTARY_ENCODER_SPEED() * step;
value += step;
} while (isValueAvailable && !isValueAvailable(value) && value <= vmax);
if (value <= vmax) {
setValue(value);
@@ -81,8 +83,10 @@ void NumberEdit::onEvent(event_t event)
case EVT_ROTARY_LEFT: {
int value = getValue();
auto step = getStep();
step += (rotaryEncoderGetAccel() * getAccelFactor()) / 8;
do {
value -= ROTARY_ENCODER_SPEED() * step;
value -= step;
} while (isValueAvailable && !isValueAvailable(value) && value >= vmin);
if (value >= vmin) {
setValue(value);
@@ -104,11 +108,11 @@ void NumberEdit::onEvent(event_t event)
break;
case EVT_VIRTUAL_KEY_FORWARD:
setValue(getValue() + 10 * getStep());
setValue(getValue() + getFastStep() * getStep());
break;
case EVT_VIRTUAL_KEY_BACKWARD:
setValue(getValue() - 10 * getStep());
setValue(getValue() - getFastStep() * getStep());
break;
case EVT_VIRTUAL_KEY_DEFAULT: