-
Notifications
You must be signed in to change notification settings - Fork 8.3k
bluetooth: shell: refactor shell print for Bluetooth-specific context #74652
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bluetooth: shell: refactor shell print for Bluetooth-specific context #74652
Conversation
1f6268c to
204e867
Compare
Thalley
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this is the right direction (but please do convince me if you believe so).
Some of the changes are welcome, but the idea of a bt_shell is IMO not.
In your commit message you mention that you want to remove the code footprint, but you also mention an increase cost of this new bt_shell. Aren't those two sentences conflicting?
The BT shell definitely needs improvement. I created a issue #70945 related to this, that requests the removed of the ctx_shell. The removal of the ctx_shell would directly conflict with the majority of this PR, as all the bt_shell functions you've defined will simply call the shell functions directly (as they would need the shell pointer again).
Could you provide some data on the codesize that you've increase/decreased?
|
@Thalley Thank you for your feedback. It's good to hear that you're addressing
At first glance, this might seem controversial.
By picking up
|
|
To stretch further, I think the functions that should be improved are Since in reality the same message printed out inside the shell is always fixed to a specific color, and if we prioritize the code size, this should make sense. Otherwise, every time, for example in Cortex-M, |
|
Just tried your PR with the BT shell test application for the With PR Without PR So while I do not agree with the direction of this PR, as we really need to get rid of I'm not at a point where I'll approve, but I'm also not going to reject this change. I'd like to get input from the other BT collaborators on this. |
|
@Thalley, thank you for the additional information. It seems we should start by getting rid of |
@Thalley Just a reminder that this stretch was merged in this PR: #75340. 👀 |
|
This pull request has been marked as stale because it has been open (more than) 60 days with no activity. Remove the stale label or add a comment saying that you would like to have the label removed otherwise this pull request will automatically be closed in 14 days. Note, that you can always re-open a closed pull request at any time. |
204e867 to
45075db
Compare
45075db to
d3dffb7
Compare
|
@Thalley I just added another commit that introduces While exploring ways to eliminate |
0bf9681 to
5243ac9
Compare
5243ac9 to
90f439f
Compare
|
Changes made as requested—hope this looks good! |
|
Excellent job and great that you updated it so fast :) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there anything really Bluetooth specific in this c-file? Wouldn't other modules benefit from having a "wall" API? Seems to me like this should just be a generic API instead of a Bluetooth specific one.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's true that this C-file isn't Bluetooth-specific, but since it's designed to address a Bluetooth-shell problem, keeping it focused on Bluetooth is fine for now. If similar needs arise elsewhere, it can be refactored into a generic API later.
🤞 Once this is merged, I'll open another PR for audio/shell, mesh/shell, and classic/shell too.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jakub-uC @carlescufi any comments on this? How easily could this generic API be accepted as part of the shell subsystem?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jakub-uC @carlescufi I'm still waiting for some response to the above question.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since the ctx_shell is only used in BT context, I think we can move forward with this PR. We can later port these to a non-BT place if there's any use for it
jhedberg
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some style comments. I'm still a bit concerned with the total silence from the shell maintainers.
subsys/bluetooth/host/shell/bt.c
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can't this be just one line?
subsys/bluetooth/host/shell/bt.c
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Merge to one line?
subsys/bluetooth/host/shell/bt.c
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems like at least the string literal should be mergeable to the first line
subsys/bluetooth/host/shell/bt.c
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same here
subsys/bluetooth/host/shell/bt.c
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One line perhaps? I'll stop pointing more of this out, but in general, please pay attention to when you're shortening a line that was previously split if there's the possibility to merge the next line into it. I realize this is some extra work since you probably did an automated search-and-replace, however if we don't do it then the code will gradually start looking quite odd.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, the way that it's formatted looks like clang-format, but where the line length is set to 80 instead of 100. Chances are that the author is using a misconfigured auto-formatter
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As far as I can recall, I used the in-tree .clang-format with some manual adjustments to align it with the previous one.
For the next push, I'll change it according to the clang-format suggestion.
Introduced `bt_shell_private.c` and `bt_shell_private.h` to provide common functions for the Bluetooth `shell_wall_print`. These functions are equivalent to `shell_fprintf`, `shell_info`, `shell_print`, `shell_warn`, `shell_error` and `shell_hexdump` but without requiring the `sh` parameter. The cost of the newly added `bt_shell_fprintf_info` ... `_error` functions will be negligible when there are many individual calls that need to pass both the `sh` and `color` parameters each time. Signed-off-by: Pisit Sawangvonganan <[email protected]>
Limit the usage of `ctx_shell` to cases where printing requires it and `sh` is not available. Signed-off-by: Pisit Sawangvonganan <[email protected]>
This change aims to eliminate the dependency on `ctx_shell` in the Bluetooth `host/shell/*`, making the code more maintainable. Replaced `shell_*` functions that depended on `ctx_shell` with the appropriate `bt_shell_*` functions. The shell-less functions `bt_do_scan_filter_clear_name`, `bt_do_scan_off`, and `bt_do_connect_le` were added so they can be called without `sh`. Signed-off-by: Pisit Sawangvonganan <[email protected]>
90f439f to
15ed4ec
Compare
jhedberg
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Approving, but there's potential cleanup still to be done in follow-up PRs (see my inline comments). Please also engage actively with the shell maintainers to make this a generic API eventually. Thanks.
| bt_shell_print("LE conn param req: int (0x%04x, 0x%04x) lat %d" | ||
| " to %d", param->interval_min, param->interval_max, | ||
| param->latency, param->timeout); | ||
|
|
||
| return true; | ||
| } | ||
|
|
||
| static void le_param_updated(struct bt_conn *conn, uint16_t interval, | ||
| uint16_t latency, uint16_t timeout) | ||
| { | ||
| shell_print(ctx_shell, "LE conn param updated: int 0x%04x lat %d " | ||
| "to %d", interval, latency, timeout); | ||
| bt_shell_print("LE conn param updated: int 0x%04x lat %d " | ||
| "to %d", interval, latency, timeout); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't mean to keep bikeshedding here, and in most cases line splitting details are really not that critical, but splitting format strings is something that should be avoided whenever possible. The reason is that splitting them makes it hard/impossible to grep the code for the location where something was outputted to the console, since what's in the console will not match any single line in the source code. I see the original code had the split already, but I'm pretty sure the string can now be merged into a single line in both of these cases.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed. If the author has setup clang-format in their IDE with only formatting changed lines using the .clang-format from Zephyr, these would have been formatted like you want.
| shell_print(ctx_shell, "Security failed: %s level %u " | ||
| "reason: %s (%d)", | ||
| addr, level, security_err_str(err), err); | ||
| bt_shell_print("Security failed: %s level %u " | ||
| "reason: %s (%d)", | ||
| addr, level, security_err_str(err), err); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same here.
| bt_shell_print("Remote LMP version %s (0x%02x) subversion 0x%04x " | ||
| "manufacturer 0x%04x", bt_hci_get_ver_str(remote_info->version), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And here.
| bt_shell_print("LE data len updated: TX (len: %d time: %d)" | ||
| " RX (len: %d time: %d)", info->tx_max_len, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And here.
|
Thank you for the approval and feedback! |

This PR aims to eliminate the dependency on
ctx_shellin the Bluetoothhost/shell/*, making the code more maintainable.bt_shell_private.candbt_shell_private.hto provide common functions for the Bluetooth shell.ctx_shellto cases where printing requires it andshis not available.(Interim commit before switch to
bt_shell_*)ctx_shellusage in the Bluetoothhost/shell/*.Fixes #41796