From 24010ce7b83b109cebdea2faddc572aa05c5f5c9 Mon Sep 17 00:00:00 2001 From: Daniel Jilg Date: Wed, 2 Aug 2023 23:41:59 +0200 Subject: [PATCH 1/5] Update Packages --- Telemetry Viewer.xcodeproj/project.pbxproj | 36 +++++++++++-------- .../xcshareddata/swiftpm/Package.resolved | 4 +-- .../xcschemes/Telemetry Viewer (iOS).xcscheme | 2 +- .../Telemetry Viewer (macOS).xcscheme | 2 +- .../Telemetry Viewer (macOS, local).xcscheme | 2 +- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/Telemetry Viewer.xcodeproj/project.pbxproj b/Telemetry Viewer.xcodeproj/project.pbxproj index 2fc2adb..283fb63 100644 --- a/Telemetry Viewer.xcodeproj/project.pbxproj +++ b/Telemetry Viewer.xcodeproj/project.pbxproj @@ -219,7 +219,7 @@ C5A8D86B270C5D800032560A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C5A8D86A270C5D800032560A /* Assets.xcassets */; }; C5A8D86D270C5D800032560A /* TelemetryDeckWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = C5A8D869270C5D7B0032560A /* TelemetryDeckWidget.intentdefinition */; }; C5A8D86E270C5D800032560A /* TelemetryDeckWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = C5A8D869270C5D7B0032560A /* TelemetryDeckWidget.intentdefinition */; }; - C5A8D871270C5D800032560A /* TelemetryDeckWidgetExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C5A8D863270C5D7A0032560A /* TelemetryDeckWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + C5A8D871270C5D800032560A /* TelemetryDeckWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = C5A8D863270C5D7A0032560A /* TelemetryDeckWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; C5A8D87C270C65F90032560A /* InsightResultService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BA5D50926CDAA58008FBF8F /* InsightResultService.swift */; }; C5A8D87D270C65F90032560A /* InsightService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B1D46A026CC52DD008814A9 /* InsightService.swift */; }; C5A8D882270C66190032560A /* ErrorService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B1D469726CC4C5D008814A9 /* ErrorService.swift */; }; @@ -227,7 +227,7 @@ C5A8D8A5270C6FB70032560A /* MockData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5A8D8A4270C6FB70032560A /* MockData.swift */; }; C5A8D8AE270C821A0032560A /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5A8D8AD270C821A0032560A /* Intents.framework */; platformFilter = maccatalyst; }; C5A8D8B1270C821A0032560A /* IntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5A8D8B0270C821A0032560A /* IntentHandler.swift */; }; - C5A8D8C6270C821B0032560A /* TelemetryDeckIntents.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C5A8D8AC270C821A0032560A /* TelemetryDeckIntents.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + C5A8D8C6270C821B0032560A /* TelemetryDeckIntents.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = C5A8D8AC270C821A0032560A /* TelemetryDeckIntents.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; C5A8D8CD270C84430032560A /* TelemetryDeckWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = C5A8D869270C5D7B0032560A /* TelemetryDeckWidget.intentdefinition */; }; C5AD4B6427D3928600CD7E4C /* DataTransferObjects in Frameworks */ = {isa = PBXBuildFile; productRef = C5AD4B6327D3928600CD7E4C /* DataTransferObjects */; }; C5B917F12757C9EB004A842B /* CreateNewAppView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5B917F02757C9EB004A842B /* CreateNewAppView.swift */; }; @@ -404,16 +404,16 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - C5A8D875270C5D800032560A /* Embed App Extensions */ = { + C5A8D875270C5D800032560A /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( - C5A8D871270C5D800032560A /* TelemetryDeckWidgetExtension.appex in Embed App Extensions */, - C5A8D8C6270C821B0032560A /* TelemetryDeckIntents.appex in Embed App Extensions */, + C5A8D871270C5D800032560A /* TelemetryDeckWidgetExtension.appex in Embed Foundation Extensions */, + C5A8D8C6270C821B0032560A /* TelemetryDeckIntents.appex in Embed Foundation Extensions */, ); - name = "Embed App Extensions"; + name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ @@ -1219,7 +1219,7 @@ DCE23A0024D3687D00053370 /* Frameworks */, DCE23A0124D3687D00053370 /* Resources */, DC7DEE9D258A355F00BEA712 /* ShellScript */, - C5A8D875270C5D800032560A /* Embed App Extensions */, + C5A8D875270C5D800032560A /* Embed Foundation Extensions */, ); buildRules = ( ); @@ -1267,7 +1267,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1310; - LastUpgradeCheck = 1200; + LastUpgradeCheck = 1420; TargetAttributes = { C51CB73A27565F76005A3FB9 = { CreatedOnToolsVersion = 13.1; @@ -1872,6 +1872,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 547; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = FL4V655A94; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1902,6 +1903,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 547; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = FL4V655A94; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1934,6 +1936,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 547; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = FL4V655A94; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1966,6 +1969,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 547; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = FL4V655A94; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1996,7 +2000,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_ENTITLEMENTS = "TelemetryDeckWidget/TelemetryDeckWidgetExtension (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 680; + CURRENT_PROJECT_VERSION = 715; DEVELOPMENT_TEAM = FL4V655A94; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TelemetryDeckWidget/Info.plist; @@ -2028,7 +2032,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_ENTITLEMENTS = "TelemetryDeckWidget/TelemetryDeckWidgetExtension (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 680; + CURRENT_PROJECT_VERSION = 715; DEVELOPMENT_TEAM = FL4V655A94; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TelemetryDeckWidget/Info.plist; @@ -2059,7 +2063,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_ENTITLEMENTS = "TelemetryDeckIntents/TelemetryDeckIntents (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 680; + CURRENT_PROJECT_VERSION = 715; DEVELOPMENT_TEAM = FL4V655A94; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TelemetryDeckIntents/Info.plist; @@ -2088,7 +2092,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_ENTITLEMENTS = "TelemetryDeckIntents/TelemetryDeckIntents (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 680; + CURRENT_PROJECT_VERSION = 715; DEVELOPMENT_TEAM = FL4V655A94; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TelemetryDeckIntents/Info.plist; @@ -2147,6 +2151,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPER_BUNDLE_ID = "$(inherited)"; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -2208,6 +2213,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPER_BUNDLE_ID = "$(inherited)"; ENABLE_NS_ASSERTIONS = NO; @@ -2235,7 +2241,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = "iOS/Telemetry Viewer (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 680; + CURRENT_PROJECT_VERSION = 715; DEVELOPMENT_TEAM = FL4V655A94; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = iOS/Info.plist; @@ -2261,7 +2267,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = "iOS/Telemetry Viewer (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 680; + CURRENT_PROJECT_VERSION = 715; DEVELOPMENT_TEAM = FL4V655A94; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = iOS/Info.plist; @@ -2290,6 +2296,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 547; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = FL4V655A94; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; @@ -2317,6 +2324,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 547; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = FL4V655A94; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; diff --git a/Telemetry Viewer.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Telemetry Viewer.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e08a004..5b9bd79 100644 --- a/Telemetry Viewer.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Telemetry Viewer.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -14,8 +14,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/AppTelemetry/SwiftClient", "state" : { - "revision" : "cb34730027fcf560005aad57f2b53506064b228f", - "version" : "1.4.3" + "revision" : "3f8bd438c8681ce7ccdf035b529cb5c4cd82cd7b", + "version" : "1.4.4" } }, { diff --git a/Telemetry Viewer.xcodeproj/xcshareddata/xcschemes/Telemetry Viewer (iOS).xcscheme b/Telemetry Viewer.xcodeproj/xcshareddata/xcschemes/Telemetry Viewer (iOS).xcscheme index 58e702e..c511f8c 100644 --- a/Telemetry Viewer.xcodeproj/xcshareddata/xcschemes/Telemetry Viewer (iOS).xcscheme +++ b/Telemetry Viewer.xcodeproj/xcshareddata/xcschemes/Telemetry Viewer (iOS).xcscheme @@ -1,6 +1,6 @@ Date: Fri, 4 Aug 2023 23:24:04 +0200 Subject: [PATCH 2/5] Vision OS support --- .../ProjectData/main.json | 13 + .../WorkspaceData/SceneMetadataList.json | 272 ++++++++++++++++ .../WorkspaceData/Settings.rcprojectdata | 17 + Packages/RealityKitContent/Package.swift | 28 ++ Packages/RealityKitContent/README.md | 3 + .../RealityKitContent.rkassets/Immersive.usda | 50 +++ .../RealityKitContent.rkassets/Scene.usda | 59 ++++ .../_PlainMaterial.usda | 37 +++ .../RealityKitContent/RealityKitContent.swift | 4 + Shared/Navigational Structure/RootView.swift | 48 +-- Telemetry Viewer.xcodeproj/project.pbxproj | 303 ++++++++++++++++-- .../xcschemes/Telemetry Viewer (iOS).xcscheme | 2 +- .../Telemetry Viewer (macOS).xcscheme | 2 +- .../Telemetry Viewer (macOS, local).xcscheme | 2 +- .../Content.imageset/Contents.json | 12 + .../Back.solidimagestacklayer/Contents.json | 6 + .../AppIcon.solidimagestack/Contents.json | 17 + .../Content.imageset/Contents.json | 12 + .../Front.solidimagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Middle.solidimagestacklayer/Contents.json | 6 + VisonOS/Assets.xcassets/Contents.json | 6 + VisonOS/ContentView.swift | 26 ++ VisonOS/ImmersiveView.swift | 26 ++ .../Preview Assets.xcassets/Contents.json | 6 + VisonOS/TelemetryDeckApp.swift | 21 ++ 26 files changed, 950 insertions(+), 46 deletions(-) create mode 100644 Packages/RealityKitContent/Package.realitycomposerpro/ProjectData/main.json create mode 100644 Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/SceneMetadataList.json create mode 100644 Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/Settings.rcprojectdata create mode 100644 Packages/RealityKitContent/Package.swift create mode 100644 Packages/RealityKitContent/README.md create mode 100644 Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Immersive.usda create mode 100644 Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Scene.usda create mode 100644 Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/_PlainMaterial.usda create mode 100644 Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.swift create mode 100644 VisonOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json create mode 100644 VisonOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json create mode 100644 VisonOS/Assets.xcassets/AppIcon.solidimagestack/Contents.json create mode 100644 VisonOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json create mode 100644 VisonOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json create mode 100644 VisonOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json create mode 100644 VisonOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json create mode 100644 VisonOS/Assets.xcassets/Contents.json create mode 100644 VisonOS/ContentView.swift create mode 100644 VisonOS/ImmersiveView.swift create mode 100644 VisonOS/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 VisonOS/TelemetryDeckApp.swift diff --git a/Packages/RealityKitContent/Package.realitycomposerpro/ProjectData/main.json b/Packages/RealityKitContent/Package.realitycomposerpro/ProjectData/main.json new file mode 100644 index 0000000..7f32830 --- /dev/null +++ b/Packages/RealityKitContent/Package.realitycomposerpro/ProjectData/main.json @@ -0,0 +1,13 @@ +{ + "pathsToIds" : { + "\/RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/GridMaterial.usda" : "CB766F92-EE55-4A63-9401-E7B8C009764D", + "\/RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/Immersive.usda" : "65F6F990-A780-4474-B78B-572E0E4E273D", + "\/RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/Scene.usda" : "0A9B4653-B11E-4D6A-850E-C6FCB621626C", + "\/RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/Untitled Scene.usda" : "D560BB77-AAF3-4BDE-B7C4-989332A4688B", + "RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/_GridMaterial.usda" : "CC9FD5C7-161F-48CA-B2B9-61DD597CBD66", + "RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/_PlainMaterial.usda" : "1510F6C7-214D-4800-9C6C-F3964D5FC3E3", + "RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/GridMaterial.usda" : "66168B71-AB05-424E-8B6C-D33D6E61B08F", + "RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/Immersive.usda" : "AF09ED6F-1707-48FD-8720-65B998362C09", + "RealityKitContent\/Sources\/RealityKitContent\/RealityKitContent.rkassets\/Scene.usda" : "D66134B1-3681-4A8E-AFE5-29F257229F3B" + } +} \ No newline at end of file diff --git a/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/SceneMetadataList.json b/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/SceneMetadataList.json new file mode 100644 index 0000000..2bd96c8 --- /dev/null +++ b/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/SceneMetadataList.json @@ -0,0 +1,272 @@ +{ + "0A9B4653-B11E-4D6A-850E-C6FCB621626C" : { + "cameraTransform" : [ + 1, + 0, + 0, + 0, + 0, + 0.86602545, + -0.49999994, + 0, + 0, + 0.49999994, + 0.86602545, + 0, + 0.0035969093, + 0.35542378, + 0.62919164, + 1 + ], + "objectMetadataList" : [ + [ + "0A9B4653-B11E-4D6A-850E-C6FCB621626C", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + }, + "65F6F990-A780-4474-B78B-572E0E4E273D" : { + "cameraTransform" : [ + 1, + 0, + -0, + 0, + -0, + 0.86602545, + -0.49999988, + 0, + 0, + 0.49999988, + 0.86602545, + 0, + 1.1972517e-08, + 2.6179132, + 0.43191218, + 1 + ], + "objectMetadataList" : [ + [ + "65F6F990-A780-4474-B78B-572E0E4E273D", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + }, + "1510F6C7-214D-4800-9C6C-F3964D5FC3E3" : { + "cameraTransform" : [ + 0.99999994, + 0, + -0, + 0, + -0, + 0.8660254, + -0.49999994, + 0, + 0, + 0.49999994, + 0.8660254, + 0, + 0, + 0.27093536, + 0.46927384, + 1 + ], + "objectMetadataList" : [ + [ + "1510F6C7-214D-4800-9C6C-F3964D5FC3E3", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + }, + "66168B71-AB05-424E-8B6C-D33D6E61B08F" : { + "cameraTransform" : [ + 1, + 0, + -0, + 0, + -0, + 0.8660254, + -0.5, + 0, + 0, + 0.5, + 0.8660254, + 0, + 0, + 0.23875366, + 0.4135335, + 1 + ], + "objectMetadataList" : [ + [ + "66168B71-AB05-424E-8B6C-D33D6E61B08F", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + }, + "AF09ED6F-1707-48FD-8720-65B998362C09" : { + "cameraTransform" : [ + 1, + 0, + -0, + 0, + -0, + 0.7071069, + -0.7071067, + 0, + 0, + 0.7071067, + 0.7071069, + 0, + 0, + 2.8836339, + -0.107588194, + 1 + ], + "objectMetadataList" : [ + [ + "AF09ED6F-1707-48FD-8720-65B998362C09", + "Root", + "Sphere_Left" + ], + { + "isExpanded" : true, + "isLocked" : false + }, + [ + "AF09ED6F-1707-48FD-8720-65B998362C09", + "Root", + "Sphere_Right" + ], + { + "isExpanded" : true, + "isLocked" : false + }, + [ + "AF09ED6F-1707-48FD-8720-65B998362C09", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + }, + "CB766F92-EE55-4A63-9401-E7B8C009764D" : { + "cameraTransform" : [ + 1, + 0, + -0, + 0, + -0, + 0.8660253, + -0.5000001, + 0, + 0, + 0.5000001, + 0.8660253, + 0, + 0, + 0.27093494, + 0.4692731, + 1 + ], + "objectMetadataList" : [ + [ + "CB766F92-EE55-4A63-9401-E7B8C009764D", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + }, + [ + "CB766F92-EE55-4A63-9401-E7B8C009764D", + "Root", + "GridMaterial" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + }, + "D560BB77-AAF3-4BDE-B7C4-989332A4688B" : { + "cameraTransform" : [ + 1, + 0, + -0, + 0, + -0, + 0.8660253, + -0.5000001, + 0, + 0, + 0.5000001, + 0.8660253, + 0, + 0, + 0.27093494, + 0.4692731, + 1 + ], + "objectMetadataList" : [ + + ] + }, + "D66134B1-3681-4A8E-AFE5-29F257229F3B" : { + "cameraTransform" : [ + 1, + 0, + -0, + 0, + -0, + 0.7071069, + -0.7071067, + 0, + 0, + 0.7071067, + 0.7071069, + 0, + 0, + 0.26894823, + 0.26934713, + 1 + ], + "objectMetadataList" : [ + [ + "D66134B1-3681-4A8E-AFE5-29F257229F3B", + "Root" + ], + { + "isExpanded" : true, + "isLocked" : false + }, + [ + "D66134B1-3681-4A8E-AFE5-29F257229F3B", + "Root", + "GridMaterial", + "GridMaterial" + ], + { + "isExpanded" : true, + "isLocked" : false + } + ] + } +} \ No newline at end of file diff --git a/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/Settings.rcprojectdata b/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/Settings.rcprojectdata new file mode 100644 index 0000000..6dea95c --- /dev/null +++ b/Packages/RealityKitContent/Package.realitycomposerpro/WorkspaceData/Settings.rcprojectdata @@ -0,0 +1,17 @@ +{ + "cameraPresets" : { + + }, + "secondaryToolbarData" : { + "isGridVisible" : true, + "sceneReverbPreset" : -1 + }, + "unitDefaults" : { + "°" : "°", + "kg" : "g", + "m" : "cm", + "m\/s" : "m\/s", + "m\/s²" : "m\/s²", + "s" : "s" + } +} \ No newline at end of file diff --git a/Packages/RealityKitContent/Package.swift b/Packages/RealityKitContent/Package.swift new file mode 100644 index 0000000..80e6ce6 --- /dev/null +++ b/Packages/RealityKitContent/Package.swift @@ -0,0 +1,28 @@ +// swift-tools-version:5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "RealityKitContent", + platforms: [ + .visionOS(.v1) + ], + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "RealityKitContent", + targets: ["RealityKitContent"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "RealityKitContent", + dependencies: []), + ] +) \ No newline at end of file diff --git a/Packages/RealityKitContent/README.md b/Packages/RealityKitContent/README.md new file mode 100644 index 0000000..486b575 --- /dev/null +++ b/Packages/RealityKitContent/README.md @@ -0,0 +1,3 @@ +# RealityKitContent + +A description of this package. \ No newline at end of file diff --git a/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Immersive.usda b/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Immersive.usda new file mode 100644 index 0000000..cf1c78e --- /dev/null +++ b/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Immersive.usda @@ -0,0 +1,50 @@ +#usda 1.0 +( + defaultPrim = "Root" + metersPerUnit = 1 + upAxis = "Y" +) + +def Xform "Root" +{ + reorder nameChildren = ["Sphere_Left", "Sphere_Right", "_PlainMaterial"] + def Sphere "Sphere_Right" ( + active = true + prepend apiSchemas = ["MaterialBindingAPI"] + ) + { + rel material:binding = ( + bindMaterialAs = "weakerThanDescendants" + ) + double radius = 0.1 + quatf xformOp:orient = (1, 0, 0, 0) + float3 xformOp:scale = (1, 1, 1) + float3 xformOp:translate = (0.5, 1.5, -1.5) + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"] + } + + def Sphere "Sphere_Left" ( + active = true + prepend apiSchemas = ["MaterialBindingAPI"] + ) + { + rel material:binding = ( + bindMaterialAs = "weakerThanDescendants" + ) + double radius = 0.1 + quatf xformOp:orient = (1, 0, 0, 0) + float3 xformOp:scale = (1, 1, 1) + float3 xformOp:translate = (-0.5, 1.5, -1.5) + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"] + } + + def "_PlainMaterial" ( + active = true + prepend references = @_PlainMaterial.usda@ + ) + { + float3 xformOp:scale = (1, 1, 1) + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"] + } +} + diff --git a/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Scene.usda b/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Scene.usda new file mode 100644 index 0000000..b0be32c --- /dev/null +++ b/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/Scene.usda @@ -0,0 +1,59 @@ +#usda 1.0 +( + defaultPrim = "Root" + metersPerUnit = 1 + upAxis = "Y" +) + +def Xform "Root" +{ + reorder nameChildren = ["Sphere", "_GridMaterial", "_PlainMaterial"] + rel material:binding = None ( + bindMaterialAs = "weakerThanDescendants" + ) + + def Sphere "Sphere" ( + active = true + prepend apiSchemas = ["MaterialBindingAPI"] + ) + { + rel material:binding = ( + bindMaterialAs = "weakerThanDescendants" + ) + double radius = 0.05 + quatf xformOp:orient = (1, 0, 0, 0) + float3 xformOp:scale = (1, 1, 1) + float3 xformOp:translate = (0, 0, 0.0004) + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"] + + def RealityKitComponent "Collider" + { + uint group = 1 + uniform token info:id = "RealityKit.Collider" + uint mask = 4294967295 + token type = "Default" + + def RealityKitStruct "Shape" + { + float3 extent = (0.2, 0.2, 0.2) + float radius = 0.05 + token shapeType = "Sphere" + } + } + + def RealityKitComponent "InputTarget" + { + uniform token info:id = "RealityKit.InputTarget" + } + } + + def "_PlainMaterial" ( + active = true + prepend references = @_PlainMaterial.usda@ + ) + { + float3 xformOp:scale = (1, 1, 1) + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"] + } +} + diff --git a/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/_PlainMaterial.usda b/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/_PlainMaterial.usda new file mode 100644 index 0000000..64a1974 --- /dev/null +++ b/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.rkassets/_PlainMaterial.usda @@ -0,0 +1,37 @@ +#usda 1.0 +( + defaultPrim = "Root" + metersPerUnit = 1 + upAxis = "Y" +) + +def Xform "Root" +{ + def Material "Material" + { + token outputs:mtlx:surface + token outputs:realitykit:vertex + prepend token outputs:surface.connect = + float2 ui:nodegraph:realitykit:subgraphOutputs:pos = (358.25, 99.5) + float2 ui:nodegraph:realitykit:subgraphOutputs:size = (181.5, 99) + + def Shader "MaterialXPreviewSurface" + { + uniform token info:id = "ND_UsdPreviewSurface_surfaceshader" + token outputs:out + float2 ui:nodegraph:node:pos = (103.75, 99.5) + float2 ui:nodegraph:node:size = (207.5, 199) + } + + def Shader "UsdPreviewSurface" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor = (0.89737034, 0.89737034, 0.89737034) ( + colorSpace = "Input - Texture - sRGB - sRGB" + ) + float inputs:metallic = 0.15 + token outputs:surface + } + } +} + diff --git a/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.swift b/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.swift new file mode 100644 index 0000000..5caba4e --- /dev/null +++ b/Packages/RealityKitContent/Sources/RealityKitContent/RealityKitContent.swift @@ -0,0 +1,4 @@ +import Foundation + +/// Bundle for the RealityKitContent project +public let realityKitContentBundle = Bundle.module diff --git a/Shared/Navigational Structure/RootView.swift b/Shared/Navigational Structure/RootView.swift index 3bb2adc..1e84176 100644 --- a/Shared/Navigational Structure/RootView.swift +++ b/Shared/Navigational Structure/RootView.swift @@ -15,29 +15,31 @@ struct RootView: View { @EnvironmentObject var appService: AppService var body: some View { - if api.userNotLoggedIn { - #if os(iOS) - WelcomeView() - - #else - HStack { - Spacer() - WelcomeView() - .frame(maxWidth: 600) - .alert(isPresented: $api.userLoginFailed, content: loginFailedView) - Spacer() - } - #endif - } else { - NavigationView { - LeftSidebarView() - NoAppSelectedView() - } - .alert(isPresented: $api.userLoginFailed, content: loginFailedView) - .onAppear { - WidgetCenter.shared.reloadAllTimelines() - } - } + ChartsExperiment() + +// if api.userNotLoggedIn { +// #if os(iOS) +// WelcomeView() +// +// #else +// HStack { +// Spacer() +// WelcomeView() +// .frame(maxWidth: 600) +// .alert(isPresented: $api.userLoginFailed, content: loginFailedView) +// Spacer() +// } +// #endif +// } else { +// NavigationView { +// LeftSidebarView() +// NoAppSelectedView() +// } +// .alert(isPresented: $api.userLoginFailed, content: loginFailedView) +// .onAppear { +// WidgetCenter.shared.reloadAllTimelines() +// } +// } } func loginFailedView() -> Alert { diff --git a/Telemetry Viewer.xcodeproj/project.pbxproj b/Telemetry Viewer.xcodeproj/project.pbxproj index 283fb63..0d30648 100644 --- a/Telemetry Viewer.xcodeproj/project.pbxproj +++ b/Telemetry Viewer.xcodeproj/project.pbxproj @@ -53,8 +53,6 @@ 2B61B94F264C08D4003F62C4 /* SignalsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B61B94D264C08D4003F62C4 /* SignalsService.swift */; }; 2B6431952739A5BB009A33C4 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B64318D2739A5BB009A33C4 /* APIClient.swift */; }; 2B6431962739A5BB009A33C4 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B64318D2739A5BB009A33C4 /* APIClient.swift */; }; - 2B6431972739A5BB009A33C4 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B64318D2739A5BB009A33C4 /* APIClient.swift */; }; - 2B6431982739A5BB009A33C4 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B64318D2739A5BB009A33C4 /* APIClient.swift */; }; 2B6431992739A5BB009A33C4 /* Data+JSONPrettyPrint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B64318E2739A5BB009A33C4 /* Data+JSONPrettyPrint.swift */; }; 2B64319A2739A5BB009A33C4 /* Data+JSONPrettyPrint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B64318E2739A5BB009A33C4 /* Data+JSONPrettyPrint.swift */; }; 2B64319B2739A5BB009A33C4 /* Data+JSONPrettyPrint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B64318E2739A5BB009A33C4 /* Data+JSONPrettyPrint.swift */; }; @@ -84,6 +82,37 @@ 2B781B8626F4A6D80062DBDC /* StatusMessageDisplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B781B8526F4A6D80062DBDC /* StatusMessageDisplay.swift */; }; 2B781B8726F4A6D80062DBDC /* StatusMessageDisplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B781B8526F4A6D80062DBDC /* StatusMessageDisplay.swift */; }; 2B78C82C2722F839000924A0 /* TelemetryDeckWidgetEntryViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B78C82B2722F839000924A0 /* TelemetryDeckWidgetEntryViews.swift */; }; + 2B8E170D2A7D63A200D9D3E6 /* ChartsExperiment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E170C2A7D63A200D9D3E6 /* ChartsExperiment.swift */; }; + 2B8E170E2A7D63A200D9D3E6 /* ChartsExperiment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E170C2A7D63A200D9D3E6 /* ChartsExperiment.swift */; }; + 2B8E17122A7D6CAE00D9D3E6 /* ClusterChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E17112A7D6CAE00D9D3E6 /* ClusterChart.swift */; }; + 2B8E17132A7D6CAE00D9D3E6 /* ClusterChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E17112A7D6CAE00D9D3E6 /* ClusterChart.swift */; }; + 2B8E17172A7D6F0500D9D3E6 /* BarChartTimeSeries.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E17162A7D6F0500D9D3E6 /* BarChartTimeSeries.swift */; }; + 2B8E17182A7D6F0500D9D3E6 /* BarChartTimeSeries.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E17162A7D6F0500D9D3E6 /* BarChartTimeSeries.swift */; }; + 2B8E171A2A7D71E000D9D3E6 /* BarChartTopN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E17192A7D71E000D9D3E6 /* BarChartTopN.swift */; }; + 2B8E171B2A7D71E000D9D3E6 /* BarChartTopN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E17192A7D71E000D9D3E6 /* BarChartTopN.swift */; }; + 2B8E171D2A7D71F600D9D3E6 /* BarChartGroupBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E171C2A7D71F600D9D3E6 /* BarChartGroupBy.swift */; }; + 2B8E171E2A7D71F600D9D3E6 /* BarChartGroupBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E171C2A7D71F600D9D3E6 /* BarChartGroupBy.swift */; }; + 2B8E17202A7D723D00D9D3E6 /* ClusterBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E171F2A7D723D00D9D3E6 /* ClusterBarChart.swift */; }; + 2B8E17212A7D723D00D9D3E6 /* ClusterBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E171F2A7D723D00D9D3E6 /* ClusterBarChart.swift */; }; + 2B8E172B2A7D8CAB00D9D3E6 /* RealityKitContent in Frameworks */ = {isa = PBXBuildFile; productRef = 2B8E172A2A7D8CAB00D9D3E6 /* RealityKitContent */; }; + 2B8E172D2A7D8CAB00D9D3E6 /* TelemetryDeckApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E172C2A7D8CAB00D9D3E6 /* TelemetryDeckApp.swift */; }; + 2B8E172F2A7D8CAB00D9D3E6 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E172E2A7D8CAB00D9D3E6 /* ContentView.swift */; }; + 2B8E17312A7D8CAB00D9D3E6 /* ImmersiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E17302A7D8CAB00D9D3E6 /* ImmersiveView.swift */; }; + 2B8E17332A7D8CAE00D9D3E6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2B8E17322A7D8CAE00D9D3E6 /* Assets.xcassets */; }; + 2B8E17362A7D8CAE00D9D3E6 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2B8E17352A7D8CAE00D9D3E6 /* Preview Assets.xcassets */; }; + 2B8E173C2A7D8EF300D9D3E6 /* QueryRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E173B2A7D8EF300D9D3E6 /* QueryRunner.swift */; }; + 2B8E173D2A7D8EF300D9D3E6 /* QueryRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E173B2A7D8EF300D9D3E6 /* QueryRunner.swift */; }; + 2B8E17422A7D94D300D9D3E6 /* ClusterBarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E171F2A7D723D00D9D3E6 /* ClusterBarChart.swift */; }; + 2B8E17432A7D94D300D9D3E6 /* ClusterChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E17112A7D6CAE00D9D3E6 /* ClusterChart.swift */; }; + 2B8E17442A7D94D300D9D3E6 /* BarChartGroupBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E171C2A7D71F600D9D3E6 /* BarChartGroupBy.swift */; }; + 2B8E17452A7D94D300D9D3E6 /* ChartsExperiment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E170C2A7D63A200D9D3E6 /* ChartsExperiment.swift */; }; + 2B8E17462A7D94D300D9D3E6 /* QueryRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E173B2A7D8EF300D9D3E6 /* QueryRunner.swift */; }; + 2B8E17472A7D94D300D9D3E6 /* BarChartTimeSeries.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E17162A7D6F0500D9D3E6 /* BarChartTimeSeries.swift */; }; + 2B8E17482A7D94D300D9D3E6 /* BarChartTopN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E17192A7D71E000D9D3E6 /* BarChartTopN.swift */; }; + 2B8E174A2A7D953200D9D3E6 /* DataTransferObjects in Frameworks */ = {isa = PBXBuildFile; productRef = 2B8E17492A7D953100D9D3E6 /* DataTransferObjects */; }; + 2B8E174C2A7D96FB00D9D3E6 /* ClusterInstrument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E174B2A7D96FB00D9D3E6 /* ClusterInstrument.swift */; }; + 2B8E174D2A7D96FC00D9D3E6 /* ClusterInstrument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E174B2A7D96FB00D9D3E6 /* ClusterInstrument.swift */; }; + 2B8E174E2A7D96FC00D9D3E6 /* ClusterInstrument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8E174B2A7D96FB00D9D3E6 /* ClusterInstrument.swift */; }; 2BA0397E26AAE19B004A9E48 /* MacOs12SignalTypesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BA0397D26AAE19B004A9E48 /* MacOs12SignalTypesView.swift */; }; 2BA5D50226CD05CC008FBF8F /* InsightGroupsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BA5D50026CD05CC008FBF8F /* InsightGroupsView.swift */; }; 2BA5D50526CD0E5B008FBF8F /* GroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BA5D50326CD0E5B008FBF8F /* GroupView.swift */; }; @@ -162,8 +191,6 @@ C51CB76727566158005A3FB9 /* TelemetryClient in Frameworks */ = {isa = PBXBuildFile; productRef = C51CB76627566158005A3FB9 /* TelemetryClient */; }; C51CB76927566199005A3FB9 /* DataTransferObjects in Frameworks */ = {isa = PBXBuildFile; productRef = C51CB76827566199005A3FB9 /* DataTransferObjects */; }; C51CB76D27566199005A3FB9 /* TelemetryClient in Frameworks */ = {isa = PBXBuildFile; productRef = C51CB76C27566199005A3FB9 /* TelemetryClient */; }; - C51CB76E275661EF005A3FB9 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B64318D2739A5BB009A33C4 /* APIClient.swift */; }; - C51CB76F275661F0005A3FB9 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B64318D2739A5BB009A33C4 /* APIClient.swift */; }; C51CB77027566202005A3FB9 /* CacheLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6431902739A5BB009A33C4 /* CacheLayer.swift */; }; C51CB77127566203005A3FB9 /* CacheLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6431902739A5BB009A33C4 /* CacheLayer.swift */; }; C51CB77227566205005A3FB9 /* Caching.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6431922739A5BB009A33C4 /* Caching.swift */; }; @@ -457,6 +484,21 @@ 2B781B8526F4A6D80062DBDC /* StatusMessageDisplay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMessageDisplay.swift; sourceTree = ""; }; 2B78C82B2722F839000924A0 /* TelemetryDeckWidgetEntryViews.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelemetryDeckWidgetEntryViews.swift; sourceTree = ""; }; 2B7E2BA426AF19560059CE34 /* Telemetry_Viewer_Mac_UITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Telemetry_Viewer_Mac_UITests.swift; sourceTree = ""; }; + 2B8E170C2A7D63A200D9D3E6 /* ChartsExperiment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChartsExperiment.swift; sourceTree = ""; }; + 2B8E17112A7D6CAE00D9D3E6 /* ClusterChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClusterChart.swift; sourceTree = ""; }; + 2B8E17162A7D6F0500D9D3E6 /* BarChartTimeSeries.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarChartTimeSeries.swift; sourceTree = ""; }; + 2B8E17192A7D71E000D9D3E6 /* BarChartTopN.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarChartTopN.swift; sourceTree = ""; }; + 2B8E171C2A7D71F600D9D3E6 /* BarChartGroupBy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarChartGroupBy.swift; sourceTree = ""; }; + 2B8E171F2A7D723D00D9D3E6 /* ClusterBarChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClusterBarChart.swift; sourceTree = ""; }; + 2B8E17262A7D8CAB00D9D3E6 /* TelemetryDeck.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TelemetryDeck.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2B8E17292A7D8CAB00D9D3E6 /* RealityKitContent */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = RealityKitContent; sourceTree = ""; }; + 2B8E172C2A7D8CAB00D9D3E6 /* TelemetryDeckApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TelemetryDeckApp.swift; sourceTree = ""; }; + 2B8E172E2A7D8CAB00D9D3E6 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 2B8E17302A7D8CAB00D9D3E6 /* ImmersiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImmersiveView.swift; sourceTree = ""; }; + 2B8E17322A7D8CAE00D9D3E6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 2B8E17352A7D8CAE00D9D3E6 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 2B8E173B2A7D8EF300D9D3E6 /* QueryRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueryRunner.swift; sourceTree = ""; }; + 2B8E174B2A7D96FB00D9D3E6 /* ClusterInstrument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClusterInstrument.swift; sourceTree = ""; }; 2BA0397D26AAE19B004A9E48 /* MacOs12SignalTypesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacOs12SignalTypesView.swift; sourceTree = ""; }; 2BA5D50026CD05CC008FBF8F /* InsightGroupsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsightGroupsView.swift; sourceTree = ""; }; 2BA5D50326CD0E5B008FBF8F /* GroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupView.swift; sourceTree = ""; }; @@ -579,6 +621,15 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 2B8E17232A7D8CAB00D9D3E6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B8E174A2A7D953200D9D3E6 /* DataTransferObjects in Frameworks */, + 2B8E172B2A7D8CAB00D9D3E6 /* RealityKitContent in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; C51CB73827565F76005A3FB9 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -728,6 +779,65 @@ path = "Telemetry Viewer Mac UITests"; sourceTree = ""; }; + 2B8E170F2A7D63AE00D9D3E6 /* Cluster */ = { + isa = PBXGroup; + children = ( + 2B8E170C2A7D63A200D9D3E6 /* ChartsExperiment.swift */, + 2B8E174B2A7D96FB00D9D3E6 /* ClusterInstrument.swift */, + 2B8E173B2A7D8EF300D9D3E6 /* QueryRunner.swift */, + 2B8E17142A7D6EB300D9D3E6 /* Chart */, + ); + path = Cluster; + sourceTree = ""; + }; + 2B8E17142A7D6EB300D9D3E6 /* Chart */ = { + isa = PBXGroup; + children = ( + 2B8E17112A7D6CAE00D9D3E6 /* ClusterChart.swift */, + 2B8E17152A7D6EF200D9D3E6 /* BarChart */, + ); + path = Chart; + sourceTree = ""; + }; + 2B8E17152A7D6EF200D9D3E6 /* BarChart */ = { + isa = PBXGroup; + children = ( + 2B8E17162A7D6F0500D9D3E6 /* BarChartTimeSeries.swift */, + 2B8E17192A7D71E000D9D3E6 /* BarChartTopN.swift */, + 2B8E171C2A7D71F600D9D3E6 /* BarChartGroupBy.swift */, + 2B8E171F2A7D723D00D9D3E6 /* ClusterBarChart.swift */, + ); + path = BarChart; + sourceTree = ""; + }; + 2B8E17272A7D8CAB00D9D3E6 /* VisonOS */ = { + isa = PBXGroup; + children = ( + 2B8E172C2A7D8CAB00D9D3E6 /* TelemetryDeckApp.swift */, + 2B8E172E2A7D8CAB00D9D3E6 /* ContentView.swift */, + 2B8E17302A7D8CAB00D9D3E6 /* ImmersiveView.swift */, + 2B8E17322A7D8CAE00D9D3E6 /* Assets.xcassets */, + 2B8E17342A7D8CAE00D9D3E6 /* Preview Content */, + ); + path = VisonOS; + sourceTree = ""; + }; + 2B8E17282A7D8CAB00D9D3E6 /* Packages */ = { + isa = PBXGroup; + children = ( + 2B8E17292A7D8CAB00D9D3E6 /* RealityKitContent */, + ); + path = Packages; + sourceTree = ""; + }; + 2B8E17342A7D8CAE00D9D3E6 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 2B8E17352A7D8CAE00D9D3E6 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; 2BBFC9EB267D05E30013DC74 /* Helpers+Extensions */ = { isa = PBXGroup; children = ( @@ -1012,6 +1122,7 @@ DCE239F624D3687C00053370 = { isa = PBXGroup; children = ( + 2B8E170F2A7D63AE00D9D3E6 /* Cluster */, 4903E9722983EDAA00EEDF5E /* README.md */, 4903E9712983EA1500EEDF5E /* Common.xcconfig */, C5F4D31328ACF48000EBB667 /* SwiftUICharts */, @@ -1021,10 +1132,12 @@ 2B1D469626CC484D008814A9 /* Services */, DCE239FB24D3687C00053370 /* Shared */, DCE23A0524D3687D00053370 /* iOS */, + 2B8E17272A7D8CAB00D9D3E6 /* VisonOS */, DCE23A0C24D3687D00053370 /* macOS */, 2B7E2BA326AF19560059CE34 /* Telemetry Viewer Mac UITests */, C5A8D866270C5D7A0032560A /* TelemetryDeckWidget */, C5A8D8AF270C821A0032560A /* TelemetryDeckIntents */, + 2B8E17282A7D8CAB00D9D3E6 /* Packages */, DCE23A0424D3687D00053370 /* Products */, DC9C0840252CEAC9001C0F94 /* Frameworks */, ); @@ -1058,6 +1171,7 @@ C5A8D8AC270C821A0032560A /* TelemetryDeckIntents.appex */, C51CB73B27565F76005A3FB9 /* TelemetryDeckMacIntents.appex */, C51CB74C275660E0005A3FB9 /* TelemetryDeckMacWidgetExtension.appex */, + 2B8E17262A7D8CAB00D9D3E6 /* TelemetryDeck.app */, ); name = Products; sourceTree = ""; @@ -1123,6 +1237,27 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 2B8E17252A7D8CAB00D9D3E6 /* TelemetryDeck */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2B8E17372A7D8CAE00D9D3E6 /* Build configuration list for PBXNativeTarget "TelemetryDeck" */; + buildPhases = ( + 2B8E17222A7D8CAB00D9D3E6 /* Sources */, + 2B8E17232A7D8CAB00D9D3E6 /* Frameworks */, + 2B8E17242A7D8CAB00D9D3E6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TelemetryDeck; + packageProductDependencies = ( + 2B8E172A2A7D8CAB00D9D3E6 /* RealityKitContent */, + 2B8E17492A7D953100D9D3E6 /* DataTransferObjects */, + ); + productName = TelemetryDeck; + productReference = 2B8E17262A7D8CAB00D9D3E6 /* TelemetryDeck.app */; + productType = "com.apple.product-type.application"; + }; C51CB73A27565F76005A3FB9 /* TelemetryDeckMacIntents */ = { isa = PBXNativeTarget; buildConfigurationList = C51CB74427565F76005A3FB9 /* Build configuration list for PBXNativeTarget "TelemetryDeckMacIntents" */; @@ -1266,9 +1401,13 @@ DCE239F724D3687C00053370 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1310; - LastUpgradeCheck = 1420; + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; TargetAttributes = { + 2B8E17252A7D8CAB00D9D3E6 = { + CreatedOnToolsVersion = 15.0; + }; C51CB73A27565F76005A3FB9 = { CreatedOnToolsVersion = 13.1; }; @@ -1313,11 +1452,21 @@ C51CB74B275660E0005A3FB9 /* TelemetryDeckMacWidgetExtension */, C5A8D8AB270C821A0032560A /* TelemetryDeckIntents */, C51CB73A27565F76005A3FB9 /* TelemetryDeckMacIntents */, + 2B8E17252A7D8CAB00D9D3E6 /* TelemetryDeck */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 2B8E17242A7D8CAB00D9D3E6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B8E17362A7D8CAE00D9D3E6 /* Preview Assets.xcassets in Resources */, + 2B8E17332A7D8CAE00D9D3E6 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; C51CB73927565F76005A3FB9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1464,6 +1613,24 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 2B8E17222A7D8CAB00D9D3E6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B8E174E2A7D96FC00D9D3E6 /* ClusterInstrument.swift in Sources */, + 2B8E17472A7D94D300D9D3E6 /* BarChartTimeSeries.swift in Sources */, + 2B8E172F2A7D8CAB00D9D3E6 /* ContentView.swift in Sources */, + 2B8E172D2A7D8CAB00D9D3E6 /* TelemetryDeckApp.swift in Sources */, + 2B8E17422A7D94D300D9D3E6 /* ClusterBarChart.swift in Sources */, + 2B8E17442A7D94D300D9D3E6 /* BarChartGroupBy.swift in Sources */, + 2B8E17482A7D94D300D9D3E6 /* BarChartTopN.swift in Sources */, + 2B8E17462A7D94D300D9D3E6 /* QueryRunner.swift in Sources */, + 2B8E17312A7D8CAB00D9D3E6 /* ImmersiveView.swift in Sources */, + 2B8E17432A7D94D300D9D3E6 /* ClusterChart.swift in Sources */, + 2B8E17452A7D94D300D9D3E6 /* ChartsExperiment.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; C51CB73727565F76005A3FB9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1475,7 +1642,6 @@ C51CB7752756620A005A3FB9 /* Data+JSONPrettyPrint.swift in Sources */, C51CB79027566296005A3FB9 /* ConditionalViewModifier.swift in Sources */, C51CB77327566206005A3FB9 /* Caching.swift in Sources */, - C51CB76F275661F0005A3FB9 /* APIClient.swift in Sources */, C51CB78B27566279005A3FB9 /* InsightService.swift in Sources */, C5F4D37028ACF64700EBB667 /* ChartDataSet.swift in Sources */, C51CB78927566275005A3FB9 /* ErrorService.swift in Sources */, @@ -1515,7 +1681,6 @@ C5F4D34928ACF48000EBB667 /* DonutChartView.swift in Sources */, C51CB77B27566238005A3FB9 /* DetailSidebar.swift in Sources */, C51CB75C275660F5005A3FB9 /* TelemetryDeckWidget.swift in Sources */, - C51CB76E275661EF005A3FB9 /* APIClient.swift in Sources */, C51CB78827566275005A3FB9 /* ErrorService.swift in Sources */, C5F4D32D28ACF48000EBB667 /* ChartHoverLabel.swift in Sources */, C5F4D35128ACF48000EBB667 /* DonutChartLegend.swift in Sources */, @@ -1568,7 +1733,6 @@ 2B64319B2739A5BB009A33C4 /* Data+JSONPrettyPrint.swift in Sources */, C5CE3D4E271AFCE2005232EC /* DetailSidebar.swift in Sources */, C5A8D87C270C65F90032560A /* InsightResultService.swift in Sources */, - 2B6431972739A5BB009A33C4 /* APIClient.swift in Sources */, C5F4D36428ACF48000EBB667 /* SingleKeyValueView.swift in Sources */, C5F4D34828ACF48000EBB667 /* DonutChartView.swift in Sources */, C5CE3D5C271AFCE2005232EC /* Helpers.swift in Sources */, @@ -1610,7 +1774,6 @@ C5A8D8CD270C84430032560A /* TelemetryDeckWidget.intentdefinition in Sources */, C581F4E5271B29470031E99C /* InsightService.swift in Sources */, 2B6431A42739A5BB009A33C4 /* CacheLayer.swift in Sources */, - 2B6431982739A5BB009A33C4 /* APIClient.swift in Sources */, 2B6431A82739A5BB009A33C4 /* AsyncOperation.swift in Sources */, 2B64319C2739A5BB009A33C4 /* Data+JSONPrettyPrint.swift in Sources */, C5F4D36E28ACF64600EBB667 /* ChartDataSet.swift in Sources */, @@ -1635,6 +1798,7 @@ 2B21FCD526FDC33F00A8A55B /* InsightGroupsView.swift in Sources */, DCB02B722502781A00304964 /* LoginView.swift in Sources */, 2B379D2126FBC3A300714BE6 /* IconFinderService.swift in Sources */, + 2B8E171D2A7D71F600D9D3E6 /* BarChartGroupBy.swift in Sources */, C5CD589D2810368400671359 /* ThreeCirclesInATrenchcode.swift in Sources */, 2BBFC9FF267D05E40013DC74 /* OrderSetter.swift in Sources */, 2BA5D50726CD1403008FBF8F /* InsightCard.swift in Sources */, @@ -1674,6 +1838,7 @@ 2B1D46A426CCF9CB008814A9 /* LoadingStateIndicator.swift in Sources */, C5F4D32A28ACF48000EBB667 /* ChartHoverLabel.swift in Sources */, DCB02B762502809200304964 /* RootView.swift in Sources */, + 2B8E17122A7D6CAE00D9D3E6 /* ClusterChart.swift in Sources */, DCEC64B026025AAF00BEF69C /* PasswordResetView.swift in Sources */, DC24DF3325DD54090003ADCB /* NoAppSelectedView.swift in Sources */, 2BF2BE422763918E00A79531 /* CreateNewAppViewModel.swift in Sources */, @@ -1695,6 +1860,7 @@ DCB02B6B2502773D00304964 /* WelcomeView.swift in Sources */, 2B46280B2728699E00515530 /* StatusMessageContainer.swift in Sources */, DC9A92C1255C6A6900E92C89 /* CreateOrganizationJoinRequestView.swift in Sources */, + 2B8E170D2A7D63A200D9D3E6 /* ChartsExperiment.swift in Sources */, 2BBFCA33267D05E40013DC74 /* AdaptiveStack.swift in Sources */, DC45BB1C24E27F12004E6392 /* SignalView.swift in Sources */, C5B917F12757C9EB004A842B /* CreateNewAppView.swift in Sources */, @@ -1705,6 +1871,7 @@ 63C4E9582778C54D00344E20 /* SignalListExplanationView.swift in Sources */, 2BBFCA25267D05E40013DC74 /* ProgressView+Scale.swift in Sources */, 2BBFCA29267D05E40013DC74 /* Binding+OnUpdate.swift in Sources */, + 2B8E171A2A7D71E000D9D3E6 /* BarChartTopN.swift in Sources */, 2BC2720226207D710045A2FE /* MockData.swift in Sources */, DCDC6F0C253EEB9B0012D9A7 /* Optional+Bound.swift in Sources */, DC5F3A8925A364C00057AA59 /* EmptyInsightGroupView.swift in Sources */, @@ -1714,6 +1881,7 @@ 2B6431952739A5BB009A33C4 /* APIClient.swift in Sources */, DCF7CD47254A0DB300BFA23B /* LexiconItemView.swift in Sources */, 2BBFCA03267D05E40013DC74 /* CardView.swift in Sources */, + 2B8E17202A7D723D00D9D3E6 /* ClusterBarChart.swift in Sources */, DCDC6EFF253EDA4C0012D9A7 /* FilterEditView.swift in Sources */, 2B21FCDA26FDC9F900A8A55B /* InsightsGrid.swift in Sources */, 2BBFCA13267D05E40013DC74 /* ListItemView.swift in Sources */, @@ -1724,8 +1892,11 @@ 2BBFCA2B267D05E40013DC74 /* MacNavigationView.swift in Sources */, 2B21FCD726FDC38500A8A55B /* NewInsightMenu.swift in Sources */, 2B6431A52739A5BB009A33C4 /* AsyncOperation.swift in Sources */, + 2B8E174C2A7D96FB00D9D3E6 /* ClusterInstrument.swift in Sources */, C5F4D34228ACF48000EBB667 /* BarChartView.swift in Sources */, + 2B8E173C2A7D8EF300D9D3E6 /* QueryRunner.swift in Sources */, 6351A789277C9ED8003AF559 /* InsightDisplayMode+Extensions.swift in Sources */, + 2B8E17172A7D6F0500D9D3E6 /* BarChartTimeSeries.swift in Sources */, 6351A786277C927D003AF559 /* EditorView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1734,6 +1905,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 2B8E17132A7D6CAE00D9D3E6 /* ClusterChart.swift in Sources */, C5F4D34F28ACF48000EBB667 /* DonutChartLegend.swift in Sources */, C5173B41283D52E40018CE9F /* InsightsGrid.swift in Sources */, 2BBFCA26267D05E40013DC74 /* ProgressView+Scale.swift in Sources */, @@ -1748,6 +1920,7 @@ 2BBFCA1E267D05E40013DC74 /* URL+Open.swift in Sources */, 2BC29ABA263DF01A00CE6CEC /* UserSettingsView.swift in Sources */, 2BF2BE432763918E00A79531 /* CreateNewAppViewModel.swift in Sources */, + 2B8E171E2A7D71F600D9D3E6 /* BarChartGroupBy.swift in Sources */, DCB5F9F725F29BF4004C4922 /* InsightGroupEditor.swift in Sources */, DCB02B732502781A00304964 /* LoginView.swift in Sources */, 2BBFC9FC267D05E40013DC74 /* Helpers.swift in Sources */, @@ -1757,12 +1930,15 @@ 2BEDE71026A73EA9007247B0 /* MacOS12RecentSignalsView.swift in Sources */, 2B1D46A526CCF9CB008814A9 /* LoadingStateIndicator.swift in Sources */, 2BBFCA2C267D05E40013DC74 /* MacNavigationView.swift in Sources */, + 2B8E170E2A7D63A200D9D3E6 /* ChartsExperiment.swift in Sources */, + 2B8E173D2A7D8EF300D9D3E6 /* QueryRunner.swift in Sources */, 2B462809272868DC00515530 /* TestModeIndicator.swift in Sources */, C5F4D35328ACF48000EBB667 /* ChartDataPoint.swift in Sources */, 2BBFCA0A267D05E40013DC74 /* Color.swift in Sources */, DCF7CD43254A092100BFA23B /* LexiconView.swift in Sources */, 2B6431AA2739A5BB009A33C4 /* Caching.swift in Sources */, DCDC6EF9253ECA7E0012D9A7 /* KeyValueView.swift in Sources */, + 2B8E171B2A7D71E000D9D3E6 /* BarChartTopN.swift in Sources */, DCDC6F14253EECA90012D9A7 /* Numbers+Bound.swift in Sources */, 2B781B8726F4A6D80062DBDC /* StatusMessageDisplay.swift in Sources */, 2BBFCA02267D05E40013DC74 /* DashedCardView.swift in Sources */, @@ -1784,6 +1960,7 @@ 2BF2BE452763921400A79531 /* CreateNewAppView.swift in Sources */, C5F4D33B28ACF48000EBB667 /* RawChartView.swift in Sources */, DCD67BCF252DB40B00A00C5B /* WelcomeView.swift in Sources */, + 2B8E174D2A7D96FC00D9D3E6 /* ClusterInstrument.swift in Sources */, 63C4E9562778C4D100344E20 /* SignalListCell.swift in Sources */, DC9A92C2255C6A6900E92C89 /* CreateOrganizationJoinRequestView.swift in Sources */, 2BDD8E702651BCB800C6E51D /* AskForMarketingEmailsView.swift in Sources */, @@ -1826,7 +2003,9 @@ 2BF2754626AAC5C10051591C /* MacOs12PayloadKeysView.swift in Sources */, DCDC6F06253EE0620012D9A7 /* FilterEditView.swift in Sources */, 2B64319A2739A5BB009A33C4 /* Data+JSONPrettyPrint.swift in Sources */, + 2B8E17182A7D6F0500D9D3E6 /* BarChartTimeSeries.swift in Sources */, 2B1D469F26CC51A8008814A9 /* GroupService.swift in Sources */, + 2B8E17212A7D723D00D9D3E6 /* ClusterBarChart.swift in Sources */, C5F4D35728ACF48000EBB667 /* ChartDataSet.swift in Sources */, 2BBFCA2A267D05E40013DC74 /* Binding+OnUpdate.swift in Sources */, 2BBFCA0C267D05E40013DC74 /* CustomSection.swift in Sources */, @@ -1864,6 +2043,72 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ + 2B8E17382A7D8CAE00D9D3E6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = FL4V655A94; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.telemetrydeck.TelemetryDeck; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = xros; + SUPPORTED_PLATFORMS = "xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 1.0; + }; + name = Debug; + }; + 2B8E17392A7D8CAE00D9D3E6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = FL4V655A94; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.telemetrydeck.TelemetryDeck; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = xros; + SUPPORTED_PLATFORMS = "xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + VALIDATE_PRODUCT = YES; + XROS_DEPLOYMENT_TARGET = 1.0; + }; + name = Release; + }; C51CB74527565F76005A3FB9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1884,7 +2129,7 @@ "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = 13.0; MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = "$(DEVELOPER_BUNDLE_ID).TelemetryDeckMacIntents"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1915,7 +2160,7 @@ "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = 13.0; MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = "$(DEVELOPER_BUNDLE_ID).TelemetryDeckMacIntents"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2000,7 +2245,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_ENTITLEMENTS = "TelemetryDeckWidget/TelemetryDeckWidgetExtension (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 715; + CURRENT_PROJECT_VERSION = 716; DEVELOPMENT_TEAM = FL4V655A94; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TelemetryDeckWidget/Info.plist; @@ -2032,7 +2277,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_ENTITLEMENTS = "TelemetryDeckWidget/TelemetryDeckWidgetExtension (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 715; + CURRENT_PROJECT_VERSION = 716; DEVELOPMENT_TEAM = FL4V655A94; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TelemetryDeckWidget/Info.plist; @@ -2063,7 +2308,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_ENTITLEMENTS = "TelemetryDeckIntents/TelemetryDeckIntents (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 715; + CURRENT_PROJECT_VERSION = 716; DEVELOPMENT_TEAM = FL4V655A94; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TelemetryDeckIntents/Info.plist; @@ -2092,7 +2337,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_ENTITLEMENTS = "TelemetryDeckIntents/TelemetryDeckIntents (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 715; + CURRENT_PROJECT_VERSION = 716; DEVELOPMENT_TEAM = FL4V655A94; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = TelemetryDeckIntents/Info.plist; @@ -2241,11 +2486,11 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = "iOS/Telemetry Viewer (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 715; + CURRENT_PROJECT_VERSION = 716; DEVELOPMENT_TEAM = FL4V655A94; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = iOS/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2267,11 +2512,11 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = "iOS/Telemetry Viewer (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 715; + CURRENT_PROJECT_VERSION = 716; DEVELOPMENT_TEAM = FL4V655A94; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = iOS/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2345,6 +2590,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 2B8E17372A7D8CAE00D9D3E6 /* Build configuration list for PBXNativeTarget "TelemetryDeck" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2B8E17382A7D8CAE00D9D3E6 /* Debug */, + 2B8E17392A7D8CAE00D9D3E6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; C51CB74427565F76005A3FB9 /* Build configuration list for PBXNativeTarget "TelemetryDeckMacIntents" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -2469,6 +2723,15 @@ package = 2B25EAE726D3EEE700BBBB1B /* XCRemoteSwiftPackageReference "SwiftUI-Shimmer" */; productName = Shimmer; }; + 2B8E172A2A7D8CAB00D9D3E6 /* RealityKitContent */ = { + isa = XCSwiftPackageProductDependency; + productName = RealityKitContent; + }; + 2B8E17492A7D953100D9D3E6 /* DataTransferObjects */ = { + isa = XCSwiftPackageProductDependency; + package = C5AD4B6227D3928600CD7E4C /* XCRemoteSwiftPackageReference "models" */; + productName = DataTransferObjects; + }; C51CB76227566148005A3FB9 /* DataTransferObjects */ = { isa = XCSwiftPackageProductDependency; productName = DataTransferObjects; diff --git a/Telemetry Viewer.xcodeproj/xcshareddata/xcschemes/Telemetry Viewer (iOS).xcscheme b/Telemetry Viewer.xcodeproj/xcshareddata/xcschemes/Telemetry Viewer (iOS).xcscheme index c511f8c..b8038a9 100644 --- a/Telemetry Viewer.xcodeproj/xcshareddata/xcschemes/Telemetry Viewer (iOS).xcscheme +++ b/Telemetry Viewer.xcodeproj/xcshareddata/xcschemes/Telemetry Viewer (iOS).xcscheme @@ -1,6 +1,6 @@ Date: Fri, 4 Aug 2023 23:24:27 +0200 Subject: [PATCH 3/5] Cluster with Instrument and QueryRunner --- Cluster/Chart/BarChart/BarChartGroupBy.swift | 18 +++ .../Chart/BarChart/BarChartTimeSeries.swift | 27 ++++ Cluster/Chart/BarChart/BarChartTopN.swift | 18 +++ Cluster/Chart/BarChart/ClusterBarChart.swift | 27 ++++ Cluster/Chart/ClusterChart.swift | 27 ++++ Cluster/ChartsExperiment.swift | 32 +++++ Cluster/ClusterInstrument.swift | 27 ++++ Cluster/QueryRunner.swift | 133 ++++++++++++++++++ 8 files changed, 309 insertions(+) create mode 100644 Cluster/Chart/BarChart/BarChartGroupBy.swift create mode 100644 Cluster/Chart/BarChart/BarChartTimeSeries.swift create mode 100644 Cluster/Chart/BarChart/BarChartTopN.swift create mode 100644 Cluster/Chart/BarChart/ClusterBarChart.swift create mode 100644 Cluster/Chart/ClusterChart.swift create mode 100644 Cluster/ChartsExperiment.swift create mode 100644 Cluster/ClusterInstrument.swift create mode 100644 Cluster/QueryRunner.swift diff --git a/Cluster/Chart/BarChart/BarChartGroupBy.swift b/Cluster/Chart/BarChart/BarChartGroupBy.swift new file mode 100644 index 0000000..df802fd --- /dev/null +++ b/Cluster/Chart/BarChart/BarChartGroupBy.swift @@ -0,0 +1,18 @@ +// +// BarChartGroupBy.swift +// Telemetry Viewer +// +// Created by Daniel Jilg on 04.08.23. +// + +import SwiftUI + +struct BarChartGroupBy: View { + var body: some View { + Text("Bar Chart GroupBy") + } +} + +#Preview { + BarChartGroupBy() +} diff --git a/Cluster/Chart/BarChart/BarChartTimeSeries.swift b/Cluster/Chart/BarChart/BarChartTimeSeries.swift new file mode 100644 index 0000000..cdfa987 --- /dev/null +++ b/Cluster/Chart/BarChart/BarChartTimeSeries.swift @@ -0,0 +1,27 @@ +// +// BarChartTimeSeries.swift +// Telemetry Viewer +// +// Created by Daniel Jilg on 04.08.23. +// + +import SwiftUI +import Charts +import DataTransferObjects + + +struct BarChartTimeSeries: View { + let query: CustomQuery + let result: TimeSeriesQueryResult + + var body: some View { + Chart { + ForEach(result.rows) { row in + BarMark( + x: .value("Date", row.timestamp), + y: .value("Total Count", row.result["count"]?.value ?? 0) + ) + } + } + } +} diff --git a/Cluster/Chart/BarChart/BarChartTopN.swift b/Cluster/Chart/BarChart/BarChartTopN.swift new file mode 100644 index 0000000..b9d876a --- /dev/null +++ b/Cluster/Chart/BarChart/BarChartTopN.swift @@ -0,0 +1,18 @@ +// +// BarChartTopN.swift +// Telemetry Viewer +// +// Created by Daniel Jilg on 04.08.23. +// + +import SwiftUI + +struct BarChartTopN: View { + var body: some View { + Text("Bar Chart TopN") + } +} + +#Preview { + BarChartTopN() +} diff --git a/Cluster/Chart/BarChart/ClusterBarChart.swift b/Cluster/Chart/BarChart/ClusterBarChart.swift new file mode 100644 index 0000000..dde2212 --- /dev/null +++ b/Cluster/Chart/BarChart/ClusterBarChart.swift @@ -0,0 +1,27 @@ +// +// ClusterBarChart.swift +// Telemetry Viewer +// +// Created by Daniel Jilg on 04.08.23. +// + +import SwiftUI +import DataTransferObjects + +struct ClusterBarChart: View { + let query: CustomQuery + let result: QueryResult + + var body: some View { + switch query.queryType { + case .timeseries: + if case let .timeSeries(result) = result { + BarChartTimeSeries(query: query, result: result) + } else { + Text("Mismatch in query type and result type") + } + default: + Text("\(query.queryType.rawValue) bar charts are not supported.") + } + } +} diff --git a/Cluster/Chart/ClusterChart.swift b/Cluster/Chart/ClusterChart.swift new file mode 100644 index 0000000..ee5437c --- /dev/null +++ b/Cluster/Chart/ClusterChart.swift @@ -0,0 +1,27 @@ +// +// Chart.swift +// Telemetry Viewer +// +// Created by Daniel Jilg on 04.08.23. +// + +import SwiftUI +import DataTransferObjects + +/// Cluster/Chart – given a query and a result, displays the result +struct ClusterChart: View { + enum ChartType { + case bar + } + + let query: CustomQuery + let result: QueryResult + let type: ChartType + + var body: some View { + switch type { + case .bar: + ClusterBarChart(query: query, result: result) + } + } +} diff --git a/Cluster/ChartsExperiment.swift b/Cluster/ChartsExperiment.swift new file mode 100644 index 0000000..27b75f2 --- /dev/null +++ b/Cluster/ChartsExperiment.swift @@ -0,0 +1,32 @@ +// +// ChartsExperiment.swift +// Telemetry Viewer +// +// Created by Daniel Jilg on 04.08.23. +// + +import Charts +import DataTransferObjects +import SwiftUI + +let exampleQuery = CustomQuery( + queryType: .timeseries, + dataSource: "telemetry-signals", + relativeIntervals: [.init(beginningDate: .init(.beginning, of: .day, adding: -30), endDate: .init(.end, of: .day, adding: 0))], + granularity: .day, + aggregations: [.thetaSketch(.init(type: .thetaSketch, name: "count", fieldName: "clientUser"))] +) + +extension TimeSeriesQueryResultRow: Identifiable { + public var id: Date { timestamp } +} + +struct ChartsExperiment: View { + var body: some View { + ClusterInstrument(query: exampleQuery, title: "Example Query", type: .bar) + } +} + +#Preview { + ChartsExperiment() +} diff --git a/Cluster/ClusterInstrument.swift b/Cluster/ClusterInstrument.swift new file mode 100644 index 0000000..93a2bb8 --- /dev/null +++ b/Cluster/ClusterInstrument.swift @@ -0,0 +1,27 @@ +// +// ClusterInstrument.swift +// Telemetry Viewer +// +// Created by Daniel Jilg on 04.08.23. +// + +import SwiftUI +import DataTransferObjects + + +struct ClusterInstrument: View { + let query: CustomQuery + let title: String + let type: ClusterChart.ChartType + + var body: some View { + VStack(alignment: .leading) { + Text(title) + .font(.title) + .padding(.bottom) + QueryRunner(query: query, type: type) + } + .padding() + .border(.black) + } +} diff --git a/Cluster/QueryRunner.swift b/Cluster/QueryRunner.swift new file mode 100644 index 0000000..013545d --- /dev/null +++ b/Cluster/QueryRunner.swift @@ -0,0 +1,133 @@ +// +// QueryRunner.swift +// Telemetry Viewer +// +// Created by Daniel Jilg on 04.08.23. +// + +import DataTransferObjects +import SwiftUI + +struct QueryRunner: View { + let query: CustomQuery + let type: ClusterChart.ChartType + + @State var queryResultWrapper: QueryResultWrapper? + @State var isLoading: Bool = false + + var body: some View { + VStack { + if let queryResult = queryResultWrapper?.result { + ClusterChart(query: query, result: queryResult, type: .bar) + } + + if let queryResultWrapper = queryResultWrapper { + Text("Calculation took \(queryResultWrapper.calculationDuration) seconds") + Text("Last updated \(queryResultWrapper.calculationFinishedAt)") + } + + if isLoading { + Text("Loading...") + } + } + .onAppear { + Task { + do { + try await getQueryResult() + } + catch { + print(error) + } + } + } + } + + private func getQueryResult() async throws { + isLoading = true + defer { + isLoading = false + } + + let taskID = try await beginAsyncCalculation() + + try await getLastSuccessfulValue(taskID) + + try await waitUntilTaskStatusIsSuccessful(taskID) + + try await getLastSuccessfulValue(taskID) + } +} + +extension QueryRunner { + private enum ApiVersion: String { + case v1 + case v2 + case v3 + } + + private func urlForPath(apiVersion: ApiVersion = .v1, _ path: String..., appendTrailingSlash _: Bool = false) -> URL { + URL(string: "https://api.telemetrydeck.com/api/" + "\(apiVersion.rawValue)/" + path.joined(separator: "/") + "/")! + } + + private func authenticatedURLRequest(for url: URL, httpMethod: String, httpBody: Data? = nil, contentType: String = "application/json; charset=utf-8") -> URLRequest { + var request = URLRequest(url: url) + request.httpMethod = httpMethod + request.setValue(contentType, forHTTPHeaderField: "Content-Type") + request.setValue(UserTokenDTO(id: UUID(uuidString: "7c736171-9c56-4573-b72f-f9f881c12d7b"), value: "QL41IC283ELWFYXRHC6G22VMTPFK7A3GN1L6INTHPCJGTKA4Y76YZF572P1H2U8OR6HQHUXKWP91M2URKUA49SFCYKQ2XZ8WS0WMR28N2I91OCTDHJMYBAQAIKG2QO73", user: [:]).bearerTokenAuthString, forHTTPHeaderField: "Authorization") + + if let httpBody = httpBody { + request.httpBody = httpBody + } + + return request + } +} + +extension QueryRunner { + private func beginAsyncCalculation() async throws -> String { + // create a query task + let queryBeginURL = urlForPath(apiVersion: .v3, "query", "calculate-async") + print(queryBeginURL) + let queryHTTPBody = try JSONEncoder.telemetryEncoder.encode(query) + var queryBeginRequest = authenticatedURLRequest(for: queryBeginURL, httpMethod: "POST", httpBody: queryHTTPBody) + queryBeginRequest.httpMethod = "POST" + let (data, _) = try await URLSession.shared.data(for: queryBeginRequest) + print(String(data: data, encoding: .utf8) ?? "") + guard let taskID = try JSONDecoder.telemetryDecoder.decode([String: String].self, from: data)["queryTaskID"] else { + throw TransferError.decodeFailed + } + + return taskID + } + + private func getLastSuccessfulValue(_ taskID: String) async throws { + // pick up the finished result + let lastSuccessfulValueURL = urlForPath(apiVersion: .v3, "task", taskID, "lastSuccessfulValue") + print(lastSuccessfulValueURL) + let lastSuccessfulValueURLRequest = authenticatedURLRequest(for: lastSuccessfulValueURL, httpMethod: "GET") + let (newQueryResultData, response) = try await URLSession.shared.data(for: lastSuccessfulValueURLRequest) + print(String(data: newQueryResultData, encoding: .utf8) ?? "") + if (response as? HTTPURLResponse)?.statusCode == 200 { + queryResultWrapper = try JSONDecoder.telemetryDecoder.decode(QueryResultWrapper.self, from: newQueryResultData) + } + } + + private func waitUntilTaskStatusIsSuccessful(_ taskID: String) async throws { + // wait for the task to finish caluclating + var taskStatus: QueryTaskStatus = .running + while taskStatus != .successful { + let taskStatusURL = urlForPath(apiVersion: .v3, "task", taskID, "status") + print(taskStatusURL) + let taskStatusURLRequest = authenticatedURLRequest(for: taskStatusURL, httpMethod: "GET") + let (data, _) = try await URLSession.shared.data(for: taskStatusURLRequest) + print(String(data: data, encoding: .utf8) ?? "") + let queryTaskStatus = try JSONDecoder.telemetryDecoder.decode(QueryTaskStatusStruct.self, from: data) + taskStatus = queryTaskStatus.status + try await Task.sleep(nanoseconds: 1_000_000_000) + } + + if taskStatus == .error { + throw TransferError.serverError(message: "The server returned an error") + } + } +} From dbd36d86ff27873e7a5b4387b6e1719294c1fb4c Mon Sep 17 00:00:00 2001 From: Daniel Jilg Date: Sat, 5 Aug 2023 00:13:52 +0200 Subject: [PATCH 4/5] Multi Window --- Cluster/ChartsExperiment.swift | 39 +++++++++++++++++++++++---------- Cluster/ClusterInstrument.swift | 1 - VisonOS/ContentView.swift | 2 +- VisonOS/TelemetryDeckApp.swift | 19 ++++++++++++++-- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/Cluster/ChartsExperiment.swift b/Cluster/ChartsExperiment.swift index 27b75f2..1a91621 100644 --- a/Cluster/ChartsExperiment.swift +++ b/Cluster/ChartsExperiment.swift @@ -9,24 +9,39 @@ import Charts import DataTransferObjects import SwiftUI -let exampleQuery = CustomQuery( - queryType: .timeseries, - dataSource: "telemetry-signals", - relativeIntervals: [.init(beginningDate: .init(.beginning, of: .day, adding: -30), endDate: .init(.end, of: .day, adding: 0))], - granularity: .day, - aggregations: [.thetaSketch(.init(type: .thetaSketch, name: "count", fieldName: "clientUser"))] -) + +let queries: [String: CustomQuery] = [ + "default": CustomQuery( + queryType: .timeseries, + dataSource: "telemetry-signals", + relativeIntervals: [.init(beginningDate: .init(.beginning, of: .day, adding: -30), endDate: .init(.end, of: .day, adding: 0))], + granularity: .day, + aggregations: [.thetaSketch(.init(type: .thetaSketch, name: "count", fieldName: "clientUser"))] + ), + "daily-users": CustomQuery( + queryType: .timeseries, + dataSource: "telemetry-signals", + relativeIntervals: [.init(beginningDate: .init(.beginning, of: .day, adding: -30), endDate: .init(.end, of: .day, adding: 0))], + granularity: .day, + aggregations: [.longSum(.init(type: .longSum, name: "count", fieldName: "count"))] + ), + "monthly-signals": CustomQuery( + queryType: .timeseries, + dataSource: "telemetry-signals", + relativeIntervals: [.init(beginningDate: .init(.beginning, of: .day, adding: -30), endDate: .init(.end, of: .day, adding: 0))], + granularity: .hour, + aggregations: [.longSum(.init(type: .longSum, name: "count", fieldName: "count"))] + ), +] extension TimeSeriesQueryResultRow: Identifiable { public var id: Date { timestamp } } struct ChartsExperiment: View { + let queryID: String? + var body: some View { - ClusterInstrument(query: exampleQuery, title: "Example Query", type: .bar) + ClusterInstrument(query: queries[queryID ?? "default"]!, title: queryID ?? "default", type: .bar).padding() } } - -#Preview { - ChartsExperiment() -} diff --git a/Cluster/ClusterInstrument.swift b/Cluster/ClusterInstrument.swift index 93a2bb8..006d8e4 100644 --- a/Cluster/ClusterInstrument.swift +++ b/Cluster/ClusterInstrument.swift @@ -22,6 +22,5 @@ struct ClusterInstrument: View { QueryRunner(query: query, type: type) } .padding() - .border(.black) } } diff --git a/VisonOS/ContentView.swift b/VisonOS/ContentView.swift index 7faca59..17b02ef 100644 --- a/VisonOS/ContentView.swift +++ b/VisonOS/ContentView.swift @@ -17,7 +17,7 @@ struct ContentView: View { @Environment(\.dismissImmersiveSpace) var dismissImmersiveSpace var body: some View { - ChartsExperiment() + ChartsExperiment(queryID: nil) } } diff --git a/VisonOS/TelemetryDeckApp.swift b/VisonOS/TelemetryDeckApp.swift index cd94737..89c935f 100644 --- a/VisonOS/TelemetryDeckApp.swift +++ b/VisonOS/TelemetryDeckApp.swift @@ -9,11 +9,26 @@ import SwiftUI @main struct TelemetryDeckApp: App { + @Environment(\.supportsMultipleWindows) private var supportsMultipleWindows + @Environment(\.openWindow) private var openWindow + var body: some Scene { WindowGroup { - ContentView() + ChartsExperiment(queryID: nil) + .onAppear { + openWindow(id: "daily-users") + openWindow(id: "monthly-signals") + } } - + + WindowGroup(id: "daily-users") { + ChartsExperiment(queryID: "daily-users") + } + + WindowGroup(id: "monthly-signals") { + ChartsExperiment(queryID: "monthly-signals") + } + ImmersiveSpace(id: "ImmersiveSpace") { ImmersiveView() } From 69b8a518df442ce748f134b119d0a4beee9add94 Mon Sep 17 00:00:00 2001 From: Daniel Jilg Date: Tue, 5 Sep 2023 16:01:54 +0200 Subject: [PATCH 5/5] Apple --- Cluster/ChartsExperiment.swift | 48 ++++++++- Cluster/QueryRunner.swift | 12 +-- Shared/Navigational Structure/RootView.swift | 2 +- Telemetry Viewer.xcodeproj/project.pbxproj | 8 ++ VisonOS/ContentView.swift | 39 +++++++- VisonOS/TelemetryDeckApp.swift | 100 ++++++++++++++++--- 6 files changed, 182 insertions(+), 27 deletions(-) diff --git a/Cluster/ChartsExperiment.swift b/Cluster/ChartsExperiment.swift index 1a91621..1b74bcd 100644 --- a/Cluster/ChartsExperiment.swift +++ b/Cluster/ChartsExperiment.swift @@ -8,6 +8,7 @@ import Charts import DataTransferObjects import SwiftUI +import TelemetryClient let queries: [String: CustomQuery] = [ @@ -39,9 +40,50 @@ extension TimeSeriesQueryResultRow: Identifiable { } struct ChartsExperiment: View { - let queryID: String? - var body: some View { - ClusterInstrument(query: queries[queryID ?? "default"]!, title: queryID ?? "default", type: .bar).padding() + Grid(horizontalSpacing: 15, verticalSpacing: 15) { + GridRow { + ClusterInstrument(query: queries["default"]!, title: "default", type: .bar).padding() + .glassBackgroundEffect(in: .rect(cornerRadius: 15)) + .rotation3DEffect(.init(angle: .degrees(-5), axis: .x), anchor: .bottom) + +// .transform3DEffect(.init(rotation: .init(angle: .degrees(5), axis: .y))) + ClusterInstrument(query: queries["daily-users"]!, title: "Daily Users", type: .bar).padding() + .glassBackgroundEffect(in: .rect(cornerRadius: 15)) + .rotation3DEffect(.init(angle: .degrees(-5), axis: .x), anchor: .bottom) + ClusterInstrument(query: queries["monthly-signals"]!, title: "Monthly Signals", type: .bar).padding() + .glassBackgroundEffect(in: .rect(cornerRadius: 15)) + .rotation3DEffect(.init(angle: .degrees(-5), axis: .x), anchor: .bottom) +// .transform3DEffect(.init(rotation: .init(angle: .degrees(-5), axis: .y))) + } + GridRow { + ClusterInstrument(query: queries["default"]!, title: "default", type: .bar).padding() + .glassBackgroundEffect(in: .rect(cornerRadius: 15)) +// .transform3DEffect(.init(rotation: .init(angle: .degrees(5), axis: .y))) + ClusterInstrument(query: queries["daily-users"]!, title: "Daily Users", type: .bar).padding() + .glassBackgroundEffect(in: .rect(cornerRadius: 15)) + ClusterInstrument(query: queries["monthly-signals"]!, title: "Monthly Signals", type: .bar).padding() + .glassBackgroundEffect(in: .rect(cornerRadius: 15)) +// .transform3DEffect(.init(rotation: .init(angle: .degrees(-5), axis: .y))) + } + GridRow { + ClusterInstrument(query: queries["default"]!, title: "default", type: .bar).padding() + .glassBackgroundEffect(in: .rect(cornerRadius: 15)) + .transform3DEffect(.init(rotation: .init(angle: .degrees(5), axis: .x))) +// .transform3DEffect(.init(rotation: .init(angle: .degrees(5), axis: .y))) + ClusterInstrument(query: queries["daily-users"]!, title: "Daily Users", type: .bar).padding() + .glassBackgroundEffect(in: .rect(cornerRadius: 15)) + .transform3DEffect(.init(rotation: .init(angle: .degrees(5), axis: .x))) + ClusterInstrument(query: queries["monthly-signals"]!, title: "Monthly Signals", type: .bar).padding() + .glassBackgroundEffect(in: .rect(cornerRadius: 15)) + .transform3DEffect(.init(rotation: .init(angle: .degrees(5), axis: .x))) +// .transform3DEffect(.init(rotation: .init(angle: .degrees(-5), axis: .y))) + } + + } + + .onAppear() { + TelemetryManager.send("ChartsExperimentShown", for: "cant-generate-user") + } } } diff --git a/Cluster/QueryRunner.swift b/Cluster/QueryRunner.swift index 013545d..02f4e26 100644 --- a/Cluster/QueryRunner.swift +++ b/Cluster/QueryRunner.swift @@ -87,12 +87,12 @@ extension QueryRunner { private func beginAsyncCalculation() async throws -> String { // create a query task let queryBeginURL = urlForPath(apiVersion: .v3, "query", "calculate-async") - print(queryBeginURL) +// print(queryBeginURL) let queryHTTPBody = try JSONEncoder.telemetryEncoder.encode(query) var queryBeginRequest = authenticatedURLRequest(for: queryBeginURL, httpMethod: "POST", httpBody: queryHTTPBody) queryBeginRequest.httpMethod = "POST" let (data, _) = try await URLSession.shared.data(for: queryBeginRequest) - print(String(data: data, encoding: .utf8) ?? "") +// print(String(data: data, encoding: .utf8) ?? "") guard let taskID = try JSONDecoder.telemetryDecoder.decode([String: String].self, from: data)["queryTaskID"] else { throw TransferError.decodeFailed } @@ -103,10 +103,10 @@ extension QueryRunner { private func getLastSuccessfulValue(_ taskID: String) async throws { // pick up the finished result let lastSuccessfulValueURL = urlForPath(apiVersion: .v3, "task", taskID, "lastSuccessfulValue") - print(lastSuccessfulValueURL) +// print(lastSuccessfulValueURL) let lastSuccessfulValueURLRequest = authenticatedURLRequest(for: lastSuccessfulValueURL, httpMethod: "GET") let (newQueryResultData, response) = try await URLSession.shared.data(for: lastSuccessfulValueURLRequest) - print(String(data: newQueryResultData, encoding: .utf8) ?? "") +// print(String(data: newQueryResultData, encoding: .utf8) ?? "") if (response as? HTTPURLResponse)?.statusCode == 200 { queryResultWrapper = try JSONDecoder.telemetryDecoder.decode(QueryResultWrapper.self, from: newQueryResultData) } @@ -117,10 +117,10 @@ extension QueryRunner { var taskStatus: QueryTaskStatus = .running while taskStatus != .successful { let taskStatusURL = urlForPath(apiVersion: .v3, "task", taskID, "status") - print(taskStatusURL) +// print(taskStatusURL) let taskStatusURLRequest = authenticatedURLRequest(for: taskStatusURL, httpMethod: "GET") let (data, _) = try await URLSession.shared.data(for: taskStatusURLRequest) - print(String(data: data, encoding: .utf8) ?? "") +// print(String(data: data, encoding: .utf8) ?? "") let queryTaskStatus = try JSONDecoder.telemetryDecoder.decode(QueryTaskStatusStruct.self, from: data) taskStatus = queryTaskStatus.status try await Task.sleep(nanoseconds: 1_000_000_000) diff --git a/Shared/Navigational Structure/RootView.swift b/Shared/Navigational Structure/RootView.swift index 1e84176..eaad8ba 100644 --- a/Shared/Navigational Structure/RootView.swift +++ b/Shared/Navigational Structure/RootView.swift @@ -15,7 +15,7 @@ struct RootView: View { @EnvironmentObject var appService: AppService var body: some View { - ChartsExperiment() + Text("lkjasl") // if api.userNotLoggedIn { // #if os(iOS) diff --git a/Telemetry Viewer.xcodeproj/project.pbxproj b/Telemetry Viewer.xcodeproj/project.pbxproj index 0d30648..5f8f81b 100644 --- a/Telemetry Viewer.xcodeproj/project.pbxproj +++ b/Telemetry Viewer.xcodeproj/project.pbxproj @@ -70,6 +70,7 @@ 2B6431AB2739A5BB009A33C4 /* Caching.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6431922739A5BB009A33C4 /* Caching.swift */; }; 2B6431AC2739A5BB009A33C4 /* Caching.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6431922739A5BB009A33C4 /* Caching.swift */; }; 2B670C0026BD8BF7005DA07E /* SidebarSplitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B670BFF26BD8BF7005DA07E /* SidebarSplitView.swift */; }; + 2B714B8A2AA74E3300660776 /* TelemetryClient in Frameworks */ = {isa = PBXBuildFile; productRef = 2B714B892AA74E3300660776 /* TelemetryClient */; }; 2B74555E27230648002CBB45 /* ChartDataSet+InsightCalculationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B74555D27230648002CBB45 /* ChartDataSet+InsightCalculationResult.swift */; }; 2B74555F27230648002CBB45 /* ChartDataSet+InsightCalculationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B74555D27230648002CBB45 /* ChartDataSet+InsightCalculationResult.swift */; }; 2B74556027230648002CBB45 /* ChartDataSet+InsightCalculationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B74555D27230648002CBB45 /* ChartDataSet+InsightCalculationResult.swift */; }; @@ -626,6 +627,7 @@ buildActionMask = 2147483647; files = ( 2B8E174A2A7D953200D9D3E6 /* DataTransferObjects in Frameworks */, + 2B714B8A2AA74E3300660776 /* TelemetryClient in Frameworks */, 2B8E172B2A7D8CAB00D9D3E6 /* RealityKitContent in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1253,6 +1255,7 @@ packageProductDependencies = ( 2B8E172A2A7D8CAB00D9D3E6 /* RealityKitContent */, 2B8E17492A7D953100D9D3E6 /* DataTransferObjects */, + 2B714B892AA74E3300660776 /* TelemetryClient */, ); productName = TelemetryDeck; productReference = 2B8E17262A7D8CAB00D9D3E6 /* TelemetryDeck.app */; @@ -2723,6 +2726,11 @@ package = 2B25EAE726D3EEE700BBBB1B /* XCRemoteSwiftPackageReference "SwiftUI-Shimmer" */; productName = Shimmer; }; + 2B714B892AA74E3300660776 /* TelemetryClient */ = { + isa = XCSwiftPackageProductDependency; + package = DC9C082F252CD622001C0F94 /* XCRemoteSwiftPackageReference "SwiftClient" */; + productName = TelemetryClient; + }; 2B8E172A2A7D8CAB00D9D3E6 /* RealityKitContent */ = { isa = XCSwiftPackageProductDependency; productName = RealityKitContent; diff --git a/VisonOS/ContentView.swift b/VisonOS/ContentView.swift index 17b02ef..ba052e3 100644 --- a/VisonOS/ContentView.swift +++ b/VisonOS/ContentView.swift @@ -17,10 +17,39 @@ struct ContentView: View { @Environment(\.dismissImmersiveSpace) var dismissImmersiveSpace var body: some View { - ChartsExperiment(queryID: nil) + TabView { + Text("RED") + .tabItem { + Image(systemName: "phone.fill") + Text("First Tab") + } + Text("BLEU") + .tabItem { + Image(systemName: "tv.fill") + Text("Second Tab") + } + } + + +// TabView { +// ChartsExperiment() +// .tabItem { +// Image(systemName: "person.crop.circle") +// Text("Users") +// } +// +// ChartsExperiment() +// .tabItem { +// Image(systemName: "person.crop.circle") +// Text("Versions") +// } +// +// ChartsExperiment() +// .tabItem { +// Image(systemName: "person.crop.circle") +// Text("Features") +// } +// } +// } } - -#Preview { - ContentView() -} diff --git a/VisonOS/TelemetryDeckApp.swift b/VisonOS/TelemetryDeckApp.swift index 89c935f..6bf5883 100644 --- a/VisonOS/TelemetryDeckApp.swift +++ b/VisonOS/TelemetryDeckApp.swift @@ -6,6 +6,7 @@ // import SwiftUI +import TelemetryClient @main struct TelemetryDeckApp: App { @@ -14,23 +15,98 @@ struct TelemetryDeckApp: App { var body: some Scene { WindowGroup { - ChartsExperiment(queryID: nil) - .onAppear { - openWindow(id: "daily-users") - openWindow(id: "monthly-signals") - } + TabView { + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Users") + } + + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Versions") + } + + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Features") + } + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Platforms}") + } + + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Widgets") + } + + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Experimental Test Group") + } + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Documentation Test Group") + } + + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Charts") + } + + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Funnels") + } + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("A/B Tests") + } + + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Versions") + } + + ChartsExperiment() + .tabItem { + Image(systemName: "person.crop.circle") + Text("Features") + } + + } } + .windowStyle(.plain) - WindowGroup(id: "daily-users") { - ChartsExperiment(queryID: "daily-users") - } - - WindowGroup(id: "monthly-signals") { - ChartsExperiment(queryID: "monthly-signals") - } +// WindowGroup(id: "daily-users") { +// ChartsExperiment(queryID: "daily-users") +// } +// +// WindowGroup(id: "monthly-signals") { +// ChartsExperiment(queryID: "monthly-signals") +// } ImmersiveSpace(id: "ImmersiveSpace") { ImmersiveView() } + + } + + + init() { + let configuration = TelemetryManagerConfiguration(appID: "79167A27-EBBF-4012-9974-160624E5D07B") + TelemetryManager.initialize(with: configuration) + } }