simpleble 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +88 -0
- data/LICENSE.txt +21 -0
- data/README.md +350 -0
- data/ext/simpleble/extconf.rb +57 -0
- data/ext/simpleble/simpleble_ruby.c +682 -0
- data/lib/simpleble/adapter.rb +10 -0
- data/lib/simpleble/characteristic.rb +36 -0
- data/lib/simpleble/descriptor.rb +8 -0
- data/lib/simpleble/exceptions.rb +25 -0
- data/lib/simpleble/peripheral.rb +64 -0
- data/lib/simpleble/service.rb +16 -0
- data/lib/simpleble/version.rb +3 -0
- data/lib/simpleble.rb +40 -0
- data/vendor/simpleble/build_simplecble/CMakeFiles/4.0.3/CompilerIdCXX/CMakeCXXCompilerId.cpp +920 -0
- data/vendor/simpleble/build_simplecble/CMakeFiles/4.0.3/CompilerIdCXX/apple-sdk.cpp +1 -0
- data/vendor/simpleble/build_simplecble/CMakeFiles/4.1.0/CompilerIdCXX/CMakeCXXCompilerId.cpp +949 -0
- data/vendor/simpleble/build_simplecble/CMakeFiles/4.1.0/CompilerIdCXX/apple-sdk.cpp +1 -0
- data/vendor/simpleble/build_simplecble/export/simplecble/export.h +43 -0
- data/vendor/simpleble/build_simplecble/simpleble/export/simpleble/export.h +43 -0
- data/vendor/simpleble/dependencies/external/kvn/kvn_bytearray.h +222 -0
- data/vendor/simpleble/dependencies/external/kvn/kvn_safe_callback.hpp +66 -0
- data/vendor/simpleble/dependencies/external/kvn/logfwd.hpp +35 -0
- data/vendor/simpleble/dependencies/internal/fmt/args.h +220 -0
- data/vendor/simpleble/dependencies/internal/fmt/base.h +2962 -0
- data/vendor/simpleble/dependencies/internal/fmt/chrono.h +2338 -0
- data/vendor/simpleble/dependencies/internal/fmt/color.h +610 -0
- data/vendor/simpleble/dependencies/internal/fmt/compile.h +539 -0
- data/vendor/simpleble/dependencies/internal/fmt/core.h +5 -0
- data/vendor/simpleble/dependencies/internal/fmt/format-inl.h +1949 -0
- data/vendor/simpleble/dependencies/internal/fmt/format.h +4244 -0
- data/vendor/simpleble/dependencies/internal/fmt/os.h +427 -0
- data/vendor/simpleble/dependencies/internal/fmt/ostream.h +166 -0
- data/vendor/simpleble/dependencies/internal/fmt/printf.h +633 -0
- data/vendor/simpleble/dependencies/internal/fmt/ranges.h +850 -0
- data/vendor/simpleble/dependencies/internal/fmt/std.h +726 -0
- data/vendor/simpleble/dependencies/internal/fmt/xchar.h +373 -0
- data/vendor/simpleble/dependencies/internal/simplejni/Common.hpp +579 -0
- data/vendor/simpleble/dependencies/internal/simplejni/References.hpp +151 -0
- data/vendor/simpleble/dependencies/internal/simplejni/Registry.hpp +183 -0
- data/vendor/simpleble/dependencies/internal/simplejni/VM.hpp +88 -0
- data/vendor/simpleble/examples/simpleble/src/connect.cpp +67 -0
- data/vendor/simpleble/examples/simpleble/src/connect_safe.cpp +91 -0
- data/vendor/simpleble/examples/simpleble/src/list_adapters.cpp +22 -0
- data/vendor/simpleble/examples/simpleble/src/list_adapters_safe.cpp +33 -0
- data/vendor/simpleble/examples/simpleble/src/list_paired.cpp +27 -0
- data/vendor/simpleble/examples/simpleble/src/multiconnect.cpp +60 -0
- data/vendor/simpleble/examples/simpleble/src/notify.cpp +85 -0
- data/vendor/simpleble/examples/simpleble/src/notify_multi.cpp +101 -0
- data/vendor/simpleble/examples/simpleble/src/power_cycle.cpp +43 -0
- data/vendor/simpleble/examples/simpleble/src/read.cpp +82 -0
- data/vendor/simpleble/examples/simpleble/src/scan.cpp +62 -0
- data/vendor/simpleble/examples/simpleble/src/utils.cpp +59 -0
- data/vendor/simpleble/examples/simpleble/src/utils.hpp +27 -0
- data/vendor/simpleble/examples/simpleble/src/write.cpp +81 -0
- data/vendor/simpleble/examples/simplebluez/ble_nus/ble_nus.cpp +138 -0
- data/vendor/simpleble/examples/simplebluez/connect/connect.cpp +119 -0
- data/vendor/simpleble/examples/simplebluez/list_adapters/list_adapters.cpp +44 -0
- data/vendor/simpleble/examples/simplebluez/list_paired/list_paired.cpp +48 -0
- data/vendor/simpleble/examples/simplebluez/notify/notify.cpp +145 -0
- data/vendor/simpleble/examples/simplebluez/pair/pair.cpp +181 -0
- data/vendor/simpleble/examples/simplebluez/read/read.cpp +141 -0
- data/vendor/simpleble/examples/simplebluez/scan/scan.cpp +85 -0
- data/vendor/simpleble/examples/simplecble/c/connect.c +163 -0
- data/vendor/simpleble/examples/simplecble/c/notify.c +217 -0
- data/vendor/simpleble/examples/simplecble/c/scan.c +164 -0
- data/vendor/simpleble/examples/simpledbus/notification.cpp +24 -0
- data/vendor/simpleble/hitl/src/test_sanity.cpp +48 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Adapter.h +102 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/AdapterSafe.h +58 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Advanced.h +50 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Characteristic.h +39 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Config.h +55 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Descriptor.h +30 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Exceptions.h +72 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Logging.h +73 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Peripheral.h +82 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/PeripheralSafe.h +64 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Service.h +34 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/SimpleBLE.h +8 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Types.h +49 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Utils.h +13 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/export.h +43 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/kvn/kvn_bytearray.h +222 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/adapter.h +188 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/logging.h +37 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/peripheral.h +304 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/simpleble.h +21 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/types.h +73 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/utils.h +27 -0
- data/vendor/simpleble/simpleble/include/simpleble/Adapter.h +102 -0
- data/vendor/simpleble/simpleble/include/simpleble/AdapterSafe.h +58 -0
- data/vendor/simpleble/simpleble/include/simpleble/Characteristic.h +39 -0
- data/vendor/simpleble/simpleble/include/simpleble/Config.h +55 -0
- data/vendor/simpleble/simpleble/include/simpleble/Descriptor.h +30 -0
- data/vendor/simpleble/simpleble/include/simpleble/Exceptions.h +72 -0
- data/vendor/simpleble/simpleble/include/simpleble/Logging.h +73 -0
- data/vendor/simpleble/simpleble/include/simpleble/Peripheral.h +82 -0
- data/vendor/simpleble/simpleble/include/simpleble/PeripheralSafe.h +64 -0
- data/vendor/simpleble/simpleble/include/simpleble/Service.h +34 -0
- data/vendor/simpleble/simpleble/include/simpleble/SimpleBLE.h +8 -0
- data/vendor/simpleble/simpleble/include/simpleble/Types.h +49 -0
- data/vendor/simpleble/simpleble/include/simpleble/Utils.h +13 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/adapter.h +188 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/logging.h +37 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/peripheral.h +304 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/simpleble.h +21 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/types.h +73 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/utils.h +27 -0
- data/vendor/simpleble/simpleble/src/CommonUtils.h +63 -0
- data/vendor/simpleble/simpleble/src/Exceptions.cpp +31 -0
- data/vendor/simpleble/simpleble/src/Logging.cpp +136 -0
- data/vendor/simpleble/simpleble/src/LoggingInternal.h +85 -0
- data/vendor/simpleble/simpleble/src/Utils.cpp +24 -0
- data/vendor/simpleble/simpleble/src/backends/android/AdapterAndroid.cpp +101 -0
- data/vendor/simpleble/simpleble/src/backends/android/AdapterAndroid.h +70 -0
- data/vendor/simpleble/simpleble/src/backends/android/BackendAndroid.cpp +40 -0
- data/vendor/simpleble/simpleble/src/backends/android/BackendAndroid.h +20 -0
- data/vendor/simpleble/simpleble/src/backends/android/PeripheralAndroid.cpp +365 -0
- data/vendor/simpleble/simpleble/src/backends/android/PeripheralAndroid.h +90 -0
- data/vendor/simpleble/simpleble/src/backends/android/bridge/BluetoothGattCallback.cpp +432 -0
- data/vendor/simpleble/simpleble/src/backends/android/bridge/BluetoothGattCallback.h +102 -0
- data/vendor/simpleble/simpleble/src/backends/android/bridge/ScanCallback.cpp +142 -0
- data/vendor/simpleble/simpleble/src/backends/android/bridge/ScanCallback.h +55 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothAdapter.cpp +107 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothAdapter.h +55 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothDevice.cpp +68 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothDevice.h +54 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGatt.cpp +115 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGatt.h +75 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattCharacteristic.cpp +142 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattCharacteristic.h +66 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattDescriptor.cpp +67 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattDescriptor.h +46 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattService.cpp +106 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattService.h +47 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/BluetoothScanner.cpp +47 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/BluetoothScanner.h +37 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanRecord.cpp +69 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanRecord.h +41 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanResult.cpp +63 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanResult.h +42 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/os/ParcelUUID.cpp +32 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/os/ParcelUUID.h +30 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/util/SparseArray.cpp +54 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/util/SparseArray.h +37 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Iterator.cpp +36 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Iterator.h +28 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/List.cpp +29 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/List.h +27 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Set.cpp +33 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Set.h +28 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/UUID.cpp +26 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/UUID.h +29 -0
- data/vendor/simpleble/simpleble/src/backends/common/AdapterBase.cpp +53 -0
- data/vendor/simpleble/simpleble/src/backends/common/AdapterBase.h +81 -0
- data/vendor/simpleble/simpleble/src/backends/common/AdapterBaseTypes.h +22 -0
- data/vendor/simpleble/simpleble/src/backends/common/BackendBase.h +20 -0
- data/vendor/simpleble/simpleble/src/backends/common/BackendUtils.h +33 -0
- data/vendor/simpleble/simpleble/src/backends/common/CharacteristicBase.cpp +28 -0
- data/vendor/simpleble/simpleble/src/backends/common/CharacteristicBase.h +38 -0
- data/vendor/simpleble/simpleble/src/backends/common/DescriptorBase.cpp +7 -0
- data/vendor/simpleble/simpleble/src/backends/common/DescriptorBase.h +19 -0
- data/vendor/simpleble/simpleble/src/backends/common/PeripheralBase.h +82 -0
- data/vendor/simpleble/simpleble/src/backends/common/ServiceBase.cpp +18 -0
- data/vendor/simpleble/simpleble/src/backends/common/ServiceBase.h +28 -0
- data/vendor/simpleble/simpleble/src/backends/linux/AdapterLinux.cpp +102 -0
- data/vendor/simpleble/simpleble/src/backends/linux/AdapterLinux.h +55 -0
- data/vendor/simpleble/simpleble/src/backends/linux/BackendBluez.cpp +87 -0
- data/vendor/simpleble/simpleble/src/backends/linux/PeripheralLinux.cpp +376 -0
- data/vendor/simpleble/simpleble/src/backends/linux/PeripheralLinux.h +90 -0
- data/vendor/simpleble/simpleble/src/backends/macos/AdapterBaseMacOS.h +29 -0
- data/vendor/simpleble/simpleble/src/backends/macos/AdapterMac.h +78 -0
- data/vendor/simpleble/simpleble/src/backends/macos/PeripheralBaseMacOS.h +49 -0
- data/vendor/simpleble/simpleble/src/backends/macos/PeripheralMac.h +81 -0
- data/vendor/simpleble/simpleble/src/backends/macos/Utils.h +9 -0
- data/vendor/simpleble/simpleble/src/backends/plain/AdapterPlain.cpp +65 -0
- data/vendor/simpleble/simpleble/src/backends/plain/AdapterPlain.h +49 -0
- data/vendor/simpleble/simpleble/src/backends/plain/BackendPlain.cpp +30 -0
- data/vendor/simpleble/simpleble/src/backends/plain/PeripheralPlain.cpp +159 -0
- data/vendor/simpleble/simpleble/src/backends/plain/PeripheralPlain.h +72 -0
- data/vendor/simpleble/simpleble/src/backends/windows/AdapterWindows.cpp +330 -0
- data/vendor/simpleble/simpleble/src/backends/windows/AdapterWindows.h +89 -0
- data/vendor/simpleble/simpleble/src/backends/windows/BackendWinRT.cpp +67 -0
- data/vendor/simpleble/simpleble/src/backends/windows/BackendWinRT.h +18 -0
- data/vendor/simpleble/simpleble/src/backends/windows/MtaManager.cpp +49 -0
- data/vendor/simpleble/simpleble/src/backends/windows/MtaManager.h +90 -0
- data/vendor/simpleble/simpleble/src/backends/windows/PeripheralWindows.cpp +487 -0
- data/vendor/simpleble/simpleble/src/backends/windows/PeripheralWindows.h +129 -0
- data/vendor/simpleble/simpleble/src/backends/windows/Utils.cpp +146 -0
- data/vendor/simpleble/simpleble/src/backends/windows/Utils.h +47 -0
- data/vendor/simpleble/simpleble/src/builders/BuildVec.h +32 -0
- data/vendor/simpleble/simpleble/src/builders/BuilderBase.h +87 -0
- data/vendor/simpleble/simpleble/src/external/TaskRunner.hpp +99 -0
- data/vendor/simpleble/simpleble/src/external/ThreadRunner.h +52 -0
- data/vendor/simpleble/simpleble/src/external/kvn_safe_callback.hpp +66 -0
- data/vendor/simpleble/simpleble/src/external/kvn_safe_map.hpp +94 -0
- data/vendor/simpleble/simpleble/src/external/kvn_threadrunner.hpp +70 -0
- data/vendor/simpleble/simpleble/src/external/logfwd.hpp +35 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Adapter.cpp +111 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Backend.cpp +83 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Backend.h +76 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Characteristic.cpp +56 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Descriptor.cpp +21 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Peripheral.cpp +113 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Service.cpp +26 -0
- data/vendor/simpleble/simpleble/src/frontends/safe/AdapterSafe.cpp +158 -0
- data/vendor/simpleble/simpleble/src/frontends/safe/PeripheralSafe.cpp +219 -0
- data/vendor/simpleble/simpleble/src_c/adapter.cpp +204 -0
- data/vendor/simpleble/simpleble/src_c/logging.cpp +19 -0
- data/vendor/simpleble/simpleble/src_c/peripheral.cpp +444 -0
- data/vendor/simpleble/simpleble/src_c/simpleble.cpp +5 -0
- data/vendor/simpleble/simpleble/src_c/utils.cpp +15 -0
- data/vendor/simpleble/simpleble/test/src/main.cpp +8 -0
- data/vendor/simpleble/simpleble/test/src/test_bytearray.cpp +246 -0
- data/vendor/simpleble/simpleble/test/src/test_utils.cpp +24 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Adapter.h +46 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Agent.h +52 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Bluez.h +37 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/BluezOrg.h +22 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/BluezOrgBluez.h +26 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/BluezRoot.h +32 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Characteristic.h +46 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Descriptor.h +33 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Device.h +64 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Exceptions.h +43 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Service.h +27 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Types.h +9 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Adapter1.h +49 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Agent1.h +100 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/AgentManager1.h +24 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Battery1.h +32 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Device1.h +62 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/GattCharacteristic1.h +48 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/GattDescriptor1.h +41 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/GattService1.h +28 -0
- data/vendor/simpleble/simplebluez/src/Adapter.cpp +78 -0
- data/vendor/simpleble/simplebluez/src/Agent.cpp +72 -0
- data/vendor/simpleble/simplebluez/src/Bluez.cpp +45 -0
- data/vendor/simpleble/simplebluez/src/BluezOrg.cpp +20 -0
- data/vendor/simpleble/simplebluez/src/BluezOrgBluez.cpp +23 -0
- data/vendor/simpleble/simplebluez/src/BluezRoot.cpp +44 -0
- data/vendor/simpleble/simplebluez/src/Characteristic.cpp +64 -0
- data/vendor/simpleble/simplebluez/src/Descriptor.cpp +27 -0
- data/vendor/simpleble/simplebluez/src/Device.cpp +104 -0
- data/vendor/simpleble/simplebluez/src/Exceptions.cpp +29 -0
- data/vendor/simpleble/simplebluez/src/Logging.cpp +52 -0
- data/vendor/simpleble/simplebluez/src/Logging.h +57 -0
- data/vendor/simpleble/simplebluez/src/Service.cpp +33 -0
- data/vendor/simpleble/simplebluez/src/interfaces/Adapter1.cpp +123 -0
- data/vendor/simpleble/simplebluez/src/interfaces/Agent1.cpp +143 -0
- data/vendor/simpleble/simplebluez/src/interfaces/AgentManager1.cpp +34 -0
- data/vendor/simpleble/simplebluez/src/interfaces/Battery1.cpp +30 -0
- data/vendor/simpleble/simplebluez/src/interfaces/Device1.cpp +170 -0
- data/vendor/simpleble/simplebluez/src/interfaces/GattCharacteristic1.cpp +118 -0
- data/vendor/simpleble/simplebluez/src/interfaces/GattDescriptor1.cpp +78 -0
- data/vendor/simpleble/simplebluez/src/interfaces/GattService1.cpp +28 -0
- data/vendor/simpleble/simplebluez/test/src/helpers/PythonRunner.cpp +53 -0
- data/vendor/simpleble/simplebluez/test/src/helpers/PythonRunner.h +24 -0
- data/vendor/simpleble/simplebluez/test/src/main.cpp +16 -0
- data/vendor/simpleble/simplecble/include/simplecble/adapter.h +188 -0
- data/vendor/simpleble/simplecble/include/simplecble/logging.h +37 -0
- data/vendor/simpleble/simplecble/include/simplecble/peripheral.h +304 -0
- data/vendor/simpleble/simplecble/include/simplecble/simpleble.h +21 -0
- data/vendor/simpleble/simplecble/include/simplecble/types.h +73 -0
- data/vendor/simpleble/simplecble/include/simplecble/utils.h +27 -0
- data/vendor/simpleble/simplecble/src/adapter.cpp +204 -0
- data/vendor/simpleble/simplecble/src/logging.cpp +19 -0
- data/vendor/simpleble/simplecble/src/peripheral.cpp +444 -0
- data/vendor/simpleble/simplecble/src/simpleble.cpp +5 -0
- data/vendor/simpleble/simplecble/src/utils.cpp +15 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/advanced/Interface.h +67 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/advanced/InterfaceRegistry.h +64 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/advanced/Proxy.h +117 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Connection.h +50 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Exceptions.h +56 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Holder.h +147 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Logging.h +57 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Message.h +89 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Path.h +24 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/interfaces/ObjectManager.h +26 -0
- data/vendor/simpleble/simpledbus/src/advanced/Interface.cpp +155 -0
- data/vendor/simpleble/simpledbus/src/advanced/Proxy.cpp +375 -0
- data/vendor/simpleble/simpledbus/src/base/Connection.cpp +222 -0
- data/vendor/simpleble/simpledbus/src/base/Exceptions.cpp +39 -0
- data/vendor/simpleble/simpledbus/src/base/Holder.cpp +739 -0
- data/vendor/simpleble/simpledbus/src/base/Logging.cpp +52 -0
- data/vendor/simpleble/simpledbus/src/base/Message.cpp +622 -0
- data/vendor/simpleble/simpledbus/src/base/Path.cpp +129 -0
- data/vendor/simpleble/simpledbus/src/interfaces/ObjectManager.cpp +58 -0
- data/vendor/simpleble/simpledbus/test/src/helpers/PythonRunner.cpp +53 -0
- data/vendor/simpleble/simpledbus/test/src/helpers/PythonRunner.h +24 -0
- data/vendor/simpleble/simpledbus/test/src/main.cpp +16 -0
- data/vendor/simpleble/simpledbus/test/src/test_holder.cpp +184 -0
- data/vendor/simpleble/simpledbus/test/src/test_message.cpp +397 -0
- data/vendor/simpleble/simpledbus/test/src/test_path.cpp +76 -0
- data/vendor/simpleble/simpledbus/test/src/test_proxy_children.cpp +109 -0
- data/vendor/simpleble/simpledbus/test/src/test_proxy_interfaces.cpp +102 -0
- data/vendor/simpleble/simpledbus/test/src/test_proxy_lifetime.cpp +18 -0
- data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/ThreadRunner.h +89 -0
- data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/android_utils.cpp +55 -0
- data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/android_utils.h +18 -0
- data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/simpleble_android.cpp +813 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/AdapterWrapper.cpp +37 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/AdapterWrapper.h +23 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/Cache.cpp +58 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/Cache.h +34 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/PeripheralWrapper.cpp +17 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/PeripheralWrapper.h +19 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/ArrayList.cpp +257 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/ArrayList.h +78 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/HashMap.cpp +96 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/HashMap.h +54 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/Integer.cpp +93 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/Integer.h +49 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/Iterator.cpp +85 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/Iterator.h +48 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/AdapterCallback.cpp +91 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/AdapterCallback.h +90 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Characteristic.cpp +35 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Characteristic.h +60 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/DataCallback.cpp +33 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/DataCallback.h +45 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Descriptor.cpp +30 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Descriptor.h +49 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/PeripheralCallback.cpp +41 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/PeripheralCallback.h +51 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Service.cpp +33 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Service.h +54 -0
- data/vendor/simpleble/simplejavable/cpp/src/simplejavable.cpp +361 -0
- data/vendor/simpleble/simplepyble/src/main.cpp +55 -0
- data/vendor/simpleble/simplepyble/src/wrap_adapter.cpp +106 -0
- data/vendor/simpleble/simplepyble/src/wrap_characteristic.cpp +56 -0
- data/vendor/simpleble/simplepyble/src/wrap_config.cpp +136 -0
- data/vendor/simpleble/simplepyble/src/wrap_descriptor.cpp +21 -0
- data/vendor/simpleble/simplepyble/src/wrap_peripheral.cpp +217 -0
- data/vendor/simpleble/simplepyble/src/wrap_service.cpp +32 -0
- data/vendor/simpleble/simplepyble/src/wrap_types.cpp +21 -0
- data/vendor/simpleble/simplersble/src/bindings/Bindings.cpp +338 -0
- data/vendor/simpleble/simplersble/src/bindings/Bindings.hpp +178 -0
- metadata +430 -0
@@ -0,0 +1,432 @@
|
|
1
|
+
#include "BluetoothGattCallback.h"
|
2
|
+
#include <CommonUtils.h>
|
3
|
+
|
4
|
+
#include <simplejni/Common.hpp>
|
5
|
+
#include <climits>
|
6
|
+
#include "LoggingInternal.h"
|
7
|
+
|
8
|
+
namespace SimpleBLE {
|
9
|
+
namespace Android {
|
10
|
+
namespace Bridge {
|
11
|
+
|
12
|
+
SimpleJNI::GlobalRef<jclass> BluetoothGattCallback::_cls;
|
13
|
+
jmethodID BluetoothGattCallback::_constructor = nullptr;
|
14
|
+
kvn::safe_map<SimpleJNI::Object<SimpleJNI::GlobalRef, jobject>, BluetoothGattCallback*, SimpleJNI::ObjectComparator<SimpleJNI::GlobalRef, jobject>> BluetoothGattCallback::_map;
|
15
|
+
|
16
|
+
// Define the JNI descriptor
|
17
|
+
const SimpleJNI::JNIDescriptor BluetoothGattCallback::descriptor{
|
18
|
+
"org/simpleble/android/bridge/BluetoothGattCallback", // Java class name
|
19
|
+
&_cls, // Where to store the jclass
|
20
|
+
{ // Methods to preload
|
21
|
+
{"<init>", "()V", &_constructor} // Constructor
|
22
|
+
}};
|
23
|
+
|
24
|
+
const SimpleJNI::AutoRegister<BluetoothGattCallback> BluetoothGattCallback::registrar{&descriptor};
|
25
|
+
|
26
|
+
#define GET_CALLBACK_OBJECT_OR_RETURN(thiz) \
|
27
|
+
({ \
|
28
|
+
auto callback_opt = BluetoothGattCallback::_map.get(thiz); \
|
29
|
+
if (!callback_opt) { \
|
30
|
+
SIMPLEBLE_LOG_FATAL("Failed to find BluetoothGattCallback object. This should never happen."); \
|
31
|
+
return; \
|
32
|
+
} \
|
33
|
+
callback_opt.value(); \
|
34
|
+
})
|
35
|
+
|
36
|
+
BluetoothGattCallback::BluetoothGattCallback() : connected(false), services_discovered(false), mtu(UINT16_MAX) {
|
37
|
+
if (!_cls.get()) {
|
38
|
+
throw std::runtime_error("BluetoothGattCallback JNI resources not preloaded. Ensure SimpleJNI::Registrar::preload() is called.");
|
39
|
+
}
|
40
|
+
|
41
|
+
SimpleJNI::Env env;
|
42
|
+
jobject local_obj = env->NewObject(_cls.get(), _constructor);
|
43
|
+
if (local_obj == nullptr) {
|
44
|
+
throw std::runtime_error("Failed to create BluetoothGattCallback Java instance");
|
45
|
+
}
|
46
|
+
|
47
|
+
_obj = SimpleJNI::Object<SimpleJNI::GlobalRef, jobject>(local_obj);
|
48
|
+
env->DeleteLocalRef(local_obj);
|
49
|
+
|
50
|
+
_map.insert(_obj, this);
|
51
|
+
}
|
52
|
+
|
53
|
+
BluetoothGattCallback::~BluetoothGattCallback() { _map.erase(_obj); }
|
54
|
+
|
55
|
+
void BluetoothGattCallback::set_callback_onConnectionStateChange(std::function<void(bool)> callback) {
|
56
|
+
if (callback) {
|
57
|
+
_callback_onConnectionStateChange.load(callback);
|
58
|
+
} else {
|
59
|
+
_callback_onConnectionStateChange.unload();
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
void BluetoothGattCallback::set_callback_onServicesDiscovered(std::function<void(void)> callback) {
|
64
|
+
if (callback) {
|
65
|
+
_callback_onServicesDiscovered.load(callback);
|
66
|
+
} else {
|
67
|
+
_callback_onServicesDiscovered.unload();
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
void BluetoothGattCallback::set_callback_onCharacteristicChanged(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic,
|
72
|
+
std::function<void(std::vector<uint8_t>)> callback) {
|
73
|
+
if (callback) {
|
74
|
+
_callback_onCharacteristicChanged[characteristic].load(callback);
|
75
|
+
} else {
|
76
|
+
_callback_onCharacteristicChanged[characteristic].unload();
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
void BluetoothGattCallback::clear_callback_onCharacteristicChanged(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic) {
|
81
|
+
_callback_onCharacteristicChanged[characteristic].unload();
|
82
|
+
}
|
83
|
+
|
84
|
+
void BluetoothGattCallback::set_flag_characteristicWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic) {
|
85
|
+
auto& flag_data = _flag_characteristicWritePending[characteristic];
|
86
|
+
|
87
|
+
std::lock_guard<std::mutex> lock(flag_data.mtx);
|
88
|
+
flag_data.flag = true;
|
89
|
+
}
|
90
|
+
|
91
|
+
void BluetoothGattCallback::clear_flag_characteristicWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic) {
|
92
|
+
auto& flag_data = _flag_characteristicWritePending[characteristic];
|
93
|
+
{
|
94
|
+
std::lock_guard<std::mutex> lock(flag_data.mtx);
|
95
|
+
flag_data.flag = false;
|
96
|
+
}
|
97
|
+
flag_data.cv.notify_all();
|
98
|
+
}
|
99
|
+
|
100
|
+
void BluetoothGattCallback::wait_flag_characteristicWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic) {
|
101
|
+
auto& flag_data = _flag_characteristicWritePending[characteristic];
|
102
|
+
std::unique_lock<std::mutex> lock(flag_data.mtx);
|
103
|
+
flag_data.cv.wait_for(lock, std::chrono::seconds(5), [&flag_data] { return !flag_data.flag; });
|
104
|
+
|
105
|
+
if (flag_data.flag) {
|
106
|
+
// Timeout has occurred.
|
107
|
+
throw std::runtime_error("Failed to write characteristic");
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
111
|
+
void BluetoothGattCallback::set_flag_characteristicReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic) {
|
112
|
+
auto& flag_data = _flag_characteristicReadPending[characteristic];
|
113
|
+
|
114
|
+
std::lock_guard<std::mutex> lock(flag_data.mtx);
|
115
|
+
flag_data.flag = true;
|
116
|
+
}
|
117
|
+
|
118
|
+
void BluetoothGattCallback::clear_flag_characteristicReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic,
|
119
|
+
std::vector<uint8_t> value) {
|
120
|
+
auto& flag_data = _flag_characteristicReadPending[characteristic];
|
121
|
+
{
|
122
|
+
std::lock_guard<std::mutex> lock(flag_data.mtx);
|
123
|
+
flag_data.flag = false;
|
124
|
+
flag_data.value = value;
|
125
|
+
}
|
126
|
+
flag_data.cv.notify_all();
|
127
|
+
}
|
128
|
+
|
129
|
+
std::vector<uint8_t> BluetoothGattCallback::wait_flag_characteristicReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic) {
|
130
|
+
auto& flag_data = _flag_characteristicReadPending[characteristic];
|
131
|
+
std::unique_lock<std::mutex> lock(flag_data.mtx);
|
132
|
+
flag_data.cv.wait_for(lock, std::chrono::seconds(5), [&flag_data] { return !flag_data.flag; });
|
133
|
+
|
134
|
+
if (flag_data.flag) {
|
135
|
+
// Timeout has occurred.
|
136
|
+
throw std::runtime_error("Failed to read characteristic");
|
137
|
+
}
|
138
|
+
|
139
|
+
return flag_data.value;
|
140
|
+
}
|
141
|
+
|
142
|
+
void BluetoothGattCallback::set_flag_descriptorWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor) {
|
143
|
+
auto& flag_data = _flag_descriptorWritePending[descriptor];
|
144
|
+
|
145
|
+
std::lock_guard<std::mutex> lock(flag_data.mtx);
|
146
|
+
flag_data.flag = true;
|
147
|
+
}
|
148
|
+
|
149
|
+
void BluetoothGattCallback::clear_flag_descriptorWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor) {
|
150
|
+
auto& flag_data = _flag_descriptorWritePending[descriptor];
|
151
|
+
{
|
152
|
+
std::lock_guard<std::mutex> lock(flag_data.mtx);
|
153
|
+
flag_data.flag = false;
|
154
|
+
}
|
155
|
+
flag_data.cv.notify_all();
|
156
|
+
}
|
157
|
+
|
158
|
+
void BluetoothGattCallback::wait_flag_descriptorWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor) {
|
159
|
+
auto& flag_data = _flag_descriptorWritePending[descriptor];
|
160
|
+
std::unique_lock<std::mutex> lock(flag_data.mtx);
|
161
|
+
flag_data.cv.wait_for(lock, std::chrono::seconds(5), [&flag_data] { return !flag_data.flag; });
|
162
|
+
|
163
|
+
if (flag_data.flag) {
|
164
|
+
// Timeout has occurred.
|
165
|
+
throw std::runtime_error("Failed to write descriptor");
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
void BluetoothGattCallback::set_flag_descriptorReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor) {
|
170
|
+
auto& flag_data = _flag_descriptorReadPending[descriptor];
|
171
|
+
|
172
|
+
std::lock_guard<std::mutex> lock(flag_data.mtx);
|
173
|
+
flag_data.flag = true;
|
174
|
+
}
|
175
|
+
|
176
|
+
void BluetoothGattCallback::clear_flag_descriptorReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor, std::vector<uint8_t> value) {
|
177
|
+
auto& flag_data = _flag_descriptorReadPending[descriptor];
|
178
|
+
{
|
179
|
+
std::lock_guard<std::mutex> lock(flag_data.mtx);
|
180
|
+
flag_data.flag = false;
|
181
|
+
flag_data.value = value;
|
182
|
+
}
|
183
|
+
flag_data.cv.notify_all();
|
184
|
+
}
|
185
|
+
|
186
|
+
std::vector<uint8_t> BluetoothGattCallback::wait_flag_descriptorReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor) {
|
187
|
+
auto& flag_data = _flag_descriptorReadPending[descriptor];
|
188
|
+
std::unique_lock<std::mutex> lock(flag_data.mtx);
|
189
|
+
flag_data.cv.wait_for(lock, std::chrono::seconds(5), [&flag_data] { return !flag_data.flag; });
|
190
|
+
|
191
|
+
if (flag_data.flag) {
|
192
|
+
// Timeout has occurred.
|
193
|
+
throw std::runtime_error("Failed to read descriptor");
|
194
|
+
}
|
195
|
+
|
196
|
+
return flag_data.value;
|
197
|
+
}
|
198
|
+
|
199
|
+
// JNI Callbacks
|
200
|
+
|
201
|
+
void BluetoothGattCallback::jni_onConnectionStateChangeCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint status, jint new_state) {
|
202
|
+
auto msg = fmt::format("onConnectionStateChangeCallback status: {} new_state: {}", status, new_state);
|
203
|
+
SIMPLEBLE_LOG_INFO(msg);
|
204
|
+
|
205
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
206
|
+
const bool connected = new_state == 2;
|
207
|
+
obj->connected = connected;
|
208
|
+
SAFE_CALLBACK_CALL(obj->_callback_onConnectionStateChange, connected);
|
209
|
+
}
|
210
|
+
|
211
|
+
void BluetoothGattCallback::jni_onServicesDiscoveredCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint status) {
|
212
|
+
auto msg = "onServicesDiscoveredCallback";
|
213
|
+
SIMPLEBLE_LOG_INFO(msg);
|
214
|
+
|
215
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
216
|
+
obj->services_discovered = true;
|
217
|
+
SAFE_CALLBACK_CALL(obj->_callback_onServicesDiscovered);
|
218
|
+
}
|
219
|
+
|
220
|
+
void BluetoothGattCallback::jni_onServiceChangedCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj) {
|
221
|
+
// NOTE: If this one gets triggered we're kinda screwed.
|
222
|
+
auto msg = "onServiceChangedCallback";
|
223
|
+
SIMPLEBLE_LOG_INFO(msg);
|
224
|
+
|
225
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
226
|
+
}
|
227
|
+
|
228
|
+
void BluetoothGattCallback::jni_onCharacteristicChangedCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic_obj,
|
229
|
+
SimpleJNI::ByteArray<SimpleJNI::GlobalRef> value) {
|
230
|
+
auto msg = "onCharacteristicChangedCallback with value: " + value.bytes().toHex(true);
|
231
|
+
SIMPLEBLE_LOG_INFO(msg);
|
232
|
+
|
233
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
234
|
+
auto& callback = obj->_callback_onCharacteristicChanged[characteristic_obj];
|
235
|
+
if (callback) {
|
236
|
+
SAFE_CALLBACK_CALL(callback, value.bytes());
|
237
|
+
}
|
238
|
+
}
|
239
|
+
|
240
|
+
void BluetoothGattCallback::jni_onCharacteristicReadCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic_obj,
|
241
|
+
SimpleJNI::ByteArray<SimpleJNI::GlobalRef> value, jint status) {
|
242
|
+
auto msg = "onCharacteristicReadCallback";
|
243
|
+
SIMPLEBLE_LOG_INFO(msg);
|
244
|
+
|
245
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
246
|
+
obj->clear_flag_characteristicReadPending(characteristic_obj, value.bytes());
|
247
|
+
}
|
248
|
+
|
249
|
+
void BluetoothGattCallback::jni_onCharacteristicWriteCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic_obj,
|
250
|
+
jint status) {
|
251
|
+
auto msg = "onCharacteristicWriteCallback";
|
252
|
+
SIMPLEBLE_LOG_INFO(msg);
|
253
|
+
|
254
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
255
|
+
obj->clear_flag_characteristicWritePending(characteristic_obj);
|
256
|
+
}
|
257
|
+
|
258
|
+
void BluetoothGattCallback::jni_onDescriptorReadCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor_obj,
|
259
|
+
SimpleJNI::ByteArray<SimpleJNI::GlobalRef> value, jint status) {
|
260
|
+
auto msg = "onDescriptorReadCallback";
|
261
|
+
SIMPLEBLE_LOG_INFO(msg);
|
262
|
+
|
263
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
264
|
+
obj->clear_flag_descriptorReadPending(descriptor_obj, value.bytes());
|
265
|
+
}
|
266
|
+
|
267
|
+
void BluetoothGattCallback::jni_onDescriptorWriteCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor_obj,
|
268
|
+
jint status) {
|
269
|
+
auto msg = "onDescriptorWriteCallback";
|
270
|
+
SIMPLEBLE_LOG_INFO(msg);
|
271
|
+
|
272
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
273
|
+
obj->clear_flag_descriptorWritePending(descriptor_obj);
|
274
|
+
}
|
275
|
+
|
276
|
+
void BluetoothGattCallback::jni_onMtuChangedCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint mtu, jint status) {
|
277
|
+
auto msg = "onMtuChangedCallback";
|
278
|
+
SIMPLEBLE_LOG_INFO(msg);
|
279
|
+
|
280
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
281
|
+
obj->mtu = mtu;
|
282
|
+
}
|
283
|
+
|
284
|
+
void BluetoothGattCallback::jni_onPhyReadCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint tx_phy, jint rx_phy, jint status) {
|
285
|
+
auto msg = "onPhyReadCallback";
|
286
|
+
SIMPLEBLE_LOG_INFO(msg);
|
287
|
+
|
288
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
289
|
+
}
|
290
|
+
|
291
|
+
void BluetoothGattCallback::jni_onPhyUpdateCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint tx_phy, jint rx_phy, jint status) {
|
292
|
+
auto msg = "onPhyUpdateCallback";
|
293
|
+
SIMPLEBLE_LOG_INFO(msg);
|
294
|
+
|
295
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
296
|
+
}
|
297
|
+
|
298
|
+
void BluetoothGattCallback::jni_onReadRemoteRssiCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint rssi, jint status) {
|
299
|
+
auto msg = "onReadRemoteRssiCallback";
|
300
|
+
SIMPLEBLE_LOG_INFO(msg);
|
301
|
+
|
302
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
303
|
+
}
|
304
|
+
|
305
|
+
void BluetoothGattCallback::jni_onReliableWriteCompletedCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint status) {
|
306
|
+
auto msg = "onReliableWriteCompletedCallback";
|
307
|
+
SIMPLEBLE_LOG_INFO(msg);
|
308
|
+
|
309
|
+
BluetoothGattCallback* obj = GET_CALLBACK_OBJECT_OR_RETURN(thiz_obj);
|
310
|
+
}
|
311
|
+
|
312
|
+
} // namespace Bridge
|
313
|
+
} // namespace Android
|
314
|
+
} // namespace SimpleBLE
|
315
|
+
|
316
|
+
extern "C" {
|
317
|
+
// clang-format off
|
318
|
+
|
319
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onConnectionStateChangeCallback(
|
320
|
+
JNIEnv* env, jobject thiz, jobject gatt, jint status, jint new_state) {
|
321
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
322
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, status, new_state]() {
|
323
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onConnectionStateChangeCallback(thiz_obj, status, new_state);
|
324
|
+
});
|
325
|
+
}
|
326
|
+
|
327
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onServicesDiscoveredCallback(
|
328
|
+
JNIEnv* env, jobject thiz, jobject gatt, jint status) {
|
329
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
330
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, status]() {
|
331
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onServicesDiscoveredCallback(thiz_obj, status);
|
332
|
+
});
|
333
|
+
}
|
334
|
+
|
335
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onServiceChangedCallback(
|
336
|
+
JNIEnv* env, jobject thiz, jobject gatt) {
|
337
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
338
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj]() {
|
339
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onServiceChangedCallback(thiz_obj);
|
340
|
+
});
|
341
|
+
}
|
342
|
+
|
343
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onCharacteristicChangedCallback(
|
344
|
+
JNIEnv* env, jobject thiz, jobject gatt, jobject characteristic, jbyteArray value) {
|
345
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
346
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic_obj(characteristic);
|
347
|
+
SimpleJNI::ByteArray<SimpleJNI::GlobalRef> value_obj(value);
|
348
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, characteristic_obj, value_obj]() {
|
349
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onCharacteristicChangedCallback(thiz_obj, characteristic_obj, value_obj);
|
350
|
+
});
|
351
|
+
}
|
352
|
+
|
353
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onCharacteristicReadCallback(
|
354
|
+
JNIEnv* env, jobject thiz, jobject gatt, jobject characteristic, jbyteArray value, jint status) {
|
355
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
356
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic_obj(characteristic);
|
357
|
+
SimpleJNI::ByteArray<SimpleJNI::GlobalRef> value_obj(value);
|
358
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, characteristic_obj, value_obj, status]() {
|
359
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onCharacteristicReadCallback(thiz_obj, characteristic_obj, value_obj, status);
|
360
|
+
});
|
361
|
+
}
|
362
|
+
|
363
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onCharacteristicWriteCallback(
|
364
|
+
JNIEnv* env, jobject thiz, jobject gatt, jobject characteristic, jint status) {
|
365
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
366
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic_obj(characteristic);
|
367
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, characteristic_obj, status]() {
|
368
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onCharacteristicWriteCallback(thiz_obj, characteristic_obj, status);
|
369
|
+
});
|
370
|
+
}
|
371
|
+
|
372
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onDescriptorReadCallback(
|
373
|
+
JNIEnv* env, jobject thiz, jobject gatt, jobject descriptor, jbyteArray value, jint status) {
|
374
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
375
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor_obj(descriptor);
|
376
|
+
SimpleJNI::ByteArray<SimpleJNI::GlobalRef> value_obj(value);
|
377
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, descriptor_obj, value_obj, status]() {
|
378
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onDescriptorReadCallback(thiz_obj, descriptor_obj, value_obj, status);
|
379
|
+
});
|
380
|
+
}
|
381
|
+
|
382
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onDescriptorWriteCallback(
|
383
|
+
JNIEnv* env, jobject thiz, jobject gatt, jobject descriptor, jint status) {
|
384
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
385
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor_obj(descriptor);
|
386
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, descriptor_obj, status]() {
|
387
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onDescriptorWriteCallback(thiz_obj, descriptor_obj, status);
|
388
|
+
});
|
389
|
+
}
|
390
|
+
|
391
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onMtuChangedCallback(
|
392
|
+
JNIEnv* env, jobject thiz, jobject gatt, jint mtu, jint status) {
|
393
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
394
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, mtu, status]() {
|
395
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onMtuChangedCallback(thiz_obj, mtu, status);
|
396
|
+
});
|
397
|
+
}
|
398
|
+
|
399
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onPhyReadCallback(
|
400
|
+
JNIEnv* env, jobject thiz, jobject gatt, jint tx_phy, jint rx_phy, jint status) {
|
401
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
402
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, tx_phy, rx_phy, status]() {
|
403
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onPhyReadCallback(thiz_obj, tx_phy, rx_phy, status);
|
404
|
+
});
|
405
|
+
}
|
406
|
+
|
407
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onPhyUpdateCallback(
|
408
|
+
JNIEnv* env, jobject thiz, jobject gatt, jint tx_phy, jint rx_phy, jint status) {
|
409
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
410
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, tx_phy, rx_phy, status]() {
|
411
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onPhyUpdateCallback(thiz_obj, tx_phy, rx_phy, status);
|
412
|
+
});
|
413
|
+
}
|
414
|
+
|
415
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onReadRemoteRssiCallback(
|
416
|
+
JNIEnv* env, jobject thiz, jobject gatt, jint rssi, jint status) {
|
417
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
418
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, rssi, status]() {
|
419
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onReadRemoteRssiCallback(thiz_obj, rssi, status);
|
420
|
+
});
|
421
|
+
}
|
422
|
+
|
423
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_BluetoothGattCallback_onReliableWriteCompletedCallback(
|
424
|
+
JNIEnv* env, jobject thiz, jobject gatt, jint status) {
|
425
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
426
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, status]() {
|
427
|
+
SimpleBLE::Android::Bridge::BluetoothGattCallback::jni_onReliableWriteCompletedCallback(thiz_obj, status);
|
428
|
+
});
|
429
|
+
}
|
430
|
+
|
431
|
+
// clang-format on
|
432
|
+
} // extern "C"
|
@@ -0,0 +1,102 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <atomic>
|
4
|
+
#include <condition_variable>
|
5
|
+
#include <kvn_safe_callback.hpp>
|
6
|
+
#include <kvn_safe_map.hpp>
|
7
|
+
#include <map>
|
8
|
+
#include <mutex>
|
9
|
+
#include "simplejni/Common.hpp"
|
10
|
+
#include "simplejni/Registry.hpp"
|
11
|
+
|
12
|
+
namespace SimpleBLE {
|
13
|
+
namespace Android {
|
14
|
+
namespace Bridge {
|
15
|
+
|
16
|
+
class BluetoothGattCallback {
|
17
|
+
public:
|
18
|
+
BluetoothGattCallback();
|
19
|
+
virtual ~BluetoothGattCallback();
|
20
|
+
jobject get() const { return _obj.get(); } // TODO: Remove once nothing uses this
|
21
|
+
|
22
|
+
void set_callback_onConnectionStateChange(std::function<void(bool)> callback);
|
23
|
+
void set_callback_onServicesDiscovered(std::function<void(void)> callback);
|
24
|
+
|
25
|
+
void set_callback_onCharacteristicChanged(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic,
|
26
|
+
std::function<void(std::vector<uint8_t> value)> callback);
|
27
|
+
void clear_callback_onCharacteristicChanged(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic);
|
28
|
+
|
29
|
+
void set_flag_characteristicWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic);
|
30
|
+
void clear_flag_characteristicWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic);
|
31
|
+
void wait_flag_characteristicWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic);
|
32
|
+
|
33
|
+
void set_flag_characteristicReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic);
|
34
|
+
void clear_flag_characteristicReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic, std::vector<uint8_t> value);
|
35
|
+
std::vector<uint8_t> wait_flag_characteristicReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic);
|
36
|
+
|
37
|
+
void set_flag_descriptorWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor);
|
38
|
+
void clear_flag_descriptorWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor);
|
39
|
+
void wait_flag_descriptorWritePending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor);
|
40
|
+
|
41
|
+
void set_flag_descriptorReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor);
|
42
|
+
void clear_flag_descriptorReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor, std::vector<uint8_t> value);
|
43
|
+
std::vector<uint8_t> wait_flag_descriptorReadPending(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor);
|
44
|
+
|
45
|
+
bool connected;
|
46
|
+
bool services_discovered;
|
47
|
+
uint16_t mtu;
|
48
|
+
|
49
|
+
// Not for public use
|
50
|
+
// clang-format off
|
51
|
+
static void jni_onConnectionStateChangeCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint status, jint new_state);
|
52
|
+
static void jni_onServicesDiscoveredCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint status);
|
53
|
+
static void jni_onServiceChangedCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj);
|
54
|
+
|
55
|
+
static void jni_onCharacteristicChangedCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic_obj, SimpleJNI::ByteArray<SimpleJNI::GlobalRef> value);
|
56
|
+
static void jni_onCharacteristicReadCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic_obj, SimpleJNI::ByteArray<SimpleJNI::GlobalRef> value, jint status);
|
57
|
+
static void jni_onCharacteristicWriteCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> characteristic_obj, jint status);
|
58
|
+
|
59
|
+
static void jni_onDescriptorReadCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor_obj, SimpleJNI::ByteArray<SimpleJNI::GlobalRef> value, jint status);
|
60
|
+
static void jni_onDescriptorWriteCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> descriptor_obj, jint status);
|
61
|
+
|
62
|
+
static void jni_onMtuChangedCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint mtu, jint status);
|
63
|
+
static void jni_onPhyReadCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint txPhy, jint rxPhy, jint status);
|
64
|
+
static void jni_onPhyUpdateCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint txPhy, jint rxPhy, jint status);
|
65
|
+
static void jni_onReadRemoteRssiCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint rssi, jint status);
|
66
|
+
static void jni_onReliableWriteCompletedCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj, jint status);
|
67
|
+
// clang-format on
|
68
|
+
|
69
|
+
private:
|
70
|
+
struct FlagData {
|
71
|
+
bool flag = false;
|
72
|
+
std::condition_variable cv;
|
73
|
+
std::mutex mtx;
|
74
|
+
std::vector<uint8_t> value;
|
75
|
+
};
|
76
|
+
|
77
|
+
static SimpleJNI::GlobalRef<jclass> _cls;
|
78
|
+
static jmethodID _constructor;
|
79
|
+
|
80
|
+
static kvn::safe_map<SimpleJNI::Object<SimpleJNI::GlobalRef, jobject>, BluetoothGattCallback*, SimpleJNI::ObjectComparator<SimpleJNI::GlobalRef, jobject>> _map;
|
81
|
+
|
82
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> _obj;
|
83
|
+
|
84
|
+
kvn::safe_callback<void(bool)> _callback_onConnectionStateChange;
|
85
|
+
kvn::safe_callback<void()> _callback_onServicesDiscovered;
|
86
|
+
|
87
|
+
kvn::safe_map<SimpleJNI::Object<SimpleJNI::GlobalRef, jobject>, kvn::safe_callback<void(std::vector<uint8_t>)>, SimpleJNI::ObjectComparator<SimpleJNI::GlobalRef, jobject>>
|
88
|
+
_callback_onCharacteristicChanged;
|
89
|
+
|
90
|
+
kvn::safe_map<SimpleJNI::Object<SimpleJNI::GlobalRef, jobject>, FlagData, SimpleJNI::ObjectComparator<SimpleJNI::GlobalRef, jobject>> _flag_characteristicWritePending;
|
91
|
+
kvn::safe_map<SimpleJNI::Object<SimpleJNI::GlobalRef, jobject>, FlagData, SimpleJNI::ObjectComparator<SimpleJNI::GlobalRef, jobject>> _flag_characteristicReadPending;
|
92
|
+
kvn::safe_map<SimpleJNI::Object<SimpleJNI::GlobalRef, jobject>, FlagData, SimpleJNI::ObjectComparator<SimpleJNI::GlobalRef, jobject>> _flag_descriptorWritePending;
|
93
|
+
kvn::safe_map<SimpleJNI::Object<SimpleJNI::GlobalRef, jobject>, FlagData, SimpleJNI::ObjectComparator<SimpleJNI::GlobalRef, jobject>> _flag_descriptorReadPending;
|
94
|
+
|
95
|
+
// Static JNI resources managed by Registrar
|
96
|
+
static const SimpleJNI::JNIDescriptor descriptor;
|
97
|
+
static const SimpleJNI::AutoRegister<BluetoothGattCallback> registrar;
|
98
|
+
};
|
99
|
+
|
100
|
+
} // namespace Bridge
|
101
|
+
} // namespace Android
|
102
|
+
} // namespace SimpleBLE
|
@@ -0,0 +1,142 @@
|
|
1
|
+
#include "ScanCallback.h"
|
2
|
+
#include <CommonUtils.h>
|
3
|
+
#include <android/log.h>
|
4
|
+
#include <fmt/format.h>
|
5
|
+
|
6
|
+
namespace SimpleBLE {
|
7
|
+
namespace Android {
|
8
|
+
namespace Bridge {
|
9
|
+
|
10
|
+
// Define static JNI resources
|
11
|
+
SimpleJNI::GlobalRef<jclass> ScanCallback::_cls;
|
12
|
+
jmethodID ScanCallback::_constructor = nullptr;
|
13
|
+
|
14
|
+
// Define the JNI descriptor
|
15
|
+
const SimpleJNI::JNIDescriptor ScanCallback::descriptor{
|
16
|
+
"org/simpleble/android/bridge/ScanCallback", // Java class name
|
17
|
+
&_cls, // Where to store the jclass
|
18
|
+
{ // Methods to preload
|
19
|
+
{"<init>", "()V", &_constructor} // Constructor
|
20
|
+
}};
|
21
|
+
|
22
|
+
const SimpleJNI::AutoRegister<ScanCallback> ScanCallback::registrar{&descriptor};
|
23
|
+
|
24
|
+
kvn::safe_map<SimpleJNI::Object<SimpleJNI::GlobalRef, jobject>, ScanCallback*,
|
25
|
+
SimpleJNI::ObjectComparator<SimpleJNI::GlobalRef, jobject>>
|
26
|
+
ScanCallback::_map;
|
27
|
+
|
28
|
+
ScanCallback::ScanCallback() : _obj() {
|
29
|
+
if (!_cls.get()) {
|
30
|
+
throw std::runtime_error("ScanCallback JNI resources not preloaded. Ensure SimpleJNI::Registrar::preload() is called.");
|
31
|
+
}
|
32
|
+
|
33
|
+
SimpleJNI::Env env;
|
34
|
+
jobject local_obj = env->NewObject(_cls.get(), _constructor);
|
35
|
+
if (local_obj == nullptr) {
|
36
|
+
throw std::runtime_error("Failed to create ScanCallback Java instance");
|
37
|
+
}
|
38
|
+
|
39
|
+
_obj = SimpleJNI::Object<SimpleJNI::GlobalRef, jobject>(local_obj);
|
40
|
+
env->DeleteLocalRef(local_obj);
|
41
|
+
|
42
|
+
ScanCallback::_map.insert(_obj, this);
|
43
|
+
}
|
44
|
+
|
45
|
+
ScanCallback::~ScanCallback() { ScanCallback::_map.erase(_obj); }
|
46
|
+
|
47
|
+
void ScanCallback::set_callback_onScanResult(std::function<void(Android::ScanResult)> callback) {
|
48
|
+
if (callback) {
|
49
|
+
_callback_onScanResult.load(callback);
|
50
|
+
} else {
|
51
|
+
_callback_onScanResult.unload();
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
void ScanCallback::set_callback_onBatchScanResults(std::function<void()> callback) {
|
56
|
+
if (callback) {
|
57
|
+
_callback_onBatchScanResults.load(callback);
|
58
|
+
} else {
|
59
|
+
_callback_onBatchScanResults.unload();
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
void ScanCallback::set_callback_onScanFailed(std::function<void()> callback) {
|
64
|
+
if (callback) {
|
65
|
+
_callback_onScanFailed.load(callback);
|
66
|
+
} else {
|
67
|
+
_callback_onScanFailed.unload();
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
void ScanCallback::jni_onScanResultCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz, jint callback_type,
|
72
|
+
SimpleBLE::Android::ScanResult scan_result) {
|
73
|
+
auto callback_opt = ScanCallback::_map.get(thiz);
|
74
|
+
if (!callback_opt) {
|
75
|
+
SIMPLEBLE_LOG_FATAL("Failed to find ScanCallback object. This should never happen.");
|
76
|
+
// TODO: Throw an exception
|
77
|
+
return;
|
78
|
+
}
|
79
|
+
|
80
|
+
ScanCallback* obj = callback_opt.value();
|
81
|
+
|
82
|
+
auto msg = fmt::format("onScanResultCallback: {}", scan_result.toString());
|
83
|
+
__android_log_write(ANDROID_LOG_DEBUG, "SimpleBLE", msg.c_str());
|
84
|
+
|
85
|
+
SAFE_CALLBACK_CALL(obj->_callback_onScanResult, scan_result);
|
86
|
+
}
|
87
|
+
|
88
|
+
void ScanCallback::jni_onBatchScanResultsCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz,
|
89
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> results) {
|
90
|
+
auto callback_opt = ScanCallback::_map.get(thiz);
|
91
|
+
if (!callback_opt) {
|
92
|
+
SIMPLEBLE_LOG_FATAL("Failed to find ScanCallback object. This should never happen.");
|
93
|
+
// TODO: Throw an exception
|
94
|
+
return;
|
95
|
+
}
|
96
|
+
|
97
|
+
__android_log_write(ANDROID_LOG_DEBUG, "SimpleBLE", "onBatchScanResultsCallback");
|
98
|
+
// TODO: Implement
|
99
|
+
}
|
100
|
+
|
101
|
+
void ScanCallback::jni_onScanFailedCallback(SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz, jint error_code) {
|
102
|
+
auto callback_opt = ScanCallback::_map.get(thiz);
|
103
|
+
if (!callback_opt) {
|
104
|
+
SIMPLEBLE_LOG_FATAL("Failed to find ScanCallback object. This should never happen.");
|
105
|
+
// TODO: Throw an exception
|
106
|
+
return;
|
107
|
+
}
|
108
|
+
|
109
|
+
__android_log_write(ANDROID_LOG_DEBUG, "SimpleBLE", "onScanFailedCallback");
|
110
|
+
// TODO: Implement
|
111
|
+
}
|
112
|
+
} // namespace Bridge
|
113
|
+
} // namespace Android
|
114
|
+
} // namespace SimpleBLE
|
115
|
+
|
116
|
+
extern "C" {
|
117
|
+
// clang-format off
|
118
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_ScanCallback_onScanResultCallback(JNIEnv *env, jobject thiz, jint callback_type, jobject result) {
|
119
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
120
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> result_obj(result);
|
121
|
+
SimpleBLE::Android::ScanResult scan_result(result_obj);
|
122
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, callback_type, scan_result]() {
|
123
|
+
SimpleBLE::Android::Bridge::ScanCallback::jni_onScanResultCallback(thiz_obj, callback_type, scan_result);
|
124
|
+
});
|
125
|
+
}
|
126
|
+
|
127
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_ScanCallback_onScanFailedCallback(JNIEnv *env, jobject thiz, jint error_code) {
|
128
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
129
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, error_code]() {
|
130
|
+
SimpleBLE::Android::Bridge::ScanCallback::jni_onScanFailedCallback(thiz_obj, error_code);
|
131
|
+
});
|
132
|
+
}
|
133
|
+
|
134
|
+
JNIEXPORT void JNICALL Java_org_simpleble_android_bridge_ScanCallback_onBatchScanResultsCallback(JNIEnv *env, jobject thiz, jobject results) {
|
135
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> thiz_obj(thiz);
|
136
|
+
SimpleJNI::Object<SimpleJNI::GlobalRef, jobject> results_obj(results);
|
137
|
+
SimpleJNI::Runner::get().enqueue([thiz_obj, results_obj]() {
|
138
|
+
SimpleBLE::Android::Bridge::ScanCallback::jni_onBatchScanResultsCallback(thiz_obj, results_obj);
|
139
|
+
});
|
140
|
+
}
|
141
|
+
// clang-format on
|
142
|
+
}
|