diff --git a/src/_P001_Switch.ino b/src/_P001_Switch.ino
index 6224d1a3f4..96a48941a7 100644
--- a/src/_P001_Switch.ino
+++ b/src/_P001_Switch.ino
@@ -9,11 +9,22 @@
Servo servo1;
Servo servo2;
+// Make sure the initial default is a switch (value 0)
+#define PLUGIN_001_TYPE_SWITCH 0
+#define PLUGIN_001_TYPE_DIMMER 1
+#define PLUGIN_001_BUTTON_TYPE_NORMAL_SWITCH 0
+#define PLUGIN_001_BUTTON_TYPE_PUSH_ACTIVE_LOW 1
+#define PLUGIN_001_BUTTON_TYPE_PUSH_ACTIVE_HIGH 2
+
+boolean Plugin_001_read_switch_state(struct EventStruct *event) {
+ return digitalRead(Settings.TaskDevicePin1[event->TaskIndex]) == HIGH;
+}
+
boolean Plugin_001(byte function, struct EventStruct *event, String& string)
{
boolean success = false;
- static byte switchstate[TASKS_MAX];
- static byte outputstate[TASKS_MAX];
+ static boolean switchstate[TASKS_MAX];
+ static boolean outputstate[TASKS_MAX];
switch (function)
{
@@ -49,13 +60,15 @@ boolean Plugin_001(byte function, struct EventStruct *event, String& string)
case PLUGIN_WEBFORM_LOAD:
{
byte choice = Settings.TaskDevicePluginConfig[event->TaskIndex][0];
+ if (choice != PLUGIN_001_TYPE_SWITCH && choice != PLUGIN_001_TYPE_DIMMER)
+ choice = PLUGIN_001_TYPE_SWITCH;
String options[2];
options[0] = F("Switch");
options[1] = F("Dimmer");
- int optionValues[2] = { 1, 2 };
+ int optionValues[2] = { PLUGIN_001_TYPE_SWITCH, PLUGIN_001_TYPE_DIMMER };
addFormSelector(string, F("Switch Type"), F("plugin_001_type"), 2, options, optionValues, choice);
- if (Settings.TaskDevicePluginConfig[event->TaskIndex][0] == 2)
+ if (Settings.TaskDevicePluginConfig[event->TaskIndex][0] == PLUGIN_001_TYPE_DIMMER)
{
char tmpString[128];
sprintf_P(tmpString, PSTR("
Dim value: | "), Settings.TaskDevicePluginConfig[event->TaskIndex][1]);
@@ -67,7 +80,8 @@ boolean Plugin_001(byte function, struct EventStruct *event, String& string)
buttonOptions[0] = F("Normal Switch");
buttonOptions[1] = F("Push Button Active Low");
buttonOptions[2] = F("Push Button Active High");
- addFormSelector(string, F("Switch Button Type"), F("plugin_001_button"), 3, buttonOptions, NULL, choice);
+ int buttonOptionValues[3] = {PLUGIN_001_BUTTON_TYPE_NORMAL_SWITCH, PLUGIN_001_BUTTON_TYPE_PUSH_ACTIVE_LOW, PLUGIN_001_BUTTON_TYPE_PUSH_ACTIVE_HIGH};
+ addFormSelector(string, F("Switch Button Type"), F("plugin_001_button"), 3, buttonOptions, buttonOptionValues, choice);
addFormCheckBox(string, F("Send Boot state"),F("plugin_001_boot"),
Settings.TaskDevicePluginConfig[event->TaskIndex][3]);
@@ -79,7 +93,7 @@ boolean Plugin_001(byte function, struct EventStruct *event, String& string)
case PLUGIN_WEBFORM_SAVE:
{
Settings.TaskDevicePluginConfig[event->TaskIndex][0] = getFormItemInt(F("plugin_001_type"));
- if (Settings.TaskDevicePluginConfig[event->TaskIndex][0] == 2)
+ if (Settings.TaskDevicePluginConfig[event->TaskIndex][0] == PLUGIN_001_TYPE_DIMMER)
{
Settings.TaskDevicePluginConfig[event->TaskIndex][1] = getFormItemInt(F("plugin_001_dimvalue"));
}
@@ -101,7 +115,7 @@ boolean Plugin_001(byte function, struct EventStruct *event, String& string)
setPinState(PLUGIN_ID_001, Settings.TaskDevicePin1[event->TaskIndex], PIN_MODE_INPUT, 0);
- switchstate[event->TaskIndex] = digitalRead(Settings.TaskDevicePin1[event->TaskIndex]);
+ switchstate[event->TaskIndex] = Plugin_001_read_switch_state(event);
outputstate[event->TaskIndex] = switchstate[event->TaskIndex];
// if boot state must be send, inverse default state
@@ -116,43 +130,48 @@ boolean Plugin_001(byte function, struct EventStruct *event, String& string)
case PLUGIN_TEN_PER_SECOND:
{
- byte state = digitalRead(Settings.TaskDevicePin1[event->TaskIndex]);
+ const boolean state = Plugin_001_read_switch_state(event);
if (state != switchstate[event->TaskIndex])
{
switchstate[event->TaskIndex] = state;
- byte currentOutputState = outputstate[event->TaskIndex];
-
- if (Settings.TaskDevicePluginConfig[event->TaskIndex][2] == 0) //normal switch
- outputstate[event->TaskIndex] = state;
- else
- {
- if (Settings.TaskDevicePluginConfig[event->TaskIndex][2] == 1) // active low push button
- {
- if (state == 0)
- outputstate[event->TaskIndex] = !outputstate[event->TaskIndex];
- }
- else // active high push button
- {
- if (state == 1)
- outputstate[event->TaskIndex] = !outputstate[event->TaskIndex];
- }
+ const boolean currentOutputState = outputstate[event->TaskIndex];
+ boolean new_outputState = currentOutputState;
+ switch(Settings.TaskDevicePluginConfig[event->TaskIndex][2]) {
+ case PLUGIN_001_BUTTON_TYPE_NORMAL_SWITCH:
+ new_outputState = state;
+ break;
+ case PLUGIN_001_BUTTON_TYPE_PUSH_ACTIVE_LOW:
+ if (!state)
+ new_outputState = !currentOutputState;
+ break;
+ case PLUGIN_001_BUTTON_TYPE_PUSH_ACTIVE_HIGH:
+ if (state)
+ new_outputState = !currentOutputState;
+ break;
}
// send if output needs to be changed
- if (currentOutputState != outputstate[event->TaskIndex])
+ if (currentOutputState != new_outputState)
{
- byte sendState = outputstate[event->TaskIndex];
+ outputstate[event->TaskIndex] = new_outputState;
+ boolean sendState = new_outputState;
if (Settings.TaskDevicePin1Inversed[event->TaskIndex])
- sendState = !outputstate[event->TaskIndex];
- UserVar[event->BaseVarIndex] = sendState;
+ sendState = !sendState;
+
+ byte output_value = sendState ? 1 : 0;
event->sensorType = SENSOR_TYPE_SWITCH;
- if ((sendState == 1) && (Settings.TaskDevicePluginConfig[event->TaskIndex][0] == 2))
- {
- event->sensorType = SENSOR_TYPE_DIMMER;
- UserVar[event->BaseVarIndex] = Settings.TaskDevicePluginConfig[event->TaskIndex][1];
+ if (Settings.TaskDevicePluginConfig[event->TaskIndex][0] == PLUGIN_001_TYPE_DIMMER) {
+ if (sendState) {
+ output_value = Settings.TaskDevicePluginConfig[event->TaskIndex][1];
+ // Only set type to being dimmer when setting a value else it is "switched off".
+ event->sensorType = SENSOR_TYPE_DIMMER;
+ }
}
- String log = F("SW : State ");
- log += sendState;
+ UserVar[event->BaseVarIndex] = output_value;
+ String log = F("SW : Switch state ");
+ log += state ? F("1") : F("0");
+ log += F(" Output value ");
+ log += output_value;
addLog(LOG_LEVEL_INFO, log);
sendData(event);
}
|