diff options
| author | Electric-Blue <Electric-Blue@users.noreply.github.com> | 2016-01-26 02:03:48 +0300 |
|---|---|---|
| committer | Electric-Blue <Electric-Blue@users.noreply.github.com> | 2016-01-26 02:03:48 +0300 |
| commit | 0c4a1cc1c2083a871562364de5df4f9d88ec321e (patch) | |
| tree | ddb8428845b663c078359eda4ec81bdcc157414f /nimbluez/bluez/bz_hci_lib.nim | |
| parent | 27a7a2a18a6db8b67cbe0e86c37cb174de2a1295 (diff) | |
| download | NimBluez-0c4a1cc1c2083a871562364de5df4f9d88ec321e.tar.gz NimBluez-0c4a1cc1c2083a871562364de5df4f9d88ec321e.zip | |
First version.
Diffstat (limited to 'nimbluez/bluez/bz_hci_lib.nim')
| -rw-r--r-- | nimbluez/bluez/bz_hci_lib.nim | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/nimbluez/bluez/bz_hci_lib.nim b/nimbluez/bluez/bz_hci_lib.nim new file mode 100644 index 0000000..0d6d8dc --- /dev/null +++ b/nimbluez/bluez/bz_hci_lib.nim @@ -0,0 +1,298 @@ +# +# +# BlueZ - Bluetooth protocol stack for Linux +# +# Copyright (C) 2000-2001 Qualcomm Incorporated +# Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com> +# Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org> +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# + +{.deadCodeElim: on.} + +import bz_bluetooth +import bz_hci + + +type + hci_request* = object + ogf*: uint16 + ocf*: uint16 + event*: cint + cparam*: pointer + clen*: cint + rparam*: pointer + rlen*: cint + + hci_version* = object + manufacturer*: uint16 + hci_ver*: uint8 + hci_rev*: uint16 + lmp_ver*: uint8 + lmp_subver*: uint16 + + +proc hci_open_dev*(dev_id: cint): cint {.cdecl, importc: "hci_open_dev", + dynlib: "libbluetooth.so".} +proc hci_close_dev*(dd: cint): cint {.cdecl, importc: "hci_close_dev", + dynlib: "libbluetooth.so".} +proc hci_send_cmd*(dd: cint; ogf: uint16; ocf: uint16; plen: uint8; + param: pointer): cint {.cdecl, importc: "hci_send_cmd", + dynlib: "libbluetooth.so".} +proc hci_send_req*(dd: cint; req: ptr hci_request; timeout: cint): cint {.cdecl, + importc: "hci_send_req", dynlib: "libbluetooth.so".} +proc hci_create_connection*(dd: cint; bdaddr: ptr bdaddr_t; ptype: uint16; + clkoffset: uint16; rswitch: uint8; + handle: ptr uint16; to: cint): cint {.cdecl, + importc: "hci_create_connection", dynlib: "libbluetooth.so".} +proc hci_disconnect*(dd: cint; handle: uint16; reason: uint8; to: cint): cint {. + cdecl, importc: "hci_disconnect", dynlib: "libbluetooth.so".} +proc hci_inquiry*(dev_id: cint; len: cint; num_rsp: cint; lap: ptr uint8; + ii: ptr ptr inquiry_info; flags: clong): cint {.cdecl, + importc: "hci_inquiry", dynlib: "libbluetooth.so".} +proc hci_devinfo*(dev_id: cint; di: ptr hci_dev_info): cint {.cdecl, + importc: "hci_devinfo", dynlib: "libbluetooth.so".} +proc hci_devba*(dev_id: cint; bdaddr: ptr bdaddr_t): cint {.cdecl, + importc: "hci_devba", dynlib: "libbluetooth.so".} +proc hci_devid*(str: cstring): cint {.cdecl, importc: "hci_devid", + dynlib: "libbluetooth.so".} +proc hci_read_local_name*(dd: cint; len: cint; name: cstring; to: cint): cint {. + cdecl, importc: "hci_read_local_name", dynlib: "libbluetooth.so".} +proc hci_write_local_name*(dd: cint; name: cstring; to: cint): cint {.cdecl, + importc: "hci_write_local_name", dynlib: "libbluetooth.so".} +proc hci_read_remote_name*(dd: cint; bdaddr: ptr bdaddr_t; len: cint; + name: cstring; to: cint): cint {.cdecl, + importc: "hci_read_remote_name", dynlib: "libbluetooth.so".} +proc hci_read_remote_name_with_clock_offset*(dd: cint; bdaddr: ptr bdaddr_t; + pscan_rep_mode: uint8; clkoffset: uint16; len: cint; name: cstring; + to: cint): cint {.cdecl, importc: "hci_read_remote_name_with_clock_offset", + dynlib: "libbluetooth.so".} +proc hci_read_remote_name_cancel*(dd: cint; bdaddr: ptr bdaddr_t; to: cint): cint {. + cdecl, importc: "hci_read_remote_name_cancel", dynlib: "libbluetooth.so".} +proc hci_read_remote_version*(dd: cint; handle: uint16; ver: ptr hci_version; + to: cint): cint {.cdecl, + importc: "hci_read_remote_version", dynlib: "libbluetooth.so".} +proc hci_read_remote_features*(dd: cint; handle: uint16; + features: ptr uint8; to: cint): cint {.cdecl, + importc: "hci_read_remote_features", dynlib: "libbluetooth.so".} +proc hci_read_remote_ext_features*(dd: cint; handle: uint16; page: uint8; + max_page: ptr uint8; features: ptr uint8; + to: cint): cint {.cdecl, + importc: "hci_read_remote_ext_features", dynlib: "libbluetooth.so".} +proc hci_read_clock_offset*(dd: cint; handle: uint16; clkoffset: ptr uint16; + to: cint): cint {.cdecl, + importc: "hci_read_clock_offset", dynlib: "libbluetooth.so".} +proc hci_read_local_version*(dd: cint; ver: ptr hci_version; to: cint): cint {. + cdecl, importc: "hci_read_local_version", dynlib: "libbluetooth.so".} +proc hci_read_local_commands*(dd: cint; commands: ptr uint8; to: cint): cint {. + cdecl, importc: "hci_read_local_commands", dynlib: "libbluetooth.so".} +proc hci_read_local_features*(dd: cint; features: ptr uint8; to: cint): cint {. + cdecl, importc: "hci_read_local_features", dynlib: "libbluetooth.so".} +proc hci_read_local_ext_features*(dd: cint; page: uint8; + max_page: ptr uint8; features: ptr uint8; + to: cint): cint {.cdecl, + importc: "hci_read_local_ext_features", dynlib: "libbluetooth.so".} +proc hci_read_bd_addr*(dd: cint; bdaddr: ptr bdaddr_t; to: cint): cint {.cdecl, + importc: "hci_read_bd_addr", dynlib: "libbluetooth.so".} +proc hci_read_class_of_dev*(dd: cint; cls: ptr uint8; to: cint): cint {.cdecl, + importc: "hci_read_class_of_dev", dynlib: "libbluetooth.so".} +proc hci_write_class_of_dev*(dd: cint; cls: uint32; to: cint): cint {.cdecl, + importc: "hci_write_class_of_dev", dynlib: "libbluetooth.so".} +proc hci_read_voice_setting*(dd: cint; vs: ptr uint16; to: cint): cint {. + cdecl, importc: "hci_read_voice_setting", dynlib: "libbluetooth.so".} +proc hci_write_voice_setting*(dd: cint; vs: uint16; to: cint): cint {.cdecl, + importc: "hci_write_voice_setting", dynlib: "libbluetooth.so".} +proc hci_read_current_iac_lap*(dd: cint; num_iac: ptr uint8; lap: ptr uint8; + to: cint): cint {.cdecl, + importc: "hci_read_current_iac_lap", dynlib: "libbluetooth.so".} +proc hci_write_current_iac_lap*(dd: cint; num_iac: uint8; lap: ptr uint8; + to: cint): cint {.cdecl, + importc: "hci_write_current_iac_lap", dynlib: "libbluetooth.so".} +proc hci_read_stored_link_key*(dd: cint; bdaddr: ptr bdaddr_t; all: uint8; + to: cint): cint {.cdecl, + importc: "hci_read_stored_link_key", dynlib: "libbluetooth.so".} +proc hci_write_stored_link_key*(dd: cint; bdaddr: ptr bdaddr_t; + key: ptr uint8; to: cint): cint {.cdecl, + importc: "hci_write_stored_link_key", dynlib: "libbluetooth.so".} +proc hci_delete_stored_link_key*(dd: cint; bdaddr: ptr bdaddr_t; all: uint8; + to: cint): cint {.cdecl, + importc: "hci_delete_stored_link_key", dynlib: "libbluetooth.so".} +proc hci_authenticate_link*(dd: cint; handle: uint16; to: cint): cint {.cdecl, + importc: "hci_authenticate_link", dynlib: "libbluetooth.so".} +proc hci_encrypt_link*(dd: cint; handle: uint16; encrypt: uint8; to: cint): cint {. + cdecl, importc: "hci_encrypt_link", dynlib: "libbluetooth.so".} +proc hci_change_link_key*(dd: cint; handle: uint16; to: cint): cint {.cdecl, + importc: "hci_change_link_key", dynlib: "libbluetooth.so".} +proc hci_switch_role*(dd: cint; bdaddr: ptr bdaddr_t; role: uint8; to: cint): cint {. + cdecl, importc: "hci_switch_role", dynlib: "libbluetooth.so".} +proc hci_park_mode*(dd: cint; handle: uint16; max_interval: uint16; + min_interval: uint16; to: cint): cint {.cdecl, + importc: "hci_park_mode", dynlib: "libbluetooth.so".} +proc hci_exit_park_mode*(dd: cint; handle: uint16; to: cint): cint {.cdecl, + importc: "hci_exit_park_mode", dynlib: "libbluetooth.so".} +proc hci_read_inquiry_scan_type*(dd: cint; `type`: ptr uint8; to: cint): cint {. + cdecl, importc: "hci_read_inquiry_scan_type", dynlib: "libbluetooth.so".} +proc hci_write_inquiry_scan_type*(dd: cint; `type`: uint8; to: cint): cint {. + cdecl, importc: "hci_write_inquiry_scan_type", dynlib: "libbluetooth.so".} +proc hci_read_inquiry_mode*(dd: cint; mode: ptr uint8; to: cint): cint {. + cdecl, importc: "hci_read_inquiry_mode", dynlib: "libbluetooth.so".} +proc hci_write_inquiry_mode*(dd: cint; mode: uint8; to: cint): cint {.cdecl, + importc: "hci_write_inquiry_mode", dynlib: "libbluetooth.so".} +proc hci_read_afh_mode*(dd: cint; mode: ptr uint8; to: cint): cint {.cdecl, + importc: "hci_read_afh_mode", dynlib: "libbluetooth.so".} +proc hci_write_afh_mode*(dd: cint; mode: uint8; to: cint): cint {.cdecl, + importc: "hci_write_afh_mode", dynlib: "libbluetooth.so".} +proc hci_read_ext_inquiry_response*(dd: cint; fec: ptr uint8; + data: ptr uint8; to: cint): cint {.cdecl, + importc: "hci_read_ext_inquiry_response", dynlib: "libbluetooth.so".} +proc hci_write_ext_inquiry_response*(dd: cint; fec: uint8; data: ptr uint8; + to: cint): cint {.cdecl, + importc: "hci_write_ext_inquiry_response", dynlib: "libbluetooth.so".} +proc hci_read_simple_pairing_mode*(dd: cint; mode: ptr uint8; to: cint): cint {. + cdecl, importc: "hci_read_simple_pairing_mode", dynlib: "libbluetooth.so".} +proc hci_write_simple_pairing_mode*(dd: cint; mode: uint8; to: cint): cint {. + cdecl, importc: "hci_write_simple_pairing_mode", dynlib: "libbluetooth.so".} +proc hci_read_local_oob_data*(dd: cint; hash: ptr uint8; + randomizer: ptr uint8; to: cint): cint {.cdecl, + importc: "hci_read_local_oob_data", dynlib: "libbluetooth.so".} +proc hci_read_inquiry_transmit_power_level*(dd: cint; level: ptr int8; + to: cint): cint {.cdecl, importc: "hci_read_inquiry_transmit_power_level", + dynlib: "libbluetooth.so".} +proc hci_write_inquiry_transmit_power_level*(dd: cint; level: int8; to: cint): cint {. + cdecl, importc: "hci_write_inquiry_transmit_power_level", + dynlib: "libbluetooth.so".} +proc hci_read_transmit_power_level*(dd: cint; handle: uint16; `type`: uint8; + level: ptr int8; to: cint): cint {.cdecl, + importc: "hci_read_transmit_power_level", dynlib: "libbluetooth.so".} +proc hci_read_link_policy*(dd: cint; handle: uint16; policy: ptr uint16; + to: cint): cint {.cdecl, + importc: "hci_read_link_policy", dynlib: "libbluetooth.so".} +proc hci_write_link_policy*(dd: cint; handle: uint16; policy: uint16; + to: cint): cint {.cdecl, + importc: "hci_write_link_policy", dynlib: "libbluetooth.so".} +proc hci_read_link_supervision_timeout*(dd: cint; handle: uint16; + timeout: ptr uint16; to: cint): cint {. + cdecl, importc: "hci_read_link_supervision_timeout", dynlib: "libbluetooth.so".} +proc hci_write_link_supervision_timeout*(dd: cint; handle: uint16; + timeout: uint16; to: cint): cint {.cdecl, + importc: "hci_write_link_supervision_timeout", dynlib: "libbluetooth.so".} +proc hci_set_afh_classification*(dd: cint; map: ptr uint8; to: cint): cint {. + cdecl, importc: "hci_set_afh_classification", dynlib: "libbluetooth.so".} +proc hci_read_link_quality*(dd: cint; handle: uint16; + link_quality: ptr uint8; to: cint): cint {.cdecl, + importc: "hci_read_link_quality", dynlib: "libbluetooth.so".} +proc hci_read_rssi*(dd: cint; handle: uint16; rssi: ptr int8; to: cint): cint {. + cdecl, importc: "hci_read_rssi", dynlib: "libbluetooth.so".} +proc hci_read_afh_map*(dd: cint; handle: uint16; mode: ptr uint8; + map: ptr uint8; to: cint): cint {.cdecl, + importc: "hci_read_afh_map", dynlib: "libbluetooth.so".} +proc hci_read_clock*(dd: cint; handle: uint16; which: uint8; + clock: ptr uint32; accuracy: ptr uint16; to: cint): cint {. + cdecl, importc: "hci_read_clock", dynlib: "libbluetooth.so".} +proc hci_for_each_dev*(flag: cint; `func`: proc (dd: cint; dev_id: cint; + arg: clong): cint {.cdecl.}; arg: clong): cint {.cdecl, + importc: "hci_for_each_dev", dynlib: "libbluetooth.so".} +proc hci_get_route*(bdaddr: ptr bdaddr_t): cint {.cdecl, + importc: "hci_get_route", dynlib: "libbluetooth.so".} +proc hci_dtypetostr*(`type`: cint): cstring {.cdecl, importc: "hci_dtypetostr", + dynlib: "libbluetooth.so".} +proc hci_dflagstostr*(flags: uint32): cstring {.cdecl, + importc: "hci_dflagstostr", dynlib: "libbluetooth.so".} +proc hci_ptypetostr*(ptype: cuint): cstring {.cdecl, importc: "hci_ptypetostr", + dynlib: "libbluetooth.so".} +proc hci_strtoptype*(str: cstring; val: ptr cuint): cint {.cdecl, + importc: "hci_strtoptype", dynlib: "libbluetooth.so".} +proc hci_scoptypetostr*(ptype: cuint): cstring {.cdecl, + importc: "hci_scoptypetostr", dynlib: "libbluetooth.so".} +proc hci_strtoscoptype*(str: cstring; val: ptr cuint): cint {.cdecl, + importc: "hci_strtoscoptype", dynlib: "libbluetooth.so".} +proc hci_lptostr*(ptype: cuint): cstring {.cdecl, importc: "hci_lptostr", + dynlib: "libbluetooth.so".} +proc hci_strtolp*(str: cstring; val: ptr cuint): cint {.cdecl, + importc: "hci_strtolp", dynlib: "libbluetooth.so".} +proc hci_lmtostr*(ptype: cuint): cstring {.cdecl, importc: "hci_lmtostr", + dynlib: "libbluetooth.so".} +proc hci_strtolm*(str: cstring; val: ptr cuint): cint {.cdecl, + importc: "hci_strtolm", dynlib: "libbluetooth.so".} +proc hci_cmdtostr*(cmd: cuint): cstring {.cdecl, importc: "hci_cmdtostr", + dynlib: "libbluetooth.so".} +proc hci_commandstostr*(commands: ptr uint8; pref: cstring; width: cint): cstring {. + cdecl, importc: "hci_commandstostr", dynlib: "libbluetooth.so".} +proc hci_vertostr*(ver: cuint): cstring {.cdecl, importc: "hci_vertostr", + dynlib: "libbluetooth.so".} +proc hci_strtover*(str: cstring; ver: ptr cuint): cint {.cdecl, + importc: "hci_strtover", dynlib: "libbluetooth.so".} +proc lmp_vertostr*(ver: cuint): cstring {.cdecl, importc: "lmp_vertostr", + dynlib: "libbluetooth.so".} +proc lmp_strtover*(str: cstring; ver: ptr cuint): cint {.cdecl, + importc: "lmp_strtover", dynlib: "libbluetooth.so".} +proc lmp_featurestostr*(features: ptr uint8; pref: cstring; width: cint): cstring {. + cdecl, importc: "lmp_featurestostr", dynlib: "libbluetooth.so".} +proc hci_set_bit*(nr: cint; `addr`: pointer) {.inline, cdecl.} = + cast[ptr uint32](cast[int](`addr`) + (nr shr 5))[] = + uint32(int(cast[ptr uint32](cast[int](`addr`) + (nr shr 5))[]) or (1 shl (nr and 31))) + +proc hci_clear_bit*(nr: cint; `addr`: pointer) {.inline, cdecl.} = + cast[ptr uint32](cast[int](`addr`) + (nr shr 5))[] = + uint32(int(cast[ptr uint32](cast[int](`addr`) + (nr shr 5))[]) and not (1 shl (nr and 31))) + +proc hci_test_bit*(nr: cint; `addr`: pointer): cint {.inline, cdecl.} = + return cint(int(cast[ptr uint32](cast[int](`addr`) + (nr shr 5))[]) and (1 shl (nr and 31))) + +# HCI filter tools + +proc hci_filter_clear*(f: ptr hci_filter) {.inline, cdecl.} = + zeroMem(f, sizeof((f[]))) + +proc hci_filter_set_ptype*(t: cint; f: ptr hci_filter) {.inline, cdecl.} = + hci_set_bit(if (t == HCI_VENDOR_PKT): 0 else: (t and HCI_FLT_TYPE_BITS), + addr(f.type_mask)) + +proc hci_filter_clear_ptype*(t: cint; f: ptr hci_filter) {.inline, cdecl.} = + hci_clear_bit(if (t == HCI_VENDOR_PKT): 0 else: (t and HCI_FLT_TYPE_BITS), + addr(f.type_mask)) + +proc hci_filter_test_ptype*(t: cint; f: ptr hci_filter): cint {.inline, cdecl.} = + return hci_test_bit(if (t == HCI_VENDOR_PKT): 0 else: (t and + HCI_FLT_TYPE_BITS), addr(f.type_mask)) + +proc hci_filter_all_ptypes*(f: ptr hci_filter) {.inline, cdecl.} = + f.type_mask = 0x000000FF + +proc hci_filter_set_event*(e: cint; f: ptr hci_filter) {.inline, cdecl.} = + hci_set_bit((e and HCI_FLT_EVENT_BITS), addr(f.event_mask)) + +proc hci_filter_clear_event*(e: cint; f: ptr hci_filter) {.inline, cdecl.} = + hci_clear_bit((e and HCI_FLT_EVENT_BITS), addr(f.event_mask)) + +proc hci_filter_test_event*(e: cint; f: ptr hci_filter): cint {.inline, cdecl.} = + return hci_test_bit((e and HCI_FLT_EVENT_BITS), addr(f.event_mask)) + +proc hci_filter_all_events*(f: ptr hci_filter) {.inline, cdecl.} = + for i in low(f.event_mask)..high(f.event_mask): + f.event_mask[i] = 0x000000FF + +proc hci_filter_set_opcode*(opcode: uint16; f: ptr hci_filter) {.inline, cdecl.} = + f.opcode = opcode + +proc hci_filter_clear_opcode*(f: ptr hci_filter) {.inline, cdecl.} = + f.opcode = 0 + +proc hci_filter_test_opcode*(opcode: uint16; f: ptr hci_filter): bool {.inline, + cdecl.} = + return int16(f.opcode) == int16(opcode) |
