9#include "../system/system_utils.h"
10#include "../json_helper.h"
35 "./Config/global_blackboard_register.json",
36 "Config/global_blackboard_register.json",
37 "../Config/global_blackboard_register.json",
38 "../../Config/global_blackboard_register.json"
53 SYSTEM_LOG <<
"[GlobalTemplateBlackboard::Get] WARNING: Failed to load register from any path\n";
68 "./Config/global_blackboard_register.json",
69 "Config/global_blackboard_register.json",
70 "../Config/global_blackboard_register.json",
71 "../../Config/global_blackboard_register.json"
79 SYSTEM_LOG <<
"[GlobalTemplateBlackboard::Reload] Successfully reloaded from: " << path <<
"\n";
87 SYSTEM_LOG <<
"[GlobalTemplateBlackboard::Reload] WARNING: Failed to reload registry from any path\n";
107 if (!
root.contains(
"variables") || !
root[
"variables"].is_array())
113 SYSTEM_LOG <<
"[GlobalTemplateBlackboard::LoadFromFile] Found variables array with " <<
varsArray.size() <<
" entries\n";
118 if (!
varObj.contains(
"key") || !
varObj[
"key"].is_string())
121 const std::string
key =
varObj[
"key"].get<std::string>();
124 if (
varObj.contains(
"type") &&
varObj[
"type"].is_string())
131 if (
varObj.contains(
"defaultValue"))
143 if (
valNode.is_number_integer())
157 const float x =
valNode[
"x"].get<
float>();
158 const float y =
valNode[
"y"].get<
float>();
159 const float z =
valNode[
"z"].get<
float>();
164 if (
valNode.is_number_integer())
174 else if (
varObj.contains(
"value"))
186 if (
valNode.is_number_integer())
200 const float x =
valNode[
"x"].get<
float>();
201 const float y =
valNode[
"y"].get<
float>();
202 const float z =
valNode[
"z"].get<
float>();
207 if (
valNode.is_number_integer())
217 std::string description;
218 if (
varObj.contains(
"description") &&
varObj[
"description"].is_string())
219 description =
varObj[
"description"].get<std::string>();
221 bool isPersistent =
false;
222 if (
varObj.contains(
"isPersistent") &&
varObj[
"isPersistent"].is_boolean())
224 else if (
varObj.contains(
"persistent") &&
varObj[
"persistent"].is_boolean())
234 SYSTEM_LOG <<
"[GlobalTemplateBlackboard::LoadFromFile] Successfully loaded " <<
loadedCount <<
" variables\n";
237 catch (
const std::exception&
e)
252 pathToUse =
"./Config/global_blackboard_register.json";
275 root[
"schema_version"] = 1;
280 root[
"name"] =
"Global Blackboard Register";
285 root[
"description"] =
"Project-scope global variable definitions accessible to all entities";
290 root[
"schema_version"] = 1;
291 root[
"name"] =
"Global Blackboard Register";
292 root[
"description"] =
"Project-scope global variable definitions accessible to all entities";
298 root[
"schema_version"] = 1;
299 root[
"name"] =
"Global Blackboard Register";
300 root[
"description"] =
"Project-scope global variable definitions accessible to all entities";
304 auto now = std::chrono::system_clock::now();
313 strftime(timestamp,
sizeof(timestamp),
"%Y-%m-%dT%H:%M:%SZ", &
tm_info);
314 root[
"lastModified"] = std::string(timestamp);
324 varObj[
"isPersistent"] =
var.IsPersistent;
327 if (!
var.DefaultValue.IsNone())
332 varObj[
"value"] =
var.DefaultValue.AsBool();
335 varObj[
"value"] =
var.DefaultValue.AsInt();
338 varObj[
"value"] =
var.DefaultValue.AsFloat();
341 varObj[
"value"] =
var.DefaultValue.AsString();
345 const ::Vector
v =
var.DefaultValue.AsVector();
354 varObj[
"value"] =
static_cast<int>(
var.DefaultValue.AsEntityID());
402 SYSTEM_LOG <<
"[GlobalTemplateBlackboard] SaveToFile FAILED: Could not open file for writing\n";
412 catch (
const std::exception&
e)
414 SYSTEM_LOG <<
"[GlobalTemplateBlackboard] SaveToFile EXCEPTION: " <<
e.what() <<
"\n";
429 const std::string& description,
435 if (!defaultValue.
IsNone() && defaultValue.
GetType() != type)
465 const std::string& description)
477 if (!description.empty())
489 size_t idx =
it->second;
554 std::string
summary =
"[GlobalTemplateBlackboard] " + std::to_string(
m_variables.size()) +
" variables\n";
572 if (!std::isalpha(name[0]) && name[0] !=
'_')
575 for (
size_t i = 1;
i < name.length(); ++
i)
577 if (!std::isalnum(name[
i]) && name[
i] !=
'_')
ComponentTypeID GetComponentTypeID_Static()
Project-scope blackboard variable registry.
const GlobalEntryDefinition * GetVariable(const std::string &key) const
bool SaveToFile(const std::string &configPath="") const
static void Reload()
Force reload of the registry from file (useful for hot reload)
bool UpdateVariable(const std::string &key, const TaskValue &defaultValue, const std::string &description="")
std::string m_lastLoadedPath
Track the last successfully loaded path for consistent saves.
bool LoadFromFile(const std::string &configPath="./Config/global_blackboard_register.json")
static GlobalTemplateBlackboard & Get()
std::unordered_map< std::string, size_t > m_nameToIndex
bool HasVariable(const std::string &key) const
size_t GetVariableCount() const
VariableType GetVariableType(const std::string &key) const
std::vector< GlobalEntryDefinition > m_variables
bool HasConflicts() const
static bool IsValidVariableName(const std::string &name)
static bool IsTypeCompatible(VariableType existingType, VariableType newType)
bool AddVariable(const std::string &key, VariableType type, const TaskValue &defaultValue, const std::string &description="", bool isPersistent=false)
std::string DebugSummary() const
bool RemoveVariable(const std::string &key)
const std::vector< GlobalEntryDefinition > & GetAllVariables() const
TaskValue GetDefaultValue(const std::string &key) const
C++14-compliant type-safe value container for task parameters.
bool IsNone() const
Returns true if the value has not been set (type == None).
VariableType GetType() const
Returns the VariableType tag of the stored value.
< Provides AssetID and INVALID_ASSET_ID
VariableType
Type tags used by TaskValue to identify stored data.
@ Int
32-bit signed integer
@ Float
Single-precision float.
@ Vector
3-component vector (Vector from vector.h)
@ None
Uninitialized / empty value.
@ EntityID
Entity identifier (uint64_t)
static std::string VariableTypeToString(VariableType type)
Converts a VariableType to its canonical string representation.
static VariableType StringToVariableType(const std::string &str)
static TaskValue GetDefaultValueForType(VariableType type)
Returns a correctly-typed default TaskValue for the given VariableType.