You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.6 KiB

3 weeks ago
#include "thing_manager.h"
#include <esp_log.h>
#define TAG "ThingManager"
namespace iot {
void ThingManager::AddThing(Thing* thing) {
things_.push_back(thing);
}
std::string ThingManager::GetDescriptorsJson() {
std::string json_str = "[";
for (auto& thing : things_) {
json_str += thing->GetDescriptorJson() + ",";
}
if (json_str.back() == ',') {
json_str.pop_back();
}
json_str += "]";
return json_str;
}
bool ThingManager::GetStatesJson(std::string& json, bool delta) {
if (!delta) {
last_states_.clear();
}
bool changed = false;
json = "[";
// 枚举thing获取每个thing的state如果发生变化则更新保存到last_states_
// 如果delta为true则只返回变化的部分
for (auto& thing : things_) {
std::string state = thing->GetStateJson();
if (delta) {
// 如果delta为true则只返回变化的部分
auto it = last_states_.find(thing->name());
if (it != last_states_.end() && it->second == state) {
continue;
}
changed = true;
last_states_[thing->name()] = state;
}
json += state + ",";
}
if (json.back() == ',') {
json.pop_back();
}
json += "]";
return changed;
}
void ThingManager::Invoke(const cJSON* command) {
auto name = cJSON_GetObjectItem(command, "name");
for (auto& thing : things_) {
if (thing->name() == name->valuestring) {
thing->Invoke(command);
return;
}
}
}
} // namespace iot