/* depend: */
/* cflags: */
-/* linker: morep.o parse.o raw_data.o */
-/* winlnk: morep.o parse.o raw_data.o */
+/* linker: morep.o parse.o payload.o raw_data.o */
+/* winlnk: morep.o parse.o payload.o raw_data.o */
#include <errno.h>
#include <signal.h>
#include "morep.h"
#include "parse.h"
-#include "raw_data.h"
#include "verbose.h"
+#include "payload.h"
+#include "raw_data.h"
+
char *progname = NULL;
int stop = 0;
DECLARE_VERBOSE_LEVEL (morep, INFO);
+#define MODERAW
+
#define BUFMAX 4096
void sig_handler (int sig)
/* get values */
char *tmp = line + offset;
+ uint8_t msgtype;
+#ifdef MODERAW
+ PAYLOAD_t payload= {0};
+ if (parse_payload (tmp, &payload) != 0) {
+ VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s'\n", line));
+ continue;
+ }
+ msgtype = payload.msgtype;
+#else /* ! MODERAW */
TEST_CHARS (tmp, " \t", 0);
if (strncmp (tmp, "MSG", 3) != 0) {
VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s' (%s)\n", line, tmp));
}
tmp += 3;
TEST_CHARS (tmp, " \t=", 0);
- uint8_t msgtype = strtol (tmp, &tmp, 0);
+ msgtype = strtol (tmp, &tmp, 0);
if ((*tmp != ' ') && (*tmp != '\t')) {
VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s'\n", line));
continue;
VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s'\n", line));
continue;
}
+#endif /* MODERAW */
VERBOSE (morep, TRACE, PRINTF ("payload length: %d\n", payload.data_len));
/* transmit */
}
}
if (log) {
+#ifdef MODERAW
+ char buffer[64 + sizeof (payload.data)] = {0};
+ PAYLOAD_t _rxpayload;
+ _rxpayload.msgtype = rxmsgtype;
+ _rxpayload.data_len = rxlen;
+ memcpy (_rxpayload.data, rxpayload, rxlen);
+ format_payload (&_rxpayload, buffer, sizeof (buffer));
+ fprintf (log, "R%s %s\n", comm->etype, buffer);
+#else /* ! MODERAW */
print_message (log, comm->etype, 0, rxmsgtype, seqnum, rxpayload, rxlen);
+#endif /* MODERAW */
}
}
}
@param line string to be parsed
*/
-#define BEGIN_PARSE(line) \
-{ \
- int rc = 0; \
- char *pt = line; \
- while (1) { \
- /* find variable */ \
- TEST_CHARS (pt, " \t", 0); \
- char *var = pt; \
- TEST_CHARS (pt, " \t=", 1); \
- if (*var == '\0') { \
- break; \
- } \
- *pt++ = '\0'; \
+#define BEGIN_PARSE(line) \
+{ \
+ int rc = 0; \
+ char *pt = line; \
+ while (1) { \
+ /* find variable */ \
+ TEST_CHARS (pt, " \t", 0); \
+ char *var = pt; \
+ TEST_CHARS (pt, " \t=", 1); \
+ if (*var == '\0') { \
+ break; \
+ } \
+ *pt++ = '\0'; \
VERBOSE (morep, TRACE, PRINTF ("var: %s\n", var)); \
- TEST_CHARS (pt, " \t=", 0); \
- /* find value */ \
- char *val = pt; \
- while (*pt != '\0') { \
- if ((*pt == ' ') && (*(pt - 1) != '\\')) { \
- break; \
- } \
- pt++; \
- } \
+ TEST_CHARS (pt, " \t=", 0); \
+ /* find value */ \
+ char *val = pt; \
+ while (*pt != '\0') { \
+ if ((*pt == ' ') && (*(pt - 1) != '\\')) { \
+ break; \
+ } \
+ pt++; \
+ } \
VERBOSE (morep, TRACE, PRINTF ("val: %s\n", val)); \
- if (*val == '\0') { \
- rc = 1; \
- break; \
+ if (*val == '\0') { \
+ rc = 1; \
+ break; \
}
/**
@param name field name
@param buf preallocated storage
*/
-#define PARSE(name, buf) \
- else if (strcmp (var, name) == 0) { \
- _Generic ((buf), \
- uint8_t: buf = parse_int (val), \
- int8_t: buf = parse_int (val), \
- uint16_t: buf = parse_int (val), \
- int16_t: buf = parse_int (val), \
- uint32_t: buf = parse_int (val), \
- float: buf = parse_double (val), \
- double: buf = parse_double (val))i; \
+#define PARSE(name, buf) \
+ else if (strcmp (var, name) == 0) { \
+ _Generic ((buf), \
+ uint8_t: buf = parse_int (val), \
+ int8_t: buf = parse_int (val), \
+ uint16_t: buf = parse_int (val), \
+ int16_t: buf = parse_int (val), \
+ uint32_t: buf = parse_int (val), \
+ int32_t: buf = parse_int (val), \
+ float: buf = parse_double (val), \
+ double: buf = parse_double (val)); \
}
-#define PARSEA(name, buf) \
- else if (strcmp (var, name) == 0) { \
+#define PARSEA(name, buf) \
+ else if (strcmp (var, name) == 0) { \
buf##_len = parse_array (val, buf, sizeof (buf)); \
}
@param name field name
@param field data from structure
*/
-#define FORMAT(name, field) \
- _Generic (typeof (field), \
- uint8_t: len += snprintf (_buffer, _maxlen - len, "%d", field), \
- int8_t: len += snprintf (_buffer, _maxlen - len, "%d", field), \
- uint16_t: len += snprintf (_buffer, _maxlen - len, "%d", field), \
- int16_t: len += snprintf (_buffer, _maxlen - len, "%d", field), \
- uint8_t: len += snprintf (_buffer, _maxlen - len, "%d", field)); \
- if (len == _maxlen) { \
- VERBOSE (morep, WARNING, PRINTF ("field '%s' too large\n", #field)); \
+#define FORMAT(name, field) \
+ _Generic (field, \
+ uint8_t: len += snprintf (_buffer, _maxlen - len, "%d", field), \
+ int8_t: len += snprintf (_buffer, _maxlen - len, "%d", field), \
+ uint16_t: len += snprintf (_buffer, _maxlen - len, "%d", field), \
+ int16_t: len += snprintf (_buffer, _maxlen - len, "%d", field), \
+ uint32_t: len += snprintf (_buffer, _maxlen - len, "%d", field), \
+ int32_t: len += snprintf (_buffer, _maxlen - len, "%d", field), \
+ float: len += snprintf (_buffer, _maxlen - len, "%g", field), \
+ double: len += snprintf (_buffer, _maxlen - len, "%g", field)); \
+ if (len == _maxlen) { \
+ VERBOSE (morep, WARNING, PRINTF ("field '%s' too large\n", #field)); \
}
#define FORMATA(name, field) \