mirror of
https://github.com/Threnklyn/esphome-dev.git
synced 2026-06-05 20:38:27 +02:00
6682c43dfa
## Description: Move esphome-core codebase into esphome (and a bunch of other refactors). See https://github.com/esphome/feature-requests/issues/97 Yes this is a shit ton of work and no there's no way to automate it :( But it will be worth it 👍 Progress: - Core support (file copy etc): 80% - Base Abstractions (light, switch): ~50% - Integrations: ~10% - Working? Yes, (but only with ported components). Other refactors: - Moves all codegen related stuff into a single class: `esphome.codegen` (imported as `cg`) - Rework coroutine syntax - Move from `component/platform.py` to `domain/component.py` structure as with HA - Move all defaults out of C++ and into config validation. - Remove `make_...` helpers from Application class. Reason: Merge conflicts with every single new integration. - Pointer Variables are stored globally instead of locally in setup(). Reason: stack size limit. Future work: - Rework const.py - Move all `CONF_...` into a conf class (usage `conf.UPDATE_INTERVAL` vs `CONF_UPDATE_INTERVAL`). Reason: Less convoluted import block - Enable loading from `custom_components` folder. **Related issue (if applicable):** https://github.com/esphome/feature-requests/issues/97 **Pull request in [esphome-docs](https://github.com/esphome/esphome-docs) with documentation (if applicable):** esphome/esphome-docs#<esphome-docs PR number goes here> ## Checklist: - [ ] The code change is tested and works locally. - [ ] Tests have been added to verify that the new code works (under `tests/` folder). If user exposed functionality or configuration variables are added/changed: - [ ] Documentation added/updated in [esphomedocs](https://github.com/OttoWinter/esphomedocs).
95 lines
2.5 KiB
C++
95 lines
2.5 KiB
C++
#pragma once
|
|
|
|
#include "esphome/core/component.h"
|
|
#include "esphome/core/automation.h"
|
|
#include "esphome/components/binary_sensor/binary_sensor.h"
|
|
#include "esphome/components/spi/spi.h"
|
|
|
|
namespace esphome {
|
|
namespace pn532 {
|
|
|
|
class PN532BinarySensor;
|
|
class PN532Trigger;
|
|
|
|
class PN532 : public PollingComponent, public spi::SPIDevice {
|
|
public:
|
|
PN532(uint32_t update_interval);
|
|
|
|
void setup() override;
|
|
|
|
void dump_config() override;
|
|
|
|
void update() override;
|
|
float get_setup_priority() const override;
|
|
|
|
void loop() override;
|
|
|
|
void register_tag(PN532BinarySensor *tag) { this->binary_sensors_.push_back(tag); }
|
|
void register_trigger(PN532Trigger *trig) { this->triggers_.push_back(trig); }
|
|
|
|
protected:
|
|
bool is_device_msb_first() override;
|
|
|
|
/// Write the full command given in data to the PN532
|
|
void pn532_write_command_(const std::vector<uint8_t> &data);
|
|
bool pn532_write_command_check_ack_(const std::vector<uint8_t> &data);
|
|
|
|
/** Read a data frame from the PN532 and return the result as a vector.
|
|
*
|
|
* Note that is_ready needs to be checked first before requesting this method.
|
|
*
|
|
* On failure, an empty vector is returned.
|
|
*/
|
|
std::vector<uint8_t> pn532_read_data_();
|
|
|
|
/** Checks if the PN532 has set its ready status flag.
|
|
*
|
|
* Procedure goes as follows:
|
|
* - Host sends command to PN532 "write data"
|
|
* - Wait for readiness (until PN532 has processed command) by polling "read status"/is_ready_
|
|
* - Parse ACK/NACK frame with "read data" byte
|
|
*
|
|
* - If data required, wait until device reports readiness again
|
|
* - Then call "read data" and read certain number of bytes (length is given at offset 4 of frame)
|
|
*/
|
|
bool is_ready_();
|
|
bool wait_ready_();
|
|
|
|
bool read_ack_();
|
|
|
|
bool requested_read_{false};
|
|
std::vector<PN532BinarySensor *> binary_sensors_;
|
|
std::vector<PN532Trigger *> triggers_;
|
|
enum PN532Error {
|
|
NONE = 0,
|
|
WAKEUP_FAILED,
|
|
SAM_COMMAND_FAILED,
|
|
} error_code_{NONE};
|
|
};
|
|
|
|
class PN532BinarySensor : public binary_sensor::BinarySensor {
|
|
public:
|
|
PN532BinarySensor(const std::string &name, const std::vector<uint8_t> &uid);
|
|
|
|
bool process(const uint8_t *data, uint8_t len);
|
|
|
|
void on_scan_end() {
|
|
if (!this->found_) {
|
|
this->publish_state(false);
|
|
}
|
|
this->found_ = false;
|
|
}
|
|
|
|
protected:
|
|
std::vector<uint8_t> uid_;
|
|
bool found_{false};
|
|
};
|
|
|
|
class PN532Trigger : public Trigger<std::string> {
|
|
public:
|
|
void process(const uint8_t *uid, uint8_t uid_length);
|
|
};
|
|
|
|
} // namespace pn532
|
|
} // namespace esphome
|