rtt: rewrite command 'rtt channellist' as COMMAND_HANDLER

This also fixes a mistake of the jim command returning ERROR_xx
when function rtt_read_channel_info() returns error.
While there:
- format in a human readable way the output dictionary list, while
  preserving the structure of its TCL data;
- add check for the number of parameters.

Change-Id: Ica2b623699d3a606d3992975c836dae96f74b26d
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/7489
Tested-by: jenkins
This commit is contained in:
Antonio Borneo 2022-12-18 22:42:18 +01:00
parent 880ae3f077
commit 0332da1f15
1 changed files with 26 additions and 60 deletions

View File

@ -150,17 +150,17 @@ COMMAND_HANDLER(handle_rtt_channels_command)
return ERROR_OK; return ERROR_OK;
} }
static int jim_channel_list(Jim_Interp *interp, int argc, COMMAND_HANDLER(handle_channel_list)
Jim_Obj * const *argv)
{ {
Jim_Obj *list;
Jim_Obj *channel_list;
char channel_name[CHANNEL_NAME_SIZE]; char channel_name[CHANNEL_NAME_SIZE];
const struct rtt_control *ctrl; const struct rtt_control *ctrl;
struct rtt_channel_info info; struct rtt_channel_info info;
if (CMD_ARGC != 0)
return ERROR_COMMAND_SYNTAX_ERROR;
if (!rtt_found_cb()) { if (!rtt_found_cb()) {
Jim_SetResultFormatted(interp, "rtt: Control block not available"); command_print(CMD, "rtt: Control block not available");
return ERROR_FAIL; return ERROR_FAIL;
} }
@ -169,81 +169,47 @@ static int jim_channel_list(Jim_Interp *interp, int argc,
info.name = channel_name; info.name = channel_name;
info.name_length = sizeof(channel_name); info.name_length = sizeof(channel_name);
list = Jim_NewListObj(interp, NULL, 0); command_print(CMD, "{");
channel_list = Jim_NewListObj(interp, NULL, 0);
for (unsigned int i = 0; i < ctrl->num_up_channels; i++) { for (unsigned int i = 0; i < ctrl->num_up_channels; i++) {
int ret; int ret = rtt_read_channel_info(i, RTT_CHANNEL_TYPE_UP, &info);
Jim_Obj *tmp;
ret = rtt_read_channel_info(i, RTT_CHANNEL_TYPE_UP, &info);
if (ret != ERROR_OK) if (ret != ERROR_OK)
return ret; return ret;
if (!info.size) if (!info.size)
continue; continue;
tmp = Jim_NewListObj(interp, NULL, 0); command_print(CMD,
" {\n"
Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp, " name %s\n"
"name", -1)); " size 0x%" PRIx32 "\n"
Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp, " flags 0x%" PRIx32 "\n"
info.name, -1)); " }",
info.name, info.size, info.flags);
Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
"size", -1));
Jim_ListAppendElement(interp, tmp, Jim_NewIntObj(interp,
info.size));
Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
"flags", -1));
Jim_ListAppendElement(interp, tmp, Jim_NewIntObj(interp,
info.flags));
Jim_ListAppendElement(interp, channel_list, tmp);
} }
Jim_ListAppendElement(interp, list, channel_list); command_print(CMD, "}\n{");
channel_list = Jim_NewListObj(interp, NULL, 0);
for (unsigned int i = 0; i < ctrl->num_down_channels; i++) { for (unsigned int i = 0; i < ctrl->num_down_channels; i++) {
int ret; int ret = rtt_read_channel_info(i, RTT_CHANNEL_TYPE_DOWN, &info);
Jim_Obj *tmp;
ret = rtt_read_channel_info(i, RTT_CHANNEL_TYPE_DOWN, &info);
if (ret != ERROR_OK) if (ret != ERROR_OK)
return ret; return ret;
if (!info.size) if (!info.size)
continue; continue;
tmp = Jim_NewListObj(interp, NULL, 0); command_print(CMD,
" {\n"
Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp, " name %s\n"
"name", -1)); " size 0x%" PRIx32 "\n"
Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp, " flags 0x%" PRIx32 "\n"
info.name, -1)); " }",
info.name, info.size, info.flags);
Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
"size", -1));
Jim_ListAppendElement(interp, tmp, Jim_NewIntObj(interp,
info.size));
Jim_ListAppendElement(interp, tmp, Jim_NewStringObj(interp,
"flags", -1));
Jim_ListAppendElement(interp, tmp, Jim_NewIntObj(interp,
info.flags));
Jim_ListAppendElement(interp, channel_list, tmp);
} }
Jim_ListAppendElement(interp, list, channel_list); command_print(CMD, "}");
Jim_SetResult(interp, list);
return JIM_OK; return ERROR_OK;
} }
static const struct command_registration rtt_subcommand_handlers[] = { static const struct command_registration rtt_subcommand_handlers[] = {
@ -284,7 +250,7 @@ static const struct command_registration rtt_subcommand_handlers[] = {
}, },
{ {
.name = "channellist", .name = "channellist",
.jim_handler = jim_channel_list, .handler = handle_channel_list,
.mode = COMMAND_EXEC, .mode = COMMAND_EXEC,
.help = "list available channels", .help = "list available channels",
.usage = "" .usage = ""