Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions config/default/commands.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# example custom commands config file
TurretShoot:
kingRollerPower: 1.0
timeout: 2.1

NewTree:
key1: value1
key2: value2
1 change: 1 addition & 0 deletions config/profile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
default
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -11,6 +12,7 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

public class ConfigLoader {
private static final Logger logger = LoggerFactory.getLogger(ConfigLoader.class);
Expand All @@ -24,7 +26,34 @@ public ConfigLoader(@Named("configDir") String configDir) {
this.configDir = configDir;
}

public JsonNode load(String fileName) {
/**
* Get a config, modified for the specified profile
*
* @param configName Config to get
* @param profileName Profile to apply
* @return Combined config for profile
*/
public JsonNode getProfileConfig(String configName, String profileName) {
JsonNode mainConfig = load(configName);
if (profileName.equals("empty")) {
return mainConfig;
}
File file = new File(configDir + File.separator + profileName + File.separator + configName);
File folder = new File(configDir + File.separator + profileName);
// check if we should just use default config
if (!file.exists()) {
logger.info("No profile config file exists for {}, using base config", configName);
return mainConfig;
} else if (!folder.exists()) {
logger.warn("No such profile as {} found, base config will be used.", profileName);
return mainConfig;
} else {
JsonNode profileConfig = load(profileName + File.separator + configName);
return mergeNodes(mainConfig, profileConfig);
}
}

private JsonNode load(String fileName) {
String filePath = configDir + File.separator + fileName;
try (InputStream fileStream = new FileInputStream(filePath)) {
logger.debug("Loading config from path {}", filePath);
Expand All @@ -33,4 +62,31 @@ public JsonNode load(String fileName) {
throw new ConfigException(String.format("Error loading config %s", fileName), e);
}
}

/**
* Combine two JsonNodes
*
* @param mainNode Node to merge into
* @param updateNode Node to merge with
* @return Combined node
*/
private JsonNode mergeNodes(JsonNode mainNode, JsonNode updateNode) {
Iterator<String> fieldNames = updateNode.fieldNames();
while (fieldNames.hasNext()) {
String fieldName = fieldNames.next();
JsonNode jsonNode = mainNode.get(fieldName);
// if field exists and is an embedded object
if (jsonNode != null && jsonNode.isObject()) {
// recurse into embedded object
mergeNodes(jsonNode, updateNode.get(fieldName));
} else {
if (mainNode instanceof ObjectNode) {
// overwrite field
JsonNode value = updateNode.get(fieldName);
((ObjectNode) mainNode).replace(fieldName, value);
}
}
}
return mainNode;
}
}
10 changes: 6 additions & 4 deletions desktop/src/main/java/org/teamtators/rotator/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,12 @@ public void start() {

commandStore.setRobot(robot);

logger.debug("Loading configs");
ObjectNode commandsConfig = (ObjectNode) configLoader.load("commands.yml");
ObjectNode simulationConfig = (ObjectNode) configLoader.load("simulation.yml");
ObjectNode triggersConfig = (ObjectNode) configLoader.load("triggers.yml");
String profileName = configLoader.getProfileConfig("profile.yml", "empty").textValue();
logger.debug("Loading configs with profile {}");
ObjectNode commandsConfig = (ObjectNode) configLoader.getProfileConfig("commands.yml", profileName);
ObjectNode simulationConfig = (ObjectNode) configLoader.getProfileConfig("subsystems.yml", profileName);
ObjectNode triggersConfig = (ObjectNode) configLoader.getProfileConfig("triggers.yml", profileName);
logger.debug("Finished loading configs");

logger.debug("Configuring subsystems");
for (Subsystem subsystem : robot.subsystems()) {
Expand Down
10 changes: 6 additions & 4 deletions rio/src/main/java/org/teamtators/rotator/Robot.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,12 @@ private void initialize() {
commandStore.setRobot(robot);

logger.debug("Created injector. Loading configs");
ObjectNode commandsConfig = (ObjectNode) configLoader.load("commands.yml");
ObjectNode subsystemsConfig = (ObjectNode) configLoader.load("subsystems.yml");
ObjectNode triggersConfig = (ObjectNode) configLoader.load("triggers.yml");

String profileName = configLoader.getProfileConfig("profile.yml", "empty").textValue();
logger.debug("Currently active config profile: {}", profileName);
ObjectNode commandsConfig = (ObjectNode) configLoader.getProfileConfig("commands.yml", profileName);
ObjectNode subsystemsConfig = (ObjectNode) configLoader.getProfileConfig("subsystems.yml", profileName);
ObjectNode triggersConfig = (ObjectNode) configLoader.getProfileConfig("triggers.yml", profileName);
logger.debug("Completed loading configs");

logger.debug("Configuring subsystems");
for (Subsystem subsystem : subsystems) {
Expand Down