@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,621 @@
1
+ import Foundation
2
+
3
+ /// One element of a scene frame (display.render()). Geometry is raw pixels on
4
+ /// the device's drawable canvas; `change` is the host differ's annotation
5
+ /// against the previous frame sent to this device.
6
+ struct SceneElement: Sendable {
7
+ let id: String
8
+ let type: String // "text" | "rect" | "image"
9
+ let x: Int32
10
+ let y: Int32
11
+ let w: Int32
12
+ let h: Int32
13
+ let text: String?
14
+ let data: String? // base64 image pixels (SGC decodes → re-encodes to wire format)
15
+ let border: Int32
16
+ let radius: Int32
17
+ let change: String // "created" | "updated" | "moved" | "unchanged"
18
+ let contentHash: String
19
+ /// Text style: "mono" draws fixed-pitch at `fontSize` px with a fixed 1.2× line
20
+ /// height (grid text); anything else is the default proportional face.
21
+ let font: String
22
+ let fontSize: Int32
23
+
24
+ init(
25
+ id: String, type: String, x: Int32, y: Int32, w: Int32, h: Int32, text: String?, data: String?,
26
+ border: Int32, radius: Int32, change: String, contentHash: String,
27
+ font: String = "default", fontSize: Int32 = 0
28
+ ) {
29
+ self.id = id
30
+ self.type = type
31
+ self.x = x
32
+ self.y = y
33
+ self.w = w
34
+ self.h = h
35
+ self.text = text
36
+ self.data = data
37
+ self.border = border
38
+ self.radius = radius
39
+ self.change = change
40
+ self.contentHash = contentHash
41
+ self.font = font
42
+ self.fontSize = fontSize
43
+ }
44
+
45
+ func with(change: String) -> SceneElement {
46
+ SceneElement(
47
+ id: id, type: type, x: x, y: y, w: w, h: h, text: text, data: data,
48
+ border: border, radius: radius, change: change, contentHash: contentHash,
49
+ font: font, fontSize: fontSize
50
+ )
51
+ }
52
+ }
53
+
54
+ /// A whole scene from the host pipeline — the full frame plus per-element
55
+ /// change annotations and host-computed removes. Full-frame consumers can
56
+ /// serialize `elements` and ignore the annotations; per-element consumers walk
57
+ /// them.
58
+ struct SceneFrame: Sendable {
59
+ /// Public drawable canvas the host laid this frame out against (stock G2: 576×288).
60
+ static let defaultCanvasWidth: Int32 = 576
61
+ static let defaultCanvasHeight: Int32 = 288
62
+
63
+ let appId: String
64
+ let epoch: Int
65
+ let replay: Bool
66
+ let elements: [SceneElement]
67
+ let removed: [String]
68
+ let canvasWidth: Int32
69
+ let canvasHeight: Int32
70
+
71
+ init(
72
+ appId: String, epoch: Int, replay: Bool, elements: [SceneElement], removed: [String],
73
+ canvasWidth: Int32 = SceneFrame.defaultCanvasWidth,
74
+ canvasHeight: Int32 = SceneFrame.defaultCanvasHeight
75
+ ) {
76
+ self.appId = appId
77
+ self.epoch = epoch
78
+ self.replay = replay
79
+ self.elements = elements
80
+ self.removed = removed
81
+ self.canvasWidth = canvasWidth > 0 ? canvasWidth : SceneFrame.defaultCanvasWidth
82
+ self.canvasHeight = canvasHeight > 0 ? canvasHeight : SceneFrame.defaultCanvasHeight
83
+ }
84
+
85
+ func asReplay() -> SceneFrame {
86
+ SceneFrame(
87
+ appId: appId, epoch: epoch, replay: true,
88
+ elements: elements.map { $0.with(change: "created") }, removed: removed,
89
+ canvasWidth: canvasWidth, canvasHeight: canvasHeight
90
+ )
91
+ }
92
+ }
93
+
94
+ @MainActor
95
+ protocol SGCManager {
96
+ // MARK: - hard coded device properties:
97
+
98
+ var type: String { get set }
99
+ var hasMic: Bool { get }
100
+
101
+ // MARK: - Audio Control
102
+
103
+ func setMicEnabled(_ enabled: Bool)
104
+ var isMicSuspendedForAudio: Bool { get }
105
+ func sortMicRanking(list: [String]) -> [String]
106
+
107
+ // MARK: - Messaging
108
+
109
+ func sendJson(_ jsonOriginal: [String: Any], wakeUp: Bool, requireAck: Bool)
110
+
111
+ // MARK: - Camera & Media
112
+
113
+ func requestPhoto(_ request: PhotoRequest)
114
+ func startStream(_ message: [String: Any])
115
+ func stopStream()
116
+ func sendStreamKeepAlive(_ message: [String: Any])
117
+ func startVideoRecording(requestId: String, save: Bool, sound: Bool)
118
+ func queryVideoRecordingStatus(requestId: String)
119
+ /// Start video recording with optional per-recording resolution/fps. A width,
120
+ /// height, or fps of 0 means "use the device's saved button-video default".
121
+ /// Defaulted in an extension to delegate to the basic recording path; devices
122
+ /// that support custom settings (e.g. Mentra Live) override this.
123
+ func startVideoRecording(
124
+ requestId: String, save: Bool, sound: Bool, width: Int, height: Int, fps: Int,
125
+ maxRecordingTimeMinutes: Int
126
+ )
127
+ func stopVideoRecording(requestId: String)
128
+ /// Stop recording and upload the result to `webhookUrl` (multipart) using
129
+ /// `authToken`. Supplied at stop time so the token is fresh when the upload
130
+ /// runs. Defaulted in an extension to ignore the upload target and just stop;
131
+ /// devices that support webhook upload (e.g. Mentra Live) override this. An
132
+ /// empty/nil `webhookUrl` means "keep the video on device".
133
+ func stopVideoRecording(requestId: String, webhookUrl: String?, authToken: String?)
134
+
135
+ // MARK: - Button Settings
136
+
137
+ func sendButtonPhotoSettings()
138
+ func sendButtonVideoRecordingSettings()
139
+ func sendButtonMaxRecordingTime()
140
+ func sendCameraFovSetting()
141
+
142
+ // MARK: - Display Control
143
+
144
+ /// Suspend until the device's firmware identity is classified, so display
145
+ /// traffic sent right after connect routes down its final render path.
146
+ /// Default no-op (see protocol extension); only G2 has a stock-vs-CFW split.
147
+ func awaitFirmwareClassification() async
148
+ func setBrightness(_ level: Int, autoMode: Bool)
149
+ func clearDisplay()
150
+ func sendText(_ text: String) async
151
+ func sendTextWall(_ text: String) async
152
+ func sendDoubleTextWall(_ top: String, _ bottom: String) async
153
+ /// Display a bitmap. Optional `x`/`y`/`width`/`height` position and size the target
154
+ /// container (used by G2; other SGCs ignore positioning and render the bitmap as before).
155
+ func displayBitmap(base64ImageData: String, x: Int32?, y: Int32?, width: Int32?, height: Int32?) async -> Bool
156
+ /// Show text in a positioned container with an optional rounded border.
157
+ /// G2-only capability; default no-op (see protocol extension) so other glasses ignore it.
158
+ func sendPositionedText(
159
+ _ text: String, x: Int32, y: Int32, width: Int32, height: Int32,
160
+ borderWidth: Int32, borderRadius: Int32
161
+ ) async
162
+
163
+ // MARK: - Scene display (display.render() pipeline)
164
+
165
+ /// Retained element verbs — identity is the element id. Defaults delegate
166
+ /// to the positioned/bitmap paths (see extension); SGCs with retained
167
+ /// components (G2 containers, Mentra Display canvas) override for
168
+ /// update-in-place / delete semantics.
169
+ func drawLayoutText(
170
+ _ text: String, x: Int32, y: Int32, width: Int32, height: Int32,
171
+ borderWidth: Int32, borderRadius: Int32, elementId: String, layoutId: String?
172
+ ) async
173
+ func drawLayoutBitmap(
174
+ base64ImageData: String, x: Int32, y: Int32, width: Int32, height: Int32,
175
+ elementId: String, layoutId: String?
176
+ ) async -> Bool
177
+ func removeLayoutElement(_ elementId: String, layoutId: String?) async
178
+ /// Apply a whole host-diffed scene frame (default: paint-then-sweep over the verbs above).
179
+ func applySceneFrame(_ frame: SceneFrame) async
180
+ /// A replay frame is about to repaint from scratch — reset retained bookkeeping.
181
+ func onSceneReplay(_ appId: String) async
182
+ /// Remove a set of scene elements (scene→legacy handoff sweep).
183
+ func clearSceneElements(_ elementIds: [String]) async
184
+
185
+ // MARK: - Native navigation (glasses-rendered turn-by-turn UI; G2 only today)
186
+
187
+ /// True while the glasses' own modal nav UI owns the display — DeviceManager
188
+ /// suppresses normal display traffic until exit.
189
+ var navigationModeActive: Bool { get }
190
+ func enterNavigationMode()
191
+ /// `arrived` shows the device's "navigation complete" screen before exiting.
192
+ func exitNavigationMode(arrived: Bool)
193
+ /// Turn-by-turn card update; all fields are pre-formatted display strings.
194
+ func sendNavigationInfo(
195
+ directionIcon: Int32, distance: String, roadName: String,
196
+ spendTime: String, remainDistance: String, etaTime: String, speed: String
197
+ )
198
+ /// Live mini map (base64 image, re-encoded by the SGC). Draw north-up with
199
+ /// a centred cursor; the device rotates it by rotationDeg.
200
+ func sendNavigationMiniMap(base64ImageData: String, rotationDeg: Int32, borderEnabled: Bool)
201
+ func sendNavigationOverviewMap(base64ImageData: String)
202
+
203
+ func showDashboard()
204
+ func setDashboardPosition(_ height: Int, _ depth: Int)
205
+ /// Default implementation sends both via [setDashboardPosition]; Nex overrides to one protobuf.
206
+ func setDashboardHeightOnly(_ height: Int)
207
+ func setDashboardDepthOnly(_ depth: Int)
208
+ /// Live cfw_scene_renderer switch (only the G2 CFW has one): swap the
209
+ /// on-glass surface between the CFW carrier and a blank stock page.
210
+ func cfwSceneRendererToggled(_ enabled: Bool) async
211
+
212
+ // MARK: - Dashboard Menu
213
+
214
+ func setDashboardMenu(_ items: [[String: Any]])
215
+
216
+ // MARK: - Notification Panel
217
+
218
+ func showNotificationsPanel() async
219
+
220
+ // MARK: - Calendar Events
221
+
222
+ func sendCalendarEvents(_ events: [[String: Any]])
223
+
224
+ // MARK: - Phone Notifications (on-glass ANCS display options + app filter)
225
+
226
+ /// Push NotificationControl from the DeviceStore `notification_ctrl` dict.
227
+ func sendNotificationCtrl()
228
+ /// Push the ANCS app allowlist from the DeviceStore `notification_filter` dict.
229
+ func sendNotificationFilter()
230
+
231
+ // MARK: - Dashboard Display Settings
232
+
233
+ func sendDashboardDisplaySettings()
234
+
235
+ // MARK: - Device Control
236
+
237
+ func setHeadUpAngle(_ angle: Int)
238
+ /// Enable/disable raw accelerometer (IMU) reporting from the glasses.
239
+ /// Default no-op; only G2 streams IMU data today.
240
+ func setImuEnabled(_ enabled: Bool) async
241
+ func getBatteryStatus()
242
+ func setSilentMode(_ enabled: Bool)
243
+ func exit()
244
+ func sendShutdown()
245
+ func sendReboot()
246
+ func sendRgbLedControl(
247
+ requestId: String, packageName: String?, action: String, color: String?, onDurationMs: Int,
248
+ offDurationMs: Int, count: Int
249
+ )
250
+
251
+ // MARK: - Connection Management
252
+
253
+ func disconnect()
254
+ func forget()
255
+ func findCompatibleDevices()
256
+ func stopScan()
257
+ func connectById(_ id: String)
258
+ func getConnectedBluetoothName() -> String?
259
+ func connectController()
260
+ func disconnectController()
261
+ func cleanup()
262
+ func ping()
263
+ func dbg1()
264
+ func dbg2()
265
+
266
+ // MARK: - Network Management
267
+
268
+ func requestWifiScan(scanId: String?)
269
+ func sendWifiCredentials(_ ssid: String, _ password: String)
270
+ func forgetWifiNetwork(_ ssid: String)
271
+ func sendHotspotState(_ enabled: Bool)
272
+ func sendWifiAdbState(_ enabled: Bool)
273
+ func sendOtaStart(otaVersionUrl: String?)
274
+ func sendOtaQueryStatus()
275
+ func sendSetSystemTime(_ timestampMs: Int64)
276
+
277
+ // MARK: - User Context (for crash reporting)
278
+
279
+ func sendUserEmailToGlasses(_ email: String)
280
+
281
+ // MARK: - Incident Reporting
282
+
283
+ func sendIncidentId(_ incidentId: String, apiBaseUrl: String?)
284
+
285
+ // MARK: - Gallery
286
+
287
+ func queryGalleryStatus()
288
+ func sendGalleryMode()
289
+
290
+ // MARK: - Voice Activity Detection
291
+
292
+ func sendVoiceActivityDetectionSetting()
293
+
294
+ // MARK: - Loudness / Barrier Gate
295
+
296
+ func sendLoudnessGateSetting()
297
+
298
+ // MARK: - Version Info
299
+
300
+ func requestVersionInfo()
301
+ }
302
+
303
+ /// doesn't seem to work for concurrency reasons :(
304
+ /// we can make read-only getters for convienence though:
305
+ extension SGCManager {
306
+ var isMicSuspendedForAudio: Bool {
307
+ false
308
+ }
309
+
310
+ /// Default: no-op. Only G2 distinguishes stock from Glassly CFW firmware.
311
+ func awaitFirmwareClassification() async {}
312
+
313
+ /// Default: no-op. Only G2 renders positioned text containers; other glasses ignore it.
314
+ func sendPositionedText(
315
+ _: String, x _: Int32, y _: Int32, width _: Int32, height _: Int32,
316
+ borderWidth _: Int32, borderRadius _: Int32
317
+ ) async {}
318
+
319
+ // MARK: - Scene display defaults
320
+
321
+ /// Default: ignore the ids and behave like the positioned-text path.
322
+ func drawLayoutText(
323
+ _ text: String, x: Int32, y: Int32, width: Int32, height: Int32,
324
+ borderWidth: Int32, borderRadius: Int32, elementId _: String, layoutId _: String?
325
+ ) async {
326
+ await sendPositionedText(
327
+ text, x: x, y: y, width: width, height: height,
328
+ borderWidth: borderWidth, borderRadius: borderRadius
329
+ )
330
+ }
331
+
332
+ /// Default: ignore the ids and behave like displayBitmap.
333
+ func drawLayoutBitmap(
334
+ base64ImageData: String, x: Int32, y: Int32, width: Int32, height: Int32,
335
+ elementId _: String, layoutId _: String?
336
+ ) async -> Bool {
337
+ await displayBitmap(base64ImageData: base64ImageData, x: x, y: y, width: width, height: height)
338
+ }
339
+
340
+ /// Default: no-op (SGC has no retained elements).
341
+ func removeLayoutElement(_: String, layoutId _: String?) async {}
342
+
343
+ /// Default: no retained bookkeeping to reset.
344
+ func onSceneReplay(_: String) async {}
345
+
346
+ /// Default sweep: remove each element individually.
347
+ func clearSceneElements(_ elementIds: [String]) async {
348
+ for id in elementIds {
349
+ await removeLayoutElement(id, layoutId: nil)
350
+ }
351
+ }
352
+
353
+ /// Apply a whole scene frame from the host pipeline (display.render()).
354
+ ///
355
+ /// The host has already diffed the scene, so each element arrives annotated
356
+ /// and `removed` lists what disappeared. PAINT-THEN-SWEEP: creates/updates/
357
+ /// moves land first, removes go LAST — a scene transition never shows a
358
+ /// blank interval. "unchanged" elements are skipped entirely (this is also
359
+ /// what prevents image re-uploads over BLE). Replay frames arrive
360
+ /// all-"created" and reset retained bookkeeping first, because firmware
361
+ /// silently drops updates to dead component ids. Rects compile to empty
362
+ /// bordered text boxes (no shape primitive on current targets) and always
363
+ /// get a visible border.
364
+ func applySceneFrame(_ frame: SceneFrame) async {
365
+ if frame.replay {
366
+ await onSceneReplay(frame.appId)
367
+ }
368
+ // An id in `removed` that ALSO appears in `elements` is a type change
369
+ // (the differ keys matches by type:id). Its removal must run BEFORE the
370
+ // paint — registries key by id, so a post-paint sweep would delete the
371
+ // just-painted replacement.
372
+ let paintedIds = Set(frame.elements.map { $0.id })
373
+ for id in frame.removed where paintedIds.contains(id) {
374
+ await removeLayoutElement(id, layoutId: frame.appId)
375
+ }
376
+ for el in frame.elements {
377
+ if !frame.replay, el.change == "unchanged" {
378
+ continue
379
+ }
380
+ switch el.type {
381
+ case "text":
382
+ await drawLayoutText(
383
+ el.text ?? "", x: el.x, y: el.y, width: el.w, height: el.h,
384
+ borderWidth: el.border, borderRadius: el.radius,
385
+ elementId: el.id, layoutId: frame.appId
386
+ )
387
+ case "rect":
388
+ await drawLayoutText(
389
+ "", x: el.x, y: el.y, width: el.w, height: el.h,
390
+ borderWidth: max(1, el.border), borderRadius: el.radius,
391
+ elementId: el.id, layoutId: frame.appId
392
+ )
393
+ case "image":
394
+ if let data = el.data {
395
+ _ = await drawLayoutBitmap(
396
+ base64ImageData: data, x: el.x, y: el.y, width: el.w, height: el.h,
397
+ elementId: el.id, layoutId: frame.appId
398
+ )
399
+ }
400
+ default:
401
+ Bridge.log("SGC: applySceneFrame: unknown element type \(el.type)")
402
+ }
403
+ }
404
+ for id in frame.removed where !paintedIds.contains(id) {
405
+ await removeLayoutElement(id, layoutId: frame.appId)
406
+ }
407
+ }
408
+
409
+ // MARK: - Video recording (default: ignore custom settings, use saved defaults)
410
+
411
+ func startVideoRecording(
412
+ requestId: String, save: Bool, sound: Bool, width _: Int, height _: Int,
413
+ fps _: Int, maxRecordingTimeMinutes _: Int
414
+ ) {
415
+ startVideoRecording(requestId: requestId, save: save, sound: sound)
416
+ }
417
+
418
+ func queryVideoRecordingStatus(requestId _: String) {
419
+ Bridge.log("SGC: queryVideoRecordingStatus operation not supported")
420
+ }
421
+
422
+ func stopVideoRecording(requestId: String, webhookUrl _: String?, authToken _: String?) {
423
+ stopVideoRecording(requestId: requestId)
424
+ }
425
+
426
+ // MARK: - Dashboard (default: combined wire format; Nex implements single-field)
427
+
428
+ func setDashboardHeightOnly(_ height: Int) {
429
+ let d = DeviceStore.shared.get("bluetooth", "dashboard_depth") as? Int ?? 2
430
+ setDashboardPosition(height, d)
431
+ }
432
+
433
+ func setDashboardDepthOnly(_ depth: Int) {
434
+ let h = DeviceStore.shared.get("bluetooth", "dashboard_height") as? Int ?? 4
435
+ setDashboardPosition(h, depth)
436
+ }
437
+
438
+ func cfwSceneRendererToggled(_: Bool) async {}
439
+
440
+ // MARK: - Native navigation defaults (only G2 has a glasses-side nav UI)
441
+
442
+ var navigationModeActive: Bool {
443
+ false
444
+ }
445
+
446
+ func enterNavigationMode() {
447
+ Bridge.log("SGC: enterNavigationMode not supported")
448
+ }
449
+
450
+ func exitNavigationMode(arrived _: Bool) {}
451
+
452
+ func sendNavigationInfo(
453
+ directionIcon _: Int32, distance _: String, roadName _: String,
454
+ spendTime _: String, remainDistance _: String, etaTime _: String, speed _: String
455
+ ) {}
456
+
457
+ func sendNavigationMiniMap(base64ImageData _: String, rotationDeg _: Int32, borderEnabled _: Bool) {}
458
+
459
+ func sendNavigationOverviewMap(base64ImageData _: String) {}
460
+
461
+ // MARK: - Dashboard Menu (default no-op — only G2 supports this)
462
+
463
+ func setDashboardMenu(_: [[String: Any]]) {}
464
+
465
+ // MARK: - Notification Panel (default no-op — only G2 supports this)
466
+
467
+ func showNotificationsPanel() async {}
468
+
469
+ // MARK: - IMU (default no-op — only G2 streams accelerometer data)
470
+
471
+ func setImuEnabled(_: Bool) async {
472
+ Bridge.log("SGC: setImuEnabled not supported")
473
+ }
474
+
475
+ // MARK: - Calendar Events (default no-op — only G2 supports this)
476
+
477
+ func sendCalendarEvents(_: [[String: Any]]) {}
478
+
479
+ // MARK: - Phone Notifications (default no-op — only G2 filters ANCS on-glass)
480
+
481
+ func sendNotificationCtrl() {}
482
+
483
+ func sendNotificationFilter() {}
484
+
485
+ // MARK: - Dashboard Display Settings (default no-op — only G2 supports this)
486
+
487
+ func sendDashboardDisplaySettings() {}
488
+
489
+ // MARK: - Voice Activity Detection (default no-op — Mentra Live supports this)
490
+
491
+ func sendVoiceActivityDetectionSetting() {}
492
+
493
+ // MARK: - Loudness / Barrier Gate (default no-op — Mentra Live supports this)
494
+
495
+ func sendLoudnessGateSetting() {}
496
+
497
+ /// Default no-op; Mentra Live and G2 override to handle phone-detected clock skew.
498
+ func sendSetSystemTime(_: Int64) {
499
+ Bridge.log("SGC: sendSetSystemTime not supported")
500
+ }
501
+
502
+ /// Default no-op; Mentra Live overrides to enable/disable Wi-Fi ADB.
503
+ func sendWifiAdbState(_: Bool) {
504
+ Bridge.log("SGC: sendWifiAdbState not supported")
505
+ }
506
+
507
+ // MARK: - Default DeviceStore-backed property implementations
508
+
509
+ var fullyBooted: Bool {
510
+ DeviceStore.shared.get("glasses", "fullyBooted") as? Bool ?? false
511
+ }
512
+
513
+ var connected: Bool {
514
+ DeviceStore.shared.get("glasses", "connected") as? Bool ?? false
515
+ }
516
+
517
+ var appVersion: String {
518
+ DeviceStore.shared.get("glasses", "appVersion") as? String ?? ""
519
+ }
520
+
521
+ var buildNumber: String {
522
+ DeviceStore.shared.get("glasses", "buildNumber") as? String ?? ""
523
+ }
524
+
525
+ var deviceModel: String {
526
+ DeviceStore.shared.get("glasses", "deviceModel") as? String ?? ""
527
+ }
528
+
529
+ var androidVersion: String {
530
+ DeviceStore.shared.get("glasses", "androidVersion") as? String ?? ""
531
+ }
532
+
533
+ var otaVersionUrl: String {
534
+ DeviceStore.shared.get("glasses", "otaVersionUrl") as? String ?? ""
535
+ }
536
+
537
+ var firmwareVersion: String {
538
+ DeviceStore.shared.get("glasses", "firmwareVersion") as? String ?? ""
539
+ }
540
+
541
+ var bluetoothMacAddress: String {
542
+ DeviceStore.shared.get("glasses", "bluetoothMacAddress") as? String ?? ""
543
+ }
544
+
545
+ var serialNumber: String {
546
+ DeviceStore.shared.get("glasses", "serialNumber") as? String ?? ""
547
+ }
548
+
549
+ var style: String {
550
+ DeviceStore.shared.get("glasses", "style") as? String ?? ""
551
+ }
552
+
553
+ var color: String {
554
+ DeviceStore.shared.get("glasses", "color") as? String ?? ""
555
+ }
556
+
557
+ var micEnabled: Bool {
558
+ DeviceStore.shared.get("glasses", "micEnabled") as? Bool ?? false
559
+ }
560
+
561
+ var voiceActivityDetectionEnabled: Bool {
562
+ DeviceStore.shared.get("glasses", "voiceActivityDetectionEnabled") as? Bool
563
+ ?? BluetoothSdkDefaults.voiceActivityDetectionEnabled
564
+ }
565
+
566
+ var batteryLevel: Int {
567
+ DeviceStore.shared.get("glasses", "batteryLevel") as? Int ?? -1
568
+ }
569
+
570
+ var headUp: Bool {
571
+ DeviceStore.shared.get("glasses", "headUp") as? Bool ?? false
572
+ }
573
+
574
+ var charging: Bool {
575
+ DeviceStore.shared.get("glasses", "charging") as? Bool ?? false
576
+ }
577
+
578
+ var caseOpen: Bool {
579
+ DeviceStore.shared.get("glasses", "caseOpen") as? Bool ?? true
580
+ }
581
+
582
+ var caseRemoved: Bool {
583
+ DeviceStore.shared.get("glasses", "caseRemoved") as? Bool ?? true
584
+ }
585
+
586
+ var caseCharging: Bool {
587
+ DeviceStore.shared.get("glasses", "caseCharging") as? Bool ?? false
588
+ }
589
+
590
+ var caseBatteryLevel: Int {
591
+ DeviceStore.shared.get("glasses", "caseBatteryLevel") as? Int ?? -1
592
+ }
593
+
594
+ var wifiSsid: String {
595
+ DeviceStore.shared.get("glasses", "wifiSsid") as? String ?? ""
596
+ }
597
+
598
+ var wifiConnected: Bool {
599
+ DeviceStore.shared.get("glasses", "wifiConnected") as? Bool ?? false
600
+ }
601
+
602
+ var wifiLocalIp: String {
603
+ DeviceStore.shared.get("glasses", "wifiLocalIp") as? String ?? ""
604
+ }
605
+
606
+ var hotspotEnabled: Bool {
607
+ DeviceStore.shared.get("glasses", "hotspotEnabled") as? Bool ?? false
608
+ }
609
+
610
+ var hotspotSsid: String {
611
+ DeviceStore.shared.get("glasses", "hotspotSsid") as? String ?? ""
612
+ }
613
+
614
+ var hotspotPassword: String {
615
+ DeviceStore.shared.get("glasses", "hotspotPassword") as? String ?? ""
616
+ }
617
+
618
+ var hotspotGatewayIp: String {
619
+ DeviceStore.shared.get("glasses", "hotspotGatewayIp") as? String ?? ""
620
+ }
621
+ }