7static const char *
const TAG =
"sx1509";
10 ESP_LOGV(TAG,
" Resetting devices");
33 ESP_LOGCONFIG(TAG,
"SX1509:");
35 ESP_LOGE(TAG,
"Setting up SX1509 failed!");
50 binary_sensor->process(key_data);
51 if (this->
keys_.empty())
58 for (row = 0; row < 8; row++) {
59 if (key_data & (1 << row))
62 for (col = 8; col < 16; col++) {
63 if (key_data & (1 << col))
67 uint8_t key = this->
keys_[row * this->
cols_ + col];
71 ESP_LOGV(TAG,
"row %d, col %d, key '%c'", row, col, key);
73 trigger->trigger(key);
94 uint16_t temp_reg_data = 0;
101 for (uint16_t b = 0x8000; b; b >>= 1) {
115 ESP_LOGI(TAG,
"Configuring pin %u with flags %x", pin,
flags);
117 uint16_t temp_word = 0;
123 temp_word |= (1 << pin);
129 temp_word &= ~(1 << pin);
132 temp_word |= (1 << pin);
134 ESP_LOGD(TAG,
"Open drain output mode set for %u", pin);
136 ESP_LOGD(TAG,
"Output Mode for %u", pin);
143 ESP_LOGD(TAG,
"Input Mode for %u", pin);
147 temp_word &= ~(1 << pin);
153 temp_word |= (1 << pin);
155 temp_word &= ~(1 << pin);
162 temp_word |= (1 << pin);
164 temp_word &= ~(1 << pin);
175 uint16_t temp_word = 0;
176 uint8_t temp_byte = 0;
179 temp_word |= (1 << pin);
186 temp_byte |= (1 << 6);
187 temp_byte &= ~(1 << 5);
191 temp_byte &= ~(1 << 7);
192 temp_byte &= ~(1 << 3);
197 temp_word |= (1 << pin);
201 temp_word &= ~(1 << pin);
207 osc_source = (osc_source & 0b11) << 5;
208 osc_pin_function = (osc_pin_function & 1) << 4;
209 osc_freq_out = (osc_freq_out & 0b1111);
210 uint8_t reg_clock = osc_source | osc_pin_function | osc_freq_out;
213 osc_divider = clamp<uint8_t>(osc_divider, 1, 7u);
215 osc_divider = (osc_divider & 0b111) << 4;
217 uint8_t reg_misc = 0;
219 reg_misc &= ~(0b111 << 4);
220 reg_misc |= osc_divider;
225 uint8_t temp_byte = 0;
229 for (
int i = 0; i < this->
rows_; i++)
231 for (
int i = 8; i < (8 + this->
cols_); i++)
236 for (
int i = 0; i < this->
rows_; i++)
237 temp_byte |= (1 << i);
241 for (
int i = 0; i < this->
cols_; i++)
242 temp_byte |= (1 << i);
249 uint8_t scan_time_bits = 0;
250 for (uint8_t i = 7; i > 0; i--) {
256 scan_time_bits &= 0b111;
259 temp_byte = ((this->rows_ - 1) & 0b111) << 3;
260 temp_byte |= (this->cols_ - 1) & 0b111;
265 uint16_t key_data = 0;
267 return (0xFFFF ^ key_data);
272 uint8_t temp_byte = 0;
274 temp_byte |= (1 << 4);
277 temp_byte |= (1 << 6);
280 config_value &= 0b111;
285 uint8_t config_value = 0;
287 for (
int i = 7; i >= 0; i--) {
288 if (time & (1 << i)) {
289 config_value = i + 1;
293 config_value = clamp<uint8_t>(config_value, 0, 7);
299 uint16_t debounce_enable = 0;
301 debounce_enable |= (1 << pin);
309 for (uint16_t i = 0; i < num_rows; i++)
311 for (uint16_t i = 0; i < num_cols; i++)
void mark_failed()
Mark this component as failed.
bool write_byte(uint8_t a_register, uint8_t data) const
bool read_byte(uint8_t a_register, uint8_t *data)
bool read_byte_16(uint8_t a_register, uint16_t *data)
bool write_byte_16(uint8_t a_register, uint16_t data) const
void send_key_(uint8_t key)
bool digital_read_cache(uint8_t pin) override
void clock_(uint8_t osc_source=2, uint8_t osc_pin_function=1, uint8_t osc_freq_out=0, uint8_t osc_divider=0)
void dump_config() override
void set_debounce_pin_(uint8_t pin)
bool digital_read_hw(uint8_t pin) override
void set_debounce_config_(uint8_t config_value)
std::vector< SX1509KeyTrigger * > key_triggers_
void set_debounce_time_(uint8_t time)
void set_debounce_keypad_(uint8_t time, uint8_t num_rows, uint8_t num_cols)
uint32_t last_loop_timestamp_
void pin_mode(uint8_t pin, gpio::Flags flags)
std::vector< SX1509Processor * > keypad_binary_sensors_
void digital_write_hw(uint8_t pin, bool value) override
void setup_led_driver(uint8_t pin)
void set_debounce_enable_(uint8_t pin)
const uint32_t min_loop_period_
Here you'll find the Arduino code used to interface with the SX1509 I2C 16 I/O expander.
const uint8_t REG_DEBOUNCE_CONFIG
const uint8_t REG_KEY_CONFIG_2
const uint8_t REG_LED_DRIVER_ENABLE_B
const uint8_t REG_KEY_CONFIG_1
const uint8_t REG_OPEN_DRAIN_B
const uint8_t REG_PULL_UP_B
const uint8_t REG_INPUT_DISABLE_B
const uint8_t REG_DEBOUNCE_ENABLE_B
const uint8_t REG_INTERRUPT_MASK_A
const uint8_t REG_PULL_DOWN_B
const uint8_t INTERNAL_CLOCK_2MHZ
const uint8_t REG_OPEN_DRAIN_A
const uint8_t REG_KEY_DATA_1
void IRAM_ATTR HOT delayMicroseconds(uint32_t us)
uint32_t IRAM_ATTR HOT millis()