//
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+// Defining _POSIX_C_SOURCE macro with 199309L (or greater) as value
+// causes header files to expose definitions
+// corresponding to the POSIX.1b, Real-time extensions
+// (IEEE Std 1003.1b-1993) specification
+//
+// For this specific file, see use of clock_gettime,
+// Refer to http://pubs.opengroup.org/stage7tc1/functions/clock_gettime.html
+// and to http://man7.org/linux/man-pages/man2/clock_gettime.2.html
+#ifndef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200809L
+#endif
+
+// Platform check can be extended to check and/or define more, or could be
+// moved into a config.h
+#if !defined(__ARDUINO__) && !defined(ARDUINO)
+#define HAVE_UNISTD_H 1
+#endif
+
+// Pull in _POSIX_TIMERS feature test macro to check for
+// clock_gettime() support.
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+
+// if we have unistd.h, we're a Unix system
+#include <time.h>
+#include <sys/time.h>
+#endif
#include "logger.h"
#include "string.h"
// Convert LogLevel to platform-specific severity level. Store in PROGMEM on Arduino
#ifdef __ANDROID__
static android_LogPriority LEVEL[] = {ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL};
-#elif defined __linux__
+#elif defined(__linux__) || defined(__APPLE__)
static const char * LEVEL[] __attribute__ ((unused)) = {"DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
#elif defined ARDUINO
#include <stdarg.h>
}
void OCLogShutdown() {
-#ifdef __linux__
+#if defined(__linux__) || defined(__APPLE__)
if (logCtx && logCtx->destroy)
{
logCtx->destroy(logCtx);
OCLog(level, tag, buffer);
}
+static void osalGetTime(int *min,int *sec, int *ms)
+{
+ if (min && sec && ms)
+ {
+#if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0
+ struct timespec when = {};
+ clockid_t clk = CLOCK_REALTIME;
+#ifdef CLOCK_REALTIME_COARSE
+ clk = CLOCK_REALTIME_COARSE;
+#endif
+ if (!clock_gettime(clk, &when))
+ {
+ *min = (when.tv_sec / 60) % 60;
+ *sec = when.tv_sec % 60;
+ *ms = when.tv_nsec / 1000000;
+ }
+#else
+ struct timeval now;
+ if (!gettimeofday(&now, NULL))
+ {
+ *min = (now.tv_sec / 60) % 60;
+ *sec = now.tv_sec % 60;
+ *ms = now.tv_usec * 1000;
+ }
+#endif
+ }
+}
+
/**
* Output a log string with the specified priority level.
* Only defined for Linux and Android
return;
}
- #ifdef __ANDROID__
- __android_log_write(LEVEL[level], tag, logStr);
- #elif defined __linux__
- if (logCtx && logCtx->write_level)
- {
- logCtx->write_level(logCtx, LEVEL_XTABLE[level], logStr);
+#ifdef __ANDROID__
+ __android_log_write(LEVEL[level], tag, logStr);
+#elif defined(__linux__) || defined(__APPLE__)
+ if (logCtx && logCtx->write_level)
+ {
+ logCtx->write_level(logCtx, LEVEL_XTABLE[level], logStr);
+ }
+ else
+ {
- }
- else
- {
- printf("%s: %s: %s\n", LEVEL[level], tag, logStr);
- }
- #endif
+ int min = 0;
+ int sec = 0;
+ int ms = 0;
+ osalGetTime(&min,&sec,&ms);
+
+ printf("%02d:%02d.%03d %s: %s: %s\n", min, sec, ms, LEVEL[level], tag, logStr);
+ }
+#endif
}
/**
#endif
+