-
Notifications
You must be signed in to change notification settings - Fork 2.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[P109] add button pin mode #5066
base: mega
Are you sure you want to change the base?
Changes from 4 commits
4d93059
62e13db
4517850
5b41b4d
2c04e1f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -41,7 +41,7 @@ | |
- /control?cmd=thermo,mode,0 Switch heating off, absolutely do nothing until further notice | ||
|
||
------------------------------------------------------------------------------------------ | ||
Copyleft Nagy Sándor 2018 - https://bitekmindenhol.blog.hu/ | ||
Copyleft Nagy Sandor 2018 - https://bitekmindenhol.blog.hu/ | ||
------------------------------------------------------------------------------------------ | ||
2022-12-08 tonhuisman: Add Relay invert state option, reorder config option Contrast | ||
Add setpoint delay option, switch relay after delay seconds | ||
|
@@ -138,16 +138,16 @@ boolean Plugin_109(uint8_t function, struct EventStruct *event, String& string) | |
# ifndef LIMIT_BUILD_SIZE | ||
case PLUGIN_WEBFORM_SHOW_GPIO_DESCR: | ||
{ | ||
const char* separator = event->String1.c_str(); | ||
const char *separator = event->String1.c_str(); | ||
string = strformat( | ||
F("Btn L: %s%sBtn R: %s%sBtn M: %s%sRelay: %s"), | ||
formatGpioLabel(CONFIG_PIN1, false).c_str(), | ||
separator, | ||
formatGpioLabel(CONFIG_PIN2, false).c_str(), | ||
separator, | ||
formatGpioLabel(CONFIG_PIN3, false).c_str(), | ||
separator, | ||
formatGpioLabel(P109_CONFIG_RELAYPIN, false).c_str()); | ||
formatGpioLabel(CONFIG_PIN1, false).c_str(), | ||
separator, | ||
formatGpioLabel(CONFIG_PIN2, false).c_str(), | ||
separator, | ||
formatGpioLabel(CONFIG_PIN3, false).c_str(), | ||
separator, | ||
formatGpioLabel(P109_CONFIG_RELAYPIN, false).c_str()); | ||
success = true; | ||
break; | ||
} | ||
|
@@ -170,18 +170,42 @@ boolean Plugin_109(uint8_t function, struct EventStruct *event, String& string) | |
} | ||
} | ||
|
||
addFormPinSelect(PinSelectPurpose::Generic_input, F("Button left/down"), F("taskdevicepin1"), CONFIG_PIN1); | ||
addFormPinSelect(PinSelectPurpose::Generic_input, F("Button right/up"), F("taskdevicepin2"), CONFIG_PIN2); | ||
addFormPinSelect(PinSelectPurpose::Generic_input, F("Button mode"), F("taskdevicepin3"), CONFIG_PIN3); | ||
addFormPinSelect(PinSelectPurpose::Generic_input, F("Button left/down"), F("taskdevicepin1"), CONFIG_PIN1); | ||
addFormCheckBox(F("Button left/down Pull mode (1=IntPullUp, 0=Input)"), F("IntPullupButton1"), P109_GET_BUTTON1_INT_PULL_UP == 0); // Inverted | ||
addFormPinSelect(PinSelectPurpose::Generic_input, F("Button right/up"), F("taskdevicepin2"), CONFIG_PIN2); | ||
addFormCheckBox(F("Button right/up Pull mode (1=IntPullUp, 0=Input)"), F("IntPullupButton2"), P109_GET_BUTTON2_INT_PULL_UP == 0); // Inverted | ||
addFormPinSelect(PinSelectPurpose::Generic_input, F("Button mode"), F("taskdevicepin3"), CONFIG_PIN3); | ||
addFormCheckBox(F("Button Mode Pull mode (1=IntPullUp, 0=Input)"), F("IntPullupButton3"), P109_GET_BUTTON3_INT_PULL_UP == 0); // Inverted | ||
|
||
addFormPinSelect(PinSelectPurpose::Generic_output, F("Relay"), F("heatrelay"), P109_CONFIG_RELAYPIN); | ||
addFormPinSelect(PinSelectPurpose::Generic_output, F("Relay"), F("heatrelay"), P109_CONFIG_RELAYPIN); | ||
|
||
addFormCheckBox(F("Invert relay-state (0=on, 1=off)"), F("invertrelay"), P109_GET_RELAY_INVERT); | ||
|
||
{ | ||
const __FlashStringHelper *options4[] = { F("0.2"), F("0.5"), F("1") }; | ||
const int optionValues4[] = { 2, 5, 10 }; | ||
addFormSelector(F("Hysteresis"), F("hyst"), 3, options4, optionValues4, static_cast<int>(P109_CONFIG_HYSTERESIS * 10.0f)); | ||
const __FlashStringHelper *options4[] = { F("0.2"), F("0.5"), F("1"), F("1.5"), F("2"), F("3"), F("4"), F("5") }; | ||
const int optionValues4[] = { 2, 5, 10, 15, 20, 30, 40, 50 }; | ||
addFormSelector(F("Hysteresis"), F("hyst"), NR_ELEMENTS(optionValues4), options4, optionValues4, static_cast<int>(P109_CONFIG_HYSTERESIS * 10.0f)); | ||
} | ||
|
||
{ | ||
const __FlashStringHelper *options5[] = { F("5"), F("10"), F("15"), F("20"), F("30"), F("45"), F("60"), F("90") }; | ||
const int optionValues5[] = { 5, 10, 15, 20, 30, 45, 60, 90 }; | ||
addFormSelector(F("Timeout default"), F("timeout"), NR_ELEMENTS(optionValues5), options5, optionValues5, P109_CONFIG_TIMEOUT); | ||
addUnit('m'); | ||
} | ||
|
||
{ | ||
const __FlashStringHelper *options6[] = { F("1.5"), F("2"), F("2.5"), F("3"), F("3.5"), F("4"), F("4.5"), F("5") }; | ||
const int optionValues6[] = { 90, 120, 150, 180, 210, 240, 270, 300 }; | ||
addFormSelector(F("Timeout MAX"), F("timeout_max"), NR_ELEMENTS(optionValues6), options6, optionValues6, P109_CONFIG_MAX_TIMEOUT); | ||
addUnit('h'); | ||
} | ||
|
||
{ | ||
const __FlashStringHelper *options7[] = { F("5"), F("10"), F("15"), F("20"), F("25"), F("30") }; | ||
const int optionValues7[] = { 5, 10, 15, 20, 25, 30 }; | ||
addFormSelector(F("Timeout step"), F("timeout_step"), NR_ELEMENTS(optionValues7), options7, optionValues7, static_cast<int>(P109_CONFIG_STEP_TIMEOUT)); | ||
addUnit('m'); | ||
} | ||
|
||
{ | ||
|
@@ -196,6 +220,12 @@ boolean Plugin_109(uint8_t function, struct EventStruct *event, String& string) | |
addUnit('s'); | ||
} | ||
|
||
{ | ||
const __FlashStringHelper *options8[] = { F("Auto"), F("Off"), F("Manual") }; | ||
const int optionValues8[] = { 1, 0, 2 }; | ||
addFormSelector(F("Default mode"), F("mode"), NR_ELEMENTS(optionValues8), options8, optionValues8, static_cast<int>(P109_MODE_STATE_INITIAL)); | ||
} | ||
|
||
success = true; | ||
break; | ||
} | ||
|
@@ -208,11 +238,18 @@ boolean Plugin_109(uint8_t function, struct EventStruct *event, String& string) | |
P109_CONFIG_CONTRAST = getFormItemInt(F("contrast")); | ||
P109_CONFIG_RELAYPIN = getFormItemInt(F("heatrelay")); | ||
P109_CONFIG_HYSTERESIS = (getFormItemInt(F("hyst")) / 10.0f); | ||
P109_CONFIG_TIMEOUT = getFormItemInt(F("timeout")); | ||
P109_CONFIG_MAX_TIMEOUT = getFormItemInt(F("timeout_max")); | ||
P109_CONFIG_SETPOINT_DELAY = getFormItemInt(F("setpdelay")) + P109_SETPOINT_OFFSET; | ||
P109_CONFIG_STEP_TIMEOUT = getFormItemInt(F("timeout_step")); | ||
P109_MODE_STATE_INITIAL = getFormItemInt(F("mode")); | ||
uint32_t lSettings = 0u; | ||
bitWrite(lSettings, P109_FLAG_TASKNAME_IN_TITLE, isFormItemChecked(F("ptask"))); | ||
bitWrite(lSettings, P109_FLAG_ALTERNATE_HEADER, !isFormItemChecked(F("palt"))); // Inverted | ||
bitWrite(lSettings, P109_FLAG_RELAY_INVERT, isFormItemChecked(F("invertrelay"))); | ||
bitWrite(lSettings, P109_FLAG_TASKNAME_IN_TITLE, isFormItemChecked(F("ptask"))); | ||
bitWrite(lSettings, P109_FLAG_ALTERNATE_HEADER, !isFormItemChecked(F("palt"))); // Inverted | ||
bitWrite(lSettings, P109_FLAG_RELAY_INVERT, isFormItemChecked(F("invertrelay"))); | ||
bitWrite(lSettings, P109_FLAG_BUTTON1_INT_PULL_UP, !isFormItemChecked(F("IntPullupButton1"))); // Inverted | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This "inverted" stuff is exactly what I was afraid of that would happen. |
||
bitWrite(lSettings, P109_FLAG_BUTTON2_INT_PULL_UP, !isFormItemChecked(F("IntPullupButton2"))); // Inverted | ||
bitWrite(lSettings, P109_FLAG_BUTTON3_INT_PULL_UP, !isFormItemChecked(F("IntPullupButton3"))); // Inverted | ||
P109_FLAGS = lSettings; | ||
|
||
{ | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -81,11 +81,14 @@ bool P109_data_struct::plugin_init(struct EventStruct *event) { | |
delete _display; | ||
_display = nullptr; | ||
} | ||
_taskIndex = event->TaskIndex; | ||
_varIndex = event->BaseVarIndex; | ||
_relaypin = P109_CONFIG_RELAYPIN; | ||
_relayInverted = P109_GET_RELAY_INVERT; | ||
_setpointTimeout = P109_CONFIG_SETPOINT_DELAY - P109_SETPOINT_OFFSET; | ||
_taskIndex = event->TaskIndex; | ||
_varIndex = event->BaseVarIndex; | ||
_relaypin = P109_CONFIG_RELAYPIN; | ||
_relayInverted = P109_GET_RELAY_INVERT; | ||
_buttonIntPullup[0] = !P109_GET_BUTTON1_INT_PULL_UP; | ||
_buttonIntPullup[1] = !P109_GET_BUTTON2_INT_PULL_UP; | ||
_buttonIntPullup[2] = !P109_GET_BUTTON3_INT_PULL_UP; | ||
_setpointTimeout = P109_CONFIG_SETPOINT_DELAY - P109_SETPOINT_OFFSET; | ||
|
||
if (P109_CONFIG_DISPLAYTYPE == 1) { | ||
_display = new (std::nothrow) SSD1306Wire(P109_CONFIG_I2CADDRESS, Settings.Pin_i2c_sda, Settings.Pin_i2c_scl); | ||
|
@@ -120,7 +123,7 @@ bool P109_data_struct::plugin_init(struct EventStruct *event) { | |
|
||
for (uint8_t pin = 0; pin < 3; ++pin) { | ||
if (validGpio(PIN(pin))) { | ||
pinMode(PIN(pin), INPUT_PULLUP); | ||
pinMode(PIN(pin), _buttonIntPullup[pin] ? INPUT_PULLUP : INPUT); | ||
} | ||
} | ||
|
||
|
@@ -198,7 +201,7 @@ bool P109_data_struct::plugin_ten_per_second(struct EventStruct *event) { | |
if (_initialized) { | ||
uint32_t current_time; | ||
|
||
if (validGpio(CONFIG_PIN1) && !digitalRead(CONFIG_PIN1)) { | ||
if (validGpio(CONFIG_PIN1) && (_buttonIntPullup[0] ? !digitalRead(CONFIG_PIN1) : digitalRead(CONFIG_PIN1))) { | ||
current_time = millis(); | ||
|
||
if (_buttons[0] + P109_BUTTON_DEBOUNCE_TIME_MS < current_time) { | ||
|
@@ -207,7 +210,7 @@ bool P109_data_struct::plugin_ten_per_second(struct EventStruct *event) { | |
} | ||
} | ||
|
||
if (validGpio(CONFIG_PIN2) && !digitalRead(CONFIG_PIN2)) { | ||
if (validGpio(CONFIG_PIN2) && (_buttonIntPullup[1] ? !digitalRead(CONFIG_PIN2) : digitalRead(CONFIG_PIN2))) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This way how it is used, suggests it is actually just an "invert". Maybe these should not be implied but just offered as a separate setting/checkbox:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why so explicit? N.B. "Button mode" suggests it is some different kind of button, like toggle switch or push button. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That’s right, I propose to rename it “Enable IntPullUp for Button mode”, “Enable IntPullUp for Button right/up”, etc. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why not "Mode Button Pullup" ? Also it doesn't make sense to have the word "button" first, as I explained before. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It seems to me that we are hampered by the subtleties of our languages ) Therefore, I suggest you formulate the final version. But, I don't completely agree about Int. For example, in P001 the checkbox is “Internal PullUp”, and this is correct. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm didn't know that and have to look into this. |
||
current_time = millis(); | ||
|
||
if (_buttons[1] + P109_BUTTON_DEBOUNCE_TIME_MS < current_time) { | ||
|
@@ -216,7 +219,7 @@ bool P109_data_struct::plugin_ten_per_second(struct EventStruct *event) { | |
} | ||
} | ||
|
||
if (validGpio(CONFIG_PIN3) && !digitalRead(CONFIG_PIN3)) { | ||
if (validGpio(CONFIG_PIN3) && (_buttonIntPullup[2] ? !digitalRead(CONFIG_PIN3) : digitalRead(CONFIG_PIN3))) { | ||
current_time = millis(); | ||
|
||
if (_buttons[2] + P109_BUTTON_DEBOUNCE_TIME_MS < current_time) { | ||
|
@@ -437,10 +440,10 @@ void P109_data_struct::actionLeft(struct EventStruct *event) { | |
break; | ||
} | ||
case 2: { // manual on mode, timer dec | ||
UserVar.setFloat(event->TaskIndex, 3, UserVar[event->BaseVarIndex + 3] - P109_BUTTON_DEBOUNCE_TIME_MS); | ||
UserVar.setFloat(event->TaskIndex, 3, UserVar[event->BaseVarIndex + 3] - P109_CONFIG_STEP_TIMEOUT * 60); | ||
|
||
if (UserVar[event->BaseVarIndex + 3] < 0) { | ||
UserVar.setFloat(event->TaskIndex, 3, 5400); | ||
UserVar.setFloat(event->TaskIndex, 3, P109_CONFIG_MAX_TIMEOUT * 60); | ||
} | ||
_prev_timeout = P109_TIMEOUT_STATE_UNSET; | ||
break; | ||
|
@@ -461,9 +464,9 @@ void P109_data_struct::actionRight(struct EventStruct *event) { | |
break; | ||
} | ||
case 2: { // manual on mode, timer dec | ||
UserVar.setFloat(event->TaskIndex, 3, UserVar[event->BaseVarIndex + 3] + P109_BUTTON_DEBOUNCE_TIME_MS); | ||
UserVar.setFloat(event->TaskIndex, 3, UserVar[event->BaseVarIndex + 3] + P109_CONFIG_STEP_TIMEOUT * 60); | ||
|
||
if (UserVar[event->BaseVarIndex + 3] > 5400) { | ||
if (UserVar[event->BaseVarIndex + 3] > P109_CONFIG_MAX_TIMEOUT * 60) { | ||
UserVar.setFloat(event->TaskIndex, 3, 60); | ||
} | ||
_prev_timeout = P109_TIMEOUT_STATE_UNSET; | ||
|
@@ -482,7 +485,7 @@ void P109_data_struct::actionMode(struct EventStruct *event) { | |
break; | ||
} | ||
case 1: { // auto mode, next | ||
setMode(F("m"), F("5")); | ||
setMode(F("m"), toString(P109_CONFIG_TIMEOUT)); | ||
break; | ||
} | ||
case 2: { // manual on mode, next | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't think that should have been changed...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Me too, apparently it happened on the clipboard...