aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/chelper/pyhelper.c
diff options
context:
space:
mode:
Diffstat (limited to 'klippy/chelper/pyhelper.c')
-rw-r--r--klippy/chelper/pyhelper.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/klippy/chelper/pyhelper.c b/klippy/chelper/pyhelper.c
new file mode 100644
index 00000000..6fa4817f
--- /dev/null
+++ b/klippy/chelper/pyhelper.c
@@ -0,0 +1,93 @@
+// Helper functions for C / Python interface
+//
+// Copyright (C) 2016 Kevin O'Connor <kevin@koconnor.net>
+//
+// This file may be distributed under the terms of the GNU GPLv3 license.
+
+#include <errno.h> // errno
+#include <stdarg.h> // va_start
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fprintf
+#include <string.h> // strerror
+#include <time.h> // struct timespec
+#include "pyhelper.h" // get_monotonic
+
+// Return the monotonic system time as a double
+double
+get_monotonic(void)
+{
+ struct timespec ts;
+ int ret = clock_gettime(CLOCK_MONOTONIC, &ts);
+ if (ret) {
+ report_errno("clock_gettime", ret);
+ return 0.;
+ }
+ return (double)ts.tv_sec + (double)ts.tv_nsec * .000000001;
+}
+
+// Fill a 'struct timespec' with a system time stored in a double
+struct timespec
+fill_time(double time)
+{
+ time_t t = time;
+ return (struct timespec) {t, (time - t)*1000000000. };
+}
+
+static void
+default_logger(const char *msg)
+{
+ fprintf(stderr, "%s\n", msg);
+}
+
+static void (*python_logging_callback)(const char *msg) = default_logger;
+
+void
+set_python_logging_callback(void (*func)(const char *))
+{
+ python_logging_callback = func;
+}
+
+// Log an error message
+void
+errorf(const char *fmt, ...)
+{
+ char buf[512];
+ va_list args;
+ va_start(args, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ va_end(args);
+ buf[sizeof(buf)-1] = '\0';
+ python_logging_callback(buf);
+}
+
+// Report 'errno' in a message written to stderr
+void
+report_errno(char *where, int rc)
+{
+ int e = errno;
+ errorf("Got error %d in %s: (%d)%s", rc, where, e, strerror(e));
+}
+
+// Return a hex character for a given number
+#define GETHEX(x) ((x) < 10 ? '0' + (x) : 'a' + (x) - 10)
+
+// Translate a binary string into an ASCII string with escape sequences
+char *
+dump_string(char *outbuf, int outbuf_size, char *inbuf, int inbuf_size)
+{
+ char *outend = &outbuf[outbuf_size-5], *o = outbuf;
+ uint8_t *inend = (void*)&inbuf[inbuf_size], *p = (void*)inbuf;
+ while (p < inend && o < outend) {
+ uint8_t c = *p++;
+ if (c > 31 && c < 127 && c != '\\') {
+ *o++ = c;
+ continue;
+ }
+ *o++ = '\\';
+ *o++ = 'x';
+ *o++ = GETHEX(c >> 4);
+ *o++ = GETHEX(c & 0x0f);
+ }
+ *o = '\0';
+ return outbuf;
+}