int UavcanNode::list_params(int remote_node_id) { int rv = 0; int index = 0; uavcan::protocol::param::GetSet::Response resp; set_setget_response(&resp); while (true) { uavcan::protocol::param::GetSet::Request req; req.index = index++; _callback_success = false; int call_res = get_set_param(remote_node_id, nullptr, req); if (call_res < 0 || !_callback_success) { std::printf("Failed to get param: %d\n", call_res); rv = -1; break; } if (resp.name.empty()) { // Empty name means no such param, which means we're finished break; } print_params(resp); } free_setget_response(); return rv; }
int UavcanNode::get_param(int remote_node_id, const char *name) { uavcan::protocol::param::GetSet::Request req; uavcan::protocol::param::GetSet::Response resp; set_setget_response(&resp); int rv = get_set_param(remote_node_id, name, req); if (rv < 0 || resp.name.empty()) { std::printf("Failed to get param: %s\n", name); rv = -1; } else { print_params(resp); rv = 0; } free_setget_response(); return rv; }
int UavcanNode::set_param(int remote_node_id, const char *name, char *value) { uavcan::protocol::param::GetSet::Request req; uavcan::protocol::param::GetSet::Response resp; set_setget_response(&resp); int rv = get_set_param(remote_node_id, name, req); if (rv < 0 || resp.name.empty()) { std::printf("Failed to retrieve param: %s\n", name); rv = -1; } else { rv = 0; req = {}; if (resp.value.is(uavcan::protocol::param::Value::Tag::integer_value)) { int64_t i = std::strtoull(value, NULL, 10); int64_t min = resp.min_value.to<uavcan::protocol::param::NumericValue::Tag::integer_value>(); int64_t max = resp.max_value.to<uavcan::protocol::param::NumericValue::Tag::integer_value>(); if (i >= min && i <= max) { req.value.to<uavcan::protocol::param::Value::Tag::integer_value>() = i; } else { std::printf("Invalid value for: %s must be between %lld and %lld\n", name, min, max); rv = -1; } } else if (resp.value.is(uavcan::protocol::param::Value::Tag::real_value)) { float f = static_cast<float>(std::atof(value)); float min = resp.min_value.to<uavcan::protocol::param::NumericValue::Tag::real_value>(); float max = resp.max_value.to<uavcan::protocol::param::NumericValue::Tag::real_value>(); if (f >= min && f <= max) { req.value.to<uavcan::protocol::param::Value::Tag::real_value>() = f; } else { std::printf("Invalid value for: %s must be between %.4f and %.4f\n", name, static_cast<double>(min), static_cast<double>(max)); rv = -1; } } else if (resp.value.is(uavcan::protocol::param::Value::Tag::boolean_value)) { int8_t i = (value[0] == '1' || value[0] == 't') ? 1 : 0; req.value.to<uavcan::protocol::param::Value::Tag::boolean_value>() = i; } else if (resp.value.is(uavcan::protocol::param::Value::Tag::string_value)) { req.value.to<uavcan::protocol::param::Value::Tag::string_value>() = value; } if (rv == 0) { rv = get_set_param(remote_node_id, name, req); if (rv < 0 || resp.name.empty()) { std::printf("Failed to set param: %s\n", name); return -1; } return 0; } } free_setget_response(); return rv; }