ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VP_SDK / VP_Os / win32 / vp_os_signal.c
diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VP_SDK/VP_Os/win32/vp_os_signal.c b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VP_SDK/VP_Os/win32/vp_os_signal.c
new file mode 100644 (file)
index 0000000..8568783
--- /dev/null
@@ -0,0 +1,145 @@
+/**
+ * @file signal.c
+ * @author aurelien.morelle@parrot.fr
+ * @date 2006/12/15
+ */
+
+#include "VP_Os/vp_os_signal.h"
+
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+       #elif defined USE_PTHREAD_FOR_WIN32
+       #else
+       #endif
+
+void
+vp_os_mutex_init(vp_os_mutex_t *mutex)
+{
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+               InitializeCriticalSection((CRITICAL_SECTION *)mutex);
+       #elif defined USE_PTHREAD_FOR_WIN32
+               pthread_mutex_init((pthread_mutex_t *)mutex, NULL);
+       #else
+       #endif  
+}
+
+
+void
+vp_os_mutex_destroy(vp_os_mutex_t *mutex)
+{
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+               DeleteCriticalSection((CRITICAL_SECTION *)mutex);
+       #elif defined USE_PTHREAD_FOR_WIN32
+               pthread_mutex_destroy((pthread_mutex_t *)mutex);
+       #else
+       #endif 
+}
+
+
+void
+vp_os_mutex_lock(vp_os_mutex_t *mutex)
+{
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+               EnterCriticalSection((CRITICAL_SECTION *)mutex);
+       #elif defined USE_PTHREAD_FOR_WIN32
+               pthread_mutex_lock((pthread_mutex_t *)mutex);
+       #else
+       #endif  
+}
+
+
+void
+vp_os_mutex_unlock(vp_os_mutex_t *mutex)
+{
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+               LeaveCriticalSection((CRITICAL_SECTION *)mutex);
+       #elif defined USE_PTHREAD_FOR_WIN32
+               pthread_mutex_unlock((pthread_mutex_t *)mutex);
+       #else
+       #endif
+       
+}
+
+
+void
+vp_os_cond_init(vp_os_cond_t *cond, vp_os_mutex_t *mutex)
+{
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+               InitializeConditionVariable(&cond->cond);
+               cond->mutex = mutex;
+       #elif defined USE_PTHREAD_FOR_WIN32
+                 pthread_cond_init(&cond->cond, NULL);
+                 cond->mutex = mutex;
+       #else
+               /**/
+       #endif
+}
+
+
+void
+vp_os_cond_destroy(vp_os_cond_t *cond)
+{
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+               /**/
+       #elif defined USE_PTHREAD_FOR_WIN32
+                pthread_cond_destroy(&cond->cond);
+       #else
+               /**/
+       #endif
+       
+}
+
+
+void
+vp_os_cond_wait(vp_os_cond_t *cond)
+{
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+               SleepConditionVariableCS(&cond->cond, (CRITICAL_SECTION *)cond->mutex, INFINITE);
+       #elif defined USE_PTHREAD_FOR_WIN32
+               pthread_cond_wait(&cond->cond, (pthread_mutex_t *)cond->mutex);
+       #else
+               WaitForSingleObject(cond->LockSemaphore,INFINITE); // TODO: to test
+       #endif
+}
+
+
+int gettimeofday(struct timeval *tv, struct timezone *tz); 
+
+C_RESULT
+vp_os_cond_timed_wait(vp_os_cond_t *cond, uint32_t ms)
+{
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+               return  SleepConditionVariableCS(&cond->cond, (CRITICAL_SECTION *)cond->mutex, ms) == WAIT_TIMEOUT ? VP_FAILURE : VP_SUCCESS;
+       #elif defined USE_PTHREAD_FOR_WIN32
+                 struct timespec ts;
+                 struct timeval tv;
+                 gettimeofday(&tv, NULL);
+                 ts.tv_sec = tv.tv_sec + ms/1000;
+                 ts.tv_nsec = (tv.tv_usec + (ms%1000))*1000;
+                 return ( pthread_cond_timedwait(&cond->cond, (pthread_mutex_t *)cond->mutex, &ts) == ETIMEDOUT ? VP_FAILURE : VP_SUCCESS );
+       #else
+               return WaitForSingleObject(cond->LockSemaphore, ms) == WAIT_TIMEOUT ? VP_FAILURE : VP_SUCCESS; // TODO: to test
+       #endif
+}
+
+void
+vp_os_cond_signal(vp_os_cond_t *cond)
+{
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+               WakeConditionVariable(&cond->cond);
+       #elif defined USE_PTHREAD_FOR_WIN32
+               pthread_cond_signal(&cond->cond);
+       #endif
+}
+
+
+void
+vp_os_cond_broadcast(vp_os_cond_t *cond)
+{
+       #if defined USE_WINDOWS_CONDITION_VARIABLES
+               /**/
+       #elif defined USE_PTHREAD_FOR_WIN32
+               pthread_cond_broadcast(&cond->cond);
+       #endif
+       
+}
+