1#include "proto/main.pb.h"
4#include <entity/base.h>
5#include <entity/visitor.h>
8std::string entities::EntityClassifier::to_string()
const {
9 return "(class = " + std::to_string(class_) +
", type = " + std::to_string(type) +
10 ", version = " + version.to_string() +
", variant = " + std::to_string(variant) +
")";
13bool entities::EntityClassifier::operator==(
const EntityClassifier &rhs)
const {
14 return class_ == rhs.class_ && class_enum == rhs.class_enum && type == rhs.type && version == rhs.version &&
15 variant == rhs.variant;
18bool entities::EntityClassifier::operator!=(
const EntityClassifier &rhs)
const {
19 return !(rhs == *
this);
22void entities::Entity::set_entity_classifier(EntityClassifier classifier) {
23 this->classifier = classifier;
27const entities::EntityClassifier &entities::Entity::get_entity_classifier()
const {
return classifier; }
29entities::EntityClass entities::Entity::get_entity_class()
const {
return classifier.class_enum; }
31uint8_t entities::Entity::get_entity_type()
const {
return classifier.type; }
33entities::Version entities::Entity::get_entity_version()
const {
return classifier.version; }
35uint8_t entities::Entity::get_entity_variant()
const {
return classifier.variant; }
38entities::Entity *entities::Entity::resolve_child_entity(
const Path& path) {
39 auto resolved_entity =
this;
40 for (
auto& segment : path) {
41 resolved_entity = resolved_entity->get_child_entity(segment);
46 return resolved_entity;
50void entities::Entity::encode_classifier(pb_Entity &out) {
52 auto it = get_entity_id().copy(out.id + 1, std::size(out.id) - 2);
55 auto classifier = get_entity_classifier();
56 out.class_ =
static_cast<pb_Entity_Class
>(classifier.class_);
57 out.type = classifier.type;
58 out.variant = classifier.variant;
59 out.has_version =
true;
60 classifier.version.to_pb(out.version);
62 it = utils::toString(get_entity_eui()).copy(out.eui,
sizeof(out.eui));
65 auto children = get_child_entities();
66 auto& idx = out.children_count = 0;
68 if (children.empty()) {
69 out.children =
nullptr;
73 auto children_classifiers =
new pb_Entity[children.size()];
74 out.children = children_classifiers;
76 for (
auto &child_ptr : children) {
77 if (!child_ptr)
continue;
78 child_ptr->encode_classifier(children_classifiers[idx++]);
83UnitResult entities::Entity::setup(Entity* entity,
const pb_ConfigCommand& cmd, pb_ConfigResponse &response) {
84#ifdef ANABRID_DEBUG_COMMS
85 Serial.println(__PRETTY_FUNCTION__);
87 if (cmd.reset_before) {
88 entity->reset(ResetAction::CIRCUIT_RESET | ResetAction::OVERLOAD_RESET);
89 (void)entity->write_to_hardware();
93 return UnitResult::err(
"Expected bundle inside Config commandCommand");
96 setup_helper.set(cmd.module);
97 return setup_helper.apply(entity);
101UnitResult entities::Entity::extract(Entity* entity,
const pb_ExtractCommand& cmd, pb_ExtractResponse &response) {
102#ifdef ANABRID_DEBUG_COMMS
103 Serial.println(__PRETTY_FUNCTION__);
105 if (cmd.has_entity) {
107 path.push(cmd.entity.path);
108 entity = entity->resolve_child_entity(path);
112 ExtractSettings settings{ cmd.recursive, cmd.specification, cmd.configuration, cmd.calibration};
113 setup.extract(entity, settings);
114 setup.get(response.module);
115 response.has_module =
true;
118 return UnitResult::ok();
121UnitResult entities::Entity::reset(Entity *entity,
const pb_ResetCommand &msg_in, pb_ResetResponse &msg_out) {
122 entities::ResetAction reset_request(0);
128 msg_out.has_entity =
false;
130 bool keep_calibration = msg_in.keep_calibration |
true;
132 if (!keep_calibration)
133 reset_request.val |= entities::ResetAction::CALIBRATION_RESET;
135 bool overload_reset = msg_in.overload_reset |
true;
138 reset_request.val |= entities::ResetAction::OVERLOAD_RESET;
141 bool circuit_reset = msg_in.circuit_reset |
true;
144 reset_request.val |= entities::ResetAction::CIRCUIT_RESET;
146 entity->reset(reset_request);
148 if (msg_in.sync |
true) {
149 TRY_TRUE(entity->write_to_hardware());
151 return UnitResult::ok();