@glassly/bluetooth-sdk 0.1.0-dev.26

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 (548) 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/java/com/glassly/bluetoothsdk/BluetoothSdk.kt +2325 -0
  139. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkAnalytics.kt +216 -0
  140. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDebug.kt +14 -0
  141. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDefaults.kt +7 -0
  142. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkModule.kt +1088 -0
  143. package/android/src/main/java/com/glassly/bluetoothsdk/Bridge.kt +953 -0
  144. package/android/src/main/java/com/glassly/bluetoothsdk/DeviceManager.kt +2528 -0
  145. package/android/src/main/java/com/glassly/bluetoothsdk/DeviceStore.kt +360 -0
  146. package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedChangelogCatalog.kt +8 -0
  147. package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedReleaseMetadata.kt +11 -0
  148. package/android/src/main/java/com/glassly/bluetoothsdk/LocalNetworkModule.kt +414 -0
  149. package/android/src/main/java/com/glassly/bluetoothsdk/ObservableStore.kt +88 -0
  150. package/android/src/main/java/com/glassly/bluetoothsdk/OtaManifest.kt +191 -0
  151. package/android/src/main/java/com/glassly/bluetoothsdk/ReleaseChangelog.kt +61 -0
  152. package/android/src/main/java/com/glassly/bluetoothsdk/ScopedNetworkReadiness.kt +17 -0
  153. package/android/src/main/java/com/glassly/bluetoothsdk/audio/AudioModels.kt +144 -0
  154. package/android/src/main/java/com/glassly/bluetoothsdk/camera/CameraModels.kt +486 -0
  155. package/android/src/main/java/com/glassly/bluetoothsdk/connection/ConnectionModels.kt +78 -0
  156. package/android/src/main/java/com/glassly/bluetoothsdk/controllers/ControllerManager.kt +158 -0
  157. package/android/src/main/java/com/glassly/bluetoothsdk/controllers/R1.kt +937 -0
  158. package/android/src/main/java/com/glassly/bluetoothsdk/debug/BleTraceLogger.kt +165 -0
  159. package/android/src/main/java/com/glassly/bluetoothsdk/events/BluetoothEvents.kt +178 -0
  160. package/android/src/main/java/com/glassly/bluetoothsdk/internal/MapParsing.kt +140 -0
  161. package/android/src/main/java/com/glassly/bluetoothsdk/net/LocalIpv4.kt +57 -0
  162. package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServer.kt +304 -0
  163. package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/OtaServerModule.kt +120 -0
  164. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistry.java +108 -0
  165. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoUploadServer.kt +622 -0
  166. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/PhotoReceiverModule.kt +156 -0
  167. package/android/src/main/java/com/glassly/bluetoothsdk/requests/DisplayRequests.kt +56 -0
  168. package/android/src/main/java/com/glassly/bluetoothsdk/services/Foreground.kt +272 -0
  169. package/android/src/main/java/com/glassly/bluetoothsdk/services/PhoneMic.kt +1195 -0
  170. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Ar99.java +2653 -0
  171. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuard.kt +49 -0
  172. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapper.kt +27 -0
  173. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1.kt +3878 -0
  174. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizer.kt +38 -0
  175. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2.kt +6428 -0
  176. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassification.kt +49 -0
  177. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwRenderer.kt +1241 -0
  178. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCache.kt +270 -0
  179. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocol.kt +291 -0
  180. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2Flasher.kt +411 -0
  181. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/GlasslyBle.java +43189 -0
  182. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Mach1.kt +1280 -0
  183. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLive.kt +10817 -0
  184. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLiveL2capChannel.kt +274 -0
  185. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisement.kt +54 -0
  186. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraNex.kt +2011 -0
  187. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Nimo.kt +2532 -0
  188. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/SGCManager.kt +470 -0
  189. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Simulated.kt +228 -0
  190. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/Ar99OtaManager.java +566 -0
  191. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaByteUtils.java +18 -0
  192. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCommandConstants.java +35 -0
  193. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCrc32Util.java +13 -0
  194. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaGattTransport.java +11 -0
  195. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaProtocol.java +92 -0
  196. package/android/src/main/java/com/glassly/bluetoothsdk/speakerid/SpeakerIdEngine.kt +525 -0
  197. package/android/src/main/java/com/glassly/bluetoothsdk/status/DeviceStatus.kt +669 -0
  198. package/android/src/main/java/com/glassly/bluetoothsdk/status/RuntimeState.kt +201 -0
  199. package/android/src/main/java/com/glassly/bluetoothsdk/status/WifiHotspotStatus.kt +189 -0
  200. package/android/src/main/java/com/glassly/bluetoothsdk/streaming/StreamModels.kt +518 -0
  201. package/android/src/main/java/com/glassly/bluetoothsdk/stt/STTTools.kt +391 -0
  202. package/android/src/main/java/com/glassly/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +518 -0
  203. package/android/src/main/java/com/glassly/bluetoothsdk/stt/VadGateSpeechPolicy.kt +229 -0
  204. package/android/src/main/java/com/glassly/bluetoothsdk/tts/TTSTools.kt +248 -0
  205. package/android/src/main/java/com/glassly/bluetoothsdk/types/DeviceModels.kt +96 -0
  206. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AES.java +106 -0
  207. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
  208. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AvifExifStripper.java +573 -0
  209. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
  210. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleJsonCompact.java +496 -0
  211. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadService.java +677 -0
  212. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleWireProtocol.java +108 -0
  213. package/android/src/main/java/com/glassly/bluetoothsdk/utils/Constants.kt +46 -0
  214. package/android/src/main/java/com/glassly/bluetoothsdk/utils/G1Text.kt +436 -0
  215. package/android/src/main/java/com/glassly/bluetoothsdk/utils/HeifExifTagReader.java +199 -0
  216. package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
  217. package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleUploadService.java +77 -0
  218. package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900LengthCodec.java +115 -0
  219. package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtils.java +827 -0
  220. package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunkReassembler.java +228 -0
  221. package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunker.java +325 -0
  222. package/android/src/main/java/com/glassly/bluetoothsdk/utils/NexSGCUtils.kt +698 -0
  223. package/android/src/main/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitor.kt +348 -0
  224. package/android/src/main/java/com/glassly/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
  225. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Ar99OpusPcmDecoder.java +398 -0
  226. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
  227. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
  228. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
  229. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PcmStreamPlayer.kt +328 -0
  230. package/android/src/main/res/values/strings.xml +4 -0
  231. package/android/src/test/java/com/glassly/bluetoothsdk/BluetoothSdkExceptionTest.kt +18 -0
  232. package/android/src/test/java/com/glassly/bluetoothsdk/OtaManifestDowngradeTest.kt +86 -0
  233. package/android/src/test/java/com/glassly/bluetoothsdk/OtaStartResponsePolicyTest.kt +30 -0
  234. package/android/src/test/java/com/glassly/bluetoothsdk/ReleaseChangelogTest.kt +13 -0
  235. package/android/src/test/java/com/glassly/bluetoothsdk/ScopedNetworkReadinessTest.kt +39 -0
  236. package/android/src/test/java/com/glassly/bluetoothsdk/StreamStatusEventTest.kt +29 -0
  237. package/android/src/test/java/com/glassly/bluetoothsdk/camera/PhotoRequestTest.kt +141 -0
  238. package/android/src/test/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServerTest.kt +82 -0
  239. package/android/src/test/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistryTest.java +75 -0
  240. package/android/src/test/java/com/glassly/bluetoothsdk/services/ForegroundServiceTypeTest.kt +69 -0
  241. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/Ar99AdvertisementMatcherTest.java +22 -0
  242. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuardTest.kt +73 -0
  243. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapperTest.kt +67 -0
  244. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/EvenRleTest.kt +63 -0
  245. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizerTest.kt +31 -0
  246. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassificationTest.kt +89 -0
  247. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwRendererTest.kt +344 -0
  248. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCacheTest.kt +200 -0
  249. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocolTest.kt +131 -0
  250. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLiveGattCharacteristicsTest.kt +39 -0
  251. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisementParserTest.kt +133 -0
  252. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/NimoProtocolTest.kt +333 -0
  253. package/android/src/test/java/com/glassly/bluetoothsdk/utils/AvifExifStripperTest.java +46 -0
  254. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BinaryMessageChunkerTest.java +84 -0
  255. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BleJsonCompactTest.java +319 -0
  256. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadServiceTest.java +107 -0
  257. package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsEndiannessTest.java +172 -0
  258. package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsTest.java +24 -0
  259. package/android/src/test/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitorTest.kt +45 -0
  260. package/android/src/test/resources/avif_with_exif.avif +0 -0
  261. package/app.plugin.js +3 -0
  262. package/build/BluetoothSdk.types.d.ts +1354 -0
  263. package/build/BluetoothSdk.types.d.ts.map +1 -0
  264. package/build/BluetoothSdk.types.js +41 -0
  265. package/build/BluetoothSdk.types.js.map +1 -0
  266. package/build/_internal.d.ts +17 -0
  267. package/build/_internal.d.ts.map +1 -0
  268. package/build/_internal.js +16 -0
  269. package/build/_internal.js.map +1 -0
  270. package/build/_private/BluetoothSdkModule.d.ts +172 -0
  271. package/build/_private/BluetoothSdkModule.d.ts.map +1 -0
  272. package/build/_private/BluetoothSdkModule.js +300 -0
  273. package/build/_private/BluetoothSdkModule.js.map +1 -0
  274. package/build/_private/LocalNetworkModule.d.ts +38 -0
  275. package/build/_private/LocalNetworkModule.d.ts.map +1 -0
  276. package/build/_private/LocalNetworkModule.js +3 -0
  277. package/build/_private/LocalNetworkModule.js.map +1 -0
  278. package/build/_private/cameraRequestPayload.d.ts +4 -0
  279. package/build/_private/cameraRequestPayload.d.ts.map +1 -0
  280. package/build/_private/cameraRequestPayload.js +32 -0
  281. package/build/_private/cameraRequestPayload.js.map +1 -0
  282. package/build/_private/photoRequestPayload.d.ts +6 -0
  283. package/build/_private/photoRequestPayload.d.ts.map +1 -0
  284. package/build/_private/photoRequestPayload.js +86 -0
  285. package/build/_private/photoRequestPayload.js.map +1 -0
  286. package/build/_private/sdkOtaManifest.d.ts +11 -0
  287. package/build/_private/sdkOtaManifest.d.ts.map +1 -0
  288. package/build/_private/sdkOtaManifest.js +15 -0
  289. package/build/_private/sdkOtaManifest.js.map +1 -0
  290. package/build/changelogs.d.ts +7 -0
  291. package/build/changelogs.d.ts.map +1 -0
  292. package/build/changelogs.js +46 -0
  293. package/build/changelogs.js.map +1 -0
  294. package/build/debug.d.ts +3 -0
  295. package/build/debug.d.ts.map +1 -0
  296. package/build/debug.js +8 -0
  297. package/build/debug.js.map +1 -0
  298. package/build/generated/changelogCatalog.d.ts +9 -0
  299. package/build/generated/changelogCatalog.d.ts.map +1 -0
  300. package/build/generated/changelogCatalog.js +12 -0
  301. package/build/generated/changelogCatalog.js.map +1 -0
  302. package/build/generated/releaseMetadata.d.ts +12 -0
  303. package/build/generated/releaseMetadata.d.ts.map +1 -0
  304. package/build/generated/releaseMetadata.js +10 -0
  305. package/build/generated/releaseMetadata.js.map +1 -0
  306. package/build/index.d.ts +6 -0
  307. package/build/index.d.ts.map +1 -0
  308. package/build/index.js +171 -0
  309. package/build/index.js.map +1 -0
  310. package/build/ota-server/OtaServer.types.d.ts +14 -0
  311. package/build/ota-server/OtaServer.types.d.ts.map +1 -0
  312. package/build/ota-server/OtaServer.types.js +2 -0
  313. package/build/ota-server/OtaServer.types.js.map +1 -0
  314. package/build/ota-server/OtaServerModule.d.ts +21 -0
  315. package/build/ota-server/OtaServerModule.d.ts.map +1 -0
  316. package/build/ota-server/OtaServerModule.js +3 -0
  317. package/build/ota-server/OtaServerModule.js.map +1 -0
  318. package/build/ota-server/OtaServerModule.web.d.ts +10 -0
  319. package/build/ota-server/OtaServerModule.web.d.ts.map +1 -0
  320. package/build/ota-server/OtaServerModule.web.js +12 -0
  321. package/build/ota-server/OtaServerModule.web.js.map +1 -0
  322. package/build/ota-server/index.d.ts +3 -0
  323. package/build/ota-server/index.d.ts.map +1 -0
  324. package/build/ota-server/index.js +3 -0
  325. package/build/ota-server/index.js.map +1 -0
  326. package/build/ota-transport/index.d.ts +67 -0
  327. package/build/ota-transport/index.d.ts.map +1 -0
  328. package/build/ota-transport/index.js +58 -0
  329. package/build/ota-transport/index.js.map +1 -0
  330. package/build/photo-receiver/PhotoReceiver.types.d.ts +18 -0
  331. package/build/photo-receiver/PhotoReceiver.types.d.ts.map +1 -0
  332. package/build/photo-receiver/PhotoReceiver.types.js +2 -0
  333. package/build/photo-receiver/PhotoReceiver.types.js.map +1 -0
  334. package/build/photo-receiver/PhotoReceiverModule.d.ts +10 -0
  335. package/build/photo-receiver/PhotoReceiverModule.d.ts.map +1 -0
  336. package/build/photo-receiver/PhotoReceiverModule.js +3 -0
  337. package/build/photo-receiver/PhotoReceiverModule.js.map +1 -0
  338. package/build/photo-receiver/PhotoReceiverModule.web.d.ts +10 -0
  339. package/build/photo-receiver/PhotoReceiverModule.web.d.ts.map +1 -0
  340. package/build/photo-receiver/PhotoReceiverModule.web.js +12 -0
  341. package/build/photo-receiver/PhotoReceiverModule.web.js.map +1 -0
  342. package/build/photo-receiver/index.d.ts +3 -0
  343. package/build/photo-receiver/index.d.ts.map +1 -0
  344. package/build/photo-receiver/index.js +3 -0
  345. package/build/photo-receiver/index.js.map +1 -0
  346. package/build/react/index.d.ts +5 -0
  347. package/build/react/index.d.ts.map +1 -0
  348. package/build/react/index.js +4 -0
  349. package/build/react/index.js.map +1 -0
  350. package/build/react/useBluetooth.d.ts +100 -0
  351. package/build/react/useBluetooth.d.ts.map +1 -0
  352. package/build/react/useBluetooth.js +167 -0
  353. package/build/react/useBluetooth.js.map +1 -0
  354. package/build/react/useBluetoothEvent.d.ts +6 -0
  355. package/build/react/useBluetoothEvent.d.ts.map +1 -0
  356. package/build/react/useBluetoothEvent.js +21 -0
  357. package/build/react/useBluetoothEvent.js.map +1 -0
  358. package/build/react/useBluetoothScan.d.ts +22 -0
  359. package/build/react/useBluetoothScan.d.ts.map +1 -0
  360. package/build/react/useBluetoothScan.js +135 -0
  361. package/build/react/useBluetoothScan.js.map +1 -0
  362. package/build/react/useBluetoothStatus.d.ts +16 -0
  363. package/build/react/useBluetoothStatus.d.ts.map +1 -0
  364. package/build/react/useBluetoothStatus.js +137 -0
  365. package/build/react/useBluetoothStatus.js.map +1 -0
  366. package/build/react/useGlassesConnection.d.ts +29 -0
  367. package/build/react/useGlassesConnection.d.ts.map +1 -0
  368. package/build/react/useGlassesConnection.js +153 -0
  369. package/build/react/useGlassesConnection.js.map +1 -0
  370. package/build/types/index.d.ts +3 -0
  371. package/build/types/index.d.ts.map +1 -0
  372. package/build/types/index.js +2 -0
  373. package/build/types/index.js.map +1 -0
  374. package/expo-module.config.json +14 -0
  375. package/ios/BackgroundOtaArtifactDownloader.swift +125 -0
  376. package/ios/BluetoothSdkModule.swift +1034 -0
  377. package/ios/GlasslyBluetoothSDK.podspec +106 -0
  378. package/ios/LocalIPv4.swift +150 -0
  379. package/ios/LocalOtaServer.swift +309 -0
  380. package/ios/LocalPhotoUploadServer.swift +754 -0
  381. package/ios/OtaServerModule.swift +147 -0
  382. package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
  383. package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
  384. package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
  385. package/ios/Packages/CoreObjC/attdet.c +92 -0
  386. package/ios/Packages/CoreObjC/attdet.h +44 -0
  387. package/ios/Packages/CoreObjC/bits.c +375 -0
  388. package/ios/Packages/CoreObjC/bits.h +315 -0
  389. package/ios/Packages/CoreObjC/bwdet.c +129 -0
  390. package/ios/Packages/CoreObjC/bwdet.h +69 -0
  391. package/ios/Packages/CoreObjC/common.h +151 -0
  392. package/ios/Packages/CoreObjC/energy.c +70 -0
  393. package/ios/Packages/CoreObjC/energy.h +43 -0
  394. package/ios/Packages/CoreObjC/fastmath.h +158 -0
  395. package/ios/Packages/CoreObjC/include/PcmConverter.h +22 -0
  396. package/ios/Packages/CoreObjC/lc3.c +704 -0
  397. package/ios/Packages/CoreObjC/lc3.h +313 -0
  398. package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
  399. package/ios/Packages/CoreObjC/lc3_private.h +163 -0
  400. package/ios/Packages/CoreObjC/ltpf.c +905 -0
  401. package/ios/Packages/CoreObjC/ltpf.h +111 -0
  402. package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
  403. package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
  404. package/ios/Packages/CoreObjC/makefile.mk +35 -0
  405. package/ios/Packages/CoreObjC/mdct.c +469 -0
  406. package/ios/Packages/CoreObjC/mdct.h +57 -0
  407. package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
  408. package/ios/Packages/CoreObjC/meson.build +61 -0
  409. package/ios/Packages/CoreObjC/plc.c +61 -0
  410. package/ios/Packages/CoreObjC/plc.h +57 -0
  411. package/ios/Packages/CoreObjC/rnnoise.h +114 -0
  412. package/ios/Packages/CoreObjC/sns.c +880 -0
  413. package/ios/Packages/CoreObjC/sns.h +103 -0
  414. package/ios/Packages/CoreObjC/spec.c +907 -0
  415. package/ios/Packages/CoreObjC/spec.h +119 -0
  416. package/ios/Packages/CoreObjC/tables.c +3457 -0
  417. package/ios/Packages/CoreObjC/tables.h +94 -0
  418. package/ios/Packages/CoreObjC/tns.c +457 -0
  419. package/ios/Packages/CoreObjC/tns.h +99 -0
  420. package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
  421. package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
  422. package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +2383 -0
  423. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +48 -0
  424. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
  425. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
  426. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
  427. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
  428. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
  429. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
  430. package/ios/Packages/libbz2/module.modulemap +5 -0
  431. package/ios/Packages/libbz2/shim.h +1 -0
  432. package/ios/PhotoReceiverModule.swift +129 -0
  433. package/ios/Source/BluetoothSDK.swift +2303 -0
  434. package/ios/Source/BluetoothSDKDebug.swift +12 -0
  435. package/ios/Source/BluetoothSdkDefaults.swift +29 -0
  436. package/ios/Source/Bridge.swift +708 -0
  437. package/ios/Source/Bridging-Header.h +16 -0
  438. package/ios/Source/DeviceManager.swift +2109 -0
  439. package/ios/Source/DeviceStore.swift +336 -0
  440. package/ios/Source/GeneratedChangelogCatalog.swift +7 -0
  441. package/ios/Source/GeneratedReleaseMetadata.swift +11 -0
  442. package/ios/Source/ObservableStore.swift +118 -0
  443. package/ios/Source/OtaManifest.swift +211 -0
  444. package/ios/Source/PrivacyInfo.xcprivacy +23 -0
  445. package/ios/Source/ReleaseChangelog.swift +65 -0
  446. package/ios/Source/Resources/G2Firmware/README.md +10 -0
  447. package/ios/Source/audio/AudioModels.swift +178 -0
  448. package/ios/Source/audio/PcmStreamPlayer.swift +410 -0
  449. package/ios/Source/camera/CameraModels.swift +866 -0
  450. package/ios/Source/connection/ScanSession.swift +27 -0
  451. package/ios/Source/controllers/ControllerManager.swift +184 -0
  452. package/ios/Source/controllers/R1.swift +829 -0
  453. package/ios/Source/errors/BluetoothSdkError.swift +19 -0
  454. package/ios/Source/events/BluetoothEvents.swift +342 -0
  455. package/ios/Source/internal/BleTraceLogger.swift +192 -0
  456. package/ios/Source/internal/BluetoothAvailability.swift +78 -0
  457. package/ios/Source/internal/BluetoothSdkAnalytics.swift +199 -0
  458. package/ios/Source/internal/ValueParsing.swift +99 -0
  459. package/ios/Source/requests/DisplayRequests.swift +82 -0
  460. package/ios/Source/services/PhoneMic.swift +662 -0
  461. package/ios/Source/sgcs/Ar99.swift +2451 -0
  462. package/ios/Source/sgcs/Frame.swift +649 -0
  463. package/ios/Source/sgcs/G1.swift +2554 -0
  464. package/ios/Source/sgcs/G2.swift +6887 -0
  465. package/ios/Source/sgcs/G2CfwClassification.swift +43 -0
  466. package/ios/Source/sgcs/G2CfwRenderer.swift +1279 -0
  467. package/ios/Source/sgcs/G2CfwTextureCache.swift +233 -0
  468. package/ios/Source/sgcs/G2FlashProtocol.swift +312 -0
  469. package/ios/Source/sgcs/G2Flasher.swift +773 -0
  470. package/ios/Source/sgcs/Mach1.swift +541 -0
  471. package/ios/Source/sgcs/MentraLive.swift +7011 -0
  472. package/ios/Source/sgcs/MentraLiveL2capChannel.swift +183 -0
  473. package/ios/Source/sgcs/MentraLivePairingAdvertisement.swift +64 -0
  474. package/ios/Source/sgcs/MentraNex.swift +3221 -0
  475. package/ios/Source/sgcs/Nimo.swift +1886 -0
  476. package/ios/Source/sgcs/SGCManager.swift +608 -0
  477. package/ios/Source/sgcs/Simulated.swift +274 -0
  478. package/ios/Source/sgcs/ar99/ota/Ar99OtaManager.swift +637 -0
  479. package/ios/Source/sgcs/glassly_ble.pb.swift +4354 -0
  480. package/ios/Source/speakerid/SpeakerIdEngine.swift +573 -0
  481. package/ios/Source/status/DeviceStatus.swift +981 -0
  482. package/ios/Source/status/RuntimeState.swift +359 -0
  483. package/ios/Source/status/WifiHotspotStatus.swift +345 -0
  484. package/ios/Source/streaming/StreamModels.swift +693 -0
  485. package/ios/Source/stt/STTTools.swift +191 -0
  486. package/ios/Source/stt/SherpaOnnxTranscriber.swift +466 -0
  487. package/ios/Source/tts/TTSTools.swift +171 -0
  488. package/ios/Source/types/DeviceModels.swift +177 -0
  489. package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
  490. package/ios/Source/utils/BinaryCodec.swift +61 -0
  491. package/ios/Source/utils/BleJsonCompact.swift +405 -0
  492. package/ios/Source/utils/BleWireProtocol.swift +92 -0
  493. package/ios/Source/utils/Constants.swift +78 -0
  494. package/ios/Source/utils/Enums.swift +95 -0
  495. package/ios/Source/utils/G1Text.swift +2096 -0
  496. package/ios/Source/utils/JSCExperiment.swift +241 -0
  497. package/ios/Source/utils/MemoryMonitor.swift +44 -0
  498. package/ios/Source/utils/MessageChunkReassembler.swift +190 -0
  499. package/ios/Source/utils/MessageChunker.swift +294 -0
  500. package/ios/Source/utils/Models.swift +135 -0
  501. package/ios/Source/utils/PhoneAudioMonitor.swift +230 -0
  502. package/ios/Source/utils/TarBz2Extractor.swift +257 -0
  503. package/ios/Tests/BluetoothSDKTests/G2CfwClassificationTests.swift +78 -0
  504. package/ios/Tests/BluetoothSDKTests/G2CfwRendererTests.swift +372 -0
  505. package/ios/Tests/BluetoothSDKTests/G2CfwTextureCacheTests.swift +162 -0
  506. package/ios/Tests/BluetoothSDKTests/G2FlashProtocolTests.swift +182 -0
  507. package/ios/Tests/MentraLivePairingAdvertisementTests.swift +160 -0
  508. package/ios/Tests/ReleaseChangelogTests.swift +13 -0
  509. package/package.json +129 -0
  510. package/plugin/build/index.d.ts +10 -0
  511. package/plugin/build/index.js +12 -0
  512. package/plugin/build/withAndroid.d.ts +3 -0
  513. package/plugin/build/withAndroid.js +190 -0
  514. package/plugin/build/withIos.d.ts +5 -0
  515. package/plugin/build/withIos.js +108 -0
  516. package/scripts/inject-ios-sdk-version.mjs +65 -0
  517. package/scripts/public-ota-api.test.mjs +37 -0
  518. package/scripts/verify-release-package.mjs +45 -0
  519. package/scripts/write-release-metadata.mjs +152 -0
  520. package/scripts/write-release-metadata.test.mjs +37 -0
  521. package/src/BluetoothSdk.types.ts +1623 -0
  522. package/src/_internal.ts +16 -0
  523. package/src/_private/BluetoothSdkModule.ts +684 -0
  524. package/src/_private/LocalNetworkModule.ts +50 -0
  525. package/src/_private/cameraRequestPayload.ts +34 -0
  526. package/src/_private/photoRequestPayload.ts +90 -0
  527. package/src/_private/sdkOtaManifest.ts +18 -0
  528. package/src/changelogs.ts +46 -0
  529. package/src/debug.ts +9 -0
  530. package/src/generated/changelogCatalog.ts +13 -0
  531. package/src/generated/releaseMetadata.ts +20 -0
  532. package/src/index.ts +321 -0
  533. package/src/ota-server/OtaServer.types.ts +10 -0
  534. package/src/ota-server/OtaServerModule.ts +23 -0
  535. package/src/ota-server/OtaServerModule.web.ts +17 -0
  536. package/src/ota-server/index.ts +2 -0
  537. package/src/ota-transport/index.ts +116 -0
  538. package/src/photo-receiver/PhotoReceiver.types.ts +20 -0
  539. package/src/photo-receiver/PhotoReceiverModule.ts +11 -0
  540. package/src/photo-receiver/PhotoReceiverModule.web.ts +17 -0
  541. package/src/photo-receiver/index.ts +2 -0
  542. package/src/react/index.ts +21 -0
  543. package/src/react/useBluetooth.ts +309 -0
  544. package/src/react/useBluetoothEvent.ts +35 -0
  545. package/src/react/useBluetoothScan.ts +173 -0
  546. package/src/react/useBluetoothStatus.ts +180 -0
  547. package/src/react/useGlassesConnection.ts +202 -0
  548. package/src/types/index.ts +12 -0
