Browse Source

updated software-watchdog to also work on Windows, however, only with sleep times being a multiple of 1ms

thomas 4 years ago
parent
commit
cff198edc0
8 changed files with 1732 additions and 26 deletions
  1. 8 2
      include/software_watchdog.h
  2. 1605 0
      include/winpthreads.h
  3. 4 2
      src/CMakeLists.txt
  4. 76 2
      src/software_watchdog.c
  5. 39 17
      tests/CMakeLists.txt
  6. 0 1
      tests/test1.c
  7. 0 1
      tests/test2.c
  8. 0 1
      tests/test3.c

+ 8 - 2
include/software_watchdog.h

@@ -2,8 +2,14 @@
 #define SOFTWAREWATCHDOG_H
 #include <time.h>
 #include <stdbool.h>
-#include <pthread.h>
-
+#ifdef _WIN32
+    #include <windows.h>
+    #include <winpthreads.h>
+    #define sleep(...) (Sleep(1000.0*__VA_ARGS__))
+#else
+    #include <pthread.h>
+    #include <unistd.h>
+#endif
 // Software WatchDog (swd)
 
 void printHelloWorld();

File diff suppressed because it is too large
+ 1605 - 0
include/winpthreads.h


+ 4 - 2
src/CMakeLists.txt

@@ -8,5 +8,7 @@ set(SOFTWAREWATCHDOG_SOURCE_FILES
     software_watchdog.c )
 add_library (software-watchdog ${SOFTWAREWATCHDOG_SOURCE_FILES})
 target_include_directories (software-watchdog PUBLIC ../include)
-target_link_libraries(software-watchdog PUBLIC
-    rt)
+if(UNIX)
+    target_link_libraries(software-watchdog PUBLIC
+        rt)
+endif(UNIX)

+ 76 - 2
src/software_watchdog.c

@@ -5,10 +5,84 @@
 #include <time.h>
 #include <signal.h>
 #include <stdlib.h>
-#include <pthread.h>
-#include <unistd.h>
 #include <stdbool.h>
 #include "software_watchdog.h"
+#ifdef _WIN32
+    #define CLOCK_REALTIME 0
+    #define NOMINMAX
+    #define WIN32_LEAN_AND_MEAN
+    #include <windows.h>
+
+    int nanosleep(const struct timespec* req, struct timespec* rem) {
+        double ms;
+        ms = req->tv_sec * 1000.0 + req->tv_nsec / 1000000;
+        Sleep(ms);
+        return 0;
+    }
+
+    LARGE_INTEGER
+    getFILETIMEoffset()
+    {
+        SYSTEMTIME s;
+        FILETIME f;
+        LARGE_INTEGER t;
+
+        s.wYear = 1970;
+        s.wMonth = 1;
+        s.wDay = 1;
+        s.wHour = 0;
+        s.wMinute = 0;
+        s.wSecond = 0;
+        s.wMilliseconds = 0;
+        SystemTimeToFileTime(&s, &f);
+        t.QuadPart = f.dwHighDateTime;
+        t.QuadPart <<= 32;
+        t.QuadPart |= f.dwLowDateTime;
+        return (t);
+    }
+
+    int
+    clock_gettime(int X, struct timeval *tv)
+    {
+        LARGE_INTEGER           t;
+        FILETIME            f;
+        double                  microseconds;
+        static LARGE_INTEGER    offset;
+        static double           frequencyToMicroseconds;
+        static int              initialized = 0;
+        static BOOL             usePerformanceCounter = 0;
+
+        if (!initialized) {
+            LARGE_INTEGER performanceFrequency;
+            initialized = 1;
+            usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency);
+            if (usePerformanceCounter) {
+                QueryPerformanceCounter(&offset);
+                frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
+            } else {
+                offset = getFILETIMEoffset();
+                frequencyToMicroseconds = 10.;
+            }
+        }
+        if (usePerformanceCounter) QueryPerformanceCounter(&t);
+        else {
+            GetSystemTimeAsFileTime(&f);
+            t.QuadPart = f.dwHighDateTime;
+            t.QuadPart <<= 32;
+            t.QuadPart |= f.dwLowDateTime;
+        }
+
+        t.QuadPart -= offset.QuadPart;
+        microseconds = (double)t.QuadPart / frequencyToMicroseconds;
+        t.QuadPart = microseconds;
+        tv->tv_sec = t.QuadPart / 1000000;
+        tv->tv_usec = t.QuadPart % 1000000;
+        return (0);
+    }
+#else
+    #include <pthread.h>
+    #include <unistd.h>
+#endif
 
 #define CLOCKID CLOCK_REALTIME
 #define SIG SIGRTMIN

+ 39 - 17
tests/CMakeLists.txt

@@ -7,20 +7,42 @@ MESSAGE("Building software-watchdog test applications")
 
 include_directories(${SOFTWAREWATCHDOG_INCLUDE_DIRECTORY})
 
-add_executable(test1 test1.c)
-target_link_libraries(test1 LINK_PUBLIC 
-    software-watchdog
-    pthread)
-add_test(NAME test1 COMMAND test1)
-
-add_executable(test2 test2.c)
-target_link_libraries(test2 LINK_PUBLIC 
-    software-watchdog
-    pthread)
-add_test(NAME test2 COMMAND test2)
-
-add_executable(test3 test3.c)
-target_link_libraries(test3 LINK_PUBLIC 
-    software-watchdog
-    pthread)
-add_test(NAME test3 COMMAND test3)
+if(UNIX)
+    add_executable(test1 test1.c)
+    target_link_libraries(test1 LINK_PUBLIC 
+        software-watchdog
+        pthread)
+    add_test(NAME test1 COMMAND test1)
+
+    add_executable(test2 test2.c)
+    target_link_libraries(test2 LINK_PUBLIC 
+        software-watchdog
+        pthread)
+    add_test(NAME test2 COMMAND test2)
+
+    add_executable(test3 test3.c)
+    target_link_libraries(test3 LINK_PUBLIC 
+        software-watchdog
+        pthread)
+    add_test(NAME test3 COMMAND test3)
+endif(UNIX)
+
+if(WIN32)
+    add_executable(test1 test1.c)
+    target_link_libraries(test1 LINK_PUBLIC 
+        software-watchdog
+        )
+    add_test(NAME test1 COMMAND test1)
+
+    add_executable(test2 test2.c)
+    target_link_libraries(test2 LINK_PUBLIC 
+        software-watchdog
+        )
+    add_test(NAME test2 COMMAND test2)
+
+    add_executable(test3 test3.c)
+    target_link_libraries(test3 LINK_PUBLIC 
+        software-watchdog
+        )
+    add_test(NAME test3 COMMAND test3)
+endif(WIN32)

+ 0 - 1
tests/test1.c

@@ -1,5 +1,4 @@
 #include <stdio.h>
-#include <unistd.h>
 #include <software_watchdog.h>
 
 // in this test it is expected that the watchdog_timeout_cb is called

+ 0 - 1
tests/test2.c

@@ -1,5 +1,4 @@
 #include <stdio.h>
-#include <unistd.h>
 #include <software_watchdog.h>
 
 // in this test it is expected that the watchdog_timeout_cb not called

+ 0 - 1
tests/test3.c

@@ -1,5 +1,4 @@
 #include <stdio.h>
-#include <unistd.h>
 #include <software_watchdog.h>
 
 // in this test it is expected that the watchdog_timeout_cb1 is called, but not watchdog_timeout_cb2