From 713579b238d7bcd9fccffa6e742c81a46acad3e2 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 19 Apr 2021 07:36:59 +0200 Subject: [PATCH] Added basic support for PartialModel load --- radio/src/datastructs.h | 5 +++++ radio/src/storage/sdcard_yaml.cpp | 17 +++++++++++------ radio/src/storage/yaml/CMakeLists.txt | 2 +- radio/src/storage/yaml/yaml_datastructs.h | 1 + radio/src/storage/yaml/yaml_datastructs_x10.cpp | 13 ++++++++++++- .../src/storage/yaml/yaml_datastructs_x12s.cpp | 13 ++++++++++++- 6 files changed, 42 insertions(+), 9 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 8dbd2bb10..99b4a9dbf 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -602,6 +602,11 @@ PACK(struct CustomScreenData { #define SCRIPT_DATA #endif +PACK(struct PartialModel { + ModelHeader header; + TimerData timers[MAX_TIMERS]; +}); + PACK(struct ModelData { ModelHeader header; TimerData timers[MAX_TIMERS]; diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 792205e0f..5866fcbfe 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -138,18 +138,23 @@ const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, u // YAML reader TRACE("YAML model reader"); - if (size < sizeof(g_model)) { - // TODO: Partial load for ModelButton::load() - // -> maybe we should have a summary in modelslist.yml? - memset(buffer, 0, size); - return nullptr; + const YamlNode* data_nodes = nullptr; + if (size == sizeof(g_model)) { + data_nodes = get_modeldata_nodes(); + } + else if (size == sizeof(PartialModel)) { + data_nodes = get_partialmodel_nodes(); + } + else { + TRACE("cannot find YAML data nodes for object size (size=%d)", size); + return "YAML size error"; } char path[256]; getModelPath(path, filename); YamlTreeWalker tree; - tree.reset(get_modeldata_nodes(), buffer); + tree.reset(data_nodes, buffer); // wipe memory before reading YAML memset(buffer,0,size); diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt index 0d24f7050..cc2e4bb35 100644 --- a/radio/src/storage/yaml/CMakeLists.txt +++ b/radio/src/storage/yaml/CMakeLists.txt @@ -17,7 +17,7 @@ endif() set(YAML_GEN ${RADIO_DIRECTORY}/util/generate_yaml.py) set(YAML_GEN_TEMPLATE ${RADIO_DIRECTORY}/util/yaml_parser.tmpl) -SET(YAML_NODES "\"RadioData,ModelData\"") +SET(YAML_NODES "\"RadioData,ModelData,PartialModel\"") set(YAML_GEN_ARGS myeeprom.h ${YAML_GEN_TEMPLATE} ${YAML_NODES} -DYAML_GENERATOR) get_property(flags DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY COMPILE_DEFINITIONS) diff --git a/radio/src/storage/yaml/yaml_datastructs.h b/radio/src/storage/yaml/yaml_datastructs.h index b60981579..5e245a019 100644 --- a/radio/src/storage/yaml/yaml_datastructs.h +++ b/radio/src/storage/yaml/yaml_datastructs.h @@ -26,5 +26,6 @@ struct YamlNode; const YamlNode* get_radiodata_nodes(); const YamlNode* get_modeldata_nodes(); +const YamlNode* get_partialmodel_nodes(); #endif diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 5710beab0..c6fc153b2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -769,8 +769,13 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRING("modelRegistrationID", 8), YAML_END }; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; -#define MAX_RADIODATA_MODELDATA_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); @@ -784,4 +789,10 @@ const YamlNode* get_modeldata_nodes() { return &__ModelData_root_node; } +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 869b235b6..9ec6ea4ab 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -770,8 +770,13 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRING("modelRegistrationID", 8), YAML_END }; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; -#define MAX_RADIODATA_MODELDATA_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); @@ -785,4 +790,10 @@ const YamlNode* get_modeldata_nodes() { return &__ModelData_root_node; } +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +}