@mentra/bluetooth-sdk 0.1.0

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 (278) hide show
  1. package/README.md +278 -0
  2. package/android/build.gradle +167 -0
  3. package/android/lc3Lib/CMakeLists.txt +6 -0
  4. package/android/lc3Lib/build.gradle +109 -0
  5. package/android/lc3Lib/proguard-rules.pro +33 -0
  6. package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
  7. package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
  8. package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
  9. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
  10. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
  11. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
  12. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
  13. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
  14. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
  15. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
  16. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
  17. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
  18. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
  19. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
  20. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
  21. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
  22. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
  23. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
  24. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
  25. package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
  26. package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
  27. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
  28. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
  29. package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
  30. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
  31. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
  32. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
  33. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
  34. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
  35. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
  36. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
  37. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
  38. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
  39. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
  40. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
  41. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
  42. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
  43. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
  44. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
  45. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
  46. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
  47. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
  48. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
  49. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
  50. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
  51. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
  52. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
  53. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
  54. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
  55. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
  56. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
  57. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
  58. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
  59. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
  60. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
  61. package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
  62. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
  63. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
  64. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
  65. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
  66. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
  67. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
  68. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
  69. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
  70. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
  71. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
  72. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
  73. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
  74. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
  75. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
  76. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
  77. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
  78. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
  79. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
  80. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
  81. package/android/lc3Lib/src/main/java/com/mentra/lc3Lib/Lc3Cpp.java +38 -0
  82. package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
  83. package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
  84. package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
  85. package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
  86. package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
  87. package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
  88. package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
  89. package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
  90. package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
  91. package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
  92. package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
  93. package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
  94. package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
  95. package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
  96. package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
  97. package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
  98. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
  99. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
  100. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
  101. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
  102. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
  103. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
  104. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
  105. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
  106. package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
  107. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
  108. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
  109. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
  110. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
  111. package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
  112. package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
  113. package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
  114. package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
  115. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
  116. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
  117. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
  118. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
  119. package/android/settings.gradle +1 -0
  120. package/android/src/main/AndroidManifest.xml +40 -0
  121. package/android/src/main/java/com/mentra/bluetoothsdk/BluetoothSdkModule.kt +528 -0
  122. package/android/src/main/java/com/mentra/bluetoothsdk/Bridge.kt +610 -0
  123. package/android/src/main/java/com/mentra/bluetoothsdk/DeviceManager.kt +1616 -0
  124. package/android/src/main/java/com/mentra/bluetoothsdk/DeviceStore.kt +314 -0
  125. package/android/src/main/java/com/mentra/bluetoothsdk/MentraBluetoothModels.kt +1710 -0
  126. package/android/src/main/java/com/mentra/bluetoothsdk/MentraBluetoothSdk.kt +554 -0
  127. package/android/src/main/java/com/mentra/bluetoothsdk/ObservableStore.kt +68 -0
  128. package/android/src/main/java/com/mentra/bluetoothsdk/controllers/ControllerManager.kt +158 -0
  129. package/android/src/main/java/com/mentra/bluetoothsdk/controllers/R1.kt +934 -0
  130. package/android/src/main/java/com/mentra/bluetoothsdk/services/Foreground.kt +175 -0
  131. package/android/src/main/java/com/mentra/bluetoothsdk/services/PhoneMic.kt +1109 -0
  132. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/G1.java +3974 -0
  133. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/G2.kt +3551 -0
  134. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/Mach1.java +1327 -0
  135. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraLive.java +6959 -0
  136. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraNex.kt +1655 -0
  137. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraosBle.java +53675 -0
  138. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/SGCManager.kt +202 -0
  139. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/Simulated.kt +224 -0
  140. package/android/src/main/java/com/mentra/bluetoothsdk/stt/STTTools.kt +340 -0
  141. package/android/src/main/java/com/mentra/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +465 -0
  142. package/android/src/main/java/com/mentra/bluetoothsdk/stt/VadGateSpeechPolicy.kt +221 -0
  143. package/android/src/main/java/com/mentra/bluetoothsdk/utils/AES.java +106 -0
  144. package/android/src/main/java/com/mentra/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
  145. package/android/src/main/java/com/mentra/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
  146. package/android/src/main/java/com/mentra/bluetoothsdk/utils/BlePhotoUploadService.java +179 -0
  147. package/android/src/main/java/com/mentra/bluetoothsdk/utils/Constants.kt +44 -0
  148. package/android/src/main/java/com/mentra/bluetoothsdk/utils/G1Text.kt +436 -0
  149. package/android/src/main/java/com/mentra/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
  150. package/android/src/main/java/com/mentra/bluetoothsdk/utils/IncidentLogBleUploadService.java +76 -0
  151. package/android/src/main/java/com/mentra/bluetoothsdk/utils/K900ProtocolUtils.java +791 -0
  152. package/android/src/main/java/com/mentra/bluetoothsdk/utils/MessageChunker.java +186 -0
  153. package/android/src/main/java/com/mentra/bluetoothsdk/utils/NexSGCUtils.kt +589 -0
  154. package/android/src/main/java/com/mentra/bluetoothsdk/utils/PhoneAudioMonitor.kt +303 -0
  155. package/android/src/main/java/com/mentra/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
  156. package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
  157. package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
  158. package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
  159. package/android/src/main/res/values/strings.xml +4 -0
  160. package/app.plugin.js +1 -0
  161. package/build/BluetoothSdk.types.d.ts +498 -0
  162. package/build/BluetoothSdk.types.d.ts.map +1 -0
  163. package/build/BluetoothSdk.types.js +23 -0
  164. package/build/BluetoothSdk.types.js.map +1 -0
  165. package/build/BluetoothSdkModule.d.ts +71 -0
  166. package/build/BluetoothSdkModule.d.ts.map +1 -0
  167. package/build/BluetoothSdkModule.js +106 -0
  168. package/build/BluetoothSdkModule.js.map +1 -0
  169. package/build/index.d.ts +3 -0
  170. package/build/index.d.ts.map +1 -0
  171. package/build/index.js +5 -0
  172. package/build/index.js.map +1 -0
  173. package/expo-module.config.json +9 -0
  174. package/ios/BluetoothSdkModule.swift +665 -0
  175. package/ios/MentraBluetoothSDK.podspec +77 -0
  176. package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
  177. package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
  178. package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
  179. package/ios/Packages/CoreObjC/attdet.c +92 -0
  180. package/ios/Packages/CoreObjC/attdet.h +44 -0
  181. package/ios/Packages/CoreObjC/bits.c +375 -0
  182. package/ios/Packages/CoreObjC/bits.h +315 -0
  183. package/ios/Packages/CoreObjC/bwdet.c +129 -0
  184. package/ios/Packages/CoreObjC/bwdet.h +69 -0
  185. package/ios/Packages/CoreObjC/common.h +151 -0
  186. package/ios/Packages/CoreObjC/energy.c +70 -0
  187. package/ios/Packages/CoreObjC/energy.h +43 -0
  188. package/ios/Packages/CoreObjC/fastmath.h +158 -0
  189. package/ios/Packages/CoreObjC/lc3.c +704 -0
  190. package/ios/Packages/CoreObjC/lc3.h +313 -0
  191. package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
  192. package/ios/Packages/CoreObjC/lc3_private.h +163 -0
  193. package/ios/Packages/CoreObjC/ltpf.c +905 -0
  194. package/ios/Packages/CoreObjC/ltpf.h +111 -0
  195. package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
  196. package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
  197. package/ios/Packages/CoreObjC/makefile.mk +35 -0
  198. package/ios/Packages/CoreObjC/mdct.c +469 -0
  199. package/ios/Packages/CoreObjC/mdct.h +57 -0
  200. package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
  201. package/ios/Packages/CoreObjC/meson.build +61 -0
  202. package/ios/Packages/CoreObjC/plc.c +61 -0
  203. package/ios/Packages/CoreObjC/plc.h +57 -0
  204. package/ios/Packages/CoreObjC/rnnoise.h +114 -0
  205. package/ios/Packages/CoreObjC/sns.c +880 -0
  206. package/ios/Packages/CoreObjC/sns.h +103 -0
  207. package/ios/Packages/CoreObjC/spec.c +907 -0
  208. package/ios/Packages/CoreObjC/spec.h +119 -0
  209. package/ios/Packages/CoreObjC/tables.c +3457 -0
  210. package/ios/Packages/CoreObjC/tables.h +94 -0
  211. package/ios/Packages/CoreObjC/tns.c +457 -0
  212. package/ios/Packages/CoreObjC/tns.h +99 -0
  213. package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
  214. package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
  215. package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +1659 -0
  216. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/cargs.h +162 -0
  217. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/sherpa-onnx/c-api/c-api.h +1852 -0
  218. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/sherpa-onnx/c-api/cxx-api.h +674 -0
  219. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +44 -0
  220. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
  221. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/sherpa-onnx.a +0 -0
  222. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
  223. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/sherpa-onnx.a +0 -0
  224. package/ios/Packages/VAD/Common/VAD/VADQuality.swift +41 -0
  225. package/ios/Packages/VAD/Common/VAD/VADState.swift +26 -0
  226. package/ios/Packages/VAD/Common/VAD/VADStrategy.swift +29 -0
  227. package/ios/Packages/VAD/Common/VAD/VADType.swift +14 -0
  228. package/ios/Packages/VAD/Data/Configuration.swift +68 -0
  229. package/ios/Packages/VAD/Data/FrameSize.swift +39 -0
  230. package/ios/Packages/VAD/Data/Record.swift +13 -0
  231. package/ios/Packages/VAD/Data/Result.swift +22 -0
  232. package/ios/Packages/VAD/Data/SampleRate.swift +48 -0
  233. package/ios/Packages/VAD/Silero/Model/silero_vad.onnx +0 -0
  234. package/ios/Packages/VAD/Silero/SileroVAD.swift +284 -0
  235. package/ios/Packages/VAD/Silero/SileroVADStrategy.swift +64 -0
  236. package/ios/Packages/libbz2/module.modulemap +5 -0
  237. package/ios/Packages/libbz2/shim.h +1 -0
  238. package/ios/Source/Bridge.swift +353 -0
  239. package/ios/Source/Bridging-Header.h +16 -0
  240. package/ios/Source/DeviceManager.swift +1478 -0
  241. package/ios/Source/DeviceStore.swift +295 -0
  242. package/ios/Source/MentraBluetoothSDK.swift +2439 -0
  243. package/ios/Source/ObservableStore.swift +88 -0
  244. package/ios/Source/PrivacyInfo.xcprivacy +23 -0
  245. package/ios/Source/controllers/ControllerManager.swift +187 -0
  246. package/ios/Source/controllers/R1.swift +827 -0
  247. package/ios/Source/services/PhoneMic.swift +662 -0
  248. package/ios/Source/sgcs/Frame.swift +651 -0
  249. package/ios/Source/sgcs/G1.swift +2505 -0
  250. package/ios/Source/sgcs/G2.swift +3730 -0
  251. package/ios/Source/sgcs/Mach1.swift +543 -0
  252. package/ios/Source/sgcs/MentraLive.swift +4708 -0
  253. package/ios/Source/sgcs/MentraNex.swift +2479 -0
  254. package/ios/Source/sgcs/SGCManager.swift +243 -0
  255. package/ios/Source/sgcs/Simulated.swift +270 -0
  256. package/ios/Source/sgcs/mentraos_ble.pb.swift +3811 -0
  257. package/ios/Source/stt/STTTools.swift +154 -0
  258. package/ios/Source/stt/SherpaOnnxTranscriber.swift +401 -0
  259. package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
  260. package/ios/Source/utils/Constants.swift +74 -0
  261. package/ios/Source/utils/Enums.swift +95 -0
  262. package/ios/Source/utils/G1Text.swift +2067 -0
  263. package/ios/Source/utils/JSCExperiment.swift +241 -0
  264. package/ios/Source/utils/MemoryMonitor.swift +44 -0
  265. package/ios/Source/utils/MessageChunker.swift +164 -0
  266. package/ios/Source/utils/Models.swift +135 -0
  267. package/ios/Source/utils/PhoneAudioMonitor.swift +226 -0
  268. package/ios/Source/utils/TarBz2Extractor.swift +206 -0
  269. package/package.json +78 -0
  270. package/plugin/build/index.d.ts +6 -0
  271. package/plugin/build/index.js +12 -0
  272. package/plugin/build/withAndroid.d.ts +4 -0
  273. package/plugin/build/withAndroid.js +80 -0
  274. package/plugin/build/withIos.d.ts +4 -0
  275. package/plugin/build/withIos.js +64 -0
  276. package/src/BluetoothSdk.types.ts +581 -0
  277. package/src/BluetoothSdkModule.ts +259 -0
  278. package/src/index.ts +4 -0
