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 setup_helper.apply(entity);
98 return UnitResult::ok();
102UnitResult entities::Entity::extract(Entity* entity,
const pb_ExtractCommand& cmd, pb_ExtractResponse &response) {
103#ifdef ANABRID_DEBUG_COMMS
104 Serial.println(__PRETTY_FUNCTION__);
106 if (cmd.has_entity) {
108 path.push(cmd.entity.path);
109 entity = entity->resolve_child_entity(path);
113 ExtractSettings settings{ cmd.recursive, cmd.specification, cmd.calibration, cmd.calibration};
114 setup.extract(entity, settings);
115 setup.get(response.module);
116 response.has_module =
true;
119 return UnitResult::ok();
122UnitResult entities::Entity::reset(Entity *entity,
const pb_ResetCommand &msg_in, pb_ResetResponse &msg_out) {
123 entities::ResetAction reset_request(0);
129 msg_out.has_entity =
false;
131 bool keep_calibration = msg_in.keep_calibration |
true;
133 if (!keep_calibration)
134 reset_request.val |= entities::ResetAction::CALIBRATION_RESET;
136 bool overload_reset = msg_in.overload_reset |
true;
139 reset_request.val |= entities::ResetAction::OVERLOAD_RESET;
142 bool circuit_reset = msg_in.circuit_reset |
true;
145 reset_request.val |= entities::ResetAction::CIRCUIT_RESET;
147 entity->reset(reset_request);
149 if (msg_in.sync |
true) {
150 TRY(entity->write_to_hardware());
152 return UnitResult::ok();