rtt_server: Add option for a message when client connects
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 <tvanengelen@victronenergy.com> Reviewed-on: https://review.openocd.org/c/openocd/+/7752 Tested-by: jenkins Reviewed-by: zapb <dev@zapb.de> Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
parent
acde409ba0
commit
53e67c37ab
|
@ -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.
|
The list can be manipulated easily from within scripts.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@deffn {Command} {rtt server start} port channel
|
@deffn {Command} {rtt server start} port channel [message]
|
||||||
Start a TCP server on @var{port} for the channel @var{channel}.
|
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
|
@end deffn
|
||||||
|
|
||||||
@deffn {Command} {rtt server stop} port
|
@deffn {Command} {rtt server stop} port
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
struct rtt_service {
|
struct rtt_service {
|
||||||
unsigned int channel;
|
unsigned int channel;
|
||||||
|
char *hello_message;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int read_callback(unsigned int channel, const uint8_t *buffer,
|
static int read_callback(unsigned int channel, const uint8_t *buffer,
|
||||||
|
@ -65,6 +66,9 @@ static int rtt_new_connection(struct connection *connection)
|
||||||
if (ret != ERROR_OK)
|
if (ret != ERROR_OK)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if (service->hello_message)
|
||||||
|
connection_write(connection, service->hello_message, strlen(service->hello_message));
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,16 +121,30 @@ COMMAND_HANDLER(handle_rtt_start_command)
|
||||||
int ret;
|
int ret;
|
||||||
struct rtt_service *service;
|
struct rtt_service *service;
|
||||||
|
|
||||||
if (CMD_ARGC != 2)
|
if (CMD_ARGC < 2 || CMD_ARGC > 3)
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
|
|
||||||
service = malloc(sizeof(struct rtt_service));
|
service = calloc(1, sizeof(struct rtt_service));
|
||||||
|
|
||||||
if (!service)
|
if (!service)
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
|
|
||||||
COMMAND_PARSE_NUMBER(uint, CMD_ARGV[1], service->channel);
|
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);
|
ret = add_service(&rtt_service_driver, CMD_ARGV[0], CONNECTION_LIMIT_UNLIMITED, service);
|
||||||
|
|
||||||
if (ret != ERROR_OK) {
|
if (ret != ERROR_OK) {
|
||||||
|
@ -153,7 +171,7 @@ static const struct command_registration rtt_server_subcommand_handlers[] = {
|
||||||
.handler = handle_rtt_start_command,
|
.handler = handle_rtt_start_command,
|
||||||
.mode = COMMAND_ANY,
|
.mode = COMMAND_ANY,
|
||||||
.help = "Start a RTT server",
|
.help = "Start a RTT server",
|
||||||
.usage = "<port> <channel>"
|
.usage = "<port> <channel> [message]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "stop",
|
.name = "stop",
|
||||||
|
|
Loading…
Reference in New Issue