aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2021-09-13 14:31:52 +0200
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2021-09-13 14:31:52 +0200
commita9f4c90c79c842efd0f57ccfd5160958566a4239 (patch)
treefc877be78e2aa416980eda3abe5c076d900784d6
parent6ca58dd64e470b08404464c552dcab3f378c1d0e (diff)
sys: Add Windows Bluetooth APIs.
-rw-r--r--core/sys/windows/bluetooth.odin104
-rw-r--r--core/sys/windows/types.odin12
2 files changed, 116 insertions, 0 deletions
diff --git a/core/sys/windows/bluetooth.odin b/core/sys/windows/bluetooth.odin
new file mode 100644
index 000000000..c9f6bcc93
--- /dev/null
+++ b/core/sys/windows/bluetooth.odin
@@ -0,0 +1,104 @@
+// +build windows
+package sys_windows
+
+foreign import "system:bthprops.lib"
+
+HBLUETOOTH_DEVICE_FIND :: distinct HANDLE
+HBLUETOOTH_RADIO_FIND :: distinct HANDLE
+
+BLUETOOTH_FIND_RADIO_PARAMS :: struct {
+ dw_size: DWORD,
+}
+
+BLUETOOTH_RADIO_INFO :: struct {
+ dw_size: DWORD, // Size of this structure
+ address: BLUETOOTH_ADDRESS, // Address of radio
+ name: [BLUETOOTH_MAX_NAME_SIZE]u16, // Name of the radio
+ device_class: ULONG, // Bluetooth "Class of Device". See: https://btprodspecificationrefs.blob.core.windows.net/assigned-numbers/Assigned%20Number%20Types/Baseband.pdf
+ lmp_minor_version: USHORT, // This member contains data specific to individual Bluetooth device manufacturers.
+ manufacturer: USHORT, // Manufacturer of the Bluetooth radio, expressed as a BTH_MFG_Xxx value. See https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers/
+}
+
+BLUETOOTH_DEVICE_SEARCH_PARAMS :: struct {
+ dw_size: DWORD, // Size of this structure
+
+ return_authenticated: BOOL, // Return authenticated devices
+ return_remembered: BOOL, // Return remembered devices
+ return_unknown: BOOL, // Return unknown devices
+ return_connected: BOOL, // Return connected devices
+ issue_inquiry: BOOL, // Issue a new inquiry
+ timeout_multiplier: UCHAR, // Timeout for the inquiry, expressed in increments of 1.28 seconds
+ radio: HANDLE, // Handle to radio to enumerate - NULL == all radios will be searched
+}
+
+BLUETOOTH_ADDRESS :: struct #raw_union {
+ addr: u64,
+ val: [6]u8, // The first 3 bytes can be used to find the Manufacturer using http://standards-oui.ieee.org/oui/oui.txt
+}
+
+BLUETOOTH_MAX_NAME_SIZE :: 248
+
+BLUETOOTH_DEVICE_INFO :: struct {
+ dw_size: DWORD, // Size in bytes of this structure - must be the size_of(BLUETOOTH_DEVICE_INFO)
+
+ address: BLUETOOTH_ADDRESS, // Bluetooth address
+ device_class: ULONG, // Bluetooth "Class of Device". See: https://btprodspecificationrefs.blob.core.windows.net/assigned-numbers/Assigned%20Number%20Types/Baseband.pdf
+ connected: BOOL, // Device connected/in use
+ remembered: BOOL, // Device remembered
+ authenticated: BOOL, // Device authenticated/paired/bonded
+ last_seen: SYSTEMTIME, // Last time the device was seen
+ last_used: SYSTEMTIME, // Last time the device was used for other than RNR, inquiry, or SDP
+ name: [BLUETOOTH_MAX_NAME_SIZE]u16, // Name of the device
+}
+
+@(default_calling_convention = "std")
+foreign bthprops {
+ /*
+ Version
+ */
+ @(link_name="BluetoothIsVersionAvailable") bluetooth_is_version_available :: proc(
+ major: u8, minor: u8,
+ ) -> BOOL ---
+
+ /*
+ Radio enumeration
+ */
+ @(link_name="BluetoothFindFirstRadio") bluetooth_find_first_radio :: proc(
+ find_radio_params: ^BLUETOOTH_FIND_RADIO_PARAMS, radio: ^HANDLE,
+ ) -> HBLUETOOTH_RADIO_FIND ---
+
+ @(link_name="BluetoothFindNextRadio") bluetooth_find_next_radio :: proc(
+ handle: HBLUETOOTH_RADIO_FIND, radio: ^HANDLE,
+ ) -> BOOL ---
+
+ @(link_name="BluetoothFindRadioClose") bluetooth_find_radio_close :: proc(
+ handle: HBLUETOOTH_RADIO_FIND,
+ ) -> BOOL ---
+
+ @(link_name="BluetoothGetRadioInfo") bluetooth_get_radio_info :: proc(
+ radio: HANDLE, radio_info: ^BLUETOOTH_RADIO_INFO,
+ ) -> DWORD ---
+
+ /*
+ Device enumeration
+ */
+ @(link_name="BluetoothFindFirstDevice") bluetooth_find_first_device :: proc(
+ search_params: ^BLUETOOTH_DEVICE_SEARCH_PARAMS, device_info: ^BLUETOOTH_DEVICE_INFO,
+ ) -> HBLUETOOTH_DEVICE_FIND ---
+
+ @(link_name="BluetoothFindNextDevice") bluetooth_find_next_device :: proc(
+ handle: HBLUETOOTH_DEVICE_FIND, device_info: ^BLUETOOTH_DEVICE_INFO,
+ ) -> BOOL ---
+
+ @(link_name="BluetoothFindDeviceClose") bluetooth_find_device_close :: proc(
+ handle: HBLUETOOTH_DEVICE_FIND,
+ ) -> BOOL ---
+
+ @(link_name="BluetoothGetDeviceInfo") bluetooth_get_device_info :: proc(
+ radio: HANDLE, device_info: ^BLUETOOTH_DEVICE_INFO,
+ ) -> DWORD ---
+
+ @(link_name="BluetoothDisplayDeviceProperties") bluetooth_display_device_properties :: proc(
+ hwnd_parent: HWND, device_info: ^BLUETOOTH_DEVICE_INFO,
+ ) -> BOOL ---
+} \ No newline at end of file
diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin
index c8d219d96..7fe67e648 100644
--- a/core/sys/windows/types.odin
+++ b/core/sys/windows/types.odin
@@ -1238,3 +1238,15 @@ NET_API_STATUS :: enum DWORD {
PasswordNotComplexEnough = 2704,
PasswordFilterError = 2705,
}
+
+
+SYSTEMTIME :: struct {
+ year: WORD,
+ month: WORD,
+ day_of_week: WORD,
+ day: WORD,
+ hour: WORD,
+ minute: WORD,
+ second: WORD,
+ milliseconds: WORD,
+} \ No newline at end of file