mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-17 12:25:32 +00:00
aux/util: Move json config parsing to aux/util
This commit is contained in:
parent
aa9298f70d
commit
5e4c62c8aa
|
@ -143,6 +143,8 @@ set(UTIL_SOURCE_FILES
|
|||
util/u_timing_render.h
|
||||
util/u_var.cpp
|
||||
util/u_var.h
|
||||
util/u_config_json.c
|
||||
util/u_config_json.h
|
||||
)
|
||||
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/util/u_git_tag.c.in" "${CMAKE_CURRENT_BINARY_DIR}/u_git_tag.c" @ONLY)
|
||||
|
|
|
@ -58,6 +58,8 @@ lib_aux_util = static_library(
|
|||
'util/u_timing_render.h',
|
||||
'util/u_var.cpp',
|
||||
'util/u_var.h',
|
||||
'util/u_config_json.c',
|
||||
'util/u_config_json.h',
|
||||
) + [
|
||||
u_git_tag_c,
|
||||
],
|
||||
|
|
|
@ -7,11 +7,15 @@
|
|||
* @ingroup st_prober
|
||||
*/
|
||||
|
||||
#include <xrt/xrt_device.h>
|
||||
#include "xrt/xrt_settings.h"
|
||||
#include "xrt/xrt_config.h"
|
||||
|
||||
#include "util/u_file.h"
|
||||
#include "util/u_json.h"
|
||||
#include "util/u_debug.h"
|
||||
|
||||
#include "p_prober.h"
|
||||
#include "u_config_json.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -20,13 +24,15 @@
|
|||
|
||||
DEBUG_GET_ONCE_OPTION(active_config, "P_OVERRIDE_ACTIVE_CONFIG", NULL)
|
||||
|
||||
#define CONFIG_FILE_NAME "config_v0.json"
|
||||
|
||||
|
||||
void
|
||||
p_json_open_or_create_main_file(struct prober *p)
|
||||
u_config_json_open_or_create_main_file(struct u_config_json *json)
|
||||
{
|
||||
#ifdef XRT_OS_LINUX
|
||||
char tmp[1024];
|
||||
ssize_t ret = u_file_get_path_in_config_dir("config_v0.json", tmp, sizeof(tmp));
|
||||
ssize_t ret = u_file_get_path_in_config_dir(CONFIG_FILE_NAME, tmp, sizeof(tmp));
|
||||
if (ret <= 0) {
|
||||
U_LOG_E(
|
||||
"Could not load or create config file no $HOME "
|
||||
|
@ -34,12 +40,12 @@ p_json_open_or_create_main_file(struct prober *p)
|
|||
return;
|
||||
}
|
||||
|
||||
FILE *file = u_file_open_file_in_config_dir("config_v0.json", "r");
|
||||
FILE *file = u_file_open_file_in_config_dir(CONFIG_FILE_NAME, "r");
|
||||
if (file == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
p->json.file_loaded = true;
|
||||
json->file_loaded = true;
|
||||
|
||||
char *str = u_file_read_content(file);
|
||||
fclose(file);
|
||||
|
@ -54,8 +60,8 @@ p_json_open_or_create_main_file(struct prober *p)
|
|||
return;
|
||||
}
|
||||
|
||||
p->json.root = cJSON_Parse(str);
|
||||
if (p->json.root == NULL) {
|
||||
json->root = cJSON_Parse(str);
|
||||
if (json->root == NULL) {
|
||||
U_LOG_E("Failed to parse JSON in '%s':\n%s\n#######", tmp, str);
|
||||
U_LOG_E("'%s'", cJSON_GetErrorPtr());
|
||||
}
|
||||
|
@ -142,10 +148,10 @@ get_obj_str(cJSON *json, const char *name, char *array, size_t array_size)
|
|||
}
|
||||
|
||||
static bool
|
||||
is_json_ok(struct prober *p)
|
||||
is_json_ok(struct u_config_json *json)
|
||||
{
|
||||
if (p->json.root == NULL) {
|
||||
if (p->json.file_loaded) {
|
||||
if (json->root == NULL) {
|
||||
if (json->file_loaded) {
|
||||
U_LOG_E("JSON not parsed!");
|
||||
} else {
|
||||
U_LOG_W("No config file!");
|
||||
|
@ -157,17 +163,17 @@ is_json_ok(struct prober *p)
|
|||
}
|
||||
|
||||
static bool
|
||||
parse_active(const char *str, const char *from, enum p_active_config *out_active)
|
||||
parse_active(const char *str, const char *from, enum u_config_json_active_config *out_active)
|
||||
{
|
||||
if (strcmp(str, "none") == 0) {
|
||||
*out_active = P_ACTIVE_CONFIG_NONE;
|
||||
*out_active = U_ACTIVE_CONFIG_NONE;
|
||||
} else if (strcmp(str, "tracking") == 0) {
|
||||
*out_active = P_ACTIVE_CONFIG_TRACKING;
|
||||
*out_active = U_ACTIVE_CONFIG_TRACKING;
|
||||
} else if (strcmp(str, "remote") == 0) {
|
||||
*out_active = P_ACTIVE_CONFIG_REMOTE;
|
||||
*out_active = U_ACTIVE_CONFIG_REMOTE;
|
||||
} else {
|
||||
U_LOG_E("Unknown active config '%s' from %s.", str, from);
|
||||
*out_active = P_ACTIVE_CONFIG_NONE;
|
||||
*out_active = U_ACTIVE_CONFIG_NONE;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -175,7 +181,7 @@ parse_active(const char *str, const char *from, enum p_active_config *out_active
|
|||
}
|
||||
|
||||
void
|
||||
p_json_get_active(struct prober *p, enum p_active_config *out_active)
|
||||
u_config_json_get_active(struct u_config_json *json, enum u_config_json_active_config *out_active)
|
||||
{
|
||||
const char *str = debug_get_option_active_config();
|
||||
if (str != NULL && parse_active(str, "environment", out_active)) {
|
||||
|
@ -183,8 +189,8 @@ p_json_get_active(struct prober *p, enum p_active_config *out_active)
|
|||
}
|
||||
|
||||
char tmp[256];
|
||||
if (!is_json_ok(p) || !get_obj_str(p->json.root, "active", tmp, sizeof(tmp))) {
|
||||
*out_active = P_ACTIVE_CONFIG_NONE;
|
||||
if (!is_json_ok(json) || !get_obj_str(json->root, "active", tmp, sizeof(tmp))) {
|
||||
*out_active = U_ACTIVE_CONFIG_NONE;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -192,9 +198,9 @@ p_json_get_active(struct prober *p, enum p_active_config *out_active)
|
|||
}
|
||||
|
||||
bool
|
||||
p_json_get_remote_port(struct prober *p, int *out_port)
|
||||
u_config_json_get_remote_port(struct u_config_json *json, int *out_port)
|
||||
{
|
||||
cJSON *t = cJSON_GetObjectItemCaseSensitive(p->json.root, "remote");
|
||||
cJSON *t = cJSON_GetObjectItemCaseSensitive(json->root, "remote");
|
||||
if (t == NULL) {
|
||||
U_LOG_E("No remote node");
|
||||
return false;
|
||||
|
@ -221,10 +227,10 @@ p_json_get_remote_port(struct prober *p, int *out_port)
|
|||
}
|
||||
|
||||
static cJSON *
|
||||
open_tracking_settings(struct prober *p)
|
||||
open_tracking_settings(struct u_config_json *json)
|
||||
{
|
||||
if (p->json.root == NULL) {
|
||||
if (p->json.file_loaded) {
|
||||
if (json->root == NULL) {
|
||||
if (json->file_loaded) {
|
||||
U_LOG_E("JSON not parsed!");
|
||||
} else {
|
||||
U_LOG_W("No config file!");
|
||||
|
@ -232,7 +238,7 @@ open_tracking_settings(struct prober *p)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
cJSON *t = cJSON_GetObjectItemCaseSensitive(p->json.root, "tracking");
|
||||
cJSON *t = cJSON_GetObjectItemCaseSensitive(json->root, "tracking");
|
||||
if (t == NULL) {
|
||||
U_LOG_E("No tracking node");
|
||||
return NULL;
|
||||
|
@ -251,9 +257,11 @@ open_tracking_settings(struct prober *p)
|
|||
}
|
||||
|
||||
bool
|
||||
p_json_get_tracking_overrides(struct prober *p, struct xrt_tracking_override *out_overrides, size_t *out_num_overrides)
|
||||
u_config_json_get_tracking_overrides(struct u_config_json *json,
|
||||
struct xrt_tracking_override *out_overrides,
|
||||
size_t *out_num_overrides)
|
||||
{
|
||||
cJSON *t = open_tracking_settings(p);
|
||||
cJSON *t = open_tracking_settings(json);
|
||||
if (t == NULL) {
|
||||
U_LOG_E("No tracking node");
|
||||
return false;
|
||||
|
@ -301,9 +309,9 @@ p_json_get_tracking_overrides(struct prober *p, struct xrt_tracking_override *ou
|
|||
}
|
||||
|
||||
bool
|
||||
p_json_get_tracking_settings(struct prober *p, struct xrt_settings_tracking *s)
|
||||
u_config_json_get_tracking_settings(struct u_config_json *json, struct xrt_settings_tracking *s)
|
||||
{
|
||||
cJSON *t = open_tracking_settings(p);
|
||||
cJSON *t = open_tracking_settings(json);
|
||||
if (t == NULL) {
|
||||
U_LOG_E("No tracking node");
|
||||
return false;
|
86
src/xrt/auxiliary/util/u_config_json.h
Normal file
86
src/xrt/auxiliary/util/u_config_json.h
Normal file
|
@ -0,0 +1,86 @@
|
|||
// Copyright 2021, Collabora, Ltd.
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
/*!
|
||||
* @file
|
||||
* @brief Code to manage the settings file.
|
||||
* @author Christoph Haag <christoph.haag@collabora.com>
|
||||
* @ingroup aux_util
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "util/u_json.h"
|
||||
#include "xrt/xrt_settings.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* What config is currently active in the config file.
|
||||
*/
|
||||
enum u_config_json_active_config
|
||||
{
|
||||
U_ACTIVE_CONFIG_NONE = 0,
|
||||
U_ACTIVE_CONFIG_TRACKING = 1,
|
||||
U_ACTIVE_CONFIG_REMOTE = 2,
|
||||
};
|
||||
|
||||
struct u_config_json
|
||||
{
|
||||
//! For error reporting, was it loaded but not parsed?
|
||||
bool file_loaded;
|
||||
|
||||
cJSON *root;
|
||||
};
|
||||
|
||||
/*!
|
||||
* Load the JSON config file.
|
||||
*
|
||||
* @ingroup aux_util
|
||||
*/
|
||||
void
|
||||
u_config_json_open_or_create_main_file(struct u_config_json *json);
|
||||
|
||||
/*!
|
||||
* Read from the JSON loaded json config file and returns the active config,
|
||||
* can be overridden by `P_OVERRIDE_ACTIVE_CONFIG` envirmental variable.
|
||||
*
|
||||
* @ingroup aux_util
|
||||
*/
|
||||
void
|
||||
u_config_json_get_active(struct u_config_json *json, enum u_config_json_active_config *out_active);
|
||||
|
||||
/*!
|
||||
* Extract tracking settings from the JSON.
|
||||
*
|
||||
* @ingroup aux_util
|
||||
* @relatesalso xrt_settings_tracking
|
||||
*/
|
||||
bool
|
||||
u_config_json_get_tracking_settings(struct u_config_json *json, struct xrt_settings_tracking *s);
|
||||
|
||||
/*!
|
||||
* Extract tracking override settings from the JSON.
|
||||
*
|
||||
* Caller allocates an array of XRT_MAX_TRACKING_OVERRIDES tracking_override.
|
||||
*
|
||||
* @ingroup aux_util
|
||||
* @relatesalso xrt_settings_tracking
|
||||
*/
|
||||
bool
|
||||
u_config_json_get_tracking_overrides(struct u_config_json *json,
|
||||
struct xrt_tracking_override *out_overrides,
|
||||
size_t *out_num_overrides);
|
||||
|
||||
/*!
|
||||
* Extract remote settings from the JSON.
|
||||
*
|
||||
* @ingroup aux_util
|
||||
*/
|
||||
bool
|
||||
u_config_json_get_remote_port(struct u_config_json *json, int *out_port);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
|
@ -12,6 +12,9 @@
|
|||
|
||||
#include "xrt/xrt_compiler.h"
|
||||
|
||||
// XRT_DEVICE_NAME_LEN
|
||||
#include "xrt/xrt_device.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
|
|
@ -6,7 +6,6 @@ set(PROBER_INCLUDES)
|
|||
set(PROBER_SOURCE_FILES
|
||||
p_documentation.h
|
||||
p_dump.c
|
||||
p_json.c
|
||||
p_prober.c
|
||||
p_prober.h
|
||||
p_tracking.c
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
prober_sources = [
|
||||
'p_documentation.h',
|
||||
'p_dump.c',
|
||||
'p_json.c',
|
||||
'p_prober.c',
|
||||
'p_prober.h',
|
||||
'p_tracking.c',
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
#include "util/u_var.h"
|
||||
#include "util/u_misc.h"
|
||||
#include "util/u_json.h"
|
||||
#include "util/u_config_json.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "os/os_hid.h"
|
||||
#include "p_prober.h"
|
||||
|
@ -403,12 +403,15 @@ initialize(struct prober *p, struct xrt_prober_entry_lists *lists)
|
|||
p->lists = lists;
|
||||
p->ll = debug_get_log_option_prober_log();
|
||||
|
||||
p->json.file_loaded = false;
|
||||
p->json.root = NULL;
|
||||
|
||||
u_var_add_root((void *)p, "Prober", true);
|
||||
u_var_add_ro_u32(p, &p->ll, "Log Level");
|
||||
|
||||
int ret;
|
||||
|
||||
p_json_open_or_create_main_file(p);
|
||||
u_config_json_open_or_create_main_file(&p->json);
|
||||
|
||||
ret = collect_entries(p);
|
||||
if (ret != 0) {
|
||||
|
@ -762,7 +765,7 @@ add_from_remote(struct prober *p, struct xrt_device **xdevs, size_t num_xdevs, b
|
|||
|
||||
#ifdef XRT_BUILD_DRIVER_REMOTE
|
||||
int port = 4242;
|
||||
if (!p_json_get_remote_port(p, &port)) {
|
||||
if (!u_config_json_get_remote_port(&p->json, &port)) {
|
||||
port = 4242;
|
||||
}
|
||||
|
||||
|
@ -820,18 +823,18 @@ static int
|
|||
select_device(struct xrt_prober *xp, struct xrt_device **xdevs, size_t num_xdevs)
|
||||
{
|
||||
struct prober *p = (struct prober *)xp;
|
||||
enum p_active_config active;
|
||||
enum u_config_json_active_config active;
|
||||
bool have_hmd = false;
|
||||
|
||||
p_json_get_active(p, &active);
|
||||
u_config_json_get_active(&p->json, &active);
|
||||
|
||||
switch (active) {
|
||||
case P_ACTIVE_CONFIG_NONE:
|
||||
case P_ACTIVE_CONFIG_TRACKING:
|
||||
case U_ACTIVE_CONFIG_NONE:
|
||||
case U_ACTIVE_CONFIG_TRACKING:
|
||||
add_from_devices(p, xdevs, num_xdevs, &have_hmd);
|
||||
add_from_auto_probers(p, xdevs, num_xdevs, &have_hmd);
|
||||
break;
|
||||
case P_ACTIVE_CONFIG_REMOTE: add_from_remote(p, xdevs, num_xdevs, &have_hmd); break;
|
||||
case U_ACTIVE_CONFIG_REMOTE: add_from_remote(p, xdevs, num_xdevs, &have_hmd); break;
|
||||
default: assert(false);
|
||||
}
|
||||
|
||||
|
@ -856,7 +859,7 @@ select_device(struct xrt_prober *xp, struct xrt_device **xdevs, size_t num_xdevs
|
|||
|
||||
struct xrt_tracking_override overrides[XRT_MAX_TRACKING_OVERRIDES];
|
||||
size_t num_overrides = 0;
|
||||
if (p_json_get_tracking_overrides(p, overrides, &num_overrides)) {
|
||||
if (u_config_json_get_tracking_overrides(&p->json, overrides, &num_overrides)) {
|
||||
for (size_t i = 0; i < num_overrides; i++) {
|
||||
struct xrt_tracking_override *o = &overrides[i];
|
||||
apply_tracking_override(p, xdevs, num_xdevs, o);
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "xrt/xrt_settings.h"
|
||||
|
||||
#include "util/u_logging.h"
|
||||
#include "util/u_config_json.h"
|
||||
|
||||
#ifdef XRT_HAVE_LIBUSB
|
||||
#include <libusb.h>
|
||||
|
@ -41,16 +42,6 @@
|
|||
#define P_WARN(d, ...) U_LOG_IFL_W(d->ll, __VA_ARGS__)
|
||||
#define P_ERROR(d, ...) U_LOG_IFL_E(d->ll, __VA_ARGS__)
|
||||
|
||||
/*!
|
||||
* What config is currently active in the config file.
|
||||
*/
|
||||
enum p_active_config
|
||||
{
|
||||
P_ACTIVE_CONFIG_NONE = 0,
|
||||
P_ACTIVE_CONFIG_TRACKING = 1,
|
||||
P_ACTIVE_CONFIG_REMOTE = 2,
|
||||
};
|
||||
|
||||
#ifdef XRT_OS_LINUX
|
||||
/*!
|
||||
* A hidraw interface that a @ref prober_device exposes.
|
||||
|
@ -131,13 +122,7 @@ struct prober
|
|||
|
||||
struct xrt_prober_entry_lists *lists;
|
||||
|
||||
struct
|
||||
{
|
||||
//! For error reporting, was it loaded but not parsed?
|
||||
bool file_loaded;
|
||||
|
||||
cJSON *root;
|
||||
} json;
|
||||
struct u_config_json json;
|
||||
|
||||
#ifdef XRT_HAVE_LIBUSB
|
||||
struct
|
||||
|
@ -179,51 +164,6 @@ struct prober
|
|||
*
|
||||
*/
|
||||
|
||||
/*!
|
||||
* Load the JSON config file.
|
||||
*
|
||||
* @public @memberof prober
|
||||
*/
|
||||
void
|
||||
p_json_open_or_create_main_file(struct prober *p);
|
||||
|
||||
/*!
|
||||
* Read from the JSON loaded json config file and returns the active config,
|
||||
* can be overridden by `P_OVERRIDE_ACTIVE_CONFIG` envirmental variable.
|
||||
*
|
||||
* @public @memberof prober
|
||||
*/
|
||||
void
|
||||
p_json_get_active(struct prober *p, enum p_active_config *out_active);
|
||||
|
||||
/*!
|
||||
* Extract tracking settings from the JSON.
|
||||
*
|
||||
* @public @memberof prober
|
||||
* @relatesalso xrt_settings_tracking
|
||||
*/
|
||||
bool
|
||||
p_json_get_tracking_settings(struct prober *p, struct xrt_settings_tracking *s);
|
||||
|
||||
/*!
|
||||
* Extract tracking override settings from the JSON.
|
||||
*
|
||||
* Caller allocates an array of XRT_MAX_TRACKING_OVERRIDES tracking_override.
|
||||
*
|
||||
* @public @memberof prober
|
||||
* @relatesalso xrt_settings_tracking
|
||||
*/
|
||||
bool
|
||||
p_json_get_tracking_overrides(struct prober *p, struct xrt_tracking_override *out_overrides, size_t *out_num_overrides);
|
||||
|
||||
/*!
|
||||
* Extract remote settings from the JSON.
|
||||
*
|
||||
* @public @memberof prober
|
||||
*/
|
||||
bool
|
||||
p_json_get_remote_port(struct prober *p, int *out_port);
|
||||
|
||||
/*!
|
||||
* Dump the given device to stdout.
|
||||
*
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "util/u_var.h"
|
||||
#include "util/u_misc.h"
|
||||
#include "util/u_sink.h"
|
||||
#include "util/u_config_json.h"
|
||||
#include "p_prober.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -134,7 +135,7 @@ p_factory_ensure_frameserver(struct p_factory *fact)
|
|||
// We have no tried the settings.
|
||||
fact->tried_settings = true;
|
||||
|
||||
if (!p_json_get_tracking_settings(fact->p, &fact->settings)) {
|
||||
if (!u_config_json_get_tracking_settings(&fact->p->json, &fact->settings)) {
|
||||
U_LOG_E(
|
||||
"Could not setup PSVR and/or PSMV tracking, "
|
||||
"see above.");
|
||||
|
|
Loading…
Reference in a new issue