Avoid use of deprecated Xml_node methods

Issue #3755
This commit is contained in:
Norman Feske
2020-05-06 19:06:25 +02:00
parent d22b95ded3
commit be65c4acd2
16 changed files with 196 additions and 212 deletions

View File

@ -34,8 +34,7 @@
namespace Gpio {
class Invalid_gpio_number : Genode::Exception {};
class Invalid_mode : Genode::Exception {};
class Invalid_mode : Genode::Exception {};
static void process_config(Genode::Xml_node const &config, Gpio::Driver &driver);
}
@ -43,41 +42,37 @@ namespace Gpio {
void Gpio::process_config(Genode::Xml_node const &config, Gpio::Driver &driver)
{
try {
Genode::Xml_node gpio_node = config.sub_node("gpio");
for (;; gpio_node = gpio_node.next("gpio")) {
unsigned num = 0;
char mode[2] = {0};
unsigned value = 0;
try {
gpio_node.attribute("num").value(&num);
if (!driver.gpio_valid(num)) throw Invalid_gpio_number();
gpio_node.attribute("mode").value(mode, sizeof(mode));
if (mode[0] == 'O' || mode[0] == 'o') {
gpio_node.attribute("value").value(&value);
driver.write(num, value);
driver.direction(num, false);
} else if (mode[0] == 'I' || mode[0] == 'i') {
driver.direction(num, true);
} else throw Invalid_mode();
Genode::log("gpio ", num, " "
"mode ", Genode::Cstring(mode), " "
"value=", value);
} catch(Genode::Xml_node::Nonexistent_attribute) {
Genode::warning("missing attribute. Ignore node.");
} catch(Gpio::Invalid_gpio_number) {
Genode::warning("invalid GPIO number ", num, ", ignore node");
}
if (gpio_node.last("gpio")) break;
}
}
catch (Genode::Xml_node::Nonexistent_sub_node) {
if (!config.has_sub_node("gpio"))
Genode::warning("no GPIO config");
}
config.for_each_sub_node("gpio", [&] (Genode::Xml_node const &gpio_node) {
unsigned const num = gpio_node.attribute_value("num", 0U);
if (!driver.gpio_valid(num)) {
Genode::warning("invalid GPIO number ", num, ", ignore node");
return;
}
typedef Genode::String<2> Mode;
Mode const mode = gpio_node.attribute_value("mode", Mode());
unsigned value = 0;
if (mode == "O" || mode == "o") {
value = gpio_node.attribute_value("value", value);
driver.write(num, value);
driver.direction(num, false);
}
else if (mode == "I" || mode == "i") {
driver.direction(num, true);
}
else {
Genode::error("gpio ", num, " has invalid mode, must be I or O");
throw Invalid_mode();
}
Genode::log("gpio ", num, " mode ", mode, " value=", value);
});
}
#endif /* _INCLUDE__GPIO__CONFIG_H_ */