@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.
- package/README.md +563 -0
- package/android/build.gradle +450 -0
- package/android/gradle.properties.example +9 -0
- package/android/lc3Lib/CMakeLists.txt +6 -0
- package/android/lc3Lib/build.gradle +212 -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/glassly/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 +4 -0
- package/android/silero/LICENSE.md +17 -0
- package/android/silero/build.gradle +50 -0
- package/android/silero/proguard-rules.pro +24 -0
- package/android/silero/src/androidTest/assets/hello.wav +0 -0
- package/android/silero/src/androidTest/java/com/konovalov/vad/silero/VadSileroTest.kt +79 -0
- package/android/silero/src/main/assets/LICENSE +21 -0
- package/android/silero/src/main/assets/silero_vad.onnx +0 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/Vad.kt +160 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/VadSilero.kt +449 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/config/FrameSize.kt +15 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/config/Mode.kt +14 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/config/SampleRate.kt +12 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/utils/AudioUtils.kt +47 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/utils/TensorMap.kt +41 -0
- package/android/silero/src/test/java/com/konovalov/vad/silero/utils/AudioUtilsTest.kt +44 -0
- package/android/src/main/AndroidManifest.xml +42 -0
- package/android/src/main/assets/G2Firmware/README.md +11 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdk.kt +2325 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkAnalytics.kt +216 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDebug.kt +14 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDefaults.kt +7 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkModule.kt +1088 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/Bridge.kt +953 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/DeviceManager.kt +2528 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/DeviceStore.kt +360 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedChangelogCatalog.kt +8 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedReleaseMetadata.kt +11 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/LocalNetworkModule.kt +414 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/ObservableStore.kt +88 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/OtaManifest.kt +191 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/ReleaseChangelog.kt +61 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/ScopedNetworkReadiness.kt +17 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/audio/AudioModels.kt +144 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/camera/CameraModels.kt +486 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/connection/ConnectionModels.kt +78 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/controllers/ControllerManager.kt +158 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/controllers/R1.kt +937 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/debug/BleTraceLogger.kt +165 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/events/BluetoothEvents.kt +178 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/internal/MapParsing.kt +140 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/net/LocalIpv4.kt +57 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServer.kt +304 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/OtaServerModule.kt +120 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistry.java +108 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoUploadServer.kt +622 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/PhotoReceiverModule.kt +156 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/requests/DisplayRequests.kt +56 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/services/Foreground.kt +272 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/services/PhoneMic.kt +1195 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Ar99.java +2653 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuard.kt +49 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapper.kt +27 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1.kt +3878 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizer.kt +38 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2.kt +6428 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassification.kt +49 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwRenderer.kt +1241 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCache.kt +270 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocol.kt +291 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2Flasher.kt +411 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/GlasslyBle.java +43189 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Mach1.kt +1280 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLive.kt +10817 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLiveL2capChannel.kt +274 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisement.kt +54 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraNex.kt +2011 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Nimo.kt +2532 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/SGCManager.kt +470 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Simulated.kt +228 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/Ar99OtaManager.java +566 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaByteUtils.java +18 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCommandConstants.java +35 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCrc32Util.java +13 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaGattTransport.java +11 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaProtocol.java +92 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/speakerid/SpeakerIdEngine.kt +525 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/status/DeviceStatus.kt +669 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/status/RuntimeState.kt +201 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/status/WifiHotspotStatus.kt +189 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/streaming/StreamModels.kt +518 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/stt/STTTools.kt +391 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +518 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/stt/VadGateSpeechPolicy.kt +229 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/tts/TTSTools.kt +248 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/types/DeviceModels.kt +96 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/AES.java +106 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/AvifExifStripper.java +573 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleJsonCompact.java +496 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadService.java +677 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleWireProtocol.java +108 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/Constants.kt +46 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/G1Text.kt +436 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/HeifExifTagReader.java +199 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleUploadService.java +77 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900LengthCodec.java +115 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtils.java +827 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunkReassembler.java +228 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunker.java +325 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/NexSGCUtils.kt +698 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitor.kt +348 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Ar99OpusPcmDecoder.java +398 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PcmStreamPlayer.kt +328 -0
- package/android/src/main/res/values/strings.xml +4 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/BluetoothSdkExceptionTest.kt +18 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/OtaManifestDowngradeTest.kt +86 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/OtaStartResponsePolicyTest.kt +30 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/ReleaseChangelogTest.kt +13 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/ScopedNetworkReadinessTest.kt +39 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/StreamStatusEventTest.kt +29 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/camera/PhotoRequestTest.kt +141 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServerTest.kt +82 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistryTest.java +75 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/services/ForegroundServiceTypeTest.kt +69 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/Ar99AdvertisementMatcherTest.java +22 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuardTest.kt +73 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapperTest.kt +67 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/EvenRleTest.kt +63 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizerTest.kt +31 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassificationTest.kt +89 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwRendererTest.kt +344 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCacheTest.kt +200 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocolTest.kt +131 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLiveGattCharacteristicsTest.kt +39 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisementParserTest.kt +133 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/NimoProtocolTest.kt +333 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/AvifExifStripperTest.java +46 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/BinaryMessageChunkerTest.java +84 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/BleJsonCompactTest.java +319 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadServiceTest.java +107 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsEndiannessTest.java +172 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsTest.java +24 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitorTest.kt +45 -0
- package/android/src/test/resources/avif_with_exif.avif +0 -0
- package/app.plugin.js +3 -0
- package/build/BluetoothSdk.types.d.ts +1354 -0
- package/build/BluetoothSdk.types.d.ts.map +1 -0
- package/build/BluetoothSdk.types.js +41 -0
- package/build/BluetoothSdk.types.js.map +1 -0
- package/build/_internal.d.ts +17 -0
- package/build/_internal.d.ts.map +1 -0
- package/build/_internal.js +16 -0
- package/build/_internal.js.map +1 -0
- package/build/_private/BluetoothSdkModule.d.ts +172 -0
- package/build/_private/BluetoothSdkModule.d.ts.map +1 -0
- package/build/_private/BluetoothSdkModule.js +300 -0
- package/build/_private/BluetoothSdkModule.js.map +1 -0
- package/build/_private/LocalNetworkModule.d.ts +38 -0
- package/build/_private/LocalNetworkModule.d.ts.map +1 -0
- package/build/_private/LocalNetworkModule.js +3 -0
- package/build/_private/LocalNetworkModule.js.map +1 -0
- package/build/_private/cameraRequestPayload.d.ts +4 -0
- package/build/_private/cameraRequestPayload.d.ts.map +1 -0
- package/build/_private/cameraRequestPayload.js +32 -0
- package/build/_private/cameraRequestPayload.js.map +1 -0
- package/build/_private/photoRequestPayload.d.ts +6 -0
- package/build/_private/photoRequestPayload.d.ts.map +1 -0
- package/build/_private/photoRequestPayload.js +86 -0
- package/build/_private/photoRequestPayload.js.map +1 -0
- package/build/_private/sdkOtaManifest.d.ts +11 -0
- package/build/_private/sdkOtaManifest.d.ts.map +1 -0
- package/build/_private/sdkOtaManifest.js +15 -0
- package/build/_private/sdkOtaManifest.js.map +1 -0
- package/build/changelogs.d.ts +7 -0
- package/build/changelogs.d.ts.map +1 -0
- package/build/changelogs.js +46 -0
- package/build/changelogs.js.map +1 -0
- package/build/debug.d.ts +3 -0
- package/build/debug.d.ts.map +1 -0
- package/build/debug.js +8 -0
- package/build/debug.js.map +1 -0
- package/build/generated/changelogCatalog.d.ts +9 -0
- package/build/generated/changelogCatalog.d.ts.map +1 -0
- package/build/generated/changelogCatalog.js +12 -0
- package/build/generated/changelogCatalog.js.map +1 -0
- package/build/generated/releaseMetadata.d.ts +12 -0
- package/build/generated/releaseMetadata.d.ts.map +1 -0
- package/build/generated/releaseMetadata.js +10 -0
- package/build/generated/releaseMetadata.js.map +1 -0
- package/build/index.d.ts +6 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +171 -0
- package/build/index.js.map +1 -0
- package/build/ota-server/OtaServer.types.d.ts +14 -0
- package/build/ota-server/OtaServer.types.d.ts.map +1 -0
- package/build/ota-server/OtaServer.types.js +2 -0
- package/build/ota-server/OtaServer.types.js.map +1 -0
- package/build/ota-server/OtaServerModule.d.ts +21 -0
- package/build/ota-server/OtaServerModule.d.ts.map +1 -0
- package/build/ota-server/OtaServerModule.js +3 -0
- package/build/ota-server/OtaServerModule.js.map +1 -0
- package/build/ota-server/OtaServerModule.web.d.ts +10 -0
- package/build/ota-server/OtaServerModule.web.d.ts.map +1 -0
- package/build/ota-server/OtaServerModule.web.js +12 -0
- package/build/ota-server/OtaServerModule.web.js.map +1 -0
- package/build/ota-server/index.d.ts +3 -0
- package/build/ota-server/index.d.ts.map +1 -0
- package/build/ota-server/index.js +3 -0
- package/build/ota-server/index.js.map +1 -0
- package/build/ota-transport/index.d.ts +67 -0
- package/build/ota-transport/index.d.ts.map +1 -0
- package/build/ota-transport/index.js +58 -0
- package/build/ota-transport/index.js.map +1 -0
- package/build/photo-receiver/PhotoReceiver.types.d.ts +18 -0
- package/build/photo-receiver/PhotoReceiver.types.d.ts.map +1 -0
- package/build/photo-receiver/PhotoReceiver.types.js +2 -0
- package/build/photo-receiver/PhotoReceiver.types.js.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.d.ts +10 -0
- package/build/photo-receiver/PhotoReceiverModule.d.ts.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.js +3 -0
- package/build/photo-receiver/PhotoReceiverModule.js.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.web.d.ts +10 -0
- package/build/photo-receiver/PhotoReceiverModule.web.d.ts.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.web.js +12 -0
- package/build/photo-receiver/PhotoReceiverModule.web.js.map +1 -0
- package/build/photo-receiver/index.d.ts +3 -0
- package/build/photo-receiver/index.d.ts.map +1 -0
- package/build/photo-receiver/index.js +3 -0
- package/build/photo-receiver/index.js.map +1 -0
- package/build/react/index.d.ts +5 -0
- package/build/react/index.d.ts.map +1 -0
- package/build/react/index.js +4 -0
- package/build/react/index.js.map +1 -0
- package/build/react/useBluetooth.d.ts +100 -0
- package/build/react/useBluetooth.d.ts.map +1 -0
- package/build/react/useBluetooth.js +167 -0
- package/build/react/useBluetooth.js.map +1 -0
- package/build/react/useBluetoothEvent.d.ts +6 -0
- package/build/react/useBluetoothEvent.d.ts.map +1 -0
- package/build/react/useBluetoothEvent.js +21 -0
- package/build/react/useBluetoothEvent.js.map +1 -0
- package/build/react/useBluetoothScan.d.ts +22 -0
- package/build/react/useBluetoothScan.d.ts.map +1 -0
- package/build/react/useBluetoothScan.js +135 -0
- package/build/react/useBluetoothScan.js.map +1 -0
- package/build/react/useBluetoothStatus.d.ts +16 -0
- package/build/react/useBluetoothStatus.d.ts.map +1 -0
- package/build/react/useBluetoothStatus.js +137 -0
- package/build/react/useBluetoothStatus.js.map +1 -0
- package/build/react/useGlassesConnection.d.ts +29 -0
- package/build/react/useGlassesConnection.d.ts.map +1 -0
- package/build/react/useGlassesConnection.js +153 -0
- package/build/react/useGlassesConnection.js.map +1 -0
- package/build/types/index.d.ts +3 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +2 -0
- package/build/types/index.js.map +1 -0
- package/expo-module.config.json +14 -0
- package/ios/BackgroundOtaArtifactDownloader.swift +125 -0
- package/ios/BluetoothSdkModule.swift +1034 -0
- package/ios/GlasslyBluetoothSDK.podspec +106 -0
- package/ios/LocalIPv4.swift +150 -0
- package/ios/LocalOtaServer.swift +309 -0
- package/ios/LocalPhotoUploadServer.swift +754 -0
- package/ios/OtaServerModule.swift +147 -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/include/PcmConverter.h +22 -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 +2383 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +48 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
- package/ios/Packages/libbz2/module.modulemap +5 -0
- package/ios/Packages/libbz2/shim.h +1 -0
- package/ios/PhotoReceiverModule.swift +129 -0
- package/ios/Source/BluetoothSDK.swift +2303 -0
- package/ios/Source/BluetoothSDKDebug.swift +12 -0
- package/ios/Source/BluetoothSdkDefaults.swift +29 -0
- package/ios/Source/Bridge.swift +708 -0
- package/ios/Source/Bridging-Header.h +16 -0
- package/ios/Source/DeviceManager.swift +2109 -0
- package/ios/Source/DeviceStore.swift +336 -0
- package/ios/Source/GeneratedChangelogCatalog.swift +7 -0
- package/ios/Source/GeneratedReleaseMetadata.swift +11 -0
- package/ios/Source/ObservableStore.swift +118 -0
- package/ios/Source/OtaManifest.swift +211 -0
- package/ios/Source/PrivacyInfo.xcprivacy +23 -0
- package/ios/Source/ReleaseChangelog.swift +65 -0
- package/ios/Source/Resources/G2Firmware/README.md +10 -0
- package/ios/Source/audio/AudioModels.swift +178 -0
- package/ios/Source/audio/PcmStreamPlayer.swift +410 -0
- package/ios/Source/camera/CameraModels.swift +866 -0
- package/ios/Source/connection/ScanSession.swift +27 -0
- package/ios/Source/controllers/ControllerManager.swift +184 -0
- package/ios/Source/controllers/R1.swift +829 -0
- package/ios/Source/errors/BluetoothSdkError.swift +19 -0
- package/ios/Source/events/BluetoothEvents.swift +342 -0
- package/ios/Source/internal/BleTraceLogger.swift +192 -0
- package/ios/Source/internal/BluetoothAvailability.swift +78 -0
- package/ios/Source/internal/BluetoothSdkAnalytics.swift +199 -0
- package/ios/Source/internal/ValueParsing.swift +99 -0
- package/ios/Source/requests/DisplayRequests.swift +82 -0
- package/ios/Source/services/PhoneMic.swift +662 -0
- package/ios/Source/sgcs/Ar99.swift +2451 -0
- package/ios/Source/sgcs/Frame.swift +649 -0
- package/ios/Source/sgcs/G1.swift +2554 -0
- package/ios/Source/sgcs/G2.swift +6887 -0
- package/ios/Source/sgcs/G2CfwClassification.swift +43 -0
- package/ios/Source/sgcs/G2CfwRenderer.swift +1279 -0
- package/ios/Source/sgcs/G2CfwTextureCache.swift +233 -0
- package/ios/Source/sgcs/G2FlashProtocol.swift +312 -0
- package/ios/Source/sgcs/G2Flasher.swift +773 -0
- package/ios/Source/sgcs/Mach1.swift +541 -0
- package/ios/Source/sgcs/MentraLive.swift +7011 -0
- package/ios/Source/sgcs/MentraLiveL2capChannel.swift +183 -0
- package/ios/Source/sgcs/MentraLivePairingAdvertisement.swift +64 -0
- package/ios/Source/sgcs/MentraNex.swift +3221 -0
- package/ios/Source/sgcs/Nimo.swift +1886 -0
- package/ios/Source/sgcs/SGCManager.swift +608 -0
- package/ios/Source/sgcs/Simulated.swift +274 -0
- package/ios/Source/sgcs/ar99/ota/Ar99OtaManager.swift +637 -0
- package/ios/Source/sgcs/glassly_ble.pb.swift +4354 -0
- package/ios/Source/speakerid/SpeakerIdEngine.swift +573 -0
- package/ios/Source/status/DeviceStatus.swift +981 -0
- package/ios/Source/status/RuntimeState.swift +359 -0
- package/ios/Source/status/WifiHotspotStatus.swift +345 -0
- package/ios/Source/streaming/StreamModels.swift +693 -0
- package/ios/Source/stt/STTTools.swift +191 -0
- package/ios/Source/stt/SherpaOnnxTranscriber.swift +466 -0
- package/ios/Source/tts/TTSTools.swift +171 -0
- package/ios/Source/types/DeviceModels.swift +177 -0
- package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
- package/ios/Source/utils/BinaryCodec.swift +61 -0
- package/ios/Source/utils/BleJsonCompact.swift +405 -0
- package/ios/Source/utils/BleWireProtocol.swift +92 -0
- package/ios/Source/utils/Constants.swift +78 -0
- package/ios/Source/utils/Enums.swift +95 -0
- package/ios/Source/utils/G1Text.swift +2096 -0
- package/ios/Source/utils/JSCExperiment.swift +241 -0
- package/ios/Source/utils/MemoryMonitor.swift +44 -0
- package/ios/Source/utils/MessageChunkReassembler.swift +190 -0
- package/ios/Source/utils/MessageChunker.swift +294 -0
- package/ios/Source/utils/Models.swift +135 -0
- package/ios/Source/utils/PhoneAudioMonitor.swift +230 -0
- package/ios/Source/utils/TarBz2Extractor.swift +257 -0
- package/ios/Tests/BluetoothSDKTests/G2CfwClassificationTests.swift +78 -0
- package/ios/Tests/BluetoothSDKTests/G2CfwRendererTests.swift +372 -0
- package/ios/Tests/BluetoothSDKTests/G2CfwTextureCacheTests.swift +162 -0
- package/ios/Tests/BluetoothSDKTests/G2FlashProtocolTests.swift +182 -0
- package/ios/Tests/MentraLivePairingAdvertisementTests.swift +160 -0
- package/ios/Tests/ReleaseChangelogTests.swift +13 -0
- package/package.json +129 -0
- package/plugin/build/index.d.ts +10 -0
- package/plugin/build/index.js +12 -0
- package/plugin/build/withAndroid.d.ts +3 -0
- package/plugin/build/withAndroid.js +190 -0
- package/plugin/build/withIos.d.ts +5 -0
- package/plugin/build/withIos.js +108 -0
- package/scripts/inject-ios-sdk-version.mjs +65 -0
- package/scripts/public-ota-api.test.mjs +37 -0
- package/scripts/verify-release-package.mjs +45 -0
- package/scripts/write-release-metadata.mjs +152 -0
- package/scripts/write-release-metadata.test.mjs +37 -0
- package/src/BluetoothSdk.types.ts +1623 -0
- package/src/_internal.ts +16 -0
- package/src/_private/BluetoothSdkModule.ts +684 -0
- package/src/_private/LocalNetworkModule.ts +50 -0
- package/src/_private/cameraRequestPayload.ts +34 -0
- package/src/_private/photoRequestPayload.ts +90 -0
- package/src/_private/sdkOtaManifest.ts +18 -0
- package/src/changelogs.ts +46 -0
- package/src/debug.ts +9 -0
- package/src/generated/changelogCatalog.ts +13 -0
- package/src/generated/releaseMetadata.ts +20 -0
- package/src/index.ts +321 -0
- package/src/ota-server/OtaServer.types.ts +10 -0
- package/src/ota-server/OtaServerModule.ts +23 -0
- package/src/ota-server/OtaServerModule.web.ts +17 -0
- package/src/ota-server/index.ts +2 -0
- package/src/ota-transport/index.ts +116 -0
- package/src/photo-receiver/PhotoReceiver.types.ts +20 -0
- package/src/photo-receiver/PhotoReceiverModule.ts +11 -0
- package/src/photo-receiver/PhotoReceiverModule.web.ts +17 -0
- package/src/photo-receiver/index.ts +2 -0
- package/src/react/index.ts +21 -0
- package/src/react/useBluetooth.ts +309 -0
- package/src/react/useBluetoothEvent.ts +35 -0
- package/src/react/useBluetoothScan.ts +173 -0
- package/src/react/useBluetoothStatus.ts +180 -0
- package/src/react/useGlassesConnection.ts +202 -0
- package/src/types/index.ts +12 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
package com.glassly.bluetoothsdk.utils;
|
|
2
|
+
|
|
3
|
+
import java.nio.charset.StandardCharsets;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* BLE Wire Protocol v2 shared constants and binary frame helpers.
|
|
7
|
+
* All multi-byte fields use little-endian byte order.
|
|
8
|
+
*/
|
|
9
|
+
public final class BleWireProtocol {
|
|
10
|
+
|
|
11
|
+
private BleWireProtocol() {}
|
|
12
|
+
|
|
13
|
+
public static final byte CMD_TYPE_BINARY_MSG = 0x40;
|
|
14
|
+
|
|
15
|
+
public static final byte BLE_WIRE_FLAG_FIRST_FRAG = 0x01;
|
|
16
|
+
public static final byte BLE_WIRE_FLAG_LAST_FRAG = 0x02;
|
|
17
|
+
public static final byte BLE_WIRE_FLAG_WAKE = 0x04;
|
|
18
|
+
public static final byte BLE_WIRE_FLAG_HANDSHAKE = 0x08;
|
|
19
|
+
public static final byte BLE_WIRE_FLAG_ACK_REQUESTED = 0x10;
|
|
20
|
+
|
|
21
|
+
public static final int BINARY_HEADER_SIZE = 7;
|
|
22
|
+
public static final int MAX_FRAGMENT_PAYLOAD = 480;
|
|
23
|
+
public static final int MTU_TARGET = 509;
|
|
24
|
+
|
|
25
|
+
public static final String HANDSHAKE_PAYLOAD_V2 = "v2";
|
|
26
|
+
public static final int PROTOCOL_V1 = 1;
|
|
27
|
+
public static final int PROTOCOL_V2 = 2;
|
|
28
|
+
|
|
29
|
+
public static class BinaryFragmentInfo {
|
|
30
|
+
public byte flags;
|
|
31
|
+
public int msgId;
|
|
32
|
+
public int fragIdx;
|
|
33
|
+
public int fragCount;
|
|
34
|
+
public byte[] payload;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public static boolean isBinaryFrame(byte[] data) {
|
|
38
|
+
return K900ProtocolUtils.isK900ProtocolFormat(data)
|
|
39
|
+
&& data.length >= 7
|
|
40
|
+
&& data[2] == CMD_TYPE_BINARY_MSG;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public static byte[] packBinaryFragment(
|
|
44
|
+
byte flags, int msgId, int fragIdx, int fragCount, byte[] payload) {
|
|
45
|
+
int payloadLen = payload != null ? payload.length : 0;
|
|
46
|
+
byte[] inner = new byte[BINARY_HEADER_SIZE + payloadLen];
|
|
47
|
+
inner[0] = flags;
|
|
48
|
+
writeLe16(inner, 1, msgId);
|
|
49
|
+
inner[3] = (byte) fragIdx;
|
|
50
|
+
inner[4] = (byte) fragCount;
|
|
51
|
+
writeLe16(inner, 5, payloadLen);
|
|
52
|
+
if (payloadLen > 0) {
|
|
53
|
+
System.arraycopy(payload, 0, inner, BINARY_HEADER_SIZE, payloadLen);
|
|
54
|
+
}
|
|
55
|
+
return K900ProtocolUtils.packDataToK900(
|
|
56
|
+
inner, CMD_TYPE_BINARY_MSG, K900LengthCodec.Endian.LE);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public static BinaryFragmentInfo extractBinaryFragmentInfo(byte[] frame) {
|
|
60
|
+
if (!isBinaryFrame(frame)) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
int innerLen = readLe16(frame, 3);
|
|
65
|
+
if (innerLen < BINARY_HEADER_SIZE || frame.length < 7 + innerLen) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
int offset = 5;
|
|
70
|
+
int payloadLen = readLe16(frame, offset + 5);
|
|
71
|
+
if (BINARY_HEADER_SIZE + payloadLen > innerLen) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
BinaryFragmentInfo info = new BinaryFragmentInfo();
|
|
76
|
+
info.flags = frame[offset];
|
|
77
|
+
info.msgId = readLe16(frame, offset + 1);
|
|
78
|
+
info.fragIdx = frame[offset + 3] & 0xFF;
|
|
79
|
+
info.fragCount = frame[offset + 4] & 0xFF;
|
|
80
|
+
info.payload = new byte[payloadLen];
|
|
81
|
+
if (payloadLen > 0) {
|
|
82
|
+
System.arraycopy(frame, offset + BINARY_HEADER_SIZE, info.payload, 0, payloadLen);
|
|
83
|
+
}
|
|
84
|
+
return info;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public static byte[] extractBinaryPayload(byte[] frame) {
|
|
88
|
+
BinaryFragmentInfo info = extractBinaryFragmentInfo(frame);
|
|
89
|
+
return info != null ? info.payload : null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public static boolean isHandshakeV2(BinaryFragmentInfo info) {
|
|
93
|
+
if (info == null || (info.flags & BLE_WIRE_FLAG_HANDSHAKE) == 0) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
String payload = new String(info.payload, StandardCharsets.UTF_8);
|
|
97
|
+
return HANDSHAKE_PAYLOAD_V2.equals(payload);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
static int readLe16(byte[] data, int offset) {
|
|
101
|
+
return (data[offset] & 0xFF) | ((data[offset + 1] & 0xFF) << 8);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static void writeLe16(byte[] data, int offset, int value) {
|
|
105
|
+
data[offset] = (byte) (value & 0xFF);
|
|
106
|
+
data[offset + 1] = (byte) ((value >> 8) & 0xFF);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
package com.glassly.bluetoothsdk.utils
|
|
2
|
+
|
|
3
|
+
object DeviceTypes {
|
|
4
|
+
const val SIMULATED = "Simulated Glasses"
|
|
5
|
+
const val G1 = "Even Realities G1"
|
|
6
|
+
const val NEX = "Mentra Display"
|
|
7
|
+
const val MACH1 = "Mentra Mach1"
|
|
8
|
+
const val LIVE = "Mentra Live"
|
|
9
|
+
const val Z100 = "Vuzix Z100"
|
|
10
|
+
const val FRAME = "Brilliant Frame"
|
|
11
|
+
const val G2 = "Even Realities G2"
|
|
12
|
+
const val NIMO = "NIMO"
|
|
13
|
+
const val AR99 = "AR99"
|
|
14
|
+
val ALL = arrayOf(SIMULATED, G1, G2, MACH1, LIVE, Z100, FRAME, NEX, NIMO, AR99)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
object ControllerTypes {
|
|
18
|
+
const val R1 = "Even Realities R1"
|
|
19
|
+
val ALL = arrayOf(R1)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
object ConnTypes {
|
|
23
|
+
const val CONNECTING = "CONNECTING"
|
|
24
|
+
const val CONNECTED = "CONNECTED"
|
|
25
|
+
const val DISCONNECTED = "DISCONNECTED"
|
|
26
|
+
const val SCANNING = "SCANNING"
|
|
27
|
+
const val BONDING = "BONDING"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
object MicTypes {
|
|
31
|
+
const val PHONE_INTERNAL = "phone"
|
|
32
|
+
const val GLASSES_CUSTOM = "glasses"
|
|
33
|
+
const val BLUETOOTH_CLASSIC = "bluetoothClassic"
|
|
34
|
+
const val BLUETOOTH = "bluetooth"
|
|
35
|
+
val ALL = arrayOf(PHONE_INTERNAL, GLASSES_CUSTOM, BLUETOOTH_CLASSIC, BLUETOOTH)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// convert to kotlin:
|
|
39
|
+
object MicMap {
|
|
40
|
+
val map: Map<String, List<String>> = mapOf(
|
|
41
|
+
"auto" to listOf(MicTypes.GLASSES_CUSTOM, MicTypes.PHONE_INTERNAL, MicTypes.BLUETOOTH, MicTypes.BLUETOOTH_CLASSIC),
|
|
42
|
+
"glasses" to listOf(MicTypes.GLASSES_CUSTOM),
|
|
43
|
+
"phone" to listOf(MicTypes.PHONE_INTERNAL, MicTypes.GLASSES_CUSTOM),
|
|
44
|
+
"bluetooth" to listOf(MicTypes.BLUETOOTH, MicTypes.BLUETOOTH_CLASSIC, MicTypes.PHONE_INTERNAL, MicTypes.GLASSES_CUSTOM),
|
|
45
|
+
)
|
|
46
|
+
}
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
package com.glassly.bluetoothsdk.utils
|
|
2
|
+
|
|
3
|
+
class G1Text {
|
|
4
|
+
companion object {
|
|
5
|
+
// Constants for text wall display
|
|
6
|
+
private const val TEXT_COMMAND: Byte = 0x4E // Text command
|
|
7
|
+
private const val DISPLAY_WIDTH = 488
|
|
8
|
+
private const val DISPLAY_USE_WIDTH = 488 // How much of the display to use
|
|
9
|
+
private const val FONT_MULTIPLIER: Float = 1 / 50.0f
|
|
10
|
+
private const val OLD_FONT_SIZE = 21 // Font size
|
|
11
|
+
private const val FONT_DIVIDER: Float = 2.0f
|
|
12
|
+
private const val LINES_PER_SCREEN = 5 // Lines per screen
|
|
13
|
+
private const val MAX_CHUNK_SIZE = 176 // Maximum chunk size for BLE packets
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
private var textSeqNum = 0 // Sequence number for text packets
|
|
17
|
+
private val fontLoader = G1FontLoaderKt()
|
|
18
|
+
|
|
19
|
+
// Calculate text width in pixels
|
|
20
|
+
fun calculateTextWidth(text: String): Int {
|
|
21
|
+
var width = 0
|
|
22
|
+
for (char in text) {
|
|
23
|
+
val glyph = fontLoader.getGlyph(char)
|
|
24
|
+
width += glyph.width + 1 // Add 1 pixel per character for spacing
|
|
25
|
+
}
|
|
26
|
+
return width * 2
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private fun calculateSubstringWidth(text: String, start: Int, end: Int): Int {
|
|
30
|
+
val substring = text.substring(start, end)
|
|
31
|
+
return calculateTextWidth(substring)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
private fun calculateSpacesForAlignment(currentWidth: Int, targetPosition: Int, spaceWidth: Int): Int {
|
|
35
|
+
// Calculate space needed in pixels
|
|
36
|
+
val pixelsNeeded = targetPosition - currentWidth
|
|
37
|
+
|
|
38
|
+
// Calculate spaces needed (with minimum of 1 space for separation)
|
|
39
|
+
if (pixelsNeeded <= 0) {
|
|
40
|
+
return 1 // Ensure at least one space between columns
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Calculate the exact number of spaces needed
|
|
44
|
+
val spaces = Math.ceil(pixelsNeeded.toDouble() / spaceWidth.toDouble()).toInt()
|
|
45
|
+
|
|
46
|
+
// Cap at a reasonable maximum
|
|
47
|
+
return Math.min(spaces, 100)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
fun splitIntoLines(text: String, maxDisplayWidth: Int): List<String> {
|
|
51
|
+
// Replace specific symbols
|
|
52
|
+
val processedText = text.replace("⬆", "^").replace("⟶", "-")
|
|
53
|
+
|
|
54
|
+
val lines = mutableListOf<String>()
|
|
55
|
+
|
|
56
|
+
// Handle empty or single space case
|
|
57
|
+
if (processedText.isEmpty() || processedText == " ") {
|
|
58
|
+
lines.add(processedText)
|
|
59
|
+
return lines
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Split by newlines first
|
|
63
|
+
val rawLines = processedText.split("\n")
|
|
64
|
+
|
|
65
|
+
for (rawLine in rawLines) {
|
|
66
|
+
// Add empty lines for newlines
|
|
67
|
+
if (rawLine.isEmpty()) {
|
|
68
|
+
lines.add("")
|
|
69
|
+
continue
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
val lineLength = rawLine.length
|
|
73
|
+
var startIndex = 0
|
|
74
|
+
|
|
75
|
+
while (startIndex < lineLength) {
|
|
76
|
+
// Get maximum possible end index
|
|
77
|
+
val endIndex = lineLength
|
|
78
|
+
|
|
79
|
+
// Calculate width of the entire remaining text
|
|
80
|
+
val lineWidth = calculateSubstringWidth(rawLine, startIndex, endIndex)
|
|
81
|
+
|
|
82
|
+
// If entire line fits, add it and move to next line
|
|
83
|
+
if (lineWidth <= maxDisplayWidth) {
|
|
84
|
+
lines.add(rawLine.substring(startIndex))
|
|
85
|
+
break
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Binary search to find the maximum number of characters that fit
|
|
89
|
+
var left = startIndex + 1
|
|
90
|
+
var right = lineLength
|
|
91
|
+
var bestSplitIndex = startIndex + 1
|
|
92
|
+
|
|
93
|
+
while (left <= right) {
|
|
94
|
+
val mid = left + (right - left) / 2
|
|
95
|
+
val width = calculateSubstringWidth(rawLine, startIndex, mid)
|
|
96
|
+
|
|
97
|
+
if (width <= maxDisplayWidth) {
|
|
98
|
+
bestSplitIndex = mid
|
|
99
|
+
left = mid + 1
|
|
100
|
+
} else {
|
|
101
|
+
right = mid - 1
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Now find a good place to break (preferably at a space)
|
|
106
|
+
var splitIndex = bestSplitIndex
|
|
107
|
+
|
|
108
|
+
// Look for a space to break at
|
|
109
|
+
var foundSpace = false
|
|
110
|
+
for (i in bestSplitIndex downTo startIndex + 1) {
|
|
111
|
+
if (i > 0 && rawLine[i - 1] == ' ') {
|
|
112
|
+
splitIndex = i
|
|
113
|
+
foundSpace = true
|
|
114
|
+
break
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// If we couldn't find a space in a reasonable range, use the calculated split point
|
|
119
|
+
if (!foundSpace && bestSplitIndex - startIndex > 2) {
|
|
120
|
+
splitIndex = bestSplitIndex
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Add the line
|
|
124
|
+
val line = rawLine.substring(startIndex, splitIndex).trim()
|
|
125
|
+
lines.add(line)
|
|
126
|
+
|
|
127
|
+
// Skip any spaces at the beginning of the next line
|
|
128
|
+
var newStartIndex = splitIndex
|
|
129
|
+
while (newStartIndex < lineLength && rawLine[newStartIndex] == ' ') {
|
|
130
|
+
newStartIndex++
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
startIndex = newStartIndex
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return lines
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
fun createTextWallChunks(text: String): List<ByteArray> {
|
|
141
|
+
val margin = 5
|
|
142
|
+
|
|
143
|
+
// Get width of single space character
|
|
144
|
+
val spaceWidth = calculateTextWidth(" ")
|
|
145
|
+
|
|
146
|
+
// Calculate effective display width after accounting for left and right margins in spaces
|
|
147
|
+
val marginWidth = margin * spaceWidth // Width of left margin in pixels
|
|
148
|
+
val effectiveWidth = DISPLAY_WIDTH - (2 * marginWidth) // Subtract left and right margins
|
|
149
|
+
|
|
150
|
+
// Split text into lines based on effective display width
|
|
151
|
+
val lines = splitIntoLines(text, effectiveWidth)
|
|
152
|
+
|
|
153
|
+
// Calculate total pages (hard set to 1 - 1PAGECHANGE)
|
|
154
|
+
val totalPages = 1
|
|
155
|
+
|
|
156
|
+
val allChunks = mutableListOf<ByteArray>()
|
|
157
|
+
|
|
158
|
+
// Process each page
|
|
159
|
+
for (page in 0 until totalPages) {
|
|
160
|
+
// Get lines for current page
|
|
161
|
+
val startLine = page * LINES_PER_SCREEN
|
|
162
|
+
val endLine = Math.min(startLine + LINES_PER_SCREEN, lines.size)
|
|
163
|
+
val pageLines = lines.subList(startLine, endLine)
|
|
164
|
+
|
|
165
|
+
// Combine lines for this page with proper indentation
|
|
166
|
+
val pageText = StringBuilder()
|
|
167
|
+
|
|
168
|
+
for (line in pageLines) {
|
|
169
|
+
// Add the exact number of spaces for indentation
|
|
170
|
+
val indentation = " ".repeat(margin)
|
|
171
|
+
pageText.append("$indentation$line\n")
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
val textBytes = pageText.toString().toByteArray(Charsets.UTF_8)
|
|
175
|
+
val totalChunks = Math.ceil(textBytes.size.toDouble() / MAX_CHUNK_SIZE.toDouble()).toInt()
|
|
176
|
+
|
|
177
|
+
// Create chunks for this page
|
|
178
|
+
for (i in 0 until totalChunks) {
|
|
179
|
+
val start = i * MAX_CHUNK_SIZE
|
|
180
|
+
val end = Math.min(start + MAX_CHUNK_SIZE, textBytes.size)
|
|
181
|
+
val payloadChunk = textBytes.copyOfRange(start, end)
|
|
182
|
+
|
|
183
|
+
// Create header with protocol specifications
|
|
184
|
+
val screenStatus: Byte = 0x71 // New content (0x01) + Text Show (0x70)
|
|
185
|
+
val header = byteArrayOf(
|
|
186
|
+
TEXT_COMMAND, // Command type
|
|
187
|
+
textSeqNum.toByte(), // Sequence number
|
|
188
|
+
totalChunks.toByte(), // Total packages
|
|
189
|
+
i.toByte(), // Current package number
|
|
190
|
+
screenStatus, // Screen status
|
|
191
|
+
0x00, // new_char_pos0 (high)
|
|
192
|
+
0x00, // new_char_pos1 (low)
|
|
193
|
+
page.toByte(), // Current page number
|
|
194
|
+
totalPages.toByte() // Max page number
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
// Combine header and payload
|
|
198
|
+
val chunk = header + payloadChunk
|
|
199
|
+
|
|
200
|
+
allChunks.add(chunk)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Increment sequence number for next page
|
|
204
|
+
textSeqNum = (textSeqNum + 1) % 256
|
|
205
|
+
break // Hard set to 1 - 1PAGECHANGE
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return allChunks
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Creates BLE chunks for pre-composed double text wall.
|
|
213
|
+
*
|
|
214
|
+
* NOTE: DisplayProcessor now composes double_text_wall into a single text_wall
|
|
215
|
+
* with pixel-precise column alignment using ColumnComposer. This method may
|
|
216
|
+
* not be called anymore for new flows, but is kept for backwards compatibility.
|
|
217
|
+
*
|
|
218
|
+
* Column composition is handled by DisplayProcessor in React Native.
|
|
219
|
+
* This method is a "dumb pipe" - it just combines and chunks the text.
|
|
220
|
+
*
|
|
221
|
+
* @param textTop Pre-composed left/top column text
|
|
222
|
+
* @param textBottom Pre-composed right/bottom column text
|
|
223
|
+
* @return List of BLE chunks ready for transmission
|
|
224
|
+
*/
|
|
225
|
+
fun createDoubleTextWallChunks(textTop: String, textBottom: String): List<ByteArray> {
|
|
226
|
+
// Text is already composed by DisplayProcessor's ColumnComposer
|
|
227
|
+
// Just combine and chunk for transmission - no custom wrapping logic needed
|
|
228
|
+
val combinedText = "$textTop\n$textBottom"
|
|
229
|
+
return chunkTextForTransmission(combinedText)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
private fun chunkTextForTransmission(text: String): List<ByteArray> {
|
|
233
|
+
val textBytes = text.toByteArray(Charsets.UTF_8)
|
|
234
|
+
val totalChunks = Math.ceil(textBytes.size.toDouble() / MAX_CHUNK_SIZE.toDouble()).toInt()
|
|
235
|
+
|
|
236
|
+
val allChunks = mutableListOf<ByteArray>()
|
|
237
|
+
for (i in 0 until totalChunks) {
|
|
238
|
+
val start = i * MAX_CHUNK_SIZE
|
|
239
|
+
val end = Math.min(start + MAX_CHUNK_SIZE, textBytes.size)
|
|
240
|
+
val payloadChunk = textBytes.copyOfRange(start, end)
|
|
241
|
+
|
|
242
|
+
// Create header with protocol specifications
|
|
243
|
+
val screenStatus: Byte = 0x71 // New content (0x01) + Text Show (0x70)
|
|
244
|
+
val header = byteArrayOf(
|
|
245
|
+
TEXT_COMMAND, // Command type
|
|
246
|
+
textSeqNum.toByte(), // Sequence number
|
|
247
|
+
totalChunks.toByte(), // Total packages
|
|
248
|
+
i.toByte(), // Current package number
|
|
249
|
+
screenStatus, // Screen status
|
|
250
|
+
0x00, // new_char_pos0 (high)
|
|
251
|
+
0x00, // new_char_pos1 (low)
|
|
252
|
+
0x00, // Current page number (always 0 for now)
|
|
253
|
+
0x01 // Max page number (always 1)
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
// Combine header and payload
|
|
257
|
+
val chunk = header + payloadChunk
|
|
258
|
+
|
|
259
|
+
allChunks.add(chunk)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Increment sequence number for next page
|
|
263
|
+
textSeqNum = (textSeqNum + 1) % 256
|
|
264
|
+
|
|
265
|
+
return allChunks
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Font loader with hardcoded font data
|
|
270
|
+
class G1FontLoaderKt {
|
|
271
|
+
private val fontMap: MutableMap<Char, FontGlyph> = mutableMapOf()
|
|
272
|
+
|
|
273
|
+
init {
|
|
274
|
+
loadHardcodedFontData()
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
private fun loadHardcodedFontData() {
|
|
278
|
+
// Hardcoded font data based on the Swift implementation
|
|
279
|
+
val hardcodedGlyphs = listOf(
|
|
280
|
+
GlyphData(32, ' ', 2, 26),
|
|
281
|
+
GlyphData(33, '!', 1, 26),
|
|
282
|
+
GlyphData(34, '"', 2, 26),
|
|
283
|
+
GlyphData(35, '#', 6, 26),
|
|
284
|
+
GlyphData(36, '$', 5, 26),
|
|
285
|
+
GlyphData(37, '%', 6, 26),
|
|
286
|
+
GlyphData(38, '&', 7, 26),
|
|
287
|
+
GlyphData(39, '\'', 1, 26),
|
|
288
|
+
GlyphData(40, '(', 2, 26),
|
|
289
|
+
GlyphData(41, ')', 2, 26),
|
|
290
|
+
GlyphData(42, '*', 3, 26),
|
|
291
|
+
GlyphData(43, '+', 4, 26),
|
|
292
|
+
GlyphData(44, ',', 1, 26),
|
|
293
|
+
GlyphData(45, '-', 4, 26),
|
|
294
|
+
GlyphData(46, '.', 1, 26),
|
|
295
|
+
GlyphData(47, '/', 3, 26),
|
|
296
|
+
GlyphData(48, '0', 5, 26),
|
|
297
|
+
GlyphData(49, '1', 3, 26),
|
|
298
|
+
GlyphData(50, '2', 5, 26),
|
|
299
|
+
GlyphData(51, '3', 5, 26),
|
|
300
|
+
GlyphData(52, '4', 5, 26),
|
|
301
|
+
GlyphData(53, '5', 5, 26),
|
|
302
|
+
GlyphData(54, '6', 5, 26),
|
|
303
|
+
GlyphData(55, '7', 5, 26),
|
|
304
|
+
GlyphData(56, '8', 5, 26),
|
|
305
|
+
GlyphData(57, '9', 5, 26),
|
|
306
|
+
GlyphData(58, ':', 1, 26),
|
|
307
|
+
GlyphData(59, ';', 1, 26),
|
|
308
|
+
GlyphData(60, '<', 4, 26),
|
|
309
|
+
GlyphData(61, '=', 4, 26),
|
|
310
|
+
GlyphData(62, '>', 4, 26),
|
|
311
|
+
GlyphData(63, '?', 5, 26),
|
|
312
|
+
GlyphData(64, '@', 7, 26),
|
|
313
|
+
GlyphData(65, 'A', 6, 26),
|
|
314
|
+
GlyphData(66, 'B', 5, 26),
|
|
315
|
+
GlyphData(67, 'C', 5, 26),
|
|
316
|
+
GlyphData(68, 'D', 5, 26),
|
|
317
|
+
GlyphData(69, 'E', 4, 26),
|
|
318
|
+
GlyphData(70, 'F', 4, 26),
|
|
319
|
+
GlyphData(71, 'G', 5, 26),
|
|
320
|
+
GlyphData(72, 'H', 5, 26),
|
|
321
|
+
GlyphData(73, 'I', 2, 26),
|
|
322
|
+
GlyphData(74, 'J', 3, 26),
|
|
323
|
+
GlyphData(75, 'K', 5, 26),
|
|
324
|
+
GlyphData(76, 'L', 4, 26),
|
|
325
|
+
GlyphData(77, 'M', 7, 26),
|
|
326
|
+
GlyphData(78, 'N', 5, 26),
|
|
327
|
+
GlyphData(79, 'O', 5, 26),
|
|
328
|
+
GlyphData(80, 'P', 5, 26),
|
|
329
|
+
GlyphData(81, 'Q', 5, 26),
|
|
330
|
+
GlyphData(82, 'R', 5, 26),
|
|
331
|
+
GlyphData(83, 'S', 5, 26),
|
|
332
|
+
GlyphData(84, 'T', 5, 26),
|
|
333
|
+
GlyphData(85, 'U', 5, 26),
|
|
334
|
+
GlyphData(86, 'V', 6, 26),
|
|
335
|
+
GlyphData(87, 'W', 7, 26),
|
|
336
|
+
GlyphData(88, 'X', 6, 26),
|
|
337
|
+
GlyphData(89, 'Y', 6, 26),
|
|
338
|
+
GlyphData(90, 'Z', 5, 26),
|
|
339
|
+
GlyphData(91, '[', 2, 26),
|
|
340
|
+
GlyphData(92, '\\', 3, 26),
|
|
341
|
+
GlyphData(93, ']', 2, 26),
|
|
342
|
+
GlyphData(94, '^', 4, 26),
|
|
343
|
+
GlyphData(95, '_', 3, 26),
|
|
344
|
+
GlyphData(96, '`', 2, 26),
|
|
345
|
+
GlyphData(97, 'a', 5, 26),
|
|
346
|
+
GlyphData(98, 'b', 4, 26),
|
|
347
|
+
GlyphData(99, 'c', 4, 26),
|
|
348
|
+
GlyphData(100, 'd', 4, 26),
|
|
349
|
+
GlyphData(101, 'e', 4, 26),
|
|
350
|
+
GlyphData(102, 'f', 4, 26),
|
|
351
|
+
GlyphData(103, 'g', 4, 26),
|
|
352
|
+
GlyphData(104, 'h', 4, 26),
|
|
353
|
+
GlyphData(105, 'i', 1, 26),
|
|
354
|
+
GlyphData(106, 'j', 2, 26),
|
|
355
|
+
GlyphData(107, 'k', 4, 26),
|
|
356
|
+
GlyphData(108, 'l', 1, 26),
|
|
357
|
+
GlyphData(109, 'm', 7, 26),
|
|
358
|
+
GlyphData(110, 'n', 4, 26),
|
|
359
|
+
GlyphData(111, 'o', 4, 26),
|
|
360
|
+
GlyphData(112, 'p', 4, 26),
|
|
361
|
+
GlyphData(113, 'q', 4, 26),
|
|
362
|
+
GlyphData(114, 'r', 3, 26),
|
|
363
|
+
GlyphData(115, 's', 4, 26),
|
|
364
|
+
GlyphData(116, 't', 3, 26),
|
|
365
|
+
GlyphData(117, 'u', 5, 26),
|
|
366
|
+
GlyphData(118, 'v', 5, 26),
|
|
367
|
+
GlyphData(119, 'w', 7, 26),
|
|
368
|
+
GlyphData(120, 'x', 5, 26),
|
|
369
|
+
GlyphData(121, 'y', 5, 26),
|
|
370
|
+
GlyphData(122, 'z', 4, 26),
|
|
371
|
+
GlyphData(123, '{', 3, 26),
|
|
372
|
+
GlyphData(124, '|', 1, 26),
|
|
373
|
+
GlyphData(125, '}', 3, 26),
|
|
374
|
+
GlyphData(126, '~', 7, 26),
|
|
375
|
+
GlyphData(192, 'À', 6, 26),
|
|
376
|
+
GlyphData(194, 'Â', 6, 26),
|
|
377
|
+
GlyphData(199, 'Ç', 5, 26),
|
|
378
|
+
GlyphData(200, 'È', 4, 26),
|
|
379
|
+
GlyphData(201, 'É', 4, 26),
|
|
380
|
+
GlyphData(202, 'Ê', 4, 26),
|
|
381
|
+
GlyphData(203, 'Ë', 4, 26),
|
|
382
|
+
GlyphData(206, 'Î', 3, 26),
|
|
383
|
+
GlyphData(207, 'Ï', 3, 26),
|
|
384
|
+
GlyphData(212, 'Ô', 5, 26),
|
|
385
|
+
GlyphData(217, 'Ù', 5, 26),
|
|
386
|
+
GlyphData(219, 'Û', 5, 26),
|
|
387
|
+
GlyphData(220, 'Ü', 5, 26),
|
|
388
|
+
GlyphData(224, 'à', 5, 26),
|
|
389
|
+
GlyphData(231, 'ç', 4, 26),
|
|
390
|
+
GlyphData(232, 'è', 4, 26),
|
|
391
|
+
GlyphData(233, 'é', 4, 26),
|
|
392
|
+
GlyphData(234, 'ê', 4, 26),
|
|
393
|
+
GlyphData(235, 'ë', 4, 26),
|
|
394
|
+
GlyphData(238, 'î', 3, 26),
|
|
395
|
+
GlyphData(239, 'ï', 3, 26),
|
|
396
|
+
GlyphData(244, 'ô', 4, 26),
|
|
397
|
+
GlyphData(249, 'ù', 5, 26),
|
|
398
|
+
GlyphData(251, 'û', 5, 26),
|
|
399
|
+
GlyphData(252, 'ü', 5, 26),
|
|
400
|
+
GlyphData(255, 'ÿ', 5, 26),
|
|
401
|
+
GlyphData(376, 'Ÿ', 6, 26),
|
|
402
|
+
GlyphData(196, 'Ä', 6, 26),
|
|
403
|
+
GlyphData(228, 'ä', 5, 26),
|
|
404
|
+
GlyphData(214, 'Ö', 5, 26),
|
|
405
|
+
GlyphData(246, 'ö', 4, 26),
|
|
406
|
+
GlyphData(223, 'ß', 4, 26),
|
|
407
|
+
GlyphData(7838, 'ẞ', 5, 26),
|
|
408
|
+
GlyphData(226, 'â', 5, 26),
|
|
409
|
+
GlyphData(193, 'Á', 6, 26),
|
|
410
|
+
GlyphData(225, 'á', 5, 26),
|
|
411
|
+
GlyphData(205, 'Í', 2, 26),
|
|
412
|
+
GlyphData(237, 'í', 2, 26),
|
|
413
|
+
GlyphData(209, 'Ñ', 5, 26),
|
|
414
|
+
GlyphData(241, 'ñ', 4, 26),
|
|
415
|
+
GlyphData(250, 'ú', 5, 26),
|
|
416
|
+
GlyphData(211, 'Ó', 5, 26),
|
|
417
|
+
GlyphData(243, 'ó', 4, 26),
|
|
418
|
+
GlyphData(218, 'Ú', 5, 26)
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
// Map characters directly to FontGlyph objects
|
|
422
|
+
for (glyph in hardcodedGlyphs) {
|
|
423
|
+
fontMap[glyph.char] = FontGlyph(glyph.width, glyph.height)
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
println("Hardcoded font data loaded successfully! ${fontMap.size} glyphs mapped.")
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
fun getGlyph(character: Char): FontGlyph {
|
|
430
|
+
return fontMap[character] ?: FontGlyph(6, 26) // Default width=6, height=26
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
data class FontGlyph(val width: Int, val height: Int)
|
|
434
|
+
|
|
435
|
+
private data class GlyphData(val codePoint: Int, val char: Char, val width: Int, val height: Int)
|
|
436
|
+
}
|