expo: Use better names for child objects in expo_build

Use the parent object name as a prefix for child objects, so they
have descriptive names like "cpu-speed.title" instead of generic
"title". This makes debugging easier when multiple objects exist.

Update add_txt_str() and add_txt_str_list() to take separate
property name and object name parameters.

Also set the scene's prompt_id when building from devicetree.

Co-developed-by: Claude <claude@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
This commit is contained in:
Simon Glass
2025-12-07 10:10:05 -07:00
parent 9b0bd72935
commit 4ce003192f
2 changed files with 37 additions and 19 deletions

View File

@@ -38,12 +38,13 @@ struct build_info {
* @info: Build information
* @node: Node describing scene
* @scn: Scene to add to
* @find_name: Name to look for (e.g. "title"). This will find a property called
* "title" if it exists, else will look up the string for "title-id"
* @find_name: Property to look for (e.g. "title"). This will find a property
* called "title" if it exists, else will look up the string for "title-id"
* @obj_name: Name for the object (e.g. "cpu-speed.title")
* Return: ID of added string, or -ve on error
*/
int add_txt_str(struct build_info *info, ofnode node, struct scene *scn,
const char *find_name, uint obj_id)
const char *find_name, const char *obj_name, uint obj_id)
{
const char *text;
int ret;
@@ -66,7 +67,7 @@ int add_txt_str(struct build_info *info, ofnode node, struct scene *scn,
return log_msg_ret("id", -EINVAL);
}
ret = scene_txt_str(scn, find_name, obj_id, 0, text, NULL);
ret = scene_txt_str(scn, obj_name, obj_id, 0, text, NULL);
if (ret < 0)
return log_msg_ret("add", ret);
@@ -79,13 +80,15 @@ int add_txt_str(struct build_info *info, ofnode node, struct scene *scn,
* @info: Build information
* @node: Node describing scene
* @scn: Scene to add to
* @find_name: Name to look for (e.g. "title"). This will find a string-list
* @find_name: Property to look for (e.g. "title"). This will find a string-list
* property called "title" if it exists, else will look up the string in the
* "title-id" string list.
* @obj_name: Name for the object (e.g. "cpu-speed.title")
* Return: ID of added string, or -ve on error
*/
int add_txt_str_list(struct build_info *info, ofnode node, struct scene *scn,
const char *find_name, int index, uint obj_id)
const char *find_name, const char *obj_name, int index,
uint obj_id)
{
const char *text;
int ret;
@@ -107,7 +110,7 @@ int add_txt_str_list(struct build_info *info, ofnode node, struct scene *scn,
return log_msg_ret("id", -EINVAL);
}
ret = scene_txt_str(scn, find_name, obj_id, 0, text, NULL);
ret = scene_txt_str(scn, obj_name, obj_id, 0, text, NULL);
if (ret < 0)
return log_msg_ret("add", ret);
@@ -220,6 +223,7 @@ static int menu_build(struct build_info *info, ofnode node, struct scene *scn,
int ret, size, i, num_items;
uint title_id, menu_id;
const char *name;
char buf[80];
name = ofnode_get_name(node);
@@ -229,7 +233,8 @@ static int menu_build(struct build_info *info, ofnode node, struct scene *scn,
menu_id = ret;
/* Set the title */
ret = add_txt_str(info, node, scn, "title", 0);
snprintf(buf, sizeof(buf), "%s.title", name);
ret = add_txt_str(info, node, scn, "title", buf, 0);
if (ret < 0)
return log_msg_ret("tit", ret);
title_id = ret;
@@ -254,22 +259,28 @@ static int menu_build(struct build_info *info, ofnode node, struct scene *scn,
struct scene_menitem *item;
uint label, key, desc;
ret = add_txt_str_list(info, node, scn, "item-label", i, 0);
snprintf(buf, sizeof(buf), "%s.item-%x.label", name, i);
ret = add_txt_str_list(info, node, scn, "item-label", buf, i,
0);
if (ret < 0 && ret != -ENOENT)
return log_msg_ret("lab", ret);
label = max(0, ret);
ret = add_txt_str_list(info, node, scn, "key-label", i, 0);
snprintf(buf, sizeof(buf), "%s.item-%x.key", name, i);
ret = add_txt_str_list(info, node, scn, "key-label", buf, i, 0);
if (ret < 0 && ret != -ENOENT)
return log_msg_ret("key", ret);
key = max(0, ret);
ret = add_txt_str_list(info, node, scn, "desc-label", i, 0);
snprintf(buf, sizeof(buf), "%s.item-%x.desc", name, i);
ret = add_txt_str_list(info, node, scn, "desc-label", buf, i,
0);
if (ret < 0 && ret != -ENOENT)
return log_msg_ret("lab", ret);
desc = max(0, ret);
ret = scene_menuitem(scn, menu_id, simple_xtoa(i),
snprintf(buf, sizeof(buf), "%s.item-%x", name, i);
ret = scene_menuitem(scn, menu_id, buf,
fdt32_to_cpu(item_ids[i]), key, label,
desc, 0, 0, &item);
if (ret < 0)
@@ -316,6 +327,7 @@ static int textline_build(struct build_info *info, ofnode node,
struct scene_obj_textline *ted;
uint edit_id;
const char *name;
char buf[80];
u32 max_chars;
int ret;
@@ -330,8 +342,9 @@ static int textline_build(struct build_info *info, ofnode node,
if (ret < 0)
return log_msg_ret("ted", ret);
/* Set the title */
ret = add_txt_str(info, node, scn, "title", 0);
/* Set the label */
snprintf(buf, sizeof(buf), "%s.label", name);
ret = add_txt_str(info, node, scn, "title", buf, 0);
if (ret < 0)
return log_msg_ret("tit", ret);
ted->label_id = ret;
@@ -342,7 +355,8 @@ static int textline_build(struct build_info *info, ofnode node,
if (ret)
return log_msg_ret("id", -ENOENT);
ret = scene_txt_str(scn, "edit", edit_id, 0, abuf_data(&ted->buf),
snprintf(buf, sizeof(buf), "%s.edit", name);
ret = scene_txt_str(scn, buf, edit_id, 0, abuf_data(&ted->buf),
NULL);
if (ret < 0)
return log_msg_ret("add", ret);
@@ -414,6 +428,7 @@ static int scene_build(struct build_info *info, ofnode scn_node,
const char *name;
struct scene *scn;
uint id, title_id;
char buf[80];
ofnode node;
int ret;
@@ -428,15 +443,18 @@ static int scene_build(struct build_info *info, ofnode scn_node,
if (ret < 0)
return log_msg_ret("scn", ret);
ret = add_txt_str(info, scn_node, scn, "title", 0);
snprintf(buf, sizeof(buf), "%s.title", name);
ret = add_txt_str(info, scn_node, scn, "title", buf, 0);
if (ret < 0)
return log_msg_ret("tit", ret);
title_id = ret;
scn->title_id = title_id;
ret = add_txt_str(info, scn_node, scn, "prompt", 0);
snprintf(buf, sizeof(buf), "%s.prompt", name);
ret = add_txt_str(info, scn_node, scn, "prompt", buf, 0);
if (ret < 0)
return log_msg_ret("pr", ret);
scn->prompt_id = ret;
ofnode_for_each_subnode(node, scn_node) {
info->err_node = node;