Files
2022-01-12 16:18:38 -08:00

88 lines
2.0 KiB
C++

#include "i2c_button.h"
#include "esphome/core/log.h"
#include "esphome/core/helpers.h"
namespace esphome {
namespace i2c_button {
enum I2C_CMD
{
GET_STATUS = 0x01,
RESET,
CHANGE_I2C_ADDRESS,
GET_KEY_VALUE,
CHANGE_A_LONG_CLICK_TIME,
CHANGE_B_LONG_CLICK_TIME,
CHANGE_A_DOUBLE_CLICK_INTERVAL,
CHANGE_B_DOUBLE_CLICK_INTERVAL
};
enum KEY_VALUE
{
KEY_VALUE_NONE = 0x00,
KEY_VALUE_CLICK,
KEY_VALUE_LONG_CLICK,
KEY_VALUE_DOUBLE_CLICK,
KEY_VALUE_HOLD
};
static const char *const TAG = "i2c_button";
float I2C_Button::get_setup_priority() const { return setup_priority::IO; }
void I2C_Button::setup() {
ESP_LOGD(TAG, "Setting up i2c button...");
uint8_t versions[2];
this->read_bytes(GET_STATUS, versions, 2);
ESP_LOGD(TAG, "Product ID: %d Version: %d", versions[0], versions[1]);
}
void I2C_Button::loop() {
uint8_t buttons = this->reg(GET_KEY_VALUE).get();
if (buttons == 0)
return;
uint8_t a = buttons >> 4;
uint8_t b = buttons & 0xf;
switch (a) {
case KEY_VALUE_CLICK:
ESP_LOGD(TAG, "Button A clicked");
this->a_click_trigger_->trigger();
break;
case KEY_VALUE_LONG_CLICK:
ESP_LOGD(TAG, "Button A long clicked");
this->a_long_click_trigger_->trigger();
break;
case KEY_VALUE_DOUBLE_CLICK:
ESP_LOGD(TAG, "Button A double clicked");
this->a_double_click_trigger_->trigger();
break;
case KEY_VALUE_HOLD:
// ignore for now
// ESP_LOGD(TAG, "Button A held");
break;
}
switch (b) {
case KEY_VALUE_CLICK:
ESP_LOGD(TAG, "Button B clicked");
this->b_click_trigger_->trigger();
break;
case KEY_VALUE_LONG_CLICK:
ESP_LOGD(TAG, "Button B long clicked");
this->b_long_click_trigger_->trigger();
break;
case KEY_VALUE_DOUBLE_CLICK:
ESP_LOGD(TAG, "Button B double clicked");
this->b_double_click_trigger_->trigger();
break;
case KEY_VALUE_HOLD:
// ignore for now
// ESP_LOGD(TAG, "Button B held");
break;
}
}
} // namespace i2c_button
} // namespace esphome