From 3c0d62da8e873b064cc2cc59a63dd34a60d96e4f Mon Sep 17 00:00:00 2001 From: Lassi Marttala Date: Mon, 23 Jan 2012 15:22:52 +0100 Subject: Suggested Changes to dlt-test-mutli-process: sender: * Print default values in usage. * Each process should have own APPID * Each thread should have own CID client: * Make usage() useful * Also count headers to bytes transferred, * Serial device mode * Baudrate as option * Output to file * Limit number of messages to receive --- src/tests/dlt-test-multi-process-client.c | 132 ++++++++++++++++++++++++++---- 1 file changed, 115 insertions(+), 17 deletions(-) (limited to 'src/tests/dlt-test-multi-process-client.c') diff --git a/src/tests/dlt-test-multi-process-client.c b/src/tests/dlt-test-multi-process-client.c index 4bb0c08..13d777c 100644 --- a/src/tests/dlt-test-multi-process-client.c +++ b/src/tests/dlt-test-multi-process-client.c @@ -61,6 +61,8 @@ #include #include #include +#include +#include // DLT Library includes #include "dlt_client.h" @@ -71,7 +73,14 @@ // Local data structures typedef struct { + int max_messages; int verbose; + int serial; + int baudrate; + char *output; + int output_handle; + int messages_left; + DltClient *client_ref; } s_parameters; typedef struct { @@ -79,6 +88,7 @@ typedef struct { int broken_messages_received; int bytes_received; int first_message_time; + int output_bytes; } s_statistics; // Forward declarations @@ -88,14 +98,30 @@ int receive(DltMessage *msg, void *data); * Print usage information */ void usage(char *name) { - printf("Usage: %s [options] \n", name); + char version[255]; + dlt_get_version(version); + + printf("Usage: %s [options] \n", name); + printf("Receive messages from dlt-test-multi-process.\n"); + printf("%s", version); + printf("Options:\n"); + printf(" -m Total messages to receive. (Default: 10000)\n"); + printf(" -y Serial device mode.\n"); + printf(" -b baudrate Serial device baudrate. (Default: 115200)\n"); + printf(" -v Verbose. Increases the verbosity level of dlt client library.\n"); + printf(" -o filename Output messages in new DLT file.\n"); } /** * Initialize reasonable default parameters. */ void init_params(s_parameters *params) { + params->max_messages = 10000; params->verbose = 0; + params->serial = 0; + params->output = NULL; + params->output_handle = -1; + params->baudrate = 115200; } /** @@ -105,16 +131,28 @@ int read_params(s_parameters *params, int argc, char *argv[]) { init_params(params); int c; opterr = 0; - while ((c = getopt(argc, argv, "v")) != -1) { + while ((c = getopt(argc, argv, "m:yb:vo:")) != -1) { switch (c) { + case 'm': + params->max_messages = atoi(optarg); + break; + case 'y': + params->serial = 1; + break; + case 'b': + params->baudrate = atoi(optarg); + break; case 'v': params->verbose = 1; break; + case 'o': + params->output = optarg; + break; case '?': - /*if(optopt == '') - { - fprintf(stderr, "Option -%c requires an argument.\n", optopt); - }*/ + if(optopt == 'm' || optopt == 'b' || optopt == 'o') + { + fprintf(stderr, "Option -%c requires an argument.\n", optopt); + } if (isprint(optopt)) { fprintf(stderr, "Unknown option '-%c'.\n", optopt); } else { @@ -132,11 +170,20 @@ int read_params(s_parameters *params, int argc, char *argv[]) { /** * Set the connection parameters for dlt client */ -int init_dlt_connect(DltClient *client, int argc, char *argv[]) { +int init_dlt_connect(DltClient *client, const s_parameters *params, int argc, char *argv[]) { char id[4]; if (argc < 2) return -1; - client->servIP = argv[argc - 1]; + if(params->serial > 0) + { + client->serial_mode = 1; + client->serialDevice = argv[argc - 1]; + dlt_client_setbaudrate(client, params->baudrate); + } + else + { + client->servIP = argv[argc - 1]; + } dlt_set_id(id, ECUID); return 0; } @@ -147,7 +194,7 @@ int init_dlt_connect(DltClient *client, int argc, char *argv[]) { int main(int argc, char *argv[]) { s_parameters params; DltClient client; - + params.client_ref = &client; int err = read_params(¶ms, argc, argv); if (err != 0) { @@ -158,7 +205,7 @@ int main(int argc, char *argv[]) { dlt_client_init(&client, params.verbose); dlt_client_register_message_callback(receive); - err = init_dlt_connect(&client, argc, argv); + err = init_dlt_connect(&client, ¶ms, argc, argv); if (err != 0) { usage(argv[0]); return err; @@ -166,20 +213,44 @@ int main(int argc, char *argv[]) { err = dlt_client_connect(&client, params.verbose); if (err != 0) { - printf("Failed to connect %s\n", client.servIP); + printf("Failed to connect %s.\n", client.serial_mode > 0 ? client.serialDevice : client.servIP); return err; } - dlt_client_main_loop(&client, NULL, params.verbose); + + if(params.output) + { + params.output_handle = open(params.output,O_WRONLY|O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + + if (params.output_handle == -1) + { + fprintf(stderr,"Failed to open %s for writing.\n",params.output); + return -1; + } + } + + params.messages_left = params.max_messages; + + dlt_client_main_loop(&client, ¶ms, params.verbose); + + if(params.output_handle > 0) + { + close(params.output_handle); + } return 0; } /** * Print current test statistics */ -void print_stats(s_statistics stats) +void print_stats(s_statistics stats, s_parameters params) { static int last_print_time; - if(last_print_time >= time(NULL)) return; // Only print once a second + if(last_print_time >= time(NULL) && // Only print once a second + (stats.messages_received+stats.broken_messages_received) % 1000 != 0 && + params.messages_left != 0) // Print also every 1000th message + { + return; + } printf("\033[2J\033[1;1H"); // Clear screen. printf("Statistics:\n"); printf(" Messages received : %d\n", stats.messages_received); @@ -189,6 +260,14 @@ void print_stats(s_statistics stats) printf(" Throughput (msgs/sec)/(B/sec) : %ld/%ld\n", stats.messages_received/((time(NULL)-stats.first_message_time)+1), (stats.bytes_received)/((time(NULL)-stats.first_message_time)+1)); + if(params.messages_left == 0) + { + if(stats.broken_messages_received == 0) + printf("All messages received succesfully!\n"); + else + printf("Test failure! There were %d broken messages.", stats.broken_messages_received); + + } fflush(stdout); last_print_time = time(NULL); } @@ -198,12 +277,17 @@ void print_stats(s_statistics stats) int receive(DltMessage *msg, void *data) { static s_statistics stats; char apid[5]; + struct iovec iov[2]; + s_parameters *params = (s_parameters *)data; + memset(apid, 0, 5); memcpy(apid, msg->extendedheader->apid, 4); - if(strcmp(apid, DMPT_NAME) != 0) // Skip other messages + if(apid[0] != 'M' || apid[1] != 'T') // TODO: Check through the app description return 0; + params->messages_left--; + if(stats.first_message_time == 0) { stats.first_message_time = time(NULL); @@ -223,10 +307,24 @@ int receive(DltMessage *msg, void *data) { { stats.broken_messages_received++; } - stats.bytes_received += buflen; + stats.bytes_received += msg->datasize+msg->headersize-sizeof(DltStorageHeader);; free(buf); - print_stats(stats); + print_stats(stats, *params); + + if (params->output_handle > 0) + { + iov[0].iov_base = msg->headerbuffer; + iov[0].iov_len = msg->headersize; + iov[1].iov_base = msg->databuffer; + iov[1].iov_len = msg->datasize; + + stats.output_bytes += writev(params->output_handle, iov, 2); + } + if(params->messages_left < 1) + { + dlt_client_cleanup(params->client_ref, params->verbose); + } return 0; } -- cgit v1.2.1