diff --git a/esphome/components/ttp229_bsf/__init__.py b/esphome/components/ttp229_bsf/__init__.py new file mode 100644 index 0000000000..54ce4a7666 --- /dev/null +++ b/esphome/components/ttp229_bsf/__init__.py @@ -0,0 +1,28 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome import pins +from esphome.const import CONF_ID, CONF_SDO_PIN, CONF_SCL_PIN + +DEPENDENCIES = ['i2c'] +AUTO_LOAD = ['binary_sensor'] + +CONF_TTP229_ID = 'ttp229_id' +ttp229_bsf_ns = cg.esphome_ns.namespace('ttp229_bsf') + +TTP229BSFComponent = ttp229_bsf_ns.class_('TTP229BSFComponent', cg.Component) + +CONFIG_SCHEMA = cv.Schema({ + cv.GenerateID(): cv.declare_id(TTP229BSFComponent), + cv.Required(CONF_SDO_PIN): pins.gpio_input_pullup_pin_schema, + cv.Required(CONF_SCL_PIN): pins.gpio_output_pin_schema, +}).extend(cv.COMPONENT_SCHEMA) + + +def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + yield cg.register_component(var, config) + + sdo = yield cg.gpio_pin_expression(config[CONF_SDO_PIN]) + cg.add(var.set_sdo_pin(sdo)) + scl = yield cg.gpio_pin_expression(config[CONF_SCL_PIN]) + cg.add(var.set_scl_pin(scl)) diff --git a/esphome/components/ttp229_bsf/binary_sensor.py b/esphome/components/ttp229_bsf/binary_sensor.py new file mode 100644 index 0000000000..b2849734c5 --- /dev/null +++ b/esphome/components/ttp229_bsf/binary_sensor.py @@ -0,0 +1,23 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import binary_sensor +from esphome.const import CONF_CHANNEL, CONF_ID +from . import ttp229_bsf_ns, TTP229BSFComponent, CONF_TTP229_ID + +DEPENDENCIES = ['ttp229_bsf'] +TTP229Channel = ttp229_bsf_ns.class_('TTP229Channel', binary_sensor.BinarySensor) + +CONFIG_SCHEMA = binary_sensor.BINARY_SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_id(TTP229Channel), + cv.GenerateID(CONF_TTP229_ID): cv.use_id(TTP229BSFComponent), + cv.Required(CONF_CHANNEL): cv.int_range(min=0, max=15), +}) + + +def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + yield binary_sensor.register_binary_sensor(var, config) + + cg.add(var.set_channel(config[CONF_CHANNEL])) + hub = yield cg.get_variable(config[CONF_TTP229_ID]) + cg.add(hub.register_channel(var)) diff --git a/esphome/components/ttp229_bsf/ttp229_bsf.cpp b/esphome/components/ttp229_bsf/ttp229_bsf.cpp new file mode 100644 index 0000000000..9b5c3c67de --- /dev/null +++ b/esphome/components/ttp229_bsf/ttp229_bsf.cpp @@ -0,0 +1,23 @@ +#include "ttp229_bsf.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace ttp229_bsf { + +static const char *TAG = "ttp229_bsf"; + +void TTP229BSFComponent::setup() { + ESP_LOGCONFIG(TAG, "Setting up ttp229_bsf... "); + this->sdo_pin_->setup(); + this->scl_pin_->setup(); + this->scl_pin_->digital_write(true); + delay(2); +} +void TTP229BSFComponent::dump_config() { + ESP_LOGCONFIG(TAG, "ttp229:"); + LOG_PIN(" SCL pin: ", this->scl_pin_); + LOG_PIN(" SDO pin: ", this->sdo_pin_); +} + +} // namespace ttp229_bsf +} // namespace esphome diff --git a/esphome/components/ttp229_bsf/ttp229_bsf.h b/esphome/components/ttp229_bsf/ttp229_bsf.h new file mode 100644 index 0000000000..94dd014d8e --- /dev/null +++ b/esphome/components/ttp229_bsf/ttp229_bsf.h @@ -0,0 +1,53 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/components/binary_sensor/binary_sensor.h" + +namespace esphome { +namespace ttp229_bsf { + +class TTP229BSFChannel : public binary_sensor::BinarySensor { + public: + void set_channel(uint8_t channel) { channel_ = channel; } + void process(uint16_t data) { this->publish_state(data & (1 << this->channel_)); } + + protected: + uint8_t channel_; +}; + +class TTP229BSFComponent : public Component { + public: + void set_sdo_pin(GPIOPin *sdo_pin) { sdo_pin_ = sdo_pin; } + void set_scl_pin(GPIOPin *scl_pin) { scl_pin_ = scl_pin; } + void register_channel(TTP229BSFChannel *channel) { this->channels_.push_back(channel); } + void setup() override; + void dump_config() override; + float get_setup_priority() const override { return setup_priority::DATA; } + void loop() override { + // check datavalid if sdo is high + if (!this->sdo_pin_->digital_read()) { + return; + } + uint16_t touched = 0; + for (uint8_t i = 0; i < 16; i++) { + this->scl_pin_->digital_write(false); + delayMicroseconds(2); // 500KHz + bool bitval = !this->sdo_pin_->digital_read(); + this->scl_pin_->digital_write(true); + delayMicroseconds(2); // 500KHz + + touched |= uint16_t(bitval) << i; + } + for (auto *channel : this->channels_) { + channel->process(touched); + } + } + + protected: + GPIOPin *sdo_pin_; + GPIOPin *scl_pin_; + std::vector channels_{}; +}; + +} // namespace ttp229_bsf +} // namespace esphome diff --git a/esphome/const.py b/esphome/const.py index fa9bae4304..ec20e26cbb 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -349,7 +349,9 @@ CONF_SAMSUNG = 'samsung' CONF_SCAN = 'scan' CONF_SCAN_INTERVAL = 'scan_interval' CONF_SCL = 'scl' +CONF_SCL_PIN = 'scl_pin' CONF_SDA = 'sda' +CONF_SDO_PIN = 'sdo_pin' CONF_SECOND = 'second' CONF_SECONDS = 'seconds' CONF_SEGMENTS = 'segments' diff --git a/tests/test3.yaml b/tests/test3.yaml index 2eedb25fc5..7fcc7e1e60 100644 --- a/tests/test3.yaml +++ b/tests/test3.yaml @@ -189,6 +189,9 @@ binary_sensor: - platform: ttp229_lsf channel: 1 name: TTP229 LSF Test + - platform: ttp229_bsf + channel: 1 + name: TTP229 BSF Test - platform: custom lambda: |- auto s = new CustomBinarySensor(); @@ -392,3 +395,7 @@ servo: output: out ttp229_lsf: + +ttp229_bsf: + sdo_pin: D0 + scl_pin: D1