static byte unique_button_id = 0;
class Button
{
private:
byte _pin = 0;
byte _state = 0;
float _time_click = 500.0f;
float _time_long_click = 2000.0f;
float _time_down = 0.0f;
unsigned long _old_time = 0.0f;
public:
byte ID = 0;
void (*ptrF)(Button* arg1);
Button()
{
ID = unique_button_id;
unique_button_id += 1;
};
Button(byte pin)
{
_pin = pin;
pinMode(_pin, INPUT);
digitalWrite(_pin, LOW);
}
void SetData(byte pin, void* event_function)
{
_pin = pin;
pinMode(_pin, INPUT);
digitalWrite(_pin, LOW);
ptrF = event_function;
}
void Loop()
{
Serial.println(digitalRead(_pin));
if (digitalRead(_pin) == LOW)
{
_state = 0;
_time_down = 0.0f;
_old_time = millis();
return;
}
_time_down += millis() - _old_time;
_old_time = millis();
//Serial.println(_time_down);
if (_time_down > _time_click)
{
if (_state == 0)
{
_state = 1;
ptrF(this);
}
}
}
};
Button Buttons[4];
void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(12, OUTPUT);
digitalWrite(12, HIGH);
Buttons[0].SetData(2, Button1Click);
Buttons[1].SetData(3, Button2Click);
Buttons[2].SetData(4, Button3Click);
Buttons[3].SetData(5, Button4Click);
}
void loop()
{
// put your main code here, to run repeatedly:
for(int id = 0; id < 4; id++)
Buttons[id].Loop();
}
void OnButtonClick(byte id)
{
Serial.print("ID Button click = ");
Serial.println(id);
}
void Button1Click(Button* self)
{
Serial.print("ID Button click = ");
Serial.println(self->ID);
}
void Button2Click(Button* self)
{
Serial.print("ID Button click = ");
Serial.println(self->ID);
}
void Button3Click(Button* self)
{
Serial.print("ID Button click = ");
Serial.println(self->ID);
}
void Button4Click(Button* self)
{
Serial.print("ID Button click = ");
Serial.println(self->ID);
}