Files
IoTManager/src/modules/exec/Multitouch/Multitouch.cpp

94 lines
2.5 KiB
C++
Raw Normal View History

2022-11-13 19:44:50 +03:00
#include "Global.h"
#include "classes/IoTItem.h"
extern IoTGpio IoTgpio;
class Multitouch : public IoTItem
{
private:
int _pin;
int _int;
int _inv;
String _pinMode;
int _lastButtonState = LOW;
unsigned long _lastDebounceTime = 0;
unsigned long timing;
long _debounceDelay = 50;
long _PWMDelay = 500;
int _buttonState;
int _reading;
int _count = 0;
int duration = 0;
public:
Multitouch(String parameters) : IoTItem(parameters)
{
jsonRead(parameters, "pin", _pin);
jsonRead(parameters, "pinMode", _pinMode);
jsonRead(parameters, "debounceDelay", _debounceDelay);
jsonRead(parameters, "PWMDelay", _PWMDelay);
jsonRead(parameters, "int", _int);
jsonRead(parameters, "inv", _inv);
_round = 0;
IoTgpio.pinMode(_pin, INPUT);
if (_pinMode == "INPUT_PULLUP")
IoTgpio.digitalWrite(_pin, HIGH);
else if (_pinMode == "INPUT_PULLDOWN")
IoTgpio.digitalWrite(_pin, LOW);
value.valD = _buttonState = IoTgpio.digitalRead(_pin);
// сообщаем всем о стартовом статусе без генерации события
regEvent(_buttonState, "", false, false);
}
void loop()
{
_reading = IoTgpio.digitalRead(_pin);
if (_reading != _lastButtonState)
{
_lastDebounceTime = millis();
}
if ((millis() - _lastDebounceTime) > _debounceDelay)
{
if (millis() - timing > _int && _reading == _inv && millis() - _lastDebounceTime > _PWMDelay)
{
timing = millis();
duration = millis() - _lastDebounceTime - _PWMDelay;
value.valD = duration / 50;
regEvent(value.valD, "Multitouch");
_count = -1;
}
if (_reading != _buttonState)
{
_buttonState = _reading;
_count++;
duration = 0;
}
if (1 < _count && millis() > _lastDebounceTime + _PWMDelay)
{
value.valD = _count / 2;
regEvent(value.valD, "Multitouch");
_count = 0;
}
}
_lastButtonState = _reading;
}
~Multitouch(){};
};
void *getAPI_Multitouch(String subtype, String param)
{
if (subtype == F("Multitouch"))
{
return new Multitouch(param);
}
else
{
return nullptr;
}
}