]> sigrok.org Git - libserialport.git/blobdiff - libserialport_internal.h
windows: Use a fixed worst-case WRITEFILE_MAX_SIZE.
[libserialport.git] / libserialport_internal.h
index 0ad6f701a05a631e7d22daefa4e1f1c1caa6c215..49f36d77b9d256713fba90ddf28c3f06d7df45f5 100644 (file)
@@ -39,6 +39,8 @@
 #include <errno.h>
 #include <stdio.h>
 #include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
 #ifdef _WIN32
 #include <windows.h>
 #include <tchar.h>
        static const GUID name = { l,w1,w2,{ b1,b2,b3,b4,b5,b6,b7,b8 } }
 #include <usbioctl.h>
 #include <usbiodef.h>
-#include "windows_ddk.h"
+/* The largest size that can be passed to WriteFile() safely
+ * on any architecture. This arises from the expression:
+ * PAGE_SIZE * (65535 - sizeof(MDL)) / sizeof(ULONG_PTR)
+ * and this worst-case value is found on x64. */
+#define WRITEFILE_MAX_SIZE 33525760
 #else
 #include <limits.h>
 #include <termios.h>
@@ -68,8 +74,9 @@
 #endif
 #ifdef __linux__
 #include <dirent.h>
-#ifndef __ANDROID__
-#include "linux/serial.h"
+/* Android only has linux/serial.h from platform 21 onwards. */
+#if !(defined(__ANDROID__) && (__ANDROID_API__ < 21))
+#include <linux/serial.h>
 #endif
 #include "linux_termios.h"
 
@@ -248,4 +255,35 @@ SP_PRIV struct sp_port **list_append(struct sp_port **list, const char *portname
 SP_PRIV enum sp_return get_port_details(struct sp_port *port);
 SP_PRIV enum sp_return list_ports(struct sp_port ***list);
 
+/* Timing abstraction */
+
+struct time {
+#ifdef _WIN32
+       int64_t ticks;
+#else
+       struct timeval tv;
+#endif
+};
+
+struct timeout {
+       unsigned int ms, limit_ms;
+       struct time start, now, end, delta, delta_max;
+       struct timeval delta_tv;
+       bool calls_started, overflow;
+};
+
+SP_PRIV void time_get(struct time *time);
+SP_PRIV void time_set_ms(struct time *time, unsigned int ms);
+SP_PRIV void time_add(const struct time *a, const struct time *b, struct time *result);
+SP_PRIV void time_sub(const struct time *a, const struct time *b, struct time *result);
+SP_PRIV bool time_greater(const struct time *a, const struct time *b);
+SP_PRIV void time_as_timeval(const struct time *time, struct timeval *tv);
+SP_PRIV unsigned int time_as_ms(const struct time *time);
+SP_PRIV void timeout_start(struct timeout *timeout, unsigned int timeout_ms);
+SP_PRIV void timeout_limit(struct timeout *timeout, unsigned int limit_ms);
+SP_PRIV bool timeout_check(struct timeout *timeout);
+SP_PRIV void timeout_update(struct timeout *timeout);
+SP_PRIV struct timeval *timeout_timeval(struct timeout *timeout);
+SP_PRIV unsigned int timeout_remaining_ms(struct timeout *timeout);
+
 #endif