Parse the log message and print the result to the console
diff --git a/src/qxdm-log.c b/src/qxdm-log.c
index 9a949ce..71d046d 100644
--- a/src/qxdm-log.c
+++ b/src/qxdm-log.c
@@ -1,9 +1,12 @@
#include "framing.h"
+#include "protocol.h"
#include "serial.h"
#include <stdlib.h>
+#include <stddef.h>
#include <stdio.h>
#include <string.h>
+#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -80,6 +83,65 @@
return 0;
}
+static int dump_log(const uint8_t *data, const size_t len)
+{
+ size_t i, file_len;
+ size_t params = 0;
+ const struct ext_log_msg *msg;
+ const char *file = NULL, *log;
+ struct tm *tm;
+ time_t now;
+ const size_t str_len = len - offsetof(struct ext_log_msg, data);
+
+ time(&now);
+ tm = localtime(&now);
+
+ if (len < sizeof(struct ext_log_msg)) {
+ printf("too short log message.\n");
+ return -1;
+ }
+
+ msg = (struct ext_log_msg *) data;
+ log = (const char *) msg->data;
+
+ /*
+ * Check if it is null terminated and how many parameters it
+ * might have. This counts all '%' but doesn't take '%%' into
+ * account.
+ */
+ for (i = 0; i < str_len; ++i) {
+ if (log[i] == '%')
+ params += 1;
+ else if (log[i] == '\0' && i + 1 < str_len) {
+ file = &log[i + 1];
+ file_len = str_len - i - 1;
+ break;
+ }
+ }
+
+ if (file_len == 0 || file[file_len - 1] != '\0') {
+ printf("File too short or not null terminated\n");
+ return -2;
+ }
+
+ if (params > 3) {
+ printf("Too many parameters in the log message.\n");
+ return -1;
+ }
+
+ if (!file) {
+ printf("The file is not present..\n");
+ return -2;
+ }
+
+ printf("%d:%d:%d %-20s: ",
+ tm->tm_hour, tm->tm_min, tm->tm_sec,
+ file);
+ printf(log, msg->params[0], msg->params[1], msg->params[2]);
+ printf("\n");
+ return 0;
+}
+
static int do_read(int fd, uint8_t *data)
{
uint8_t buf[MAX_PACKET];
@@ -92,10 +154,19 @@
}
rc = frame_unpack(buf, rc, data);
- if (rc > 0) {
+ if (rc <= 0)
+ return 0;
+
+
+ switch (data[0]) {
+ case 0x79:
+ dump_log(data, rc);
+ break;
+ default:
printf("Got %d data of payload\n", rc);
printf("%s\n", DumpBYTEs(data, rc, 16, "\n", 0, ""));
- }
+ break;
+ };
return rc;
}
@@ -124,9 +195,11 @@
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00
};
+#if 0
static const uint8_t enable_evt_report[] = {
0x60, 0x01
};
+#endif
static const uint8_t disable_evt_report[] = {
0x60, 0x00
};
@@ -141,9 +214,11 @@
transmit_packet(fd, timestamp, sizeof(timestamp));
do_read(fd, data);
- /* enable the event report */
-// transmit_packet(fd, enable_evt_report, sizeof(enable_evt_report));
-// do_read(fd, data);
+ /* enable|disable the event report */
+#if 0
+ transmit_packet(fd, enable_evt_report, sizeof(enable_evt_report));
+ do_read(fd, data);
+#endif
transmit_packet(fd, disable_evt_report, sizeof(disable_evt_report));
do_read(fd, data);