mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-27 06:32:19 +03:00
94 lines
2.5 KiB
C++
94 lines
2.5 KiB
C++
|
|
#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;
|
|||
|
|
}
|
|||
|
|
}
|