diff --git a/companion/src/firmwares/edgetx/edgetxinterface.cpp b/companion/src/firmwares/edgetx/edgetxinterface.cpp index f1f1a0c91..4b86a17d7 100644 --- a/companion/src/firmwares/edgetx/edgetxinterface.cpp +++ b/companion/src/firmwares/edgetx/edgetxinterface.cpp @@ -51,34 +51,27 @@ bool loadModelsListFromYaml(std::vector& categories, if (data.size() == 0) return true; - try { - YAML::Node node = loadYamlFromByteArray(data); - if (!node.IsSequence()) return false; + YAML::Node node = loadYamlFromByteArray(data); + if (!node.IsSequence()) return false; - int modelIdx = 0; - for (const auto& cat : node) { + int modelIdx = 0; + for (const auto& cat : node) { + if (!cat.IsMap()) continue; - if (!cat.IsMap()) continue; + for (const auto& cat_map : cat) { + categories.push_back(cat_map.first.Scalar().c_str()); - for (const auto& cat_map : cat) { - categories.push_back(cat_map.first.Scalar().c_str()); + const auto& models = cat_map.second; + if (!models.IsSequence()) continue; - const auto& models = cat_map.second; - if (!models.IsSequence()) continue; - - for (const auto& model : models) { - std::string filename, name; - model["filename"] >> filename; - model["name"] >> name; - modelFiles.push_back( - {filename, name, (int)categories.size() - 1, modelIdx++}); - } + for (const auto& model : models) { + std::string filename, name; + model["filename"] >> filename; + model["name"] >> name; + modelFiles.push_back( + {filename, name, (int)categories.size() - 1, modelIdx++}); } } - - } catch (const std::runtime_error& e) { - qDebug() << "YAML::ParserException: " << e.what(); - return false; } return true; diff --git a/companion/src/storage/categorized.cpp b/companion/src/storage/categorized.cpp index 4c3caf7c2..5fc59c417 100644 --- a/companion/src/storage/categorized.cpp +++ b/companion/src/storage/categorized.cpp @@ -254,9 +254,34 @@ bool CategorizedStorageFormat::loadYaml(RadioData & radioData) QByteArray modelslistBuffer; if (loadFile(modelslistBuffer, "MODELS/models.yml")) { - if (!loadModelsListFromYaml(radioData.categories, modelFiles, modelslistBuffer)) { - setError(tr("Can't load MODELS/models.yml")); - return false; + try { + if (!loadModelsListFromYaml(radioData.categories, modelFiles, modelslistBuffer)) { + setError(tr("Can't load MODELS/models.yml")); + return false; + } + } catch(const std::runtime_error& e) { + setError(tr("Can't load MODELS/models.yml") + ":\n" + QString(e.what())); + //return false; + + //TODO: fall back to directory scan + std::list filelist; + if (!getFileList(filelist)) { + return false; + } + + // push default category + radioData.categories.push_back("Models"); + + const std::regex yml_regex("MODELS/(model[0-9]+\\.yml)"); + for(const auto& f : filelist) { + std::smatch match; + if (std::regex_match(f, match, yml_regex)) { + if (match.size() == 2) { + std::ssub_match modelFile = match[1]; + modelFiles.push_back({ modelFile.str(), "", 0, 0 }); + } + } + } } } else { // fetch "MODELS/modelXX.yml"