Initial version to dump receives messages in hex
diff --git a/src/qxdm-log.c b/src/qxdm-log.c
new file mode 100644
index 0000000..9a949ce
--- /dev/null
+++ b/src/qxdm-log.c
@@ -0,0 +1,199 @@
+#include "framing.h"
+#include "serial.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+char *DumpBYTEs(unsigned char *p, long n, int nBytesPerRow /* = 16 */, char *szLineSep /* = "\n" */, int bRaw /* = FALSE */, const char *szIndent /* = "" */)
+{
+ long i;
+ char szBuf[20];
+ static char szRes[4 * 1024];
+
+ szRes[0] = 0;
+
+ if(n == 0)
+ return szRes;
+
+ memset(szBuf, 0, sizeof(szBuf));
+ for(i = 0; i < n; i++)
+ {
+ if(i % nBytesPerRow == 0)
+ {
+ strcat(szRes, szIndent);
+ if(!bRaw)
+ sprintf(szRes + strlen(szRes), "%04d : ", i);
+ }
+
+ sprintf(szRes + strlen(szRes), "%02X ", p[i]);
+ szBuf[i % nBytesPerRow] = (char)((p[i] < 128 && p[i] >= ' ') ? p[i] : '.');
+
+ if((i + 1) % nBytesPerRow == 0)
+ {
+ if(bRaw)
+ sprintf(szRes + strlen(szRes), "%s", szLineSep);
+ else
+ sprintf(szRes + strlen(szRes), " %s%s", szBuf, szLineSep);
+ memset(szBuf, 0, sizeof(szBuf));
+ }
+ }
+
+ if(i % nBytesPerRow != 0)
+ {
+ if(bRaw)
+ sprintf(szRes + strlen(szRes), "%s", szLineSep);
+ else
+ {
+ n = nBytesPerRow - i % nBytesPerRow;
+ for(i = 0; i < n ; i++)
+ sprintf(szRes + strlen(szRes), " ");
+ sprintf(szRes + strlen(szRes), " %s%s", szBuf, szLineSep);
+ }
+ }
+
+ return szRes;
+}
+
+static int transmit_packet(int fd, const uint8_t *data, size_t data_len)
+{
+ int out_len, rc;
+ uint8_t packet[MAX_PACKET * 2];
+
+ out_len = frame_pack(data, data_len, packet, sizeof(packet));
+ if (out_len < 0) {
+ printf("Failed to pack packet\n");
+ return -1;
+ }
+
+ rc = write(fd, packet, out_len);
+ if (rc != out_len) {
+ printf("Short write on packet.\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int do_read(int fd, uint8_t *data)
+{
+ uint8_t buf[MAX_PACKET];
+ int rc;
+
+ rc = read(fd, buf, sizeof(buf));
+ if (rc <= 0 ) {
+ printf("Short read!\n");
+ exit(EXIT_FAILURE);
+ }
+
+ rc = frame_unpack(buf, rc, data);
+ if (rc > 0) {
+ printf("Got %d data of payload\n", rc);
+ printf("%s\n", DumpBYTEs(data, rc, 16, "\n", 0, ""));
+ }
+
+ return rc;
+}
+
+static void do_configure(int fd)
+{
+ static uint8_t timestamp[] = { 0x1D };
+ static uint8_t enable_logging[] = {
+ 0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+ static const uint8_t enable_evt_report[] = {
+ 0x60, 0x01
+ };
+ static const uint8_t disable_evt_report[] = {
+ 0x60, 0x00
+ };
+ static const uint8_t extended_report_cfg[] = {
+ 0x7D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00,
+ };
+
+ uint8_t data[MAX_PACKET];
+
+ /* TODO: introduce a wait for response kind of method */
+ 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);
+ transmit_packet(fd, disable_evt_report, sizeof(disable_evt_report));
+ do_read(fd, data);
+
+ transmit_packet(fd, extended_report_cfg, sizeof(extended_report_cfg));
+ do_read(fd, data);
+
+ /* enable the logging */
+ transmit_packet(fd, enable_logging, sizeof(enable_logging));
+ do_read(fd, data);
+}
+
+int main(int argc, char **argv)
+{
+ uint8_t data[MAX_PACKET];
+ int flags;
+
+ int fd, rc;
+ if (argc < 2) {
+ printf("Invoke with %s PATH_TO_SERIAL\n",
+ argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ /* Use nonblock as the device might block otherwise */
+ fd = open(argv[1], O_RDWR | O_NOCTTY | O_SYNC | O_NONBLOCK);
+ if (fd < 0) {
+ printf("Opening the serial failed: %d/%s\n",
+ errno, strerror(errno));
+ return EXIT_FAILURE;
+ }
+
+ flags = fcntl(fd, F_GETFL, 0);
+ if (flags < 0) {
+ printf("Failed to get the flags.\n");
+ return EXIT_FAILURE;
+ }
+
+ flags &= ~O_NONBLOCK;
+ rc = fcntl(fd, F_SETFL, flags);
+ if (rc != 0) {
+ printf("Failed to set the flags.\n");
+ return EXIT_FAILURE;
+ }
+
+ rc = serial_configure(fd);
+ if (rc != 0)
+ return EXIT_FAILURE;
+
+ do_configure(fd);
+
+ while (1)
+ do_read(fd, data);
+}