@@ -0,0 +1,665 @@
1
+ import ExpoModulesCore
2
+ import Foundation
3
+
4
+ public class BluetoothSdkModule: Module, MentraBluetoothSDKDelegate {
5
+ private var sdk: MentraBluetoothSDK?
6
+
7
+ public func definition() -> ModuleDefinition {
8
+ Name("BluetoothSdk")
9
+
10
+ // Define events that can be sent to JavaScript
11
+ Events(
12
+ "glasses_status",
13
+ "bluetooth_status",
14
+ "log",
15
+ "device_discovered",
16
+ "default_device_changed",
17
+ // Individual event handlers
18
+ "glasses_not_ready",
19
+ "button_press",
20
+ "touch_event",
21
+ "head_up",
22
+ "vad_status",
23
+ "battery_status",
24
+ "wifi_status_change",
25
+ "hotspot_status_change",
26
+ "hotspot_error",
27
+ "photo_response",
28
+ "gallery_status",
29
+ "compatible_glasses_search_stop",
30
+ "heartbeat_sent",
31
+ "heartbeat_received",
32
+ "swipe_volume_status",
33
+ "switch_status",
34
+ "rgb_led_control_response",
35
+ "pair_failure",
36
+ "audio_pairing_needed",
37
+ "audio_connected",
38
+ "audio_disconnected",
39
+ "save_setting",
40
+ "local_transcription",
41
+ "phone_notification",
42
+ "phone_notification_dismissed",
43
+ "ws_text",
44
+ "ws_bin",
45
+ "mic_pcm",
46
+ "mic_lc3",
47
+ "stream_status",
48
+ "keep_alive_ack",
49
+ "mtk_update_complete",
50
+ "ota_update_available",
51
+ "ota_progress",
52
+ "ota_start_ack",
53
+ "ota_status",
54
+ "send_command_to_ble",
55
+ "receive_command_from_ble",
56
+ "miniapp_selected",
57
+ "captions_tester_incident"
58
+ )
59
+
60
+ OnCreate {
61
+ JSCExperiment.maybeAutoBenchmark()
62
+ Task { @MainActor [weak self] in
63
+ _ = self?.bluetoothSdk()
64
+ }
65
+ }
66
+
67
+ OnDestroy {
68
+ Task { @MainActor [weak self] in
69
+ self?.sdk?.invalidate()
70
+ self?.sdk = nil
71
+ }
72
+ }
73
+
74
+ // MARK: - Observable Store Functions
75
+
76
+ Function("getGlassesStatus") { () -> [String: Any] in
77
+ self.readOnMainActor {
78
+ self.bluetoothSdk().glassesStatus.dictionary
79
+ }
80
+ }
81
+
82
+ Function("getBluetoothStatus") { () -> [String: Any] in
83
+ self.readOnMainActor {
84
+ self.bluetoothSdk().bluetoothStatus.values
85
+ }
86
+ }
87
+
88
+ Function("getDefaultDevice") { () -> [String: Any]? in
89
+ self.readOnMainActor {
90
+ self.bluetoothSdk().getDefaultDevice()?.dictionary
91
+ }
92
+ }
93
+
94
+ AsyncFunction("update") { (category: String, values: [String: Any]) in
95
+ await MainActor.run {
96
+ let normalizedCategory = ObservableStore.normalizeCategory(category)
97
+ for (key, value) in values {
98
+ if value is NSNull { continue }
99
+ DeviceStore.shared.apply(normalizedCategory, key, value)
100
+ }
101
+ }
102
+ }
103
+
104
+ // MARK: - Display Commands
105
+
106
+ AsyncFunction("displayEvent") { (params: [String: Any]) in
107
+ let sdk = await MainActor.run { self.bluetoothSdk() }
108
+ try? await sdk.displayEvent(DisplayEventRequest(values: params))
109
+ }
110
+
111
+ AsyncFunction("displayText") { (params: [String: Any]) in
112
+ let request = DisplayTextRequest(
113
+ text: params["text"] as? String ?? "",
114
+ x: intValue(params["x"], defaultValue: 0),
115
+ y: intValue(params["y"], defaultValue: 0),
116
+ size: intValue(params["size"], defaultValue: 24)
117
+ )
118
+ let sdk = await MainActor.run { self.bluetoothSdk() }
119
+ try? await sdk.displayText(request)
120
+ }
121
+
122
+ // MARK: - Connection Commands
123
+
124
+ AsyncFunction("connectDefault") {
125
+ try await MainActor.run {
126
+ try self.bluetoothSdk().connectDefault()
127
+ }
128
+ }
129
+
130
+ AsyncFunction("connectDefaultWithOptions") { (options: [String: Any]) in
131
+ try await MainActor.run {
132
+ try self.bluetoothSdk().connectDefault(options: ConnectOptions(dictionary: options))
133
+ }
134
+ }
135
+
136
+ AsyncFunction("setDefaultDevice") { (device: [String: Any]?) in
137
+ await MainActor.run {
138
+ self.bluetoothSdk().setDefaultDevice(Device(dictionary: device))
139
+ }
140
+ }
141
+
142
+ AsyncFunction("clearDefaultDevice") {
143
+ await MainActor.run {
144
+ self.bluetoothSdk().clearDefaultDevice()
145
+ }
146
+ }
147
+
148
+ AsyncFunction("connectWithOptions") { (device: [String: Any], options: [String: Any]) in
149
+ try await MainActor.run {
150
+ guard let target = Device(dictionary: device) else {
151
+ throw BluetoothError(
152
+ code: "invalid_device",
153
+ message: "connect requires a Device with model and name."
154
+ )
155
+ }
156
+ try self.bluetoothSdk().connect(to: target, options: ConnectOptions(dictionary: options))
157
+ }
158
+ }
159
+
160
+ AsyncFunction("connectDefaultController") {
161
+ await MainActor.run {
162
+ DeviceManager.shared.connectDefaultController()
163
+ }
164
+ }
165
+
166
+ AsyncFunction("connectSimulated") {
167
+ await MainActor.run {
168
+ self.bluetoothSdk().connectSimulated()
169
+ }
170
+ }
171
+
172
+ AsyncFunction("disconnect") {
173
+ await MainActor.run {
174
+ self.bluetoothSdk().disconnect()
175
+ }
176
+ }
177
+
178
+ AsyncFunction("disconnectController") {
179
+ await MainActor.run {
180
+ DeviceManager.shared.disconnectController()
181
+ }
182
+ }
183
+
184
+ AsyncFunction("forget") {
185
+ await MainActor.run {
186
+ self.bluetoothSdk().forget()
187
+ }
188
+ }
189
+
190
+ AsyncFunction("forgetController") {
191
+ await MainActor.run {
192
+ DeviceManager.shared.forgetController()
193
+ }
194
+ }
195
+
196
+ AsyncFunction("startScan") { (params: [String: Any]) in
197
+ try await MainActor.run {
198
+ let model = params["model"] as? String ?? DeviceTypes.LIVE
199
+ try self.bluetoothSdk().startScan(model: DeviceModel.fromDeviceType(model))
200
+ }
201
+ }
202
+
203
+ AsyncFunction("cancelConnectionAttempt") {
204
+ await MainActor.run {
205
+ self.bluetoothSdk().cancelConnectionAttempt()
206
+ }
207
+ }
208
+
209
+ AsyncFunction("showDashboard") {
210
+ await MainActor.run {
211
+ self.bluetoothSdk().showDashboard()
212
+ }
213
+ }
214
+
215
+ AsyncFunction("ping") {
216
+ await MainActor.run {
217
+ DeviceManager.shared.ping()
218
+ }
219
+ }
220
+
221
+ AsyncFunction("dbg1") {
222
+ await MainActor.run {
223
+ DeviceManager.shared.dbg1()
224
+ DeviceManager.shared.sgc?.dbg1()
225
+ }
226
+ }
227
+
228
+ AsyncFunction("dbg2") {
229
+ await MainActor.run {
230
+ DeviceManager.shared.dbg2()
231
+ DeviceManager.shared.sgc?.dbg2()
232
+ }
233
+ }
234
+
235
+ Function("getMemoryMB") { () -> Double in
236
+ MemoryMonitor.currentMemoryMB()
237
+ }
238
+
239
+ Function("jscSpawn") { (count: Int) -> Int in
240
+ JSCExperiment.spawn(count: count)
241
+ }
242
+
243
+ Function("jscKillAll") { () -> Void in
244
+ JSCExperiment.killAll()
245
+ }
246
+
247
+ Function("jscAliveCount") { () -> Int in
248
+ JSCExperiment.aliveCount()
249
+ }
250
+
251
+ Function("jscSpawnAndMeasure") { (count: Int, baselineMB: Double) -> [String: Any] in
252
+ JSCExperiment.spawnAndMeasure(count: count, baselineMB: baselineMB)
253
+ }
254
+
255
+ Function("jscRunBenchmark") { () -> Void in
256
+ JSCExperiment.runBenchmark()
257
+ }
258
+
259
+ // MARK: - Incident Reporting
260
+
261
+ AsyncFunction("sendIncidentId") { (incidentId: String, apiBaseUrl: String?) in
262
+ await MainActor.run {
263
+ self.bluetoothSdk().sendIncidentId(incidentId, apiBaseUrl: apiBaseUrl)
264
+ }
265
+ }
266
+
267
+ // MARK: - WiFi Commands
268
+
269
+ AsyncFunction("requestWifiScan") {
270
+ await MainActor.run {
271
+ self.bluetoothSdk().requestWifiScan()
272
+ }
273
+ }
274
+
275
+ AsyncFunction("sendWifiCredentials") { (ssid: String, password: String) in
276
+ await MainActor.run {
277
+ self.bluetoothSdk().sendWifiCredentials(ssid: ssid, password: password)
278
+ }
279
+ }
280
+
281
+ AsyncFunction("forgetWifiNetwork") { (ssid: String) in
282
+ await MainActor.run {
283
+ self.bluetoothSdk().forgetWifiNetwork(ssid: ssid)
284
+ }
285
+ }
286
+
287
+ AsyncFunction("setHotspotState") { (enabled: Bool) in
288
+ await MainActor.run {
289
+ self.bluetoothSdk().setHotspotState(enabled: enabled)
290
+ }
291
+ }
292
+
293
+ // MARK: - Gallery Commands
294
+
295
+ AsyncFunction("setGalleryMode") { (mode: String) in
296
+ let galleryMode: GalleryMode
297
+ switch mode.lowercased() {
298
+ case "auto":
299
+ galleryMode = .auto
300
+ case "manual":
301
+ galleryMode = .manual
302
+ default:
303
+ throw BluetoothError(
304
+ code: "invalid_gallery_mode",
305
+ message: "setGalleryMode mode must be \"auto\" or \"manual\"."
306
+ )
307
+ }
308
+ let sdk = await MainActor.run { self.bluetoothSdk() }
309
+ try await sdk.setGalleryMode(galleryMode)
310
+ }
311
+
312
+ AsyncFunction("queryGalleryStatus") {
313
+ await MainActor.run {
314
+ self.bluetoothSdk().queryGalleryStatus()
315
+ }
316
+ }
317
+
318
+ AsyncFunction("photoRequest") {
319
+ (
320
+ requestId: String, appId: String, size: String, webhookUrl: String?,
321
+ authToken: String?, compress: String?, flash: Bool, sound: Bool
322
+ ) in
323
+ await MainActor.run {
324
+ self.bluetoothSdk().requestPhoto(
325
+ PhotoRequest(
326
+ requestId: requestId,
327
+ appId: appId,
328
+ size: PhotoSize(rawValue: size) ?? .medium,
329
+ webhookUrl: webhookUrl,
330
+ authToken: authToken,
331
+ compress: compress.flatMap(PhotoCompression.init(rawValue:)),
332
+ flash: flash,
333
+ sound: sound
334
+ )
335
+ )
336
+ }
337
+ }
338
+
339
+ // MARK: - OTA Commands
340
+
341
+ AsyncFunction("sendOtaStart") {
342
+ await MainActor.run {
343
+ self.bluetoothSdk().sendOtaStart()
344
+ }
345
+ }
346
+
347
+ AsyncFunction("sendOtaQueryStatus") {
348
+ await MainActor.run {
349
+ self.bluetoothSdk().sendOtaQueryStatus()
350
+ }
351
+ }
352
+
353
+ // MARK: - Version Info Commands
354
+
355
+ AsyncFunction("requestVersionInfo") {
356
+ await MainActor.run {
357
+ self.bluetoothSdk().requestVersionInfo()
358
+ }
359
+ }
360
+
361
+ // MARK: - Power Control Commands
362
+
363
+ AsyncFunction("sendShutdown") {
364
+ await MainActor.run {
365
+ self.bluetoothSdk().sendShutdown()
366
+ }
367
+ }
368
+
369
+ AsyncFunction("sendReboot") {
370
+ await MainActor.run {
371
+ self.bluetoothSdk().sendReboot()
372
+ }
373
+ }
374
+
375
+ // MARK: - Video Recording Commands
376
+
377
+ AsyncFunction("startVideoRecording") { (requestId: String, save: Bool, flash: Bool, sound: Bool) in
378
+ await MainActor.run {
379
+ self.bluetoothSdk().startVideoRecording(
380
+ VideoRecordingRequest(requestId: requestId, save: save, flash: flash, sound: sound)
381
+ )
382
+ }
383
+ }
384
+
385
+ AsyncFunction("stopVideoRecording") { (requestId: String) in
386
+ await MainActor.run {
387
+ self.bluetoothSdk().stopVideoRecording(requestId: requestId)
388
+ }
389
+ }
390
+
391
+ // MARK: - Stream Commands
392
+
393
+ AsyncFunction("startStream") { (params: [String: Any]) in
394
+ await MainActor.run {
395
+ self.bluetoothSdk().startStream(StreamRequest(values: params))
396
+ }
397
+ }
398
+
399
+ AsyncFunction("stopStream") {
400
+ await MainActor.run {
401
+ self.bluetoothSdk().stopStream()
402
+ }
403
+ }
404
+
405
+ AsyncFunction("keepStreamAlive") { (params: [String: Any]) in
406
+ await MainActor.run {
407
+ self.bluetoothSdk().keepStreamAlive(StreamKeepAliveRequest(values: params))
408
+ }
409
+ }
410
+
411
+ // MARK: - Audio Playback Monitoring
412
+
413
+ AsyncFunction("setOwnAppAudioPlaying") { (playing: Bool) in
414
+ await MainActor.run {
415
+ self.bluetoothSdk().setOwnAppAudioPlaying(playing)
416
+ }
417
+ }
418
+
419
+ AsyncFunction("getGlassesMediaVolume") { () async throws -> [String: Any] in
420
+ try await DeviceManager.shared.getGlassesMediaVolume()
421
+ }
422
+
423
+ AsyncFunction("setGlassesMediaVolume") { (level: Int) async throws -> [String: Any] in
424
+ try await DeviceManager.shared.setGlassesMediaVolume(level: level)
425
+ }
426
+
427
+ // MARK: - RGB LED Control
428
+
429
+ AsyncFunction("rgbLedControl") {
430
+ (
431
+ requestId: String, packageName: String?, action: String, color: String?,
432
+ ontime: Int, offtime: Int, count: Int
433
+ ) in
434
+ await MainActor.run {
435
+ self.bluetoothSdk().rgbLedControl(
436
+ RgbLedRequest(
437
+ requestId: requestId,
438
+ packageName: packageName,
439
+ action: RgbLedAction(rawValue: action) ?? .off,
440
+ color: color.flatMap(RgbLedColor.init(rawValue:)),
441
+ ontime: ontime,
442
+ offtime: offtime,
443
+ count: count
444
+ )
445
+ )
446
+ }
447
+ }
448
+
449
+ // MARK: - Microphone Commands
450
+
451
+ AsyncFunction("setMicState") { (sendPcmData: Bool, sendTranscript: Bool, bypassVad: Bool) in
452
+ await MainActor.run {
453
+ self.bluetoothSdk().setMicState(
454
+ MicConfiguration(
455
+ sendPcmData: sendPcmData,
456
+ sendTranscript: sendTranscript,
457
+ bypassVad: bypassVad
458
+ )
459
+ )
460
+ }
461
+ }
462
+
463
+ AsyncFunction("restartTranscriber") {
464
+ await MainActor.run {
465
+ DeviceManager.shared.restartTranscriber()
466
+ }
467
+ }
468
+
469
+ // MARK: - Display Commands
470
+
471
+ AsyncFunction("clearDisplay") {
472
+ let sdk = await MainActor.run { self.bluetoothSdk() }
473
+ try? await sdk.clearDisplay()
474
+ }
475
+
476
+ // MARK: - STT Model Management
477
+
478
+ AsyncFunction("setSttModelDetails") { (path: String, languageCode: String) in
479
+ STTTools.setSttModelDetails(path, languageCode)
480
+ }
481
+
482
+ AsyncFunction("getSttModelPath") { () -> String in
483
+ return STTTools.getSttModelPath()
484
+ }
485
+
486
+ AsyncFunction("checkSttModelAvailable") { () -> Bool in
487
+ return STTTools.checkSTTModelAvailable()
488
+ }
489
+
490
+ AsyncFunction("validateSttModel") { (path: String) -> Bool in
491
+ return STTTools.validateSTTModel(path)
492
+ }
493
+
494
+ AsyncFunction("extractTarBz2") { (sourcePath: String, destinationPath: String) -> Bool in
495
+ return STTTools.extractTarBz2(sourcePath: sourcePath, destinationPath: destinationPath)
496
+ }
497
+ }
498
+
499
+ @MainActor
500
+ private func bluetoothSdk() -> MentraBluetoothSDK {
501
+ if let sdk {
502
+ return sdk
503
+ }
504
+
505
+ let sdk = MentraBluetoothSDK()
506
+ sdk.delegate = self
507
+ self.sdk = sdk
508
+ return sdk
509
+ }
510
+
511
+ private func readOnMainActor<T>(_ body: @MainActor () -> T) -> T {
512
+ if Thread.isMainThread {
513
+ return MainActor.assumeIsolated {
514
+ body()
515
+ }
516
+ }
517
+
518
+ return DispatchQueue.main.sync {
519
+ MainActor.assumeIsolated {
520
+ body()
521
+ }
522
+ }
523
+ }
524
+
525
+ private func intValue(_ value: Any?, defaultValue: Int) -> Int {
526
+ switch value {
527
+ case let value as Int:
528
+ return value
529
+ case let value as Double:
530
+ return Int(value)
531
+ case let value as NSNumber:
532
+ return value.intValue
533
+ default:
534
+ return defaultValue
535
+ }
536
+ }
537
+
538
+ @MainActor
539
+ public func mentraBluetoothSDK(_: MentraBluetoothSDK, didUpdateGlassesStatus status: GlassesStatusUpdate) {
540
+ sendEvent("glasses_status", status.dictionary)
541
+ }
542
+
543
+ @MainActor
544
+ public func mentraBluetoothSDK(_: MentraBluetoothSDK, didUpdateBluetoothStatus status: BluetoothStatusUpdate) {
545
+ sendEvent("bluetooth_status", status.values)
546
+ }
547
+
548
+ @MainActor
549
+ public func mentraBluetoothSDK(_: MentraBluetoothSDK, didDiscover device: Device) {
550
+ sendEvent("device_discovered", device.dictionary)
551
+ }
552
+
553
+ @MainActor
554
+ public func mentraBluetoothSDK(_: MentraBluetoothSDK, didStopScan reason: ScanStopReason) {
555
+ guard reason == .completed else { return }
556
+ let status = bluetoothSdk().bluetoothStatus
557
+ let deviceModel = status.pendingWearable.isEmpty ? status.defaultWearable : status.pendingWearable
558
+ sendEvent(
559
+ "compatible_glasses_search_stop",
560
+ [
561
+ "type": "compatible_glasses_search_stop",
562
+ "device_model": deviceModel,
563
+ ]
564
+ )
565
+ }
566
+
567
+ @MainActor
568
+ public func mentraBluetoothSDK(_: MentraBluetoothSDK, didReceive event: BluetoothEvent) {
569
+ switch event {
570
+ case let .buttonPress(button):
571
+ sendEvent(
572
+ "button_press",
573
+ [
574
+ "buttonId": button.buttonId,
575
+ "pressType": button.pressType,
576
+ "timestamp": button.timestamp ?? Int(Date().timeIntervalSince1970 * 1000),
577
+ ]
578
+ )
579
+ case let .touch(touch):
580
+ sendEvent("touch_event", touch.values)
581
+ case let .wifiStatus(status):
582
+ sendEvent("wifi_status_change", status.values)
583
+ case let .hotspotStatus(status):
584
+ sendEvent("hotspot_status_change", status.values)
585
+ case let .hotspotError(error):
586
+ sendEvent("hotspot_error", error.values)
587
+ case let .photoResponse(response):
588
+ sendEvent("photo_response", response.values)
589
+ case let .streamStatus(status):
590
+ sendEvent("stream_status", status.values)
591
+ case let .keepAliveAck(ack):
592
+ sendEvent("keep_alive_ack", ack.values)
593
+ case let .localTranscription(transcription):
594
+ sendEvent("local_transcription", transcription.values)
595
+ case let .raw(name, values):
596
+ sendEvent(name, values)
597
+ }
598
+ }
599
+
600
+ @MainActor
601
+ public func mentraBluetoothSDK(_: MentraBluetoothSDK, didReceiveMicPcm frame: Data) {
602
+ sendEvent("mic_pcm", ["pcm": frame])
603
+ }
604
+
605
+ @MainActor
606
+ public func mentraBluetoothSDK(_: MentraBluetoothSDK, didReceiveMicLc3 frame: Data) {
607
+ sendEvent("mic_lc3", ["lc3": frame])
608
+ }
609
+
610
+ @MainActor
611
+ public func mentraBluetoothSDK(_: MentraBluetoothSDK, didChangeDefaultDevice device: Device?) {
612
+ var event: [String: Any] = [:]
613
+ if let device {
614
+ event["device"] = device.dictionary
615
+ }
616
+ sendEvent("default_device_changed", event)
617
+ }
618
+
619
+ @MainActor
620
+ public func mentraBluetoothSDK(_: MentraBluetoothSDK, didLog message: String) {
621
+ sendEvent("log", ["message": message])
622
+ }
623
+
624
+ @MainActor
625
+ public func mentraBluetoothSDK(_: MentraBluetoothSDK, didFail error: BluetoothError) {
626
+ sendEvent("pair_failure", ["error": error.message])
627
+ }
628
+ }
629
+
630
+ private extension Device {
631
+ init?(dictionary values: [String: Any]?) {
632
+ guard let values else { return nil }
633
+ guard let model = values["model"] as? String ?? values["deviceModel"] as? String else { return nil }
634
+ guard let name = values["name"] as? String ?? values["deviceName"] as? String else { return nil }
635
+ let identifier = values["address"] as? String ?? values["deviceAddress"] as? String
636
+ let rssi: Int?
637
+ switch values["rssi"] {
638
+ case let value as Int:
639
+ rssi = value
640
+ case let value as Double:
641
+ rssi = Int(value)
642
+ case let value as NSNumber:
643
+ rssi = value.intValue
644
+ default:
645
+ rssi = nil
646
+ }
647
+ let id = values["id"] as? String
648
+ self.init(
649
+ model: DeviceModel.fromDeviceType(model),
650
+ name: name,
651
+ identifier: identifier?.isEmpty == true ? nil : identifier,
652
+ rssi: rssi,
653
+ id: id
654
+ )
655
+ }
656
+ }
657
+
658
+ private extension ConnectOptions {
659
+ init(dictionary values: [String: Any]?) {
660
+ self.init(
661
+ saveAsDefault: values?["saveAsDefault"] as? Bool ?? true,
662
+ cancelExistingConnectionAttempt: values?["cancelExistingConnectionAttempt"] as? Bool ?? true
663
+ )
664
+ }
665
+ }