diff --git a/server/src/msg.c b/server/src/msg.c index 0552b5d74..f29836511 100644 --- a/server/src/msg.c +++ b/server/src/msg.c @@ -7,6 +7,7 @@ #include #include #include +#include #ifdef __linux__ #include @@ -33,10 +34,10 @@ int msg_fprint(FILE *f, struct msg *m) if (m->endian != MSG_ENDIAN_HOST) msg_swap(m); - fprintf(f, "%-8hu", m->sequence); + fprintf(f, "%hu", m->sequence); for (int i = 0; i < m->length; i++) - fprintf(f, "%-12.6f ", m->data[i].f); + fprintf(f, "\t%.6f", m->data[i].f); fprintf(f, "\n"); @@ -45,16 +46,28 @@ int msg_fprint(FILE *f, struct msg *m) int msg_fscan(FILE *f, struct msg *m) { - fscanf(f, "%8hu ", &m->sequence); + char line[MSG_VALUES * 16]; + char *ptr = line; - for (int i = 0; i < m->length; i++) - fscanf(f, "%12f ", &m->data[i].f); + if (!fgets(line, sizeof(line), f)) + return 0; - fscanf(f, "\n"); + m->sequence = (uint16_t) strtol(ptr, &ptr, 10); + int i; + for (i = 0; i <= MSG_VALUES; i++) { + while(isblank(*ptr++)); + if (*ptr == '\n' || *ptr == '\0') + break; + + m->data[i].f = strtod(ptr, &ptr); + info("read value %u => %f", i, m->data[i].f); + } + + m->length = i; m->endian = MSG_ENDIAN_HOST; - - return 0; + + return m->length; } void msg_random(struct msg *m) diff --git a/server/src/send.c b/server/src/send.c index 1c909bc56..d4b1a12b7 100644 --- a/server/src/send.c +++ b/server/src/send.c @@ -31,18 +31,17 @@ void quit(int sig, siginfo_t *si, void *ptr) int main(int argc, char *argv[]) { - if (argc != 3 && argc != 4) { - printf("Usage: %s VALUES REMOTE [LOCAL]\n", argv[0]); + if (argc != 2 && argc != 3) { + printf("Usage: %s REMOTE [LOCAL]\n", argv[0]); printf(" REMOTE is a IP:PORT combination of the remote host\n"); printf(" LOCAL is an optional IP:PORT combination of the local host\n"); - printf(" VALUES is the number of values to be read from stdin\n\n"); printf("Simulator2Simulator Server %s (built on %s %s)\n", BLU(VERSION), MAG(__DATE__), MAG(__TIME__)); printf("Copyright 2014, Institute for Automation of Complex Power Systems, EONERC\n"); exit(EXIT_FAILURE); } struct node n = NODE_INIT("remote"); - struct msg m = MSG_INIT(atoi(argv[1])); + struct msg m = MSG_INIT(0); /* Setup signals */ struct sigaction sa_quit = { @@ -55,11 +54,11 @@ int main(int argc, char *argv[]) sigaction(SIGINT, &sa_quit, NULL); /* Resolve addresses */ - if (resolve_addr(argv[2], &n.remote, 0)) - error("Failed to resolve remote address: %s", argv[2]); + if (resolve_addr(argv[1], &n.remote, 0)) + error("Failed to resolve remote address: %s", argv[1]); - if (argc == 4 && resolve_addr(argv[3], &n.local, 0)) - error("Failed to resolve local address: %s", argv[3]); + if (argc == 3 && resolve_addr(argv[2], &n.local, 0)) + error("Failed to resolve local address: %s", argv[2]); else { n.local.sin_family = AF_INET; n.local.sin_addr.s_addr = INADDR_ANY; @@ -71,15 +70,15 @@ int main(int argc, char *argv[]) while (!feof(stdin)) { msg_fscan(stdin, &m); - msg_send(&m, &n); -#if 1 +#if 1 /* Preprend timestamp */ struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); - fprintf(stdout, "%17.6f", ts.tv_sec + ts.tv_nsec / 1e9); + fprintf(stdout, "%17.3f\t", ts.tv_sec + ts.tv_nsec / 1e9); #endif msg_fprint(stdout, &m); + msg_send(&m, &n); } return 0;