Skip to content

Commit

Permalink
rtt_server: Add option for a message when client connects
Browse files Browse the repository at this point in the history
This is useful when using the SEGGER RTT tooling, as the SEGGER RTT
tool J-Link RTT Viewer version 7.84f requires that it receives a
messages immediately after connecting. Otherwise it will give a timeout
and it will not connect.

Change-Id: I9240a1b6a93cd5c0fbd18292afb33b89013d78bf
Signed-off-by: Thiemo van Engelen <[email protected]>
Reviewed-on: https://review.openocd.org/c/openocd/+/7752
Tested-by: jenkins
Reviewed-by: zapb <[email protected]>
Reviewed-by: Antonio Borneo <[email protected]>
  • Loading branch information
ThiemoVanEngelen authored and borneoa committed Nov 24, 2023
1 parent acde409 commit 53e67c3
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 5 deletions.
5 changes: 3 additions & 2 deletions doc/openocd.texi
Original file line number Diff line number Diff line change
Expand Up @@ -9448,8 +9448,9 @@ Return a list of all channels and their properties as Tcl list.
The list can be manipulated easily from within scripts.
@end deffn

@deffn {Command} {rtt server start} port channel
Start a TCP server on @var{port} for the channel @var{channel}.
@deffn {Command} {rtt server start} port channel [message]
Start a TCP server on @var{port} for the channel @var{channel}. When
@var{message} is not empty, it will be sent to a client when it connects.
@end deffn

@deffn {Command} {rtt server stop} port
Expand Down
24 changes: 21 additions & 3 deletions src/server/rtt_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

struct rtt_service {
unsigned int channel;
char *hello_message;
};

static int read_callback(unsigned int channel, const uint8_t *buffer,
Expand Down Expand Up @@ -65,6 +66,9 @@ static int rtt_new_connection(struct connection *connection)
if (ret != ERROR_OK)
return ret;

if (service->hello_message)
connection_write(connection, service->hello_message, strlen(service->hello_message));

return ERROR_OK;
}

Expand Down Expand Up @@ -117,16 +121,30 @@ COMMAND_HANDLER(handle_rtt_start_command)
int ret;
struct rtt_service *service;

if (CMD_ARGC != 2)
if (CMD_ARGC < 2 || CMD_ARGC > 3)
return ERROR_COMMAND_SYNTAX_ERROR;

service = malloc(sizeof(struct rtt_service));
service = calloc(1, sizeof(struct rtt_service));

if (!service)
return ERROR_FAIL;

COMMAND_PARSE_NUMBER(uint, CMD_ARGV[1], service->channel);

if (CMD_ARGC >= 3) {
const char *hello_message = CMD_ARGV[2];
size_t hello_length = strlen(hello_message);

service->hello_message = malloc(hello_length + 2);
if (!service->hello_message) {
LOG_ERROR("Out of memory");
free(service);
return ERROR_FAIL;
}
strcpy(service->hello_message, hello_message);
service->hello_message[hello_length] = '\n';
service->hello_message[hello_length + 1] = '\0';
}
ret = add_service(&rtt_service_driver, CMD_ARGV[0], CONNECTION_LIMIT_UNLIMITED, service);

if (ret != ERROR_OK) {
Expand All @@ -153,7 +171,7 @@ static const struct command_registration rtt_server_subcommand_handlers[] = {
.handler = handle_rtt_start_command,
.mode = COMMAND_ANY,
.help = "Start a RTT server",
.usage = "<port> <channel>"
.usage = "<port> <channel> [message]"
},
{
.name = "stop",
Expand Down

0 comments on commit 53e67c3

Please sign in to comment.