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.
Files changed (341) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +88 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +350 -0
  5. data/ext/simpleble/extconf.rb +57 -0
  6. data/ext/simpleble/simpleble_ruby.c +682 -0
  7. data/lib/simpleble/adapter.rb +10 -0
  8. data/lib/simpleble/characteristic.rb +36 -0
  9. data/lib/simpleble/descriptor.rb +8 -0
  10. data/lib/simpleble/exceptions.rb +25 -0
  11. data/lib/simpleble/peripheral.rb +64 -0
  12. data/lib/simpleble/service.rb +16 -0
  13. data/lib/simpleble/version.rb +3 -0
  14. data/lib/simpleble.rb +40 -0
  15. data/vendor/simpleble/build_simplecble/CMakeFiles/4.0.3/CompilerIdCXX/CMakeCXXCompilerId.cpp +920 -0
  16. data/vendor/simpleble/build_simplecble/CMakeFiles/4.0.3/CompilerIdCXX/apple-sdk.cpp +1 -0
  17. data/vendor/simpleble/build_simplecble/CMakeFiles/4.1.0/CompilerIdCXX/CMakeCXXCompilerId.cpp +949 -0
  18. data/vendor/simpleble/build_simplecble/CMakeFiles/4.1.0/CompilerIdCXX/apple-sdk.cpp +1 -0
  19. data/vendor/simpleble/build_simplecble/export/simplecble/export.h +43 -0
  20. data/vendor/simpleble/build_simplecble/simpleble/export/simpleble/export.h +43 -0
  21. data/vendor/simpleble/dependencies/external/kvn/kvn_bytearray.h +222 -0
  22. data/vendor/simpleble/dependencies/external/kvn/kvn_safe_callback.hpp +66 -0
  23. data/vendor/simpleble/dependencies/external/kvn/logfwd.hpp +35 -0
  24. data/vendor/simpleble/dependencies/internal/fmt/args.h +220 -0
  25. data/vendor/simpleble/dependencies/internal/fmt/base.h +2962 -0
  26. data/vendor/simpleble/dependencies/internal/fmt/chrono.h +2338 -0
  27. data/vendor/simpleble/dependencies/internal/fmt/color.h +610 -0
  28. data/vendor/simpleble/dependencies/internal/fmt/compile.h +539 -0
  29. data/vendor/simpleble/dependencies/internal/fmt/core.h +5 -0
  30. data/vendor/simpleble/dependencies/internal/fmt/format-inl.h +1949 -0
  31. data/vendor/simpleble/dependencies/internal/fmt/format.h +4244 -0
  32. data/vendor/simpleble/dependencies/internal/fmt/os.h +427 -0
  33. data/vendor/simpleble/dependencies/internal/fmt/ostream.h +166 -0
  34. data/vendor/simpleble/dependencies/internal/fmt/printf.h +633 -0
  35. data/vendor/simpleble/dependencies/internal/fmt/ranges.h +850 -0
  36. data/vendor/simpleble/dependencies/internal/fmt/std.h +726 -0
  37. data/vendor/simpleble/dependencies/internal/fmt/xchar.h +373 -0
  38. data/vendor/simpleble/dependencies/internal/simplejni/Common.hpp +579 -0
  39. data/vendor/simpleble/dependencies/internal/simplejni/References.hpp +151 -0
  40. data/vendor/simpleble/dependencies/internal/simplejni/Registry.hpp +183 -0
  41. data/vendor/simpleble/dependencies/internal/simplejni/VM.hpp +88 -0
  42. data/vendor/simpleble/examples/simpleble/src/connect.cpp +67 -0
  43. data/vendor/simpleble/examples/simpleble/src/connect_safe.cpp +91 -0
  44. data/vendor/simpleble/examples/simpleble/src/list_adapters.cpp +22 -0
  45. data/vendor/simpleble/examples/simpleble/src/list_adapters_safe.cpp +33 -0
  46. data/vendor/simpleble/examples/simpleble/src/list_paired.cpp +27 -0
  47. data/vendor/simpleble/examples/simpleble/src/multiconnect.cpp +60 -0
  48. data/vendor/simpleble/examples/simpleble/src/notify.cpp +85 -0
  49. data/vendor/simpleble/examples/simpleble/src/notify_multi.cpp +101 -0
  50. data/vendor/simpleble/examples/simpleble/src/power_cycle.cpp +43 -0
  51. data/vendor/simpleble/examples/simpleble/src/read.cpp +82 -0
  52. data/vendor/simpleble/examples/simpleble/src/scan.cpp +62 -0
  53. data/vendor/simpleble/examples/simpleble/src/utils.cpp +59 -0
  54. data/vendor/simpleble/examples/simpleble/src/utils.hpp +27 -0
  55. data/vendor/simpleble/examples/simpleble/src/write.cpp +81 -0
  56. data/vendor/simpleble/examples/simplebluez/ble_nus/ble_nus.cpp +138 -0
  57. data/vendor/simpleble/examples/simplebluez/connect/connect.cpp +119 -0
  58. data/vendor/simpleble/examples/simplebluez/list_adapters/list_adapters.cpp +44 -0
  59. data/vendor/simpleble/examples/simplebluez/list_paired/list_paired.cpp +48 -0
  60. data/vendor/simpleble/examples/simplebluez/notify/notify.cpp +145 -0
  61. data/vendor/simpleble/examples/simplebluez/pair/pair.cpp +181 -0
  62. data/vendor/simpleble/examples/simplebluez/read/read.cpp +141 -0
  63. data/vendor/simpleble/examples/simplebluez/scan/scan.cpp +85 -0
  64. data/vendor/simpleble/examples/simplecble/c/connect.c +163 -0
  65. data/vendor/simpleble/examples/simplecble/c/notify.c +217 -0
  66. data/vendor/simpleble/examples/simplecble/c/scan.c +164 -0
  67. data/vendor/simpleble/examples/simpledbus/notification.cpp +24 -0
  68. data/vendor/simpleble/hitl/src/test_sanity.cpp +48 -0
  69. data/vendor/simpleble/install_simplecble/include/simpleble/Adapter.h +102 -0
  70. data/vendor/simpleble/install_simplecble/include/simpleble/AdapterSafe.h +58 -0
  71. data/vendor/simpleble/install_simplecble/include/simpleble/Advanced.h +50 -0
  72. data/vendor/simpleble/install_simplecble/include/simpleble/Characteristic.h +39 -0
  73. data/vendor/simpleble/install_simplecble/include/simpleble/Config.h +55 -0
  74. data/vendor/simpleble/install_simplecble/include/simpleble/Descriptor.h +30 -0
  75. data/vendor/simpleble/install_simplecble/include/simpleble/Exceptions.h +72 -0
  76. data/vendor/simpleble/install_simplecble/include/simpleble/Logging.h +73 -0
  77. data/vendor/simpleble/install_simplecble/include/simpleble/Peripheral.h +82 -0
  78. data/vendor/simpleble/install_simplecble/include/simpleble/PeripheralSafe.h +64 -0
  79. data/vendor/simpleble/install_simplecble/include/simpleble/Service.h +34 -0
  80. data/vendor/simpleble/install_simplecble/include/simpleble/SimpleBLE.h +8 -0
  81. data/vendor/simpleble/install_simplecble/include/simpleble/Types.h +49 -0
  82. data/vendor/simpleble/install_simplecble/include/simpleble/Utils.h +13 -0
  83. data/vendor/simpleble/install_simplecble/include/simpleble/export.h +43 -0
  84. data/vendor/simpleble/install_simplecble/include/simpleble/kvn/kvn_bytearray.h +222 -0
  85. data/vendor/simpleble/install_simplecble/include/simplecble/adapter.h +188 -0
  86. data/vendor/simpleble/install_simplecble/include/simplecble/logging.h +37 -0
  87. data/vendor/simpleble/install_simplecble/include/simplecble/peripheral.h +304 -0
  88. data/vendor/simpleble/install_simplecble/include/simplecble/simpleble.h +21 -0
  89. data/vendor/simpleble/install_simplecble/include/simplecble/types.h +73 -0
  90. data/vendor/simpleble/install_simplecble/include/simplecble/utils.h +27 -0
  91. data/vendor/simpleble/simpleble/include/simpleble/Adapter.h +102 -0
  92. data/vendor/simpleble/simpleble/include/simpleble/AdapterSafe.h +58 -0
  93. data/vendor/simpleble/simpleble/include/simpleble/Characteristic.h +39 -0
  94. data/vendor/simpleble/simpleble/include/simpleble/Config.h +55 -0
  95. data/vendor/simpleble/simpleble/include/simpleble/Descriptor.h +30 -0
  96. data/vendor/simpleble/simpleble/include/simpleble/Exceptions.h +72 -0
  97. data/vendor/simpleble/simpleble/include/simpleble/Logging.h +73 -0
  98. data/vendor/simpleble/simpleble/include/simpleble/Peripheral.h +82 -0
  99. data/vendor/simpleble/simpleble/include/simpleble/PeripheralSafe.h +64 -0
  100. data/vendor/simpleble/simpleble/include/simpleble/Service.h +34 -0
  101. data/vendor/simpleble/simpleble/include/simpleble/SimpleBLE.h +8 -0
  102. data/vendor/simpleble/simpleble/include/simpleble/Types.h +49 -0
  103. data/vendor/simpleble/simpleble/include/simpleble/Utils.h +13 -0
  104. data/vendor/simpleble/simpleble/include/simpleble_c/adapter.h +188 -0
  105. data/vendor/simpleble/simpleble/include/simpleble_c/logging.h +37 -0
  106. data/vendor/simpleble/simpleble/include/simpleble_c/peripheral.h +304 -0
  107. data/vendor/simpleble/simpleble/include/simpleble_c/simpleble.h +21 -0
  108. data/vendor/simpleble/simpleble/include/simpleble_c/types.h +73 -0
  109. data/vendor/simpleble/simpleble/include/simpleble_c/utils.h +27 -0
  110. data/vendor/simpleble/simpleble/src/CommonUtils.h +63 -0
  111. data/vendor/simpleble/simpleble/src/Exceptions.cpp +31 -0
  112. data/vendor/simpleble/simpleble/src/Logging.cpp +136 -0
  113. data/vendor/simpleble/simpleble/src/LoggingInternal.h +85 -0
  114. data/vendor/simpleble/simpleble/src/Utils.cpp +24 -0
  115. data/vendor/simpleble/simpleble/src/backends/android/AdapterAndroid.cpp +101 -0
  116. data/vendor/simpleble/simpleble/src/backends/android/AdapterAndroid.h +70 -0
  117. data/vendor/simpleble/simpleble/src/backends/android/BackendAndroid.cpp +40 -0
  118. data/vendor/simpleble/simpleble/src/backends/android/BackendAndroid.h +20 -0
  119. data/vendor/simpleble/simpleble/src/backends/android/PeripheralAndroid.cpp +365 -0
  120. data/vendor/simpleble/simpleble/src/backends/android/PeripheralAndroid.h +90 -0
  121. data/vendor/simpleble/simpleble/src/backends/android/bridge/BluetoothGattCallback.cpp +432 -0
  122. data/vendor/simpleble/simpleble/src/backends/android/bridge/BluetoothGattCallback.h +102 -0
  123. data/vendor/simpleble/simpleble/src/backends/android/bridge/ScanCallback.cpp +142 -0
  124. data/vendor/simpleble/simpleble/src/backends/android/bridge/ScanCallback.h +55 -0
  125. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothAdapter.cpp +107 -0
  126. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothAdapter.h +55 -0
  127. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothDevice.cpp +68 -0
  128. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothDevice.h +54 -0
  129. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGatt.cpp +115 -0
  130. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGatt.h +75 -0
  131. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattCharacteristic.cpp +142 -0
  132. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattCharacteristic.h +66 -0
  133. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattDescriptor.cpp +67 -0
  134. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattDescriptor.h +46 -0
  135. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattService.cpp +106 -0
  136. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattService.h +47 -0
  137. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/BluetoothScanner.cpp +47 -0
  138. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/BluetoothScanner.h +37 -0
  139. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanRecord.cpp +69 -0
  140. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanRecord.h +41 -0
  141. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanResult.cpp +63 -0
  142. data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanResult.h +42 -0
  143. data/vendor/simpleble/simpleble/src/backends/android/types/android/os/ParcelUUID.cpp +32 -0
  144. data/vendor/simpleble/simpleble/src/backends/android/types/android/os/ParcelUUID.h +30 -0
  145. data/vendor/simpleble/simpleble/src/backends/android/types/android/util/SparseArray.cpp +54 -0
  146. data/vendor/simpleble/simpleble/src/backends/android/types/android/util/SparseArray.h +37 -0
  147. data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Iterator.cpp +36 -0
  148. data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Iterator.h +28 -0
  149. data/vendor/simpleble/simpleble/src/backends/android/types/java/util/List.cpp +29 -0
  150. data/vendor/simpleble/simpleble/src/backends/android/types/java/util/List.h +27 -0
  151. data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Set.cpp +33 -0
  152. data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Set.h +28 -0
  153. data/vendor/simpleble/simpleble/src/backends/android/types/java/util/UUID.cpp +26 -0
  154. data/vendor/simpleble/simpleble/src/backends/android/types/java/util/UUID.h +29 -0
  155. data/vendor/simpleble/simpleble/src/backends/common/AdapterBase.cpp +53 -0
  156. data/vendor/simpleble/simpleble/src/backends/common/AdapterBase.h +81 -0
  157. data/vendor/simpleble/simpleble/src/backends/common/AdapterBaseTypes.h +22 -0
  158. data/vendor/simpleble/simpleble/src/backends/common/BackendBase.h +20 -0
  159. data/vendor/simpleble/simpleble/src/backends/common/BackendUtils.h +33 -0
  160. data/vendor/simpleble/simpleble/src/backends/common/CharacteristicBase.cpp +28 -0
  161. data/vendor/simpleble/simpleble/src/backends/common/CharacteristicBase.h +38 -0
  162. data/vendor/simpleble/simpleble/src/backends/common/DescriptorBase.cpp +7 -0
  163. data/vendor/simpleble/simpleble/src/backends/common/DescriptorBase.h +19 -0
  164. data/vendor/simpleble/simpleble/src/backends/common/PeripheralBase.h +82 -0
  165. data/vendor/simpleble/simpleble/src/backends/common/ServiceBase.cpp +18 -0
  166. data/vendor/simpleble/simpleble/src/backends/common/ServiceBase.h +28 -0
  167. data/vendor/simpleble/simpleble/src/backends/linux/AdapterLinux.cpp +102 -0
  168. data/vendor/simpleble/simpleble/src/backends/linux/AdapterLinux.h +55 -0
  169. data/vendor/simpleble/simpleble/src/backends/linux/BackendBluez.cpp +87 -0
  170. data/vendor/simpleble/simpleble/src/backends/linux/PeripheralLinux.cpp +376 -0
  171. data/vendor/simpleble/simpleble/src/backends/linux/PeripheralLinux.h +90 -0
  172. data/vendor/simpleble/simpleble/src/backends/macos/AdapterBaseMacOS.h +29 -0
  173. data/vendor/simpleble/simpleble/src/backends/macos/AdapterMac.h +78 -0
  174. data/vendor/simpleble/simpleble/src/backends/macos/PeripheralBaseMacOS.h +49 -0
  175. data/vendor/simpleble/simpleble/src/backends/macos/PeripheralMac.h +81 -0
  176. data/vendor/simpleble/simpleble/src/backends/macos/Utils.h +9 -0
  177. data/vendor/simpleble/simpleble/src/backends/plain/AdapterPlain.cpp +65 -0
  178. data/vendor/simpleble/simpleble/src/backends/plain/AdapterPlain.h +49 -0
  179. data/vendor/simpleble/simpleble/src/backends/plain/BackendPlain.cpp +30 -0
  180. data/vendor/simpleble/simpleble/src/backends/plain/PeripheralPlain.cpp +159 -0
  181. data/vendor/simpleble/simpleble/src/backends/plain/PeripheralPlain.h +72 -0
  182. data/vendor/simpleble/simpleble/src/backends/windows/AdapterWindows.cpp +330 -0
  183. data/vendor/simpleble/simpleble/src/backends/windows/AdapterWindows.h +89 -0
  184. data/vendor/simpleble/simpleble/src/backends/windows/BackendWinRT.cpp +67 -0
  185. data/vendor/simpleble/simpleble/src/backends/windows/BackendWinRT.h +18 -0
  186. data/vendor/simpleble/simpleble/src/backends/windows/MtaManager.cpp +49 -0
  187. data/vendor/simpleble/simpleble/src/backends/windows/MtaManager.h +90 -0
  188. data/vendor/simpleble/simpleble/src/backends/windows/PeripheralWindows.cpp +487 -0
  189. data/vendor/simpleble/simpleble/src/backends/windows/PeripheralWindows.h +129 -0
  190. data/vendor/simpleble/simpleble/src/backends/windows/Utils.cpp +146 -0
  191. data/vendor/simpleble/simpleble/src/backends/windows/Utils.h +47 -0
  192. data/vendor/simpleble/simpleble/src/builders/BuildVec.h +32 -0
  193. data/vendor/simpleble/simpleble/src/builders/BuilderBase.h +87 -0
  194. data/vendor/simpleble/simpleble/src/external/TaskRunner.hpp +99 -0
  195. data/vendor/simpleble/simpleble/src/external/ThreadRunner.h +52 -0
  196. data/vendor/simpleble/simpleble/src/external/kvn_safe_callback.hpp +66 -0
  197. data/vendor/simpleble/simpleble/src/external/kvn_safe_map.hpp +94 -0
  198. data/vendor/simpleble/simpleble/src/external/kvn_threadrunner.hpp +70 -0
  199. data/vendor/simpleble/simpleble/src/external/logfwd.hpp +35 -0
  200. data/vendor/simpleble/simpleble/src/frontends/base/Adapter.cpp +111 -0
  201. data/vendor/simpleble/simpleble/src/frontends/base/Backend.cpp +83 -0
  202. data/vendor/simpleble/simpleble/src/frontends/base/Backend.h +76 -0
  203. data/vendor/simpleble/simpleble/src/frontends/base/Characteristic.cpp +56 -0
  204. data/vendor/simpleble/simpleble/src/frontends/base/Descriptor.cpp +21 -0
  205. data/vendor/simpleble/simpleble/src/frontends/base/Peripheral.cpp +113 -0
  206. data/vendor/simpleble/simpleble/src/frontends/base/Service.cpp +26 -0
  207. data/vendor/simpleble/simpleble/src/frontends/safe/AdapterSafe.cpp +158 -0
  208. data/vendor/simpleble/simpleble/src/frontends/safe/PeripheralSafe.cpp +219 -0
  209. data/vendor/simpleble/simpleble/src_c/adapter.cpp +204 -0
  210. data/vendor/simpleble/simpleble/src_c/logging.cpp +19 -0
  211. data/vendor/simpleble/simpleble/src_c/peripheral.cpp +444 -0
  212. data/vendor/simpleble/simpleble/src_c/simpleble.cpp +5 -0
  213. data/vendor/simpleble/simpleble/src_c/utils.cpp +15 -0
  214. data/vendor/simpleble/simpleble/test/src/main.cpp +8 -0
  215. data/vendor/simpleble/simpleble/test/src/test_bytearray.cpp +246 -0
  216. data/vendor/simpleble/simpleble/test/src/test_utils.cpp +24 -0
  217. data/vendor/simpleble/simplebluez/include/simplebluez/Adapter.h +46 -0
  218. data/vendor/simpleble/simplebluez/include/simplebluez/Agent.h +52 -0
  219. data/vendor/simpleble/simplebluez/include/simplebluez/Bluez.h +37 -0
  220. data/vendor/simpleble/simplebluez/include/simplebluez/BluezOrg.h +22 -0
  221. data/vendor/simpleble/simplebluez/include/simplebluez/BluezOrgBluez.h +26 -0
  222. data/vendor/simpleble/simplebluez/include/simplebluez/BluezRoot.h +32 -0
  223. data/vendor/simpleble/simplebluez/include/simplebluez/Characteristic.h +46 -0
  224. data/vendor/simpleble/simplebluez/include/simplebluez/Descriptor.h +33 -0
  225. data/vendor/simpleble/simplebluez/include/simplebluez/Device.h +64 -0
  226. data/vendor/simpleble/simplebluez/include/simplebluez/Exceptions.h +43 -0
  227. data/vendor/simpleble/simplebluez/include/simplebluez/Service.h +27 -0
  228. data/vendor/simpleble/simplebluez/include/simplebluez/Types.h +9 -0
  229. data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Adapter1.h +49 -0
  230. data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Agent1.h +100 -0
  231. data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/AgentManager1.h +24 -0
  232. data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Battery1.h +32 -0
  233. data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Device1.h +62 -0
  234. data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/GattCharacteristic1.h +48 -0
  235. data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/GattDescriptor1.h +41 -0
  236. data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/GattService1.h +28 -0
  237. data/vendor/simpleble/simplebluez/src/Adapter.cpp +78 -0
  238. data/vendor/simpleble/simplebluez/src/Agent.cpp +72 -0
  239. data/vendor/simpleble/simplebluez/src/Bluez.cpp +45 -0
  240. data/vendor/simpleble/simplebluez/src/BluezOrg.cpp +20 -0
  241. data/vendor/simpleble/simplebluez/src/BluezOrgBluez.cpp +23 -0
  242. data/vendor/simpleble/simplebluez/src/BluezRoot.cpp +44 -0
  243. data/vendor/simpleble/simplebluez/src/Characteristic.cpp +64 -0
  244. data/vendor/simpleble/simplebluez/src/Descriptor.cpp +27 -0
  245. data/vendor/simpleble/simplebluez/src/Device.cpp +104 -0
  246. data/vendor/simpleble/simplebluez/src/Exceptions.cpp +29 -0
  247. data/vendor/simpleble/simplebluez/src/Logging.cpp +52 -0
  248. data/vendor/simpleble/simplebluez/src/Logging.h +57 -0
  249. data/vendor/simpleble/simplebluez/src/Service.cpp +33 -0
  250. data/vendor/simpleble/simplebluez/src/interfaces/Adapter1.cpp +123 -0
  251. data/vendor/simpleble/simplebluez/src/interfaces/Agent1.cpp +143 -0
  252. data/vendor/simpleble/simplebluez/src/interfaces/AgentManager1.cpp +34 -0
  253. data/vendor/simpleble/simplebluez/src/interfaces/Battery1.cpp +30 -0
  254. data/vendor/simpleble/simplebluez/src/interfaces/Device1.cpp +170 -0
  255. data/vendor/simpleble/simplebluez/src/interfaces/GattCharacteristic1.cpp +118 -0
  256. data/vendor/simpleble/simplebluez/src/interfaces/GattDescriptor1.cpp +78 -0
  257. data/vendor/simpleble/simplebluez/src/interfaces/GattService1.cpp +28 -0
  258. data/vendor/simpleble/simplebluez/test/src/helpers/PythonRunner.cpp +53 -0
  259. data/vendor/simpleble/simplebluez/test/src/helpers/PythonRunner.h +24 -0
  260. data/vendor/simpleble/simplebluez/test/src/main.cpp +16 -0
  261. data/vendor/simpleble/simplecble/include/simplecble/adapter.h +188 -0
  262. data/vendor/simpleble/simplecble/include/simplecble/logging.h +37 -0
  263. data/vendor/simpleble/simplecble/include/simplecble/peripheral.h +304 -0
  264. data/vendor/simpleble/simplecble/include/simplecble/simpleble.h +21 -0
  265. data/vendor/simpleble/simplecble/include/simplecble/types.h +73 -0
  266. data/vendor/simpleble/simplecble/include/simplecble/utils.h +27 -0
  267. data/vendor/simpleble/simplecble/src/adapter.cpp +204 -0
  268. data/vendor/simpleble/simplecble/src/logging.cpp +19 -0
  269. data/vendor/simpleble/simplecble/src/peripheral.cpp +444 -0
  270. data/vendor/simpleble/simplecble/src/simpleble.cpp +5 -0
  271. data/vendor/simpleble/simplecble/src/utils.cpp +15 -0
  272. data/vendor/simpleble/simpledbus/include/simpledbus/advanced/Interface.h +67 -0
  273. data/vendor/simpleble/simpledbus/include/simpledbus/advanced/InterfaceRegistry.h +64 -0
  274. data/vendor/simpleble/simpledbus/include/simpledbus/advanced/Proxy.h +117 -0
  275. data/vendor/simpleble/simpledbus/include/simpledbus/base/Connection.h +50 -0
  276. data/vendor/simpleble/simpledbus/include/simpledbus/base/Exceptions.h +56 -0
  277. data/vendor/simpleble/simpledbus/include/simpledbus/base/Holder.h +147 -0
  278. data/vendor/simpleble/simpledbus/include/simpledbus/base/Logging.h +57 -0
  279. data/vendor/simpleble/simpledbus/include/simpledbus/base/Message.h +89 -0
  280. data/vendor/simpleble/simpledbus/include/simpledbus/base/Path.h +24 -0
  281. data/vendor/simpleble/simpledbus/include/simpledbus/interfaces/ObjectManager.h +26 -0
  282. data/vendor/simpleble/simpledbus/src/advanced/Interface.cpp +155 -0
  283. data/vendor/simpleble/simpledbus/src/advanced/Proxy.cpp +375 -0
  284. data/vendor/simpleble/simpledbus/src/base/Connection.cpp +222 -0
  285. data/vendor/simpleble/simpledbus/src/base/Exceptions.cpp +39 -0
  286. data/vendor/simpleble/simpledbus/src/base/Holder.cpp +739 -0
  287. data/vendor/simpleble/simpledbus/src/base/Logging.cpp +52 -0
  288. data/vendor/simpleble/simpledbus/src/base/Message.cpp +622 -0
  289. data/vendor/simpleble/simpledbus/src/base/Path.cpp +129 -0
  290. data/vendor/simpleble/simpledbus/src/interfaces/ObjectManager.cpp +58 -0
  291. data/vendor/simpleble/simpledbus/test/src/helpers/PythonRunner.cpp +53 -0
  292. data/vendor/simpleble/simpledbus/test/src/helpers/PythonRunner.h +24 -0
  293. data/vendor/simpleble/simpledbus/test/src/main.cpp +16 -0
  294. data/vendor/simpleble/simpledbus/test/src/test_holder.cpp +184 -0
  295. data/vendor/simpleble/simpledbus/test/src/test_message.cpp +397 -0
  296. data/vendor/simpleble/simpledbus/test/src/test_path.cpp +76 -0
  297. data/vendor/simpleble/simpledbus/test/src/test_proxy_children.cpp +109 -0
  298. data/vendor/simpleble/simpledbus/test/src/test_proxy_interfaces.cpp +102 -0
  299. data/vendor/simpleble/simpledbus/test/src/test_proxy_lifetime.cpp +18 -0
  300. data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/ThreadRunner.h +89 -0
  301. data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/android_utils.cpp +55 -0
  302. data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/android_utils.h +18 -0
  303. data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/simpleble_android.cpp +813 -0
  304. data/vendor/simpleble/simplejavable/cpp/src/core/AdapterWrapper.cpp +37 -0
  305. data/vendor/simpleble/simplejavable/cpp/src/core/AdapterWrapper.h +23 -0
  306. data/vendor/simpleble/simplejavable/cpp/src/core/Cache.cpp +58 -0
  307. data/vendor/simpleble/simplejavable/cpp/src/core/Cache.h +34 -0
  308. data/vendor/simpleble/simplejavable/cpp/src/core/PeripheralWrapper.cpp +17 -0
  309. data/vendor/simpleble/simplejavable/cpp/src/core/PeripheralWrapper.h +19 -0
  310. data/vendor/simpleble/simplejavable/cpp/src/java/lang/ArrayList.cpp +257 -0
  311. data/vendor/simpleble/simplejavable/cpp/src/java/lang/ArrayList.h +78 -0
  312. data/vendor/simpleble/simplejavable/cpp/src/java/lang/HashMap.cpp +96 -0
  313. data/vendor/simpleble/simplejavable/cpp/src/java/lang/HashMap.h +54 -0
  314. data/vendor/simpleble/simplejavable/cpp/src/java/lang/Integer.cpp +93 -0
  315. data/vendor/simpleble/simplejavable/cpp/src/java/lang/Integer.h +49 -0
  316. data/vendor/simpleble/simplejavable/cpp/src/java/lang/Iterator.cpp +85 -0
  317. data/vendor/simpleble/simplejavable/cpp/src/java/lang/Iterator.h +48 -0
  318. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/AdapterCallback.cpp +91 -0
  319. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/AdapterCallback.h +90 -0
  320. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Characteristic.cpp +35 -0
  321. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Characteristic.h +60 -0
  322. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/DataCallback.cpp +33 -0
  323. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/DataCallback.h +45 -0
  324. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Descriptor.cpp +30 -0
  325. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Descriptor.h +49 -0
  326. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/PeripheralCallback.cpp +41 -0
  327. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/PeripheralCallback.h +51 -0
  328. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Service.cpp +33 -0
  329. data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Service.h +54 -0
  330. data/vendor/simpleble/simplejavable/cpp/src/simplejavable.cpp +361 -0
  331. data/vendor/simpleble/simplepyble/src/main.cpp +55 -0
  332. data/vendor/simpleble/simplepyble/src/wrap_adapter.cpp +106 -0
  333. data/vendor/simpleble/simplepyble/src/wrap_characteristic.cpp +56 -0
  334. data/vendor/simpleble/simplepyble/src/wrap_config.cpp +136 -0
  335. data/vendor/simpleble/simplepyble/src/wrap_descriptor.cpp +21 -0
  336. data/vendor/simpleble/simplepyble/src/wrap_peripheral.cpp +217 -0
  337. data/vendor/simpleble/simplepyble/src/wrap_service.cpp +32 -0
  338. data/vendor/simpleble/simplepyble/src/wrap_types.cpp +21 -0
  339. data/vendor/simpleble/simplersble/src/bindings/Bindings.cpp +338 -0
  340. data/vendor/simpleble/simplersble/src/bindings/Bindings.hpp +178 -0
  341. 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
+ }