@glassly/bluetooth-sdk 0.1.0-dev.100

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 (553) hide show
  1. package/README.md +563 -0
  2. package/android/build.gradle +450 -0
  3. package/android/gradle.properties.example +9 -0
  4. package/android/lc3Lib/CMakeLists.txt +6 -0
  5. package/android/lc3Lib/build.gradle +212 -0
  6. package/android/lc3Lib/proguard-rules.pro +33 -0
  7. package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
  8. package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
  9. package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
  10. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
  11. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
  12. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
  13. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
  14. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
  15. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
  16. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
  17. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
  18. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
  19. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
  20. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
  21. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
  22. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
  23. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
  24. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
  25. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
  26. package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
  27. package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
  28. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
  29. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
  30. package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
  31. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
  32. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
  33. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
  34. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
  35. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
  36. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
  37. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
  38. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
  39. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
  40. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
  41. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
  42. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
  43. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
  44. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
  45. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
  46. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
  47. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
  48. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
  49. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
  50. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
  51. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
  52. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
  53. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
  54. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
  55. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
  56. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
  57. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
  58. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
  59. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
  60. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
  61. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
  62. package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
  63. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
  64. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
  65. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
  66. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
  67. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
  68. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
  69. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
  70. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
  71. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
  72. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
  73. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
  74. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
  75. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
  76. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
  77. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
  78. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
  79. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
  80. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
  81. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
  82. package/android/lc3Lib/src/main/java/com/glassly/lc3Lib/Lc3Cpp.java +38 -0
  83. package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
  84. package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
  85. package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
  86. package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
  87. package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
  88. package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
  89. package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
  90. package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
  91. package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
  92. package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
  93. package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
  94. package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
  95. package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
  96. package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
  97. package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
  98. package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
  99. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
  100. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
  101. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
  102. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
  103. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
  104. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
  105. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
  106. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
  107. package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
  108. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
  109. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
  110. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
  111. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
  112. package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
  113. package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
  114. package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
  115. package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
  116. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
  117. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
  118. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
  119. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
  120. package/android/settings.gradle +4 -0
  121. package/android/silero/LICENSE.md +17 -0
  122. package/android/silero/build.gradle +50 -0
  123. package/android/silero/proguard-rules.pro +24 -0
  124. package/android/silero/src/androidTest/assets/hello.wav +0 -0
  125. package/android/silero/src/androidTest/java/com/konovalov/vad/silero/VadSileroTest.kt +79 -0
  126. package/android/silero/src/main/assets/LICENSE +21 -0
  127. package/android/silero/src/main/assets/silero_vad.onnx +0 -0
  128. package/android/silero/src/main/java/com/konovalov/vad/silero/Vad.kt +160 -0
  129. package/android/silero/src/main/java/com/konovalov/vad/silero/VadSilero.kt +449 -0
  130. package/android/silero/src/main/java/com/konovalov/vad/silero/config/FrameSize.kt +15 -0
  131. package/android/silero/src/main/java/com/konovalov/vad/silero/config/Mode.kt +14 -0
  132. package/android/silero/src/main/java/com/konovalov/vad/silero/config/SampleRate.kt +12 -0
  133. package/android/silero/src/main/java/com/konovalov/vad/silero/utils/AudioUtils.kt +47 -0
  134. package/android/silero/src/main/java/com/konovalov/vad/silero/utils/TensorMap.kt +41 -0
  135. package/android/silero/src/test/java/com/konovalov/vad/silero/utils/AudioUtilsTest.kt +44 -0
  136. package/android/src/main/AndroidManifest.xml +42 -0
  137. package/android/src/main/assets/G2Firmware/README.md +11 -0
  138. package/android/src/main/assets/G2Firmware/g2-glassly-cfw-2.2.9.22.evenota.bin +0 -0
  139. package/android/src/main/assets/G2Firmware/g2-stock-2.2.9.22.evenota.bin +0 -0
  140. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdk.kt +2321 -0
  141. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkAnalytics.kt +216 -0
  142. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDebug.kt +14 -0
  143. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDefaults.kt +7 -0
  144. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkModule.kt +1087 -0
  145. package/android/src/main/java/com/glassly/bluetoothsdk/Bridge.kt +953 -0
  146. package/android/src/main/java/com/glassly/bluetoothsdk/DeviceManager.kt +2472 -0
  147. package/android/src/main/java/com/glassly/bluetoothsdk/DeviceStore.kt +359 -0
  148. package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedChangelogCatalog.kt +9 -0
  149. package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedReleaseMetadata.kt +11 -0
  150. package/android/src/main/java/com/glassly/bluetoothsdk/LocalNetworkModule.kt +414 -0
  151. package/android/src/main/java/com/glassly/bluetoothsdk/ObservableStore.kt +88 -0
  152. package/android/src/main/java/com/glassly/bluetoothsdk/OtaManifest.kt +191 -0
  153. package/android/src/main/java/com/glassly/bluetoothsdk/ReleaseChangelog.kt +61 -0
  154. package/android/src/main/java/com/glassly/bluetoothsdk/ScopedNetworkReadiness.kt +17 -0
  155. package/android/src/main/java/com/glassly/bluetoothsdk/audio/AudioModels.kt +144 -0
  156. package/android/src/main/java/com/glassly/bluetoothsdk/camera/CameraModels.kt +486 -0
  157. package/android/src/main/java/com/glassly/bluetoothsdk/connection/ConnectionModels.kt +78 -0
  158. package/android/src/main/java/com/glassly/bluetoothsdk/controllers/ControllerManager.kt +158 -0
  159. package/android/src/main/java/com/glassly/bluetoothsdk/controllers/R1.kt +1057 -0
  160. package/android/src/main/java/com/glassly/bluetoothsdk/debug/BleTraceLogger.kt +165 -0
  161. package/android/src/main/java/com/glassly/bluetoothsdk/events/BluetoothEvents.kt +178 -0
  162. package/android/src/main/java/com/glassly/bluetoothsdk/internal/MapParsing.kt +140 -0
  163. package/android/src/main/java/com/glassly/bluetoothsdk/net/LocalIpv4.kt +57 -0
  164. package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServer.kt +304 -0
  165. package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/OtaServerModule.kt +120 -0
  166. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistry.java +108 -0
  167. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoUploadServer.kt +622 -0
  168. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/PhotoReceiverModule.kt +156 -0
  169. package/android/src/main/java/com/glassly/bluetoothsdk/requests/DisplayRequests.kt +56 -0
  170. package/android/src/main/java/com/glassly/bluetoothsdk/services/Foreground.kt +272 -0
  171. package/android/src/main/java/com/glassly/bluetoothsdk/services/PhoneMic.kt +1195 -0
  172. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Ar99.java +2653 -0
  173. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuard.kt +49 -0
  174. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapper.kt +27 -0
  175. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1.kt +3837 -0
  176. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizer.kt +38 -0
  177. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2.kt +6457 -0
  178. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassification.kt +49 -0
  179. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwRenderer.kt +1253 -0
  180. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCache.kt +270 -0
  181. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocol.kt +291 -0
  182. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2Flasher.kt +411 -0
  183. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/GlasslyBle.java +43189 -0
  184. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Mach1.kt +1267 -0
  185. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLive.kt +10742 -0
  186. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLiveL2capChannel.kt +274 -0
  187. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisement.kt +54 -0
  188. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraNex.kt +2008 -0
  189. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Nimo.kt +2532 -0
  190. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/SGCManager.kt +470 -0
  191. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Simulated.kt +228 -0
  192. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/Ar99OtaManager.java +566 -0
  193. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaByteUtils.java +18 -0
  194. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCommandConstants.java +35 -0
  195. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCrc32Util.java +13 -0
  196. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaGattTransport.java +11 -0
  197. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaProtocol.java +92 -0
  198. package/android/src/main/java/com/glassly/bluetoothsdk/speakerid/SpeakerIdEngine.kt +525 -0
  199. package/android/src/main/java/com/glassly/bluetoothsdk/status/DeviceStatus.kt +669 -0
  200. package/android/src/main/java/com/glassly/bluetoothsdk/status/RuntimeState.kt +201 -0
  201. package/android/src/main/java/com/glassly/bluetoothsdk/status/WifiHotspotStatus.kt +189 -0
  202. package/android/src/main/java/com/glassly/bluetoothsdk/streaming/StreamModels.kt +518 -0
  203. package/android/src/main/java/com/glassly/bluetoothsdk/stt/STTTools.kt +391 -0
  204. package/android/src/main/java/com/glassly/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +518 -0
  205. package/android/src/main/java/com/glassly/bluetoothsdk/stt/VadGateSpeechPolicy.kt +227 -0
  206. package/android/src/main/java/com/glassly/bluetoothsdk/tts/TTSTools.kt +248 -0
  207. package/android/src/main/java/com/glassly/bluetoothsdk/types/DeviceModels.kt +96 -0
  208. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AES.java +106 -0
  209. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
  210. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AvifExifStripper.java +573 -0
  211. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
  212. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleJsonCompact.java +496 -0
  213. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadService.java +677 -0
  214. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleWireProtocol.java +108 -0
  215. package/android/src/main/java/com/glassly/bluetoothsdk/utils/Constants.kt +46 -0
  216. package/android/src/main/java/com/glassly/bluetoothsdk/utils/G1Text.kt +436 -0
  217. package/android/src/main/java/com/glassly/bluetoothsdk/utils/HeifExifTagReader.java +199 -0
  218. package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
  219. package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleUploadService.java +77 -0
  220. package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900LengthCodec.java +115 -0
  221. package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtils.java +827 -0
  222. package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunkReassembler.java +228 -0
  223. package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunker.java +325 -0
  224. package/android/src/main/java/com/glassly/bluetoothsdk/utils/NexSGCUtils.kt +698 -0
  225. package/android/src/main/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitor.kt +348 -0
  226. package/android/src/main/java/com/glassly/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
  227. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Ar99OpusPcmDecoder.java +398 -0
  228. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
  229. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
  230. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
  231. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PcmStreamPlayer.kt +328 -0
  232. package/android/src/main/res/values/strings.xml +4 -0
  233. package/android/src/test/java/com/glassly/bluetoothsdk/BluetoothSdkExceptionTest.kt +18 -0
  234. package/android/src/test/java/com/glassly/bluetoothsdk/OtaManifestDowngradeTest.kt +86 -0
  235. package/android/src/test/java/com/glassly/bluetoothsdk/OtaStartResponsePolicyTest.kt +30 -0
  236. package/android/src/test/java/com/glassly/bluetoothsdk/ReleaseChangelogTest.kt +13 -0
  237. package/android/src/test/java/com/glassly/bluetoothsdk/ScopedNetworkReadinessTest.kt +39 -0
  238. package/android/src/test/java/com/glassly/bluetoothsdk/StreamStatusEventTest.kt +29 -0
  239. package/android/src/test/java/com/glassly/bluetoothsdk/camera/PhotoRequestTest.kt +141 -0
  240. package/android/src/test/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServerTest.kt +82 -0
  241. package/android/src/test/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistryTest.java +75 -0
  242. package/android/src/test/java/com/glassly/bluetoothsdk/services/ForegroundServiceTypeTest.kt +69 -0
  243. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/Ar99AdvertisementMatcherTest.java +22 -0
  244. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuardTest.kt +73 -0
  245. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapperTest.kt +67 -0
  246. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/EvenRleTest.kt +63 -0
  247. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizerTest.kt +31 -0
  248. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassificationTest.kt +89 -0
  249. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwRendererTest.kt +344 -0
  250. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCacheTest.kt +200 -0
  251. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocolTest.kt +131 -0
  252. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLiveGattCharacteristicsTest.kt +39 -0
  253. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisementParserTest.kt +133 -0
  254. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/NimoProtocolTest.kt +333 -0
  255. package/android/src/test/java/com/glassly/bluetoothsdk/utils/AvifExifStripperTest.java +46 -0
  256. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BinaryMessageChunkerTest.java +84 -0
  257. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BleJsonCompactTest.java +319 -0
  258. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadServiceTest.java +107 -0
  259. package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsEndiannessTest.java +172 -0
  260. package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsTest.java +24 -0
  261. package/android/src/test/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitorTest.kt +45 -0
  262. package/android/src/test/resources/avif_with_exif.avif +0 -0
  263. package/app.plugin.js +3 -0
  264. package/build/BluetoothSdk.types.d.ts +1390 -0
  265. package/build/BluetoothSdk.types.d.ts.map +1 -0
  266. package/build/BluetoothSdk.types.js +41 -0
  267. package/build/BluetoothSdk.types.js.map +1 -0
  268. package/build/_internal.d.ts +17 -0
  269. package/build/_internal.d.ts.map +1 -0
  270. package/build/_internal.js +16 -0
  271. package/build/_internal.js.map +1 -0
  272. package/build/_private/BluetoothSdkModule.d.ts +171 -0
  273. package/build/_private/BluetoothSdkModule.d.ts.map +1 -0
  274. package/build/_private/BluetoothSdkModule.js +300 -0
  275. package/build/_private/BluetoothSdkModule.js.map +1 -0
  276. package/build/_private/LocalNetworkModule.d.ts +38 -0
  277. package/build/_private/LocalNetworkModule.d.ts.map +1 -0
  278. package/build/_private/LocalNetworkModule.js +3 -0
  279. package/build/_private/LocalNetworkModule.js.map +1 -0
  280. package/build/_private/cameraRequestPayload.d.ts +4 -0
  281. package/build/_private/cameraRequestPayload.d.ts.map +1 -0
  282. package/build/_private/cameraRequestPayload.js +32 -0
  283. package/build/_private/cameraRequestPayload.js.map +1 -0
  284. package/build/_private/photoRequestPayload.d.ts +6 -0
  285. package/build/_private/photoRequestPayload.d.ts.map +1 -0
  286. package/build/_private/photoRequestPayload.js +86 -0
  287. package/build/_private/photoRequestPayload.js.map +1 -0
  288. package/build/_private/sdkOtaManifest.d.ts +11 -0
  289. package/build/_private/sdkOtaManifest.d.ts.map +1 -0
  290. package/build/_private/sdkOtaManifest.js +15 -0
  291. package/build/_private/sdkOtaManifest.js.map +1 -0
  292. package/build/changelogs.d.ts +7 -0
  293. package/build/changelogs.d.ts.map +1 -0
  294. package/build/changelogs.js +46 -0
  295. package/build/changelogs.js.map +1 -0
  296. package/build/debug.d.ts +3 -0
  297. package/build/debug.d.ts.map +1 -0
  298. package/build/debug.js +8 -0
  299. package/build/debug.js.map +1 -0
  300. package/build/generated/changelogCatalog.d.ts +12 -0
  301. package/build/generated/changelogCatalog.d.ts.map +1 -0
  302. package/build/generated/changelogCatalog.js +16 -0
  303. package/build/generated/changelogCatalog.js.map +1 -0
  304. package/build/generated/releaseMetadata.d.ts +12 -0
  305. package/build/generated/releaseMetadata.d.ts.map +1 -0
  306. package/build/generated/releaseMetadata.js +10 -0
  307. package/build/generated/releaseMetadata.js.map +1 -0
  308. package/build/index.d.ts +6 -0
  309. package/build/index.d.ts.map +1 -0
  310. package/build/index.js +170 -0
  311. package/build/index.js.map +1 -0
  312. package/build/ota-server/OtaServer.types.d.ts +14 -0
  313. package/build/ota-server/OtaServer.types.d.ts.map +1 -0
  314. package/build/ota-server/OtaServer.types.js +2 -0
  315. package/build/ota-server/OtaServer.types.js.map +1 -0
  316. package/build/ota-server/OtaServerModule.d.ts +21 -0
  317. package/build/ota-server/OtaServerModule.d.ts.map +1 -0
  318. package/build/ota-server/OtaServerModule.js +3 -0
  319. package/build/ota-server/OtaServerModule.js.map +1 -0
  320. package/build/ota-server/OtaServerModule.web.d.ts +10 -0
  321. package/build/ota-server/OtaServerModule.web.d.ts.map +1 -0
  322. package/build/ota-server/OtaServerModule.web.js +12 -0
  323. package/build/ota-server/OtaServerModule.web.js.map +1 -0
  324. package/build/ota-server/index.d.ts +3 -0
  325. package/build/ota-server/index.d.ts.map +1 -0
  326. package/build/ota-server/index.js +3 -0
  327. package/build/ota-server/index.js.map +1 -0
  328. package/build/ota-transport/index.d.ts +67 -0
  329. package/build/ota-transport/index.d.ts.map +1 -0
  330. package/build/ota-transport/index.js +58 -0
  331. package/build/ota-transport/index.js.map +1 -0
  332. package/build/photo-receiver/PhotoReceiver.types.d.ts +18 -0
  333. package/build/photo-receiver/PhotoReceiver.types.d.ts.map +1 -0
  334. package/build/photo-receiver/PhotoReceiver.types.js +2 -0
  335. package/build/photo-receiver/PhotoReceiver.types.js.map +1 -0
  336. package/build/photo-receiver/PhotoReceiverModule.d.ts +10 -0
  337. package/build/photo-receiver/PhotoReceiverModule.d.ts.map +1 -0
  338. package/build/photo-receiver/PhotoReceiverModule.js +3 -0
  339. package/build/photo-receiver/PhotoReceiverModule.js.map +1 -0
  340. package/build/photo-receiver/PhotoReceiverModule.web.d.ts +10 -0
  341. package/build/photo-receiver/PhotoReceiverModule.web.d.ts.map +1 -0
  342. package/build/photo-receiver/PhotoReceiverModule.web.js +12 -0
  343. package/build/photo-receiver/PhotoReceiverModule.web.js.map +1 -0
  344. package/build/photo-receiver/index.d.ts +3 -0
  345. package/build/photo-receiver/index.d.ts.map +1 -0
  346. package/build/photo-receiver/index.js +3 -0
  347. package/build/photo-receiver/index.js.map +1 -0
  348. package/build/react/index.d.ts +5 -0
  349. package/build/react/index.d.ts.map +1 -0
  350. package/build/react/index.js +4 -0
  351. package/build/react/index.js.map +1 -0
  352. package/build/react/useBluetooth.d.ts +100 -0
  353. package/build/react/useBluetooth.d.ts.map +1 -0
  354. package/build/react/useBluetooth.js +167 -0
  355. package/build/react/useBluetooth.js.map +1 -0
  356. package/build/react/useBluetoothEvent.d.ts +6 -0
  357. package/build/react/useBluetoothEvent.d.ts.map +1 -0
  358. package/build/react/useBluetoothEvent.js +21 -0
  359. package/build/react/useBluetoothEvent.js.map +1 -0
  360. package/build/react/useBluetoothScan.d.ts +22 -0
  361. package/build/react/useBluetoothScan.d.ts.map +1 -0
  362. package/build/react/useBluetoothScan.js +135 -0
  363. package/build/react/useBluetoothScan.js.map +1 -0
  364. package/build/react/useBluetoothStatus.d.ts +16 -0
  365. package/build/react/useBluetoothStatus.d.ts.map +1 -0
  366. package/build/react/useBluetoothStatus.js +137 -0
  367. package/build/react/useBluetoothStatus.js.map +1 -0
  368. package/build/react/useGlassesConnection.d.ts +29 -0
  369. package/build/react/useGlassesConnection.d.ts.map +1 -0
  370. package/build/react/useGlassesConnection.js +153 -0
  371. package/build/react/useGlassesConnection.js.map +1 -0
  372. package/build/types/index.d.ts +3 -0
  373. package/build/types/index.d.ts.map +1 -0
  374. package/build/types/index.js +2 -0
  375. package/build/types/index.js.map +1 -0
  376. package/expo-module.config.json +14 -0
  377. package/ios/BackgroundOtaArtifactDownloader.swift +125 -0
  378. package/ios/BluetoothSdkModule.swift +1028 -0
  379. package/ios/GlasslyBluetoothSDK.podspec +106 -0
  380. package/ios/LocalIPv4.swift +150 -0
  381. package/ios/LocalOtaServer.swift +309 -0
  382. package/ios/LocalPhotoUploadServer.swift +754 -0
  383. package/ios/OtaServerModule.swift +147 -0
  384. package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
  385. package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
  386. package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
  387. package/ios/Packages/CoreObjC/attdet.c +92 -0
  388. package/ios/Packages/CoreObjC/attdet.h +44 -0
  389. package/ios/Packages/CoreObjC/bits.c +375 -0
  390. package/ios/Packages/CoreObjC/bits.h +315 -0
  391. package/ios/Packages/CoreObjC/bwdet.c +129 -0
  392. package/ios/Packages/CoreObjC/bwdet.h +69 -0
  393. package/ios/Packages/CoreObjC/common.h +151 -0
  394. package/ios/Packages/CoreObjC/energy.c +70 -0
  395. package/ios/Packages/CoreObjC/energy.h +43 -0
  396. package/ios/Packages/CoreObjC/fastmath.h +158 -0
  397. package/ios/Packages/CoreObjC/include/PcmConverter.h +22 -0
  398. package/ios/Packages/CoreObjC/lc3.c +704 -0
  399. package/ios/Packages/CoreObjC/lc3.h +313 -0
  400. package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
  401. package/ios/Packages/CoreObjC/lc3_private.h +163 -0
  402. package/ios/Packages/CoreObjC/ltpf.c +905 -0
  403. package/ios/Packages/CoreObjC/ltpf.h +111 -0
  404. package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
  405. package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
  406. package/ios/Packages/CoreObjC/makefile.mk +35 -0
  407. package/ios/Packages/CoreObjC/mdct.c +469 -0
  408. package/ios/Packages/CoreObjC/mdct.h +57 -0
  409. package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
  410. package/ios/Packages/CoreObjC/meson.build +61 -0
  411. package/ios/Packages/CoreObjC/plc.c +61 -0
  412. package/ios/Packages/CoreObjC/plc.h +57 -0
  413. package/ios/Packages/CoreObjC/rnnoise.h +114 -0
  414. package/ios/Packages/CoreObjC/sns.c +880 -0
  415. package/ios/Packages/CoreObjC/sns.h +103 -0
  416. package/ios/Packages/CoreObjC/spec.c +907 -0
  417. package/ios/Packages/CoreObjC/spec.h +119 -0
  418. package/ios/Packages/CoreObjC/tables.c +3457 -0
  419. package/ios/Packages/CoreObjC/tables.h +94 -0
  420. package/ios/Packages/CoreObjC/tns.c +457 -0
  421. package/ios/Packages/CoreObjC/tns.h +99 -0
  422. package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
  423. package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
  424. package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +2383 -0
  425. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +48 -0
  426. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
  427. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
  428. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
  429. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
  430. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
  431. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
  432. package/ios/Packages/libbz2/module.modulemap +5 -0
  433. package/ios/Packages/libbz2/shim.h +1 -0
  434. package/ios/PhotoReceiverModule.swift +129 -0
  435. package/ios/Source/BluetoothSDK.swift +2299 -0
  436. package/ios/Source/BluetoothSDKDebug.swift +12 -0
  437. package/ios/Source/BluetoothSdkDefaults.swift +29 -0
  438. package/ios/Source/Bridge.swift +708 -0
  439. package/ios/Source/Bridging-Header.h +16 -0
  440. package/ios/Source/DeviceManager.swift +2054 -0
  441. package/ios/Source/DeviceStore.swift +350 -0
  442. package/ios/Source/GeneratedChangelogCatalog.swift +8 -0
  443. package/ios/Source/GeneratedReleaseMetadata.swift +11 -0
  444. package/ios/Source/ObservableStore.swift +118 -0
  445. package/ios/Source/OtaManifest.swift +211 -0
  446. package/ios/Source/PrivacyInfo.xcprivacy +23 -0
  447. package/ios/Source/ReleaseChangelog.swift +65 -0
  448. package/ios/Source/Resources/G2Firmware/README.md +10 -0
  449. package/ios/Source/Resources/G2Firmware/g2-glassly-cfw-2.2.9.22.evenota.bin +0 -0
  450. package/ios/Source/Resources/G2Firmware/g2-stock-2.2.9.22.evenota.bin +0 -0
  451. package/ios/Source/audio/AudioModels.swift +178 -0
  452. package/ios/Source/audio/PcmStreamPlayer.swift +410 -0
  453. package/ios/Source/camera/CameraModels.swift +866 -0
  454. package/ios/Source/connection/ScanSession.swift +27 -0
  455. package/ios/Source/controllers/ControllerManager.swift +184 -0
  456. package/ios/Source/controllers/R1.swift +925 -0
  457. package/ios/Source/errors/BluetoothSdkError.swift +19 -0
  458. package/ios/Source/events/BluetoothEvents.swift +342 -0
  459. package/ios/Source/internal/BleTraceLogger.swift +192 -0
  460. package/ios/Source/internal/BluetoothAvailability.swift +78 -0
  461. package/ios/Source/internal/BluetoothSdkAnalytics.swift +199 -0
  462. package/ios/Source/internal/ValueParsing.swift +99 -0
  463. package/ios/Source/requests/DisplayRequests.swift +82 -0
  464. package/ios/Source/services/PhoneMic.swift +662 -0
  465. package/ios/Source/sgcs/Ar99.swift +2451 -0
  466. package/ios/Source/sgcs/G1.swift +2554 -0
  467. package/ios/Source/sgcs/G2.swift +7142 -0
  468. package/ios/Source/sgcs/G2CfwClassification.swift +43 -0
  469. package/ios/Source/sgcs/G2CfwRenderer.swift +1295 -0
  470. package/ios/Source/sgcs/G2CfwTextureCache.swift +233 -0
  471. package/ios/Source/sgcs/G2FlashProtocol.swift +312 -0
  472. package/ios/Source/sgcs/G2Flasher.swift +773 -0
  473. package/ios/Source/sgcs/Mach1.swift +541 -0
  474. package/ios/Source/sgcs/MentraLive.swift +7011 -0
  475. package/ios/Source/sgcs/MentraLiveL2capChannel.swift +183 -0
  476. package/ios/Source/sgcs/MentraLivePairingAdvertisement.swift +64 -0
  477. package/ios/Source/sgcs/MentraNex.swift +3220 -0
  478. package/ios/Source/sgcs/Nimo.swift +1886 -0
  479. package/ios/Source/sgcs/SGCManager.swift +621 -0
  480. package/ios/Source/sgcs/Simulated.swift +274 -0
  481. package/ios/Source/sgcs/ar99/ota/Ar99OtaManager.swift +637 -0
  482. package/ios/Source/sgcs/glassly_ble.pb.swift +4354 -0
  483. package/ios/Source/speakerid/SpeakerIdEngine.swift +573 -0
  484. package/ios/Source/status/DeviceStatus.swift +981 -0
  485. package/ios/Source/status/RuntimeState.swift +359 -0
  486. package/ios/Source/status/WifiHotspotStatus.swift +345 -0
  487. package/ios/Source/streaming/StreamModels.swift +693 -0
  488. package/ios/Source/stt/STTTools.swift +191 -0
  489. package/ios/Source/stt/SherpaOnnxTranscriber.swift +466 -0
  490. package/ios/Source/tts/TTSTools.swift +167 -0
  491. package/ios/Source/types/DeviceModels.swift +177 -0
  492. package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
  493. package/ios/Source/utils/BinaryCodec.swift +61 -0
  494. package/ios/Source/utils/BleJsonCompact.swift +405 -0
  495. package/ios/Source/utils/BleWireProtocol.swift +92 -0
  496. package/ios/Source/utils/Constants.swift +78 -0
  497. package/ios/Source/utils/Enums.swift +95 -0
  498. package/ios/Source/utils/G1Text.swift +2096 -0
  499. package/ios/Source/utils/G2NotifyFile.swift +116 -0
  500. package/ios/Source/utils/JSCExperiment.swift +241 -0
  501. package/ios/Source/utils/MemoryMonitor.swift +44 -0
  502. package/ios/Source/utils/MessageChunkReassembler.swift +190 -0
  503. package/ios/Source/utils/MessageChunker.swift +294 -0
  504. package/ios/Source/utils/Models.swift +135 -0
  505. package/ios/Source/utils/PhoneAudioMonitor.swift +230 -0
  506. package/ios/Source/utils/TarBz2Extractor.swift +257 -0
  507. package/ios/Tests/BluetoothSDKTests/G2CfwClassificationTests.swift +78 -0
  508. package/ios/Tests/BluetoothSDKTests/G2CfwRendererTests.swift +372 -0
  509. package/ios/Tests/BluetoothSDKTests/G2CfwTextureCacheTests.swift +162 -0
  510. package/ios/Tests/BluetoothSDKTests/G2FlashProtocolTests.swift +182 -0
  511. package/ios/Tests/BluetoothSDKTests/G2NotifyFileTests.swift +91 -0
  512. package/ios/Tests/MentraLivePairingAdvertisementTests.swift +160 -0
  513. package/ios/Tests/ReleaseChangelogTests.swift +13 -0
  514. package/package.json +129 -0
  515. package/plugin/build/index.d.ts +10 -0
  516. package/plugin/build/index.js +12 -0
  517. package/plugin/build/withAndroid.d.ts +3 -0
  518. package/plugin/build/withAndroid.js +190 -0
  519. package/plugin/build/withIos.d.ts +5 -0
  520. package/plugin/build/withIos.js +108 -0
  521. package/scripts/inject-ios-sdk-version.mjs +65 -0
  522. package/scripts/public-ota-api.test.mjs +37 -0
  523. package/scripts/verify-release-package.mjs +46 -0
  524. package/scripts/write-release-metadata.mjs +154 -0
  525. package/scripts/write-release-metadata.test.mjs +37 -0
  526. package/src/BluetoothSdk.types.ts +1659 -0
  527. package/src/_internal.ts +16 -0
  528. package/src/_private/BluetoothSdkModule.ts +683 -0
  529. package/src/_private/LocalNetworkModule.ts +50 -0
  530. package/src/_private/cameraRequestPayload.ts +34 -0
  531. package/src/_private/photoRequestPayload.ts +90 -0
  532. package/src/_private/sdkOtaManifest.ts +18 -0
  533. package/src/changelogs.ts +46 -0
  534. package/src/debug.ts +9 -0
  535. package/src/generated/changelogCatalog.ts +17 -0
  536. package/src/generated/releaseMetadata.ts +20 -0
  537. package/src/index.ts +320 -0
  538. package/src/ota-server/OtaServer.types.ts +10 -0
  539. package/src/ota-server/OtaServerModule.ts +23 -0
  540. package/src/ota-server/OtaServerModule.web.ts +17 -0
  541. package/src/ota-server/index.ts +2 -0
  542. package/src/ota-transport/index.ts +116 -0
  543. package/src/photo-receiver/PhotoReceiver.types.ts +20 -0
  544. package/src/photo-receiver/PhotoReceiverModule.ts +11 -0
  545. package/src/photo-receiver/PhotoReceiverModule.web.ts +17 -0
  546. package/src/photo-receiver/index.ts +2 -0
  547. package/src/react/index.ts +21 -0
  548. package/src/react/useBluetooth.ts +309 -0
  549. package/src/react/useBluetoothEvent.ts +35 -0
  550. package/src/react/useBluetoothScan.ts +173 -0
  551. package/src/react/useBluetoothStatus.ts +180 -0
  552. package/src/react/useGlassesConnection.ts +202 -0
  553. package/src/types/index.ts +12 -0