@@ -0,0 +1,649 @@
1
+ // //
2
+ // // Frame.swift
3
+ // // AOS
4
+ // //
5
+ // // Created by Matthew Fosse on 8/20/25.
6
+ // //
7
+
8
+ // //
9
+ // // FrameManager.swift
10
+ // // AOS
11
+ // //
12
+ // // Created for Brilliant Labs Frame support
13
+ // //
14
+
15
+ // import Combine
16
+ // import CoreBluetooth
17
+ // import Foundation
18
+ // import React
19
+ // import UIKit
20
+
21
+ // // MARK: - Supporting Types
22
+
23
+ // struct FrameDevice {
24
+ // let name: String
25
+ // let address: String
26
+ // }
27
+
28
+ // struct FrameCommand {
29
+ // let command: String
30
+ // let completion: ((Bool) -> Void)?
31
+ // }
32
+
33
+ // // MARK: - FrameManager
34
+
35
+ // @objc(FrameManager) class FrameManager: NSObject, SGCManager {
36
+ // func sendButtonMaxRecordingTime() {}
37
+
38
+ // var appVersion: String = ""
39
+
40
+ // var buildNumber: String = ""
41
+
42
+ // var deviceModel: String = ""
43
+
44
+ // var androidVersion: String = ""
45
+
46
+ // var otaVersionUrl: String = ""
47
+
48
+ // var serialNumber: String = ""
49
+
50
+ // var style: String = ""
51
+
52
+ // var color: String = ""
53
+
54
+ // var caseBatteryLevel: Int = -1
55
+
56
+ // var wifiSsid: String = ""
57
+
58
+ // var wifiConnected: Bool = false
59
+
60
+ // var wifiLocalIp: String = ""
61
+
62
+ // var isHotspotEnabled: Bool = false
63
+
64
+ // var hotspotSsid: String = ""
65
+
66
+ // var hotspotPassword: String = ""
67
+
68
+ // var hotspotGatewayIp: String = ""
69
+
70
+ // func sendJson(_: [String: Any], wakeUp _: Bool, requireAck _: Bool) {}
71
+
72
+ // func sendButtonPhotoSettings() {}
73
+
74
+ // func sendButtonVideoRecordingSettings() {}
75
+
76
+ // func sendButtonMaxRecordingTime(_: Int) {}
77
+
78
+ func exit() {}
79
+
80
+ func sendRgbLedControl(requestId: String, packageName _: String?, action _: String, color _: String?, onDurationMs _: Int, offDurationMs _: Int, count _: Int) {
81
+ Bridge.sendRgbLedControlResponse(requestId: requestId, success: false, error: "device_not_supported")
82
+ }
83
+
84
+ // func requestWifiScan() {}
85
+
86
+ // func sendWifiCredentials(_: String, _: String) {}
87
+
88
+ // func sendHotspotState(_: Bool) {}
89
+
90
+ // func queryGalleryStatus() {}
91
+
92
+ // func showDashboard() {}
93
+
94
+ // func getConnectedBluetoothName() -> String? {
95
+ // return nil
96
+ // }
97
+
98
+ // func setDashboardPosition(_: Int, _: Int) {}
99
+
100
+ // func setSilentMode(_: Bool) {}
101
+
102
+ // func findCompatibleDevices() {}
103
+
104
+ // func connectById(_: String) {}
105
+
106
+ // func displayBitmap(base64ImageData _: String) async -> Bool {
107
+ // return true
108
+ // }
109
+
110
+ // func sendDoubleTextWall(_: String, _: String) {}
111
+
112
+ // func sendJson(_: [String: Any], wakeUp _: Bool) {}
113
+
114
+ // func requestPhoto(_: String, appId _: String, size _: String?, webhookUrl _: String?) {}
115
+
116
+ // func forget() {}
117
+
118
+ // func setBrightness(_: Int, autoMode _: Bool) {}
119
+
120
+ // let type = "frame"
121
+ // let hasMic = false
122
+ // var ready = false
123
+ // var isHeadUp = false
124
+ // var caseOpen = false
125
+ // var caseRemoved = true
126
+ // var caseCharging = false
127
+
128
+ // func setMicEnabled(_: Bool) {}
129
+
130
+ // func startRtmpStream(_: [String: Any]) {}
131
+
132
+ // func stopRtmpStream() {}
133
+
134
+ // func sendRtmpKeepAlive(_: [String: Any]) {}
135
+
136
+ // func startVideoRecording(requestId _: String, save _: Bool) {}
137
+
138
+ // func stopVideoRecording(requestId _: String) {}
139
+
140
+ // func setHeadUpAngle(_: Int) {}
141
+
142
+ // func getBatteryStatus() {}
143
+
144
+ // // Frame BLE Service and Characteristic UUIDs
145
+ // private let FRAME_SERVICE_UUID = CBUUID(string: "7A230001-5475-A6A4-654C-8431F6AD49C4")
146
+ // private let FRAME_TX_CHAR_UUID = CBUUID(string: "7A230002-5475-A6A4-654C-8431F6AD49C4") // Phone → Frame
147
+ // private let FRAME_RX_CHAR_UUID = CBUUID(string: "7A230003-5475-A6A4-654C-8431F6AD49C4") // Frame → Phone
148
+
149
+ // private static let TAG = "FrameManager"
150
+ // private static let COMMAND_DELAY_MS = 100
151
+ // private static let MAX_QUEUE_SIZE = 10
152
+ // private static let MTU_SIZE = 251
153
+
154
+ // // MARK: - Properties
155
+
156
+ // private var centralManager: CBCentralManager?
157
+ // private var framePeripheral: CBPeripheral?
158
+ // private var txCharacteristic: CBCharacteristic?
159
+ // private var rxCharacteristic: CBCharacteristic?
160
+
161
+ // private var isScanning = false
162
+ // private var isConnecting = false
163
+ // private var isConnected = false
164
+
165
+ // // Command queue system
166
+ // private var commandQueue = [FrameCommand]()
167
+ // private var isProcessingQueue = false
168
+ // private let queueLock = NSLock()
169
+ // private var currentWriteCompletion: ((Bool) -> Void)?
170
+
171
+ // // Device tracking
172
+ // private var discoveredDevices = Set<String>()
173
+ // private var savedDeviceName: String?
174
+
175
+ // // Callbacks
176
+ // var onConnectionStateChanged: (() -> Void)?
177
+ // var onDeviceDiscovered: ((String) -> Void)?
178
+
179
+ // // Published properties for SwiftUI/Combine
180
+ // @Published var connectionState = "DISCONNECTED"
181
+ // @Published var batteryLevel: Int = -1
182
+
183
+ // override init() {
184
+ // super.init()
185
+ // centralManager = CBCentralManager(delegate: self, queue: nil)
186
+ // loadSavedDeviceName()
187
+ // }
188
+
189
+ // // MARK: - Public Methods
190
+
191
+ // func startScanning() {
192
+ // guard let centralManager = centralManager,
193
+ // centralManager.state == .poweredOn,
194
+ // !isScanning
195
+ // else {
196
+ // Bridge.log("\(FrameManager.TAG): Cannot start scan - BLE not ready or already scanning")
197
+ // return
198
+ // }
199
+
200
+ // isScanning = true
201
+ // discoveredDevices.removeAll()
202
+
203
+ // let scanOptions: [String: Any] = [
204
+ // CBCentralManagerScanOptionAllowDuplicatesKey: false,
205
+ // ]
206
+
207
+ // centralManager.scanForPeripherals(
208
+ // withServices: [FRAME_SERVICE_UUID],
209
+ // options: scanOptions
210
+ // )
211
+
212
+ // Bridge.log("\(FrameManager.TAG): Started scanning for Frame devices")
213
+
214
+ // // Stop scan after 10 seconds
215
+ // DispatchQueue.main.asyncAfter(deadline: .now() + 10) { [weak self] in
216
+ // if self?.isScanning == true {
217
+ // self?.stopScanning()
218
+ // }
219
+ // }
220
+ // }
221
+
222
+ // func stopScanning() {
223
+ // guard isScanning else { return }
224
+
225
+ // centralManager?.stopScan()
226
+ // isScanning = false
227
+ // Bridge.log("\(FrameManager.TAG): Stopped scanning")
228
+ // }
229
+
230
+ // func connect(deviceName: String? = nil) {
231
+ // let targetDevice = deviceName ?? savedDeviceName
232
+
233
+ // guard let name = targetDevice else {
234
+ // Bridge.log("\(FrameManager.TAG): No device name available for connection")
235
+ // startScanning()
236
+ // return
237
+ // }
238
+
239
+ // if isConnecting {
240
+ // Bridge.log("\(FrameManager.TAG): Already connecting")
241
+ // return
242
+ // }
243
+
244
+ // isConnecting = true
245
+ // connectionState = "CONNECTING"
246
+
247
+ // // Start targeted scan for specific device
248
+ // startTargetedScan(deviceName: name)
249
+ // }
250
+
251
+ // func disconnect() {
252
+ // guard let peripheral = framePeripheral else { return }
253
+
254
+ // centralManager?.cancelPeripheralConnection(peripheral)
255
+ // cleanup()
256
+ // }
257
+
258
+ // // MARK: - Display Methods
259
+
260
+ // func sendTextWall(_ text: String) {
261
+ // guard isConnected else {
262
+ // Bridge.log("\(FrameManager.TAG): Cannot display text - not connected")
263
+ // return
264
+ // }
265
+
266
+ // // Clear queue for new text display
267
+ // queueLock.lock()
268
+ // commandQueue.removeAll()
269
+ // isProcessingQueue = false
270
+ // queueLock.unlock()
271
+
272
+ // let escapedText = escapeForLua(text)
273
+ // let words = escapedText.split(separator: " ")
274
+
275
+ // let maxLineLength = 30
276
+ // let lineHeight = 55
277
+ // let startY = 20
278
+ // let maxLines = 3
279
+
280
+ // var lines = [String]()
281
+ // var currentLine = ""
282
+
283
+ // for word in words {
284
+ // if lines.count >= maxLines { break }
285
+
286
+ // let wordStr = String(word)
287
+ // if currentLine.count + wordStr.count + 1 > maxLineLength {
288
+ // if !currentLine.isEmpty {
289
+ // lines.append(currentLine.trimmingCharacters(in: .whitespaces))
290
+ // currentLine = ""
291
+ // }
292
+ // }
293
+
294
+ // if !currentLine.isEmpty {
295
+ // currentLine += " "
296
+ // }
297
+ // currentLine += wordStr
298
+ // }
299
+
300
+ // if !currentLine.isEmpty, lines.count < maxLines {
301
+ // lines.append(currentLine.trimmingCharacters(in: .whitespaces))
302
+ // }
303
+
304
+ // // Build commands - lines are already escaped
305
+ // var batchCommand = ""
306
+ // for (index, line) in lines.enumerated() {
307
+ // let yPos = startY + (index * lineHeight)
308
+ // batchCommand += "frame.display.text('\(line)', 10, \(yPos));"
309
+ // }
310
+ // batchCommand += "frame.display.show();print(nil)"
311
+
312
+ // // Send as single command if it fits, otherwise send separately
313
+ // if batchCommand.count < 240 {
314
+ // queueCommand(batchCommand)
315
+ // } else {
316
+ // for (index, line) in lines.enumerated() {
317
+ // let yPos = startY + (index * lineHeight)
318
+ // let lineCommand = "frame.display.text('\(line)', 10, \(yPos));print(nil)"
319
+ // queueCommand(lineCommand)
320
+ // }
321
+ // queueCommand("frame.display.show();print(nil)")
322
+ // }
323
+ // }
324
+
325
+ // func displayTextLine(_ text: String) {
326
+ // let escapedText = escapeForLua(text)
327
+ // let command = "frame.display.text('\(escapedText)', 50, 200);frame.display.show();print(nil)"
328
+ // queueCommand(command)
329
+ // }
330
+
331
+ // func clearDisplay() {
332
+ // queueCommand("frame.display.text(' ', 1, 1);frame.display.show();print(nil)")
333
+ // }
334
+
335
+ // // MARK: - Private Methods
336
+
337
+ // private func startTargetedScan(deviceName: String) {
338
+ // guard let centralManager = centralManager,
339
+ // centralManager.state == .poweredOn
340
+ // else {
341
+ // Bridge.log("\(FrameManager.TAG): BLE not ready for targeted scan")
342
+ // isConnecting = false
343
+ // connectionState = "DISCONNECTED"
344
+ // return
345
+ // }
346
+
347
+ // // Store target name for scan callback
348
+ // savedDeviceName = deviceName
349
+
350
+ // centralManager.scanForPeripherals(
351
+ // withServices: [FRAME_SERVICE_UUID],
352
+ // options: nil
353
+ // )
354
+
355
+ // // Timeout after 10 seconds
356
+ // DispatchQueue.main.asyncAfter(deadline: .now() + 10) { [weak self] in
357
+ // guard let self = self else { return }
358
+ // if self.isConnecting, self.framePeripheral == nil {
359
+ // self.centralManager?.stopScan()
360
+ // self.isConnecting = false
361
+ // self.connectionState = "DISCONNECTED"
362
+ // Bridge.log("\(FrameManager.TAG): Connection timeout - device not found")
363
+ // }
364
+ // }
365
+ // }
366
+
367
+ // private func queueCommand(_ command: String, completion: ((Bool) -> Void)? = nil) {
368
+ // queueLock.lock()
369
+ // commandQueue.append(FrameCommand(command: command, completion: completion))
370
+ // Bridge.log("\(FrameManager.TAG): Queued command (queue size: \(commandQueue.count))")
371
+ // queueLock.unlock()
372
+
373
+ // processQueue()
374
+ // }
375
+
376
+ // private func processQueue() {
377
+ // queueLock.lock()
378
+
379
+ // if isProcessingQueue || commandQueue.isEmpty {
380
+ // queueLock.unlock()
381
+ // return
382
+ // }
383
+
384
+ // guard let command = commandQueue.first else {
385
+ // queueLock.unlock()
386
+ // return
387
+ // }
388
+
389
+ // isProcessingQueue = true
390
+ // commandQueue.removeFirst()
391
+ // queueLock.unlock()
392
+
393
+ // sendLuaCommand(command.command) { [weak self] success in
394
+ // command.completion?(success)
395
+
396
+ // // If failed, clear queue and stop processing
397
+ // if !success {
398
+ // self?.queueLock.lock()
399
+ // self?.commandQueue.removeAll()
400
+ // self?.isProcessingQueue = false
401
+ // self?.queueLock.unlock()
402
+ // return
403
+ // }
404
+
405
+ // // Schedule next command
406
+ // DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
407
+ // self?.queueLock.lock()
408
+ // self?.isProcessingQueue = false
409
+ // self?.queueLock.unlock()
410
+ // self?.processQueue()
411
+ // }
412
+ // }
413
+ // }
414
+
415
+ // private func sendLuaCommand(_ command: String, completion: @escaping (Bool) -> Void) {
416
+ // guard let txCharacteristic = txCharacteristic,
417
+ // let peripheral = framePeripheral
418
+ // else {
419
+ // Bridge.log("\(FrameManager.TAG): Cannot send command - not connected")
420
+ // completion(false)
421
+ // return
422
+ // }
423
+
424
+ // var finalCommand = command
425
+
426
+ // // Add print(nil) if not present
427
+ // if !command.contains("print(") {
428
+ // if !command.contains(";") {
429
+ // finalCommand = command + ";print(nil)"
430
+ // }
431
+ // }
432
+
433
+ // // Add newline
434
+ // if !finalCommand.hasSuffix("\n") {
435
+ // finalCommand += "\n"
436
+ // }
437
+
438
+ // guard var data = finalCommand.data(using: .utf8) else {
439
+ // Bridge.log("\(FrameManager.TAG): Failed to encode command")
440
+ // completion(false)
441
+ // return
442
+ // }
443
+
444
+ // // Handle MTU limitation
445
+ // if data.count > 247 {
446
+ // Bridge.log("\(FrameManager.TAG): Command too long, truncating")
447
+ // data = data.prefix(247)
448
+ // }
449
+
450
+ // Bridge.log("\(FrameManager.TAG): Sending Lua command: \(finalCommand.trimmingCharacters(in: .whitespacesAndNewlines))")
451
+
452
+ // // Store completion for delegate callback
453
+ // currentWriteCompletion = completion
454
+ // peripheral.writeValue(data, for: txCharacteristic, type: .withResponse)
455
+ // }
456
+
457
+ // private func initializeFrame() {
458
+ // Bridge.log("\(FrameManager.TAG): Initializing Frame display")
459
+
460
+ // // Send break signal to stop any running main.lua
461
+ // sendBreakSignal()
462
+
463
+ // // Wait then send welcome message
464
+ // DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
465
+ // self?.queueCommand("frame.display.text('Glassly Connected!', 100, 100);frame.display.show();print(nil)")
466
+ // }
467
+ // }
468
+
469
+ // private func sendBreakSignal() {
470
+ // guard let txCharacteristic = txCharacteristic,
471
+ // let peripheral = framePeripheral else { return }
472
+
473
+ // let breakSignal = Data([0x03])
474
+ // peripheral.writeValue(breakSignal, for: txCharacteristic, type: .withResponse)
475
+ // Bridge.log("\(FrameManager.TAG): Sent break signal")
476
+ // }
477
+
478
+ // private func escapeForLua(_ text: String) -> String {
479
+ // return text
480
+ // .replacingOccurrences(of: "\\", with: "\\\\")
481
+ // .replacingOccurrences(of: "'", with: "\\'")
482
+ // .replacingOccurrences(of: "\"", with: "\\\"")
483
+ // .replacingOccurrences(of: "\n", with: " ")
484
+ // .replacingOccurrences(of: "\r", with: " ")
485
+ // .replacingOccurrences(of: "\t", with: " ")
486
+ // }
487
+
488
+ // func cleanup() {
489
+ // txCharacteristic = nil
490
+ // rxCharacteristic = nil
491
+ // framePeripheral = nil
492
+ // isConnected = false
493
+ // isConnecting = false
494
+ // connectionState = "DISCONNECTED"
495
+
496
+ // queueLock.lock()
497
+ // commandQueue.removeAll()
498
+ // isProcessingQueue = false
499
+ // queueLock.unlock()
500
+ // }
501
+
502
+ // private func loadSavedDeviceName() {
503
+ // savedDeviceName = UserDefaults.standard.string(forKey: "FrameDeviceName")
504
+ // }
505
+
506
+ // private func saveDeviceName(_ name: String) {
507
+ // savedDeviceName = name
508
+ // UserDefaults.standard.set(name, forKey: "FrameDeviceName")
509
+ // }
510
+ // }
511
+
512
+ // // MARK: - CBCentralManagerDelegate
513
+
514
+ // extension FrameManager: CBCentralManagerDelegate {
515
+ // func centralManagerDidUpdateState(_ central: CBCentralManager) {
516
+ // switch central.state {
517
+ // case .poweredOn:
518
+ // Bridge.log("\(FrameManager.TAG): Bluetooth powered on")
519
+ // case .poweredOff:
520
+ // Bridge.log("\(FrameManager.TAG): Bluetooth powered off")
521
+ // cleanup()
522
+ // default:
523
+ // Bridge.log("\(FrameManager.TAG): Bluetooth state: \(central.state.rawValue)")
524
+ // }
525
+ // }
526
+
527
+ // func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral,
528
+ // advertisementData _: [String: Any], rssi _: NSNumber)
529
+ // {
530
+ // let deviceName = peripheral.name ?? "Unknown"
531
+ // let address = peripheral.identifier.uuidString
532
+
533
+ // // Check if this is a Frame device
534
+ // if deviceName.contains("Frame") || deviceName.contains("frame") {
535
+ // if !discoveredDevices.contains(address) {
536
+ // discoveredDevices.insert(address)
537
+ // Bridge.log("\(FrameManager.TAG): Found Frame device: \(deviceName) (\(address))")
538
+ // onDeviceDiscovered?(deviceName)
539
+
540
+ // // If we're doing targeted scan, connect to matching device
541
+ // if isConnecting, let targetName = savedDeviceName, deviceName == targetName {
542
+ // central.stopScan()
543
+ // framePeripheral = peripheral
544
+ // peripheral.delegate = self
545
+ // central.connect(peripheral, options: nil)
546
+ // Bridge.log("\(FrameManager.TAG): Connecting to \(deviceName)")
547
+ // }
548
+ // }
549
+ // }
550
+ // }
551
+
552
+ // func centralManager(_: CBCentralManager, didConnect peripheral: CBPeripheral) {
553
+ // Bridge.log("\(FrameManager.TAG): Connected to Frame - negotiating MTU")
554
+ // isConnecting = false
555
+
556
+ // // Save device name
557
+ // if let name = peripheral.name {
558
+ // saveDeviceName(name)
559
+ // }
560
+
561
+ // // Request larger MTU
562
+ // peripheral.maximumWriteValueLength(for: .withResponse)
563
+
564
+ // // Discover services
565
+ // peripheral.discoverServices([FRAME_SERVICE_UUID])
566
+ // }
567
+
568
+ // func centralManager(_: CBCentralManager, didDisconnectPeripheral _: CBPeripheral, error _: Error?) {
569
+ // Bridge.log("\(FrameManager.TAG): Disconnected from Frame")
570
+ // cleanup()
571
+ // onConnectionStateChanged?()
572
+ // }
573
+
574
+ // func centralManager(_: CBCentralManager, didFailToConnect _: CBPeripheral, error: Error?) {
575
+ // Bridge.log("\(FrameManager.TAG): Failed to connect: \(error?.localizedDescription ?? "Unknown error")")
576
+ // isConnecting = false
577
+ // connectionState = "DISCONNECTED"
578
+ // cleanup()
579
+ // }
580
+ // }
581
+
582
+ // // MARK: - CBPeripheralDelegate
583
+
584
+ // extension FrameManager: CBPeripheralDelegate {
585
+ // func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
586
+ // guard error == nil else {
587
+ // Bridge.log("\(FrameManager.TAG): Service discovery failed: \(error!)")
588
+ // return
589
+ // }
590
+
591
+ // guard let services = peripheral.services else { return }
592
+
593
+ // for service in services {
594
+ // if service.uuid == FRAME_SERVICE_UUID {
595
+ // Bridge.log("\(FrameManager.TAG): Found Frame service")
596
+ // peripheral.discoverCharacteristics([FRAME_TX_CHAR_UUID, FRAME_RX_CHAR_UUID], for: service)
597
+ // }
598
+ // }
599
+ // }
600
+
601
+ // func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
602
+ // guard error == nil else {
603
+ // Bridge.log("\(FrameManager.TAG): Characteristic discovery failed: \(error!)")
604
+ // return
605
+ // }
606
+
607
+ // guard let characteristics = service.characteristics else { return }
608
+
609
+ // for characteristic in characteristics {
610
+ // if characteristic.uuid == FRAME_TX_CHAR_UUID {
611
+ // txCharacteristic = characteristic
612
+ // Bridge.log("\(FrameManager.TAG): Found TX characteristic")
613
+ // } else if characteristic.uuid == FRAME_RX_CHAR_UUID {
614
+ // rxCharacteristic = characteristic
615
+ // peripheral.setNotifyValue(true, for: characteristic)
616
+ // Bridge.log("\(FrameManager.TAG): Found RX characteristic, enabling notifications")
617
+ // }
618
+ // }
619
+
620
+ // // Check if we have both characteristics
621
+ // if txCharacteristic != nil, rxCharacteristic != nil {
622
+ // isConnected = true
623
+ // connectionState = "CONNECTED"
624
+ // Bridge.log("\(FrameManager.TAG): Frame fully connected")
625
+ // onConnectionStateChanged?()
626
+ // initializeFrame()
627
+ // }
628
+ // }
629
+
630
+ // func peripheral(_: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error _: Error?) {
631
+ // guard characteristic.uuid == FRAME_RX_CHAR_UUID,
632
+ // let data = characteristic.value else { return }
633
+
634
+ // if let response = String(data: data, encoding: .utf8) {
635
+ // Bridge.log("\(FrameManager.TAG): Received from Frame: \(response)")
636
+ // }
637
+ // }
638
+
639
+ // func peripheral(_: CBPeripheral, didWriteValueFor _: CBCharacteristic, error: Error?) {
640
+ // if let error = error {
641
+ // Bridge.log("\(FrameManager.TAG): Write failed: \(error)")
642
+ // currentWriteCompletion?(false)
643
+ // } else {
644
+ // Bridge.log("\(FrameManager.TAG): Successfully wrote to Frame")
645
+ // currentWriteCompletion?(true)
646
+ // }
647
+ // currentWriteCompletion = nil
648
+ // }
649
+ // }