feat: add external component and some test configurations
This commit is contained in:
parent
4c612fc462
commit
5b0930d616
11 changed files with 511 additions and 6 deletions
116
components/wordcl/desky.cpp
Normal file
116
components/wordcl/desky.cpp
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
#include "desky.h"
|
||||
#include "esphome/core/log.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace desky {
|
||||
|
||||
static const char *TAG = "desky";
|
||||
|
||||
const char *desky_operation_to_str(DeskyOperation op) {
|
||||
switch (op) {
|
||||
case DESKY_OPERATION_IDLE:
|
||||
return "IDLE";
|
||||
case DESKY_OPERATION_RAISING:
|
||||
return "RAISING";
|
||||
case DESKY_OPERATION_LOWERING:
|
||||
return "LOWERING";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
}
|
||||
}
|
||||
|
||||
void Desky::setup() {
|
||||
if (this->up_pin_ != nullptr)
|
||||
this->up_pin_->digital_write(false);
|
||||
if (this->down_pin_ != nullptr)
|
||||
this->down_pin_->digital_write(false);
|
||||
if (this->request_pin_ != nullptr) {
|
||||
this->request_pin_->digital_write(true);
|
||||
this->request_time_ = millis();
|
||||
}
|
||||
}
|
||||
|
||||
void Desky::loop() {
|
||||
static int state = 0;
|
||||
static uint8_t high_byte;
|
||||
|
||||
while (this->available()) {
|
||||
uint8_t c;
|
||||
int value;
|
||||
this->read_byte(&c);
|
||||
switch (state) {
|
||||
case 0:
|
||||
if (c == 1)
|
||||
state = 1;
|
||||
break;
|
||||
case 1:
|
||||
if (c == 1)
|
||||
state = 2;
|
||||
else
|
||||
state = 0;
|
||||
break;
|
||||
case 2:
|
||||
high_byte = c;
|
||||
state = 3;
|
||||
break;
|
||||
case 3:
|
||||
value = (high_byte << 8) + c;
|
||||
this->current_pos_ = value;
|
||||
if (this->height_sensor_ != nullptr)
|
||||
this->height_sensor_->publish_state(value);
|
||||
state = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (this->target_pos_ >= 0) {
|
||||
if (abs(this->target_pos_ - this->current_pos_) < this->stopping_distance_)
|
||||
this->stop();
|
||||
if ((this->timeout_ >= 0) && (millis() - this->start_time_ >= this->timeout_))
|
||||
this->stop();
|
||||
}
|
||||
|
||||
if ((this->request_time_ > 0) && (millis() - this->request_time_ >= 100)) {
|
||||
this->request_pin_->digital_write(false);
|
||||
this->request_time_ = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void Desky::dump_config() {
|
||||
ESP_LOGCONFIG(TAG, "Desky desk:");
|
||||
LOG_SENSOR("", "Height", this->height_sensor_);
|
||||
LOG_PIN("Up pin: ", this->up_pin_);
|
||||
LOG_PIN("Down pin: ", this->down_pin_);
|
||||
LOG_PIN("Request pin: ", this->request_pin_);
|
||||
}
|
||||
|
||||
void Desky::move_to(int target_pos) {
|
||||
if (abs(target_pos - this->current_pos_) < this->stopping_distance_)
|
||||
return;
|
||||
if (target_pos > this->current_pos_) {
|
||||
if (this->up_pin_ == nullptr)
|
||||
return;
|
||||
this->up_pin_->digital_write(true);
|
||||
this->current_operation = DESKY_OPERATION_RAISING;
|
||||
} else {
|
||||
if (this->down_pin_ == nullptr)
|
||||
return;
|
||||
this->down_pin_->digital_write(true);
|
||||
this->current_operation = DESKY_OPERATION_LOWERING;
|
||||
}
|
||||
this->target_pos_ = target_pos;
|
||||
if (this->timeout_ >= 0)
|
||||
this->start_time_ = millis();
|
||||
}
|
||||
|
||||
void Desky::stop() {
|
||||
this->target_pos_ = -1;
|
||||
if (this->up_pin_ != nullptr)
|
||||
this->up_pin_->digital_write(false);
|
||||
if (this->down_pin_ != nullptr)
|
||||
this->down_pin_->digital_write(false);
|
||||
this->current_operation = DESKY_OPERATION_IDLE;
|
||||
}
|
||||
|
||||
} // namespace desky
|
||||
} // namespace esphome
|
||||
Loading…
Add table
Add a link
Reference in a new issue