@mentra/bluetooth-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +278 -0
- package/android/build.gradle +167 -0
- package/android/lc3Lib/CMakeLists.txt +6 -0
- package/android/lc3Lib/build.gradle +109 -0
- package/android/lc3Lib/proguard-rules.pro +33 -0
- package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
- package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
- package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
- package/android/lc3Lib/src/main/java/com/mentra/lc3Lib/Lc3Cpp.java +38 -0
- package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
- package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
- package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
- package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
- package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
- package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
- package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
- package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
- package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
- package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
- package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
- package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
- package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
- package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
- package/android/settings.gradle +1 -0
- package/android/src/main/AndroidManifest.xml +40 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/BluetoothSdkModule.kt +528 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/Bridge.kt +610 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/DeviceManager.kt +1616 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/DeviceStore.kt +314 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/MentraBluetoothModels.kt +1710 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/MentraBluetoothSdk.kt +554 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/ObservableStore.kt +68 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/controllers/ControllerManager.kt +158 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/controllers/R1.kt +934 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/services/Foreground.kt +175 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/services/PhoneMic.kt +1109 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/G1.java +3974 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/G2.kt +3551 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/Mach1.java +1327 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraLive.java +6959 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraNex.kt +1655 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraosBle.java +53675 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/SGCManager.kt +202 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/Simulated.kt +224 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/stt/STTTools.kt +340 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +465 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/stt/VadGateSpeechPolicy.kt +221 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/AES.java +106 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/BlePhotoUploadService.java +179 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/Constants.kt +44 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/G1Text.kt +436 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/IncidentLogBleUploadService.java +76 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/K900ProtocolUtils.java +791 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/MessageChunker.java +186 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/NexSGCUtils.kt +589 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/PhoneAudioMonitor.kt +303 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
- package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
- package/android/src/main/res/values/strings.xml +4 -0
- package/app.plugin.js +1 -0
- package/build/BluetoothSdk.types.d.ts +498 -0
- package/build/BluetoothSdk.types.d.ts.map +1 -0
- package/build/BluetoothSdk.types.js +23 -0
- package/build/BluetoothSdk.types.js.map +1 -0
- package/build/BluetoothSdkModule.d.ts +71 -0
- package/build/BluetoothSdkModule.d.ts.map +1 -0
- package/build/BluetoothSdkModule.js +106 -0
- package/build/BluetoothSdkModule.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +5 -0
- package/build/index.js.map +1 -0
- package/expo-module.config.json +9 -0
- package/ios/BluetoothSdkModule.swift +665 -0
- package/ios/MentraBluetoothSDK.podspec +77 -0
- package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
- package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
- package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
- package/ios/Packages/CoreObjC/attdet.c +92 -0
- package/ios/Packages/CoreObjC/attdet.h +44 -0
- package/ios/Packages/CoreObjC/bits.c +375 -0
- package/ios/Packages/CoreObjC/bits.h +315 -0
- package/ios/Packages/CoreObjC/bwdet.c +129 -0
- package/ios/Packages/CoreObjC/bwdet.h +69 -0
- package/ios/Packages/CoreObjC/common.h +151 -0
- package/ios/Packages/CoreObjC/energy.c +70 -0
- package/ios/Packages/CoreObjC/energy.h +43 -0
- package/ios/Packages/CoreObjC/fastmath.h +158 -0
- package/ios/Packages/CoreObjC/lc3.c +704 -0
- package/ios/Packages/CoreObjC/lc3.h +313 -0
- package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
- package/ios/Packages/CoreObjC/lc3_private.h +163 -0
- package/ios/Packages/CoreObjC/ltpf.c +905 -0
- package/ios/Packages/CoreObjC/ltpf.h +111 -0
- package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
- package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
- package/ios/Packages/CoreObjC/makefile.mk +35 -0
- package/ios/Packages/CoreObjC/mdct.c +469 -0
- package/ios/Packages/CoreObjC/mdct.h +57 -0
- package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
- package/ios/Packages/CoreObjC/meson.build +61 -0
- package/ios/Packages/CoreObjC/plc.c +61 -0
- package/ios/Packages/CoreObjC/plc.h +57 -0
- package/ios/Packages/CoreObjC/rnnoise.h +114 -0
- package/ios/Packages/CoreObjC/sns.c +880 -0
- package/ios/Packages/CoreObjC/sns.h +103 -0
- package/ios/Packages/CoreObjC/spec.c +907 -0
- package/ios/Packages/CoreObjC/spec.h +119 -0
- package/ios/Packages/CoreObjC/tables.c +3457 -0
- package/ios/Packages/CoreObjC/tables.h +94 -0
- package/ios/Packages/CoreObjC/tns.c +457 -0
- package/ios/Packages/CoreObjC/tns.h +99 -0
- package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
- package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
- package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +1659 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/cargs.h +162 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/sherpa-onnx/c-api/c-api.h +1852 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/sherpa-onnx/c-api/cxx-api.h +674 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +44 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/sherpa-onnx.a +0 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/sherpa-onnx.a +0 -0
- package/ios/Packages/VAD/Common/VAD/VADQuality.swift +41 -0
- package/ios/Packages/VAD/Common/VAD/VADState.swift +26 -0
- package/ios/Packages/VAD/Common/VAD/VADStrategy.swift +29 -0
- package/ios/Packages/VAD/Common/VAD/VADType.swift +14 -0
- package/ios/Packages/VAD/Data/Configuration.swift +68 -0
- package/ios/Packages/VAD/Data/FrameSize.swift +39 -0
- package/ios/Packages/VAD/Data/Record.swift +13 -0
- package/ios/Packages/VAD/Data/Result.swift +22 -0
- package/ios/Packages/VAD/Data/SampleRate.swift +48 -0
- package/ios/Packages/VAD/Silero/Model/silero_vad.onnx +0 -0
- package/ios/Packages/VAD/Silero/SileroVAD.swift +284 -0
- package/ios/Packages/VAD/Silero/SileroVADStrategy.swift +64 -0
- package/ios/Packages/libbz2/module.modulemap +5 -0
- package/ios/Packages/libbz2/shim.h +1 -0
- package/ios/Source/Bridge.swift +353 -0
- package/ios/Source/Bridging-Header.h +16 -0
- package/ios/Source/DeviceManager.swift +1478 -0
- package/ios/Source/DeviceStore.swift +295 -0
- package/ios/Source/MentraBluetoothSDK.swift +2439 -0
- package/ios/Source/ObservableStore.swift +88 -0
- package/ios/Source/PrivacyInfo.xcprivacy +23 -0
- package/ios/Source/controllers/ControllerManager.swift +187 -0
- package/ios/Source/controllers/R1.swift +827 -0
- package/ios/Source/services/PhoneMic.swift +662 -0
- package/ios/Source/sgcs/Frame.swift +651 -0
- package/ios/Source/sgcs/G1.swift +2505 -0
- package/ios/Source/sgcs/G2.swift +3730 -0
- package/ios/Source/sgcs/Mach1.swift +543 -0
- package/ios/Source/sgcs/MentraLive.swift +4708 -0
- package/ios/Source/sgcs/MentraNex.swift +2479 -0
- package/ios/Source/sgcs/SGCManager.swift +243 -0
- package/ios/Source/sgcs/Simulated.swift +270 -0
- package/ios/Source/sgcs/mentraos_ble.pb.swift +3811 -0
- package/ios/Source/stt/STTTools.swift +154 -0
- package/ios/Source/stt/SherpaOnnxTranscriber.swift +401 -0
- package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
- package/ios/Source/utils/Constants.swift +74 -0
- package/ios/Source/utils/Enums.swift +95 -0
- package/ios/Source/utils/G1Text.swift +2067 -0
- package/ios/Source/utils/JSCExperiment.swift +241 -0
- package/ios/Source/utils/MemoryMonitor.swift +44 -0
- package/ios/Source/utils/MessageChunker.swift +164 -0
- package/ios/Source/utils/Models.swift +135 -0
- package/ios/Source/utils/PhoneAudioMonitor.swift +226 -0
- package/ios/Source/utils/TarBz2Extractor.swift +206 -0
- package/package.json +78 -0
- package/plugin/build/index.d.ts +6 -0
- package/plugin/build/index.js +12 -0
- package/plugin/build/withAndroid.d.ts +4 -0
- package/plugin/build/withAndroid.js +80 -0
- package/plugin/build/withIos.d.ts +4 -0
- package/plugin/build/withIos.js +64 -0
- package/src/BluetoothSdk.types.ts +581 -0
- package/src/BluetoothSdkModule.ts +259 -0
- package/src/index.ts +4 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Bridge.swift
|
|
3
|
+
// AOS
|
|
4
|
+
//
|
|
5
|
+
// Created by Matthew Fosse on 3/4/25.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
/// Bridge for Bluetooth SDK communication between Expo modules and native iOS code
|
|
11
|
+
/// Has commands for the Bluetooth SDK to use to send messages to JavaScript
|
|
12
|
+
class Bridge {
|
|
13
|
+
private static let eventSinkLock = NSLock()
|
|
14
|
+
private static let defaultEventSinkId = "default"
|
|
15
|
+
private static var eventSinks: [String: (String, [String: Any]) -> Void] = [:]
|
|
16
|
+
|
|
17
|
+
static func initialize(callback: @escaping (String, [String: Any]) -> Void) {
|
|
18
|
+
setEventSink(defaultEventSinkId, callback)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static func addEventSink(callback: @escaping (String, [String: Any]) -> Void) -> String {
|
|
22
|
+
let id = UUID().uuidString
|
|
23
|
+
setEventSink(id, callback)
|
|
24
|
+
return id
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static func removeEventSink(_ id: String) {
|
|
28
|
+
eventSinkLock.lock()
|
|
29
|
+
eventSinks.removeValue(forKey: id)
|
|
30
|
+
eventSinkLock.unlock()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private static func setEventSink(_ id: String, _ callback: @escaping (String, [String: Any]) -> Void) {
|
|
34
|
+
eventSinkLock.lock()
|
|
35
|
+
eventSinks[id] = callback
|
|
36
|
+
eventSinkLock.unlock()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private static func currentEventSinks() -> [(String, [String: Any]) -> Void] {
|
|
40
|
+
eventSinkLock.lock()
|
|
41
|
+
let sinks = Array(eventSinks.values)
|
|
42
|
+
eventSinkLock.unlock()
|
|
43
|
+
return sinks
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/// Thread-safe event dispatch - ensures callback is invoked on main thread
|
|
47
|
+
/// to avoid React Native bridge threading issues that can cause EXC_BREAKPOINT
|
|
48
|
+
private static func dispatchEvent(_ eventName: String, _ data: [String: Any]) {
|
|
49
|
+
let sinks = currentEventSinks()
|
|
50
|
+
guard !sinks.isEmpty else { return }
|
|
51
|
+
if Thread.isMainThread {
|
|
52
|
+
sinks.forEach { $0(eventName, data) }
|
|
53
|
+
} else {
|
|
54
|
+
DispatchQueue.main.async {
|
|
55
|
+
sinks.forEach { $0(eventName, data) }
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static func log(_ message: String) {
|
|
61
|
+
let data = ["message": message]
|
|
62
|
+
Bridge.sendTypedMessage("log", body: data)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static func sendHeadUp(_ isUp: Bool) {
|
|
66
|
+
let data = ["up": isUp]
|
|
67
|
+
Bridge.sendTypedMessage("head_up", body: data)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
static func sendPairFailureEvent(_ error: String) {
|
|
71
|
+
let data = ["error": error]
|
|
72
|
+
Bridge.sendTypedMessage("pair_failure", body: data)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
static func sendMicPcm(_ data: Data) {
|
|
76
|
+
// let base64String = data.base64EncodedString()
|
|
77
|
+
// let body = ["base64": base64String]
|
|
78
|
+
let body = ["pcm": data]
|
|
79
|
+
Bridge.sendTypedMessage("mic_pcm", body: body)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
static func sendMicLc3(_ data: Data) {
|
|
83
|
+
// let base64String = data.base64EncodedString()
|
|
84
|
+
// let body = ["base64": base64String]
|
|
85
|
+
let body = ["lc3": data]
|
|
86
|
+
Bridge.sendTypedMessage("mic_lc3", body: body)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
static func saveSetting(_ key: String, _ value: Any) {
|
|
90
|
+
let body = ["key": key, "value": value]
|
|
91
|
+
Bridge.sendTypedMessage("save_setting", body: body)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
static func sendVadEvent(_ isSpeaking: Bool) {
|
|
95
|
+
let body: [String: Any] = ["status": isSpeaking]
|
|
96
|
+
Bridge.sendTypedMessage("vad_status", body: body)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
static func sendBatteryStatus(level: Int, charging: Bool) {
|
|
100
|
+
let body: [String: Any] = [
|
|
101
|
+
"level": level,
|
|
102
|
+
"charging": charging,
|
|
103
|
+
"timestamp": Date().timeIntervalSince1970 * 1000,
|
|
104
|
+
]
|
|
105
|
+
Bridge.sendTypedMessage("battery_status", body: body)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
static func sendDiscoveredDevice(
|
|
109
|
+
_ deviceModel: String,
|
|
110
|
+
_ deviceName: String,
|
|
111
|
+
deviceAddress: String = "",
|
|
112
|
+
rssi: Int? = nil
|
|
113
|
+
) {
|
|
114
|
+
Task {
|
|
115
|
+
await MainActor.run {
|
|
116
|
+
let searchResults = DeviceStore.shared.get("bluetooth", "searchResults") as? [[String: Any]] ?? []
|
|
117
|
+
let id = "\(deviceModel):\(deviceName)"
|
|
118
|
+
var newResult: [String: Any] = [
|
|
119
|
+
"id": id,
|
|
120
|
+
"model": deviceModel,
|
|
121
|
+
"name": deviceName,
|
|
122
|
+
]
|
|
123
|
+
if !deviceAddress.isEmpty {
|
|
124
|
+
newResult["address"] = deviceAddress
|
|
125
|
+
}
|
|
126
|
+
if let rssi {
|
|
127
|
+
newResult["rssi"] = rssi
|
|
128
|
+
}
|
|
129
|
+
let allResults = searchResults + [newResult]
|
|
130
|
+
var seen = Set<String>()
|
|
131
|
+
let uniqueResults = allResults.reversed().filter {
|
|
132
|
+
let model = $0["model"] as? String ?? $0["deviceModel"] as? String ?? deviceModel
|
|
133
|
+
guard let name = $0["name"] as? String ?? $0["deviceName"] as? String else { return false }
|
|
134
|
+
return seen.insert("\(model):\(name)").inserted
|
|
135
|
+
}.reversed()
|
|
136
|
+
DeviceStore.shared.set("bluetooth", "searchResults", Array(uniqueResults))
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// MARK: - Hardware Events
|
|
142
|
+
|
|
143
|
+
static func sendButtonPress(buttonId: String, pressType: String) {
|
|
144
|
+
// Send as typed message so it gets handled locally by MantleBridge.tsx
|
|
145
|
+
// This allows the React Native layer to process it before forwarding to server
|
|
146
|
+
let body: [String: Any] = [
|
|
147
|
+
"buttonId": buttonId,
|
|
148
|
+
"pressType": pressType,
|
|
149
|
+
"timestamp": Int(Date().timeIntervalSince1970 * 1000),
|
|
150
|
+
]
|
|
151
|
+
Bridge.sendTypedMessage("button_press", body: body)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
static func sendTouchEvent(deviceModel: String, gestureName: String, timestamp: Int64, source: Int32? = nil) {
|
|
155
|
+
var body: [String: Any] = [
|
|
156
|
+
"device_model": deviceModel,
|
|
157
|
+
"gesture_name": gestureName,
|
|
158
|
+
"timestamp": timestamp,
|
|
159
|
+
]
|
|
160
|
+
if let source {
|
|
161
|
+
body["source"] = source
|
|
162
|
+
}
|
|
163
|
+
Bridge.sendTypedMessage("touch_event", body: body)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
static func sendSwipeVolumeStatus(enabled: Bool, timestamp: Int64) {
|
|
167
|
+
let body: [String: Any] = [
|
|
168
|
+
"enabled": enabled,
|
|
169
|
+
"timestamp": timestamp,
|
|
170
|
+
]
|
|
171
|
+
Bridge.sendTypedMessage("swipe_volume_status", body: body)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
static func sendSwitchStatus(switchType: Int, value: Int, timestamp: Int64) {
|
|
175
|
+
let body: [String: Any] = [
|
|
176
|
+
"switch_type": switchType,
|
|
177
|
+
"switch_value": value,
|
|
178
|
+
"timestamp": timestamp,
|
|
179
|
+
]
|
|
180
|
+
Bridge.sendTypedMessage("switch_status", body: body)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
static func sendRgbLedControlResponse(requestId: String, success: Bool, error: String?) {
|
|
184
|
+
guard !requestId.isEmpty else { return }
|
|
185
|
+
var body: [String: Any] = [
|
|
186
|
+
"requestId": requestId,
|
|
187
|
+
"state": success ? "success" : "error",
|
|
188
|
+
]
|
|
189
|
+
if !success {
|
|
190
|
+
body["errorCode"] = error ?? "unknown_error"
|
|
191
|
+
}
|
|
192
|
+
Bridge.sendTypedMessage("rgb_led_control_response", body: body)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
static func sendPhotoError(requestId: String, errorCode: String, errorMessage: String) {
|
|
196
|
+
var event: [String: Any] = [
|
|
197
|
+
"type": "photo_response",
|
|
198
|
+
"state": "error",
|
|
199
|
+
"requestId": requestId,
|
|
200
|
+
"timestamp": Int(Date().timeIntervalSince1970 * 1000),
|
|
201
|
+
]
|
|
202
|
+
if !errorCode.isEmpty {
|
|
203
|
+
event["errorCode"] = errorCode
|
|
204
|
+
}
|
|
205
|
+
if !errorMessage.isEmpty {
|
|
206
|
+
event["errorMessage"] = errorMessage
|
|
207
|
+
}
|
|
208
|
+
Bridge.sendTypedMessage("photo_response", body: event)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
static func sendMiniappSelected(packageName: String) {
|
|
212
|
+
let event: [String: Any] = [
|
|
213
|
+
"packageName": packageName,
|
|
214
|
+
]
|
|
215
|
+
Bridge.sendTypedMessage("miniapp_selected", body: event)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Send transcription result to server
|
|
220
|
+
* Used by AOSManager to send pre-formatted transcription results
|
|
221
|
+
* Matches the Java ServerComms structure exactly
|
|
222
|
+
*/
|
|
223
|
+
static func sendLocalTranscription(transcription: [String: Any]) {
|
|
224
|
+
guard let text = transcription["text"] as? String, !text.isEmpty else {
|
|
225
|
+
Bridge.log("Skipping empty transcription result")
|
|
226
|
+
return
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
Bridge.sendTypedMessage("local_transcription", body: transcription)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Bluetooth SDK bridge funcs:
|
|
233
|
+
|
|
234
|
+
static func sendserialNumber(_ serialNumber: String, style: String, color: String) {
|
|
235
|
+
let body = [
|
|
236
|
+
"glasses_serial_number": [
|
|
237
|
+
"serial_number": serialNumber,
|
|
238
|
+
"style": style,
|
|
239
|
+
"color": color,
|
|
240
|
+
],
|
|
241
|
+
]
|
|
242
|
+
Bridge.sendTypedMessage("glasses_serial_number", body: body)
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
static func sendWifiStatusChange(connected: Bool, ssid: String?, localIp: String?) {
|
|
246
|
+
guard let status = WifiStatus.fromStoreFields(
|
|
247
|
+
connected: connected,
|
|
248
|
+
ssid: ssid,
|
|
249
|
+
localIp: localIp
|
|
250
|
+
) else {
|
|
251
|
+
return
|
|
252
|
+
}
|
|
253
|
+
Bridge.sendTypedMessage("wifi_status_change", body: status.values)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
static func updateWifiScanResults(_ networks: [[String: Any]]) {
|
|
257
|
+
Task {
|
|
258
|
+
await MainActor.run {
|
|
259
|
+
var storedNetworks: [[String: Any]] =
|
|
260
|
+
DeviceStore.shared.get("bluetooth", "wifiScanResults") as? [[String: Any]] ?? []
|
|
261
|
+
// add the networks to the storedNetworks array, removing duplicates by ssid
|
|
262
|
+
for network in networks {
|
|
263
|
+
if !storedNetworks.contains(where: {
|
|
264
|
+
$0["ssid"] as? String == network["ssid"] as? String
|
|
265
|
+
}) {
|
|
266
|
+
storedNetworks.append(network)
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
DeviceStore.shared.apply("bluetooth", "wifiScanResults", storedNetworks)
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
static func sendMtkUpdateComplete(message: String, timestamp: Int64) {
|
|
275
|
+
let eventBody: [String: Any] = [
|
|
276
|
+
"message": message,
|
|
277
|
+
"timestamp": timestamp,
|
|
278
|
+
]
|
|
279
|
+
Bridge.sendTypedMessage("mtk_update_complete", body: eventBody)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/// Send ota_start_ack — glasses confirmed receipt of ota_start command
|
|
283
|
+
static func sendOtaStartAck() {
|
|
284
|
+
let eventBody: [String: Any] = [
|
|
285
|
+
"timestamp": Int64(Date().timeIntervalSince1970 * 1000),
|
|
286
|
+
]
|
|
287
|
+
Bridge.sendTypedMessage("ota_start_ack", body: eventBody)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/// Send OTA update available notification - glasses have detected an available update (background mode)
|
|
291
|
+
static func sendOtaUpdateAvailable(
|
|
292
|
+
versionCode: Int64,
|
|
293
|
+
versionName: String,
|
|
294
|
+
updates: [String],
|
|
295
|
+
totalSize: Int64
|
|
296
|
+
) {
|
|
297
|
+
let eventBody: [String: Any] = [
|
|
298
|
+
"version_code": versionCode,
|
|
299
|
+
"version_name": versionName,
|
|
300
|
+
"updates": updates,
|
|
301
|
+
"total_size": totalSize,
|
|
302
|
+
]
|
|
303
|
+
Bridge.sendTypedMessage("ota_update_available", body: eventBody)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
static func sendOtaStatus(
|
|
307
|
+
sessionId: String,
|
|
308
|
+
totalSteps: Int,
|
|
309
|
+
currentStep: Int,
|
|
310
|
+
stepType: String,
|
|
311
|
+
phase: String,
|
|
312
|
+
stepPercent: Int,
|
|
313
|
+
overallPercent: Int,
|
|
314
|
+
status: String,
|
|
315
|
+
errorMessage: String?
|
|
316
|
+
) {
|
|
317
|
+
var eventBody: [String: Any] = [
|
|
318
|
+
"session_id": sessionId,
|
|
319
|
+
"total_steps": totalSteps,
|
|
320
|
+
"current_step": currentStep,
|
|
321
|
+
"step_type": stepType,
|
|
322
|
+
"phase": phase,
|
|
323
|
+
"step_percent": stepPercent,
|
|
324
|
+
"overall_percent": overallPercent,
|
|
325
|
+
"status": status,
|
|
326
|
+
]
|
|
327
|
+
if let error = errorMessage {
|
|
328
|
+
eventBody["error_message"] = error
|
|
329
|
+
}
|
|
330
|
+
Bridge.sendTypedMessage("ota_status", body: eventBody)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/// Arbitrary WS Comms (dont use these, make a dedicated function for your use case):
|
|
334
|
+
static func sendWSText(_ msg: String) {
|
|
335
|
+
let data = ["text": msg]
|
|
336
|
+
Bridge.sendTypedMessage("ws_text", body: data)
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
static func sendWSBinary(_ data: Data) {
|
|
340
|
+
let base64String = data.base64EncodedString()
|
|
341
|
+
let body = ["base64": base64String]
|
|
342
|
+
Bridge.sendTypedMessage("ws_bin", body: body)
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/// don't call this function directly, instead
|
|
346
|
+
/// make a function above that calls this function:
|
|
347
|
+
static func sendTypedMessage(_ type: String, body: [String: Any]) {
|
|
348
|
+
var body = body
|
|
349
|
+
body["type"] = type
|
|
350
|
+
// Send directly using type as event name - no JSON serialization
|
|
351
|
+
dispatchEvent(type, body)
|
|
352
|
+
}
|
|
353
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Use this file to import your target's public headers that you would like to expose to Swift.
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
#import "../Packages/CoreObjC/PcmConverter.h"
|
|
6
|
+
|
|
7
|
+
// environment variables:
|
|
8
|
+
#import "RNCConfig.h"
|
|
9
|
+
|
|
10
|
+
// onnx runtime:
|
|
11
|
+
#import <onnxruntime.h>
|
|
12
|
+
|
|
13
|
+
// sherpa-onnx C API - direct file path
|
|
14
|
+
#import "sherpa-onnx/c-api/c-api.h"
|
|
15
|
+
|
|
16
|
+
#import <bzlib.h>
|