@@ -0,0 +1,1659 @@
1
+ // Bluetooth SDK Event Types
2
+ export type GlassesNotReadyEvent = {
3
+ type: "glasses_not_ready"
4
+ message: string
5
+ }
6
+
7
+ export type G2FirmwareTarget = "stock" | "glassly-cfw"
8
+
9
+ export type G2FirmwareArtifact = {
10
+ id: G2FirmwareTarget
11
+ displayName: string
12
+ version: string
13
+ fileName: string
14
+ sha256: string
15
+ size: number
16
+ }
17
+
18
+ export type G2FirmwareFlashProgressEvent = {
19
+ type: "g2_firmware_flash_progress"
20
+ message: string
21
+ progress: number
22
+ done: boolean
23
+ ok: boolean
24
+ }
25
+
26
+ export type G2FirmwareFlashResult = {
27
+ ok: boolean
28
+ target: G2FirmwareTarget
29
+ version: string
30
+ sha256: string
31
+ }
32
+
33
+ // NOTE: unlike most events below, the native module does NOT include a `type`
34
+ // field on the button_press payload 闂?it sends only {buttonId, pressType,
35
+ // timestamp} (see BluetoothSdkModule on both iOS and Android). Consumers must
36
+ // filter on `pressType` / the "button_press" listener name, never `event.type`.
37
+ export type ButtonPressEvent = {
38
+ buttonId: string
39
+ pressType: "long" | "short"
40
+ timestamp: number
41
+ }
42
+
43
+ export type TouchEvent = {
44
+ type: "touch_event"
45
+ deviceModel: DeviceModel
46
+ gestureName: string
47
+ timestamp: number
48
+ }
49
+
50
+ export type AccelEvent = {
51
+ type: "accel_event"
52
+ x: number
53
+ y: number
54
+ z: number
55
+ timestamp: number
56
+ }
57
+
58
+ export type HeadUpEvent = {
59
+ up: boolean
60
+ }
61
+
62
+ /**
63
+ * Glasses magnetometer heading, streamed while the native navigation mode is
64
+ * active (G2 service 0x08). Degrees 0…359, 0 = magnetic north.
65
+ */
66
+ export type CompassHeadingEvent = {
67
+ type: "compass_heading"
68
+ heading: number
69
+ timestamp: number
70
+ }
71
+
72
+ /** Magnetometer calibration prompts — the wearer should look around / figure-8. */
73
+ export type CompassCalibrationEvent = {
74
+ type: "compass_calibration"
75
+ status: "start" | "complete"
76
+ }
77
+
78
+ /**
79
+ * Native navigation mode lifecycle. `source: "glasses"` means the wearer (or
80
+ * firmware) exited the nav UI on the device itself, not the phone.
81
+ */
82
+ export type NavigationModeEvent = {
83
+ type: "navigation_mode_change"
84
+ status: "entered" | "exited"
85
+ source?: string
86
+ }
87
+
88
+ /** Wearer toggled the mini-map / overview review view on the glasses. */
89
+ export type NavigationViewEvent = {
90
+ type: "navigation_view_change"
91
+ viewIndex: number
92
+ }
93
+
94
+ export type VoiceActivityDetectionStatusEvent = {
95
+ type: "voice_activity_detection_status"
96
+ voiceActivityDetectionEnabled: boolean
97
+ }
98
+
99
+ export const DEFAULT_VOICE_ACTIVITY_DETECTION_ENABLED = false
100
+
101
+ export type SpeakingStatusEvent = {
102
+ type: "speaking_status"
103
+ speaking: boolean
104
+ timestamp: number
105
+ }
106
+
107
+ export type BatteryStatusEvent = {
108
+ type: "battery_status"
109
+ level: number
110
+ charging: boolean
111
+ timestamp: number
112
+ }
113
+
114
+ export type GlassesConnectionStatus =
115
+ | {state: "disconnected"}
116
+ | {state: "scanning"}
117
+ | {state: "connecting"}
118
+ | {state: "bonding"}
119
+ | {state: "connected"; fullyBooted: boolean}
120
+
121
+ export type ConnectedGlassesConnectionStatus = Extract<GlassesConnectionStatus, {state: "connected"}>
122
+
123
+ export function isConnectedGlassesConnectionStatus(
124
+ status: GlassesConnectionStatus,
125
+ ): status is ConnectedGlassesConnectionStatus {
126
+ return status.state === "connected"
127
+ }
128
+
129
+ export function isReadyGlassesConnectionStatus(status: GlassesConnectionStatus): boolean {
130
+ return status.state === "connected" && status.fullyBooted
131
+ }
132
+
133
+ export function isBusyGlassesConnectionStatus(status: GlassesConnectionStatus): boolean {
134
+ return status.state === "scanning" || status.state === "connecting" || status.state === "bonding"
135
+ }
136
+
137
+ export function createDisconnectedGlassesStatus(): Partial<GlassesStatus> {
138
+ return {
139
+ connection: {state: "disconnected"},
140
+ hotspot: {state: "disabled"},
141
+ voiceActivityDetectionEnabled: DEFAULT_VOICE_ACTIVITY_DETECTION_ENABLED,
142
+ wifi: {state: "disconnected"},
143
+ }
144
+ }
145
+
146
+ /** K900 `sr_getvol` response (Mentra Live glasses media step volume 0闂?5). */
147
+ export type GlassesMediaVolumeGetResult = {
148
+ level: number
149
+ statusCode: number
150
+ }
151
+
152
+ /** K900 `sr_vol` acknowledgment. */
153
+ export type GlassesMediaVolumeSetResult = {
154
+ statusCode: number
155
+ }
156
+
157
+ export type LocalTranscriptionEvent = {
158
+ text: string
159
+ isFinal?: boolean
160
+ transcribeLanguage?: string
161
+ /** Enrolled profile id when the on-device speaker engine matched, else 0. */
162
+ speakerId?: number | string
163
+ /** Additive speaker resolution — present only when a profile matched. */
164
+ resolvedSpeakerId?: string
165
+ resolvedSpeakerName?: string
166
+ startTime?: number
167
+ endTime?: number
168
+ provider?: string
169
+ }
170
+
171
+ /** One on-device speaker-identification window (SpeakerIdEngine).
172
+ * `speakerId`/`name` are absent for an unknown (unenrolled) voice. */
173
+ export type SpeakerDetectedEvent = {
174
+ speakerId?: string
175
+ name?: string
176
+ similarity: number
177
+ /** Epoch ms window bounds (native clock, same epoch as Date.now()). */
178
+ startMs: number
179
+ endMs: number
180
+ }
181
+
182
+ export type SpeakerEnrollProgressEvent = {
183
+ voicedSeconds: number
184
+ targetSeconds: number
185
+ /** RMS level of the latest chunk, 0..1 — drives the recording meter. */
186
+ level: number
187
+ }
188
+
189
+ export type SpeakerEnrollResultEvent = {
190
+ ok: boolean
191
+ /** Failure reason when !ok: "inconsistent" | "too_short" | "model_unavailable" | "unsupported". */
192
+ reason?: string
193
+ /** base64 Float32Array chunk embeddings (raw audio is already discarded). */
194
+ embeddings?: string[]
195
+ dim?: number
196
+ /** Which mic captured the enrollment audio. */
197
+ source: "glasses" | "phone"
198
+ }
199
+
200
+ export type SpeakerProfilePush = {
201
+ id: string
202
+ name: string
203
+ /** base64 Float32Array centroid. */
204
+ embedding: string
205
+ }
206
+
207
+ export type LogEvent = {
208
+ message: string
209
+ }
210
+
211
+ export type WifiStatus = {state: "disconnected"} | {state: "connected"; ssid: string; localIp?: string}
212
+
213
+ export type ConnectedWifiStatus = Extract<WifiStatus, {state: "connected"}>
214
+
215
+ export function isConnectedWifiStatus(status: WifiStatus): status is ConnectedWifiStatus {
216
+ return status.state === "connected"
217
+ }
218
+
219
+ export type WifiStatusChangeEvent = WifiStatus & {
220
+ type: "wifi_status_change"
221
+ /**
222
+ * Glasses-reported provisioning failure reason when THIS event is the verdict of a
223
+ * failed connect attempt; absent on routine link-state updates. An attempt property,
224
+ * not a link property 闂?which is why it lives on the event, not on WifiStatus:
225
+ * "connect_timeout" arrives on a disconnected status (never associated), while
226
+ * "connected_to_other_network" arrives on a *connected* status (the attempt failed
227
+ * and the glasses ended up on / fell back to a different SSID than requested).
228
+ * Requires ASG client v40+ 闂?older glasses never send it.
229
+ */
230
+ error?: string
231
+ }
232
+
233
+ export type HotspotStatus = {state: "disabled"} | {state: "enabled"; ssid: string; password: string; localIp: string}
234
+
235
+ export type EnabledHotspotStatus = Extract<HotspotStatus, {state: "enabled"}>
236
+
237
+ export function isEnabledHotspotStatus(status: HotspotStatus): status is EnabledHotspotStatus {
238
+ return status.state === "enabled"
239
+ }
240
+
241
+ export type HotspotStatusChangeEvent = HotspotStatus & {
242
+ type: "hotspot_status_change"
243
+ }
244
+
245
+ export type HotspotErrorEvent = {
246
+ type: "hotspot_error"
247
+ errorMessage: string
248
+ timestamp: number
249
+ }
250
+
251
+ export type VersionInfoResult = {
252
+ androidVersion: string
253
+ firmwareVersion: string
254
+ besFirmwareVersion: string
255
+ mtkFirmwareVersion: string
256
+ buildNumber: string
257
+ systemTimeMs?: number
258
+ otaVersionUrl: string
259
+ appVersion: string
260
+ /** Phone-served hotspot OTA protocol version; 0 means unsupported/legacy glasses. */
261
+ hotspotOtaVersion: number
262
+ }
263
+
264
+ export type VersionInfoEvent = VersionInfoResult & {
265
+ type: "version_info"
266
+ }
267
+
268
+ export type WifiScanResultEvent = {
269
+ type: "wifi_scan_result"
270
+ networks: WifiSearchResult[]
271
+ scanComplete?: boolean
272
+ }
273
+
274
+ export type PhotoResponseEvent =
275
+ | {
276
+ type: "photo_response"
277
+ state: "success"
278
+ requestId: string
279
+ uploadUrl: string
280
+ photoUrl?: string
281
+ statusUrl?: string
282
+ contentType?: string
283
+ fileSizeBytes?: number
284
+ timestamp: number
285
+ }
286
+ | {
287
+ type: "photo_response"
288
+ state: "error"
289
+ requestId: string
290
+ timestamp: number
291
+ errorCode?: string
292
+ errorMessage: string
293
+ }
294
+
295
+ export type PhotoSuccessResponseEvent = Extract<PhotoResponseEvent, {state: "success"}>
296
+
297
+ export type PhotoStatusState =
298
+ | "accepted"
299
+ | "queued"
300
+ | "configuring"
301
+ | "capturing"
302
+ | "captured"
303
+ | "compressing"
304
+ | "ble_fallback_compression"
305
+ | "uploading"
306
+ | "uploaded"
307
+ | "ready_for_transfer"
308
+ | "transferring"
309
+ | "failed"
310
+
311
+ export type PhotoResolvedConfig = {
312
+ format?: "jpeg" | string
313
+ width?: number
314
+ height?: number
315
+ quality?: number
316
+ requestedSize?: PhotoSize | string
317
+ source?: "sdk" | "button" | string
318
+ transferMethod?: "webhook" | "ble" | "local" | string
319
+ compression?: PhotoCompression | string
320
+ saveToGallery?: boolean
321
+ exposureTimeNs?: number
322
+ iso?: number
323
+ }
324
+
325
+ export type PhotoFpsRange = {
326
+ min?: number
327
+ max?: number
328
+ }
329
+
330
+ export type PhotoRequestedCaptureConfig = {
331
+ manual?: boolean
332
+ exposureTimeNs?: number
333
+ iso?: number
334
+ frameDurationNs?: number
335
+ aeMode?: number
336
+ aeLock?: boolean
337
+ aeExposureCompensation?: number
338
+ aeTargetFpsRange?: PhotoFpsRange
339
+ noiseReductionMode?: number
340
+ edgeMode?: number
341
+ afMode?: number
342
+ zsl?: boolean
343
+ }
344
+
345
+ export type PhotoMeteredPreview = {
346
+ exposureTimeNs?: number
347
+ iso?: number
348
+ totalLightProxy?: number
349
+ }
350
+
351
+ export type PhotoCaptureMetadata = {
352
+ manual?: boolean
353
+ exposureTimeNs?: number
354
+ iso?: number
355
+ frameDurationNs?: number
356
+ aeMode?: number
357
+ aeState?: number
358
+ aeStateName?: string
359
+ noiseReductionMode?: number
360
+ edgeMode?: number
361
+ zsl?: boolean
362
+ sensorTimestampNs?: number
363
+ totalLightProxy?: number
364
+ mfnrLikely?: boolean
365
+ mfnrApplied?: boolean
366
+ width?: number
367
+ height?: number
368
+ noiseReductionWarning?: "not_implemented" | string
369
+ ispDigitalGainWarning?: "not_implemented" | string
370
+ ispAnalogGainWarning?: "not_implemented" | string
371
+ [key: string]: unknown
372
+ }
373
+
374
+ export type PhotoStatusEvent = {
375
+ type: "photo_status"
376
+ requestId: string
377
+ status: PhotoStatusState | string
378
+ timestamp: number
379
+ resolvedConfig?: PhotoResolvedConfig
380
+ requestedCaptureConfig?: PhotoRequestedCaptureConfig
381
+ meteredPreview?: PhotoMeteredPreview
382
+ captureMetadata?: PhotoCaptureMetadata
383
+ errorCode?: string
384
+ errorMessage?: string
385
+ }
386
+
387
+ export type CameraStatusEvent = {
388
+ type: "camera_status"
389
+ requestId: string
390
+ state: "warming" | "ready" | "stopped" | "error" | string
391
+ timestamp: number
392
+ errorCode?: string
393
+ errorMessage?: string
394
+ }
395
+
396
+ export type VideoRecordingStatusEvent = {
397
+ type: "video_recording_status"
398
+ requestId?: string
399
+ success: boolean
400
+ status: VideoRecordingStatusState
401
+ details?: string | null
402
+ timestamp: number
403
+ data?: {
404
+ recording?: boolean
405
+ duration_ms?: number
406
+ duration_formatted?: string
407
+ [key: string]: unknown
408
+ }
409
+ }
410
+
411
+ export type VideoRecordingStatusState =
412
+ | "recording_started"
413
+ | "recording_status"
414
+ | "already_recording"
415
+ | "recording_stopped"
416
+ | "not_recording"
417
+ | "request_id_mismatch"
418
+ | "service_unavailable"
419
+ | "json_error"
420
+ | "battery_low"
421
+ | "camera_busy"
422
+ | "storage_unavailable"
423
+ | "integrity_failed"
424
+ | "error"
425
+
426
+ export type VideoRecordingStartedStatusEvent = Omit<VideoRecordingStatusEvent, "success" | "status"> & {
427
+ success: true
428
+ status: "recording_started"
429
+ }
430
+
431
+ export type VideoRecordingStoppedStatusEvent = Omit<VideoRecordingStatusEvent, "success" | "status"> & {
432
+ success: true
433
+ status: "recording_stopped"
434
+ }
435
+
436
+ export type VideoRecordingSuccessStatusEvent = VideoRecordingStartedStatusEvent | VideoRecordingStoppedStatusEvent
437
+
438
+ export type MediaUploadSuccessEvent = {
439
+ type: "media_success"
440
+ requestId: string
441
+ mediaUrl: string
442
+ mediaType: number
443
+ timestamp: number
444
+ }
445
+
446
+ export type MediaUploadErrorEvent = {
447
+ type: "media_error"
448
+ requestId: string
449
+ errorMessage: string
450
+ mediaType: number
451
+ timestamp: number
452
+ }
453
+
454
+ export type MediaUploadEvent = MediaUploadSuccessEvent | MediaUploadErrorEvent
455
+
456
+ export type GalleryStatusEvent = {
457
+ type: "gallery_status"
458
+ photos: number
459
+ videos: number
460
+ total: number
461
+ totalSize?: number
462
+ hasContent: boolean
463
+ cameraBusy: boolean
464
+ cameraBusyReason?: "video" | "stream" | (string & {})
465
+ }
466
+
467
+ export type CompatibleGlassesSearchStopEvent = {
468
+ type: "compatible_glasses_search_stop"
469
+ deviceModel: DeviceModel
470
+ }
471
+
472
+ export type HeartbeatSentEvent = {
473
+ type: "heartbeat_sent"
474
+ heartbeat_sent: {
475
+ timestamp: number
476
+ }
477
+ }
478
+
479
+ export type HeartbeatReceivedEvent = {
480
+ type: "heartbeat_received"
481
+ heartbeat_received: {
482
+ timestamp: number
483
+ }
484
+ }
485
+
486
+ export type SwipeVolumeStatusEvent = {
487
+ type: "swipe_volume_status"
488
+ enabled: boolean
489
+ timestamp: number
490
+ }
491
+
492
+ export type SwitchStatusEvent = {
493
+ type: "switch_status"
494
+ switchType?: number
495
+ switchValue?: number
496
+ timestamp: number
497
+ }
498
+
499
+ export type RgbLedControlResponseEvent =
500
+ | {
501
+ type: "rgb_led_control_response"
502
+ state: "success"
503
+ requestId: string
504
+ }
505
+ | {
506
+ type: "rgb_led_control_response"
507
+ state: "error"
508
+ requestId: string
509
+ errorCode: string
510
+ }
511
+
512
+ export type RgbLedControlSuccessResponseEvent = Extract<RgbLedControlResponseEvent, {state: "success"}>
513
+
514
+ export type SettingsAckStatus = "applied" | "ready" | "error" | "failed" | "failure" | "rejected"
515
+
516
+ export type SettingsAckSetting =
517
+ | "gallery_mode"
518
+ | "button_photo"
519
+ | "button_video_recording"
520
+ | "button_max_recording_time"
521
+ | "camera_fov"
522
+ | "camera_fov_override"
523
+ | "camera_tuning"
524
+
525
+ export type SettingsAckEvent = {
526
+ type: "settings_ack"
527
+ requestId: string
528
+ setting: SettingsAckSetting
529
+ status: SettingsAckStatus
530
+ timestamp: number
531
+ fov?: number
532
+ roiPosition?: CameraRoiPositionValue
533
+ hardwareApplied?: boolean
534
+ leaseId?: string
535
+ active?: boolean
536
+ size?: ButtonPhotoSize | string
537
+ width?: number
538
+ height?: number
539
+ fps?: number
540
+ enabled?: boolean
541
+ minutes?: number
542
+ /** ANR enabled flag; present when setting === "camera_tuning" */
543
+ anr?: boolean
544
+ /** Stock-gain flag; present when setting === "camera_tuning" */
545
+ gain?: boolean
546
+ errorCode?: string
547
+ errorMessage?: string
548
+ }
549
+
550
+ export type SettingsAckSuccessStatus = Exclude<SettingsAckStatus, "error" | "failed" | "failure" | "rejected">
551
+
552
+ export type SettingsAckSuccessEvent = Omit<SettingsAckEvent, "status"> & {
553
+ status: SettingsAckSuccessStatus
554
+ }
555
+
556
+ export type RgbLedAction = "on" | "off"
557
+ export type RgbLedColor = "red" | "green" | "blue" | "orange" | "white"
558
+ export type PhotoSize = "low" | "medium" | "high" | "max"
559
+ export type PhotoMode = "photo" | "text"
560
+ export type PhotoTransferMethod = "auto" | "direct" | "ble"
561
+ export type ButtonPhotoSize = "low" | "medium" | "high" | "max"
562
+
563
+ /**
564
+ * @deprecated Sticky action-button photo presets via {@link BluetoothSdkPublicModule.setPhotoCaptureDefaults}
565
+ * are deprecated. Prefer per-request {@link BluetoothSdkPublicModule.requestPhoto} options
566
+ * (e.g. `mode: "text"` for text sensor size/crop, or explicit `aeExposureDivisor`) instead of
567
+ * persisting button-photo tuning on the glasses.
568
+ */
569
+ export type PhotoCaptureDefaults = {
570
+ size?: PhotoSize
571
+ /** ZSL preview buffering for physical camera-button photos. */
572
+ zsl?: boolean
573
+ /** MFNR still capture for physical camera-button photos. */
574
+ mfnr?: boolean
575
+ noiseReduction?: boolean
576
+ edgeEnhancement?: boolean
577
+ ispDigitalGain?: number
578
+ ispAnalogGain?: string
579
+ aeExposureDivisor?: number
580
+ isoCap?: number
581
+ compress?: PhotoCompression
582
+ sound?: boolean
583
+ /** When true, clears stored NR/edge/ISP presets on the glasses before applying other fields. */
584
+ resetCaptureTuning?: boolean
585
+ }
586
+ export type PhotoCompression = "none" | "medium" | "heavy"
587
+
588
+ export type VideoRecordingDefaults = {
589
+ width: number
590
+ height: number
591
+ fps: number
592
+ }
593
+
594
+ /**
595
+ * Optional per-recording video settings for {@link startVideoRecording}. When
596
+ * omitted, the glasses fall back to their saved video recording defaults. Any
597
+ * field left undefined is omitted from the BLE command (glasses default applies).
598
+ */
599
+ export interface VideoRecordingSettings {
600
+ width?: number
601
+ height?: number
602
+ fps?: number
603
+ /**
604
+ * Optional auto-stop timer in minutes, sent on `start_video_recording`.
605
+ * `0` (the default) means record until stopped or interrupted
606
+ * (battery/storage/thermal/error).
607
+ */
608
+ maxRecordingTimeMinutes?: number
609
+ }
610
+ export const DeviceModels = {
611
+ Simulated: "Simulated Glasses",
612
+ G1: "Even Realities G1",
613
+ G2: "Even Realities G2",
614
+ MentraLive: "Mentra Live",
615
+ MentraNex: "Mentra Display",
616
+ Mach1: "Mentra Mach1",
617
+ Z100: "Vuzix Z100",
618
+ Frame: "Brilliant Frame",
619
+ Nimo: "NIMO",
620
+ Ar99: "AR99",
621
+ R1: "Even Realities R1",
622
+ } as const
623
+
624
+ export type DeviceModel = (typeof DeviceModels)[keyof typeof DeviceModels]
625
+ export type ObservableStoreCategory = "glasses" | "bluetooth" | "core"
626
+
627
+ export type DashboardMenuItem = {
628
+ title: string
629
+ packageName: string
630
+ values?: Record<string, unknown>
631
+ }
632
+
633
+ export const CAMERA_FOV_MIN = 62
634
+ export const CAMERA_FOV_MAX = 118
635
+ export const CAMERA_FOV_DEFAULT = CAMERA_FOV_MAX
636
+
637
+ export type CameraRoiPosition = "center" | "bottom" | "top"
638
+ export type CameraRoiPositionValue = 0 | 1 | 2
639
+ export type CameraFovPreset = "narrow" | "standard" | "wide"
640
+
641
+ export type CameraFovRequest =
642
+ | {
643
+ fov: number
644
+ roiPosition?: CameraRoiPosition
645
+ }
646
+ | {
647
+ preset: CameraFovPreset
648
+ }
649
+
650
+ export type CameraFovResult = {
651
+ requestId: string
652
+ fov: number
653
+ roiPosition: CameraRoiPosition
654
+ timestamp: number
655
+ }
656
+
657
+ export type CameraFovOverrideRequest = CameraFovRequest & {
658
+ /** Phone-owned lease used to make delayed releases safe. */
659
+ leaseId: string
660
+ /** Safety TTL; refresh the same lease/configuration to extend without a HAL restart. */
661
+ ttlMs?: number
662
+ }
663
+
664
+ export type CameraFovSetting = {
665
+ fov: number
666
+ roiPosition: CameraRoiPositionValue
667
+ }
668
+
669
+ type NativeCameraFovSetting = {
670
+ fov: number
671
+ roi_position: CameraRoiPositionValue
672
+ }
673
+
674
+ export type MicPreference = "auto" | "phone" | "glasses" | "bluetooth"
675
+ export type MicMode = "phone" | "glasses" | "bluetoothClassic" | "bluetooth"
676
+
677
+ export type PhotoRequestParams = {
678
+ requestId?: string
679
+ appId?: string
680
+ size: PhotoSize
681
+ mode?: PhotoMode
682
+ /** `direct` disables BLE fallback; `ble` skips direct upload and forces phone-relayed transfer. */
683
+ transferMethod?: PhotoTransferMethod
684
+ webhookUrl: string | null
685
+ authToken: string | null
686
+ compress: PhotoCompression
687
+ save?: boolean
688
+ sound: boolean
689
+ exposureTimeNs?: number | null
690
+ /** Sensor ISO for this capture only. Only used when exposureTimeNs enables manual exposure. */
691
+ iso?: number | null
692
+ /** After AE convergence, divide metered exposure by this factor (scan mode). */
693
+ aeExposureDivisor?: number
694
+ /** Cap ISO after AE metering (scan mode). */
695
+ isoCap?: number
696
+ /** Requested on wire; glasses may log not_implemented. */
697
+ noiseReduction?: boolean
698
+ edgeEnhancement?: boolean
699
+ /** ZSL buffering. Forced off for manual/scan stills because fixed sensor controls take priority. */
700
+ zsl?: boolean
701
+ /** MFNR still capture. Forced off for manual/scan stills because fixed sensor controls take priority. */
702
+ mfnr?: boolean
703
+ ispDigitalGain?: number
704
+ ispAnalogGain?: string
705
+ }
706
+
707
+ export type WarmUpCameraParams = {
708
+ /** Supply this when the owner needs to call stopCameraWarmUp during teardown. */
709
+ requestId?: string
710
+ size: PhotoSize
711
+ mode?: PhotoMode
712
+ exposureTimeNs?: number | null
713
+ /** Ready-state hold; defaults to 15 seconds and is capped at 60 seconds by ASG. */
714
+ durationMs?: number
715
+ /** ZSL preview buffering for the warm-up session. */
716
+ zsl?: boolean
717
+ /** MFNR still capture for the warm-up session. */
718
+ mfnr?: boolean
719
+ }
720
+
721
+ export type StreamVideoConfig = {
722
+ width?: number
723
+ height?: number
724
+ bitrate?: number
725
+ fps?: number
726
+ }
727
+
728
+ export type StreamAudioConfig = {
729
+ bitrate?: number
730
+ sampleRate?: number
731
+ echoCancellation?: boolean
732
+ noiseSuppression?: boolean
733
+ }
734
+
735
+ export type StreamStartRequest = {
736
+ type?: "start_stream"
737
+ streamUrl: string
738
+ streamId?: string
739
+ sound?: boolean
740
+ video?: StreamVideoConfig
741
+ audio?: StreamAudioConfig
742
+ }
743
+
744
+ export type StreamKeepAliveRequest = {
745
+ type?: "keep_stream_alive"
746
+ streamId: string
747
+ ackId: string
748
+ }
749
+
750
+ export type PairFailureEvent = {
751
+ type: "pair_failure"
752
+ error: string
753
+ }
754
+
755
+ export type PairingInfoEvent = {
756
+ had_previous_bond: boolean
757
+ pairing_code?: string
758
+ classic_bond_ready?: boolean
759
+ secure_pairing_capable?: boolean
760
+ protocol_version?: number
761
+ }
762
+
763
+ export type EnteringPairingModeEvent = {
764
+ window_ms: number
765
+ reason?: string
766
+ }
767
+
768
+ export type OwnerReplacedEvent = {
769
+ reason: string
770
+ }
771
+
772
+ export type AudioPairingNeededEvent = {
773
+ type: "audio_pairing_needed"
774
+ deviceName: string
775
+ }
776
+
777
+ export type AudioConnectedEvent = {
778
+ type: "audio_connected"
779
+ deviceName: string
780
+ }
781
+
782
+ export type AudioDisconnectedEvent = {
783
+ type: "audio_disconnected"
784
+ }
785
+
786
+ export type SaveSettingEvent = {
787
+ type: "save_setting"
788
+ key: string
789
+ value: any
790
+ }
791
+
792
+ export type WsTextEvent = {
793
+ type: "ws_text"
794
+ text: string
795
+ }
796
+
797
+ export type WsBinEvent = {
798
+ type: "ws_bin"
799
+ base64: string
800
+ }
801
+
802
+ export type MicPcmEvent = {
803
+ type: "mic_pcm"
804
+ pcm: ArrayBuffer
805
+ sampleRate: 16000
806
+ bitsPerSample: 16
807
+ channels: 1
808
+ encoding: "pcm_s16le"
809
+ voiceActivityDetectionEnabled: boolean
810
+ }
811
+
812
+ export type MicLc3Event = {
813
+ type: "mic_lc3"
814
+ lc3: ArrayBuffer
815
+ sampleRate: 16000
816
+ channels: 1
817
+ encoding: "lc3"
818
+ frameDurationMs: 10
819
+ frameSizeBytes: number
820
+ bitrate: number
821
+ packetizedFromGlasses: boolean
822
+ voiceActivityDetectionEnabled: boolean
823
+ }
824
+
825
+ /** Native glasses-microphone diagnostics emitted when the SDK detects a transport or decode issue. */
826
+ export type MicHealthEvent = {
827
+ type: "mic_health"
828
+ reason: "sequence_gap" | "decode_failure"
829
+ sequenceGapEvents: number
830
+ decodeFailures: number
831
+ lastLc3ReceivedAt?: number
832
+ lastPcmProducedAt?: number
833
+ timestamp: number
834
+ }
835
+
836
+ export type StreamStatusLifecycleState = "initializing" | "streaming" | "stopping" | "stopped"
837
+ export type StreamStatusReconnectState = "reconnecting" | "reconnected" | "reconnect_failed"
838
+ export type StreamStatusState = StreamStatusLifecycleState | StreamStatusReconnectState | "error"
839
+
840
+ /** Effective stream settings reported by the glasses after defaults and clamps. */
841
+ export type StreamResolvedConfig = {
842
+ transport?: "rtmp" | "srt" | "whip"
843
+ video?: {
844
+ /** Encoded output width sent to the stream endpoint. */
845
+ width: number
846
+ /** Encoded output height sent to the stream endpoint. */
847
+ height: number
848
+ /** Native camera buffer width selected before crop/downscale. */
849
+ captureWidth?: number
850
+ /** Native camera buffer height selected before crop/downscale. */
851
+ captureHeight?: number
852
+ /** Encoded video bitrate in bits per second. */
853
+ bitrate: number
854
+ /** Resolved capture/encode frame rate. */
855
+ fps: number
856
+ }
857
+ audio?: {
858
+ /** Encoded audio bitrate in bits per second. */
859
+ bitrate?: number
860
+ /** Audio sample rate in Hz. */
861
+ sampleRate?: number
862
+ echoCancellation?: boolean
863
+ noiseSuppression?: boolean
864
+ }
865
+ }
866
+
867
+ /** Live encoder and device telemetry emitted periodically by supported glasses firmware. */
868
+ export type StreamLiveStats = {
869
+ /** Current encoded video bitrate in bits per second. */
870
+ bitrate?: number
871
+ /** Current encode frame rate. */
872
+ fps?: number
873
+ droppedFrames?: number
874
+ /** Seconds since the stream started. */
875
+ duration?: number
876
+ /** Device temperature in 闂佺娅i悡? if the hardware reports it. */
877
+ temperatureC?: number
878
+ }
879
+
880
+ type StreamStatusCommon = {
881
+ type: "stream_status"
882
+ streamId?: string
883
+ timestamp?: number
884
+ resolvedConfig?: StreamResolvedConfig
885
+ stats?: StreamLiveStats
886
+ }
887
+
888
+ export type StreamStatusEvent =
889
+ | (StreamStatusCommon & {
890
+ kind: "lifecycle"
891
+ status: StreamStatusLifecycleState
892
+ })
893
+ | (StreamStatusCommon & {
894
+ kind: "reconnect"
895
+ status: "reconnecting"
896
+ attempt: number
897
+ maxAttempts: number
898
+ reason: string
899
+ })
900
+ | (StreamStatusCommon & {
901
+ kind: "reconnect"
902
+ status: "reconnected"
903
+ attempt: number
904
+ })
905
+ | (StreamStatusCommon & {
906
+ kind: "reconnect"
907
+ status: "reconnect_failed"
908
+ maxAttempts: number
909
+ })
910
+ | (StreamStatusCommon & {
911
+ kind: "error"
912
+ status: "error"
913
+ errorDetails: string
914
+ })
915
+ | (StreamStatusCommon & {
916
+ kind: "snapshot"
917
+ status: "streaming" | "reconnecting" | "stopped"
918
+ streaming: boolean
919
+ reconnecting: boolean
920
+ attempt?: number
921
+ })
922
+
923
+ export type KeepAliveAckEvent = {
924
+ type: "keep_alive_ack"
925
+ streamId: string
926
+ ackId: string
927
+ timestamp?: number
928
+ }
929
+
930
+ export type MtkUpdateCompleteEvent = {
931
+ type: "mtk_update_complete"
932
+ message: string
933
+ timestamp: number
934
+ }
935
+
936
+ /**
937
+ * The glasses process restarted while the BES kept the BLE link alive (its `sid`
938
+ * changed, or first appeared after an update from a pre-sid build). There is no
939
+ * physical disconnect for this — treat it as the logical reconnect edge.
940
+ */
941
+ export type GlassesSessionChangedEvent = {
942
+ type: "glasses_session_changed"
943
+ previous_sid: string
944
+ sid: string
945
+ }
946
+
947
+ /** @deprecated Glasses no longer emit ota_progress; use {@link OtaStatusEvent} and status-store mapping. */
948
+ export type OtaProgressEvent = {
949
+ type: "ota_progress"
950
+ stage?: OtaStage
951
+ status?: OtaProgressStatus
952
+ progress?: number
953
+ bytes_downloaded?: number
954
+ total_bytes?: number
955
+ current_update?: string
956
+ error_message?: string
957
+ }
958
+
959
+ export type OtaStartAckEvent = {
960
+ type: "ota_start_ack"
961
+ timestamp: number
962
+ }
963
+ export type OtaStatusEvent = {
964
+ type: "ota_status"
965
+ session_id: string
966
+ total_steps: number
967
+ current_step: number
968
+ step_type: "apk" | "mtk" | "bes"
969
+ phase: "download" | "install"
970
+ step_percent: number
971
+ overall_percent: number
972
+ status: "in_progress" | "step_complete" | "complete" | "failed" | "idle"
973
+ error_message?: string
974
+ }
975
+
976
+ export type OtaQueryResult = OtaStatusEvent
977
+
978
+ /** Nex BLE protobuf trace (NexEventUtils); payload matches native Map keys. */
979
+ export type BleCommandTraceEvent = {
980
+ command: string
981
+ commandText: string
982
+ timestamp: number
983
+ }
984
+
985
+ export type MiniappSelectedEvent = {
986
+ type: "miniapp_selected"
987
+ packageName: string
988
+ }
989
+
990
+ // Union type of all native/internal Bluetooth SDK events.
991
+ export type BluetoothSdkInternalEvent = Parameters<BluetoothSdkModuleEvents[keyof BluetoothSdkModuleEvents]>[0]
992
+
993
+ export type BluetoothSdkModuleEvents = {
994
+ glasses_status: (changed: Partial<GlassesStatus>) => void
995
+ bluetooth_status: (changed: Partial<BluetoothStatus>) => void
996
+ log: (event: LogEvent) => void
997
+ device_discovered: (device: Device) => void
998
+ default_device_changed: (event: {device?: Device}) => void
999
+ // Individual event handlers
1000
+ glasses_not_ready: (event: GlassesNotReadyEvent) => void
1001
+ button_press: (event: ButtonPressEvent) => void
1002
+ touch_event: (event: TouchEvent) => void
1003
+ accel_event: (event: AccelEvent) => void
1004
+ compass_heading: (event: CompassHeadingEvent) => void
1005
+ compass_calibration: (event: CompassCalibrationEvent) => void
1006
+ navigation_mode_change: (event: NavigationModeEvent) => void
1007
+ navigation_view_change: (event: NavigationViewEvent) => void
1008
+ head_up: (event: HeadUpEvent) => void
1009
+ voice_activity_detection_status: (event: VoiceActivityDetectionStatusEvent) => void
1010
+ speaking_status: (event: SpeakingStatusEvent) => void
1011
+ battery_status: (event: BatteryStatusEvent) => void
1012
+ local_transcription: (event: LocalTranscriptionEvent) => void
1013
+ speaker_detected: (event: SpeakerDetectedEvent) => void
1014
+ speaker_enroll_progress: (event: SpeakerEnrollProgressEvent) => void
1015
+ speaker_enroll_result: (event: SpeakerEnrollResultEvent) => void
1016
+ phone_notification: (event: PhoneNotificationEvent) => void
1017
+ phone_notification_dismissed: (event: PhoneNotificationDismissedEvent) => void
1018
+ notification_app_seen: (event: NotificationAppSeenEvent) => void
1019
+ wifi_status_change: (event: WifiStatusChangeEvent) => void
1020
+ wifi_scan_result: (event: WifiScanResultEvent) => void
1021
+ hotspot_status_change: (event: HotspotStatusChangeEvent) => void
1022
+ hotspot_error: (event: HotspotErrorEvent) => void
1023
+ photo_response: (event: PhotoResponseEvent) => void
1024
+ photo_status: (event: PhotoStatusEvent) => void
1025
+ camera_status: (event: CameraStatusEvent) => void
1026
+ video_recording_status: (event: VideoRecordingStatusEvent) => void
1027
+ media_success: (event: MediaUploadSuccessEvent) => void
1028
+ media_error: (event: MediaUploadErrorEvent) => void
1029
+ gallery_status: (event: GalleryStatusEvent) => void
1030
+ compatible_glasses_search_stop: (event: CompatibleGlassesSearchStopEvent) => void
1031
+ heartbeat_sent: (event: HeartbeatSentEvent) => void
1032
+ heartbeat_received: (event: HeartbeatReceivedEvent) => void
1033
+ swipe_volume_status: (event: SwipeVolumeStatusEvent) => void
1034
+ switch_status: (event: SwitchStatusEvent) => void
1035
+ rgb_led_control_response: (event: RgbLedControlResponseEvent) => void
1036
+ settings_ack: (event: SettingsAckEvent) => void
1037
+ pair_failure: (event: PairFailureEvent) => void
1038
+ pairing_info: (event: PairingInfoEvent) => void
1039
+ entering_pairing_mode: (event: EnteringPairingModeEvent) => void
1040
+ owner_replaced: (event: OwnerReplacedEvent) => void
1041
+ audio_pairing_needed: (event: AudioPairingNeededEvent) => void
1042
+ audio_connected: (event: AudioConnectedEvent) => void
1043
+ audio_disconnected: (event: AudioDisconnectedEvent) => void
1044
+ save_setting: (event: SaveSettingEvent) => void
1045
+ ws_text: (event: WsTextEvent) => void
1046
+ ws_bin: (event: WsBinEvent) => void
1047
+ mic_pcm: (event: MicPcmEvent) => void
1048
+ mic_lc3: (event: MicLc3Event) => void
1049
+ mic_health: (event: MicHealthEvent) => void
1050
+ stream_status: (event: StreamStatusEvent) => void
1051
+ keep_alive_ack: (event: KeepAliveAckEvent) => void
1052
+ mtk_update_complete: (event: MtkUpdateCompleteEvent) => void
1053
+ glasses_session_changed: (event: GlassesSessionChangedEvent) => void
1054
+ ota_start_ack: (event: OtaStartAckEvent) => void
1055
+ ota_status: (event: OtaStatusEvent) => void
1056
+ ar99_ota_status: (event: Ar99OtaStatusEvent) => void
1057
+ g2_firmware_flash_progress: (event: G2FirmwareFlashProgressEvent) => void
1058
+ version_info: (event: VersionInfoEvent) => void
1059
+ send_command_to_ble: (event: BleCommandTraceEvent) => void
1060
+ receive_command_from_ble: (event: BleCommandTraceEvent) => void
1061
+ miniapp_selected: (event: MiniappSelectedEvent) => void
1062
+ extraction_progress: (event: ExtractionProgressEvent) => void
1063
+ }
1064
+
1065
+ export interface ExtractionProgressEvent {
1066
+ percentage: number
1067
+ bytesRead: number
1068
+ totalBytes: number
1069
+ }
1070
+
1071
+ export interface Ar99OtaStatusEvent {
1072
+ type: "ar99_ota_status"
1073
+ phase: string
1074
+ progress: number
1075
+ offset: number
1076
+ total: number
1077
+ errorMessage?: string
1078
+ error_message?: string
1079
+ }
1080
+
1081
+ export interface PhoneNotificationEvent {
1082
+ notificationId: string
1083
+ app: string
1084
+ title: string
1085
+ content: string
1086
+ priority: string
1087
+ timestamp: number
1088
+ packageName: string
1089
+ }
1090
+
1091
+ export interface PhoneNotificationDismissedEvent {
1092
+ notificationId: string
1093
+ notificationKey: string
1094
+ packageName: string
1095
+ timestamp: number
1096
+ }
1097
+
1098
+ /**
1099
+ * iOS G2: the glasses' on-firmware ANCS client reported the source app of a
1100
+ * notification (bundle id + display name — never the content). Feeds the
1101
+ * seen-apps list backing the ANCS filter UI.
1102
+ */
1103
+ export interface NotificationAppSeenEvent {
1104
+ appId: string
1105
+ displayName: string
1106
+ timestamp: number
1107
+ }
1108
+
1109
+ export type PublicGlassesStatus = Omit<
1110
+ GlassesStatus,
1111
+ "otaUpdateAvailable" | "otaProgress" | "otaInProgress" | "otaVersionUrl"
1112
+ >
1113
+
1114
+ export type PublicBluetoothStatus = Pick<
1115
+ BluetoothStatus,
1116
+ | "searching"
1117
+ | "searchingController"
1118
+ | "systemMicUnavailable"
1119
+ | "micRanking"
1120
+ | "currentMic"
1121
+ | "searchResults"
1122
+ | "wifiScanResults"
1123
+ | "lastLog"
1124
+ | "otherBtConnected"
1125
+ | "galleryModeEnabled"
1126
+ >
1127
+
1128
+ export type BluetoothSdkEventMap = {
1129
+ log: LogEvent
1130
+ device_discovered: Device
1131
+ default_device_changed: {device?: Device}
1132
+ glasses_not_ready: GlassesNotReadyEvent
1133
+ button_press: ButtonPressEvent
1134
+ touch_event: TouchEvent
1135
+ accel_event: AccelEvent
1136
+ head_up: HeadUpEvent
1137
+ voice_activity_detection_status: VoiceActivityDetectionStatusEvent
1138
+ speaking_status: SpeakingStatusEvent
1139
+ battery_status: BatteryStatusEvent
1140
+ local_transcription: LocalTranscriptionEvent
1141
+ wifi_status_change: WifiStatusChangeEvent
1142
+ wifi_scan_result: WifiScanResultEvent
1143
+ hotspot_status_change: HotspotStatusChangeEvent
1144
+ hotspot_error: HotspotErrorEvent
1145
+ photo_response: PhotoResponseEvent
1146
+ photo_status: PhotoStatusEvent
1147
+ camera_status: CameraStatusEvent
1148
+ video_recording_status: VideoRecordingStatusEvent
1149
+ media_success: MediaUploadSuccessEvent
1150
+ media_error: MediaUploadErrorEvent
1151
+ gallery_status: GalleryStatusEvent
1152
+ compatible_glasses_search_stop: CompatibleGlassesSearchStopEvent
1153
+ swipe_volume_status: SwipeVolumeStatusEvent
1154
+ switch_status: SwitchStatusEvent
1155
+ rgb_led_control_response: RgbLedControlResponseEvent
1156
+ settings_ack: SettingsAckEvent
1157
+ pair_failure: PairFailureEvent
1158
+ pairing_info: PairingInfoEvent
1159
+ entering_pairing_mode: EnteringPairingModeEvent
1160
+ owner_replaced: OwnerReplacedEvent
1161
+ audio_pairing_needed: AudioPairingNeededEvent
1162
+ audio_connected: AudioConnectedEvent
1163
+ audio_disconnected: AudioDisconnectedEvent
1164
+ mic_pcm: MicPcmEvent
1165
+ mic_lc3: MicLc3Event
1166
+ mic_health: MicHealthEvent
1167
+ stream_status: StreamStatusEvent
1168
+ /** Mentra Live MTK updater completed and the glasses are about to restart. */
1169
+ mtk_update_complete: MtkUpdateCompleteEvent
1170
+ /** The ASG process restarted while the BES kept the BLE connection alive. */
1171
+ glasses_session_changed: GlassesSessionChangedEvent
1172
+ ota_start_ack: OtaStartAckEvent
1173
+ ota_status: OtaStatusEvent
1174
+ ar99_ota_status: Ar99OtaStatusEvent
1175
+ g2_firmware_flash_progress: G2FirmwareFlashProgressEvent
1176
+ version_info: VersionInfoEvent
1177
+ extraction_progress: ExtractionProgressEvent
1178
+ }
1179
+
1180
+ export type BluetoothSdkEventName = keyof BluetoothSdkEventMap
1181
+
1182
+ export type BluetoothSdkEventListener<EventName extends BluetoothSdkEventName> = (
1183
+ event: BluetoothSdkEventMap[EventName],
1184
+ ) => void
1185
+
1186
+ export type BluetoothSdkSubscription = {
1187
+ remove(): void
1188
+ }
1189
+
1190
+ export type BluetoothSdkEvent = BluetoothSdkEventMap[BluetoothSdkEventName]
1191
+
1192
+ export interface BluetoothSdkPublicModule {
1193
+ addListener<EventName extends BluetoothSdkEventName>(
1194
+ eventName: EventName,
1195
+ listener: BluetoothSdkEventListener<EventName>,
1196
+ ): BluetoothSdkSubscription
1197
+
1198
+ /** Read an immutable snapshot of the current glasses state. */
1199
+ getGlassesStatus(): Promise<PublicGlassesStatus>
1200
+ /** Read an immutable snapshot of the phone Bluetooth adapter state. */
1201
+ getBluetoothStatus(): Promise<PublicBluetoothStatus>
1202
+ /** Observe immutable glasses-state patches. Returns an unsubscribe function. */
1203
+ subscribeGlassesStatus(listener: (changed: Partial<PublicGlassesStatus>) => void): () => void
1204
+ /** Observe immutable Bluetooth-state patches. Returns an unsubscribe function. */
1205
+ subscribeBluetoothStatus(listener: (changed: Partial<PublicBluetoothStatus>) => void): () => void
1206
+
1207
+ getDefaultDevice(): Promise<Device | null>
1208
+ setDefaultDevice(device: Device | null): Promise<void>
1209
+ clearDefaultDevice(): Promise<void>
1210
+
1211
+ startScan(model: DeviceModel): Promise<void>
1212
+ stopScan(): Promise<void>
1213
+ scan(options: ScanOptions): Promise<Device[]>
1214
+ scan(model: DeviceModel, options?: ScanModelOptions): Promise<Device[]>
1215
+ connect(device: Device, options?: ConnectOptions): Promise<void>
1216
+ connectDefault(options?: ConnectOptions): Promise<void>
1217
+ cancelConnectionAttempt(): Promise<void>
1218
+ disconnect(): Promise<void>
1219
+ forget(): Promise<void>
1220
+
1221
+ displayText(text: string, x?: number, y?: number, size?: number): Promise<void>
1222
+ clearDisplay(): Promise<void>
1223
+ showDashboard(): Promise<void>
1224
+ /**
1225
+ * Open the glasses' built-in notification panel (same effect as the user
1226
+ * saying "Hey Even, show notifications"). G2 only; a no-op elsewhere.
1227
+ */
1228
+ showNativeNotificationPanel(): Promise<void>
1229
+ setDashboardPosition(height: number, depth: number): Promise<void>
1230
+ setHeadUpAngle(angleDegrees: number): Promise<void>
1231
+ setImuEnabled(enabled: boolean): Promise<void>
1232
+ setScreenDisabled(disabled: boolean): Promise<void>
1233
+ /** Keep legacy Mentra Live OTA sessions awake. Modern sessions normally do not require this. */
1234
+ ping(): Promise<void>
1235
+
1236
+ requestWifiScan(): Promise<WifiSearchResult[]>
1237
+ sendWifiCredentials(ssid: string, password: string): Promise<WifiStatusChangeEvent>
1238
+ forgetWifiNetwork(ssid: string): Promise<WifiStatusChangeEvent>
1239
+ setHotspotState(enabled: boolean): Promise<HotspotStatusChangeEvent>
1240
+ /** Set the glasses clock from the phone after an OTA clock-skew failure. */
1241
+ setSystemTime(timestampMs: number): Promise<void>
1242
+ /** Enable or disable Wi-Fi ADB on Mentra Live (no-op on other devices). */
1243
+ setWifiAdbState(enabled: boolean): Promise<void>
1244
+
1245
+ setGalleryModeEnabled(enabled: boolean): Promise<SettingsAckSuccessEvent>
1246
+ setVoiceActivityDetectionEnabled(enabled: boolean): Promise<void>
1247
+ setLoudnessGateEnabled(enabled: boolean): Promise<void>
1248
+ /**
1249
+ * @deprecated Sticky action-button photo presets are deprecated. Prefer per-request
1250
+ * `requestPhoto(...)` options (e.g. `mode: "text"` for text sensor size/crop, or explicit per-shot
1251
+ * fields). Still functional until removed in a future release.
1252
+ */
1253
+ setPhotoCaptureDefaults(settings: PhotoCaptureDefaults): Promise<SettingsAckSuccessEvent>
1254
+ setVideoRecordingDefaults(settings: VideoRecordingDefaults): Promise<SettingsAckSuccessEvent>
1255
+ setMaxVideoRecordingDuration(minutes: number): Promise<SettingsAckSuccessEvent>
1256
+ setCameraFov(request: CameraFovRequest): Promise<CameraFovResult>
1257
+ /** One-way FOV command for legacy ASG clients that do not send settings acknowledgements. */
1258
+ setLegacyCameraFov(request: CameraFovRequest): Promise<CameraFovResult>
1259
+ setCameraFovOverride(request: CameraFovOverrideRequest): Promise<CameraFovResult>
1260
+ releaseCameraFovOverride(leaseId: string): Promise<SettingsAckSuccessEvent>
1261
+ /**
1262
+ * Configure camera HAL tuning (ANR / gain) on Mentra Live glasses.
1263
+ *
1264
+ * The phone sends a {@code camera_tuning_config} BLE command; the glasses relay it as a
1265
+ * {@code camconfig} broadcast to the camera HAL so parameters take effect without a reboot.
1266
+ *
1267
+ * **Scan-mode convention**: call with `(false, false)` when activating scan mode to disable ANR
1268
+ * and pixsmart gain for sharper text/barcode captures. Call with `(true, true)` to restore
1269
+ * defaults when exiting scan mode.
1270
+ *
1271
+ * @param anrOn `true` = ANR enabled (default), `false` = ANR disabled
1272
+ * @param gainOn `true` = stock gain params (default), `false` = pixsmart gain-off params
1273
+ */
1274
+ setCameraTuningConfig(anrOn: boolean, gainOn: boolean): Promise<SettingsAckSuccessEvent>
1275
+ queryGalleryStatus(): Promise<GalleryStatusEvent>
1276
+ requestPhoto(params: PhotoRequestParams): Promise<PhotoSuccessResponseEvent>
1277
+ warmUpCamera(params: WarmUpCameraParams): Promise<CameraStatusEvent>
1278
+ /** Release one request-owned warm-up. Opening requests reject with camera_warm_up_cancelled. */
1279
+ stopCameraWarmUp(requestId: string): Promise<void>
1280
+ startVideoRecording(
1281
+ requestId: string,
1282
+ save: boolean,
1283
+ sound: boolean,
1284
+ settings?: VideoRecordingSettings,
1285
+ ): Promise<VideoRecordingStartedStatusEvent>
1286
+ /**
1287
+ * Stop the active recording. When {@link webhookUrl} is provided, the glasses
1288
+ * upload the recorded video to it (multipart) using {@link authToken}. These
1289
+ * are supplied at stop time (not start) so the token is fresh when the upload
1290
+ * runs 闂?a recording can last arbitrarily long. An empty/omitted webhook keeps
1291
+ * the video on device (no upload).
1292
+ */
1293
+ stopVideoRecording(
1294
+ requestId: string,
1295
+ webhookUrl?: string,
1296
+ authToken?: string,
1297
+ ): Promise<VideoRecordingStoppedStatusEvent>
1298
+ /** Query the glasses for the current recording state and elapsed duration. */
1299
+ queryVideoRecordingStatus(requestId: string): Promise<VideoRecordingStatusEvent>
1300
+
1301
+ startStream(params: StreamStartRequest): Promise<StreamStatusEvent>
1302
+ stopStream(): Promise<StreamStatusEvent>
1303
+
1304
+ setMicState(enabled: boolean, useGlassesMic?: boolean, sendTranscript?: boolean, sendLc3Data?: boolean): Promise<void>
1305
+ setPreferredMic(preferredMic: MicPreference): Promise<void>
1306
+ setOwnAppAudioPlaying(playing: boolean): Promise<void>
1307
+ getGlassesMediaVolume(): Promise<GlassesMediaVolumeGetResult>
1308
+ setGlassesMediaVolume(level: number): Promise<GlassesMediaVolumeSetResult>
1309
+
1310
+ rgbLedControl(
1311
+ requestId: string,
1312
+ packageName: string | null,
1313
+ action: RgbLedAction,
1314
+ color: RgbLedColor | null,
1315
+ onDurationMs: number,
1316
+ offDurationMs: number,
1317
+ count: number,
1318
+ ): Promise<RgbLedControlSuccessResponseEvent>
1319
+
1320
+ requestVersionInfo(): Promise<VersionInfoResult>
1321
+ availableG2FirmwareArtifacts(): Promise<G2FirmwareArtifact[]>
1322
+ startG2FirmwareFlash(target: G2FirmwareTarget): Promise<G2FirmwareFlashResult>
1323
+ /**
1324
+ * Select the OTA manifest used by subsequent update checks and installs.
1325
+ * The URL may point at Glassly's hosted manifest or any customer-controlled HTTP(S) server.
1326
+ */
1327
+ setOtaVersionUrl(otaVersionUrl: string): void
1328
+ /** Return the configured or release-embedded OTA manifest URL. Rejects when a source build is unconfigured. */
1329
+ getOtaVersionUrl(): string
1330
+ /** Fetch the configured OTA manifest and return whether any ASG/BES/MTK update is available. */
1331
+ checkForOtaUpdate(): Promise<boolean>
1332
+ /** Return bundled release changelogs crossed between two coordinated product versions, newest first. */
1333
+ getReleaseChangelogs(fromVersion?: string | null, toVersion?: string | null): ReleaseChangelog[]
1334
+ /** Start OTA from the configured or explicitly supplied manifest URL. */
1335
+ startOtaUpdate(otaVersionUrl?: string | null): Promise<OtaStartAckEvent>
1336
+ /** Query the active OTA session and return the correlated status response. */
1337
+ queryOtaStatus(): Promise<OtaQueryResult>
1338
+ startAr99OtaFromFile(path: string): Promise<boolean>
1339
+ cancelAr99Ota(): Promise<void>
1340
+ sendAr99FactoryReset(): Promise<void>
1341
+ buildAr99OtaSignature(
1342
+ secret: string,
1343
+ appName: string,
1344
+ currentVersion: string,
1345
+ serialNumber: string,
1346
+ nonce: string,
1347
+ ): string
1348
+
1349
+ // // stt commands (MOVE TO CRUST)
1350
+ // setSttModelDetails(path: string, languageCode: string): Promise<void>
1351
+ // getSttModelPath(): Promise<string>
1352
+ // checkSttModelAvailable(): Promise<boolean>
1353
+ // validateSttModel(path: string): Promise<boolean>
1354
+ // extractTarBz2(sourcePath: string, destinationPath: string): Promise<boolean>
1355
+
1356
+ // // tts commands (MOVE TO CRUST)
1357
+ // setTtsModelDetails(path: string, languageCode: string): Promise<void>
1358
+ // getTtsModelPath(): Promise<string>
1359
+ // getTtsModelLanguage(): Promise<string>
1360
+ // checkTtsModelAvailable(): Promise<boolean>
1361
+ // validateTtsModel(path: string): Promise<boolean>
1362
+ // generateTtsAudio(text: string, path: string, outputPath: string, speakerId: number, speed: number): Promise<boolean>
1363
+
1364
+ // STT Commands (TODO: MOVE TO CRUST)
1365
+ setSttModelDetails(path: string, languageCode: string): Promise<void>
1366
+ getSttModelPath(): Promise<string>
1367
+ checkSttModelAvailable(): Promise<boolean>
1368
+ validateSttModel(path: string): Promise<boolean>
1369
+ extractTarBz2(sourcePath: string, destinationPath: string): Promise<boolean>
1370
+ restartTranscriber(): Promise<void>
1371
+
1372
+ // TTS Commands (TODO: MOVE TO CRUST)
1373
+ setTtsModelDetails(path: string, languageCode: string): Promise<void>
1374
+ getTtsModelPath(): Promise<string>
1375
+ getTtsModelLanguage(): Promise<string>
1376
+ checkTtsModelAvailable(): Promise<boolean>
1377
+ validateTtsModel(path: string): Promise<boolean>
1378
+ generateTtsAudio(
1379
+ text: string,
1380
+ modelPath: string,
1381
+ outputPath: string,
1382
+ speakerId: number,
1383
+ speed: number,
1384
+ ): Promise<boolean>
1385
+ }
1386
+
1387
+ // OTA update status types
1388
+ export type OtaStage = "download" | "install"
1389
+ export type OtaProgressStatus = "STARTED" | "PROGRESS" | "FINISHED" | "FAILED"
1390
+
1391
+ export interface OtaStatus {
1392
+ sessionId: string
1393
+ totalSteps: number
1394
+ currentStep: number
1395
+ stepType: "apk" | "mtk" | "bes"
1396
+ phase: "download" | "install"
1397
+ stepPercent: number
1398
+ overallPercent: number
1399
+ status: "in_progress" | "step_complete" | "complete" | "failed" | "idle"
1400
+ error?: string
1401
+ }
1402
+
1403
+ export interface OtaUpdateInfo {
1404
+ available: boolean
1405
+ versionCode: number
1406
+ versionName: string
1407
+ updates: string[] // ["apk", "mtk", "bes"]
1408
+ totalSize: number
1409
+ cacheReady?: boolean
1410
+ /** Exact BES target selected from the OTA manifest, when a BES step is pending. */
1411
+ besVersion?: string
1412
+ /** True when the APK step installs an older build than the glasses currently run (exact-pin manifests only). */
1413
+ isDowngrade?: boolean
1414
+ }
1415
+
1416
+ export interface ReleaseChangelog {
1417
+ /** Base production version, for example `3.1.0`. */
1418
+ version: string
1419
+ /** Markdown body authored in `/changelogs/<version>.md`. */
1420
+ markdown: string
1421
+ }
1422
+
1423
+ export interface OtaProgress {
1424
+ stage: OtaStage
1425
+ status: OtaProgressStatus
1426
+ progress: number
1427
+ bytesDownloaded: number
1428
+ totalBytes: number
1429
+ currentUpdate: string
1430
+ errorMessage?: string
1431
+ }
1432
+
1433
+ export interface GlassesStatus {
1434
+ // state:
1435
+ connection: GlassesConnectionStatus
1436
+ micEnabled: boolean
1437
+ voiceActivityDetectionEnabled: boolean
1438
+ bluetoothClassicConnected: boolean
1439
+ signalStrength: number
1440
+ /** Milliseconds since epoch when signalStrength was last refreshed by the phone BLE stack. */
1441
+ signalStrengthUpdatedAt: number
1442
+ // device info
1443
+ deviceModel: string
1444
+ androidVersion: string
1445
+ firmwareVersion: string
1446
+ besFirmwareVersion: string
1447
+ mtkFirmwareVersion: string
1448
+ bluetoothMacAddress: string
1449
+ wifiMacAddress: string
1450
+ leftMacAddress: string
1451
+ rightMacAddress: string
1452
+ buildNumber: string
1453
+ /** Glasses System.currentTimeMillis() from last version_info (clock skew detection). */
1454
+ systemTimeMs?: number
1455
+ otaVersionUrl: string
1456
+ appVersion: string
1457
+ /** Phone-served hotspot OTA protocol version; 0 means unsupported/legacy glasses. */
1458
+ hotspotOtaVersion: number
1459
+ bluetoothName: string
1460
+ serialNumber: string
1461
+ style: string
1462
+ color: string
1463
+ /**
1464
+ * Scene canvas the connected firmware renders, when it differs from the
1465
+ * model profile (G2 Glassly CFW: 640×480 direct framebuffer). 0/absent ⇒
1466
+ * use the model's canvas.
1467
+ */
1468
+ sceneCanvasWidth?: number
1469
+ sceneCanvasHeight?: number
1470
+ // wifi info
1471
+ wifi: WifiStatus
1472
+ // battery info
1473
+ batteryLevel: number
1474
+ charging: boolean
1475
+ caseBatteryLevel: number
1476
+ caseCharging: boolean
1477
+ caseOpen: boolean
1478
+ caseRemoved: boolean
1479
+ // hotspot info
1480
+ hotspot: HotspotStatus
1481
+ // OTA update info
1482
+ otaUpdateAvailable: OtaUpdateInfo | null
1483
+ otaProgress: OtaProgress | null
1484
+ otaInProgress: boolean
1485
+ // ring info
1486
+ controllerConnected: boolean
1487
+ controllerFullyBooted: boolean
1488
+ controllerMacAddress: string
1489
+ controllerBatteryLevel: number
1490
+ controllerSignalStrength: number
1491
+ /**
1492
+ * iOS: a connected lens is authorized to read the phone's ANCS notification
1493
+ * stream (the "Share System Notifications" Bluetooth consent). Always false
1494
+ * on Android and for models that don't consume ANCS on-firmware.
1495
+ */
1496
+ ancsAuthorized?: boolean
1497
+ }
1498
+
1499
+ export interface CoreDashboardMenuItem {
1500
+ name: string
1501
+ packageName: string
1502
+ running: boolean
1503
+ }
1504
+
1505
+ export interface CalendarEvent {
1506
+ title: string
1507
+ location?: string
1508
+ time: string
1509
+ endDate: number
1510
+ }
1511
+
1512
+ export interface CoreSettings {
1513
+ menu_apps: CoreDashboardMenuItem[]
1514
+ calendar_events: CalendarEvent[]
1515
+ }
1516
+
1517
+ /** G2 on-glass notification display behavior (NotificationControl protobuf). */
1518
+ export interface G2NotificationCtrlSetting {
1519
+ enabled: boolean
1520
+ auto_display: boolean
1521
+ /** On-screen popup duration in seconds: 0 (firmware default), 5, 7, or 10. */
1522
+ disp_time: number
1523
+ avoid_disturb: boolean
1524
+ }
1525
+
1526
+ /** G2 on-glass ANCS app filter (user/notify_whitelist.json push). */
1527
+ export interface G2NotificationFilterSetting {
1528
+ /** false = whitelisting off on-glass (fail-open, every app shows). */
1529
+ enabled: boolean
1530
+ /** Allowlist entries; identifiers are iOS bundle ids. */
1531
+ apps: Array<{id: string; name: string}>
1532
+ }
1533
+
1534
+ export interface Device {
1535
+ /**
1536
+ * Stable app-facing key for this scan result, within the limits of the
1537
+ * platform identifier available to the SDK. Do not parse this value; use the
1538
+ * typed model, name, address, projectName, and rssi fields instead.
1539
+ */
1540
+ id: string
1541
+ model: DeviceModel
1542
+ name: string
1543
+ /** Platform address/identifier when available: Android Bluetooth address, iOS CoreBluetooth identifier. */
1544
+ address?: string
1545
+ /** Optional AR99 project discriminator. Supported value: AR99. */
1546
+ projectName?: string
1547
+ /**
1548
+ * Optional scan signal strength. It may be undefined at first discovery and
1549
+ * appear in a later scan update when the platform reports RSSI metadata.
1550
+ */
1551
+ rssi?: number
1552
+ /** Mentra Live: unit is currently in pairing mode (adv flag). */
1553
+ pairingMode?: boolean
1554
+ /** Mentra Live: four-character hex spoken pairing code when available. */
1555
+ pairingCode?: string
1556
+ /** Mentra Live: advertisement carries the secure-pairing capability trailer. */
1557
+ securePairingCapable?: boolean
1558
+ }
1559
+
1560
+ export interface ConnectOptions {
1561
+ saveAsDefault?: boolean
1562
+ cancelExistingConnectionAttempt?: boolean
1563
+ }
1564
+
1565
+ export type ScanResultsCallback = (devices: Device[]) => void
1566
+
1567
+ export interface ScanOptions {
1568
+ model: DeviceModel
1569
+ /** Defaults to 15000. */
1570
+ timeoutMs?: number
1571
+ /** Alias for `timeoutMs`, useful when mirroring native examples. */
1572
+ timeout?: number
1573
+ /** Called every time the discovered device list changes during the scan. */
1574
+ onResults?: ScanResultsCallback
1575
+ }
1576
+
1577
+ export type ScanModelOptions = Omit<ScanOptions, "model">
1578
+
1579
+ export interface WifiSearchResult {
1580
+ ssid: string
1581
+ requiresPassword: boolean
1582
+ signalStrength: number
1583
+ /** Frequency in MHz (from glasses scan). 5 GHz band is typically 5170闂?825. Omitted if unknown. */
1584
+ frequency?: number
1585
+ }
1586
+
1587
+ export interface BluetoothStatus {
1588
+ // state:
1589
+ searching: boolean
1590
+ searchingController: boolean
1591
+ default_wearable?: DeviceModel | ""
1592
+ pending_wearable?: DeviceModel | ""
1593
+ device_name?: string
1594
+ device_address?: string
1595
+ default_controller?: DeviceModel | ""
1596
+ pending_controller?: DeviceModel | ""
1597
+ controller_device_name?: string
1598
+ controller_address?: string
1599
+ systemMicUnavailable: boolean
1600
+ micRanking: MicMode[]
1601
+ currentMic: MicMode | "" | null
1602
+ /**
1603
+ * Nearby glasses in stable discovery order.
1604
+ * Existing entries keep their array position as details refresh; new glasses append at the end,
1605
+ * and removals should not reorder remaining entries.
1606
+ */
1607
+ searchResults: Device[]
1608
+ wifiScanResults: WifiSearchResult[]
1609
+ lastLog: string[]
1610
+ otherBtConnected: boolean
1611
+ // desired settings the SDK sends to compatible connected glasses:
1612
+ galleryModeEnabled: boolean
1613
+ }
1614
+
1615
+ export type BluetoothSettingsUpdate = Partial<{
1616
+ auth_email: string
1617
+ core_token: string
1618
+ sensing_enabled: boolean
1619
+ power_saving_mode: boolean
1620
+ lc3_frame_size: number
1621
+ preferred_mic: MicPreference
1622
+ screen_disabled: boolean
1623
+ contextual_dashboard: boolean
1624
+ head_up_angle: number
1625
+ imu_enabled: boolean
1626
+ brightness: number
1627
+ auto_brightness: boolean
1628
+ dashboard_height: number
1629
+ dashboard_depth: number
1630
+ menu_apps: DashboardMenuItem[] | CoreDashboardMenuItem[] | Array<Record<string, unknown>> | null
1631
+ calendar_events: CalendarEvent[]
1632
+ notification_ctrl: G2NotificationCtrlSetting
1633
+ notification_filter: G2NotificationFilterSetting
1634
+ metric_system: boolean
1635
+ twelve_hour_time: boolean
1636
+ gallery_mode: boolean
1637
+ voice_activity_detection_enabled: boolean
1638
+ loudness_gate_enabled: boolean
1639
+ button_photo_size: ButtonPhotoSize
1640
+ button_video_settings: {width: number; height: number; fps: number}
1641
+ button_video_width: number
1642
+ button_video_height: number
1643
+ button_video_fps: number
1644
+ button_max_recording_time: number
1645
+ camera_fov: NativeCameraFovSetting
1646
+ should_send_pcm: boolean
1647
+ should_send_lc3: boolean
1648
+ should_send_transcript: boolean
1649
+ offline_mode: boolean
1650
+ local_stt_fallback_active: boolean
1651
+ pending_wearable: DeviceModel | ""
1652
+ default_wearable: DeviceModel | ""
1653
+ device_name: string
1654
+ device_address: string
1655
+ default_controller: DeviceModel | ""
1656
+ pending_controller: DeviceModel | ""
1657
+ controller_device_name: string
1658
+ controller_address: string
1659
+ }>