For pulsed buttons, implement per-button 'timers' that independently end the pulse instead of having a 250ms delay between every single update...
This commit is contained in:
37
Button.cpp
37
Button.cpp
@ -81,6 +81,8 @@ bool LatchedButton::Update(Joystick* js) {
|
||||
|
||||
|
||||
PulsedButton::PulsedButton(uint8_t pin, uint8_t vbutton, bool double_action, bool split, bool pullup, Mux* mux, bool analog_only) : SwitchButton(pin, vbutton, pullup, mux, analog_only) {
|
||||
this->release_time1 = 0;
|
||||
this->release_time2 = 0;
|
||||
if (double_action) {
|
||||
if (split) {
|
||||
this->type = BUTTON_PULSED_DOUBLE_ACTION_SPLIT;
|
||||
@ -94,6 +96,16 @@ PulsedButton::PulsedButton(uint8_t pin, uint8_t vbutton, bool double_action, boo
|
||||
}
|
||||
|
||||
bool PulsedButton::Update(Joystick* js) {
|
||||
if (release_time1 != 0 && millis() >= release_time1) {
|
||||
js->ReleaseButton(vbutton);
|
||||
release_time1 = 0;
|
||||
}
|
||||
|
||||
if (release_time2 != 0 && millis() >= release_time2) {
|
||||
js->ReleaseButton(vbutton2);
|
||||
release_time2 = 0;
|
||||
}
|
||||
|
||||
if (!BouncerUpdate()) return false;
|
||||
|
||||
switch(type) {
|
||||
@ -102,10 +114,17 @@ bool PulsedButton::Update(Joystick* js) {
|
||||
break;
|
||||
case BUTTON_PULSED_DOUBLE_ACTION:
|
||||
js->PressButton(vbutton);
|
||||
release_time1 = millis() + 250;
|
||||
break;
|
||||
case BUTTON_PULSED_DOUBLE_ACTION_SPLIT:
|
||||
if (On()) js->PressButton(vbutton);
|
||||
else js->PressButton(vbutton2);
|
||||
if (On()) {
|
||||
js->PressButton(vbutton);
|
||||
release_time1 = millis() + 250;
|
||||
}
|
||||
else {
|
||||
js->PressButton(vbutton2);
|
||||
release_time2 = millis() + 250;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -124,18 +143,32 @@ EncoderButton::EncoderButton(uint8_t pin1, uint8_t pin2, uint8_t vbutton) : Butt
|
||||
this->vbutton2 = vbutton + 1;
|
||||
this->encoder = new Encoder(pin1, pin2);
|
||||
this->last_value = encoder->read();
|
||||
this->release_time1 = 0;
|
||||
this->release_time2 = 0;
|
||||
}
|
||||
|
||||
bool EncoderButton::Update(Joystick* js) {
|
||||
if (release_time1 != 0 && millis() >= release_time1) {
|
||||
js->ReleaseButton(vbutton);
|
||||
release_time1 = 0;
|
||||
}
|
||||
|
||||
if (release_time2 != 0 && millis() >= release_time2) {
|
||||
js->ReleaseButton(vbutton2);
|
||||
release_time2 = 0;
|
||||
}
|
||||
|
||||
bool changed = false;
|
||||
long new_value = encoder->read();
|
||||
if (new_value > last_value) {
|
||||
js->PressButton(vbutton);
|
||||
changed = true;
|
||||
release_time1 = millis() + 250;
|
||||
}
|
||||
else if (new_value < last_value) {
|
||||
js->PressButton(vbutton2);
|
||||
changed = true;
|
||||
release_time2 = millis() + 250;
|
||||
}
|
||||
last_value = new_value;
|
||||
return changed;
|
||||
|
Reference in New Issue
Block a user