@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,528 @@
1
+ package com.mentra.bluetoothsdk
2
+
3
+ import com.mentra.bluetoothsdk.utils.DeviceTypes
4
+ import expo.modules.kotlin.modules.Module
5
+ import expo.modules.kotlin.modules.ModuleDefinition
6
+
7
+ class BluetoothSdkModule : Module() {
8
+ private var sdk: MentraBluetoothSdk? = null
9
+ private var deviceManager: DeviceManager? = null
10
+ private val sdkListener =
11
+ object : MentraBluetoothSdkListener {
12
+ override fun onGlassesStatusChanged(status: GlassesStatusUpdate) {
13
+ sendEvent("glasses_status", status.toMap())
14
+ }
15
+
16
+ override fun onBluetoothStatusChanged(status: BluetoothStatusUpdate) {
17
+ sendEvent("bluetooth_status", status.toMap())
18
+ }
19
+
20
+ override fun onDeviceDiscovered(device: Device) {
21
+ sendEvent("device_discovered", device.toMap())
22
+ }
23
+
24
+ override fun onDefaultDeviceChanged(device: Device?) {
25
+ val event =
26
+ buildMap<String, Any> {
27
+ device?.let { put("device", it.toMap()) }
28
+ }
29
+ sendEvent("default_device_changed", event)
30
+ }
31
+
32
+ override fun onScanStopped(reason: ScanStopReason) {
33
+ if (reason == ScanStopReason.COMPLETED) {
34
+ val status = sdk?.getBluetoothStatus()
35
+ val deviceModel =
36
+ status?.pendingWearable?.takeIf { it.isNotBlank() }
37
+ ?: status?.defaultWearable
38
+ ?: ""
39
+ sendEvent(
40
+ "compatible_glasses_search_stop",
41
+ mapOf(
42
+ "type" to "compatible_glasses_search_stop",
43
+ "device_model" to deviceModel,
44
+ )
45
+ )
46
+ }
47
+ }
48
+
49
+ override fun onButtonPress(event: ButtonPressEvent) {
50
+ sendEvent(
51
+ "button_press",
52
+ mapOf(
53
+ "buttonId" to event.buttonId,
54
+ "pressType" to event.pressType,
55
+ "timestamp" to (event.timestamp ?: System.currentTimeMillis())
56
+ )
57
+ )
58
+ }
59
+
60
+ override fun onTouch(event: TouchEvent) {
61
+ sendEvent("touch_event", event.values)
62
+ }
63
+
64
+ override fun onHeadUpChanged(headUp: Boolean) {
65
+ sendEvent("head_up", mapOf("up" to headUp))
66
+ }
67
+
68
+ override fun onBatteryStatus(event: BatteryStatusEvent) {
69
+ sendEvent("battery_status", event.values)
70
+ }
71
+
72
+ override fun onWifiStatusChanged(event: WifiStatusEvent) {
73
+ sendEvent("wifi_status_change", event.values)
74
+ }
75
+
76
+ override fun onHotspotStatusChanged(event: HotspotStatusEvent) {
77
+ sendEvent("hotspot_status_change", event.values)
78
+ }
79
+
80
+ override fun onHotspotError(event: HotspotErrorEvent) {
81
+ sendEvent("hotspot_error", event.values)
82
+ }
83
+
84
+ override fun onGalleryStatus(event: GalleryStatusEvent) {
85
+ sendEvent("gallery_status", event.values)
86
+ }
87
+
88
+ override fun onPhotoResponse(event: PhotoResponseEvent) {
89
+ sendEvent("photo_response", event.values)
90
+ }
91
+
92
+ override fun onStreamStatus(event: StreamStatusEvent) {
93
+ sendEvent("stream_status", event.values)
94
+ }
95
+
96
+ override fun onKeepAliveAck(event: KeepAliveAckEvent) {
97
+ sendEvent("keep_alive_ack", event.values)
98
+ }
99
+
100
+ override fun onMicPcm(frame: ByteArray) {
101
+ sendEvent("mic_pcm", mapOf("pcm" to frame))
102
+ }
103
+
104
+ override fun onMicLc3(frame: ByteArray) {
105
+ sendEvent("mic_lc3", mapOf("lc3" to frame))
106
+ }
107
+
108
+ override fun onLocalTranscription(event: LocalTranscriptionEvent) {
109
+ sendEvent("local_transcription", event.values)
110
+ }
111
+
112
+ override fun onLog(message: String) {
113
+ sendEvent("log", mapOf("message" to message))
114
+ }
115
+
116
+ override fun onError(error: BluetoothError) {
117
+ sendEvent("pair_failure", mapOf("error" to error.message))
118
+ }
119
+
120
+ override fun onRawEvent(eventName: String, values: Map<String, Any>) {
121
+ sendEvent(eventName, values)
122
+ }
123
+ }
124
+
125
+ override fun definition() = ModuleDefinition {
126
+ Name("BluetoothSdk")
127
+
128
+ // Define events that can be sent to JavaScript
129
+ Events(
130
+ "glasses_status",
131
+ "bluetooth_status",
132
+ "log",
133
+ "device_discovered",
134
+ "default_device_changed",
135
+ // Individual event handlers
136
+ "glasses_not_ready",
137
+ "button_press",
138
+ "touch_event",
139
+ "head_up",
140
+ "vad_status",
141
+ "battery_status",
142
+ "local_transcription",
143
+ "wifi_status_change",
144
+ "hotspot_status_change",
145
+ "hotspot_error",
146
+ "photo_response",
147
+ "gallery_status",
148
+ "compatible_glasses_search_stop",
149
+ "heartbeat_sent",
150
+ "heartbeat_received",
151
+ "send_command_to_ble",
152
+ "receive_command_from_ble",
153
+ "swipe_volume_status",
154
+ "switch_status",
155
+ "rgb_led_control_response",
156
+ "pair_failure",
157
+ "audio_pairing_needed",
158
+ "audio_connected",
159
+ "audio_disconnected",
160
+ "save_setting",
161
+ "phone_notification",
162
+ "phone_notification_dismissed",
163
+ "ws_text",
164
+ "ws_bin",
165
+ "mic_pcm",
166
+ "mic_lc3",
167
+ "stream_status",
168
+ "keep_alive_ack",
169
+ "mtk_update_complete",
170
+ "ota_update_available",
171
+ "ota_progress",
172
+ "ota_start_ack",
173
+ "ota_status",
174
+ // Nex / BLE debug (NexEventUtils → Bridge.sendTypedMessage)
175
+ "send_command_to_ble",
176
+ "receive_command_from_ble",
177
+ "miniapp_selected",
178
+ "captions_tester_incident",
179
+ )
180
+
181
+ OnCreate {
182
+ val context =
183
+ appContext.reactContext
184
+ ?: appContext.currentActivity
185
+ ?: throw IllegalStateException("No context available")
186
+ sdk = MentraBluetoothSdk.create(context, sdkListener)
187
+ deviceManager = DeviceManager.getInstance()
188
+ }
189
+
190
+ OnDestroy {
191
+ sdk?.close()
192
+ sdk = null
193
+ deviceManager = null
194
+ }
195
+
196
+ // MARK: - Observable Store Functions
197
+
198
+ Function("getGlassesStatus") {
199
+ sdk?.getGlassesStatus()?.toMap()
200
+ ?: GlassesStatus.fromMap(DeviceStore.store.getCategory("glasses")).toMap()
201
+ }
202
+
203
+ Function("getBluetoothStatus") {
204
+ sdk?.getBluetoothStatus()?.toMap() ?: DeviceStore.store.getCategory(ObservableStore.BLUETOOTH_CATEGORY)
205
+ }
206
+
207
+ Function("getDefaultDevice") { sdk?.getDefaultDevice()?.toMap() }
208
+
209
+ Function("set") { category: String, key: String, value: Any? ->
210
+ if (value != null) {
211
+ DeviceStore.apply(category, key, value)
212
+ }
213
+ }
214
+
215
+ Function("update") { category: String, values: Map<String, Any?> ->
216
+ val normalizedCategory = ObservableStore.normalizeCategory(category)
217
+ values.forEach { (key, value) ->
218
+ if (value != null) {
219
+ DeviceStore.apply(normalizedCategory, key, value)
220
+ }
221
+ }
222
+ // Persist core_token to SharedPreferences so MentraLive.getCoreToken() finds it
223
+ // (bridge may run this after glasses_ready; prefs survive retries and next connection)
224
+ // TODO: move this to the mantle:
225
+ // if (category == "bluetooth") {
226
+ // values["core_token"]?.let { token ->
227
+ // val len = (token as? String)?.length ?: 0
228
+ // android.util.Log.d("BluetoothSdkModule", "update(core) core_token received, len=$len")
229
+ // if (token is String && token.isNotEmpty()) {
230
+ // val ctx = appContext.reactContext ?: appContext.currentActivity
231
+ // ctx?.let {
232
+ // it.getSharedPreferences("augmentos_auth_prefs", android.content.Context.MODE_PRIVATE)
233
+ // .edit()
234
+ // .putString("core_token", token)
235
+ // .apply()
236
+ // android.util.Log.d("BluetoothSdkModule", "Persisted core_token to SharedPreferences, len=${token.length}")
237
+ // }
238
+ // }
239
+ // }
240
+ // }
241
+ }
242
+
243
+ // MARK: - Display Commands
244
+
245
+ AsyncFunction("displayEvent") { params: Map<String, Any> ->
246
+ sdk?.displayEvent(DisplayEventRequest(params))
247
+ }
248
+
249
+ AsyncFunction("displayText") { params: Map<String, Any> ->
250
+ sdk?.displayText(
251
+ DisplayTextRequest(
252
+ text = params["text"] as? String ?: "",
253
+ x = (params["x"] as? Number)?.toInt() ?: 0,
254
+ y = (params["y"] as? Number)?.toInt() ?: 0,
255
+ size = (params["size"] as? Number)?.toInt() ?: 24,
256
+ )
257
+ )
258
+ }
259
+
260
+ AsyncFunction("clearDisplay") { sdk?.clearDisplay() }
261
+
262
+ // MARK: - Connection Commands
263
+
264
+ AsyncFunction("connectDefault") { sdk?.connectDefault() }
265
+
266
+ AsyncFunction("connectDefaultWithOptions") { options: Map<String, Any> ->
267
+ sdk?.connectDefault(options.toMentraConnectOptions())
268
+ }
269
+
270
+ AsyncFunction("setDefaultDevice") { device: Map<String, Any>? ->
271
+ sdk?.setDefaultDevice(device.toMentraDevice())
272
+ }
273
+
274
+ AsyncFunction("clearDefaultDevice") { sdk?.clearDefaultDevice() }
275
+
276
+ AsyncFunction("connectWithOptions") { device: Map<String, Any>, options: Map<String, Any> ->
277
+ sdk?.connect(
278
+ device.toMentraDevice() ?: throw IllegalArgumentException("connect requires a Device with model and name."),
279
+ options.toMentraConnectOptions(),
280
+ )
281
+ }
282
+
283
+ AsyncFunction("connectSimulated") { sdk?.connectSimulated() }
284
+
285
+ AsyncFunction("disconnect") { sdk?.disconnect() }
286
+
287
+ AsyncFunction("forget") { sdk?.forget() }
288
+
289
+ AsyncFunction("connectDefaultController") { deviceManager?.connectDefaultController() }
290
+
291
+ AsyncFunction("disconnectController") { deviceManager?.disconnectController() }
292
+
293
+ AsyncFunction("forgetController") { deviceManager?.forgetController() }
294
+
295
+ AsyncFunction("startScan") { params: Map<String, Any> ->
296
+ val model = params["model"] as? String ?: DeviceTypes.LIVE
297
+ sdk?.startScan(DeviceModel.fromDeviceType(model))
298
+ }
299
+
300
+ AsyncFunction("cancelConnectionAttempt") { sdk?.cancelConnectionAttempt() }
301
+
302
+ AsyncFunction("showDashboard") { sdk?.showDashboard() }
303
+
304
+ AsyncFunction("ping") { deviceManager?.ping() }
305
+
306
+ AsyncFunction("dbg1") {
307
+ deviceManager?.dbg1()
308
+ deviceManager?.sgc?.dbg1()
309
+ }
310
+ AsyncFunction("dbg2") {
311
+ deviceManager?.dbg2()
312
+ deviceManager?.sgc?.dbg2()
313
+ }
314
+
315
+ // Stub on Android — iOS uses this for the jetsam stress test.
316
+ Function("getMemoryMB") { -> 0.0 }
317
+
318
+ // MARK: - Incident Reporting
319
+
320
+ AsyncFunction("sendIncidentId") { incidentId: String, apiBaseUrl: String? ->
321
+ sdk?.sendIncidentId(incidentId, apiBaseUrl)
322
+ }
323
+
324
+ // MARK: - WiFi Commands
325
+
326
+ AsyncFunction("requestWifiScan") { sdk?.requestWifiScan() }
327
+
328
+ AsyncFunction("sendWifiCredentials") { ssid: String, password: String ->
329
+ sdk?.sendWifiCredentials(ssid, password)
330
+ }
331
+
332
+ AsyncFunction("forgetWifiNetwork") { ssid: String -> sdk?.forgetWifiNetwork(ssid) }
333
+
334
+ AsyncFunction("setHotspotState") { enabled: Boolean ->
335
+ sdk?.setHotspotState(enabled)
336
+ }
337
+
338
+ // MARK: - Gallery Commands
339
+
340
+ AsyncFunction("setGalleryMode") { mode: String ->
341
+ val galleryMode =
342
+ when (mode.lowercase()) {
343
+ "auto" -> GalleryMode.AUTO
344
+ "manual" -> GalleryMode.MANUAL
345
+ else -> throw IllegalArgumentException("setGalleryMode mode must be \"auto\" or \"manual\".")
346
+ }
347
+ sdk?.setGalleryMode(galleryMode)
348
+ }
349
+
350
+ AsyncFunction("queryGalleryStatus") { sdk?.queryGalleryStatus() }
351
+
352
+ AsyncFunction("photoRequest") {
353
+ requestId: String,
354
+ appId: String,
355
+ size: String,
356
+ webhookUrl: String,
357
+ authToken: String?,
358
+ compress: String,
359
+ flash: Boolean,
360
+ sound: Boolean ->
361
+ sdk?.requestPhoto(
362
+ PhotoRequest(
363
+ requestId = requestId,
364
+ appId = appId,
365
+ size = PhotoSize.fromValue(size),
366
+ webhookUrl = webhookUrl,
367
+ authToken = authToken,
368
+ compress = PhotoCompression.fromValue(compress),
369
+ flash = flash,
370
+ sound = sound,
371
+ )
372
+ )
373
+ }
374
+
375
+ // MARK: - OTA Commands
376
+
377
+ AsyncFunction("sendOtaStart") { sdk?.sendOtaStart() }
378
+
379
+ AsyncFunction("sendOtaQueryStatus") { sdk?.sendOtaQueryStatus() }
380
+
381
+ // MARK: - Version Info Commands
382
+
383
+ AsyncFunction("requestVersionInfo") { sdk?.requestVersionInfo() }
384
+
385
+ // MARK: - Power Control Commands
386
+
387
+ AsyncFunction("sendShutdown") { sdk?.sendShutdown() }
388
+
389
+ AsyncFunction("sendReboot") { sdk?.sendReboot() }
390
+
391
+ // MARK: - Video Recording Commands
392
+
393
+ AsyncFunction("startVideoRecording") { requestId: String, save: Boolean, flash: Boolean, sound: Boolean ->
394
+ sdk?.startVideoRecording(VideoRecordingRequest(requestId, save, flash, sound))
395
+ }
396
+
397
+ AsyncFunction("stopVideoRecording") { requestId: String ->
398
+ sdk?.stopVideoRecording(requestId)
399
+ }
400
+
401
+ // MARK: - Stream Commands
402
+
403
+ AsyncFunction("startStream") { params: Map<String, Any> ->
404
+ sdk?.startStream(StreamRequest.fromMap(params))
405
+ }
406
+
407
+ AsyncFunction("stopStream") { sdk?.stopStream() }
408
+
409
+ AsyncFunction("keepStreamAlive") { params: Map<String, Any> ->
410
+ sdk?.keepStreamAlive(StreamKeepAliveRequest.fromMap(params))
411
+ }
412
+
413
+ // MARK: - Microphone Commands
414
+
415
+ AsyncFunction("setMicState") {
416
+ sendPcmData: Boolean,
417
+ sendTranscript: Boolean,
418
+ bypassVad: Boolean ->
419
+ sdk?.setMicState(
420
+ MicConfig(
421
+ sendPcmData = sendPcmData,
422
+ sendTranscript = sendTranscript,
423
+ bypassVad = bypassVad,
424
+ )
425
+ )
426
+ }
427
+
428
+ AsyncFunction("restartTranscriber") { deviceManager?.restartTranscriber() }
429
+
430
+ // MARK: - Audio Playback Monitoring
431
+
432
+ AsyncFunction("setOwnAppAudioPlaying") { playing: Boolean ->
433
+ sdk?.setOwnAppAudioPlaying(playing)
434
+ }
435
+
436
+ AsyncFunction("getGlassesMediaVolume") {
437
+ val cm = deviceManager ?: throw IllegalStateException("device_manager_null")
438
+ cm.getGlassesMediaVolumeBlocking()
439
+ }
440
+
441
+ AsyncFunction("setGlassesMediaVolume") { level: Int ->
442
+ val cm = deviceManager ?: throw IllegalStateException("device_manager_null")
443
+ cm.setGlassesMediaVolumeBlocking(level)
444
+ }
445
+
446
+ // MARK: - RGB LED Control
447
+
448
+ AsyncFunction("rgbLedControl") {
449
+ requestId: String,
450
+ packageName: String?,
451
+ action: String,
452
+ color: String?,
453
+ ontime: Int,
454
+ offtime: Int,
455
+ count: Int ->
456
+ sdk?.rgbLedControl(
457
+ RgbLedRequest(
458
+ requestId = requestId,
459
+ packageName = packageName,
460
+ action = RgbLedAction.fromValue(action),
461
+ color = RgbLedColor.fromValue(color),
462
+ ontime = ontime,
463
+ offtime = offtime,
464
+ count = count,
465
+ )
466
+ )
467
+ }
468
+
469
+ // MARK: - STT Commands
470
+
471
+ AsyncFunction("setSttModelDetails") { path: String, languageCode: String ->
472
+ val context =
473
+ appContext.reactContext
474
+ ?: appContext.currentActivity
475
+ ?: throw IllegalStateException("No context available")
476
+ com.mentra.bluetoothsdk.stt.STTTools.setSttModelDetails(context, path, languageCode)
477
+ }
478
+
479
+ AsyncFunction("getSttModelPath") { ->
480
+ val context =
481
+ appContext.reactContext
482
+ ?: appContext.currentActivity
483
+ ?: throw IllegalStateException("No context available")
484
+ com.mentra.bluetoothsdk.stt.STTTools.getSttModelPath(context)
485
+ }
486
+
487
+ AsyncFunction("checkSttModelAvailable") { ->
488
+ val context =
489
+ appContext.reactContext
490
+ ?: appContext.currentActivity
491
+ ?: throw IllegalStateException("No context available")
492
+ com.mentra.bluetoothsdk.stt.STTTools.checkSTTModelAvailable(context)
493
+ }
494
+
495
+ AsyncFunction("validateSttModel") { path: String ->
496
+ com.mentra.bluetoothsdk.stt.STTTools.validateSTTModel(path)
497
+ }
498
+
499
+ AsyncFunction("extractTarBz2") { sourcePath: String, destinationPath: String ->
500
+ com.mentra.bluetoothsdk.stt.STTTools.extractTarBz2(sourcePath, destinationPath)
501
+ }
502
+
503
+ }
504
+ }
505
+
506
+ private fun Map<String, Any>?.toMentraDevice(): Device? {
507
+ val values = this ?: return null
508
+ val model = values["model"] as? String ?: values["deviceModel"] as? String ?: return null
509
+ val name = values["name"] as? String ?: values["deviceName"] as? String ?: return null
510
+ val address = values["address"] as? String ?: values["deviceAddress"] as? String
511
+ val rssi = (values["rssi"] as? Number)?.toInt()
512
+ val id = values["id"] as? String
513
+ return Device(
514
+ model = DeviceModel.fromDeviceType(model),
515
+ name = name,
516
+ address = address?.takeIf { it.isNotBlank() },
517
+ rssi = rssi,
518
+ id = id?.takeIf { it.isNotBlank() } ?: address?.takeIf { it.isNotBlank() } ?: "$model:$name",
519
+ )
520
+ }
521
+
522
+ private fun Map<String, Any>?.toMentraConnectOptions(): ConnectOptions {
523
+ val values = this ?: return ConnectOptions()
524
+ return ConnectOptions(
525
+ saveAsDefault = values["saveAsDefault"] as? Boolean ?: true,
526
+ cancelExistingConnectionAttempt = values["cancelExistingConnectionAttempt"] as? Boolean ?: true,
527
+ )
528
+ }